Merge "mediawiki.special.preferences: Support Back/Forward navigation"
authorKrinkle <ttijhof@wikimedia.org>
Fri, 29 Jun 2012 02:37:37 +0000 (02:37 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 29 Jun 2012 02:37:37 +0000 (02:37 +0000)
1116 files changed:
CREDITS
INSTALL
RELEASE-NOTES-1.19 [deleted file]
RELEASE-NOTES-1.20
api.php
api.php5
docs/code-coverage/README
docs/distributors.txt
docs/export-0.1.xsd
docs/export-0.2.xsd
docs/export-0.3.xsd
docs/export-0.4.xsd
docs/export-0.5.xsd
docs/export-0.6.xsd
docs/export-0.7.xsd [new file with mode: 0644]
docs/export-demo.xml
docs/hooks.txt
extensions/README
img_auth.php
img_auth.php5
includes/Action.php
includes/AjaxDispatcher.php
includes/AjaxResponse.php
includes/Article.php
includes/AuthPlugin.php
includes/AutoLoader.php
includes/Autopromote.php
includes/BacklinkCache.php
includes/Block.php
includes/CacheHelper.php [new file with mode: 0644]
includes/Category.php
includes/CategoryPage.php
includes/CategoryViewer.php
includes/Categoryfinder.php
includes/Cdb.php
includes/Cdb_PHP.php
includes/ChangeTags.php
includes/ChangesFeed.php
includes/ChangesList.php
includes/Collation.php
includes/ConfEditor.php
includes/Cookie.php
includes/CryptRand.php
includes/DataUpdate.php [new file with mode: 0644]
includes/DefaultSettings.php
includes/DeferredUpdates.php
includes/Defines.php
includes/DeprecatedGlobal.php
includes/EditPage.php
includes/Exception.php
includes/Export.php
includes/ExternalEdit.php
includes/ExternalStore.php
includes/ExternalStoreDB.php
includes/ExternalStoreHttp.php
includes/ExternalUser.php
includes/FakeTitle.php
includes/Fallback.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/ForkController.php
includes/FormOptions.php
includes/GitInfo.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HistoryBlob.php
includes/HttpFunctions.old.php
includes/HttpFunctions.php
includes/IP.php
includes/ImageGallery.php
includes/ImagePage.php
includes/ImageQueryPage.php
includes/Init.php
includes/Licenses.php
includes/LinkFilter.php
includes/Linker.php
includes/LinksUpdate.php
includes/LocalisationCache.php
includes/MWFunction.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/Metadata.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/PageQueryPage.php
includes/Pager.php
includes/PathRouter.php
includes/PoolCounter.php
includes/Preferences.php
includes/PrefixSearch.php
includes/ProxyTools.php
includes/QueryPage.php
includes/RecentChange.php
includes/Revision.php
includes/RevisionList.php
includes/Sanitizer.php
includes/ScopedPHPTimeout.php
includes/SeleniumWebSettings.php
includes/Setup.php
includes/SiteConfiguration.php
includes/SiteStats.php
includes/Skin.php
includes/SkinLegacy.php
includes/SkinTemplate.php
includes/SpecialPage.php
includes/SpecialPageFactory.php
includes/SqlDataUpdate.php [new file with mode: 0644]
includes/SquidPurgeClient.php
includes/Status.php
includes/StreamFile.php
includes/StringUtils.php
includes/StubObject.php
includes/Title.php
includes/TitleArray.php
includes/User.php
includes/UserArray.php
includes/UserMailer.php
includes/UserRightsProxy.php
includes/WatchedItem.php
includes/WebRequest.php
includes/Wiki.php
includes/WikiCategoryPage.php
includes/WikiFilePage.php
includes/WikiMap.php
includes/WikiPage.php
includes/Xml.php
includes/XmlTypeCheck.php
includes/ZhClient.php
includes/ZhConversion.php
includes/ZipDirectoryReader.php
includes/actions/CachedAction.php [new file with mode: 0644]
includes/actions/HistoryAction.php
includes/actions/RawAction.php
includes/actions/ViewAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiEmailUser.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedContributions.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatXml.php
includes/api/ApiImport.php
includes/api/ApiLogin.php
includes/api/ApiLogout.php
includes/api/ApiMain.php
includes/api/ApiMove.php
includes/api/ApiOptions.php [new file with mode: 0644]
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiPatrol.php
includes/api/ApiProtect.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php [new file with mode: 0644]
includes/api/ApiQueryAllLinks.php
includes/api/ApiQueryAllMessages.php [new file with mode: 0644]
includes/api/ApiQueryAllPages.php [new file with mode: 0644]
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryAllimages.php [deleted file]
includes/api/ApiQueryAllmessages.php [deleted file]
includes/api/ApiQueryAllpages.php [deleted file]
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryCategories.php
includes/api/ApiQueryCategoryInfo.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryDuplicateFiles.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.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/ApiQueryLogEvents.php
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryTags.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiQueryWatchlistRaw.php
includes/api/ApiRollback.php
includes/api/ApiTokens.php
includes/api/ApiUnblock.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiUserrights.php
includes/api/ApiWatch.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/dao/IDBAccessObject.php [new file with mode: 0644]
includes/db/CloneDatabase.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseIbm_db2.php
includes/db/DatabaseMssql.php
includes/db/DatabaseMysql.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseSqlite.php
includes/db/DatabaseUtility.php
includes/db/IORMRow.php [new file with mode: 0644]
includes/db/IORMTable.php [new file with mode: 0644]
includes/db/LBFactory.php
includes/db/LBFactory_Multi.php
includes/db/LBFactory_Single.php
includes/db/LoadBalancer.php
includes/db/LoadMonitor.php
includes/db/ORMIterator.php [new file with mode: 0644]
includes/db/ORMResult.php [new file with mode: 0644]
includes/db/ORMRow.php [new file with mode: 0644]
includes/db/ORMTable.php [new file with mode: 0644]
includes/debug/Debug.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/FileOpBatch.php [new file with mode: 0644]
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/backend/lockmanager/MemcLockManager.php [new file with mode: 0644]
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.i18n.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/Job.php [new file with mode: 0644]
includes/job/JobQueue.php [deleted file]
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/LogPage.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/mobile/DeviceDetection.php [new file with mode: 0644]
includes/normal/UtfNormalDefines.php
includes/normal/UtfNormalTest2.php
includes/objectcache/APCBagOStuff.php
includes/objectcache/BagOStuff.php
includes/objectcache/DBABagOStuff.php
includes/objectcache/EhcacheBagOStuff.php
includes/objectcache/EmptyBagOStuff.php
includes/objectcache/HashBagOStuff.php
includes/objectcache/MemcachedBagOStuff.php [new file with mode: 0644]
includes/objectcache/MemcachedClient.php
includes/objectcache/MemcachedPeclBagOStuff.php [new file with mode: 0644]
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/ProfilerSimpleText.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/revisiondelete/RevisionDelete.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchEngine.php
includes/search/SearchUpdate.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php [new file with mode: 0644]
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDisambiguations.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListgrouprights.php
includes/specials/SpecialLockdb.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMostcategories.php
includes/specials/SpecialMostlinked.php
includes/specials/SpecialMostlinkedtemplates.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPopularpages.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialRandompage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialShortpages.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserlogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWantedtemplates.php
includes/specials/SpecialWatchlist.php
includes/templates/NoLocalSettings.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/tidy.conf
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/zhtable/.gitignore [new file with mode: 0644]
includes/zhtable/Makefile.py [changed mode: 0644->0755]
includes/zhtable/tradphrases.manual
index.php
index.php5
languages/Language.php
languages/Names.php
languages/classes/LanguageAm.php
languages/classes/LanguageAr.php
languages/classes/LanguageAz.php
languages/classes/LanguageBe.php
languages/classes/LanguageBe_tarask.php
languages/classes/LanguageBg.php
languages/classes/LanguageBh.php
languages/classes/LanguageBs.php
languages/classes/LanguageCs.php
languages/classes/LanguageCu.php
languages/classes/LanguageCy.php
languages/classes/LanguageDsb.php
languages/classes/LanguageEo.php
languages/classes/LanguageEt.php
languages/classes/LanguageFi.php
languages/classes/LanguageFr.php
languages/classes/LanguageGa.php
languages/classes/LanguageGan.php
languages/classes/LanguageGd.php
languages/classes/LanguageGv.php
languages/classes/LanguageHe.php
languages/classes/LanguageHi.php
languages/classes/LanguageHr.php
languages/classes/LanguageHsb.php
languages/classes/LanguageHu.php
languages/classes/LanguageHy.php
languages/classes/LanguageIu.deps.php [deleted file]
languages/classes/LanguageIu.php
languages/classes/LanguageJa.php
languages/classes/LanguageKaa.php
languages/classes/LanguageKk.deps.php [deleted file]
languages/classes/LanguageKk.php
languages/classes/LanguageKk_cyrl.php
languages/classes/LanguageKm.php
languages/classes/LanguageKsh.php
languages/classes/LanguageKu.deps.php [deleted file]
languages/classes/LanguageKu.php
languages/classes/LanguageKu_ku.php
languages/classes/LanguageLa.php
languages/classes/LanguageLn.php
languages/classes/LanguageLt.php
languages/classes/LanguageLv.php
languages/classes/LanguageMg.php
languages/classes/LanguageMk.php
languages/classes/LanguageMl.php
languages/classes/LanguageMo.php
languages/classes/LanguageMt.php
languages/classes/LanguageMy.php
languages/classes/LanguageNso.php
languages/classes/LanguageOs.php
languages/classes/LanguagePl.php
languages/classes/LanguageQqx.php
languages/classes/LanguageRo.php
languages/classes/LanguageRu.php
languages/classes/LanguageSe.php
languages/classes/LanguageSgs.php
languages/classes/LanguageSh.php
languages/classes/LanguageShi.deps.php [deleted file]
languages/classes/LanguageShi.php
languages/classes/LanguageSk.php
languages/classes/LanguageSl.php
languages/classes/LanguageSma.php
languages/classes/LanguageSr.deps.php [deleted file]
languages/classes/LanguageSr.php
languages/classes/LanguageSr_ec.php
languages/classes/LanguageSr_el.php
languages/classes/LanguageTg.php
languages/classes/LanguageTi.php
languages/classes/LanguageTl.php
languages/classes/LanguageTr.php
languages/classes/LanguageTyv.php
languages/classes/LanguageUk.php
languages/classes/LanguageWa.php
languages/classes/LanguageYue.php
languages/classes/LanguageZh.deps.php [deleted file]
languages/classes/LanguageZh.php
languages/classes/LanguageZh_hans.php
languages/messages/MessagesAce.php
languages/messages/MessagesAeb.php
languages/messages/MessagesAf.php
languages/messages/MessagesAln.php
languages/messages/MessagesAm.php
languages/messages/MessagesAn.php
languages/messages/MessagesAng.php
languages/messages/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAz.php
languages/messages/MessagesBa.php
languages/messages/MessagesBar.php
languages/messages/MessagesBcc.php
languages/messages/MessagesBcl.php
languages/messages/MessagesBe.php
languages/messages/MessagesBe_tarask.php
languages/messages/MessagesBg.php
languages/messages/MessagesBh.php
languages/messages/MessagesBho.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBn.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBs.php
languages/messages/MessagesCa.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCps.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesEl.php
languages/messages/MessagesEn.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php [new file with mode: 0644]
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGn.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHa.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHt.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJam.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKv.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLg.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLoz.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNl.php
languages/messages/MessagesNn.php
languages/messages/MessagesNo.php
languages/messages/MessagesNso.php
languages/messages/MessagesOc.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPam.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRgn.php
languages/messages/MessagesRif.php
languages/messages/MessagesRm.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesSa.php
languages/messages/MessagesSah.php
languages/messages/MessagesSat.php [new file with mode: 0644]
languages/messages/MessagesSc.php
languages/messages/MessagesScn.php
languages/messages/MessagesSco.php
languages/messages/MessagesSd.php
languages/messages/MessagesSdc.php
languages/messages/MessagesSe.php
languages/messages/MessagesSei.php
languages/messages/MessagesSgs.php
languages/messages/MessagesSh.php
languages/messages/MessagesShi.php
languages/messages/MessagesSi.php
languages/messages/MessagesSimple.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesSli.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTo.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTs.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUk.php
languages/messages/MessagesUr.php
languages/messages/MessagesUz.php
languages/messages/MessagesVec.php
languages/messages/MessagesVep.php
languages/messages/MessagesVi.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
load.php
load.php5
maintenance/Maintenance.php
maintenance/archives/patch-filejournal.sql
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/attachLatest.php
maintenance/backupTextPass.inc
maintenance/benchmarks/bench_utf8_title_check.php [new file with mode: 0644]
maintenance/changePassword.php
maintenance/checkAutoLoader.php
maintenance/checkBadRedirects.php
maintenance/checkImages.php
maintenance/checkSyntax.php
maintenance/checkUsernames.php
maintenance/cleanupImages.php
maintenance/cleanupSpam.php
maintenance/cleanupUploadStash.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php [new file with mode: 0644]
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.php
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpTextPass.php
maintenance/fileOpPerfTest.php [new file with mode: 0644]
maintenance/formatInstallDoc.php
maintenance/ibm_db2/tables.sql
maintenance/importSiteScripts.php
maintenance/install.php
maintenance/language/generateCollationData.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/language/rebuildLanguage.php
maintenance/language/writeMessagesArray.inc
maintenance/locking/LockServerDaemon.php
maintenance/mctest.php
maintenance/mssql/tables.sql
maintenance/mwdocgen.php
maintenance/nextJobDB.php
maintenance/oracle/tables.sql
maintenance/populateImageSha1.php
maintenance/populateParentId.php
maintenance/populateRevisionSha1.php
maintenance/postgres/tables.sql
maintenance/proxy_check.php
maintenance/purgeParserCache.php
maintenance/purgeStaleMemcachedText.php
maintenance/refreshLinks.php
maintenance/runJobs.php
maintenance/storage/checkStorage.php
maintenance/syncFileBackend.php [new file with mode: 0644]
maintenance/tables.sql
maintenance/term/MWTerm.php
maintenance/update.php
mw-config/index.php
mw-config/overrides.php [new file with mode: 0644]
opensearch_desc.php
opensearch_desc.php5
redirect.php
redirect.php5
resources/Resources.php
resources/jquery.effects/jquery.effects.blind.js
resources/jquery.effects/jquery.effects.bounce.js
resources/jquery.effects/jquery.effects.clip.js
resources/jquery.effects/jquery.effects.core.js
resources/jquery.effects/jquery.effects.drop.js
resources/jquery.effects/jquery.effects.explode.js
resources/jquery.effects/jquery.effects.fade.js
resources/jquery.effects/jquery.effects.fold.js
resources/jquery.effects/jquery.effects.highlight.js
resources/jquery.effects/jquery.effects.pulsate.js
resources/jquery.effects/jquery.effects.scale.js
resources/jquery.effects/jquery.effects.shake.js
resources/jquery.effects/jquery.effects.slide.js
resources/jquery.effects/jquery.effects.transfer.js
resources/jquery.tipsy/images/tipsy.png
resources/jquery.ui/i18n/jquery.ui.datepicker-ar.js
resources/jquery.ui/i18n/jquery.ui.datepicker-de.js
resources/jquery.ui/i18n/jquery.ui.datepicker-et.js
resources/jquery.ui/i18n/jquery.ui.datepicker-eu.js
resources/jquery.ui/i18n/jquery.ui.datepicker-fa.js
resources/jquery.ui/i18n/jquery.ui.datepicker-fi.js
resources/jquery.ui/i18n/jquery.ui.datepicker-hi.js
resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js [new file with mode: 0644]
resources/jquery.ui/i18n/jquery.ui.datepicker-mk.js
resources/jquery.ui/jquery.ui.accordion.js
resources/jquery.ui/jquery.ui.autocomplete.js
resources/jquery.ui/jquery.ui.button.js
resources/jquery.ui/jquery.ui.core.js
resources/jquery.ui/jquery.ui.datepicker.js
resources/jquery.ui/jquery.ui.dialog.js
resources/jquery.ui/jquery.ui.draggable.js
resources/jquery.ui/jquery.ui.droppable.js
resources/jquery.ui/jquery.ui.mouse.js
resources/jquery.ui/jquery.ui.position.js
resources/jquery.ui/jquery.ui.progressbar.js
resources/jquery.ui/jquery.ui.resizable.js
resources/jquery.ui/jquery.ui.selectable.js
resources/jquery.ui/jquery.ui.slider.js
resources/jquery.ui/jquery.ui.sortable.js
resources/jquery.ui/jquery.ui.tabs.js
resources/jquery.ui/jquery.ui.widget.js
resources/jquery.ui/themes/default/jquery.ui.accordion.css
resources/jquery.ui/themes/default/jquery.ui.autocomplete.css
resources/jquery.ui/themes/default/jquery.ui.button.css
resources/jquery.ui/themes/default/jquery.ui.core.css
resources/jquery.ui/themes/default/jquery.ui.datepicker.css
resources/jquery.ui/themes/default/jquery.ui.dialog.css
resources/jquery.ui/themes/default/jquery.ui.progressbar.css
resources/jquery.ui/themes/default/jquery.ui.resizable.css
resources/jquery.ui/themes/default/jquery.ui.selectable.css
resources/jquery.ui/themes/default/jquery.ui.slider.css
resources/jquery.ui/themes/default/jquery.ui.tabs.css
resources/jquery.ui/themes/default/jquery.ui.theme.css
resources/jquery.ui/themes/vector/images/button-disabled-blue.png
resources/jquery.ui/themes/vector/images/button-disabled-green.png
resources/jquery.ui/themes/vector/images/button-disabled-red.png
resources/jquery.ui/themes/vector/images/button-disabled.png
resources/jquery.ui/themes/vector/images/button-down-blue.png
resources/jquery.ui/themes/vector/images/button-down-green.png
resources/jquery.ui/themes/vector/images/button-down-red.png
resources/jquery.ui/themes/vector/images/button-down.png
resources/jquery.ui/themes/vector/images/button-off-green.png
resources/jquery.ui/themes/vector/images/button-off.png
resources/jquery.ui/themes/vector/images/button-over-green.png
resources/jquery.ui/themes/vector/images/button-over-red.png
resources/jquery.ui/themes/vector/images/button-over.png
resources/jquery.ui/themes/vector/images/close.png
resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png
resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png
resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png
resources/jquery.ui/themes/vector/jquery.ui.dialog.css
resources/jquery.ui/themes/vector/jquery.ui.resizable.css
resources/jquery/images/jquery.arrowSteps.divider-ltr.png
resources/jquery/images/jquery.arrowSteps.divider-rtl.png
resources/jquery/jquery.byteLimit.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.qunit.css
resources/jquery/jquery.qunit.js
resources/jquery/jquery.suggestions.js
resources/mediawiki.action/mediawiki.action.watch.ajax.js [deleted file]
resources/mediawiki.api/mediawiki.api.js
resources/mediawiki.language/languages/ar.js
resources/mediawiki.language/languages/bs.js
resources/mediawiki.language/languages/dsb.js
resources/mediawiki.language/languages/fi.js [new file with mode: 0644]
resources/mediawiki.language/languages/ga.js
resources/mediawiki.language/languages/he.js
resources/mediawiki.language/languages/hsb.js
resources/mediawiki.language/languages/hu.js [new file with mode: 0644]
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/la.js [new file with mode: 0644]
resources/mediawiki.language/languages/nl.js [deleted file]
resources/mediawiki.language/languages/os.js [new file with mode: 0644]
resources/mediawiki.language/languages/pt-br.js [deleted file]
resources/mediawiki.language/languages/pt.js [deleted file]
resources/mediawiki.language/languages/ru.js
resources/mediawiki.language/languages/sl.js
resources/mediawiki.language/languages/uk.js
resources/mediawiki.language/mediawiki.language.init.js [new file with mode: 0644]
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js [new file with mode: 0644]
resources/mediawiki.special/mediawiki.special.search.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.util.js
skins/Chick.deps.php [deleted file]
skins/Chick.php
skins/CologneBlue.php
skins/Modern.deps.php [deleted file]
skins/Modern.php
skins/MonoBook.deps.php [deleted file]
skins/MonoBook.php
skins/MySkin.deps.php [deleted file]
skins/MySkin.php
skins/Nostalgia.php
skins/Simple.deps.php [deleted file]
skins/Simple.php
skins/Vector.deps.php [deleted file]
skins/Vector.php
skins/chick/main.css
skins/cologneblue/screen.css
skins/common/commonElements.css
skins/common/commonPrint.css
skins/common/images/Arr_.png
skins/common/images/ar/button_bold.png
skins/common/images/ar/button_link.png
skins/common/images/ar/button_nowiki.png
skins/common/images/be-tarask/button_bold.png
skins/common/images/button_hr.png
skins/common/images/button_sig.png
skins/common/images/button_template.png
skins/common/images/closewindow.png
skins/common/images/closewindow19x19.png
skins/common/images/cyrl/button_italic.png
skins/common/images/fa/button_italic.png
skins/common/images/fa/button_nowiki.png
skins/common/images/nextredirectltr.png
skins/common/images/nextredirectrtl.png
skins/common/images/tooltip_icon.png
skins/modern/document.png
skins/modern/footer-grad.png
skins/modern/main.css
skins/modern/news_icon.png
skins/modern/video.png
skins/monobook/document.png
skins/monobook/main.css
skins/monobook/news_icon.png
skins/monobook/video.png
skins/simple/main.css
skins/vector/images/arrow-down-focus-icon.png
skins/vector/images/arrow-down-icon.png
skins/vector/images/audio-icon.png
skins/vector/images/border.png
skins/vector/images/bullet-icon.png
skins/vector/images/link-icon.png
skins/vector/images/lock-icon.png
skins/vector/images/mail-icon.png
skins/vector/images/page-base.png
skins/vector/images/page-fade.png
skins/vector/images/portal-break.png
skins/vector/images/preferences-base.png
skins/vector/images/preferences-break.png
skins/vector/images/preferences-edge.png
skins/vector/images/preferences-fade.png
skins/vector/images/search-fade.png
skins/vector/images/tab-current-fade.png
skins/vector/images/user-icon.png
skins/vector/images/video-icon.png
skins/vector/screen-hd.css [new file with mode: 0644]
skins/vector/screen.css
tests/TestsAutoLoader.php
tests/jasmine/SpecRunner.html
tests/jasmine/spec/mediawiki.Uri.spec.js [deleted file]
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/bootstrap.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php [new file with mode: 0644]
tests/phpunit/includes/IPTest.php
tests/phpunit/includes/LinksUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/RevisionStorageTest.php [new file with mode: 0644]
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiOptionsTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/generateRandomImages.php
tests/phpunit/includes/cache/GenderCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/db/ORMRowTest.php [new file with mode: 0644]
tests/phpunit/includes/db/TestORMRowTest.php [new file with mode: 0644]
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/filerepo/FileBackendTest.php
tests/phpunit/includes/libs/CSSMinTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/mobile/DeviceDetectionTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php [new file with mode: 0644]
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/MaintenanceTest.php [new file with mode: 0644]
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/qunit/QUnitTestResources.php
tests/qunit/data/styleTest.css.php
tests/qunit/data/testloader.php [new file with mode: 0644]
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/selenium/SeleniumConfig.php
thumb.php
thumb.php5
thumb_handler.php
thumb_handler.php5

diff --git a/CREDITS b/CREDITS
index bac7391..fd86da8 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -7,6 +7,7 @@ following names for their contribution to the product.
 * Alex Z.
 * Alexandre Emsenhuber
 * Andrew Garrett
+* Arthur Richards
 * Aryeh Gregor
 * Antoine Musso
 * Brian Wolff
@@ -108,6 +109,7 @@ following names for their contribution to the product.
 * David Baumgarten
 * Denny Vrandecic
 * Edward Z. Yang
+* Elvis Stansvik
 * Erwin Dokter
 * FunPika
 * fomafix
@@ -135,6 +137,7 @@ following names for their contribution to the product.
 * Manuel Menal
 * Marcin Cieślak
 * Marcus Buck
+* Mark A. Pelletier
 * Marooned
 * Mathias Ertl
 * Matthew Britton
@@ -172,6 +175,7 @@ following names for their contribution to the product.
 * rgcjonas
 * Robert Treat
 * RockMFR
+* Russell Blau
 * Rusty Burchfield
 * Salvatore Ingala
 * Scott Colcord
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
diff --git a/RELEASE-NOTES-1.19 b/RELEASE-NOTES-1.19
deleted file mode 100644 (file)
index 94f034c..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals
-setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.19 ==
-
-THIS IS NOT A RELEASE YET
-
-This is a beta release of the MediaWiki 1.19 branch. Please test it and let us
-know what you think of it. Beta releases are not recommended for use in
-production.
-
-=== Changes since 1.19 beta 2 ===
-* Special:Watchlist no longer sets links to feed when the user is anonymous
-* (bug 35565) Special:Log/patrol doesn't indicate whether patrolling was
-  automatic
-
-=== Changes since 1.19 beta 1 ===
-* (bug 35014) Including a special page no longer sets the page's title to the
-  included page.
-* (bug 35019) Edit summaries are no longer transformed in notification e-mails.
-* (bug 35152) Help message for e-mail is shown again in user preferences.
-* (bug 34887) $3 and $4 parameters are now substituted correctly in message
-  "movepage-moved".
-* (bug 34841) Edit links are no longer displayed when display old page versions
-* (bug 34889) User name should be normalized on Special:Contributions.
-* (bug 35051) If heading has a trailing space after == then its name is not
-  preloaded into edit summary on section edit.
-* (bug 31417) New ID mw-content-text around the actual page text, without categories,
-  contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
-* (bug 35303) Proxy and DNS blacklist blocking works again
-* (bug 35294) jquery.byteLimit shouldn't set element specific variables outside
-  the "return this.each" loop.
-* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in 
-  core parser functions which operate on strings, such as padleft.
-* (bug 18295) Don't expose strip markers when a tag appears inside a link 
-  inside a heading.
-* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
-  CSRF attacks
-
-=== Configuration changes in 1.19 ===
-* Removed SkinTemplateSetupPageCss hook; use BeforePageDisplay instead.
-* (bug 27132) movefile right granted by default to registered users.
-* Default cookie lifetime ($wgCookieExpiration) is increased to 180 days.
-* (bug 31204) Removed old user.user_options.
-* $wgMaxImageArea now applies to jpeg files if they are not scaled with
-  ImageMagick.
-* Introduced $wgQueryPageDefaultLimit (defaults to 50) for the number of
-  items to show by default on query pages (special pages such as Whatlinkshere).
-* (bug 32470) Increase the length of ug_group.
-* (bug 32239) Removed $wgEnableTooltipsAndAccesskeys.
-* Removed $wgVectorShowVariantName.
-* Removed $wgExtensionAliasesFiles. Use $wgExtensionMessagesFiles.
-* Removed $wgResourceLoaderInlinePrivateModules, now always enabled.
-
-=== New features in 1.19 ===
-* (bug 19838) Add ability to get all interwiki prefixes also if the interwiki
-  cache is used.
-* $wgDnsBlacklistUrls now accepts an array with url and key as the
-  elements to work with DNSBLs that require keys, such as
-  Project Honeypot.
-* (bug 30022) Add support for custom loadScript sources to ResourceLoader.
-* (bug 19052) Unicode space separator characters (Zs) now terminates external
-  links and images links.
-* (bug 30160) Add public method to mw.loader to get module names from registry.
-* (bug 15558) Parameters to special pages included in wikitext can now be passed
-  as with templates.
-* Installer now issues a warning if mod_security is present.
-* (bug 29455) Add support for a filter callback function in jQuery byteLimit
-  plugin.
-* Added two new GetLocalURL hooks to better serve extensions working on a
-  limited type of titles.
-* Added a --no-updates flag to importDump.php that skips updating the links
-  tables.
-* Most presentational html attributes like valign are now converted to inline
-  css style rules. These attributes were removed from html5 and so we clean
-  them up when $wgHtml5 is enabled. This can be disabled using
-  $wgCleanupPresentationalAttributes.
-* Magic words (time and number-formatting ones, plus DIRECTIONMARK, but not
-  NAMESPACE) now depend on the page content language instead of the site
-  language. In theory this sets the right magic words in system messages,
-  although they are not used there.
-* (bug 30451) Add page_props to RefreshLinks::deleteLinksFromNonexistent.
-* (bug 30450) Clear page_props table on page deletion.
-* Hook added to check for exempt from account creation throttle.
-* (bug 30344) Add configuration variable for setting custom priorities when
-  generating sitemaps.
-* (bug 96170) Add array support for space-separated list attributes (like
-  'class') in the Html helper class.
-* (bug 26470) Add checkered background image on hover on files pages.
-* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
-  attribute values and element contents.
-* Conversion script between Tifinagh and Latin for the Tachelhit language.
-* (bug 16755) Add options 'noreplace' and 'noerror' to {{DEFAULTSORT:...}}
-  to stop it from replace an already existing default sort, and suppress error.
-* (bug 18578) Rewrote revision delete related messages to allow better
-  localisation.
-* (bug 30364) LanguageConverter now depends on the page content language
-  instead of the wiki content language.
-* Jump links will now be usable in CSS-capable browsers instead of only
-  in outdated text browsers.
-* New common*.css files usable by skins instead of having to copy piles
-  of generic styles from MonoBook or Vector's css.
-* Some deprecated presentational html attributes will now be automatically
-  converted to css.
-* (bug 31297) Add support for namespaces in Special:RecentChanges subpage filter
-  syntax.
-* The default user signature now contains a talk link in addition to the user link.
-* (bug 25306) Add link of old page title to MediaWiki:Delete_and_move_reason.
-* Added hook BitmapHandlerCheckImageArea.
-* (bug 30062) Add $wgDBprefix option to cli installer.
-* getUserPermissionsErrors and getUserPermissionsErrorsExpensive hooks are now
-  also called when checking for 'read' permission.
-* Introduce $wgEnableSearchContributorsByIP which controls whether searching
-  for an IP address redirects to the contributions list for that IP.
-* (bug 8859) Database::update should take array of tables too.
-* (bug 19698) Add "Inverse namespaces" option to Special:Contributions.
-* (bug 24037) Add byte length of revision to Special:Contributions.
-* (bug 1672) Added $wgDisableUploadScriptChecks to allow uploading of files
-  containing HTML or JS. DISABLING THESE CHECKS IS VERY DANGEROUS.
-* New path mappings can be added using the WebRequestPathInfoRouter hook
-  and adding paths to the PathRouter.
-* (bug 32666) Special:ActiveUsers now allows a subpage to be used as value for the
-  "target" query parameter (eg. Special:ActiveUsers/Username).
-* New JavaScript variable wgPageContentLanguage.
-* Added new debugging toolbar, enabled with $wgDebugToolbar.
-* Differences in the history page now uses slightly better colors for people
-  perceiving colors differently.
-* (bug 32879) Upgrade jQuery to 1.7.1.
-* jQuery UI upgraded to 1.8.17.
-* Extensions can use the 'Language::getMessagesFileName' hook to define new
-  languages using messages files outside of core.
-* (bug 32512) Add 'Associated namespace' checkbox to Special:Contributions.
-* Added $wgSend404Code, true by default, which can be set to false to send a 
-  200 status code instead of 404 for nonexistent articles.
-* (bug 33447) Link to the broken image tracking category from Special:Wantedfiles.
-* (bug 27724) Add timestamp to job queue.
-* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default,
-  due to tests potentially being harmful, not to be run on a production wiki.
-  Enable by setting $wgEnableJavaScriptTest to true.
-* Extensions can use the RequestContextCreateSkin hook to override what skin is
-  loaded in some contexts.
-* (bug 33456) Show $wgQueryCacheLimit on cached query pages.
-* (bug 10574) Add an option to allow all pages to be exported by Special:Export.
-* mediawiki.js Message object constructor is now publicly available as mw.Message.
-* (bug 29309) Allow CSS class per tooltip (tipsy).
-* (bug 33565) Add accesskey/tooltip to submit buttons on Special:EditWatchlist.
-* (bug 17959) Inline rendering/thumbnailing for Gimp XCF images.
-* (bug 27775) Namespace has it's own XML tag in the XML dump file.
-* (bug 30513) Redirect tag is now resolved in XML dump file.
-* sha1 xml tag added to XML dump file.
-* (bug 33646) Badtitle error page now emits a 400 HTTP status.
-* Special:MovePage now has a dropdown menu for namespaces.
-* (bug 34420) Special:Version now shows git HEAD sha1 when available.
-* (bug 33952) Refactor mw.toolbar to allow dynamic additions at any time.
-* Now possible to specify separate section title and edit summary when adding
-  a new section to a page via the edit API action.
-
-=== Bug fixes in 1.19 ===
-* $wgUploadNavigationUrl should be used for file redlinks if.
-  $wgUploadMissingFileUrl is not set. The first was used for this
-  until the second was introduced in 1.17.
-* BREAKING CHANGE:  Style rules for wikitable are now more specific and prevent
-  inheritance to nested tables which caused various issues (bug 30485 and bug
-  33434). If your wiki has overriden rules for ".wikitable", please revise them and
-  adjust where neccecary. For comparison, use the "table.wikitable" section in
-  skins/common/shared.css as base.
-* $wgUploadNavigationUrl is now used for file redlinks if
-  $wgUploadMissingFileUrl is not set. The former was used for this until the
-  second was introduced in 1.17.
-* (bug 27894) Move 'editondblclick' event listener down from body to
-  div#bodyContent.
-* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
-  when the function exists but is disabled. Introduced
-  Maintenance::posix_isatty().
-* (bug 30264) Changed installer-generated LocalSettings.php to use
-  require_once() instead require() for included extensions.
-* Do not convert text in the user interface language to another script.
-* (bug 26283) Previewing user JS/CSS pages didn't load other user JS/CSS pages.
-* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
-  warnings/notices to be thrown.
-* (bug 30335) Fix for HTMLForms using GET that were breaking when non-friendly
-  URLs are used.
-* (bug 28649) Preventing half truncated multi-byte unicode characters when
-  truncating log comments.
-* Show --batch-size option in help of maintenance scripts that support it.
-* (bug 4381) Magic quotes cleaning was not comprehensive, key strings were not
-  unescaped.
-* (bug 23057) Importers no longer can 'edit' or 'create' a fully-protected page by
-  importing a new revision into it.
-* Allow moving the associated talk pages of subpages even if the base page
-  has no subpage.
-* Per page edit-notices now work in namespaces without subpages enabled.
-* (bug 31081) $wgEnotifUseJobQ is no longer unconditionally enqueueing jobs.
-* (bug 30202) File names are now restricted on upload to 240 bytes, because of
-  restrictions on some of the database fields.
-* Timezones are now recognised in user preferences when offset is different
-  due to DST.
-* (bug 31692) "summary" parameter now also works when undoing revisions.
-* (bug 18823) "move succeeded" text displayed bluelinks even when redirect was
-  suppressed.
-* (bug 19186) Special:UserLogin's title on Special:SpecialPages now says
-  "create account" when the user cannot create an account.
-* (bug 31818) 'usercreated' message now supports GENDER.
-* (bug 32022) Our phpunit.php script can now be executed from another directory.
-* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs.
-  from recent changes feeds.
-* (bug 30232) add current time to message wlnote on Special:Watchlist.
-* (bug 29110) $wgFeedDiffCutoff did not affect new pages.
-* (bug 32168) Add wfRemoveDotSegments for use in wfExpandUrl.
-* (bug 32358) Do not display "No higher resolution available" for dimensionless
-  files (like audio files).
-* (bug 32168) Add wfAssembleUrl for use in wfExpandUrl.
-* (bug 32168) fixed - wfExpandUrl expands dot segments now.
-* (bug 31535) Upload comments now truncated properly, and don't have brackets.
-* (bug 32086) Special:PermanentLink now show an error message when no subpage
-  was specified.
-* (bug 30368) Special:Newpages now shows the new page name for moved pages.
-* (bug 1697) The way to search blocked usernames in block log should be clearer.
-* (bug 29747) eAccelerator shared memory caching has been removed since it is
-  now disabled by default and is buggy. APC, XCache and WinCache are not affected.
-* Installer now refuses to install if php was not compiled with Ctype support.
-* (bug 29475) Remove "trackback" feature entirely from core.
-* (bug 32665) Special:BlockList prefills the username in the input field if
-  using the Special:BlockList/username URL.
-* (bug 27721) Make JavaScript variables wgSeparatorTransformTable and
-  wgDigitTransformTable depend on page content language so the sort script
-  sorts correctly more often.
-* (bug 32230) Expose wgRedirectedFrom in JavaScript.
-* (bug 31212) History tab not collapsed when the screen is narrow.
-* (bug 15521) Use new section summary when the action of adding a new section
-  also happens to create the page.
-* (bug 32960) Remove EmailAuthenticationTimestamp from database when a
-  email address is removed.
-* (bug 32414) Empty page get a empty bytes attribute in Export/Dump.
-* (bug 33101) Viewing a User or User talk of username resembling IP ending
-  with .xxx causes Internal error.
-* Warning about undefined index in certain situations when $wgLogRestrictions
-  causes the first log type requested to be removed but not the others.
-* Use separate message ('prefixindex-namespace') for title of
-  Special:PrefixIndex rather then re-using Special:AllPages's allinnamespace.
-* (bug 33156) Special:Block now allows you to confirm you want to block yourself
-  when using non-normalized username.
-* (bug 33246) News icon shown for news:// URLs but not for news: URLs.
-* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
-  cssText after DOM insertion.
-* (bug 30711) When adding a new section to a page with section=new, the text is
-  now always added to the current version of the page.
-* (bug 31719) Fix uploads of SVGs exported by Adobe Illustrator by expanding 
-  XML entities correctly.
-* (bug 30914) Embeddable ResourceLoader modules (user.options, user.tokens)
-  should be loaded in <head> for proper dependency resolution.
-* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
-  for backward compatibility.
-* (bug 31469) Make sure tracking category messages expand variables like
-  {{NAMESPACE}} relative to correct title.
-* (bug 33454) ISO-8601 week-based year number (format character 'o') is now
-  calculated correctly with respect to timezone.
-* (bug 32219) InstantCommons now fetches content from Wikimedia Commons using
-  HTTPS when the local wiki is served over HTTPS.
-* (bug 33525) clearTagHooks doesn't clear function hooks.
-* (bug 33523) Function tag hooks don't appear on Special:Version.
-* Files with IPTC blocks we can't read no longer prevent extraction of exif
-  or other metadata.
-* (bug 33587) Remove action "historysubmit" from history pages.
-* (bug 25800) mw.config wgAction should contain the actually performed action instead
-  of whatever the query value contains.
-* (bug 4438) Add CSS hook for current WikiPage action.
-* (bug 33703) Common border-bottom color for <abbr> should inherit default (text) color.
-* (bug 33819) Display file sizes in appropriate units.
-* (bug 32948) {{REVISIONID}} and related variables are no longer blank after doing
-  a null edit.
-* (bug 33880) $wgUsersNotifiedOnAllChanges should not send e-mail to user who made
-  the edit.
-* (bug 33902) Decoding %2B with mw.Uri.decode results in ' ' instead of +.
-* (bug 33762) QueryPage-based special pages no longer misses *-summary message.
-* Other sizes links are no longer generated for wikis without a 404 thumbnail handler.
-* (bug 29454) Enforce byteLimit for page title input on Special:MovePage.
-* (bug 34114) CSSMin::remap() doesn't respect its $embed parameter.
-* Special:Contributions/newbies now shows the contributions for the user "newbies".
-  New user contributions are obtained using the form or using ?contribs=newbie in URL.
-* It is now possible to delete images that have no corresponding description pages.
-* (bug 33165) GlobalFunctions.php line 1312: Call to a member function
-  getText() on a non-object.
-* (bug 31676) Group dynamically inserted CSS into a single <style> tag, to work
-  around a bug where not all styles were applied in Internet Explorer.
-* (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
-* (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
-* (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
-  array.
-* (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
-   on Windows
-* (bug 25095) Special:Categories should also include the first relevant item
-   when "from" is filled.
-* (bug 12262) Indents and lists are now aligned
-* (bug 34972) An error occurred while changing your watchlist settings for 
-  [[Special:WhatLinksHere/Example]]
-
-=== API changes in 1.19 ===
-* Made action=edit less likely to return "unknownerror", by returning the actual error
-  message (which may have come from a hook call or similar).
-* (bug 19838) siprop=interwikimap can now use the interwiki cache.
-* (bug 29748) Add API search prefix support.
-* (bug 29684) Set forgotten parameter types in ApiQueryIWLinks.
-* (bug 29685) do not output NULL parentid with list=deletedrevs&drprop=parentid.
-* siprop=interwikimap and siprop=languages can use silanguagecode to have
-  a best effort language name translation. Use CLDR extension for best result.
-* (bug 30230) action=expandtemplates should not silently override invalid title
-  inputs.
-* (bug 18634) Create API to fetch MediaWiki's language fallback tree structure.
-* (bug 26885) Allow show/hide of account blocks, temporary blocks and single IP
-  address blocks for list=blocks.
-* (bug 30591) Add support to only return keys in ApiAllMessages.
-* The API now respects $wgShowHostnames and won't share the hostname in
-  severedby if it's set to false.
-* wlexcludeuser parameter added to ApiFeedWatchlist.
-* (bug 7304) Links on redirect pages no longer cause the redirect page to show
-  up as a redirect to the linked page on Special:Whatlinkshere.
-* (bug 32609) API: Move captchaid/captchaword of action=edit from core
-  to Captcha extension(s).
-* Added 'APIGetDescription' hook.
-* (bug 32688) Paraminfo for parameter "generator" of the query module shows too
-  many types.
-* (bug 32415) Empty page get no size attribute in API output.
-* (bug 31759) Undefined property notice in querypages API.
-* (bug 32495) API should allow purge by pageids.
-* (bug 33147) API examples should explain what they do.
-* (bug 33482) Api incorrectly calls ApiBase::parseMultiValue if allowed
-  values is given as an array.
-* (bug 32948) {{REVISIONID}} and related variables are no longer blank after
-  calling action=purge&forcelinkupdate.
-* (bug 34377) action=watch now parses messages using the correct title instead
-  of "API".
-* (bug 35036) ResourceLoaderWikiModule should auto-update when messages (created
-  or overwritten) in the MediaWiki namespace change.
-
-=== Languages updated in 1.19 ===
-
-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.
-
-* Canadian English (en-ca) (new).
-* Norwegian (bokmål) (nb) (renamed from no).
-* Uighur (Latin) (ug-latn) was incorrectly marked as right-to-left language.
-* (bug 30217) Make pt-br a fallback of pt.
-* (bug 31193) Set fallback language of Assamese from Bengali to English.
-* Update date format for dsb and hsb: month names need the genitive.
-* (bug 28643) Serbian variant conversion improvements (Nikola Smolenski).
-* (bug 29405, bug 30809) Lower diacritics are invisible in titles in Indic
-  languages Assamese, Bengali, Hindi, Malyalam and Odiya.
-* (bug 32826) Titles in indic languages are partially cut.
-* (bug 33367) Gendered namespaces for Czech.
-* (bug 33014) Language::formatSize()/formatBitrate() should be able to deal
-  with larger numbers (tera-yotta).
-
-=== Other changes in 1.19 ===
-* BREAKING CHANGE: Legacy global array 'ta' and global function 'akeytt' have
-  been removed from wikibits.js.
-* jquery.mwPrototypes module was renamed to jquery.mwExtension.
-* The maintenance script populateSha1.php was renamed to the more concise
-  populateImageSha1.php.
-* The Client-IP header is no longer checked for when trying to resolve a client's
-  real IP address.
-* (bug 22096) Although IE5.x and below was already unsupported officially, stylesheets
-  existing exclusively for IE5.0 and IE5.5 have now been removed (which were in skins
-  'chick' and 'monobook').
-* The constructor for CategoryView has changed, the second parameter is now a
-  Context source and is required.
-* The Title::escape{Local,Full,Canonical}URL methods are deprecated, please use
-  proper html building methods to escape the normal get{...}URL methods instead.
-* The $variant arguments in the Title::get{Local,Full,Link,Canonical}URL methods
-  have been replaced with a secondary query argument.
-* The $variant argument in the hooks for the Title::get{Local,Full,Link,Canonical}URL
-  methods have been removed, the variant is now part of the $query argument.
-* Removed Title::isValidCssJsSubpage(), deprecated since 1.17 in favor of
-  using Title::isCssJsSubpage() or checking Title::isWrongCaseCssJsPage().
-* Support for the deprecated hook MagicWordMagicWords was removed.
-* The Xml::namespaceSelector method has been deprecated, please use
-  Html::namespaceSelector instead (note that the parameters have changed also).
-* (bug 33746) Preload popular ResourceLoader modules (mediawiki.util) as stop-gap
-  for scripts missing dependencies.
-  New configuration variable $wgPreloadJavaScriptMwUtil has been introduced for this
-  (set to false by default for new installations). Set to true if your wiki has a large
-  amount of user/site scripts that are lacking dependency information. In the short to
-  medium term these user/site scripts should be fixed by adding the used modules to the
-  dependencies in the module registry and/or wrapping them in a callback to mw.loader.using.
-* MediaWiki now requires MySQL 5.0.2 or later when using a MySQL database.
-
-== Compatibility ==
-
-MediaWiki 1.19 requires PHP 5.2.3. 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
-DB2 and Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.19 has several database changes since 1.18, and will not work without schema
-updates.
-
-As of 1.19 several JavaScript interfaces that were deprecated or superseeded in
-MediaWiki 1.17, MediaWiki 1.16 or even earlier have been removed. They are
-listed at the top of the "Other changes" list as a "BREAKING CHANGE".
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, some major database
-changes are made, and there is a slightly higher chance that things could
-break. Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.18.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 07145ae..709f2ea 100644 (file)
@@ -10,13 +10,21 @@ 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.
 
 === New features in 1.20 ===
 * Added TitleIsAlwaysKnown hook which gets called when determining if a page exists.
+* Added NamespaceIsMovable hook which gets called when determining if pages in a
+  certain namespace can be moved.
 * (bug 32341) Add upload by URL domain limitation.
 * &useskin=default will now always display the default skin. Useful for users with a
   preference for the non-default skin to look at something using the default skin.
@@ -28,16 +36,46 @@ production.
 * Introduce a cryptographic random number generator source api for use when
   generating various tokens.
 * (bug 30963) Option on Special:Prefixindex and Special:Allpages to not show redirects.
-* (bug 18062) new message when edit or create the local page of a shared file.
+* (bug 18062) New message when edit or create the local page of a shared file.
 * (bug 22870) Separate interface message when creating a page.
 * (bug 17615) nosummary option should be reassigned on preview/captcha.
-* (bug 34355) add a variable and parser function for the namespace number.
+* (bug 34355) Add a variable and parser function for the namespace number.
 * (bug 35649) Special:Version now shows hashes of extensions checked out from git.
 * (bug 35728) Git revisions are now linked on Special:Version.
 * "Show Changes" on default messages shows now diff against default message text
 * (bug 23006) create #speciale parser function.
 * generateSitemap can now optionally skip redirect pages.
-* (bug 27757) new API command just for retrieving tokens (not page-based)
+* (bug 27757) New API command just for retrieving tokens (not page-based).
+* Added GitViewers hook for extensions using external git repositories to have a web-based
+  repository viewer linked to from Special:Version.
+* Memcached debug logs can now be sent to their own file logs by setting
+  $wgDebugLogFile['memcached'] to some filepath.
+* (bug 35685) api.php URL and other entry point URLs are now listed on
+  Special:Version
+* Edit notices can now be translated.
+* (bug 35680) jQuery upgraded to 1.7.2.
+* jQuery UI upgraded to 1.8.21.
+* (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.
+* Added device detection for determining device capabilities.
+* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
+  Arguments signature has changed. First arguments is now an options object of which
+  'config' can be a property. Previously 'config' itself was the first and only argument.
+* New getCreator and getOldestRevision methods added to WikiPage class
+* (bug 4220) the XML dump format schema now have unique identity constraints
+  for page and revision identifiers. Patch by Elvis Stansvik.
+* (bug 35705) QUnit upgraded from v1.2.0 to v1.8.0.
+* cleanupSpam.php now can delete spam pages if --delete was specified instead of blanking
+  them.
+* Added new hook ChangePasswordForm to allow adding of additional fields in Special:ChangePassword
+* Added new function getDomain to AuthPlugin for getting a user's domain
+* (bug 23427) New magic word {{PAGEID}} which gives the current page ID.
+  Will be null on previewing a page being created.
+* (bug 37627) UserNotLoggedIn() exception to show a generic error page whenever
+  a user is not logged in.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
@@ -48,7 +86,7 @@ production.
 * (bug 12021) Added user talk link on Special:Listusers.
 * (bug 34445) section edit and TOC hide/show links are excluded from selection and
   copy/paste on supporting browsers.
-* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob 
+* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
   history compression method.
 * (bug 34702) Localised parentheses are now used in more special pages.
 * (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
@@ -56,7 +94,7 @@ production.
 * (bug 34863) Show deletion log extract on non-existent file pages if applicable.
 * (bug 28019) Let ?preloadtitle=foo be passed on to target of
   Special:MyPage and Special:MyTalk.
-* (bug 34929) Show the correct diff when a section edit is rejected by the spam 
+* (bug 34929) Show the correct diff when a section edit is rejected by the spam
   filter.
 * (bug 15816) Add a switch for SETting the search_path (Postgres).
 * (bug 34521) Returning to the previous page after logging in loses any array-
@@ -71,9 +109,6 @@ production.
 * Removed white border around thumbnails in galleries.
 * (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
   an RTL environment.
-* (bug 35680) jQuery upgraded to 1.7.2.
-* (bug 35681) jQuery UI upgraded to 1.8.18.
-* (bug 35705) QUnit upgraded from 1.2.0 to 1.5.0
 * (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
   Subversion when invoked with the --modified option.
 * (bug 35069) On history pages, the " . . " separator after the number of
@@ -81,6 +116,20 @@ production.
 * (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
 * (bug 33564) transwiki import sometimes result in invalid title.
 * (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.
+* (bug 25946) The message on the top of Special:RecentChanges is now displayed
+  in user language instead of content language.
+* (bug 35264) Wrong type used for <ns> in export.xsd
+* (bug 24985) Use $wgTmpDirectory as the default temp directory so that people
+  who don't have access to /tmp can specify an alternative.
+* (bug 27283) SqlBagOStuff breaks PostgreSQL transactions.
+* (bug 35727) mw.Api ajax() should put token parameter last.
+* (bug 37708) mw.Uri.clone() should make a deep copy.
+* (bug 38024) ResourceLoader should not create empty stylesheets for modules
+  that don't have stylesheets.
 
 === API changes in 1.20 ===
 * (bug 34316) Add ability to retrieve maximum upload size from MediaWiki API.
@@ -88,9 +137,17 @@ production.
   the format parameter.
 * (bug 32384) Allow descending order for list=watchlistraw.
 * (bug 31883) Limit of bkusers of list=blocks and titles of action=query is not documented in API help.
-* (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 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
+* (bug 36761) "Mark pages as visited" now submits previously established filter options
+* (bug 32643) action=purge with forcelinkupdate no longer crashes when ratelimit is reached
+* The paraminfo module now also contains result properties for most modules
 
 === Languages updated in 1.20 ===
 
@@ -98,9 +155,13 @@ 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.
 
+* Tornedalen Finnish (fit) added.
+* 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.
 
 === Other changes in 1.20 ===
 * The user_token field is now left empty until a user attempts to login and
@@ -109,10 +170,14 @@ changes to languages because of Bugzilla reports.
 * Removed ./tests/qunit/index.html from core. It wasn't actively maintained and
   has been made obsolete when [[Special:JavaScriptTest/qunit]] was introduced,
   which actually uses ResourceLoader, LocalSettings and the Skin.
+* Removed $wgDBtransactions global. This was only checked in one class
+  and only applies to MyISAM or similar DBs. Those should only be used
+  for archived sites anyway. We can't get edit conflicts on such sites,
+  so the WikiPage code wasn't useful there either.
 
 == 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..1cd5497 100644 (file)
--- a/api.php
+++ b/api.php
@@ -1,9 +1,16 @@
 <?php
-
 /**
- * API for MediaWiki 1.8+
+ * This file is the entry point for all API queries.
+ *
+ * It begins by checking whether the API is enabled on this wiki; if not,
+ * it informs the user that s/he should set $wgEnableAPI to true and exits.
+ * Otherwise, it constructs a new ApiMain using the parameter passed to it
+ * as an argument in the URL ('?action=') and with write-enabled set to the
+ * value of $wgEnableWriteAPI as specified in LocalSettings.php.
+ * It then invokes "execute()" on the ApiMain object instance, which
+ * produces output in the format sepecified in the URL.
  *
- * Copyright (C) 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
  *
  * 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
  * @file
  */
 
-/**
- * This file is the entry point for all API queries. It begins by checking
- * whether the API is enabled on this wiki; if not, it informs the user that
- * s/he should set $wgEnableAPI to true and exits. Otherwise, it constructs
- * a new ApiMain using the parameter passed to it as an argument in the URL
- * ('?action=') and with write-enabled set to the value of $wgEnableWriteAPI
- * as specified in LocalSettings.php. It then invokes "execute()" on the
- * ApiMain object instance, which produces output in the format sepecified
- * in the URL.
- */
-
 // So extensions (and other code) can check whether they're running in API mode
 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 72ee155..bb515c5 100644 (file)
--- a/api.php5
+++ b/api.php5
@@ -1 +1,24 @@
-<?php require 'api.php';
+<?php
+/**
+ * Version of api.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require 'api.php';
index 7bc55ce..76ce9bd 100644 (file)
@@ -1,2 +1,2 @@
 This directory is for the auto-generated phpunit code coverage.
-Run 'make coverage' in the maintenance/tests/phpunit subdirectory to build.
+Run 'make coverage' in the tests/phpunit subdirectory to build.
index e9f151c..4a65431 100644 (file)
@@ -87,9 +87,9 @@ which the user can edit by hand thereafter.  It's just a plain old PHP file,
 and can contain any PHP statements.  It usually sets global variables that are
 used for configuration, and includes files used by any extensions.
 
-Distributors cannot easily add extra statements to the autogenerated
-LocalSettings.php at the present time -- although hacking mw-config/index.php
-would work.  It would be nice if this situation could be improved.
+Distributors can easily add extra statements to the autogenerated
+LocalSettings.php by changing mw-config/overrides.php (see that file for details
+and examples).
 
 There's a new maintenance/install.php script which could be used for performing
 an install through the command line.
@@ -106,6 +106,7 @@ intelligently:
   mail().
 
 == Updates ==
+
 The correct way for updating a wiki is to update the files and then run from 
 command line the maintenance/update.php script (with appropriate parameters if
 files were moved). It will perform all the needed steps to update the database 
index 0b3eb17..9ff48f0 100644 (file)
@@ -2,57 +2,57 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.1.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.1/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.1/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.1/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.1/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.1/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision data -->
                        <element name="revision" type="mw:RevisionType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="string"/>
                </sequence>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
        </complexType>
index 8acbf54..55b05f8 100644 (file)
@@ -2,54 +2,54 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        Version 0.2 adds optional basic file upload info support,
        which is used by our OAI export/import submodule.
-       
+
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.2.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.2/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.2/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.2/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.2/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.2/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision or upload data -->
                        <choice minOccurs="0" maxOccurs="unbounded">
                                <element name="revision" type="mw:RevisionType" />
@@ -57,7 +57,7 @@
                        </choice>
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="string"/>
                </sequence>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
        </complexType>
-       
+
        <complexType name="UploadType">
                <sequence>
                        <!-- Revision-style data... -->
                        <element name="timestamp" type="dateTime"/>
                        <element name="contributor" type="mw:ContributorType"/>
                        <element name="comment" type="string" minOccurs="0"/>
-                       
+
                        <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
                        <element name="filename" type="string"/>
-                       
+
                        <!-- URI at which this resource can be obtained -->
                        <element name="src" type="anyURI"/>
-                       
+
                        <element name="size" type="positiveInteger" />
-                       
+
                        <!-- TODO: add other metadata fields -->
                </sequence>
        </complexType>
-       
+
 </schema>
index 1e0b7c8..ea2b816 100644 (file)
@@ -2,48 +2,48 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        Version 0.2 adds optional basic file upload info support,
        which is used by our OAI export/import submodule.
-       
+
        Version 0.3 adds some site configuration information such
        as a list of defined namespaces.
-       
+
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.3.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.3/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.3/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.3/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.3/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.3/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="siteinfo" type="mw:SiteInfoType"
-                               minOccurs="0" maxOccurs="1"/>
+                                        minOccurs="0" maxOccurs="1"/>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="SiteInfoType">
                <sequence>
                        <element name="sitename" type="string" minOccurs="0" />
                        <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
                </sequence>
        </complexType>
-       
+
        <simpleType name="CaseType">
                <restriction base="NMTOKEN">
                        <!-- Cannot have two titles differing only by case of first letter. -->
                        <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
                        <enumeration value="first-letter" />
-                       
+
                        <!-- Complete title is case-sensitive -->
                        <!-- Behavior when $wgCapitalLinks = false -->
                        <enumeration value="case-sensitive" />
-                       
+
                        <!-- Cannot have two titles differing only by case. -->
                        <!-- Not yet implemented as of MediaWiki 1.5 -->
                        <enumeration value="case-insensitive" />
                </restriction>
        </simpleType>
-       
+
        <complexType name="NamespacesType">
                <sequence>
                        <element name="namespace" type="mw:NamespaceType"
-                               minOccurs="0" maxOccurs="unbounded" />
+                                        minOccurs="0" maxOccurs="unbounded" />
                </sequence>
        </complexType>
-       
+
        <complexType name="NamespaceType">
                <simpleContent>
                        <extension base="string">
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision or upload data -->
                        <choice minOccurs="0" maxOccurs="unbounded">
                                <element name="revision" type="mw:RevisionType" />
                        </choice>
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="mw:TextType" />
                </sequence>
        </complexType>
-       
+
        <complexType name="TextType">
                <simpleContent>
                        <extension base="string">
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
        </complexType>
-       
+
        <complexType name="UploadType">
                <sequence>
                        <!-- Revision-style data... -->
                        <element name="timestamp" type="dateTime"/>
                        <element name="contributor" type="mw:ContributorType"/>
                        <element name="comment" type="string" minOccurs="0"/>
-                       
+
                        <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
                        <element name="filename" type="string"/>
-                       
+
                        <!-- URI at which this resource can be obtained -->
                        <element name="src" type="anyURI"/>
-                       
+
                        <element name="size" type="positiveInteger" />
-                       
+
                        <!-- TODO: add other metadata fields -->
                </sequence>
        </complexType>
-       
+
 </schema>
index 3e7f2ea..b3ea3bf 100644 (file)
@@ -2,52 +2,52 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        Version 0.2 adds optional basic file upload info support,
        which is used by our OAI export/import submodule.
-       
+
        Version 0.3 adds some site configuration information such
        as a list of defined namespaces.
-       
+
        Version 0.4 adds per-revision delete flags, log exports,
        discussion threading data, a per-page redirect flag, and
        per-namespace capitalization.
 
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.4.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.4/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.4/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.4/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.4/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.4/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="siteinfo" type="mw:SiteInfoType"
-                               minOccurs="0" maxOccurs="1"/>
+                                        minOccurs="0" maxOccurs="1"/>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="SiteInfoType">
                <sequence>
                        <element name="sitename" type="string" minOccurs="0" />
                        <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
                </sequence>
        </complexType>
-       
+
        <simpleType name="CaseType">
                <restriction base="NMTOKEN">
                        <!-- Cannot have two titles differing only by case of first letter. -->
                        <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
                        <enumeration value="first-letter" />
-                       
+
                        <!-- Complete title is case-sensitive -->
                        <!-- Behavior when $wgCapitalLinks = false -->
                        <enumeration value="case-sensitive" />
-                       
+
                        <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
                        <!-- Not yet implemented as of MediaWiki 1.18 -->
                        <enumeration value="case-insensitive" />
                </restriction>
        </simpleType>
-       
+
        <simpleType name="DeletedFlagType">
                <restriction base="NMTOKEN">
                        <enumeration value="deleted"/>
        <complexType name="NamespacesType">
                <sequence>
                        <element name="namespace" type="mw:NamespaceType"
-                               minOccurs="0" maxOccurs="unbounded" />
+                                        minOccurs="0" maxOccurs="unbounded" />
                </sequence>
        </complexType>
-       
+
        <complexType name="NamespaceType">
                <simpleContent>
                        <extension base="string">
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- flag if the current revision is a redirect -->
-                       <element name="redirect" minOccurs="0"/>        
+                       <element name="redirect" minOccurs="0"/>
 
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision or upload data -->
                        <choice minOccurs="0" maxOccurs="unbounded">
                                <element name="revision" type="mw:RevisionType" />
                                <element name="upload" type="mw:UploadType" />
                                <element name="logitem" type="mw:LogItemType" />
                        </choice>
-                       
+
                        <!-- Zero or One sets of discussion threading data -->
                        <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="mw:TextType" />
                </sequence>
        </complexType>
-       
+
        <complexType name="CommentType">
                <simpleContent>
                        <extension base="string">
                        <extension base="string">
                                <attribute ref="xml:space" use="optional" default="preserve" />
                                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
-                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>    
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
                                <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
                                <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
                                <!-- usage ([0-9]+) and with the "ID" type. -->
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
                <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
        </complexType>
-       
+
        <complexType name="UploadType">
                <sequence>
                        <!-- Revision-style data... -->
                        <element name="timestamp" type="dateTime"/>
                        <element name="contributor" type="mw:ContributorType"/>
                        <element name="comment" type="string" minOccurs="0"/>
-                       
+
                        <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
                        <element name="filename" type="string"/>
-                       
+
                        <!-- URI at which this resource can be obtained -->
                        <element name="src" type="anyURI"/>
-                       
+
                        <element name="size" type="positiveInteger" />
-                       
+
                        <!-- TODO: add other metadata fields -->
                </sequence>
        </complexType>
-       
+
        <!-- Discussion threading data for LiquidThreads -->
        <complexType name="DiscussionThreadingInfo">
                <sequence>
                        <element name="ThreadType" type="string" />
                </sequence>
        </complexType>
-       
+
 </schema>
index 469446d..ed6c002 100644 (file)
@@ -2,54 +2,54 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        Version 0.2 adds optional basic file upload info support,
        which is used by our OAI export/import submodule.
-       
+
        Version 0.3 adds some site configuration information such
        as a list of defined namespaces.
-       
+
        Version 0.4 adds per-revision delete flags, log exports,
        discussion threading data, a per-page redirect flag, and
        per-namespace capitalization.
-       
+
        Version 0.5 adds byte count per revision.
 
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.5.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.5/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.5/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.5/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.5/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.5/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="siteinfo" type="mw:SiteInfoType"
-                               minOccurs="0" maxOccurs="1"/>
+                                        minOccurs="0" maxOccurs="1"/>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="SiteInfoType">
                <sequence>
                        <element name="sitename" type="string" minOccurs="0" />
                        <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
                </sequence>
        </complexType>
-       
+
        <simpleType name="CaseType">
                <restriction base="NMTOKEN">
                        <!-- Cannot have two titles differing only by case of first letter. -->
                        <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
                        <enumeration value="first-letter" />
-                       
+
                        <!-- Complete title is case-sensitive -->
                        <!-- Behavior when $wgCapitalLinks = false -->
                        <enumeration value="case-sensitive" />
-                       
+
                        <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
                        <!-- Not yet implemented as of MediaWiki 1.18 -->
                        <enumeration value="case-insensitive" />
                </restriction>
        </simpleType>
-       
+
        <simpleType name="DeletedFlagType">
                <restriction base="NMTOKEN">
                        <enumeration value="deleted"/>
        <complexType name="NamespacesType">
                <sequence>
                        <element name="namespace" type="mw:NamespaceType"
-                               minOccurs="0" maxOccurs="unbounded" />
+                                        minOccurs="0" maxOccurs="unbounded" />
                </sequence>
        </complexType>
-       
+
        <complexType name="NamespaceType">
                <simpleContent>
                        <extension base="string">
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- flag if the current revision is a redirect -->
-                       <element name="redirect" minOccurs="0"/>        
+                       <element name="redirect" minOccurs="0"/>
 
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision or upload data -->
                        <choice minOccurs="0" maxOccurs="unbounded">
                                <element name="revision" type="mw:RevisionType" />
                                <element name="upload" type="mw:UploadType" />
                                <element name="logitem" type="mw:LogItemType" />
                        </choice>
-                       
+
                        <!-- Zero or One sets of discussion threading data -->
                        <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="mw:TextType" />
                </sequence>
        </complexType>
-       
+
        <complexType name="CommentType">
                <simpleContent>
                        <extension base="string">
                        <extension base="string">
                                <attribute ref="xml:space" use="optional" default="preserve" />
                                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
-                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>    
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
                                <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
                                <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
                                <!-- usage ([0-9]+) and with the "ID" type. -->
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
                <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
        </complexType>
-       
+
        <complexType name="UploadType">
                <sequence>
                        <!-- Revision-style data... -->
                        <element name="timestamp" type="dateTime"/>
                        <element name="contributor" type="mw:ContributorType"/>
                        <element name="comment" type="string" minOccurs="0"/>
-                       
+
                        <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
                        <element name="filename" type="string"/>
-                       
+
                        <!-- URI at which this resource can be obtained -->
                        <element name="src" type="anyURI"/>
-                       
+
                        <element name="size" type="positiveInteger" />
-                       
+
                        <!-- TODO: add other metadata fields -->
                </sequence>
        </complexType>
-       
+
        <!-- Discussion threading data for LiquidThreads -->
        <complexType name="DiscussionThreadingInfo">
                <sequence>
                        <element name="ThreadType" type="string" />
                </sequence>
        </complexType>
-       
+
 </schema>
index 55428b5..4668794 100644 (file)
@@ -2,57 +2,57 @@
 <!--
        This is an XML Schema description of the format
        output by MediaWiki's Special:Export system.
-       
+
        Version 0.2 adds optional basic file upload info support,
        which is used by our OAI export/import submodule.
-       
+
        Version 0.3 adds some site configuration information such
        as a list of defined namespaces.
-       
+
        Version 0.4 adds per-revision delete flags, log exports,
        discussion threading data, a per-page redirect flag, and
        per-namespace capitalization.
 
        Version 0.5 adds byte count per revision.
-       
+
        Version 0.6 adds a separate namespace tag, and resolves the
-       redirect target and adds a separate sha1 tag for each revision. 
-       
+       redirect target and adds a separate sha1 tag for each revision.
+
        The canonical URL to the schema document is:
        http://www.mediawiki.org/xml/export-0.6.xsd
-       
+
        Use the namespace:
        http://www.mediawiki.org/xml/export-0.6/
 -->
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
-        xmlns:mw="http://www.mediawiki.org/xml/export-0.6/"
-        targetNamespace="http://www.mediawiki.org/xml/export-0.6/"
-        elementFormDefault="qualified">
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.6/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.6/"
+               elementFormDefault="qualified">
 
        <annotation>
                <documentation xml:lang="en">
                        MediaWiki's page export format
                </documentation>
        </annotation>
-       
+
        <!-- Need this to reference xml:lang -->
        <import namespace="http://www.w3.org/XML/1998/namespace"
-               schemaLocation="http://www.w3.org/2001/xml.xsd"/>
-       
+                       schemaLocation="http://www.w3.org/2001/xml.xsd"/>
+
        <!-- Our root element -->
        <element name="mediawiki" type="mw:MediaWikiType"/>
-       
+
        <complexType name="MediaWikiType">
                <sequence>
                        <element name="siteinfo" type="mw:SiteInfoType"
-                               minOccurs="0" maxOccurs="1"/>
+                                        minOccurs="0" maxOccurs="1"/>
                        <element name="page" type="mw:PageType"
-                               minOccurs="0" maxOccurs="unbounded"/>
+                                        minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
                <attribute name="version" type="string" use="required"/>
                <attribute ref="xml:lang" use="required"/>
        </complexType>
-       
+
        <complexType name="SiteInfoType">
                <sequence>
                        <element name="sitename" type="string" minOccurs="0" />
                        <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
                </sequence>
        </complexType>
-       
+
        <simpleType name="CaseType">
                <restriction base="NMTOKEN">
                        <!-- Cannot have two titles differing only by case of first letter. -->
                        <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
                        <enumeration value="first-letter" />
-                       
+
                        <!-- Complete title is case-sensitive -->
                        <!-- Behavior when $wgCapitalLinks = false -->
                        <enumeration value="case-sensitive" />
-                       
+
                        <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
                        <!-- Not yet implemented as of MediaWiki 1.18 -->
                        <enumeration value="case-insensitive" />
                </restriction>
        </simpleType>
-       
+
        <simpleType name="DeletedFlagType">
                <restriction base="NMTOKEN">
                        <enumeration value="deleted"/>
        <complexType name="NamespacesType">
                <sequence>
                        <element name="namespace" type="mw:NamespaceType"
-                               minOccurs="0" maxOccurs="unbounded" />
+                                        minOccurs="0" maxOccurs="unbounded" />
                </sequence>
        </complexType>
-       
+
        <complexType name="NamespaceType">
                <simpleContent>
                        <extension base="string">
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="PageType">
                <sequence>
                        <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
                        <element name="title" type="string"/>
-                       
+
                        <!-- Namespace in canonical form -->
                        <element name="ns" type="positiveInteger"/>
-                       
+
                        <!-- optional page ID number -->
                        <element name="id" type="positiveInteger" minOccurs="0"/>
-                       
+
                        <!-- flag if the current revision is a redirect -->
-                       <element name="redirect" type="string" minOccurs="0"/>  
+                       <element name="redirect" type="string" minOccurs="0"/>
 
                        <!-- comma-separated list of string tokens, if present -->
                        <element name="restrictions" type="string" minOccurs="0"/>
-                       
+
                        <!-- Zero or more sets of revision or upload data -->
                        <choice minOccurs="0" maxOccurs="unbounded">
                                <element name="revision" type="mw:RevisionType" />
                                <element name="upload" type="mw:UploadType" />
                                <element name="logitem" type="mw:LogItemType" />
                        </choice>
-                       
+
                        <!-- Zero or One sets of discussion threading data -->
                        <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
                </sequence>
        </complexType>
-       
+
        <complexType name="RevisionType">
                <sequence>
                        <element name="id" type="positiveInteger" minOccurs="0"/>
                        <element name="text" type="mw:TextType" />
                </sequence>
        </complexType>
-       
+
        <complexType name="CommentType">
                <simpleContent>
                        <extension base="string">
                        <extension base="string">
                                <attribute ref="xml:space" use="optional" default="preserve" />
                                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
-                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>    
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
                                <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
                                <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
                                <!-- usage ([0-9]+) and with the "ID" type. -->
                        </extension>
                </simpleContent>
        </complexType>
-       
+
        <complexType name="ContributorType">
                <sequence>
                        <element name="username" type="string" minOccurs="0"/>
                        <element name="id" type="positiveInteger" minOccurs="0" />
-                       
+
                        <element name="ip" type="string" minOccurs="0"/>
                </sequence>
                <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
                <attribute name="deleted" use="optional" type="mw:DeletedFlagType"/>
        </complexType>
-       
+
        <complexType name="UploadType">
                <sequence>
                        <!-- Revision-style data... -->
                        <element name="timestamp" type="dateTime"/>
                        <element name="contributor" type="mw:ContributorType"/>
                        <element name="comment" type="string" minOccurs="0"/>
-                       
+
                        <!-- Filename. (Using underscores, not spaces. No 'Image:' namespace marker.) -->
                        <element name="filename" type="string"/>
-                       
+
                        <!-- URI at which this resource can be obtained -->
                        <element name="src" type="anyURI"/>
-                       
+
                        <element name="size" type="positiveInteger" />
-                       
+
                        <!-- TODO: add other metadata fields -->
                </sequence>
        </complexType>
-       
+
        <!-- Discussion threading data for LiquidThreads -->
        <complexType name="DiscussionThreadingInfo">
                <sequence>
                        <element name="ThreadType" type="string" />
                </sequence>
        </complexType>
-       
+
 </schema>
diff --git a/docs/export-0.7.xsd b/docs/export-0.7.xsd
new file mode 100644 (file)
index 0000000..4803746
--- /dev/null
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+       This is an XML Schema description of the format
+       output by MediaWiki's Special:Export system.
+
+       Version 0.2 adds optional basic file upload info support,
+       which is used by our OAI export/import submodule.
+
+       Version 0.3 adds some site configuration information such
+       as a list of defined namespaces.
+
+       Version 0.4 adds per-revision delete flags, log exports,
+       discussion threading data, a per-page redirect flag, and
+       per-namespace capitalization.
+
+       Version 0.5 adds byte count per revision.
+
+       Version 0.6 adds a separate namespace tag, and resolves the
+       redirect target and adds a separate sha1 tag for each revision.
+
+       Version 0.7 adds a unique identity constraint for both page and
+       revision identifiers. See also bug 4220.
+       Fix type for <ns> from "positiveInteger" to "nonNegativeInteger" to allow 0
+       Moves <logitem> to its right location.
+       Add parentid to revision.
+       Fix type for <id> within <contributor> to "nonNegativeInteger"
+
+       The canonical URL to the schema document is:
+       http://www.mediawiki.org/xml/export-0.7.xsd
+
+       Use the namespace:
+       http://www.mediawiki.org/xml/export-0.7/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.7/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.7/"
+               elementFormDefault="qualified">
+
+       <annotation>
+               <documentation xml:lang="en">
+                       MediaWiki's page export format
+               </documentation>
+       </annotation>
+
+       <!-- Need this to reference xml:lang -->
+       <import namespace="http://www.w3.org/XML/1998/namespace"
+                       schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+       <!-- Our root element -->
+       <element name="mediawiki" type="mw:MediaWikiType">
+               <!-- Page ID contraint, see bug 4220 -->
+               <unique name="PageIDConstraint">
+                       <selector xpath="mw:page" />
+                       <field xpath="mw:id" />
+               </unique>
+               <!-- Revision ID contraint, see bug 4220 -->
+               <unique name="RevIDConstraint">
+                       <selector xpath="mw:page/mw:revision" />
+                       <field xpath="mw:id" />
+               </unique>
+       </element>
+
+       <complexType name="MediaWikiType">
+               <sequence>
+                       <element name="siteinfo" type="mw:SiteInfoType"
+                                        minOccurs="0" maxOccurs="1" />
+                       <element name="page" type="mw:PageType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+                       <element name="logitem" type="mw:LogItemType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+               <attribute name="version" type="string" use="required" />
+               <attribute ref="xml:lang" use="required" />
+       </complexType>
+
+       <complexType name="SiteInfoType">
+               <sequence>
+                       <element name="sitename" type="string" minOccurs="0" />
+                       <element name="base" type="anyURI" minOccurs="0" />
+                       <element name="generator" type="string" minOccurs="0" />
+                       <element name="case" type="mw:CaseType" minOccurs="0" />
+                       <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+               </sequence>
+       </complexType>
+
+       <simpleType name="CaseType">
+               <restriction base="NMTOKEN">
+                       <!-- Cannot have two titles differing only by case of first letter. -->
+                       <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+                       <enumeration value="first-letter" />
+
+                       <!-- Complete title is case-sensitive -->
+                       <!-- Behavior when $wgCapitalLinks = false -->
+                       <enumeration value="case-sensitive" />
+
+                       <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+                       <!-- Not yet implemented as of MediaWiki 1.18 -->
+                       <enumeration value="case-insensitive" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="DeletedFlagType">
+               <restriction base="NMTOKEN">
+                       <enumeration value="deleted" />
+               </restriction>
+       </simpleType>
+
+       <complexType name="NamespacesType">
+               <sequence>
+                       <element name="namespace" type="mw:NamespaceType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+       </complexType>
+
+       <complexType name="NamespaceType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="key" type="integer" />
+                               <attribute name="case" type="mw:CaseType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="RedirectType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="title" type="string" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="PageType">
+               <sequence>
+                       <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+                       <element name="title" type="string" />
+
+                       <!-- Namespace in canonical form -->
+                       <element name="ns" type="nonNegativeInteger" />
+
+                       <!-- optional page ID number -->
+                       <element name="id" type="positiveInteger" />
+
+                       <!-- flag if the current revision is a redirect -->
+                       <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+                       <!-- comma-separated list of string tokens, if present -->
+                       <element name="restrictions" type="string" minOccurs="0" />
+
+                       <!-- Zero or more sets of revision or upload data -->
+                       <choice minOccurs="0" maxOccurs="unbounded">
+                               <element name="revision" type="mw:RevisionType" />
+                               <element name="upload" type="mw:UploadType" />
+                       </choice>
+
+                       <!-- Zero or One sets of discussion threading data -->
+                       <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+               </sequence>
+       </complexType>
+
+       <complexType name="RevisionType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="parentid" type="positiveInteger" minOccurs="0" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="minor" minOccurs="0" maxOccurs="1" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+                       <element name="sha1" type="string" />
+                       <element name="text" type="mw:TextType" />
+               </sequence>
+       </complexType>
+
+       <complexType name="LogItemType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" />
+                       <element name="type" type="string" />
+                       <element name="action" type="string" />
+                       <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+                       <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+                       <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+               </sequence>
+       </complexType>
+
+       <complexType name="CommentType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="TextType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                               <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+                               <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+                               <!-- usage ([0-9]+) and with the "ID" type. -->
+                               <attribute name="id" type="NMTOKEN" />
+                               <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogTextType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogParamsType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="ContributorType">
+               <sequence>
+                       <element name="username" type="string" minOccurs="0" />
+                       <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+                       <element name="ip" type="string" minOccurs="0" />
+               </sequence>
+               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+       </complexType>
+
+       <complexType name="UploadType">
+               <sequence>
+                       <!-- Revision-style data... -->
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="string" minOccurs="0" />
+
+                       <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+                       <element name="filename" type="string" />
+
+                       <!-- URI at which this resource can be obtained -->
+                       <element name="src" type="anyURI" />
+
+                       <element name="size" type="positiveInteger" />
+
+                       <!-- TODO: add other metadata fields -->
+               </sequence>
+       </complexType>
+
+       <!-- Discussion threading data for LiquidThreads -->
+       <complexType name="DiscussionThreadingInfo">
+               <sequence>
+                       <element name="ThreadSubject" type="string" />
+                       <element name="ThreadParent" type="positiveInteger" />
+                       <element name="ThreadAncestor" type="positiveInteger" />
+                       <element name="ThreadPage" type="string" />
+                       <element name="ThreadID" type="positiveInteger" />
+                       <element name="ThreadAuthor" type="string" />
+                       <element name="ThreadEditStatus" type="string" />
+                       <element name="ThreadType" type="string" />
+               </sequence>
+       </complexType>
+
+</schema>
index 77b26a4..d198b93 100644 (file)
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.4/ http://www.mediawiki.org/xml/export-0.4.xsd" version="0.4" xml:lang="en">
-
-<!-- Optional global configuration info -->
-<siteinfo>
-  <!-- Site name, as set in $wgSitename -->
-  <sitename>DemoWiki</sitename>
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
   
-  <!-- Forgot where you got this set? -->
-  <base>http://example.com/wiki/Main_Page</base>
-  
-  <!-- Source software version -->
-  <generator>MediaWiki 1.5.0</generator>
-  
-  <!-- Title case sensitivity options of the wiki this data came from -->
-  <!-- May be 'first-letter', 'case-sensitive', or 'case-insensitive' -->
-  <case>first-letter</case>
-  
-  <!-- Defined namespace keys on the source wiki. -->
-  <!-- Titles can be substring-split to obtain the symbolic numeric key -->
-  <namespaces>
-    <namespace key="-2">Media</namespace>
-    <namespace key="-1">Special</namespace>
-    <namespace key="0"></namespace>
-    <namespace key="1">Talk</namespace>
-    <namespace key="2">User</namespace>
-    <namespace key="3">User talk</namespace>
-    <namespace key="4">DemoWiki</namespace>
-    <namespace key="5">DemoWIki talk</namespace>
-    <namespace key="6">Image</namespace>
-    <namespace key="7">Image talk</namespace>
-    <namespace key="8">MediaWiki</namespace>
-    <namespace key="9">MediaWiki talk</namespace>
-    <namespace key="10">Template</namespace>
-    <namespace key="11">Template talk</namespace>
-    <namespace key="12">Help</namespace>
-    <namespace key="13">Help talk</namespace>
-    <namespace key="14">Category</namespace>
-    <namespace key="15">Category talk</namespace>
-  </namespaces>
-</siteinfo>
-
-<!-- The rest of the data will be a series of page records -->
-<page>
-  <!-- Titles are listed here in text form, with namespace prefix   -->
-  <!-- if any, and spaces rather than the underscores used in URLs. -->
-  <title>Page title</title>
+  <!-- Optional global configuration info -->
+  <siteinfo>
+    <!-- Site name, as set in $wgSitename -->
+    <sitename>DemoWiki</sitename>
+    
+    <!-- Forgot where you got this set? -->
+    <base>http://example.com/wiki/Main_Page</base>
+    
+    <!-- Source software version -->
+    <generator>MediaWiki 1.20</generator>
+    
+    <!-- Title case sensitivity options of the wiki this data came from -->
+    <!-- May be 'first-letter', 'case-sensitive', or 'case-insensitive' -->
+    <case>first-letter</case>
+    
+    <!-- Defined namespace keys on the source wiki. -->
+    <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">DemoWiki</namespace>
+      <namespace key="5" case="first-letter">DemoWIki 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>
   
-  <!-- The page's immutable page_id number in the source database.  -->
-  <!-- Page ID numbers are kept across page moves, but may change   -->
-  <!-- if a page is deleted and recreated.                          -->
-  <id>1</id>
-
-  <!-- Tag wether this article is a redirect -->
-  <!-- This corresponds to the page_is_redirect in the page table -->
-  <redirect />
+  <!-- The rest of the data will be a series of page records -->
+  <page>
+    <!-- Titles are listed here in text form, with namespace prefix   -->
+    <!-- if any, and spaces rather than the underscores used in URLs. -->
+    <title>Page title</title>
+    
+    <!-- Namespace in canonical form -->
+    <ns>0</ns>
+    
+    <!-- The page's immutable page_id number in the source database.  -->
+    <!-- Page ID numbers are kept across page moves, but may change   -->
+    <!-- if a page is deleted and recreated.                          -->
+    <id>1</id>
+    
+    <!-- Tag wether this article is a redirect and its target -->
+    <!-- This corresponds to the page_is_redirect in the page table -->
+    <redirect title="Target" />
+    
+    <!-- If restricted, the ACL is listed here raw. -->
+    <restrictions>edit=sysop:move=sysop</restrictions>
+    
+    <!-- With a series of revision records... -->
+    
+    <!-- Remember this is XML; if you must use a regex-based extractor -->
+    <!-- in place of a standard XML parser, be very careful.           -->
+    <!-- * Don't forget to decode character entities!                  -->
+    <!-- * If using a 'loose' XML parser, ensure that whitespace is    -->
+    <!--    preserved in the <text> elements.                          -->
+    <revision>
+      <!-- Unique revision ID number (rev_id) in the source database.  -->
+      <!-- This number uniquely identifies the revision on that wiki.  -->
+      <id>100</id>
+      <!-- revision id of the parent revision -->
+      <parentid>99</parentid>
+      <timestamp>2001-01-15T13:15:00Z</timestamp>
+      <contributor>
+        <username>Foobar</username>
+        <id>42</id>
+      </contributor>
+      <minor />
+      <comment>I have just one thing to say!</comment>
+      <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
+      <text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
+    </revision>
+    
+    <revision>
+      <id>99</id>
+      <timestamp>2001-01-15T13:10:27Z</timestamp>
+      <contributor>
+        <ip>10.0.0.2</ip>
+      </contributor>
+      <comment>new!</comment>
+      <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
+      <text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
+    </revision>
+  </page>
   
-  <!-- If restricted, the ACL is listed here raw. -->
-  <restrictions>edit=sysop:move=sysop</restrictions>
+  <page>
+    <title>Talk:Page title</title>
+    <ns>1</ns>
+    <id>2</id>
+    <revision>
+      <id>101</id>
+      <timestamp>2001-01-15T14:03:00Z</timestamp>
+      <contributor><ip>10.0.0.2</ip></contributor>
+      <comment>hey</comment>
+      <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
+      <text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
+    </revision>
+  </page>
   
-  <!-- With a series of revision records... -->
+  <page>
+    <title>File:Some image.jpg</title>
+    <ns>6</ns>
+    <id>3</id>
+    <revision>
+      <id>102</id>
+      <timestamp>2001-01-15T20:34:12Z</timestamp>
+      <contributor><username>Foobar</username><id>42</id></contributor>
+      <comment>My awesomeest image!</comment>
+      <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
+      <text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
+    </revision>
+    <upload>
+      <timestamp>2001-01-15T20:34:12Z</timestamp>
+      <contributor><username>Foobar</username><id>42</id></contributor>
+      <comment>My awesomeest image!</comment>
+      <filename>Some_image.jpg</filename>
+      <src>http://upload.wikimedia.org/commons/2/22/Some_image.jpg</src>
+      <size>12345</size>
+    </upload>
+  </page>
   
-  <!-- Remember this is XML; if you must use a regex-based extractor -->
-  <!-- in place of a standard XML parser, be very careful.           -->
-  <!-- * Don't forget to decode character entities!                  -->
-  <!-- * If using a 'loose' XML parser, ensure that whitespace is    -->
-  <!--    preserved in the <text> elements.                          -->
-  <revision>
-    <!-- Unique revision ID number (rev_id) in the source database.  -->
-    <!-- This number uniquely identifies the revision on that wiki.  -->
-    <id>100</id>
-    
-    <timestamp>2001-01-15T13:15:00Z</timestamp>
-    <contributor><username>Foobar</username><id>42</id></contributor>
-    <minor />
-    <comment>I have just one thing to say!</comment>
-    <text xml:space="preserve">A bunch of [[text]] here.</text>
-  </revision>
+  <!-- or a series of logitem records, but normaly page and logitem never exist both in one file -->
+  <logitem>
+    <id>15</id>
+    <timestamp>2008-10-23T03:20:32Z</timestamp>
+    <contributor>
+      <username>Wikimedian</username>
+      <id>12345</id>
+    </contributor>
+    <comment>content was: 'I think this was a silly edit'</comment>
+    <type>delete</type>
+    <action>delete</action>
+    <logtitle>Silly page name</logtitle>
+    <params xml:space="preserve" />
+  </logitem>
   
-  <revision>
-    <timestamp>2001-01-15T13:10:27Z</timestamp>
-    <contributor><ip>10.0.0.2</ip></contributor>
-    <comment>new!</comment>
-    <text xml:space="preserve">An earlier [[revision]].</text>
-  </revision>
-</page>
-
-<page>
-  <title>Talk:Page title</title>
-  <id>2</id>
-  <revision>
-    <id>101</id>
-    <timestamp>2001-01-15T14:03:00Z</timestamp>
-    <contributor><ip>10.0.0.2</ip></contributor>
-    <comment>hey</comment>
-    <text xml:space="preserve">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
-  </revision>
-</page>
-
-<page>
-  <title>Image:Some image.jpg</title>
-  <id>3</id>
-  <revision>
-    <id>102</id>
-    <timestamp>2001-01-15T20:34:12Z</timestamp>
-    <contributor><username>Foobar</username><id>42</id></contributor>
-    <comment>My awesomeest image!</comment>
-    <text xml:space="preserve">This is an awesome little imgae. I lurves it. {{PD}}</text>
-  </revision>
-  <upload>
-    <timestamp>2001-01-15T20:34:12Z</timestamp>
-    <contributor><username>Foobar</username><id>42</id></contributor>
-    <comment>My awesomeest image!</comment>
-    <filename>Some_image.jpg</filename>
-    <src>http://upload.wikimedia.org/commons/2/22/Some_image.jpg</src>
-    <size>12345</size>
-  </upload>
-</page>
-
-<logitem>
-  <id>15</id>
-  <timestamp>2008-10-23T03:20:32Z</timestamp>
-  <contributor>
-  <username>Wikimedian</username>
-  <id>12345</id>
-  </contributor>
-  <comment>content was: 'I think this was a silly edit'</comment>
-  <type>delete</type>
-  <action>delete</action>
-  <logtitle>Silly page name</logtitle>
-  <params xml:space="preserve" />
-</logitem>
-
-
 </mediawiki>
index b02c305..147e524 100644 (file)
@@ -331,6 +331,11 @@ descriptions.
 &$module: ApiBase Module object
 &$desc: Array of parameter descriptions
 
+'APIGetResultProperties': use this hook to mofify the properties
+in a module's result.
+&$module: ApiBase Module object
+&$properties: Array of properties
+
 'APIQueryAfterExecute': after calling the execute() method of an
 action=query submodule. Use this to extend core API modules.
 &$module: Module object
@@ -395,6 +400,11 @@ In this data array, the key-value-pair identified by the apiLink key is
 required.
 &$apis: array of services
 
+'ApiTokensGetTokenTypes': use this hook to extend action=tokens with new
+token types.
+&$tokenTypes: supported token types in format 'type' => callback function
+used to retrieve this type of tokens.
+
 'ArticleAfterFetchContent': after fetching content of an article from
 the database
 $article: the article (object) being loaded from the database
@@ -667,6 +677,10 @@ $output: OutputPage object in use
 'CategoryPageView': before viewing a categorypage in CategoryPage::view
 $catpage: CategoryPage instance
 
+'ChangePasswordForm': For extensions that need to add a field to the ChangePassword form
+via the Preferences form
+&$extraFields: An array of arrays that hold fields like would be passed to the pretty function.
+
 'ChangesListInsertArticleLink': Override or augment link to article in RC list.
 &$changesList: ChangesList instance.
 &$articlelink: HTML of link to article (already filled-in).
@@ -899,6 +913,12 @@ $article: in case all revisions of the file are deleted a reference to the
 $user: user who performed the deletion
 $reason: reason
 
+'FileTransformed': When a file is transformed and moved into storage
+$file: reference to the File object
+$thumb: the MediaTransformOutput object
+$tmpThumbPath: The temporary file system path of the transformed file
+$thumbPath: The permanent storage path of the transformed file
+
 'FileUpload': When a file upload occurs
 $file : Image object representing the file that was uploaded
 $reupload : Boolean indicating if there was a previously another image there or not (since 1.17)
@@ -910,6 +930,14 @@ $fileVersions: array of undeleted versions. Empty if all versions were restored
 $user: user who performed the undeletion
 $reason: reason
 
+'FormatAutocomments': When an autocomment is formatted by the Linker
+ &$comment: Reference to the accumulated comment. Initially null, when set the default code will be skipped.
+ $pre: Initial part of the parsed comment before the call to the hook.
+ $auto: The extracted part of the parsed comment before the call to the hook.
+ $post: The final part of the parsed comment before the call to the hook.
+ $title: An optional title object used to links to sections. Can be null.
+ $local: Boolean indicating whether section links should refer to local page.
+
 'GetAutoPromoteGroups': When determining which autopromote groups a user
 is entitled to be in.
 &$user: user to promote.
@@ -997,6 +1025,11 @@ $result: User permissions error to add. If none, return true.
 'getUserPermissionsErrorsExpensive': Absolutely the same, but is called only
        if expensive checks are enabled.
 
+'GitViewers': called when generating the list of git viewers for Special:Version, use
+       this to change the list.
+&$extTypes: associative array of repo URLS to viewer URLs.
+
+
 'ImageBeforeProduceHTML': Called before producing the HTML created by a wiki
        image insertion.  You can skip the default logic entirely by returning
        false, or just modify a few things using call-by-reference.
@@ -1335,6 +1368,11 @@ using this hook.
        BaseTemplate::makeListItem for details on the format of individual
        items inside of this array
 
+'NamespaceIsMovable': Called when determining if it is possible to pages in a namespace.
+$index: Integer; the index of the namespace being checked.
+$result: Boolean; whether MediaWiki currently thinks that pages in this namespace are movable.
+Hooks may change this value to override the return value of MWNamespace::isMovable()
+
 'NewRevisionFromEditComplete': called when a revision was inserted
 due to an edit
 $article: the WikiPage edited
index ca15585..22f4710 100644 (file)
@@ -7,11 +7,14 @@ directory and make a symbolic link:
 
  mediawiki/extensions$ ln -s ../../extensions-trunk/FooBarExt
 
-The extensions are available through svn at:
-    http://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/
+The extensions are available through Git:
+    https://gerrit.wikimedia.org/r/#/admin/projects/
+
+or Subversion:
+    https://svn.wikimedia.org/svnroot/mediawiki/trunk/extensions/
 
 You can find documentation and additional extensions on MediaWiki website:
-    http://www.mediawiki.org/wiki/Category:Extensions
+    https://www.mediawiki.org/wiki/Category:Extensions
 
 
 Please note that under POSIX systems (Linux...), parent of a symbolic path
index a51e5ca..d712589 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * Image authorisation script
  *
  *
  * Your server needs to support PATH_INFO; CGI-based configurations usually don't.
  *
- * @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
+ */
 
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
index df25e95..b3eb450 100644 (file)
@@ -1 +1,24 @@
-<?php require './img_auth.php';
\ No newline at end of file
+<?php
+/**
+ * Version of img_auth.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './img_auth.php';
index a25e8aa..a9891ec 100644 (file)
@@ -1,15 +1,6 @@
 <?php
 /**
- * @defgroup Actions Action done on pages
- */
-
-/**
- * Actions are things which can be done to pages (edit, delete, rollback, etc).  They
- * are distinct from Special Pages because an action must apply to exactly one page.
- *
- * To add an action in an extension, create a subclass of Action, and add the key to
- * $wgActions.  There is also the deprecated UnknownAction hook
- *
+ * Base classes for actions done on 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
  *
  * @file
  */
+
+/**
+ * @defgroup Actions Action done on pages
+ */
+
+/**
+ * Actions are things which can be done to pages (edit, delete, rollback, etc).  They
+ * are distinct from Special Pages because an action must apply to exactly one page.
+ *
+ * To add an action in an extension, create a subclass of Action, and add the key to
+ * $wgActions.  There is also the deprecated UnknownAction hook
+ *
+ * Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
+ * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
+ * patrol, etc). The FormAction and FormlessAction classes respresent these two groups.
+ */
 abstract class Action {
 
        /**
         * Page on which we're performing the action
-        * @var Page
+        * @var Page $page
         */
        protected $page;
 
        /**
         * IContextSource if specified; otherwise we'll use the Context from the Page
-        * @var IContextSource
+        * @var IContextSource $context
         */
        protected $context;
 
        /**
         * The fields used to create the HTMLForm
-        * @var Array
+        * @var Array $fields
         */
        protected $fields;
 
@@ -352,6 +359,9 @@ abstract class Action {
        public abstract function execute();
 }
 
+/**
+ * An action which shows a form and does something based on the input from the form
+ */
 abstract class FormAction extends Action {
 
        /**
@@ -446,8 +456,8 @@ abstract class FormAction extends Action {
        /**
         * @see Action::execute()
         * @throws ErrorPageError
-        * @param array|null $data
-        * @param bool $captureErrors
+        * @param $data array|null
+        * @param $captureErrors bool
         * @return bool
         */
        public function execute( array $data = null, $captureErrors = true ) {
@@ -488,9 +498,7 @@ abstract class FormAction extends Action {
 }
 
 /**
- * Actions generally fall into two groups: the show-a-form-then-do-something-with-the-input
- * format (protect, delete, move, etc), and the just-do-something format (watch, rollback,
- * patrol, etc).
+ * An action which just does something, without showing a form first.
  */
 abstract class FormlessAction extends Action {
 
@@ -509,10 +517,17 @@ abstract class FormlessAction extends Action {
                return false;
        }
 
+       /**
+        * @param $data Array
+        * @return bool
+        */
        public function onSubmit( $data ) {
                return false;
        }
 
+       /**
+        * @return bool
+        */
        public function onSuccess() {
                return false;
        }
index 5bc9f06..e3df520 100644 (file)
@@ -1,10 +1,28 @@
 <?php
 /**
- * @defgroup Ajax Ajax
+ * Handle ajax requests and send them to the proper handler.
+ *
+ * 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 Ajax
- * Handle ajax requests and send them to the proper handler.
+ */
+
+/**
+ * @defgroup Ajax Ajax
  */
 
 /**
  * @ingroup Ajax
  */
 class AjaxDispatcher {
-       /** The way the request was made, either a 'get' or a 'post' */
+       /**
+        * The way the request was made, either a 'get' or a 'post'
+        * @var string $mode
+        */
        private $mode;
 
-       /** Name of the requested handler */
+       /**
+        * Name of the requested handler
+        * @var string $func_name
+        */
        private $func_name;
 
-       /** Arguments passed */
+       /** Arguments passed
+        * @var array $args
+        */
        private $args;
 
-       /** Load up our object with user supplied data */
+       /**
+        * Load up our object with user supplied data
+        */
        function __construct() {
                wfProfileIn( __METHOD__ );
 
@@ -62,7 +90,8 @@ class AjaxDispatcher {
                wfProfileOut( __METHOD__ );
        }
 
-       /** Pass the request to our internal function.
+       /**
+        * Pass the request to our internal function.
         * BEWARE! Data are passed as they have been supplied by the user,
         * they should be carefully handled in the function processing the
         * request.
index a395239..6bf94cc 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Response handler for Ajax requests
+ * Response handler for Ajax 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 Ajax
  * @ingroup Ajax
  */
 class AjaxResponse {
-       /** Number of seconds to get the response cached by a proxy */
+
+       /**
+        * Number of seconds to get the response cached by a proxy
+        * @var int $mCacheDuration
+        */
        private $mCacheDuration;
 
-       /** HTTP header Content-Type */
+       /**
+        * HTTP header Content-Type
+        * @var string $mContentType
+        */
        private $mContentType;
 
-       /** Disables output. Can be set by calling $AjaxResponse->disable() */
+       /**
+        * Disables output. Can be set by calling $AjaxResponse->disable()
+        * @var bool $mDisabled
+        */
        private $mDisabled;
 
-       /** Date for the HTTP header Last-modified */
+       /**
+        * Date for the HTTP header Last-modified
+        * @var string|false $mLastModified
+        */
        private $mLastModified;
 
-       /** HTTP response code */
+       /**
+        * HTTP response code
+        * @var string $mResponseCode
+        */
        private $mResponseCode;
 
-       /** HTTP Vary header */
+       /**
+        * HTTP Vary header
+        * @var string $mVary
+        */
        private $mVary;
 
-       /** Content of our HTTP response */
+       /**
+        * Content of our HTTP response
+        * @var string $mText
+        */
        private $mText;
 
        /**
@@ -52,22 +89,41 @@ class AjaxResponse {
                }
        }
 
+       /**
+        * Set the number of seconds to get the response cached by a proxy
+        * @param $duration int
+        */
        function setCacheDuration( $duration ) {
                $this->mCacheDuration = $duration;
        }
 
+       /**
+        * Set the HTTP Vary header
+        * @param $vary string
+        */
        function setVary( $vary ) {
                $this->mVary = $vary;
        }
 
+       /**
+        * Set the HTTP response code
+        * @param $code string
+        */
        function setResponseCode( $code ) {
                $this->mResponseCode = $code;
        }
 
+       /**
+        * Set the HTTP header Content-Type
+        * @param $type string
+        */
        function setContentType( $type ) {
                $this->mContentType = $type;
        }
 
+       /**
+        * Disable output.
+        */
        function disable() {
                $this->mDisabled = true;
        }
@@ -207,8 +263,8 @@ class AjaxResponse {
        }
 
        /**
-        * @param $mckey
-        * @param $touched
+        * @param $mckey string
+        * @param $touched int
         * @return bool
         */
        function loadFromMemcached( $mckey, $touched ) {
@@ -235,7 +291,7 @@ class AjaxResponse {
        }
 
        /**
-        * @param $mckey
+        * @param $mckey string
         * @param $expiry int
         * @return bool
         */
index 393f770..dcde2cf 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * File for articles
+ * User interface for page actions.
+ *
+ * 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
  */
 
@@ -9,7 +25,7 @@
  *
  * This maintains WikiPage functions for backwards compatibility.
  *
- * @TODO: move and rewrite code to an Action class
+ * @todo move and rewrite code to an Action class
  *
  * See design.txt for an overview.
  * Note: edit user interface and cache support functions have been
@@ -23,42 +39,69 @@ class Article extends Page {
         */
 
        /**
-        * @var IContextSource
+        * The context this Article is executed in
+        * @var IContextSource $mContext
         */
        protected $mContext;
 
        /**
-        * @var WikiPage
+        * The WikiPage object of this instance
+        * @var WikiPage $mPage
         */
        protected $mPage;
 
        /**
-        * @var ParserOptions: ParserOptions object for $wgUser articles
+        * ParserOptions object for $wgUser articles
+        * @var ParserOptions $mParserOptions
         */
        public $mParserOptions;
 
+       /**
+        * Content of the revision we are working on
+        * @var string $mContent
+        */
        var $mContent;                    // !<
+
+       /**
+        * Is the content ($mContent) already loaded?
+        * @var bool $mContentLoaded
+        */
        var $mContentLoaded = false;      // !<
+
+       /**
+        * The oldid of the article that is to be shown, 0 for the
+        * current revision
+        * @var int|null $mOldId
+        */
        var $mOldId;                      // !<
 
        /**
-        * @var Title
+        * Title from which we were redirected here
+        * @var Title $mRedirectedFrom
         */
        var $mRedirectedFrom = null;
 
        /**
-        * @var mixed: boolean false or URL string
+        * URL to redirect to or false if none
+        * @var string|false $mRedirectUrl
         */
        var $mRedirectUrl = false;        // !<
+
+       /**
+        * Revision ID of revision we are working on
+        * @var int $mRevIdFetched
+        */
        var $mRevIdFetched = 0;           // !<
 
        /**
-        * @var Revision
+        * Revision we are working on
+        * @var Revision $mRevision
         */
        var $mRevision = null;
 
        /**
-        * @var ParserOutput
+        * ParserOutput object
+        * @var ParserOutput $mParserOutput
         */
        var $mParserOutput;
 
@@ -191,8 +234,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 +245,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 +276,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 +302,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 +310,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 +444,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 +454,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 +474,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,31 +483,31 @@ 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' ) ) {
+               } elseif ( !$this->isCurrent() || !$this->getTitle()->quickUserCan( 'edit', $user ) ) {
                        $parserOptions->setEditSection( false );
                }
 
                # 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 +516,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 +527,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 +565,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 +596,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 +614,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 +632,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 +645,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 +679,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 +699,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 +711,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 +727,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 +739,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 +765,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 +787,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',
@@ -798,7 +836,7 @@ class Article extends Page {
         * merging of several policies using array_merge().
         * @param $policy Mixed, returns empty array on null/false/'', transparent
         *            to already-converted arrays, converts String.
-        * @return Array: 'index' => <indexpolicy>, 'follow' => <followpolicy>
+        * @return Array: 'index' => \<indexpolicy\>, 'follow' => \<followpolicy\>
         */
        public static function formatRobotPolicy( $policy ) {
                if ( is_array( $policy ) ) {
@@ -824,15 +862,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 +884,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 +907,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 +921,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 +932,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 +951,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' ) ) {
+               if ( !$rcid || !$this->getTitle()->quickUserCan( 'patrol', $user ) ) {
                        return;
                }
 
-               $token = $wgUser->getEditToken( $rcid );
-               $wgOut->preventClickjacking();
+               $token = $user->getEditToken( $rcid );
+               $outputPage->preventClickjacking();
 
-               $wgOut->addHTML(
+               $outputPage->addHTML(
                        "<div class='patrollink'>" .
                                wfMsgHtml(
                                        'markaspatrolledlink',
@@ -952,7 +988,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 +999,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 +1022,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 +1032,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 ) );
@@ -1013,50 +1050,45 @@ class Article extends Page {
                } elseif ( $this->getTitle()->getNamespace() === NS_MEDIAWIKI ) {
                        // Use the default message text
                        $text = $this->getTitle()->getDefaultMessageText();
+               } elseif ( $this->getTitle()->quickUserCan( 'create', $this->getContext()->getUser() )
+                       && $this->getTitle()->quickUserCan( 'edit', $this->getContext()->getUser() )
+               ) {
+                       $text = wfMsgNoTrans( 'noarticletext' );
                } else {
-                       $createErrors = $this->getTitle()->getUserPermissionsErrors( 'create', $wgUser );
-                       $editErrors = $this->getTitle()->getUserPermissionsErrors( 'edit', $wgUser );
-                       $errors = array_merge( $createErrors, $editErrors );
-
-                       if ( !count( $errors ) ) {
-                               $text = wfMsgNoTrans( 'noarticletext' );
-                       } else {
-                               $text = wfMsgNoTrans( 'noarticletext-nopermission' );
-                       }
+                       $text = wfMsgNoTrans( 'noarticletext-nopermission' );
                }
                $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 +1096,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 +1108,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 +1132,12 @@ 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();
+               $user = $this->getContext()->getUser();
+
+               $td = $language->userTimeAndDate( $timestamp, $user );
+               $tddate = $language->userDate( $timestamp, $user );
+               $tdtime = $language->userTime( $timestamp, $user );
 
                # Show user links if allowed to see them. If hidden, then show them only if requested...
                $userlinks = Linker::revUserTools( $revision, !$unhide );
@@ -1113,7 +1146,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 +1222,12 @@ class Article extends Page {
                                array( 'known', 'noclasses' )
                        );
 
-               $cdel = Linker::getRevDeleteLink( $wgUser, $revision, $this->getTitle() );
+               $cdel = Linker::getRevDeleteLink( $user, $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 +1241,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 +1251,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 +1289,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 +1312,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 +1333,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 +1348,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,18 +1361,18 @@ 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() ) {
-                               $this->doWatch();
+                       if ( $request->getCheck( 'wpWatch' ) && $user->isLoggedIn() ) {
+                               WatchAction::doWatch( $title, $user );
                        } elseif ( $title->userIsWatching() ) {
-                               $this->doUnwatch();
+                               WatchAction::doUnwatch( $title, $user );
                        }
 
                        return;
@@ -1356,8 +1388,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,12 +1399,12 @@ 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 ) ) );
                        }
                }
 
-               return $this->confirmDelete( $reason );
+               $this->confirmDelete( $reason );
        }
 
        /**
@@ -1381,16 +1413,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 +1505,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 +1518,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 +1617,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 +1628,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;
@@ -1654,6 +1681,7 @@ class Article extends Page {
        /**
         * Handle action=purge
         * @deprecated since 1.19
+        * @return Action|bool|null false if the action is disabled, null if it is not recognised
         */
        public function purge() {
                return Action::factory( 'purge', $this )->show();
@@ -1688,7 +1716,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 +1724,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 +1744,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 +1767,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 +1866,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 +1879,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 07a614a..c7fcf93 100644 (file)
  * someone logs in who can be authenticated externally.
  */
 class AuthPlugin {
+
+       /**
+        * @var string
+        */
+       protected $domain;
+
        /**
         * Check whether there exists a user account with the given name.
         * The name will be normalized to MediaWiki's requirements, so
@@ -83,6 +89,19 @@ class AuthPlugin {
                $this->domain = $domain;
        }
 
+       /**
+        * Get the user's domain
+        *
+        * @return string
+        */
+       public function getDomain() {
+               if ( isset( $this->domain ) ) {
+                       return $this->domain;
+               } else {
+                       return 'invaliddomain';
+               }
+       }
+
        /**
         * Check to see if the specific domain is a valid domain.
         *
@@ -248,6 +267,8 @@ class AuthPlugin {
        /**
         * If you want to munge the case of an account name before the final
         * check, now is your chance.
+        * @param $username string
+        * @return string
         */
        public function getCanonicalName( $username ) {
                return $username;
index a1bbc3c..11cf616 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This defines autoloading handler for whole MediaWiki framework
  *
+ * 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
  */
 
@@ -27,6 +42,7 @@ $wgAutoloadLocalClasses = array(
        'BadTitleError' => 'includes/Exception.php',
        'BaseTemplate' => 'includes/SkinTemplate.php',
        'Block' => 'includes/Block.php',
+       'CacheHelper' => 'includes/CacheHelper.php',
        'Category' => 'includes/Category.php',
        'Categoryfinder' => 'includes/Categoryfinder.php',
        'CategoryPage' => 'includes/CategoryPage.php',
@@ -51,14 +67,13 @@ $wgAutoloadLocalClasses = array(
        'CookieJar' => 'includes/Cookie.php',
        'MWCryptRand' => 'includes/CryptRand.php',
        'CurlHttpRequest' => 'includes/HttpFunctions.php',
-//     'DBDataObject' => 'includes/DBDataObject.php',
-//     'DBTable' => 'includes/DBTable.php',
        'DeferrableUpdate' => 'includes/DeferredUpdates.php',
        'DeferredUpdates' => 'includes/DeferredUpdates.php',
        'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
        'DerivativeRequest' => 'includes/WebRequest.php',
+       'DeviceDetection' => 'includes/mobile/DeviceDetection.php',
+       'DeviceProperties' => 'includes/mobile/DeviceDetection.php',
        'DiffHistoryBlob' => 'includes/HistoryBlob.php',
-
        'DoubleReplacer' => 'includes/StringUtils.php',
        'DummyLinker' => 'includes/Linker.php',
        'Dump7ZipOutput' => 'includes/Export.php',
@@ -121,7 +136,10 @@ $wgAutoloadLocalClasses = array(
        'Http' => 'includes/HttpFunctions.php',
        'HttpError' => 'includes/Exception.php',
        'HttpRequest' => 'includes/HttpFunctions.old.php',
+       'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
+       'IDeviceProperties' => 'includes/mobile/DeviceDetection.php',
+       'IDeviceDetector' => 'includes/mobile/DeviceDetection.php',
        'IdentityCollation' => 'includes/Collation.php',
        'ImageGallery' => 'includes/ImageGallery.php',
        'ImageHistoryList' => 'includes/ImagePage.php',
@@ -144,6 +162,7 @@ $wgAutoloadLocalClasses = array(
        'Linker' => 'includes/Linker.php',
        'LinkFilter' => 'includes/LinkFilter.php',
        'LinksUpdate' => 'includes/LinksUpdate.php',
+       'LinksDeletionUpdate' => 'includes/LinksUpdate.php',
        'LocalisationCache' => 'includes/LocalisationCache.php',
        'LocalisationCache_BulkLoad' => 'includes/LocalisationCache.php',
        'MagicWord' => 'includes/MagicWord.php',
@@ -157,6 +176,7 @@ $wgAutoloadLocalClasses = array(
        'MWException' => 'includes/Exception.php',
        'MWExceptionHandler' => 'includes/Exception.php',
        'MWFunction' => 'includes/MWFunction.php',
+       'MWHookException' => 'includes/Hooks.php',
        'MWHttpRequest' => 'includes/HttpFunctions.php',
        'MWInit' => 'includes/Init.php',
        'MWNamespace' => 'includes/Namespace.php',
@@ -189,12 +209,15 @@ $wgAutoloadLocalClasses = array(
        'ReplacementArray' => 'includes/StringUtils.php',
        'Replacer' => 'includes/StringUtils.php',
        'ReverseChronologicalPager' => 'includes/Pager.php',
+       'RevisionItem' => 'includes/RevisionList.php',
        'RevisionItemBase' => 'includes/RevisionList.php',
        'RevisionListBase' => 'includes/RevisionList.php',
        'Revision' => 'includes/Revision.php',
        'RevisionList' => 'includes/RevisionList.php',
        'RSSFeed' => 'includes/Feed.php',
        'Sanitizer' => 'includes/Sanitizer.php',
+       'DataUpdate' => 'includes/DataUpdate.php',
+       'SqlDataUpdate' => 'includes/SqlDataUpdate.php',
        'ScopedPHPTimeout' => 'includes/ScopedPHPTimeout.php',
        'SiteConfiguration' => 'includes/SiteConfiguration.php',
        'SiteStats' => 'includes/SiteStats.php',
@@ -227,6 +250,7 @@ $wgAutoloadLocalClasses = array(
        'TitleArrayFromResult' => 'includes/TitleArray.php',
        'ThrottledError' => 'includes/Exception.php',
        'UnlistedSpecialPage' => 'includes/SpecialPage.php',
+       'UploadSourceAdapter' => 'includes/Import.php',
        'UppercaseCollation' => 'includes/Collation.php',
        'User' => 'includes/User.php',
        'UserArray' => 'includes/UserArray.php',
@@ -254,12 +278,15 @@ $wgAutoloadLocalClasses = array(
        'Xml' => 'includes/Xml.php',
        'XmlDumpWriter' => 'includes/Export.php',
        'XmlJsCode' => 'includes/Xml.php',
+       'XMLReader2' => 'includes/Import.php',
        'XmlSelect' => 'includes/Xml.php',
        'XmlTypeCheck' => 'includes/XmlTypeCheck.php',
        'ZhClient' => 'includes/ZhClient.php',
        'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php',
+       'ZipDirectoryReaderError' => 'includes/ZipDirectoryReader.php',
 
        # includes/actions
+       'CachedAction' => 'includes/actions/CachedAction.php',
        'CreditsAction' => 'includes/actions/CreditsAction.php',
        'DeleteAction' => 'includes/actions/DeleteAction.php',
        'EditAction' => 'includes/actions/EditAction.php',
@@ -315,6 +342,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',
@@ -323,10 +351,10 @@ $wgAutoloadLocalClasses = array(
        'ApiPurge' => 'includes/api/ApiPurge.php',
        'ApiQuery' => 'includes/api/ApiQuery.php',
        'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
-       'ApiQueryAllimages' => 'includes/api/ApiQueryAllimages.php',
+       'ApiQueryAllImages' => 'includes/api/ApiQueryAllImages.php',
        'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-       'ApiQueryAllmessages' => 'includes/api/ApiQueryAllmessages.php',
-       'ApiQueryAllpages' => 'includes/api/ApiQueryAllpages.php',
+       'ApiQueryAllMessages' => 'includes/api/ApiQueryAllMessages.php',
+       'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
        'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
        'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
        'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
@@ -407,6 +435,9 @@ $wgAutoloadLocalClasses = array(
        'IContextSource' => 'includes/context/IContextSource.php',
        'RequestContext' => 'includes/context/RequestContext.php',
 
+       # includes/dao
+       'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
+
        # includes/db
        'Blob' => 'includes/db/DatabaseUtility.php',
        'ChronologyProtector' => 'includes/db/LBFactory.php',
@@ -421,9 +452,12 @@ $wgAutoloadLocalClasses = array(
        'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
        'DatabaseSqliteStandalone' => 'includes/db/DatabaseSqlite.php',
        'DatabaseType' => 'includes/db/Database.php',
+       'DBAccessError' => 'includes/db/LBFactory.php',
        'DBConnectionError' => 'includes/db/DatabaseError.php',
        'DBError' => 'includes/db/DatabaseError.php',
        'DBObject' => 'includes/db/DatabaseUtility.php',
+       'IORMRow' => 'includes/db/IORMRow.php',
+       'IORMTable' => 'includes/db/IORMTable.php',
        'DBMasterPos' => 'includes/db/DatabaseUtility.php',
        'DBQueryError' => 'includes/db/DatabaseError.php',
        'DBUnexpectedError' => 'includes/db/DatabaseError.php',
@@ -431,7 +465,10 @@ $wgAutoloadLocalClasses = array(
        'Field' => 'includes/db/DatabaseUtility.php',
        'IBM_DB2Blob' => 'includes/db/DatabaseIbm_db2.php',
        'IBM_DB2Field' => 'includes/db/DatabaseIbm_db2.php',
+       'IBM_DB2Helper' => 'includes/db/DatabaseIbm_db2.php',
+       'IBM_DB2Result' => 'includes/db/DatabaseIbm_db2.php',
        'LBFactory' => 'includes/db/LBFactory.php',
+       'LBFactory_Fake' => 'includes/db/LBFactory.php',
        'LBFactory_Multi' => 'includes/db/LBFactory_Multi.php',
        'LBFactory_Simple' => 'includes/db/LBFactory.php',
        'LBFactory_Single' => 'includes/db/LBFactory_Single.php',
@@ -441,12 +478,20 @@ $wgAutoloadLocalClasses = array(
        'LoadMonitor' => 'includes/db/LoadMonitor.php',
        'LoadMonitor_MySQL' => 'includes/db/LoadMonitor.php',
        'LoadMonitor_Null' => 'includes/db/LoadMonitor.php',
+       'MssqlField' => 'includes/db/DatabaseMssql.php',
+       'MssqlResult' => 'includes/db/DatabaseMssql.php',
        'MySQLField' => 'includes/db/DatabaseMysql.php',
        'MySQLMasterPos' => 'includes/db/DatabaseMysql.php',
        'ORAField' => 'includes/db/DatabaseOracle.php',
        'ORAResult' => 'includes/db/DatabaseOracle.php',
+       'ORMIterator' => 'includes/db/ORMIterator.php',
+       'ORMResult' => 'includes/db/ORMResult.php',
+       'ORMRow' => 'includes/db/ORMRow.php',
+       'ORMTable' => 'includes/db/ORMTable.php',
        'PostgresField' => 'includes/db/DatabasePostgres.php',
+       'PostgresTransactionState' => 'includes/db/DatabasePostgres.php',
        'ResultWrapper' => 'includes/db/DatabaseUtility.php',
+       'SavepointPostgres' => 'includes/db/DatabasePostgres.php',
        'SQLiteField' => 'includes/db/DatabaseSqlite.php',
 
        # includes/debug
@@ -486,6 +531,7 @@ $wgAutoloadLocalClasses = array(
        'LocalRepo' => 'includes/filerepo/LocalRepo.php',
        'NullRepo' => 'includes/filerepo/NullRepo.php',
        'RepoGroup' => 'includes/filerepo/RepoGroup.php',
+       'TempFileRepo' => 'includes/filerepo/FileRepo.php',
 
        # includes/filerepo/file
        'ArchivedFile' => 'includes/filerepo/file/ArchivedFile.php',
@@ -506,11 +552,20 @@ $wgAutoloadLocalClasses = array(
        'FileBackend' => 'includes/filerepo/backend/FileBackend.php',
        'FileBackendStore' => 'includes/filerepo/backend/FileBackendStore.php',
        'FileBackendStoreShardListIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+       'FileBackendStoreShardDirIterator' => 'includes/filerepo/backend/FileBackendStore.php',
+       'FileBackendStoreShardFileIterator' => 'includes/filerepo/backend/FileBackendStore.php',
        'FileBackendMultiWrite' => 'includes/filerepo/backend/FileBackendMultiWrite.php',
+       'FileBackendStoreOpHandle' => 'includes/filerepo/backend/FileBackendStore.php',
        'FSFileBackend' => 'includes/filerepo/backend/FSFileBackend.php',
+       'FSFileBackendList' => 'includes/filerepo/backend/FSFileBackend.php',
+       'FSFileBackendDirList' => 'includes/filerepo/backend/FSFileBackend.php',
        'FSFileBackendFileList' => 'includes/filerepo/backend/FSFileBackend.php',
+       'FSFileOpHandle' => 'includes/filerepo/backend/FSFileBackend.php',
        'SwiftFileBackend' => 'includes/filerepo/backend/SwiftFileBackend.php',
+       'SwiftFileBackendList' => 'includes/filerepo/backend/SwiftFileBackend.php',
+       'SwiftFileBackendDirList' => 'includes/filerepo/backend/SwiftFileBackend.php',
        'SwiftFileBackendFileList' => 'includes/filerepo/backend/SwiftFileBackend.php',
+       'SwiftFileOpHandle' => 'includes/filerepo/backend/SwiftFileBackend.php',
        'FileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
        'DBFileJournal' => 'includes/filerepo/backend/filejournal/DBFileJournal.php',
        'NullFileJournal' => 'includes/filerepo/backend/filejournal/FileJournal.php',
@@ -520,9 +575,12 @@ $wgAutoloadLocalClasses = array(
        'FSLockManager' => 'includes/filerepo/backend/lockmanager/FSLockManager.php',
        'DBLockManager' => 'includes/filerepo/backend/lockmanager/DBLockManager.php',
        'LSLockManager' => 'includes/filerepo/backend/lockmanager/LSLockManager.php',
+       'MemcLockManager' => 'includes/filerepo/backend/lockmanager/MemcLockManager.php',
+       'QuorumLockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
        'MySqlLockManager'=> 'includes/filerepo/backend/lockmanager/DBLockManager.php',
        'NullLockManager' => 'includes/filerepo/backend/lockmanager/LockManager.php',
        'FileOp' => 'includes/filerepo/backend/FileOp.php',
+       'FileOpBatch' => 'includes/filerepo/backend/FileOpBatch.php',
        'StoreFileOp' => 'includes/filerepo/backend/FileOp.php',
        'CopyFileOp' => 'includes/filerepo/backend/FileOp.php',
        'MoveFileOp' => 'includes/filerepo/backend/FileOp.php',
@@ -575,7 +633,7 @@ $wgAutoloadLocalClasses = array(
        'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
        'EmaillingJob' => 'includes/job/EmaillingJob.php',
        'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
-       'Job' => 'includes/job/JobQueue.php',
+       'Job' => 'includes/job/Job.php',
        'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
        'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
        'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
@@ -587,13 +645,18 @@ $wgAutoloadLocalClasses = array(
 
        # includes/libs
        'CSSJanus' => 'includes/libs/CSSJanus.php',
+       'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
        'CSSMin' => 'includes/libs/CSSMin.php',
        'HttpStatus' => 'includes/libs/HttpStatus.php',
        'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
        'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
+       'JSCompilerContext' => 'includes/libs/jsminplus.php',
        'JSMinPlus' => 'includes/libs/jsminplus.php',
+       'JSNode' => 'includes/libs/jsminplus.php',
        'JSParser' => 'includes/libs/jsminplus.php',
+       'JSToken' => 'includes/libs/jsminplus.php',
+       'JSTokenizer' => 'includes/libs/jsminplus.php',
 
        # includes/logging
        'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
@@ -636,6 +699,7 @@ $wgAutoloadLocalClasses = array(
        'PNGMetadataExtractor' => 'includes/media/PNGMetadataExtractor.php',
        'SvgHandler' => 'includes/media/SVG.php',
        'SVGMetadataExtractor' => 'includes/media/SVGMetadataExtractor.php',
+       'SVGReader' => 'includes/media/SVGMetadataExtractor.php',
        'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
        'TiffHandler' => 'includes/media/Tiff.php',
        'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
@@ -657,6 +721,8 @@ $wgAutoloadLocalClasses = array(
        'HashBagOStuff' => 'includes/objectcache/HashBagOStuff.php',
        'MediaWikiBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
        'MemCachedClientforWiki' => 'includes/objectcache/MemcachedClient.php',
+       'MemcachedBagOStuff' => 'includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedPeclBagOStuff' => 'includes/objectcache/MemcachedPeclBagOStuff.php',
        'MemcachedPhpBagOStuff' => 'includes/objectcache/MemcachedPhpBagOStuff.php',
        'MultiWriteBagOStuff' => 'includes/objectcache/MultiWriteBagOStuff.php',
        'MWMemcached' => 'includes/objectcache/MemcachedClient.php',
@@ -674,6 +740,7 @@ $wgAutoloadLocalClasses = array(
        'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
        'LinkMarkerReplacer' => 'includes/parser/Parser_LinkHooks.php',
        'MWTidy' => 'includes/parser/Tidy.php',
+       'MWTidyWrapper' => 'includes/parser/Tidy.php',
        'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
        'PPCustomFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
        'PPCustomFrame_HipHop' => 'includes/parser/Preprocessor_HipHop.hphp',
@@ -745,6 +812,7 @@ $wgAutoloadLocalClasses = array(
        # includes/revisiondelete
        'RevDel_ArchivedFileItem' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_ArchivedFileList' => 'includes/revisiondelete/RevisionDelete.php',
+       'RevDel_ArchivedRevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_ArchiveItem' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_ArchiveList' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_FileItem' => 'includes/revisiondelete/RevisionDelete.php',
@@ -760,6 +828,7 @@ $wgAutoloadLocalClasses = array(
        'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
 
        # includes/search
+       'MssqlSearchResultSet' => 'includes/search/SearchMssql.php',
        'MySQLSearchResultSet' => 'includes/search/SearchMySQL.php',
        'PostgresSearchResult' => 'includes/search/SearchPostgres.php',
        'PostgresSearchResultSet' => 'includes/search/SearchPostgres.php',
@@ -769,6 +838,7 @@ $wgAutoloadLocalClasses = array(
        'SearchIBM_DB2' => 'includes/search/SearchIBM_DB2.php',
        'SearchMssql' => 'includes/search/SearchMssql.php',
        'SearchMySQL' => 'includes/search/SearchMySQL.php',
+       'SearchNearMatchResultSet' => 'includes/search/SearchEngine.php',
        'SearchOracle' => 'includes/search/SearchOracle.php',
        'SearchPostgres' => 'includes/search/SearchPostgres.php',
        'SearchResult' => 'includes/search/SearchEngine.php',
@@ -786,6 +856,7 @@ $wgAutoloadLocalClasses = array(
        'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
        'BlockListPager' => 'includes/specials/SpecialBlockList.php',
        'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
+       'CategoryPager' => 'includes/specials/SpecialCategories.php',
        'ContribsPager' => 'includes/specials/SpecialContributions.php',
        'DBLockForm' => 'includes/specials/SpecialLockdb.php',
        'DBUnlockForm' => 'includes/specials/SpecialUnlockdb.php',
@@ -794,11 +865,14 @@ $wgAutoloadLocalClasses = array(
        'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
        'DisambiguationsPage' => 'includes/specials/SpecialDisambiguations.php',
        'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
+       'EditWatchlistCheckboxSeriesField' => 'includes/specials/SpecialEditWatchlist.php',
+       'EditWatchlistNormalHTMLForm' => 'includes/specials/SpecialEditWatchlist.php',
        'EmailConfirmation' => 'includes/specials/SpecialConfirmemail.php',
        'EmailInvalidation' => 'includes/specials/SpecialConfirmemail.php',
        'FewestrevisionsPage' => 'includes/specials/SpecialFewestrevisions.php',
        'FileDuplicateSearchPage' => 'includes/specials/SpecialFileDuplicateSearch.php',
        'HTMLBlockedUsersItemSelect' => 'includes/specials/SpecialBlockList.php',
+       'ImageListPager' => 'includes/specials/SpecialListfiles.php',
        'ImportReporter' => 'includes/specials/SpecialImport.php',
        'IPBlockForm' => 'includes/specials/SpecialBlock.php',
        'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
@@ -806,6 +880,7 @@ $wgAutoloadLocalClasses = array(
        'LoginForm' => 'includes/specials/SpecialUserlogin.php',
        'LonelyPagesPage' => 'includes/specials/SpecialLonelypages.php',
        'LongPagesPage' => 'includes/specials/SpecialLongpages.php',
+       'MergeHistoryPager' => 'includes/specials/SpecialMergeHistory.php',
        'MIMEsearchPage' => 'includes/specials/SpecialMIMEsearch.php',
        'MostcategoriesPage' => 'includes/specials/SpecialMostcategories.php',
        'MostimagesPage' => 'includes/specials/SpecialMostimages.php',
@@ -814,9 +889,12 @@ $wgAutoloadLocalClasses = array(
        'MostlinkedTemplatesPage' => 'includes/specials/SpecialMostlinkedtemplates.php',
        'MostrevisionsPage' => 'includes/specials/SpecialMostrevisions.php',
        'MovePageForm' => 'includes/specials/SpecialMovepage.php',
+       'NewFilesPager' => 'includes/specials/SpecialNewimages.php',
        'NewPagesPager' => 'includes/specials/SpecialNewpages.php',
        'PageArchive' => 'includes/specials/SpecialUndelete.php',
        'PopularPagesPage' => 'includes/specials/SpecialPopularpages.php',
+       'ProtectedPagesPager' => 'includes/specials/SpecialProtectedpages.php',
+       'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php',
        'RandomPage' => 'includes/specials/SpecialRandompage.php',
        'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
        'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
@@ -827,6 +905,7 @@ $wgAutoloadLocalClasses = array(
        'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
        'SpecialBlockme' => 'includes/specials/SpecialBlockme.php',
        'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
+       'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
        'SpecialCategories' => 'includes/specials/SpecialCategories.php',
        'SpecialChangeEmail' => 'includes/specials/SpecialChangeEmail.php',
        'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
@@ -866,10 +945,11 @@ $wgAutoloadLocalClasses = array(
        'SpecialUnlockdb' => 'includes/specials/SpecialUnlockdb.php',
        'SpecialUpload' => 'includes/specials/SpecialUpload.php',
        'SpecialUploadStash' => 'includes/specials/SpecialUploadStash.php',
+       'SpecialUploadStashTooLargeException' => 'includes/specials/SpecialUploadStash.php',
        'SpecialUserlogout' => 'includes/specials/SpecialUserlogout.php',
        'SpecialVersion' => 'includes/specials/SpecialVersion.php',
        'SpecialWatchlist' => 'includes/specials/SpecialWatchlist.php',
-       'SpecialWhatlinkshere' => 'includes/specials/SpecialWhatlinkshere.php',
+       'SpecialWhatLinksHere' => 'includes/specials/SpecialWhatlinkshere.php',
        'UncategorizedCategoriesPage' => 'includes/specials/SpecialUncategorizedcategories.php',
        'UncategorizedImagesPage' => 'includes/specials/SpecialUncategorizedimages.php',
        'UncategorizedPagesPage' => 'includes/specials/SpecialUncategorizedpages.php',
@@ -878,6 +958,8 @@ $wgAutoloadLocalClasses = array(
        'UnusedimagesPage' => 'includes/specials/SpecialUnusedimages.php',
        'UnusedtemplatesPage' => 'includes/specials/SpecialUnusedtemplates.php',
        'UnwatchedpagesPage' => 'includes/specials/SpecialUnwatchedpages.php',
+       'UploadChunkFileException' => 'includes/upload/UploadFromChunks.php',
+       'UploadChunkZeroLengthFileException' => 'includes/upload/UploadFromChunks.php',
        'UploadForm' => 'includes/specials/SpecialUpload.php',
        'UploadSourceField' => 'includes/specials/SpecialUpload.php',
        'UserrightsPage' => 'includes/specials/SpecialUserrights.php',
@@ -912,6 +994,7 @@ $wgAutoloadLocalClasses = array(
        'UploadStashNoSuchKeyException' => 'includes/upload/UploadStash.php',
 
        # languages
+       'ConverterRule' => 'languages/LanguageConverter.php',
        'FakeConverter' => 'languages/Language.php',
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
@@ -941,6 +1024,7 @@ $wgAutoloadLocalClasses = array(
 
        # maintenance/language
        'csvStatsOutput' => 'maintenance/language/StatOutputs.php',
+       'extensionLanguages' => 'maintenance/language/languages.inc',
        'languages' => 'maintenance/language/languages.inc',
        'MessageWriter' => 'maintenance/language/writeMessagesArray.inc',
        'statsOutput' => 'maintenance/language/StatOutputs.php',
@@ -951,16 +1035,23 @@ $wgAutoloadLocalClasses = array(
        'AnsiTermColorer'  => 'maintenance/term/MWTerm.php',
        'DummyTermColorer' => 'maintenance/term/MWTerm.php',
 
+       # mw-config
+       'InstallerOverrides' => 'mw-config/overrides.php',
+       'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
+
        # tests
        'DbTestPreviewer' => 'tests/testHelpers.inc',
        'DbTestRecorder' => 'tests/testHelpers.inc',
+       'DelayedParserTest' => 'tests/testHelpers.inc',
        'TestFileIterator' => 'tests/testHelpers.inc',
        'TestRecorder' => 'tests/testHelpers.inc',
 
+       # tests/phpunit/includes/db
+       'ORMRowTest' => 'tests/phpunit/includes/db/ORMRowTest.php',
+
        # tests/parser
        'ParserTest' => 'tests/parser/parserTest.inc',
        'ParserTestParserHook' => 'tests/parser/parserTestsParserHook.php',
-       'ParserTestStaticParserHook' => 'tests/parser/parserTestsStaticParserHook.php',
 
        # tests/selenium
        'Selenium' => 'tests/selenium/Selenium.php',
@@ -971,6 +1062,23 @@ $wgAutoloadLocalClasses = array(
        'SeleniumTestListener' => 'tests/selenium/SeleniumTestListener.php',
        'SeleniumTestSuite' => 'tests/selenium/SeleniumTestSuite.php',
        'SeleniumConfig' => 'tests/selenium/SeleniumConfig.php',
+
+       # skins
+       'CologneBlueTemplate' => 'skins/CologneBlue.php',
+       'ModernTemplate' => 'skins/Modern.php',
+       'MonoBookTemplate' => 'skins/MonoBook.php',
+       'NostalgiaTemplate' => 'skins/Nostalgia.php',
+       'SkinChick' => 'skins/Chick.php',
+       'SkinCologneBlue' => 'skins/CologneBlue.php',
+       'SkinModern' => 'skins/Modern.php',
+       'SkinMonoBook' => 'skins/MonoBook.php',
+       'SkinMySkin' => 'skins/MySkin.php',
+       'SkinNostalgia' => 'skins/Nostalgia.php',
+       'SkinSimple' => 'skins/Simple.php',
+       'SkinStandard' => 'skins/Standard.php',
+       'SkinVector' => 'skins/Vector.php',
+       'StandardTemplate' => 'skins/Standard.php',
+       'VectorTemplate' => 'skins/Vector.php',
 );
 
 class AutoLoader {
@@ -985,6 +1093,14 @@ class AutoLoader {
        static function autoload( $className ) {
                global $wgAutoloadClasses, $wgAutoloadLocalClasses;
 
+               // Workaround for PHP bug <https://bugs.php.net/bug.php?id=49143> (5.3.2. is broken, it's fixed in 5.3.6).
+               // Strip leading backslashes from class names. When namespaces are used, leading backslashes are used to indicate
+               // the top-level namespace, e.g. \foo\Bar. When used like this in the code, the leading backslash isn't passed to
+               // the auto-loader ($className would be 'foo\Bar'). However, if a class is accessed using a string instead of a
+               // class literal (e.g. $class = '\foo\Bar'; new $class()), then some versions of PHP do not strip the leading
+               // backlash in this case, causing autoloading to fail.
+               $className = ltrim( $className, '\\' );
+
                if ( isset( $wgAutoloadLocalClasses[$className] ) ) {
                        $filename = $wgAutoloadLocalClasses[$className];
                } elseif ( isset( $wgAutoloadClasses[$className] ) ) {
@@ -1027,6 +1143,7 @@ class AutoLoader {
         * Sanitizer that have define()s outside of their class definition. Of course
         * this wouldn't be necessary if everything in MediaWiki was class-based. Sigh.
         *
+        * @param $class string
         * @return Boolean Return the results of class_exists() so we know if we were successful
         */
        static function loadClass( $class ) {
index 38adf14..9c77855 100644 (file)
@@ -1,9 +1,30 @@
 <?php
+/**
+ * Automatic user rights promotion based on conditions specified
+ * in $wgAutopromote.
+ *
+ * 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
+ */
+
 /**
  * This class checks if user can get extra rights
  * because of conditions specified in $wgAutopromote
  */
-
 class Autopromote {
        /**
         * Get the groups for the given user based on $wgAutopromote.
index c028352..2aba29f 100644 (file)
@@ -1,7 +1,28 @@
 <?php
 /**
- * File for BacklinkCache class
+ * Class for fetching backlink lists, approximate backlink counts and
+ * partitions.
+ *
+ * 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 Tim Starling
+ * @copyright © 2009, Tim Starling, Domas Mituzas
+ * @copyright © 2010, Max Sem
+ * @copyright © 2011, Antoine Musso
  */
 
 /**
  * Introduced by r47317
  *
  * @internal documentation reviewed on 18 Mar 2011 by hashar
- *
- * @author Tim Starling
- * @copyright © 2009, Tim Starling, Domas Mituzas
- * @copyright © 2010, Max Sem
- * @copyright © 2011, Antoine Musso
  */
 class BacklinkCache {
 
index dff1a5d..301a45a 100644 (file)
@@ -28,7 +28,8 @@ class Block {
 
                $mBlockEmail,
                $mDisableUsertalk,
-               $mCreateAccount;
+               $mCreateAccount,
+               $mParentBlockId;
 
        /// @var User|String
        protected $target;
@@ -125,17 +126,42 @@ class Block {
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->selectRow(
                        'ipblocks',
-                       '*',
+                       self::selectFields(),
                        array( 'ipb_id' => $id ),
                        __METHOD__
                );
                if ( $res ) {
-                       return Block::newFromRow( $res );
+                       return self::newFromRow( $res );
                } else {
                        return null;
                }
        }
 
+       /**
+        * Return the list of ipblocks fields that should be selected to create
+        * a new block.
+        * @return array
+        */
+       public static function selectFields() {
+               return array(
+                       'ipb_id',
+                       'ipb_address',
+                       'ipb_by',
+                       'ipb_by_text',
+                       'ipb_reason',
+                       'ipb_timestamp',
+                       'ipb_auto',
+                       'ipb_anon_only',
+                       'ipb_create_account',
+                       'ipb_enable_autoblock',
+                       'ipb_expiry',
+                       'ipb_deleted',
+                       'ipb_block_email',
+                       'ipb_allow_usertalk',
+                       'ipb_parent_block_id',
+               );
+       }
+
        /**
         * Check if two blocks are effectively equal.  Doesn't check irrelevant things like
         * the blocking user or the block timestamp, only things which affect the blocked user   *
@@ -246,7 +272,7 @@ class Block {
                        }
                }
 
-               $res = $db->select( 'ipblocks', '*', $conds, __METHOD__ );
+               $res = $db->select( 'ipblocks', self::selectFields(), $conds, __METHOD__ );
 
                # This result could contain a block on the user, a block on the IP, and a russian-doll
                # set of rangeblocks.  We want to choose the most specific one, so keep a leader board.
@@ -259,7 +285,7 @@ class Block {
                $bestBlockPreventsEdit = null;
 
                foreach( $res as $row ){
-                       $block = Block::newFromRow( $row );
+                       $block = self::newFromRow( $row );
 
                        # Don't use expired blocks
                        if( $block->deleteIfExpired() ){
@@ -368,6 +394,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 +438,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 +536,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 +695,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 +1105,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 +1116,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)
diff --git a/includes/CacheHelper.php b/includes/CacheHelper.php
new file mode 100644 (file)
index 0000000..5209857
--- /dev/null
@@ -0,0 +1,377 @@
+<?php
+/**
+ * Cache of various elements in a single cache 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
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+/**
+ * Interface for all classes implementing CacheHelper functionality.
+ *
+ * @since 1.20
+ */
+interface ICacheHelper {
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       function setCacheEnabled( $cacheEnabled );
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       function startCache( $cacheExpiry = null, $cacheEnabled = null );
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       function getCachedValue( $computeFunction, $args = array(), $key = null );
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       function saveCache();
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       function setExpiry( $cacheExpiry );
+
+}
+
+/**
+ * Helper class for caching various elements in a single cache entry.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * Before the first addCachedHTML call, you should call $this->startCache();
+ * After adding the last HTML that should be cached, call $this->saveCache();
+ *
+ * @since 1.20
+ */
+class CacheHelper implements ICacheHelper {
+
+       /**
+        * The time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        * @var integer
+        */
+       protected $cacheExpiry = 3600;
+
+       /**
+        * List of HTML chunks to be cached (if !hasCached) or that where cached (of hasCached).
+        * If not cached already, then the newly computed chunks are added here,
+        * if it as cached already, chunks are removed from this list as they are needed.
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $cachedChunks;
+
+       /**
+        * Indicates if the to be cached content was already cached.
+        * Null if this information is not available yet.
+        *
+        * @since 1.20
+        * @var boolean|null
+        */
+       protected $hasCached = null;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Function that gets called when initialization is done.
+        *
+        * @since 1.20
+        * @var function
+        */
+       protected $onInitHandler = false;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheEnabled = $cacheEnabled;
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               if ( is_null( $this->hasCached ) ) {
+                       if ( !is_null( $cacheExpiry ) ) {
+                               $this->cacheExpiry = $cacheExpiry;
+                       }
+
+                       if ( !is_null( $cacheEnabled ) ) {
+                               $this->setCacheEnabled( $cacheEnabled );
+                       }
+
+                       $this->initCaching();
+               }
+       }
+
+       /**
+        * Returns a message that notifies the user he/she is looking at
+        * a cached version of the page, including a refresh link.
+        *
+        * @since 1.20
+        *
+        * @param IContextSource $context
+        * @param boolean $includePurgeLink
+        *
+        * @return string
+        */
+       public function getCachedNotice( IContextSource $context, $includePurgeLink = true ) {
+               if ( $this->cacheExpiry < 86400 * 3650 ) {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ttl',
+                               $context->getLanguage()->formatDuration( $this->cacheExpiry )
+                       )->escaped();
+               }
+               else {
+                       $message = $context->msg(
+                               'cachedspecial-viewing-cached-ts'
+                       )->escaped();
+               }
+
+               if ( $includePurgeLink ) {
+                       $refreshArgs = $context->getRequest()->getQueryValues();
+                       unset( $refreshArgs['title'] );
+                       $refreshArgs['action'] = 'purge';
+
+                       $subPage = $context->getTitle()->getFullText();
+                       $subPage = explode( '/', $subPage, 2 );
+                       $subPage = count( $subPage ) > 1 ? $subPage[1] : false;
+
+                       $message .= ' ' . Linker::link(
+                               $context->getTitle( $subPage ),
+                               $context->msg( 'cachedspecial-refresh-now' )->escaped(),
+                               array(),
+                               $refreshArgs
+                       );
+               }
+
+               return $message;
+       }
+
+       /**
+        * Initializes the caching if not already done so.
+        * Should be called before any of the caching functionality is used.
+        *
+        * @since 1.20
+        */
+       protected function initCaching() {
+               if ( $this->cacheEnabled && is_null( $this->hasCached ) ) {
+                       $cachedChunks = wfGetCache( CACHE_ANYTHING )->get( $this->getCacheKeyString() );
+
+                       $this->hasCached = is_array( $cachedChunks );
+                       $this->cachedChunks = $this->hasCached ? $cachedChunks : array();
+
+                       if ( $this->onInitHandler !== false ) {
+                               call_user_func( $this->onInitHandler, $this->hasCached );
+                       }
+               }
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               $this->initCaching();
+
+               if ( $this->cacheEnabled && $this->hasCached ) {
+                       $value = null;
+
+                       if ( is_null( $key ) ) {
+                               $itemKey = array_keys( array_slice( $this->cachedChunks, 0, 1 ) );
+                               $itemKey = array_shift( $itemKey );
+
+                               if ( !is_integer( $itemKey ) ) {
+                                       wfWarn( "Attempted to get item with non-numeric key while the next item in the queue has a key ($itemKey) in " . __METHOD__ );
+                               }
+                               elseif ( is_null( $itemKey ) ) {
+                                       wfWarn( "Attempted to get an item while the queue is empty in " . __METHOD__ );
+                               }
+                               else {
+                                       $value = array_shift( $this->cachedChunks );
+                               }
+                       }
+                       else {
+                               if ( array_key_exists( $key, $this->cachedChunks ) ) {
+                                       $value = $this->cachedChunks[$key];
+                                       unset( $this->cachedChunks[$key] );
+                               }
+                               else {
+                                       wfWarn( "There is no item with key '$key' in this->cachedChunks in " . __METHOD__ );
+                               }
+                       }
+               }
+               else {
+                       if ( !is_array( $args ) ) {
+                               $args = array( $args );
+                       }
+
+                       $value = call_user_func_array( $computeFunction, $args );
+
+                       if ( $this->cacheEnabled ) {
+                               if ( is_null( $key ) ) {
+                                       $this->cachedChunks[] = $value;
+                               }
+                               else {
+                                       $this->cachedChunks[$key] = $value;
+                               }
+                       }
+               }
+
+               return $value;
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               if ( $this->cacheEnabled && $this->hasCached === false && !empty( $this->cachedChunks ) ) {
+                       wfGetCache( CACHE_ANYTHING )->set( $this->getCacheKeyString(), $this->cachedChunks, $this->cacheExpiry );
+               }
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry..
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheExpiry = $cacheExpiry;
+       }
+
+       /**
+        * Returns the cache key to use to cache this page's HTML output.
+        * Is constructed from the special page name and language code.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected function getCacheKeyString() {
+               return call_user_func_array( 'wfMemcKey', $this->cacheKey );
+       }
+
+       /**
+        * Sets the cache key that should be used.
+        *
+        * @since 1.20
+        *
+        * @param array $cacheKey
+        */
+       public function setCacheKey( array $cacheKey ) {
+               $this->cacheKey = $cacheKey;
+       }
+
+       /**
+        * Rebuild the content, even if it's already cached.
+        * This effectively has the same effect as purging the cache,
+        * since it will be overridden with the new value on the next request.
+        *
+        * @since 1.20
+        */
+       public function rebuildOnDemand() {
+               $this->hasCached = false;
+       }
+
+       /**
+        * Sets a function that gets called when initialization of the cache is done.
+        *
+        * @since 1.20
+        *
+        * @param $handlerFunction
+        */
+       public function setOnInitializedHandler( $handlerFunction ) {
+               $this->onInitHandler = $handlerFunction;
+       }
+
+}
index 4f1e423..7987069 100644 (file)
@@ -1,14 +1,33 @@
 <?php
+/**
+ * Representation for a category.
+ *
+ * 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 Simetrical
+ */
+
 /**
  * Category objects are immutable, strictly speaking. If you call methods that change the database,
  * like to refresh link counts, the objects will be appropriately reinitialized.
  * Member variables are lazy-initialized.
  *
  * TODO: Move some stuff from CategoryPage.php to here, and use that.
- *
- * @author Simetrical
  */
-
 class Category {
        /** Name of the category, normalized to DB-key form */
        private $mName = null;
index 3c7d89e..32e270e 100644 (file)
@@ -1,14 +1,26 @@
 <?php
 /**
- * Class for viewing MediaWiki category description pages.
+ * Special handling for category description pages.
  * Modelled after ImagePage.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
  */
 
-if ( !defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
 /**
  * Special handling for category description pages, showing pages,
  * subcategories and file that belong to the category
index dff3802..ddd01eb 100644 (file)
@@ -1,7 +1,24 @@
 <?php
-
-if ( !defined( 'MEDIAWIKI' ) )
-       die( 1 );
+/**
+ * List and paging of category members.
+ *
+ * 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 CategoryViewer extends ContextSource {
        var $limit, $from, $until,
@@ -105,7 +122,7 @@ class CategoryViewer extends ContextSource {
 
                // Give a proper message if category is empty
                if ( $r == '' ) {
-                       $r = wfMsgExt( 'category-empty', array( 'parse' ) );
+                       $r = $this->msg( 'category-empty' )->parseAsBlock();
                }
 
                $lang = $this->getLanguage();
@@ -352,7 +369,7 @@ class CategoryViewer extends ContextSource {
                if ( $rescnt > 0 ) {
                        # Showing subcategories
                        $r .= "<div id=\"mw-subcategories\">\n";
-                       $r .= '<h2>' . wfMsg( 'subcategories' ) . "</h2>\n";
+                       $r .= '<h2>' . $this->msg( 'subcategories' )->text() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'subcat' );
                        $r .= $this->formatList( $this->children, $this->children_start_char );
@@ -366,7 +383,7 @@ class CategoryViewer extends ContextSource {
         * @return string
         */
        function getPagesSection() {
-               $ti = htmlspecialchars( $this->title->getText() );
+               $ti = wfEscapeWikiText( $this->title->getText() );
                # Don't show articles section if there are none.
                $r = '';
 
@@ -381,7 +398,7 @@ class CategoryViewer extends ContextSource {
 
                if ( $rescnt > 0 ) {
                        $r = "<div id=\"mw-pages\">\n";
-                       $r .= '<h2>' . wfMsg( 'category_header', $ti ) . "</h2>\n";
+                       $r .= '<h2>' . $this->msg( 'category_header', $ti )->text() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'page' );
                        $r .= $this->formatList( $this->articles, $this->articles_start_char );
@@ -402,7 +419,7 @@ class CategoryViewer extends ContextSource {
                        $countmsg = $this->getCountMessage( $rescnt, $dbcnt, 'file' );
 
                        $r .= "<div id=\"mw-category-media\">\n";
-                       $r .= '<h2>' . wfMsg( 'category-media-header', htmlspecialchars( $this->title->getText() ) ) . "</h2>\n";
+                       $r .= '<h2>' . $this->msg( 'category-media-header', wfEscapeWikiText( $this->title->getText() ) )->text() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'file' );
                        if ( $this->showGallery ) {
@@ -559,7 +576,7 @@ class CategoryViewer extends ContextSource {
         * @return String HTML
         */
        private function pagingLinks( $first, $last, $type = '' ) {
-               $prevLink = wfMessage( 'prevn' )->numParams( $this->limit )->escaped();
+               $prevLink = $this->msg( 'prevn' )->numParams( $this->limit )->escaped();
 
                if ( $first != '' ) {
                        $prevQuery = $this->query;
@@ -573,7 +590,7 @@ class CategoryViewer extends ContextSource {
                        );
                }
 
-               $nextLink = wfMessage( 'nextn' )->numParams( $this->limit )->escaped();
+               $nextLink = $this->msg( 'nextn' )->numParams( $this->limit )->escaped();
 
                if ( $last != '' ) {
                        $lastQuery = $this->query;
@@ -587,7 +604,7 @@ class CategoryViewer extends ContextSource {
                        );
                }
 
-               return "($prevLink) ($nextLink)";
+               return $this->msg('categoryviewer-pagedlinks')->rawParams($prevLink, $nextLink)->escaped();
        }
 
        /**
@@ -671,8 +688,8 @@ class CategoryViewer extends ContextSource {
                        $this->cat->refreshCounts();
                } else {
                        # Case 3: hopeless.  Don't give a total count at all.
-                       return wfMessage( "category-$type-count-limited" )->numParams( $rescnt )->parseAsBlock();
+                       return $this->msg( "category-$type-count-limited" )->numParams( $rescnt )->parseAsBlock();
                }
-               return wfMessage( "category-$type-count" )->numParams( $rescnt, $totalcnt )->parseAsBlock();
+               return $this->msg( "category-$type-count" )->numParams( $rescnt, $totalcnt )->parseAsBlock();
        }
 }
index 4a8ed70..e2b6a0c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Recent changes filtering by category.
+ *
+ * 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
+ */
+
 /**
  * The "Categoryfinder" class takes a list of articles, creates an internal
  * representation of all their parent categories (as well as parents of
index 94aa192..ae2e5b1 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Native CDB file reader and writer
+ * Native CDB file reader and writer.
+ *
+ * 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 77b61cb..02be65f 100644 (file)
@@ -6,6 +6,21 @@
  *    * Exception thrown if sizes or offsets are between 2GB and 4GB
  *    * Some variables renamed
  *
+ * 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 0dbaac6..204df45 100644 (file)
@@ -1,9 +1,25 @@
 <?php
 /**
- * Functions related to change tags.
+ * Recent changes tagging.
+ *
+ * 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 ChangeTags {
 
        /**
index fa2188e..2954920 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Feed for list of changes.
+ *
+ * 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
+ */
 
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLiked
@@ -51,13 +71,13 @@ class ChangesFeed {
         * @param $rows ResultWrapper object with rows in recentchanges table
         * @param $lastmod Integer: timestamp of the last item in the recentchanges table (only used for the cache key)
         * @param $opts FormOptions as in SpecialRecentChanges::getDefaultOptions()
-        * @return null or true
+        * @return null|bool True or null
         */
        public function execute( $feed, $rows, $lastmod, $opts ) {
                global $wgLang, $wgRenderHashAppend;
 
                if ( !FeedUtils::checkFeedOutput( $this->format ) ) {
-                       return;
+                       return null;
                }
 
                $optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
index e0183c4..e5be12d 100644 (file)
@@ -1,10 +1,27 @@
 <?php
 /**
- * Classes to show various lists of changes:
+ * Classes to show lists of changes.
+ *
+ * These can be:
  * - watchlist
  * - related changes
  * - recent changes
  *
+ * 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
  */
 
@@ -106,7 +123,7 @@ class ChangesList extends ContextSource {
                if( !isset( $this->message ) ) {
                        foreach ( explode( ' ', 'cur diff hist last blocklink history ' .
                        'semicolon-separator pipe-separator' ) as $msg ) {
-                               $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
+                               $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
        }
@@ -182,22 +199,29 @@ class ChangesList extends ContextSource {
         * Show formatted char difference
         * @param $old Integer: bytes
         * @param $new Integer: bytes
+        * @param $context IContextSource context to use
         * @return String
         */
-       public static function showCharacterDifference( $old, $new ) {
-               global $wgRCChangedSizeThreshold, $wgLang, $wgMiserMode;
+       public static function showCharacterDifference( $old, $new, IContextSource $context = null ) {
+               global $wgRCChangedSizeThreshold, $wgMiserMode;
+
+               if ( !$context ) {
+                       $context = RequestContext::getMain();
+               }
+
                $szdiff = $new - $old;
 
-               $code = $wgLang->getCode();
+               $lang = $context->getLanguage();
+               $code = $lang->getCode();
                static $fastCharDiff = array();
                if ( !isset($fastCharDiff[$code]) ) {
-                       $fastCharDiff[$code] = $wgMiserMode || wfMsgNoTrans( 'rc-change-size' ) === '$1';
+                       $fastCharDiff[$code] = $wgMiserMode || $context->msg( 'rc-change-size' )->plain() === '$1';
                }
 
-               $formattedSize = $wgLang->formatNum($szdiff);
+               $formattedSize = $lang->formatNum( $szdiff );
 
                if ( !$fastCharDiff[$code] ) {
-                       $formattedSize = wfMsgExt( 'rc-change-size', array( 'parsemag' ), $formattedSize );
+                       $formattedSize = $context->msg( 'rc-change-size', $formattedSize )->text();
                }
 
                if( abs( $szdiff ) > abs( $wgRCChangedSizeThreshold ) ) {
@@ -217,11 +241,34 @@ class ChangesList extends ContextSource {
                        $formattedSizeClass = 'mw-plusminus-neg';
                }
 
-               $formattedTotalSize = wfMsgExt( 'rc-change-size-new', 'parsemag', $wgLang->formatNum( $new ) );
+               $formattedTotalSize = $context->msg( 'rc-change-size-new' )->numParams( $new )->text();
 
                return Html::element( $tag,
                        array( 'dir' => 'ltr', 'class' => $formattedSizeClass, 'title' => $formattedTotalSize ),
-                       wfMessage( 'parentheses', $formattedSize )->plain() ) . $wgLang->getDirMark();
+                       $context->msg( 'parentheses', $formattedSize )->plain() ) . $lang->getDirMark();
+       }
+
+       /**
+        * Format the character difference of one or several changes.
+        *
+        * @param $old RecentChange
+        * @param $new RecentChange last change to use, if not provided, $old will be used
+        * @return string HTML fragment
+        */
+       public function formatCharacterDifference( RecentChange $old, RecentChange $new = null ) {
+               $oldlen = $old->mAttribs['rc_old_len'];
+
+               if ( $new ) {
+                       $newlen = $new->mAttribs['rc_new_len'];
+               } else {
+                       $newlen = $old->mAttribs['rc_new_len'];
+               }
+
+               if( $oldlen === null || $newlen === null ) {
+                       return '';
+               }
+
+               return self::showCharacterDifference( $oldlen, $newlen, $this->getContext() );
        }
 
        /**
@@ -238,7 +285,7 @@ class ChangesList extends ContextSource {
 
        public function insertDateHeader( &$s, $rc_timestamp ) {
                # Make date header if necessary
-               $date = $this->getLanguage()->date( $rc_timestamp, true, true );
+               $date = $this->getLanguage()->userDate( $rc_timestamp, $this->getUser() );
                if( $date != $this->lastdate ) {
                        if( $this->lastdate != '' ) {
                                $s .= "</ul>\n";
@@ -341,7 +388,7 @@ class ChangesList extends ContextSource {
         */
        public function insertTimestamp( &$s, $rc ) {
                $s .= $this->message['semicolon-separator'] .
-                       $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true ) . ' . . ';
+                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . ';
        }
 
        /**
@@ -352,7 +399,7 @@ class ChangesList extends ContextSource {
         */
        public function insertUserRelatedLinks( &$s, &$rc ) {
                if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $s .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $s .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $s .= $this->getLanguage()->getDirMark() . Linker::userLink( $rc->mAttribs['rc_user'],
                                $rc->mAttribs['rc_user_text'] );
@@ -368,12 +415,13 @@ class ChangesList extends ContextSource {
         */
        public function insertLogEntry( $rc ) {
                $formatter = LogFormatter::newFromRow( $rc->mAttribs );
+               $formatter->setContext( $this->getContext() );
                $formatter->setShowUserToolLinks( true );
                $mark = $this->getLanguage()->getDirMark();
                return $formatter->getActionText() . " $mark" . $formatter->getComment();
        }
 
-       /** 
+       /**
         * Insert a formatted comment
         * @param $rc RecentChange
         * @return string
@@ -381,7 +429,7 @@ class ChangesList extends ContextSource {
        public function insertComment( $rc ) {
                if( $rc->mAttribs['rc_type'] != RC_MOVE && $rc->mAttribs['rc_type'] != RC_MOVE_OVER_REDIRECT ) {
                        if( $this->isDeleted( $rc, Revision::DELETED_COMMENT ) ) {
-                               return ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-comment' ) . '</span>';
+                               return ' <span class="history-deleted">' . $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                        } else {
                                return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle() );
                        }
@@ -405,8 +453,7 @@ class ChangesList extends ContextSource {
                static $cache = array();
                if( $count > 0 ) {
                        if( !isset( $cache[$count] ) ) {
-                               $cache[$count] = wfMsgExt( 'number_of_watching_users_RCview',
-                                       array('parsemag', 'escape' ), $this->getLanguage()->formatNum( $count ) );
+                               $cache[$count] = $this->msg( 'number_of_watching_users_RCview' )->numParams( $count )->escaped();
                        }
                        return $cache[$count];
                } else {
@@ -571,9 +618,9 @@ class OldChangesList extends ChangesList {
                # Edit/log timestamp
                $this->insertTimestamp( $s, $rc );
                # Bytes added or removed
-               if( $wgRCShowChangedSize ) {
-                       $cd = $rc->getCharacterDifference();
-                       if( $cd != '' ) {
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rc );
+                       if ( $cd !== '' ) {
                                $s .= "$cd  . . ";
                        }
                }
@@ -597,8 +644,7 @@ class OldChangesList extends ChangesList {
 
                # How many users watch this page
                if( $rc->numberofWatchingusers > 0 ) {
-                       $s .= ' ' . wfMsgExt( 'number_of_watching_users_RCview',
-                               array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $rc->numberofWatchingusers ) );
+                       $s .= ' ' . $this->numberofWatchingusers( $rc->numberofWatchingusers );
                }
 
                if( $this->watchlist ) {
@@ -650,7 +696,7 @@ class EnhancedChangesList extends ChangesList {
                $curIdEq = array( 'curid' => $rc->mAttribs['rc_cur_id'] );
 
                # If it's a new day, add the headline and flush the cache
-               $date = $this->getLanguage()->date( $rc->mAttribs['rc_timestamp'], true );
+               $date = $this->getLanguage()->userDate( $rc->mAttribs['rc_timestamp'], $this->getUser() );
                $ret = '';
                if( $date != $this->lastdate ) {
                        # Process current cache
@@ -698,7 +744,7 @@ class EnhancedChangesList extends ChangesList {
                        $showdifflinks = false;
                }
 
-               $time = $this->getLanguage()->time( $rc->mAttribs['rc_timestamp'], true, true );
+               $time = $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() );
                $rc->watched = $watched;
                $rc->link = $clink;
                $rc->timestamp = $time;
@@ -747,7 +793,7 @@ class EnhancedChangesList extends ChangesList {
 
                # Make user links
                if( $this->isDeleted( $rc, Revision::DELETED_USER ) ) {
-                       $rc->userlink = ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-user' ) . '</span>';
+                       $rc->userlink = ' <span class="history-deleted">' . $this->msg( 'rev-deleted-user' )->escaped() . '</span>';
                } else {
                        $rc->userlink = Linker::userLink( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
                        $rc->usertalklink = Linker::userToolLinks( $rc->mAttribs['rc_user'], $rc->mAttribs['rc_user_text'] );
@@ -857,8 +903,10 @@ class EnhancedChangesList extends ChangesList {
                        array_push( $users, $text );
                }
 
-               $users = ' <span class="changedby">[' .
-                       implode( $this->message['semicolon-separator'], $users ) . ']</span>';
+               $users = ' <span class="changedby">'
+                       . $this->msg( 'brackets' )->rawParams(
+                               implode( $this->message['semicolon-separator'], $users )
+                       )->escaped() . '</span>';
 
                $tl = '<span class="mw-collapsible-toggle mw-enhancedchanges-arrow"></span>';
                $r .= "<td>$tl</td>";
@@ -876,7 +924,7 @@ class EnhancedChangesList extends ChangesList {
 
                # Article link
                if( $namehidden ) {
-                       $r .= ' <span class="history-deleted">' . wfMsgHtml( 'rev-deleted-event' ) . '</span>';
+                       $r .= ' <span class="history-deleted">' . $this->msg( 'rev-deleted-event' )->escaped() . '</span>';
                } elseif( $allLogs ) {
                        $r .= $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
                } else {
@@ -890,7 +938,7 @@ class EnhancedChangesList extends ChangesList {
                $n = count($block);
                static $nchanges = array();
                if ( !isset( $nchanges[$n] ) ) {
-                       $nchanges[$n] = wfMsgExt( 'nchanges', array( 'parsemag', 'escape' ), $this->getLanguage()->formatNum( $n ) );
+                       $nchanges[$n] = $this->msg( 'nchanges' )->numParams( $n )->escaped();
                }
                # Total change link
                $r .= ' ';
@@ -951,8 +999,7 @@ class EnhancedChangesList extends ChangesList {
                                $first--;
                        }
                        # Get net change
-                       $chardiff = $rcObj->getCharacterDifference( $block[$first]->mAttribs['rc_old_len'],
-                               $block[$last]->mAttribs['rc_new_len'] );
+                       $chardiff = $this->formatCharacterDifference( $block[$first], $block[$last] );
 
                        if( $chardiff == '' ) {
                                $r .= ' ';
@@ -1013,8 +1060,11 @@ class EnhancedChangesList extends ChangesList {
                        $r .= ' . . ';
 
                        # Character diff
-                       if( $wgRCShowChangedSize && $rcObj->getCharacterDifference() ) {
-                               $r .= $rcObj->getCharacterDifference() . ' . . ' ;
+                       if ( $wgRCShowChangedSize ) {
+                               $cd = $this->formatCharacterDifference( $rcObj );
+                               if ( $cd !== '' ) {
+                                       $r .= "$cd . . ";
+                               }
                        }
 
                        if ( $rcObj->mAttribs['rc_type'] == RC_LOG ) {
@@ -1063,9 +1113,8 @@ class EnhancedChangesList extends ChangesList {
         * @return String: HTML <img> tag
         */
        protected function sideArrow() {
-               global $wgLang;
-               $dir = $wgLang->isRTL() ? 'l' : 'r';
-               return $this->arrow( $dir, '+', wfMsg( 'rc-enhanced-expand' ) );
+               $dir = $this->getLanguage()->isRTL() ? 'l' : 'r';
+               return $this->arrow( $dir, '+', $this->msg( 'rc-enhanced-expand' )->text() );
        }
 
        /**
@@ -1074,7 +1123,7 @@ class EnhancedChangesList extends ChangesList {
         * @return String: HTML <img> tag
         */
        protected function downArrow() {
-               return $this->arrow( 'd', '-', wfMsg( 'rc-enhanced-hide' ) );
+               return $this->arrow( 'd', '-', $this->msg( 'rc-enhanced-hide' )->text() );
        }
 
        /**
@@ -1143,16 +1192,19 @@ class EnhancedChangesList extends ChangesList {
                }
                $r .= ' . . ';
                # Character diff
-               if( $wgRCShowChangedSize && ($cd = $rcObj->getCharacterDifference()) ) {
-                       $r .= "$cd . . ";
+               if ( $wgRCShowChangedSize ) {
+                       $cd = $this->formatCharacterDifference( $rcObj );
+                       if ( $cd !== '' ) {
+                               $r .= "$cd . . ";
+                       }
                }
 
                if ( $type == RC_LOG ) {
                        $r .= $this->insertLogEntry( $rcObj );
-               } else { 
+               } else {
                        $r .= ' '.$rcObj->userlink . $rcObj->usertalklink;
                        $r .= $this->insertComment( $rcObj );
-                       $r .= $this->insertRollback( $r, $rcObj );
+                       $this->insertRollback( $r, $rcObj );
                }
 
                # Tags
index e4ffae6..ad2b94b 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Database row sorting.
+ *
+ * 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
+ */
 
 abstract class Collation {
        static $instance;
index 8fa6233..b68fc76 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Configuration file editor.
+ *
+ * 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
+ */
 
 /**
  * This is a state machine style parser with two internal stacks:
index b76212e..1ca02b5 100644 (file)
@@ -1,6 +1,24 @@
 <?php
 /**
- * @defgroup HTTP HTTP
+ * Cookie for HTTP 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 HTTP
  */
 
 class Cookie {
index 95905fb..bb80eeb 100644 (file)
@@ -5,6 +5,21 @@
  * This is based in part on Drupal code as well as what we used in our own code
  * prior to introduction of this 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
+ *
  * @author Daniel Friesen
  * @file
  */
diff --git a/includes/DataUpdate.php b/includes/DataUpdate.php
new file mode 100644 (file)
index 0000000..7203c3b
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Base code for update jobs that do something with some secondary
+ * data extracted from article.
+ *
+ * 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
+ */
+
+/**
+ * Abstract base class for update jobs that do something with some secondary
+ * data extracted from article.
+ */
+abstract class DataUpdate implements DeferrableUpdate {
+
+       /**
+        * Constructor
+        */
+       public function __construct( ) {
+               # noop
+       }
+
+       /**
+        * Begin an appropriate transaction, if any.
+        * This default implementation does nothing.
+        */
+       public function beginTransaction() {
+               //noop
+       }
+
+       /**
+        * Commit the transaction started via beginTransaction, if any.
+        * This default implementation does nothing.
+        */
+       public function commitTransaction() {
+               //noop
+       }
+
+       /**
+        * Abort / roll back the transaction started via beginTransaction, if any.
+        * This default implementation does nothing.
+        */
+       public function rollbackTransaction() {
+               //noop
+       }
+
+       /**
+        * Convenience method, calls doUpdate() on every DataUpdate in the array.
+        *
+        * This methods supports transactions logic by first calling beginTransaction()
+        * on all updates in the array, then calling doUpdate() on each, and, if all goes well,
+        * then calling commitTransaction() on each update. If an error occurrs,
+        * rollbackTransaction() will be called on any update object that had beginTranscation()
+        * called but not yet commitTransaction().
+        *
+        * This allows for limited transactional logic across multiple backends for storing
+        * secondary data.
+        *
+        * @static
+        * @param $updates array a list of DataUpdate instances
+        */
+       public static function runUpdates( $updates ) {
+               if ( empty( $updates ) ) return; # nothing to do
+
+               $open_transactions = array();
+               $exception = null;
+
+               /**
+                * @var $update StorageUpdate
+                * @var $trans StorageUpdate
+                */
+
+               try {
+                       // begin transactions
+                       foreach ( $updates as $update ) {
+                               $update->beginTransaction();
+                               $open_transactions[] = $update;
+                       }
+
+                       // do work
+                       foreach ( $updates as $update ) {
+                               $update->doUpdate();
+                       }
+
+                       // commit transactions
+                       while ( count( $open_transactions ) > 0 ) {
+                               $trans = array_pop( $open_transactions );
+                               $trans->commitTransaction();
+                       }
+               } catch ( Exception $ex ) {
+                       $exception = $ex;
+                       wfDebug( "Caught exception, will rethrow after rollback: " . $ex->getMessage() );
+               }
+
+               // rollback remaining transactions
+               while ( count( $open_transactions ) > 0 ) {
+                       $trans = array_pop( $open_transactions );
+                       $trans->rollbackTransaction();
+               }
+
+               if ( $exception ) {
+                       throw $exception; // rethrow after cleanup
+               }
+       }
+
+}
index 6788984..35ae6bd 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
- * @file
+ * Default values for configuration settings.
+ *
  *
  *                 NEVER EDIT THIS FILE
  *
  *
  * Documentation is in the source and on:
  * http://www.mediawiki.org/wiki/Manual:Configuration_settings
+ *
+ * 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
  */
 
 /**
@@ -222,7 +240,16 @@ $wgAppleTouchIcon = false;
  * The local filesystem path to a temporary directory. This is not required to
  * be web accessible.
  *
- * Will default to "{$wgUploadDirectory}/tmp" in Setup.php
+ * When this setting is set to false, its value will be set through a call
+ * to wfTempDir(). See that methods implementation for the actul detection
+ * logic.
+ *
+ * Developers should use the global function wfTempDir() instead of this
+ * variable.
+ *
+ * @see wfTempDir()
+ * @note Default modified to false in v1.20
+ *
  */
 $wgTmpDirectory = false;
 
@@ -310,9 +337,11 @@ $wgImgAuthPublicTest = true;
  *   - zones            Associative array of zone names that each map to an array with:
  *                          container : backend container name the zone is in
  *                          directory : root path within container for the zone
- *                      Zones default to using <repo name>-<zone> as the
- *                      container name and the container root as the zone directory.
- *   - url              Base public URL
+ *                          url       : base URL to the root of the zone
+ *                      Zones default to using <repo name>-<zone name> as the container name
+ *                      and default to using the container root as the zone's root directory.
+ *                      Nesting of zone locations within other zones should be avoided.
+ *   - url              Public zone URL. The 'zones' settings take precedence.
  *   - hashLevels       The number of directory levels for hash-based division of files
  *   - thumbScriptUrl   The URL for thumb.php (optional, not recommended)
  *   - transformVia404  Whether to skip media file transformation on parse and rely on a 404
@@ -941,8 +970,7 @@ $wgImageLimits = array(
        array( 640, 480 ),
        array( 800, 600 ),
        array( 1024, 768 ),
-       array( 1280, 1024 ),
-       array( 10000, 10000 )
+       array( 1280, 1024 )
 );
 
 /**
@@ -1299,6 +1327,7 @@ $wgSharedTables = array( 'user', 'user_properties' );
  *                  - DBO_TRX -- wrap entire request in a transaction
  *                  - DBO_IGNORE -- ignore errors (not useful in LocalSettings.php)
  *                  - DBO_NOBUFFER -- turn off buffering (not useful in LocalSettings.php)
+ *                  - DBO_PERSISTENT -- enables persistent database connections
  *
  *   - max lag:     (optional) Maximum replication lag before a slave will taken out of rotation
  *   - max threads: (optional) Maximum number of running threads
@@ -1352,9 +1381,6 @@ $wgDBClusterTimeout = 10;
  */
 $wgDBAvgStatusPoll = 2000;
 
-/** Set to true if using InnoDB tables */
-$wgDBtransactions = false;
-
 /**
  * Set to true to engage MySQL 4.1/5.0 charset-related features;
  * for now will just cause sending of 'SET NAMES=utf8' on connect.
@@ -1593,6 +1619,7 @@ $wgObjectCaches = array(
        'xcache' => array( 'class' => 'XCacheBagOStuff' ),
        'wincache' => array( 'class' => 'WinCacheBagOStuff' ),
        'memcached-php' => array( 'class' => 'MemcachedPhpBagOStuff' ),
+       'memcached-pecl' => array( 'class' => 'MemcachedPeclBagOStuff' ),
        'hash' => array( 'class' => 'HashBagOStuff' ),
 );
 
@@ -1874,12 +1901,12 @@ $wgMaxSquidPurgeTitles = 400;
  * Routing configuration for HTCP multicast purging. Add elements here to
  * enable HTCP and determine which purges are sent where. If set to an empty
  * array, HTCP is disabled.
- * 
+ *
  * Each key in this array is a regular expression to match against the purged
  * URL, or an empty string to match all URLs. The purged URL is matched against
  * the regexes in the order specified, and the first rule whose regex matches
  * is used.
- * 
+ *
  * Example configuration to send purges for upload.wikimedia.org to one
  * multicast group and all other purges to another:
  * $wgHTCPMulticastRouting = array(
@@ -1892,7 +1919,7 @@ $wgMaxSquidPurgeTitles = 400;
  *                 'port' => 4827,
  *         ),
  * );
- * 
+ *
  * @see $wgHTCPMulticastTTL
  */
 $wgHTCPMulticastRouting = array();
@@ -1902,12 +1929,12 @@ $wgHTCPMulticastRouting = array();
  *
  * Note that MediaWiki uses the old non-RFC compliant HTCP format, which was
  * present in the earliest Squid implementations of the protocol.
- * 
+ *
  * This setting is DEPRECATED in favor of $wgHTCPMulticastRouting , and kept
  * for backwards compatibility only. If $wgHTCPMulticastRouting is set, this
  * setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
  * is, it is used to populate $wgHTCPMulticastRouting.
- * 
+ *
  * @deprecated in favor of $wgHTCPMulticastRouting
  */
 $wgHTCPMulticastAddress = false;
@@ -3438,12 +3465,19 @@ $wgSysopEmailBans = true;
  * Limits on the possible sizes of range blocks.
  *
  * CIDR notation is hard to understand, it's easy to mistakenly assume that a
- * /1 is a small range and a /31 is a large range. Setting this to half the
- * number of bits avoids such errors.
+ * /1 is a small range and a /31 is a large range. For IPv4, setting a limit of
+ * half the number of bits avoids such errors, and allows entire ISPs to be
+ * blocked using a small number of range blocks.
+ *
+ * For IPv6, RFC 3177 recommends that a /48 be allocated to every residential
+ * customer, so range blocks larger than /64 (half the number of bits) will
+ * plainly be required. RFC 4692 implies that a very large ISP may be
+ * allocated a /19 if a generous HD-Ratio of 0.8 is used, so we will use that
+ * as our limit. As of 2012, blocking the whole world would require a /4 range.
  */
 $wgBlockCIDRLimit = array(
        'IPv4' => 16, # Blocks larger than a /16 (64k addresses) will not be allowed
-       'IPv6' => 64, # 2^64 = ~1.8x10^19 addresses
+       'IPv6' => 19,
 );
 
 /**
@@ -3815,21 +3849,6 @@ $wgSpamRegex = array();
 /** Same as the above except for edit summaries */
 $wgSummarySpamRegex = array();
 
-/**
- * Similarly you can get a function to do the job. The function will be given
- * the following args:
- *   - a Title object for the article the edit is made on
- *   - the text submitted in the textarea (wpTextbox1)
- *   - the section number.
- * The return should be boolean indicating whether the edit matched some evilness:
- *  - true : block it
- *  - false : let it through
- *
- * @deprecated since 1.17 Use hooks. See SpamBlacklist extension.
- * @var $wgFilterCallback bool|string|Closure
- */
-$wgFilterCallback = false;
-
 /**
  * Whether to use DNS blacklists in $wgDnsBlacklistUrls to check for open proxies
  * @since 1.16
@@ -4157,11 +4176,23 @@ $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
  */
 $wgShowHostnames = false;
 
+/**
+ * Override server hostname detection with a hardcoded value.
+ * Should be a string, default false.
+ * @since 1.20
+ */
+$wgOverrideHostname = false;
+
 /**
  * If set to true MediaWiki will throw notices for some possible error
  * conditions and for deprecated functions.
@@ -4238,6 +4269,14 @@ $wgAggregateStatsID = false;
  */
 $wgDisableCounters = false;
 
+/**
+ * Set this to an integer to only do synchronous site_stats updates
+ * one every *this many* updates. The other requests go into pending
+ * delta values in $wgMemc. Make sure that $wgMemc is a global cache.
+ * If set to -1, updates *only* go to $wgMemc (useful for daemons).
+ */
+$wgSiteStatsAsyncFactor = false;
+
 /**
  * Parser test suite files to be run by parserTests.php when no specific
  * filename is passed to it.
@@ -4578,6 +4617,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 }
 
 /************************************************************************//**
@@ -5729,6 +5782,19 @@ $wgCompiledFiles = array();
 /** @} */ # End of HipHop compilation }
 
 
+/************************************************************************//**
+ * @name   Mobile support
+ * @{
+ */
+
+/**
+ * Name of the class used for mobile device detection, must be inherited from
+ * IDeviceDetector.
+ */
+$wgDeviceDetectionClass = 'DeviceDetection';
+
+/** @} */ # End of Mobile support }
+
 /************************************************************************//**
  * @name   Miscellaneous
  * @{
index 262994e..00af974 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Interface and manager for deferred updates.
+ *
+ * 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
+ */
+
 /**
  * Interface that deferrable updates should implement. Basically required so we
  * can validate input on DeferredUpdates::addUpdate()
index e40c9b2..d0f0c26 100644 (file)
@@ -6,6 +6,21 @@
  * since this file will not be executed during request startup for a compiled
  * MediaWiki.
  *
+ * 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 39c5cab..4d7b968 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Delayed loading of deprecated global 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
+ */
+
 /**
  * Class to allow throwing wfDeprecated warnings
  * when people use globals that we do not want them to.
index 69187e4..6e6f825 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * Contains the EditPage class
+ * Page edition user 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
  */
 
@@ -36,11 +52,6 @@ class EditPage {
         */
        const AS_HOOK_ERROR                = 210;
 
-       /**
-        * Status: The filter function set in $wgFilterCallback returned true (= block it)
-        */
-       const AS_FILTERING                 = 211;
-
        /**
         * Status: A hook function returned an error
         */
@@ -144,6 +155,11 @@ class EditPage {
         */
        const AS_IMAGE_REDIRECT_LOGGED     = 234;
 
+       /**
+        * HTML id and name for the beginning of the edit form.
+        */
+       const EDITFORM_ID                  = 'editform';
+
        /**
         * @var Article
         */
@@ -819,7 +835,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;
@@ -968,7 +984,6 @@ class EditPage {
                $bot = $wgUser->isAllowed( 'bot' ) && $this->bot;
                $status = $this->internalAttemptSave( $resultDetails, $bot );
                // FIXME: once the interface for internalAttemptSave() is made nicer, this should use the message in $status
-
                if ( $status->value == self::AS_SUCCESS_UPDATE || $status->value == self::AS_SUCCESS_NEW_ARTICLE ) {
                        $this->didSave = true;
                }
@@ -985,7 +1000,6 @@ class EditPage {
                                return true;
 
                        case self::AS_HOOK_ERROR:
-                       case self::AS_FILTERING:
                                return false;
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
@@ -1040,8 +1054,15 @@ class EditPage {
                                $permission = $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage';
                                throw new PermissionsError( $permission );
 
+                       default:
+                               // We don't recognize $status->value. The only way that can happen
+                               // is if an extension hook aborted from inside ArticleSave.
+                               // Render the status object into $this->hookError
+                               // FIXME this sucks, we should just use the Status object throughout
+                               $this->hookError = '<div class="error">' . $status->getWikitext() .
+                                       '</div>';
+                               return true;
                }
-               return false;
        }
 
        /**
@@ -1057,8 +1078,7 @@ class EditPage {
         * AS_CONTENT_TOO_BIG and AS_BLOCKED_PAGE_FOR_USER. All that stuff needs to be cleaned up some time.
         */
        function internalAttemptSave( &$result, $bot = false ) {
-               global $wgFilterCallback, $wgUser, $wgRequest, $wgParser;
-               global $wgMaxArticleSize;
+               global $wgUser, $wgRequest, $wgParser, $wgMaxArticleSize;
 
                $status = Status::newGood();
 
@@ -1104,13 +1124,6 @@ class EditPage {
                        wfProfileOut( __METHOD__ );
                        return $status;
                }
-               if ( $wgFilterCallback && is_callable( $wgFilterCallback ) && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section, $this->hookError, $this->summary ) ) {
-                       # Error messages or other handling should be performed by the filter function
-                       $status->setResult( false, self::AS_FILTERING );
-                       wfProfileOut( __METHOD__ . '-checks' );
-                       wfProfileOut( __METHOD__ );
-                       return $status;
-               }
                if ( !wfRunHooks( 'EditFilter', array( $this, $this->textbox1, $this->section, &$this->hookError, $this->summary ) ) ) {
                        # Error messages etc. could be handled within the hook...
                        $status->fatal( 'hookaborted' );
@@ -1188,9 +1201,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*
@@ -1259,10 +1273,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 ) {
@@ -1438,8 +1449,17 @@ class EditPage {
                        wfProfileOut( __METHOD__ );
                        return $status;
                } else {
-                       $this->isConflict = true;
-                       $doEditStatus->value = self::AS_END; // Destroys data doEdit() put in $status->value but who cares
+                       // Failure from doEdit()
+                       // Show the edit conflict page for certain recognized errors from doEdit(),
+                       // but don't show it for errors from extension hooks
+                       $errors = $doEditStatus->getErrorsArray();
+                       if ( in_array( $errors[0][0], array( 'edit-gone-missing', 'edit-conflict',
+                               'edit-already-exists' ) ) )
+                       {
+                               $this->isConflict = true;
+                               // Destroys data doEdit() put in $status->value but who cares
+                               $doEditStatus->value = self::AS_END;
+                       }
                        wfProfileOut( __METHOD__ );
                        return $doEditStatus;
                }
@@ -1609,13 +1629,13 @@ class EditPage {
                } elseif ( $contextTitle->exists() && $this->section != '' ) {
                        $msg = $this->section == 'new' ? 'editingcomment' : 'editingsection';
                } else {
-                       $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?\r
-                               'editing' : 'creating';\r
+                       $msg = $contextTitle->exists() || ( $contextTitle->getNamespace() == NS_MEDIAWIKI && $contextTitle->getDefaultMessageText() !== false ) ?
+                               'editing' : 'creating';
                }
                # Use the title defined by DISPLAYTITLE magic word when present
-               $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;\r
-               if ( $displayTitle === false ) {\r
-                       $displayTitle = $contextTitle->getPrefixedText();\r
+               $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
+               if ( $displayTitle === false ) {
+                       $displayTitle = $contextTitle->getPrefixedText();
                }
                $wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) );
        }
@@ -1769,7 +1789,7 @@ class EditPage {
                        }
                }
 
-               $wgOut->addHTML( Html::openElement( 'form', array( 'id' => 'editform', 'name' => 'editform',
+               $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
                        'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
                        'enctype' => 'multipart/form-data' ) ) );
 
@@ -1913,7 +1933,7 @@ class EditPage {
 
                # Optional notices on a per-namespace and per-page basis
                $editnotice_ns = 'editnotice-' . $this->mTitle->getNamespace();
-               $editnotice_ns_message = wfMessage( $editnotice_ns )->inContentLanguage();
+               $editnotice_ns_message = wfMessage( $editnotice_ns );
                if ( $editnotice_ns_message->exists() ) {
                        $wgOut->addWikiText( $editnotice_ns_message->plain() );
                }
@@ -1922,7 +1942,7 @@ class EditPage {
                        $editnotice_base = $editnotice_ns;
                        while ( count( $parts ) > 0 ) {
                                $editnotice_base .= '-' . array_shift( $parts );
-                               $editnotice_base_msg = wfMessage( $editnotice_base )->inContentLanguage();
+                               $editnotice_base_msg = wfMessage( $editnotice_base );
                                if ( $editnotice_base_msg->exists() ) {
                                        $wgOut->addWikiText( $editnotice_base_msg->plain() );
                                }
@@ -1930,7 +1950,7 @@ class EditPage {
                } else {
                        # Even if there are no subpages in namespace, we still don't want / in MW ns.
                        $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
-                       $editnoticeMsg = wfMessage( $editnoticeText )->inContentLanguage();
+                       $editnoticeMsg = wfMessage( $editnoticeText );
                        if ( $editnoticeMsg->exists() ) {
                                $wgOut->addWikiText( $editnoticeMsg->plain() );
                        }
@@ -2550,7 +2570,7 @@ HTML
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgParser, $wgRawHtml;
+               global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
 
                wfProfileIn( __METHOD__ );
 
@@ -2578,7 +2598,8 @@ HTML
                } elseif ( $this->incompleteForm ) {
                        $note = wfMsg( 'edit_form_incomplete' );
                } else {
-                       $note = wfMsg( 'previewnote' );
+                       $note = wfMsg( 'previewnote' ) .
+                               ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMsg( 'continue-editing' ) . ']]';
                }
 
                $parserOptions = ParserOptions::newFromUser( $wgUser );
@@ -2588,9 +2609,7 @@ HTML
                $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
 
                # don't parse non-wikitext pages, show message about preview
-               # XXX: stupid php bug won't let us use $this->getContextTitle()->isCssJsSubpage() here -- This note has been there since r3530. Sure the bug was fixed time ago?
-
-               if ( $this->isCssJsSubpage || !$this->mTitle->isWikitextPage() ) {
+               if ( $this->mTitle->isCssJsSubpage() || !$this->mTitle->isWikitextPage() ) {
                        if ( $this->mTitle->isCssJsSubpage() ) {
                                $level = 'user';
                        } elseif ( $this->mTitle->isCssOrJsPage() ) {
@@ -2601,20 +2620,23 @@ HTML
 
                        # Used messages to make sure grep find them:
                        # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+                       $class = 'mw-code';
                        if ( $level ) {
                                if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
                                        $previewtext = "<div id='mw-{$level}csspreview'>\n" . wfMsg( "{$level}csspreview" ) . "\n</div>";
-                                       $class = "mw-code mw-css";
+                                       $class .= " mw-css";
                                } elseif ( preg_match( "/\\.js$/", $this->mTitle->getText() ) ) {
                                        $previewtext = "<div id='mw-{$level}jspreview'>\n" . wfMsg( "{$level}jspreview" ) . "\n</div>";
-                                       $class = "mw-code mw-js";
+                                       $class .= " mw-js";
                                } else {
                                        throw new MWException( 'A CSS/JS (sub)page but which is not css nor js!' );
                                }
+                               $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
+                               $previewHTML = $parserOutput->getText();
+                       } else {
+                               $previewHTML = '';
                        }
 
-                       $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
-                       $previewHTML = $parserOutput->mText;
                        $previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
                } else {
                        $toparse = $this->textbox1;
index c75da5a..502f2ad 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Exception class and handler
+ * Exception class and handler.
+ *
+ * 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
  */
@@ -15,6 +30,8 @@
  * @ingroup Exception
  */
 class MWException extends Exception {
+       var $logId;
+
        /**
         * Should the exception use $wgOut to output the error ?
         * @return bool
@@ -53,11 +70,11 @@ class MWException extends Exception {
                global $wgExceptionHooks;
 
                if ( !isset( $wgExceptionHooks ) || !is_array( $wgExceptionHooks ) ) {
-                       return; // Just silently ignore
+                       return null; // Just silently ignore
                }
 
                if ( !array_key_exists( $name, $wgExceptionHooks ) || !is_array( $wgExceptionHooks[ $name ] ) ) {
-                       return;
+                       return null;
                }
 
                $hooks = $wgExceptionHooks[ $name ];
@@ -74,6 +91,7 @@ class MWException extends Exception {
                                return $result;
                        }
                }
+               return null;
        }
 
        /**
@@ -110,9 +128,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. -->";
                }
        }
 
@@ -141,6 +164,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
@@ -150,6 +180,7 @@ class MWException extends Exception {
        function getLogMessage() {
                global $wgRequest;
 
+               $id = $this->getLogId();
                $file = $this->getFile();
                $line = $this->getLine();
                $message = $this->getMessage();
@@ -163,7 +194,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 */
@@ -197,10 +228,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' ) ) {
@@ -210,6 +246,9 @@ class MWException extends Exception {
                } elseif ( self::isCommandLine() ) {
                        MWExceptionHandler::printError( $this->getText() );
                } else {
+                       header( "HTTP/1.1 500 MediaWiki exception" );
+                       header( "Status: 500 MediaWiki exception", true );
+
                        $this->reportHTML();
                }
        }
@@ -253,7 +292,13 @@ class ErrorPageError extends MWException {
        public $title, $msg, $params;
 
        /**
+        * @todo document
+        *
         * Note: these arguments are keys into wfMsg(), not text!
+        *
+        * @param $title A title
+        * @param $msg String|Message . In string form, should be a message key
+        * @param $params Array Array to wfMsg()
         */
        function __construct( $title, $msg, $params = null ) {
                $this->title = $title;
@@ -418,6 +463,49 @@ class UserBlockedError extends ErrorPageError {
        }
 }
 
+/**
+ * Shows a generic "user is not logged in" error page.
+ *
+ * This is essentially an ErrorPageError exception which by default use the
+ * 'exception-nologin' as a title and 'exception-nologin-text' for the message.
+ * @see bug 37627
+ *
+ * @par Example:
+ * @code
+ * if( $user->isAnon ) {
+ *     throw new UserNotLoggedIn();
+ * }
+ * @endcode
+ *
+ * Please note the parameters are mixed up compared to ErrorPageError, this
+ * is done to be able to simply specify a reason whitout overriding the default
+ * title.
+ *
+ * @par Example:
+ * @code
+ * if( $user->isAnon ) {
+ *     throw new UserNotLoggedIn( 'action-require-loggedin' );
+ * }
+ * @endcode
+ *
+ * @param $reasonMsg A message key containing the reason for the error.
+ *        Optional, default: 'exception-nologin-text'
+ * @param $titleMsg A message key to set the page title.
+ *        Optional, default: 'exception-nologin'
+ * @param $params Parameters to wfMsg().
+ *        Optiona, default: null
+ */
+class UserNotLoggedIn extends ErrorPageError {
+
+       public function __construct(
+               $reasonMsg = 'exception-nologin-text',
+               $titleMsg  = 'exception-nologin',
+               $params = null
+       ) {
+               parent::__construct( $titleMsg, $reasonMsg, $params );
+       }
+}
+
 /**
  * Show an error that looks like an HTTP server error.
  * Replacement for wfHttpError().
@@ -441,7 +529,7 @@ class HttpError extends MWException {
                $this->content = $content;
        }
 
-       public function reportHTML() {
+       public function report() {
                $httpMessage = HttpStatus::getMessage( $this->httpCode );
 
                header( "Status: {$this->httpCode} {$httpMessage}" );
@@ -461,7 +549,7 @@ class HttpError extends MWException {
                        $content = htmlspecialchars( $this->content );
                }
 
-               print "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n".
+               print "<!DOCTYPE html>\n".
                        "<html><head><title>$header</title></head>\n" .
                        "<body><h1>$header</h1><p>$content</p></body></html>\n";
        }
index 73b07c3..36d98d6 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...
@@ -309,7 +338,7 @@ class WikiExporter {
                        } elseif ( $this->history & WikiExporter::RANGE ) {
                                # Dump of revisions within a specified range
                                $join['revision'] = array( 'INNER JOIN', 'page_id=rev_page' );
-                               $opts['ORDER BY'] = 'rev_page ASC, rev_id ASC';
+                               $opts['ORDER BY'] = array( 'rev_page ASC', 'rev_id ASC' );
                        } else {
                                # Uknown history specification parameter?
                                wfProfileOut( __METHOD__ );
@@ -419,6 +448,9 @@ class WikiExporter {
                }
        }
 
+       /**
+        * @param $resultset array
+        */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
                        $output = $this->writer->writeLogItem( $row );
@@ -436,7 +468,7 @@ class XmlDumpWriter {
         * @return string
         */
        function schemaVersion() {
-               return "0.6";
+               return "0.7";
        }
 
        /**
@@ -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";
@@ -576,6 +626,9 @@ class XmlDumpWriter {
 
                $out  = "    <revision>\n";
                $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
+               if( $row->rev_parent_id ) {
+                       $out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
+               }
 
                $out .= $this->writeTimestamp( $row->rev_timestamp );
 
@@ -591,7 +644,13 @@ 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";
+               }
+
+               if ( $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
+                       $out .= "      " . Xml::element('sha1', null, strval( $row->rev_sha1 ) ) . "\n";
+               } else {
+                       $out .= "      <sha1/>\n";
                }
 
                $text = '';
@@ -610,12 +669,6 @@ class XmlDumpWriter {
                                "" ) . "\n";
                }
 
-               if ( $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
-                       $out .= "      " . Xml::element('sha1', null, strval( $row->rev_sha1 ) ) . "\n";
-               } else {
-                       $out .= "      <sha1/>\n";
-               }
-
                wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
 
                $out .= "    </revision>\n";
@@ -635,65 +688,76 @@ class XmlDumpWriter {
        function writeLogItem( $row ) {
                wfProfileIn( __METHOD__ );
 
-               $out  = "    <logitem>\n";
-               $out .= "      " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
+               $out  = "  <logitem>\n";
+               $out .= "    " . Xml::element( 'id', null, strval( $row->log_id ) ) . "\n";
 
-               $out .= $this->writeTimestamp( $row->log_timestamp );
+               $out .= $this->writeTimestamp( $row->log_timestamp, "    " );
 
                if ( $row->log_deleted & LogPage::DELETED_USER ) {
-                       $out .= "      " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
+                       $out .= "    " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
                } else {
-                       $out .= $this->writeContributor( $row->log_user, $row->user_name );
+                       $out .= $this->writeContributor( $row->log_user, $row->user_name, "    " );
                }
 
                if ( $row->log_deleted & LogPage::DELETED_COMMENT ) {
-                       $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
+                       $out .= "    " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( $row->log_comment != '' ) {
-                       $out .= "      " . Xml::elementClean( 'comment', null, strval( $row->log_comment ) ) . "\n";
+                       $out .= "    " . Xml::elementClean( 'comment', null, strval( $row->log_comment ) ) . "\n";
                }
 
-               $out .= "      " . Xml::element( 'type', null, strval( $row->log_type ) ) . "\n";
-               $out .= "      " . Xml::element( 'action', null, strval( $row->log_action ) ) . "\n";
+               $out .= "    " . Xml::element( 'type', null, strval( $row->log_type ) ) . "\n";
+               $out .= "    " . Xml::element( 'action', null, strval( $row->log_action ) ) . "\n";
 
                if ( $row->log_deleted & LogPage::DELETED_ACTION ) {
-                       $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
+                       $out .= "    " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
                } else {
                        $title = Title::makeTitle( $row->log_namespace, $row->log_title );
-                       $out .= "      " . Xml::elementClean( 'logtitle', null, self::canonicalTitle( $title ) ) . "\n";
-                       $out .= "      " . Xml::elementClean( 'params',
+                       $out .= "    " . Xml::elementClean( 'logtitle', null, self::canonicalTitle( $title ) ) . "\n";
+                       $out .= "    " . Xml::elementClean( 'params',
                                array( 'xml:space' => 'preserve' ),
                                strval( $row->log_params ) ) . "\n";
                }
 
-               $out .= "    </logitem>\n";
+               $out .= "  </logitem>\n";
 
                wfProfileOut( __METHOD__ );
                return $out;
        }
 
-       function writeTimestamp( $timestamp ) {
+       /**
+        * @param $timestamp string
+        * @return string
+        */
+       function writeTimestamp( $timestamp, $indent = "      " ) {
                $ts = wfTimestamp( TS_ISO_8601, $timestamp );
-               return "      " . Xml::element( 'timestamp', null, $ts ) . "\n";
+               return $indent . Xml::element( 'timestamp', null, $ts ) . "\n";
        }
 
-       function writeContributor( $id, $text ) {
-               $out = "      <contributor>\n";
+       /**
+        * @param $id
+        * @param $text string
+        * @return string
+        */
+       function writeContributor( $id, $text, $indent = "      " ) {
+               $out = $indent . "<contributor>\n";
                if ( $id || !IP::isValid( $text ) ) {
-                       $out .= "        " . Xml::elementClean( 'username', null, strval( $text ) ) . "\n";
-                       $out .= "        " . Xml::element( 'id', null, strval( $id ) ) . "\n";
+                       $out .= $indent . "  " . Xml::elementClean( 'username', null, strval( $text ) ) . "\n";
+                       $out .= $indent . "  " . Xml::element( 'id', null, strval( $id ) ) . "\n";
                } else {
-                       $out .= "        " . Xml::elementClean( 'ip', null, strval( $text ) ) . "\n";
+                       $out .= $indent . "  " . Xml::elementClean( 'ip', null, strval( $text ) ) . "\n";
                }
-               $out .= "      </contributor>\n";
+               $out .= $indent . "</contributor>\n";
                return $out;
        }
 
        /**
         * Warning! This data is potentially inconsistent. :(
+        * @param $row
+        * @param $dumpContents bool
         * @return string
         */
        function writeUploads( $row, $dumpContents = false ) {
-               if ( $row->page_namespace == NS_IMAGE ) {
+               if ( $row->page_namespace == NS_FILE ) {
                        $img = wfLocalFile( $row->page_title );
                        if ( $img && $img->exists() ) {
                                $out = '';
@@ -728,10 +792,15 @@ class XmlDumpWriter {
                } else {
                        $contents = '';
                }
+               if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+                       $comment = Xml::element( 'comment', array( 'deleted' => 'deleted' ) );
+               } else {
+                       $comment = Xml::elementClean( 'comment', null, $file->getDescription() );
+               }
                return "    <upload>\n" .
                        $this->writeTimestamp( $file->getTimestamp() ) .
                        $this->writeContributor( $file->getUser( 'id' ), $file->getUser( 'text' ) ) .
-                       "      " . Xml::elementClean( 'comment', null, $file->getDescription() ) . "\n" .
+                       "      " . $comment . "\n" .
                        "      " . Xml::element( 'filename', null, $file->getName() ) . "\n" .
                        $archiveName .
                        "      " . Xml::element( 'src', null, $file->getCanonicalUrl() ) . "\n" .
@@ -774,32 +843,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 +937,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 +956,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 +996,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 +1014,9 @@ class DumpFileOutput extends DumpOutput {
                }
        }
 
+       /**
+        * @return string|null
+        */
        function getFilenames() {
                return $this->filename;
        }
@@ -912,6 +1032,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 +1046,9 @@ class DumpPipeOutput extends DumpFileOutput {
                $this->filename = $file;
        }
 
+       /**
+        * @param $string string
+        */
        function writeCloseStream( $string ) {
                parent::writeCloseStream( $string );
                if ( $this->procOpenResource ) {
@@ -930,6 +1057,9 @@ class DumpPipeOutput extends DumpFileOutput {
                }
        }
 
+       /**
+        * @param $command
+        */
        function startCommand( $command ) {
                $spec = array(
                        0 => array( "pipe", "r" ),
@@ -939,10 +1069,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 +1107,10 @@ class DumpPipeOutput extends DumpFileOutput {
  * @ingroup Dump
  */
 class DumpGZipOutput extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "gzip", $file );
        }
@@ -980,6 +1121,10 @@ class DumpGZipOutput extends DumpPipeOutput {
  * @ingroup Dump
  */
 class DumpBZip2Output extends DumpPipeOutput {
+
+       /**
+        * @param $file string
+        */
        function __construct( $file ) {
                parent::__construct( "bzip2", $file );
        }
@@ -990,12 +1135,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 +1157,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 +1175,6 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 }
 
-
-
 /**
  * Dump output filter class.
  * This just does output filtering and streaming; XML formatting is done
@@ -1027,18 +1182,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 +1227,9 @@ class DumpFilter {
                }
        }
 
+       /**
+        * @param $string string
+        */
        function writeClosePage( $string ) {
                if ( $this->sendingThisPage ) {
                        $this->sink->writeClosePage( $string );
@@ -1053,30 +1237,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 +1292,11 @@ class DumpFilter {
  * @ingroup Dump
  */
 class DumpNotalkFilter extends DumpFilter {
+
+       /**
+        * @param $page
+        * @return bool
+        */
        function pass( $page ) {
                return !MWNamespace::isTalk( $page->page_namespace );
        }
@@ -1102,6 +1310,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 +1356,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 +1374,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 +1398,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 +1415,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 +1501,10 @@ class DumpMultiWriter {
 
 }
 
+/**
+ * @param $string string
+ * @return string
+ */
 function xmlsafe( $string ) {
        wfProfileIn( __FUNCTION__ );
 
index b870475..3468325 100644 (file)
@@ -80,10 +80,16 @@ class ExternalEdit extends ContextSource {
                } elseif ( $this->getRequest()->getVal( 'mode' ) == 'file' ) {
                        $type = "Edit file";
                        $image = wfLocalFile( $this->getTitle() );
-                       $urls = array( 'File' => array(
-                               'Extension' => $image->getExtension(),
-                               'URL' => $image->getCanonicalURL()
-                       ) );
+                       if ( $image ) {
+                               $urls = array(
+                                       'File' => array(
+                                               'Extension' => $image->getExtension(),
+                                               'URL' => $image->getCanonicalURL()
+                                       )
+                               );
+                       } else{
+                               $urls = array();
+                       }
                } else {
                        $type = "Edit text";
                        # *.wiki file extension is used by some editors for syntax
index f2eed4b..61d4ef7 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Data storage in external 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
+ */
+
 /**
  * @defgroup ExternalStorage ExternalStorage
  */
index 241c43c..6f2b33e 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * External storage in 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
+ */
 
 /**
  * DB accessable external objects
index 092ff7d..311e32b 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * External storage using HTTP 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
+ */
 
 /**
  * Example class for HTTP accessable external objects.
index bea0e7e..9a01deb 100644 (file)
@@ -18,6 +18,8 @@
  * 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 23b47a9..60f7600 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Fake title class that triggers an error if any members are called.
+ *
+ * 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
+ */
 
 /**
  * Fake title class that triggers an error if any members are called
@@ -87,8 +107,6 @@ class FakeTitle extends Title {
        function moveNoAuth( &$nt ) { $this->error(); }
        function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) { $this->error(); }
        function moveTo( &$nt, $auth = true, $reason = '', $createRedirect = true ) { $this->error(); }
-       function moveOverExistingRedirect( &$nt, $reason = '', $createRedirect = true ) { $this->error(); }
-       function moveToNewTitle( &$nt, $reason = '', $createRedirect = true ) { $this->error(); }
        function moveSubpages( $nt, $auth = true, $reason = '', $createRedirect = true ) { $this->error(); }
        function isSingleRevRedirect() { $this->error(); }
        function isValidMoveTarget( $nt ) { $this->error(); }
index b517cd1..4b138c1 100644 (file)
@@ -1,6 +1,7 @@
 <?php
-
 /**
+ * Fallback functions for PHP installed without mbstring 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
@@ -16,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  */
 
 /**
index d280db5..1c5e777 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Helper functions for feeds.
+ *
+ * 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 Feed
+ */
 
 /**
  * Helper functions for feeds
index d86c8d8..9d6ab65 100644 (file)
@@ -1,10 +1,31 @@
 <?php
+/**
+ * File deletion user 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
+ * @author Rob Church <robchur@gmail.com>
+ * @ingroup Media
+ */
 
 /**
  * File deletion user interface
  *
  * @ingroup Media
- * @author Rob Church <robchur@gmail.com>
  */
 class FileDeleteForm {
 
index 8649fe7..448bc03 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Class for managing forking command line scripts.
+ *
+ * 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 for managing forking command line scripts.
@@ -120,6 +140,7 @@ class ForkController {
                // Don't share DB, storage, or memcached connections
                wfGetLBFactory()->destroyInstance();
                FileBackendGroup::destroySingleton();
+               LockManagerGroup::destroySingleton();
                ObjectCache::clear();
                $wgMemc = null;
        }
index d1a5fd3..33bbd86 100644 (file)
@@ -1,16 +1,35 @@
 <?php
 /**
  * Helper class to keep track of options when mixing links and form elements.
- * @todo This badly need some examples and tests :-)
  *
  * Copyright © 2008, Niklas Laxstiröm
- *
  * Copyright © 2011, Antoine Musso
  *
+ * 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
  * @author Antoine Musso 
  */
 
+/**
+ * Helper class to keep track of options when mixing links and form elements.
+ *
+ * @todo This badly need some examples and tests :-)
+ */
 class FormOptions implements ArrayAccess {
        /** @name Type constants
         * Used internally to map an option value to a WebRequest accessor
index 0dfd48d..c3c3073 100644 (file)
@@ -5,6 +5,21 @@
  * of anyone working on large branches in git to setup config that show up only
  * when specific branches are currently checked out.
  *
+ * 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
  */
 
@@ -21,17 +36,9 @@ class GitInfo {
        protected $basedir;
 
        /**
-        * 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.
+        * Map of repo URLs to viewer URLs. Access via static method getViewers().
         */
-       protected $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',
-       );
+       private static $viewers = false;
 
        /**
         * @param $dir string The root directory of the repo where the .git dir can be found
@@ -78,7 +85,7 @@ class GitInfo {
                if ( preg_match( "/ref: (.*)/", $HEAD, $m ) ) {
                        return rtrim( $m[1] );
                } else {
-                       return $HEAD;
+                       return rtrim( $HEAD );
                }
        }
 
@@ -151,7 +158,7 @@ class GitInfo {
                if ( substr( $url, -4 ) !== '.git' ) {
                        $url .= '.git';
                }
-               foreach( $this->viewers as $repo => $viewer ) {
+               foreach( self::getViewers() as $repo => $viewer ) {
                        $pattern = '#^' . $repo . '$#';
                        if ( preg_match( $pattern, $url ) ) {
                                $viewerUrl = preg_replace( $pattern, $viewer, $url );
@@ -189,4 +196,19 @@ class GitInfo {
        public static function headViewUrl() {
                return self::repo()->getHeadViewUrl();
        }
+
+       /**
+        * Gets the list of repository viewers
+        * @return array
+        */
+       protected static function getViewers() {
+               global $wgGitRepositoryViewers;
+
+               if( self::$viewers === false ) {
+                       self::$viewers = $wgGitRepositoryViewers;
+                       wfRunHooks( 'GitViewers', array( &self::$viewers ) );
+               }
+
+               return self::$viewers;
+       }
 }
index 8764783..7e75958 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * Global functions used everywhere
+ * Global functions used everywhere.
+ *
+ * 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
  */
 
@@ -14,7 +30,7 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 /**
  * Compatibility functions
  *
- * We support PHP 5.2.3 and up.
+ * We support PHP 5.3.2 and up.
  * Re-implementations of newer functions or functions in non-standard
  * PHP extensions may be included here.
  */
@@ -368,7 +384,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 +403,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 +421,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 +478,7 @@ function wfCgiToArray( $query ) {
  */
 function wfAppendQuery( $url, $query ) {
        if ( is_array( $query ) ) {
-               $query = wfArrayToCGI( $query );
+               $query = wfArrayToCgi( $query );
        }
        if( $query != '' ) {
                if( false === strpos( $url, '?' ) ) {
@@ -559,6 +575,7 @@ function wfExpandUrl( $url, $defaultProto = PROTO_CURRENT ) {
  *
  * @todo Need to integrate this into wfExpandUrl (bug 32168)
  *
+ * @since 1.19
  * @param $urlParts Array URL parts, as output from wfParseUrl
  * @return string URL assembled from its component parts
  */
@@ -1741,6 +1758,15 @@ function wfDebugDieBacktrace( $msg = '' ) {
 function wfHostname() {
        static $host;
        if ( is_null( $host ) ) {
+
+               # Hostname overriding
+               global $wgOverrideHostname;
+               if( $wgOverrideHostname !== false ) {
+                       # Set static and skip any detection
+                       $host = $wgOverrideHostname;
+                       return $host;
+               }
+
                if ( function_exists( 'posix_uname' ) ) {
                        // This function not present on Windows
                        $uname = posix_uname();
@@ -1814,7 +1840,7 @@ function wfDebugBacktrace( $limit = 0 ) {
        }
 
        if ( $limit && version_compare( PHP_VERSION, '5.4.0', '>=' ) ) {
-               return array_slice( debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit ), 1 );
+               return array_slice( debug_backtrace( DEBUG_BACKTRACE_PROVIDE_OBJECT, $limit + 1 ), 1 );
        } else {
                return array_slice( debug_backtrace(), 1 );
        }
@@ -1873,12 +1899,15 @@ function wfBacktrace() {
 
 /**
  * Get the name of the function which called this function
+ * wfGetCaller( 1 ) is the function with the wfGetCaller() call (ie. __FUNCTION__)
+ * wfGetCaller( 2 ) [default] is the caller of the function running wfGetCaller()
+ * wfGetCaller( 3 ) is the parent of that.
  *
  * @param $level Int
  * @return Bool|string
  */
 function wfGetCaller( $level = 2 ) {
-       $backtrace = wfDebugBacktrace( $level );
+       $backtrace = wfDebugBacktrace( $level + 1 );
        if ( isset( $backtrace[$level] ) ) {
                return wfFormatStackFrame( $backtrace[$level] );
        } else {
@@ -2181,13 +2210,7 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) {
                        if( $status['name'] == 'ob_gzhandler' ) {
                                // Reset the 'Content-Encoding' field set by this handler
                                // so we can start fresh.
-                               if ( function_exists( 'header_remove' ) ) {
-                                       // Available since PHP 5.3.0
-                                       header_remove( 'Content-Encoding' );
-                               } else {
-                                       // We need to provide a valid content-coding. See bug 28069
-                                       header( 'Content-Encoding: identity' );
-                               }
+                               header_remove( 'Content-Encoding' );
                                break;
                        }
                }
@@ -2596,11 +2619,10 @@ function swap( &$x, &$y ) {
 }
 
 /**
- * Tries to get the system directory for temporary files. The TMPDIR, TMP, and
- * TEMP environment variables are then checked in sequence, and if none are set
- * try sys_get_temp_dir() for PHP >= 5.2.1. All else fails, return /tmp for Unix
- * or C:\Windows\Temp for Windows and hope for the best.
- * It is common to call it with tempnam().
+ * Tries to get the system directory for temporary files. First
+ * $wgTmpDirectory is checked, and then the TMPDIR, TMP, and TEMP
+ * environment variables are then checked in sequence, and if none are
+ * set try sys_get_temp_dir().
  *
  * NOTE: When possible, use instead the tmpfile() function to create
  * temporary files to avoid race conditions on file creation, etc.
@@ -2608,17 +2630,20 @@ function swap( &$x, &$y ) {
  * @return String
  */
 function wfTempDir() {
-       foreach( array( 'TMPDIR', 'TMP', 'TEMP' ) as $var ) {
-               $tmp = getenv( $var );
+       global $wgTmpDirectory;
+
+       if ( $wgTmpDirectory !== false ) {
+               return $wgTmpDirectory;
+       }
+
+       $tmpDir = array_map( "getenv", array( 'TMPDIR', 'TMP', 'TEMP' ) );
+
+       foreach( $tmpDir as $tmp ) {
                if( $tmp && file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) {
                        return $tmp;
                }
        }
-       if( function_exists( 'sys_get_temp_dir' ) ) {
-               return sys_get_temp_dir();
-       }
-       # Usual defaults
-       return wfIsWindows() ? 'C:\Windows\Temp' : '/tmp';
+       return sys_get_temp_dir();
 }
 
 /**
@@ -2657,7 +2682,8 @@ function wfMkdirParents( $dir, $mode = null, $caller = null ) {
 
        if( !$ok ) {
                // PHP doesn't report the path in its warning message, so add our own to aid in diagnosis.
-               trigger_error( __FUNCTION__ . ": failed to mkdir \"$dir\" mode $mode", E_USER_WARNING );
+               trigger_error( sprintf( "%s: failed to mkdir \"%s\" mode 0%o", __FUNCTION__, $dir, $mode ),
+                       E_USER_WARNING );
        }
        return $ok;
 }
@@ -2759,9 +2785,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' ) );
        }
@@ -2899,16 +2923,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 ebaac3c..36008fb 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * HTML form generation and submission 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
+ */
+
 /**
  * Object handling generic submission, CSRF protection, layout and
  * other logic for UI forms. in a reusable manner.
@@ -121,16 +142,33 @@ class HTMLForm extends ContextSource {
        protected $mButtons = array();
 
        protected $mWrapperLegend = false;
-       
+
        /**
         * If true, sections that contain both fields and subsections will
         * render their subsections before their fields.
-        * 
+        *
         * Subclasses may set this to false to render subsections after fields
         * instead.
         */
        protected $mSubSectionBeforeFields = true;
 
+       /**
+        * Format in which to display form. For viable options,
+        * @see $availableDisplayFormats
+        * @var String
+        */
+       protected $displayFormat = 'table';
+
+       /**
+        * Available formats in which to display the form
+        * @var Array
+        */
+       protected $availableDisplayFormats = array(
+               'table',
+               'div',
+               'raw',
+       );
+
        /**
         * Build a new HTMLForm from an array of field attributes
         * @param $descriptor Array of Field constructs, as described above
@@ -139,13 +177,13 @@ class HTMLForm extends ContextSource {
         * @param $messagePrefix String a prefix to go in front of default messages
         */
        public function __construct( $descriptor, /*IContextSource*/ $context = null, $messagePrefix = '' ) {
-               if( $context instanceof IContextSource ){
+               if ( $context instanceof IContextSource ) {
                        $this->setContext( $context );
                        $this->mTitle = false; // We don't need them to set a title
                        $this->mMessagePrefix = $messagePrefix;
                } else {
                        // B/C since 1.18
-                       if( is_string( $context ) && $messagePrefix === '' ){
+                       if ( is_string( $context ) && $messagePrefix === '' ) {
                                // it's actually $messagePrefix
                                $this->mMessagePrefix = $context;
                        }
@@ -189,6 +227,28 @@ class HTMLForm extends ContextSource {
                $this->mFieldTree = $loadedDescriptor;
        }
 
+       /**
+        * Set format in which to display the form
+        * @param $format String the name of the format to use, must be one of
+        *        $this->availableDisplayFormats
+        * @since 1.20
+        */
+       public function setDisplayFormat( $format ) {
+               if ( !in_array( $format, $this->availableDisplayFormats ) ) {
+                       throw new MWException ( 'Display format must be one of ' . print_r( $this->availableDisplayFormats, true ) );
+               }
+               $this->displayFormat = $format;
+       }
+
+       /**
+        * Getter for displayFormat
+        * @since 1.20
+        * @return String
+        */
+       public function getDisplayFormat() {
+               return $this->displayFormat;
+       }
+
        /**
         * Add the HTMLForm-specific JavaScript, if it hasn't been
         * done already.
@@ -254,7 +314,7 @@ class HTMLForm extends ContextSource {
                        $editToken = $this->getRequest()->getVal( 'wpEditToken' );
                        if ( $this->getUser()->isLoggedIn() || $editToken != null ) {
                                // Session tokens for logged-out users have no security value.
-                               // However, if the user gave one, check it in order to give a nice 
+                               // However, if the user gave one, check it in order to give a nice
                                // "session expired" error instead of "permission denied" or such.
                                $submit = $this->getUser()->matchEditToken( $editToken );
                        } else {
@@ -312,6 +372,9 @@ class HTMLForm extends ContextSource {
                }
 
                $callback = $this->mSubmitCallback;
+               if ( !is_callable( $callback ) ) {
+                       throw new MWException( 'HTMLForm: no submit callback provided. Use setSubmitCallback() to set one.' );
+               }
 
                $data = $this->filterDataForSubmit( $this->mFieldData );
 
@@ -519,7 +582,7 @@ class HTMLForm extends ContextSource {
                global $wgArticlePath;
 
                $html = '';
-               if( $this->getMethod() == 'post' ){
+               if ( $this->getMethod() == 'post' ) {
                        $html .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken(), array( 'id' => 'wpEditToken' ) ) . "\n";
                        $html .= Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) . "\n";
                }
@@ -664,7 +727,7 @@ class HTMLForm extends ContextSource {
         * @param $msg String message key
         */
        public function setSubmitTextMsg( $msg ) {
-               return $this->setSubmitText( $this->msg( $msg )->text() );
+               $this->setSubmitText( $this->msg( $msg )->text() );
        }
 
        /**
@@ -712,7 +775,7 @@ class HTMLForm extends ContextSource {
         * @param $msg String message key
         */
        public function setWrapperLegendMsg( $msg ) {
-               return $this->setWrapperLegend( $this->msg( $msg )->escaped() );
+               $this->setWrapperLegend( $this->msg( $msg )->escaped() );
        }
 
        /**
@@ -762,20 +825,25 @@ class HTMLForm extends ContextSource {
         * @param $fieldsetIDPrefix string ID prefix for the <fieldset> tag of each subsection, ignored if empty
         * @return String
         */
-       function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
-               $tableHtml = '';
+       public function displaySection( $fields, $sectionName = '', $fieldsetIDPrefix = '' ) {
+               $displayFormat = $this->getDisplayFormat();
+
+               $html = '';
                $subsectionHtml = '';
-               $hasLeftColumn = false;
+               $hasLabel = false;
+
+               $getFieldHtmlMethod = ( $displayFormat == 'table' ) ? 'getTableRow' : 'get' . ucfirst( $displayFormat );
 
                foreach ( $fields as $key => $value ) {
-                       if ( is_object( $value ) ) {
+                       if ( $value instanceof HTMLFormField ) {
                                $v = empty( $value->mParams['nodata'] )
                                        ? $this->mFieldData[$key]
                                        : $value->getDefault();
-                               $tableHtml .= $value->getTableRow( $v );
+                               $html .= $value->$getFieldHtmlMethod( $v );
 
-                               if ( $value->getLabel() != '&#160;' ) {
-                                       $hasLeftColumn = true;
+                               $labelValue = trim( $value->getLabel() );
+                               if ( $labelValue != '&#160;' && $labelValue !== '' ) {
+                                       $hasLabel = true;
                                }
                        } elseif ( is_array( $value ) ) {
                                $section = $this->displaySection( $value, $key );
@@ -794,27 +862,33 @@ class HTMLForm extends ContextSource {
                        }
                }
 
-               $classes = array();
+               if ( $displayFormat !== 'raw' ) {
+                       $classes = array();
 
-               if ( !$hasLeftColumn ) { // Avoid strange spacing when no labels exist
-                       $classes[] = 'mw-htmlform-nolabel';
-               }
+                       if ( !$hasLabel ) { // Avoid strange spacing when no labels exist
+                               $classes[] = 'mw-htmlform-nolabel';
+                       }
 
-               $attribs = array(
-                       'class' => implode( ' ', $classes ),
-               );
+                       $attribs = array(
+                               'class' => implode( ' ', $classes ),
+                       );
 
-               if ( $sectionName ) {
-                       $attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
-               }
+                       if ( $sectionName ) {
+                               $attribs['id'] = Sanitizer::escapeId( "mw-htmlform-$sectionName" );
+                       }
 
-               $tableHtml = Html::rawElement( 'table', $attribs,
-                       Html::rawElement( 'tbody', array(), "\n$tableHtml\n" ) ) . "\n";
+                       if ( $displayFormat === 'table' ) {
+                               $html = Html::rawElement( 'table', $attribs,
+                                       Html::rawElement( 'tbody', array(), "\n$html\n" ) ) . "\n";
+                       } elseif ( $displayFormat === 'div' ) {
+                               $html = Html::rawElement( 'div', $attribs, "\n$html\n" );
+                       }
+               }
 
                if ( $this->mSubSectionBeforeFields ) {
-                       return $subsectionHtml . "\n" . $tableHtml;
+                       return $subsectionHtml . "\n" . $html;
                } else {
-                       return $tableHtml . "\n" . $subsectionHtml;
+                       return $html . "\n" . $subsectionHtml;
                }
        }
 
@@ -1031,7 +1105,7 @@ abstract class HTMLFormField {
                        $this->mFilterCallback = $params['filter-callback'];
                }
 
-               if ( isset( $params['flatlist'] ) ){
+               if ( isset( $params['flatlist'] ) ) {
                        $this->mClass .= ' mw-htmlform-flatlist';
                }
        }
@@ -1043,35 +1117,27 @@ abstract class HTMLFormField {
         * @return String complete HTML table row.
         */
        function getTableRow( $value ) {
-               # Check for invalid data.
-
-               $errors = $this->validate( $value, $this->mParent->mFieldData );
-
+               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+               $inputHtml = $this->getInputHTML( $value );
+               $fieldType = get_class( $this );
+               $helptext = $this->getHelpTextHtmlTable( $this->getHelpText() );
                $cellAttributes = array();
-               $verticalLabel = false;
 
-               if ( !empty($this->mParams['vertical-label']) ) {
+               if ( !empty( $this->mParams['vertical-label'] ) ) {
                        $cellAttributes['colspan'] = 2;
                        $verticalLabel = true;
-               }
-
-               if ( $errors === true || ( !$this->mParent->getRequest()->wasPosted() && ( $this->mParent->getMethod() == 'post' ) ) ) {
-                       $errors = '';
-                       $errorClass = '';
                } else {
-                       $errors = self::formatErrors( $errors );
-                       $errorClass = 'mw-htmlform-invalid-input';
+                       $verticalLabel = false;
                }
 
                $label = $this->getLabelHtml( $cellAttributes );
+
                $field = Html::rawElement(
                        'td',
                        array( 'class' => 'mw-input' ) + $cellAttributes,
-                       $this->getInputHTML( $value ) . "\n$errors"
+                       $inputHtml . "\n$errors"
                );
 
-               $fieldType = get_class( $this );
-
                if ( $verticalLabel ) {
                        $html = Html::rawElement( 'tr',
                                array( 'class' => 'mw-htmlform-vertical-label' ), $label );
@@ -1084,6 +1150,109 @@ abstract class HTMLFormField {
                                $label . $field );
                }
 
+               return $html . $helptext;
+       }
+
+       /**
+        * Get the complete div for the input, including help text,
+        * labels, and whatever.
+        * @since 1.20
+        * @param $value String the value to set the input to.
+        * @return String complete HTML table row.
+        */
+       public function getDiv( $value ) {
+               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+               $inputHtml = $this->getInputHTML( $value );
+               $fieldType = get_class( $this );
+               $helptext = $this->getHelpTextHtmlDiv( $this->getHelpText() );
+               $cellAttributes = array();
+               $label = $this->getLabelHtml( $cellAttributes );
+
+               $field = Html::rawElement(
+                       'div',
+                       array( 'class' => 'mw-input' ) + $cellAttributes,
+                       $inputHtml . "\n$errors"
+               );
+               $html = Html::rawElement( 'div',
+                       array( 'class' => "mw-htmlform-field-$fieldType {$this->mClass} $errorClass" ),
+                       $label . $field );
+               $html .= $helptext;
+               return $html;
+       }
+
+       /**
+        * Get the complete raw fields for the input, including help text,
+        * labels, and whatever.
+        * @since 1.20
+        * @param $value String the value to set the input to.
+        * @return String complete HTML table row.
+        */
+       public function getRaw( $value ) {
+               list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
+               $inputHtml = $this->getInputHTML( $value );
+               $fieldType = get_class( $this );
+               $helptext = $this->getHelpTextHtmlRaw( $this->getHelpText() );
+               $cellAttributes = array();
+               $label = $this->getLabelHtml( $cellAttributes );
+
+               $html = "\n$errors";
+               $html .= $label;
+               $html .= $inputHtml;
+               $html .= $helptext;
+               return $html;
+       }
+
+       /**
+        * Generate help text HTML in table format
+        * @since 1.20
+        * @param $helptext String|null
+        * @return String
+        */
+       public function getHelpTextHtmlTable( $helptext ) {
+               if ( is_null( $helptext ) ) {
+                       return '';
+               }
+
+               $row = Html::rawElement(
+                       'td',
+                       array( 'colspan' => 2, 'class' => 'htmlform-tip' ),
+                       $helptext
+               );
+               $row = Html::rawElement( 'tr', array(), $row );
+               return $row;
+       }
+
+       /**
+        * Generate help text HTML in div format
+        * @since 1.20
+        * @param $helptext String|null
+        * @return String
+        */
+       public function getHelpTextHtmlDiv( $helptext ) {
+               if ( is_null( $helptext ) ) {
+                       return '';
+               }
+
+               $div = Html::rawElement( 'div', array( 'class' => 'htmlform-tip' ), $helptext );
+               return $div;
+       }
+
+       /**
+        * Generate help text HTML formatted for raw output
+        * @since 1.20
+        * @param $helptext String|null
+        * @return String
+        */
+       public function getHelpTextHtmlRaw( $helptext ) {
+               return $this->getHelpTextHtmlDiv( $helptext );
+       }
+
+       /**
+        * Determine the help text to display
+        * @since 1.20
+        * @return String
+        */
+       public function getHelpText() {
                $helptext = null;
 
                if ( isset( $this->mParams['help-message'] ) ) {
@@ -1091,11 +1260,16 @@ abstract class HTMLFormField {
                }
 
                if ( isset( $this->mParams['help-messages'] ) ) {
-                       foreach( $this->mParams['help-messages'] as $name ) {
+                       foreach ( $this->mParams['help-messages'] as $name ) {
                                $helpMessage = (array)$name;
                                $msg = wfMessage( array_shift( $helpMessage ), $helpMessage );
 
-                               if( $msg->exists() ) {
+                               if ( $msg->exists() ) {
+                                       if ( is_null( $helptext ) ) {
+                                               $helptext = '';
+                                       } else {
+                                               $helptext .= wfMessage( 'word-separator' )->escaped(); // some space
+                                       }
                                        $helptext .= $msg->parse(); // Append message
                                }
                        }
@@ -1103,23 +1277,32 @@ abstract class HTMLFormField {
                elseif ( isset( $this->mParams['help'] ) ) {
                        $helptext = $this->mParams['help'];
                }
+               return $helptext;
+       }
 
-               if ( !is_null( $helptext ) ) {
-                       $row = Html::rawElement(
-                               'td',
-                               array( 'colspan' => 2, 'class' => 'htmlform-tip' ),
-                               $helptext
-                       );
-                       $row = Html::rawElement( 'tr', array(), $row );
-                       $html .= "$row\n";
-               }
+       /**
+        * Determine form errors to display and their classes
+        * @since 1.20
+        * @param $value String the value of the input
+        * @return Array
+        */
+       public function getErrorsAndErrorClass( $value ) {
+               $errors = $this->validate( $value, $this->mParent->mFieldData );
 
-               return $html;
+               if ( $errors === true || ( !$this->mParent->getRequest()->wasPosted() && ( $this->mParent->getMethod() == 'post' ) ) ) {
+                       $errors = '';
+                       $errorClass = '';
+               } else {
+                       $errors = self::formatErrors( $errors );
+                       $errorClass = 'mw-htmlform-invalid-input';
+               }
+               return array( $errors, $errorClass );
        }
 
        function getLabel() {
                return $this->mLabel;
        }
+
        function getLabelHtml( $cellAttributes = array() ) {
                # Don't output a for= attribute for labels with no associated input.
                # Kind of hacky here, possibly we don't want these to be <label>s at all.
@@ -1129,9 +1312,20 @@ abstract class HTMLFormField {
                        $for['for'] = $this->mID;
                }
 
-               return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
-                       Html::rawElement( 'label', $for, $this->getLabel() )
-               );
+               $displayFormat = $this->mParent->getDisplayFormat();
+               $labelElement = Html::rawElement( 'label', $for, $this->getLabel() );
+
+               if ( $displayFormat == 'table' ) {
+                       return Html::rawElement( 'td', array( 'class' => 'mw-label' ) + $cellAttributes,
+                               Html::rawElement( 'label', $for, $this->getLabel() )
+                       );
+               } elseif ( $displayFormat == 'div' ) {
+                       return Html::rawElement( 'div', array( 'class' => 'mw-label' ) + $cellAttributes,
+                               Html::rawElement( 'label', $for, $this->getLabel() )
+                       );
+               } else {
+                       return $labelElement;
+               }
        }
 
        function getDefault() {
@@ -1223,7 +1417,7 @@ class HTMLTextField extends HTMLFormField {
                if ( $this->mClass !== '' ) {
                        $attribs['class'] = $this->mClass;
                }
-               
+
                if ( isset( $this->mParams['maxlength'] ) ) {
                        $attribs['maxlength'] = $this->mParams['maxlength'];
                }
@@ -1297,7 +1491,7 @@ class HTMLTextAreaField extends HTMLFormField {
                if ( $this->mClass !== '' ) {
                        $attribs['class'] = $this->mClass;
                }
-               
+
                if ( !empty( $this->mParams['disabled'] ) ) {
                        $attribs['disabled'] = 'disabled';
                }
@@ -1306,6 +1500,10 @@ class HTMLTextAreaField extends HTMLFormField {
                        $attribs['readonly'] = 'readonly';
                }
 
+               if ( isset( $this->mParams['placeholder'] ) ) {
+                       $attribs['placeholder'] = $this->mParams['placeholder'];
+               }
+
                foreach ( array( 'required', 'autofocus' ) as $param ) {
                        if ( isset( $this->mParams[$param] ) ) {
                                $attribs[$param] = '';
@@ -1404,7 +1602,7 @@ class HTMLCheckField extends HTMLFormField {
                if ( !empty( $this->mParams['disabled'] ) ) {
                        $attr['disabled'] = 'disabled';
                }
-               
+
                if ( $this->mClass !== '' ) {
                        $attr['class'] = $this->mClass;
                }
@@ -1436,7 +1634,7 @@ class HTMLCheckField extends HTMLFormField {
                // Fetch the value in either one of the two following case:
                // - we have a valid token (form got posted or GET forged by the user)
                // - checkbox name has a value (false or true), ie is not null
-               if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName )!== null ) {
+               if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName ) !== null ) {
                        // XOR has the following truth table, which is what we want
                        // INVERT VALUE | OUTPUT
                        // true   true  | false
@@ -1475,8 +1673,8 @@ class HTMLSelectField extends HTMLFormField {
                # If one of the options' 'name' is int(0), it is automatically selected.
                # because PHP sucks and thinks int(0) == 'some string'.
                # Working around this by forcing all of them to strings.
-               foreach( $this->mParams['options'] as &$opt ){
-                       if( is_int( $opt ) ){
+               foreach ( $this->mParams['options'] as &$opt ) {
+                       if ( is_int( $opt ) ) {
                                $opt = strval( $opt );
                        }
                }
@@ -1485,7 +1683,7 @@ class HTMLSelectField extends HTMLFormField {
                if ( !empty( $this->mParams['disabled'] ) ) {
                        $select->setAttribute( 'disabled', 'disabled' );
                }
-               
+
                if ( $this->mClass !== '' ) {
                        $select->setAttribute( 'class', $this->mClass );
                }
@@ -1550,7 +1748,7 @@ class HTMLSelectOrOtherField extends HTMLTextField {
                if ( isset( $this->mParams['maxlength'] ) ) {
                        $tbAttribs['maxlength'] = $this->mParams['maxlength'];
                }
-               
+
                if ( $this->mClass !== '' ) {
                        $tbAttribs['class'] = $this->mClass;
                }
@@ -1653,7 +1851,7 @@ class HTMLMultiSelectField extends HTMLFormField {
         */
        function loadDataFromRequest( $request ) {
                if ( $this->mParent->getMethod() == 'post' ) {
-                       if( $request->wasPosted() ){
+                       if ( $request->wasPosted() ) {
                                # Checkboxes are just not added to the request arrays if they're not checked,
                                # so it's perfectly possible for there not to be an entry at all
                                return $request->getArray( $this->mName, array() );
@@ -1699,7 +1897,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
        function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
-               } elseif( array_key_exists( 'other-message', $params ) ){
+               } elseif ( array_key_exists( 'other-message', $params ) ) {
                        $params['other'] = wfMessage( $params['other-message'] )->plain();
                } else {
                        $params['other'] = null;
@@ -1707,7 +1905,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
                if ( array_key_exists( 'options', $params ) ) {
                        # Options array already specified
-               } elseif( array_key_exists( 'options-message', $params ) ){
+               } elseif ( array_key_exists( 'options-message', $params ) ) {
                        # Generate options array from a system message
                        $params['options'] = self::parseMessage(
                                wfMessage( $params['options-message'] )->inContentLanguage()->plain(),
@@ -1729,8 +1927,8 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
         * @return Array
         * TODO: this is copied from Xml::listDropDown(), deprecate/avoid duplication?
         */
-       public static function parseMessage( $string, $otherName=null ) {
-               if( $otherName === null ){
+       public static function parseMessage( $string, $otherName = null ) {
+               if ( $otherName === null ) {
                        $otherName = wfMessage( 'htmlform-selectorother-other' )->plain();
                }
 
@@ -1741,14 +1939,14 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $value = trim( $option );
                        if ( $value == '' ) {
                                continue;
-                       } elseif ( substr( $value, 0, 1) == '*' && substr( $value, 1, 1) != '*' ) {
+                       } elseif ( substr( $value, 0, 1 ) == '*' && substr( $value, 1, 1 ) != '*' ) {
                                # A new group is starting...
                                $value = trim( substr( $value, 1 ) );
                                $optgroup = $value;
-                       } elseif ( substr( $value, 0, 2) == '**' ) {
+                       } elseif ( substr( $value, 0, 2 ) == '**' ) {
                                # groupmember
                                $opt = trim( substr( $value, 2 ) );
-                               if( $optgroup === false ){
+                               if ( $optgroup === false ) {
                                        $options[$opt] = $opt;
                                } else {
                                        $options[$optgroup][$opt] = $opt;
@@ -1770,7 +1968,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        'id' => $this->mID . '-other',
                        'size' => $this->getSize(),
                );
-               
+
                if ( $this->mClass !== '' ) {
                        $textAttribs['class'] = $this->mClass;
                }
@@ -1803,11 +2001,11 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
 
                        if ( $list == 'other' ) {
                                $final = $text;
-                       } elseif( !in_array( $list, $this->mFlatOptions ) ){
+                       } elseif ( !in_array( $list, $this->mFlatOptions ) ) {
                                # User has spoofed the select form to give an option which wasn't
                                # in the original offer.  Sulk...
                                $final = $text;
-                       } elseif( $text == '' ) {
+                       } elseif ( $text == '' ) {
                                $final = $list;
                        } else {
                                $final = $list . wfMsgForContent( 'colon-separator' ) . $text;
@@ -1820,7 +2018,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        $text = $final;
                        foreach ( $this->mFlatOptions as $option ) {
                                $match = $option . wfMsgForContent( 'colon-separator' );
-                               if( strpos( $text, $match ) === 0 ) {
+                               if ( strpos( $text, $match ) === 0 ) {
                                        $list = $option;
                                        $text = substr( $text, strlen( $match ) );
                                        break;
@@ -1846,7 +2044,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        return $p;
                }
 
-               if( isset( $this->mParams['required'] ) && $value[1] === '' ){
+               if ( isset( $this->mParams['required'] ) && $value[1] === '' ) {
                        return wfMsgExt( 'htmlform-required', 'parseinline' );
                }
 
@@ -1932,17 +2130,17 @@ class HTMLRadioField extends HTMLFormField {
  * An information field (text blob), not a proper input.
  */
 class HTMLInfoField extends HTMLFormField {
-       function __construct( $info ) {
+       public function __construct( $info ) {
                $info['nodata'] = true;
 
                parent::__construct( $info );
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                return !empty( $this->mParams['raw'] ) ? $value : htmlspecialchars( $value );
        }
 
-       function getTableRow( $value ) {
+       public function getTableRow( $value ) {
                if ( !empty( $this->mParams['rawrow'] ) ) {
                        return $value;
                }
@@ -1950,6 +2148,28 @@ class HTMLInfoField extends HTMLFormField {
                return parent::getTableRow( $value );
        }
 
+       /**
+        * @since 1.20
+        */
+       public function getDiv( $value ) {
+               if ( !empty( $this->mParams['rawrow'] ) ) {
+                       return $value;
+               }
+
+               return parent::getDiv( $value );
+       }
+
+       /**
+        * @since 1.20
+        */
+       public function getRaw( $value ) {
+               if ( !empty( $this->mParams['rawrow'] ) ) {
+                       return $value;
+               }
+
+               return parent::getRaw( $value );
+       }
+
        protected function needsLabel() {
                return false;
        }
@@ -1979,6 +2199,20 @@ class HTMLHiddenField extends HTMLFormField {
                return '';
        }
 
+       /**
+        * @since 1.20
+        */
+       public function getDiv( $value ) {
+               return $this->getTableRow( $value );
+       }
+
+       /**
+        * @since 1.20
+        */
+       public function getRaw( $value ) {
+               return $this->getTableRow( $value );
+       }
+
        public function getInputHTML( $value ) { return ''; }
 }
 
@@ -1988,12 +2222,12 @@ class HTMLHiddenField extends HTMLFormField {
  */
 class HTMLSubmitField extends HTMLFormField {
 
-       function __construct( $info ) {
+       public function __construct( $info ) {
                $info['nodata'] = true;
                parent::__construct( $info );
        }
 
-       function getInputHTML( $value ) {
+       public function getInputHTML( $value ) {
                return Xml::submitButton(
                        $value,
                        array(
@@ -2014,7 +2248,7 @@ class HTMLSubmitField extends HTMLFormField {
         * @param $alldata Array
         * @return Bool
         */
-       public function validate( $value, $alldata ){
+       public function validate( $value, $alldata ) {
                return true;
        }
 }
@@ -2025,6 +2259,30 @@ class HTMLEditTools extends HTMLFormField {
        }
 
        public function getTableRow( $value ) {
+               $msg = $this->formatMsg();
+
+               return '<tr><td></td><td class="mw-input">'
+                       . '<div class="mw-editTools">'
+                       . $msg->parseAsBlock()
+                       . "</div></td></tr>\n";
+       }
+
+       /**
+        * @since 1.20
+        */
+       public function getDiv( $value ) {
+               $msg = $this->formatMsg();
+               return '<div class="mw-editTools">' . $msg->parseAsBlock() . '</div>';
+       }
+
+       /**
+        * @since 1.20
+        */
+       public function getRaw( $value ) {
+               return $this->getDiv( $value );
+       }
+
+       protected function formatMsg() {
                if ( empty( $this->mParams['message'] ) ) {
                        $msg = wfMessage( 'edittools' );
                } else {
@@ -2034,11 +2292,6 @@ class HTMLEditTools extends HTMLFormField {
                        }
                }
                $msg->inContentLanguage();
-
-
-               return '<tr><td></td><td class="mw-input">'
-                       . '<div class="mw-editTools">'
-                       . $msg->parseAsBlock()
-                       . "</div></td></tr>\n";
+               return $msg;
        }
 }
index 9e63791..bb8ec5e 100644 (file)
@@ -1,5 +1,25 @@
 <?php
-
+/**
+ * Efficient concatenated text storage.
+ *
+ * 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
+ */
 /**
  * Base class for general text storage via the "object" flag in old_flags, or 
  * two-part external storage URLs. Used for represent efficient concatenated 
index 479b4d2..feb9b93 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Class alias kept for backward compatibility.
+ *
+ * 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 HTTP
+ */
 
 /**
  * HttpRequest was renamed to MWHttpRequest in order
index a1d2e59..201a9e5 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Various HTTP related 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 HTTP
+ */
+
 /**
  * @defgroup HTTP HTTP
  */
@@ -216,6 +238,11 @@ class MWHttpRequest {
 
                foreach ( $members as $o ) {
                        if ( isset( $options[$o] ) ) {
+                               // ensure that MWHttpRequest::method is always
+                               // uppercased. Bug 36137
+                               if ( $o == 'method' ) {
+                                       $options[$o] = strtoupper( $options[$o] );
+                               }
                                $this->$o = $options[$o];
                        }
                }
@@ -885,7 +912,7 @@ class PhpHttpRequest extends MWHttpRequest {
                        return $this->status;
                }
 
-               // If everything went OK, or we recieved some error code
+               // If everything went OK, or we received some error code
                // get the response body content.
                if ( $this->status->isOK()
                                || (int)$this->respStatus >= 300) {
index e1c1f6d..1828249 100644 (file)
@@ -133,7 +133,7 @@ class IP {
        }
 
        /**
-        * Convert an IP into a nice standard form.
+        * Convert an IP into a verbose, uppercase, normalized form.
         * IPv6 addresses in octet notation are expanded to 8 words.
         * IPv4 addresses are just trimmed.
         *
@@ -185,6 +185,49 @@ class IP {
                return $ip;
        }
 
+       /**
+        * Prettify an IP for display to end users.
+        * This will make it more compact and lower-case.
+        *
+        * @param $ip string
+        * @return string
+        */
+       public static function prettifyIP( $ip ) {
+               $ip = self::sanitizeIP( $ip ); // normalize (removes '::')
+               if ( self::isIPv6( $ip ) ) {
+                       // Split IP into an address and a CIDR
+                       if ( strpos( $ip, '/' ) !== false ) {
+                               list( $ip, $cidr ) = explode( '/', $ip, 2 );
+                       } else {
+                               list( $ip, $cidr ) = array( $ip, '' );
+                       }
+                       // Get the largest slice of words with multiple zeros
+                       $offset = 0;
+                       $longest = $longestPos = false;
+                       while ( preg_match(
+                               '!(?:^|:)0(?::0)+(?:$|:)!', $ip, $m, PREG_OFFSET_CAPTURE, $offset
+                       ) ) {
+                               list( $match, $pos ) = $m[0]; // full match
+                               if ( strlen( $match ) > strlen( $longest ) ) {
+                                       $longest = $match;
+                                       $longestPos = $pos;
+                               }
+                               $offset += ( $pos + strlen( $match ) ); // advance
+                       }
+                       if ( $longest !== false ) {
+                               // Replace this portion of the string with the '::' abbreviation
+                               $ip = substr_replace( $ip, '::', $longestPos, strlen( $longest ) );
+                       }
+                       // Add any CIDR back on
+                       if ( $cidr !== '' ) {
+                               $ip = "{$ip}/{$cidr}";
+                       }
+                       // Convert to lower case to make it more readable
+                       $ip = strtolower( $ip );
+               }
+               return $ip;
+       }
+
        /**
         * Given a host/port string, like one might find in the host part of a URL
         * per RFC 2732, split the hostname part and the port part and return an
index 5a8fb8e..d391ead 100644 (file)
@@ -1,6 +1,24 @@
 <?php
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
+/**
+ * Image gallery.
+ *
+ * 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
+ */
 
 /**
  * Image gallery
@@ -141,23 +159,24 @@ class ImageGallery {
         * @param $title Title object of the image that is added to the gallery
         * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
         * @param $alt   String: Alt text for the image
+        * @param $link  String: Override image link (optional)
         */
-       function add( $title, $html = '', $alt = '' ) {
+       function add( $title, $html = '', $alt = '', $link = '') {
                if ( $title instanceof File ) {
                        // Old calling convention
                        $title = $title->getTitle();
                }
-               $this->mImages[] = array( $title, $html, $alt );
+               $this->mImages[] = array( $title, $html, $alt, $link );
                wfDebug( 'ImageGallery::add ' . $title->getText() . "\n" );
        }
 
        /**
-       * Add an image at the beginning of the gallery.
-       *
-       * @param $title Title object of the image that is added to the gallery
-       * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
-       * @param $alt   String: Alt text for the image
-       */
+        * Add an image at the beginning of the gallery.
+        *
+        * @param $title Title object of the image that is added to the gallery
+        * @param $html  String: Additional HTML text to be shown. The name and size of the image are always shown.
+        * @param $alt   String: Alt text for the image
+        */
        function insert( $title, $html = '', $alt = '' ) {
                if ( $title instanceof File ) {
                        // Old calling convention
@@ -245,6 +264,7 @@ class ImageGallery {
                        $nt = $pair[0];
                        $text = $pair[1]; # "text" means "caption" here
                        $alt = $pair[2];
+                       $link = $pair[3];
 
                        $descQuery = false;
                        if ( $nt->getNamespace() == NS_FILE ) {
@@ -289,6 +309,7 @@ class ImageGallery {
                                        'desc-link' => true,
                                        'desc-query' => $descQuery,
                                        'alt' => $alt,
+                                       'custom-url-link' => $link
                                );
                                # In the absence of both alt text and caption, fall back on providing screen readers with the filename as alt text
                                if ( $alt == '' && $text == '' ) {
@@ -346,9 +367,9 @@ class ImageGallery {
                                        . '<div style="width: ' . ( $this->mWidths + self::THUMB_PADDING + self::GB_PADDING ) . 'px">'
                                        . $thumbhtml
                                        . "\n\t\t\t" . '<div class="gallerytext">' . "\n"
-                                               . $textlink . $text . $fileSize
+                                       . $textlink . $text . $fileSize
                                        . "\n\t\t\t</div>"
-                               . "\n\t\t</div></li>";
+                                       . "\n\t\t</div></li>";
                }
                $output .= "\n</ul>";
 
@@ -378,8 +399,8 @@ class ImageGallery {
         */
        public function getContextTitle() {
                return is_object( $this->contextTitle ) && $this->contextTitle instanceof Title
-                               ? $this->contextTitle
-                               : false;
+                       ? $this->contextTitle
+                       : false;
        }
 
 } //class
index 7453baa..8f683e9 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Special handling for file description 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
+ */
+
 /**
  * Class for viewing MediaWiki file description pages
  *
@@ -30,7 +51,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 +72,7 @@ class ImagePage extends Article {
 
        protected function loadFile() {
                if ( $this->fileLoaded ) {
-                       return true;
+                       return;
                }
                $this->fileLoaded = true;
 
@@ -75,19 +96,21 @@ class ImagePage extends Article {
         * Include body text only; none of the image extras
         */
        public function render() {
-               global $wgOut;
-               $wgOut->setArticleBodyOnly( true );
+               $this->getContext()->getOutput()->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 ) ) {
-                       return parent::view();
+                       parent::view();
+                       return;
                }
 
                $this->loadFile();
@@ -96,13 +119,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' );
-                               return parent::view();
+                               $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;
@@ -118,7 +142,7 @@ class ImagePage extends Article {
                }
 
                if ( !$diff && $this->displayImg->exists() ) {
-                       $wgOut->addHTML( $this->showTOC( $showmeta ) );
+                       $out->addHTML( $this->showTOC( $showmeta ) );
                }
 
                if ( !$diff ) {
@@ -130,15 +154,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() );
                }
 
@@ -146,16 +170,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();
@@ -167,24 +191,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' );
        }
 
        /**
@@ -260,12 +284,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' );
 
@@ -279,11 +307,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;
@@ -297,7 +324,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
@@ -319,21 +346,33 @@ class ImagePage extends Article {
                                                # Note that $height <= $maxHeight now, but might not be identical
                                                # because of rounding.
                                        }
-                                       $msgbig  = wfMsgHtml( 'show-big-image' );
+                                       $msgbig = wfMsgHtml( 'show-big-image' );
+                                       if ( $this->displayImg->getRepo()->canTransformVia404() ) {
+                                               $thumbSizes = $wgImageLimits;
+                                       } else {
+                                               # Creating thumb links triggers thumbnail generation.
+                                               # Just generate the thumb for the current users prefs.
+                                               $thumbOption = $user->getOption( 'thumbsize' );
+                                               $thumbSizes = array( isset( $wgImageLimits[$thumbOption] )
+                                                       ? $wgImageLimits[$thumbOption]
+                                                       : $wgImageLimits[User::getDefaultOption( 'thumbsize' )] );
+                                       }
+                                       # Generate thumbnails or thumbnail links as needed...
                                        $otherSizes = array();
-                                       foreach ( $wgImageLimits as $size ) {
-                                               if ( $size[0] < $width_orig && $size[1] < $height_orig &&
-                                                               $size[0] != $width && $size[1] != $height ) {
+                                       foreach ( $thumbSizes as $size ) {
+                                               if ( $size[0] < $width_orig && $size[1] < $height_orig
+                                                       && $size[0] != $width && $size[1] != $height )
+                                               {
                                                        $otherSizes[] = $this->makeSizeLink( $params, $size[0], $size[1] );
                                                }
                                        }
                                        $msgsmall = wfMessage( 'show-big-image-preview' )->
                                                rawParams( $this->makeSizeLink( $params, $width, $height ) )->
                                                parse();
-                                       if ( count( $otherSizes ) && $this->displayImg->getRepo()->canTransformVia404() ) {
+                                       if ( count( $otherSizes ) ) {
                                                $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()
                                                );
                                        }
@@ -355,7 +394,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 ) {
@@ -363,7 +402,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" );
                                }
@@ -372,7 +411,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,
@@ -410,13 +449,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() ) .
@@ -431,7 +470,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" );
                                }
@@ -456,13 +495,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
@@ -479,7 +518,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(),
                                        '',
@@ -491,7 +530,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(
@@ -504,15 +543,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 );
        }
 
        /**
@@ -542,8 +581,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();
@@ -551,18 +589,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 ) {
@@ -584,7 +622,7 @@ EOT
         * external editing (and instructions link) etc.
         */
        protected function uploadLinksBox() {
-               global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
+               global $wgEnableUploads, $wgUseExternalEditor;
 
                if ( !$wgEnableUploads ) {
                        return;
@@ -595,12 +633,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
@@ -616,14 +655,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
@@ -633,12 +672,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
 
@@ -667,10 +705,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();
@@ -694,7 +731,7 @@ EOT
                }
 
                if ( $count == 0 ) {
-                       $wgOut->wrapWikiMsg(
+                       $out->wrapWikiMsg(
                                Html::rawElement( 'div',
                                        array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
                                'nolinkstoimage'
@@ -702,18 +739,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"
                );
@@ -752,7 +789,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
@@ -760,31 +797,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
@@ -804,9 +840,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" );
        }
 
        /**
@@ -830,12 +866,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 );
        }
 
        /**
@@ -860,7 +896,7 @@ EOT
  *
  * @ingroup Media
  */
-class ImageHistoryList {
+class ImageHistoryList extends ContextSource {
 
        /**
         * @var Title
@@ -895,6 +931,7 @@ class ImageHistoryList {
                $this->title = $imagePage->getTitle();
                $this->imagePage = $imagePage;
                $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
+               $this->setContext( $imagePage->getContext() );
        }
 
        /**
@@ -916,14 +953,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>'
@@ -946,22 +982,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' );
-               $description = $file->getDescription();
+               $userId = $file->getUser( 'id' );
+               $userText = $file->getUser( 'text' );
+               $description = $file->getDescription( File::FOR_THIS_USER, $user );
 
                $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;
@@ -973,16 +1011,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(),
@@ -1000,7 +1038,9 @@ class ImageHistoryList {
                $row .= '<td>';
                if ( $iscur ) {
                        $row .= wfMsgHtml( 'filehist-current' );
-               } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+               } elseif ( $local && $this->title->quickUserCan( 'edit' )
+                       && $this->title->quickUserCan( 'upload' )
+               ) {
                        if ( $file->isDeleted( File::DELETED_FILE ) ) {
                                $row .= wfMsgHtml( 'filehist-revert' );
                        } else {
@@ -1011,7 +1051,7 @@ class ImageHistoryList {
                                        array(
                                                'action' => 'revert',
                                                'oldimage' => $img,
-                                               'wpEditToken' => $wgUser->getEditToken( $img )
+                                               'wpEditToken' => $user->getEditToken( $img )
                                        ),
                                        array( 'known', 'noclasses' )
                                );
@@ -1026,7 +1066,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();
@@ -1034,22 +1074,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>";
 
@@ -1061,7 +1101,10 @@ class ImageHistoryList {
                // Image dimensions + size
                $row .= '<td>';
                $row .= htmlspecialchars( $file->getDimensionsString() );
-               $row .= ' <span style="white-space: nowrap;">(' . Linker::formatSize( $file->getSize() ) . ')</span>';
+               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+               $row .= '<span style="white-space: nowrap;">';
+               $row .= $this->getContext()->msg( 'parentheses' )->rawParams( Linker::formatSize( $file->getSize() ) )->plain();
+               $row .= '</span>';
                $row .= '</td>';
 
                // Uploading user
@@ -1071,10 +1114,13 @@ 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 );
+                               $row .= $this->getContext()->msg( 'word-separator' )->plain();
+                               $row .= '<span style="white-space: nowrap;">';
+                               $row .= Linker::userToolLinks( $userId, $userText );
+                               $row .= '</span>';
                        } else {
-                               $row .= htmlspecialchars( $usertext );
+                               $row .= htmlspecialchars( $userText );
                        }
                }
                $row .= '</td>';
@@ -1098,8 +1144,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',
@@ -1110,9 +1155,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,
                        );
 
@@ -1186,6 +1231,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        }
 
        /**
+        * @param $row object
         * @return string
         */
        function formatRow( $row ) {
index f46974b..f9f6cee 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Variant of QueryPage which uses a gallery to output results.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
 
 /**
  * Variant of QueryPage which uses a gallery to output results, thus
index 5bfd3f5..a8540f2 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Some functions that are useful during startup.
+ *
+ * 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
+ */
 
 /**
  * Some functions that are useful during startup.
index 8a06c6f..c498a57 100644 (file)
@@ -1,14 +1,32 @@
 <?php
 /**
- * A License class for use on Special:Upload
+ * License selector for use on Special:Upload.
  *
- * @ingroup SpecialPage
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
+ * @ingroup SpecialPage
  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
  * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
  */
 
+/**
+ * A License class for use on Special:Upload
+ */
 class Licenses extends HTMLFormField {
        /**
         * @var string
index f1e19f9..214f495 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Functions to help implement an external link filter for spam control.
+ *
+ * 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
+ */
+
 
 /**
  * Some functions to help implement an external link filter for spam control.
index 918bebc..9fcac65 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Methods to make links and related items.
+ *
+ * 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
+ */
+
 /**
  * Some internal bits split of from Skin.php. These functions are used
  * for primarily page content: links, embedded images, table of contents. Links
@@ -397,6 +418,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
@@ -995,7 +1041,10 @@ class Linker {
                wfRunHooks( 'UserToolLinksEdit', array( $userId, $userText, &$items ) );
 
                if ( $items ) {
-                       return ' <span class="mw-usertoollinks">' . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped() . '</span>';
+                       return wfMessage( 'word-separator' )->plain()
+                               . '<span class="mw-usertoollinks">'
+                               . wfMessage( 'parentheses' )->rawParams( $wgLang->pipeList( $items ) )->escaped()
+                               . '</span>';
                } else {
                        return '';
                }
@@ -1079,8 +1128,9 @@ class Linker {
                } elseif ( $rev->userCan( Revision::DELETED_USER ) ) {
                        $userId = $rev->getUser( Revision::FOR_THIS_USER );
                        $userText = $rev->getUserText( Revision::FOR_THIS_USER );
-                       $link = self::userLink( $userId, $userText ) .
-                               ' ' . self::userToolLinks( $userId, $userText );
+                       $link = self::userLink( $userId, $userText )
+                               . wfMessage( 'word-separator' )->plain()
+                               . self::userToolLinks( $userId, $userText );
                } else {
                        $link = wfMsgHtml( 'rev-deleted-user' );
                }
@@ -1166,41 +1216,45 @@ class Linker {
                $pre = $match[1];
                $auto = $match[2];
                $post = $match[3];
-               $link = '';
-               if ( $title ) {
-                       $section = $auto;
-
-                       # Remove links that a user may have manually put in the autosummary
-                       # This could be improved by copying as much of Parser::stripSectionName as desired.
-                       $section = str_replace( '[[:', '', $section );
-                       $section = str_replace( '[[', '', $section );
-                       $section = str_replace( ']]', '', $section );
-
-                       $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
-                       if ( $local ) {
-                               $sectionTitle = Title::newFromText( '#' . $section );
-                       } else {
-                               $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
-                                       $title->getDBkey(), $section );
+               $comment = null;
+               wfRunHooks( 'FormatAutocomments', array( &$comment, $pre, $auto, $post, $title, $local ) );
+               if ( $comment === null ) {
+                       $link = '';
+                       if ( $title ) {
+                               $section = $auto;
+
+                               # Remove links that a user may have manually put in the autosummary
+                               # This could be improved by copying as much of Parser::stripSectionName as desired.
+                               $section = str_replace( '[[:', '', $section );
+                               $section = str_replace( '[[', '', $section );
+                               $section = str_replace( ']]', '', $section );
+
+                               $section = Sanitizer::normalizeSectionNameWhitespace( $section ); # bug 22784
+                               if ( $local ) {
+                                       $sectionTitle = Title::newFromText( '#' . $section );
+                               } else {
+                                       $sectionTitle = Title::makeTitleSafe( $title->getNamespace(),
+                                               $title->getDBkey(), $section );
+                               }
+                               if ( $sectionTitle ) {
+                                       $link = self::link( $sectionTitle,
+                                               $wgLang->getArrow(), array(), array(),
+                                               'noclasses' );
+                               } else {
+                                       $link = '';
+                               }
                        }
-                       if ( $sectionTitle ) {
-                               $link = self::link( $sectionTitle,
-                                       $wgLang->getArrow(), array(), array(),
-                                       'noclasses' );
-                       } else {
-                               $link = '';
+                       if ( $pre ) {
+                               # written summary $presep autocomment (summary /* section */)
+                               $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
                        }
+                       if ( $post ) {
+                               # autocomment $postsep written summary (/* section */ summary)
+                               $auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
+                       }
+                       $auto = '<span class="autocomment">' . $auto . '</span>';
+                       $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
                }
-               if ( $pre ) {
-                       # written summary $presep autocomment (summary /* section */)
-                       $pre .= wfMsgExt( 'autocomment-prefix', array( 'escapenoentities', 'content' ) );
-               }
-               if ( $post ) {
-                       # autocomment $postsep written summary (/* section */ summary)
-                       $auto .= wfMsgExt( 'colon-separator', array( 'escapenoentities', 'content' ) );
-               }
-               $auto = '<span class="autocomment">' . $auto . '</span>';
-               $comment = $pre . $link . $wgLang->getDirMark() . '<span dir="auto">' . $auto . $post . '</span>';
                return $comment;
        }
 
@@ -1595,9 +1649,9 @@ class Linker {
         * @return string
         */
        public static function generateRollback( $rev ) {
-               return '<span class="mw-rollback-link">['
-                       . self::buildRollbackLink( $rev )
-                       . ']</span>';
+               return '<span class="mw-rollback-link">'
+                       . wfMessage( 'brackets' )->rawParams( self::buildRollbackLink( $rev ) )->plain()
+                       . '</span>';
        }
 
        /**
index 716e7d8..0712ac8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * See docs/deferred.txt
+ * Updater for link tracking tables after a page edit.
  *
  * 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
+ */
+
+/**
+ * See docs/deferred.txt
+ *
  * @todo document (e.g. one-sentence top-level class description).
  */
-class LinksUpdate {
+class LinksUpdate extends SqlDataUpdate {
 
-       /**@{{
-        * @private
-        */
-       var $mId,            //!< Page ID of the article linked from
+       // @todo: make members protected, but make sure extensions don't break
+
+       public $mId,         //!< Page ID of the article linked from
                $mTitle,         //!< Title object of the article linked from
                $mParserOutput,  //!< Parser output
                $mLinks,         //!< Map of title strings to IDs for the links in the document
@@ -37,7 +42,6 @@ class LinksUpdate {
                $mDb,            //!< Database connection reference
                $mOptions,       //!< SELECT options to be used (array)
                $mRecursive;     //!< Whether to queue jobs for recursive updates
-       /**@}}*/
 
        /**
         * Constructor
@@ -47,22 +51,25 @@ class LinksUpdate {
         * @param $recursive Boolean: queue jobs for recursive updates?
         */
        function __construct( $title, $parserOutput, $recursive = true ) {
-               global $wgAntiLockFlags;
+               parent::__construct( );
 
-               if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
-                       $this->mOptions = array();
-               } else {
-                       $this->mOptions = array( 'FOR UPDATE' );
+               if ( !( $title instanceof Title ) ) {
+                       throw new MWException( "The calling convention to LinksUpdate::LinksUpdate() has changed. " .
+                               "Please see Article::editUpdates() for an invocation example.\n" );
                }
-               $this->mDb = wfGetDB( DB_MASTER );
 
-               if ( !is_object( $title ) ) {
+               if ( !( $parserOutput instanceof ParserOutput ) ) {
                        throw new MWException( "The calling convention to LinksUpdate::__construct() has changed. " .
                                "Please see WikiPage::doEditUpdates() for an invocation example.\n" );
                }
+
                $this->mTitle = $title;
                $this->mId = $title->getArticleID();
 
+               if ( !$this->mId ) {
+                       throw new MWException( "The Title object did not provide an article ID. Perhaps the page doesn't exist?" );
+               }
+
                $this->mParserOutput = $parserOutput;
                $this->mLinks = $parserOutput->getLinks();
                $this->mImages = $parserOutput->getImages();
@@ -253,51 +260,6 @@ class LinksUpdate {
                wfProfileOut( __METHOD__ );
        }
 
-       /**
-        * Invalidate the cache of a list of pages from a single namespace
-        *
-        * @param $namespace Integer
-        * @param $dbkeys Array
-        */
-       function invalidatePages( $namespace, $dbkeys ) {
-               if ( !count( $dbkeys ) ) {
-                       return;
-               }
-
-               /**
-                * Determine which pages need to be updated
-                * This is necessary to prevent the job queue from smashing the DB with
-                * large numbers of concurrent invalidations of the same page
-                */
-               $now = $this->mDb->timestamp();
-               $ids = array();
-               $res = $this->mDb->select( 'page', array( 'page_id' ),
-                       array(
-                               'page_namespace' => $namespace,
-                               'page_title IN (' . $this->mDb->makeList( $dbkeys ) . ')',
-                               'page_touched < ' . $this->mDb->addQuotes( $now )
-                       ), __METHOD__
-               );
-               foreach ( $res as $row ) {
-                       $ids[] = $row->page_id;
-               }
-               if ( !count( $ids ) ) {
-                       return;
-               }
-
-               /**
-                * Do the update
-                * We still need the page_touched condition, in case the row has changed since
-                * the non-locking select above.
-                */
-               $this->mDb->update( 'page', array( 'page_touched' => $now ),
-                       array(
-                               'page_id IN (' . $this->mDb->makeList( $ids ) . ')',
-                               'page_touched < ' . $this->mDb->addQuotes( $now )
-                       ), __METHOD__
-               );
-       }
-
        /**
         * @param $cats
         */
@@ -849,3 +811,74 @@ class LinksUpdate {
                }
        }
 }
+
+/**
+ * Update object handling the cleanup of links tables after a page was deleted.
+ **/
+class LinksDeletionUpdate extends SqlDataUpdate {
+
+       protected $mPage;     //!< WikiPage the wikipage that was deleted
+
+       /**
+        * Constructor
+        *
+        * @param $title Title of the page we're updating
+        * @param $parserOutput ParserOutput: output from a full parse of this page
+        * @param $recursive Boolean: queue jobs for recursive updates?
+        */
+       function __construct( WikiPage $page ) {
+               parent::__construct( );
+
+               $this->mPage = $page;
+       }
+
+       /**
+        * Do some database updates after deletion
+        */
+       public function doUpdate() {
+               $title = $this->mPage->getTitle();
+               $id = $this->mPage->getId();
+
+               # Delete restrictions for it
+               $this->mDb->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
+
+               # Fix category table counts
+               $cats = array();
+               $res = $this->mDb->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
+
+               foreach ( $res as $row ) {
+                       $cats [] = $row->cl_to;
+               }
+
+               $this->mPage->updateCategoryCounts( array(), $cats );
+
+               # If using cascading deletes, we can skip some explicit deletes
+               if ( !$this->mDb->cascadingDeletes() ) {
+                       $this->mDb->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
+
+                       # Delete outgoing links
+                       $this->mDb->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
+                       $this->mDb->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
+               }
+
+               # If using cleanup triggers, we can skip some manual deletes
+               if ( !$this->mDb->cleanupTriggers() ) {
+                       # Clean up recentchanges entries...
+                       $this->mDb->delete( 'recentchanges',
+                               array( 'rc_type != ' . RC_LOG,
+                                       'rc_namespace' => $title->getNamespace(),
+                                       'rc_title' => $title->getDBkey() ),
+                               __METHOD__ );
+                       $this->mDb->delete( 'recentchanges',
+                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
+                               __METHOD__ );
+               }
+       }
+}
index a50bf0d..9ce26d0 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Cache of the contents of localisation 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
+ */
 
 define( 'MW_LC_VERSION', 2 );
 
index 0113f91..36fcc30 100644 (file)
@@ -1,6 +1,7 @@
 <?php
-
 /**
+ * Helper methods to call functions and instance 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
@@ -16,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  */
 
 class MWFunction {
index 131ae1d..9745b9a 100644 (file)
@@ -1,8 +1,23 @@
 <?php
 /**
- * File for magic words
+ * File for magic words.
  *
- * See docs/magicword.txt
+ * See docs/magicword.txt.
+ *
+ * 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
@@ -84,6 +99,7 @@ class MagicWord {
                'numberoffiles',
                'numberofedits',
                'articlepath',
+               'pageid',
                'sitename',
                'server',
                'servername',
@@ -291,8 +307,8 @@ class MagicWord {
                $wgContLang->getMagic( $this );
                if ( !$this->mSynonyms ) {
                        $this->mSynonyms = array( 'dkjsagfjsgashfajsh' );
-                       #throw new MWException( "Error: invalid magic word '$id'" );
-                       wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
+                       throw new MWException( "Error: invalid magic word '$id'" );
+                       #wfDebugLog( 'exception', "Error: invalid magic word '$id'\n" );
                }
                wfProfileOut( __METHOD__ );
        }
index 96ce7a9..3a87a00 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Fetching and processing of interface messages.
+ *
+ * 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
+ */
+
 /**
  * The Message class provides methods which fullfil two basic services:
  *  - fetching interface messages
  * @see https://www.mediawiki.org/wiki/Localisation
  *
  * @since 1.17
- * @author Niklas Laxström
  */
 class Message {
        /**
index be6b27c..23955ae 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Resource message blobs storage used by the resource loader.
+ *
  * 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
  * @author Roan Kattouw
  * @author Trevor Parscal
  */
index e5e3296..229856d 100644 (file)
@@ -1,21 +1,23 @@
 <?php
 /**
+ * Base code to format metadata.
  *
  * Copyright 2004, Evan Prodromou <evan@wikitravel.org>.
  *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
+ * This program is 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.
+ * 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
+ * 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
  *
  * @author Evan Prodromou <evan@wikitravel.org>
  * @file
index b91af61..1873e7b 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Module defining helper functions for detecting and dealing with mime types.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  */
 
@@ -123,7 +138,7 @@ END_STRING
  * Implements functions related to mime types such as detection and mapping to
  * file extension.
  *
- * Instances of this class are stateles, there only needs to be one global instance
+ * Instances of this class are stateless, there only needs to be one global instance
  * of MimeMagic. Please use MimeMagic::singleton() to get that instance.
  */
 class MimeMagic {
@@ -215,8 +230,6 @@ class MimeMagic {
                                continue;
                        }
 
-                       #print "processing MIME line $s<br>";
-
                        $mime = substr( $s, 0, $i );
                        $ext = trim( substr($s, $i+1 ) );
 
index ac788aa..2e2b8d6 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * Provide things related to namespaces
+ * Provide things related to namespaces.
+ *
+ * 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
  */
 
@@ -14,7 +30,6 @@
  * Users and translators should not change them
  *
  */
-
 class MWNamespace {
 
        /**
@@ -50,7 +65,15 @@ class MWNamespace {
         */
        public static function isMovable( $index ) {
                global $wgAllowImageMoving;
-               return !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving )  || $index == NS_CATEGORY );
+
+               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving )  || $index == NS_CATEGORY );
+
+               /**
+                * @since 1.20
+                */
+               wfRunHooks( 'NamespaceIsMovable', array( $index, &$result ) );
+
+               return $result;
        }
 
        /**
@@ -316,6 +339,33 @@ class MWNamespace {
                        return $wgContentNamespaces;
                }
        }
+
+       /**
+        * List all namespace indices which are considered subject, aka not a talk
+        * or special namespace. See also MWNamespace::isSubject
+        *
+        * @return array of namespace indices
+        */
+       public static function getSubjectNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isSubject'
+               );
+       }
+
+       /**
+        * List all namespace indices which are considered talks, aka not a subject
+        * or special namespace. See also MWNamespace::isTalk
+        *
+        * @return array of namespace indices
+        */
+       public static function getTalkNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isTalk'
+               );
+       }
+
        /**
         * Is the namespace first-letter capitalized?
         *
@@ -354,4 +404,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 isNonincludable( $index ) {
+               global $wgNonincludableNamespaces;
+               return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
+       }
+
 }
index 747140a..46a43f6 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Functions to be used with PHP's output buffer
+ * Functions to be used with PHP's output buffer.
+ *
+ * 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 beaca5f..d0545da 100644 (file)
@@ -1,7 +1,24 @@
 <?php
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
+/**
+ * Preparation for the final page rendering.
+ *
+ * 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
+ */
 
 /**
  * This class should be covered by a general architecture document which does
@@ -1661,18 +1678,6 @@ class OutputPage extends ContextSource {
                return $cookies;
        }
 
-       /**
-        * Return whether this page is not cacheable because "useskin" or "uselang"
-        * URL parameters were passed.
-        *
-        * @return Boolean
-        */
-       function uncacheableBecauseRequestVars() {
-               $request = $this->getRequest();
-               return $request->getText( 'useskin', false ) === false
-                       && $request->getText( 'uselang', false ) === false;
-       }
-
        /**
         * Check if the request has a cache-varying cookie header
         * If it does, it's very important that we don't allow public caching
@@ -1734,7 +1739,7 @@ class OutputPage extends ContextSource {
                $headers = array();
                foreach( $this->mVaryHeader as $header => $option ) {
                        $newheader = $header;
-                       if( is_array( $option ) ) {
+                       if ( is_array( $option ) && count( $option ) > 0 ) {
                                $newheader .= ';' . implode( ';', $option );
                        }
                        $headers[] = $newheader;
@@ -1840,7 +1845,7 @@ class OutputPage extends ContextSource {
                        $response->header( $this->getXVO() );
                }
 
-               if( !$this->uncacheableBecauseRequestVars() && $this->mEnableClientCache ) {
+               if( $this->mEnableClientCache ) {
                        if(
                                $wgUseSquid && session_id() == '' && !$this->isPrintable() &&
                                $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
@@ -2465,7 +2470,7 @@ $templates
                        wfRunHooks( 'AjaxAddScript', array( &$this ) );
 
                        if( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) {
-                               $this->addModules( 'mediawiki.action.watch.ajax' );
+                               $this->addModules( 'mediawiki.page.watch.ajax' );
                        }
 
                        if ( $wgEnableMWSuggest && !$this->getUser()->getOption( 'disablesuggest', false ) ) {
@@ -2507,13 +2512,15 @@ $templates
        protected function makeResourceLoaderLink( $modules, $only, $useESI = false, array $extraQuery = array(), $loadCall = false ) {
                global $wgResourceLoaderUseESI;
 
+               $modules = (array) $modules;
+
                if ( !count( $modules ) ) {
                        return '';
                }
 
                if ( count( $modules ) > 1 ) {
                        // Remove duplicate module requests
-                       $modules = array_unique( (array) $modules );
+                       $modules = array_unique( $modules );
                        // Sort module names so requests are more uniform
                        sort( $modules );
 
@@ -2530,7 +2537,7 @@ $templates
                // Create keyed-by-group list of module objects from modules list
                $groups = array();
                $resourceLoader = $this->getResourceLoader();
-               foreach ( (array) $modules as $name ) {
+               foreach ( $modules as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        # Check that we're allowed to include this module on this page
                        if ( !$module
@@ -2551,7 +2558,7 @@ $templates
                }
 
                $links = '';
-               foreach ( $groups as $group => $modules ) {
+               foreach ( $groups as $group => $grpModules ) {
                        // Special handling for user-specific groups
                        $user = null;
                        if ( ( $group === 'user' || $group === 'private' ) && $this->getUser()->isLoggedIn() ) {
@@ -2573,14 +2580,30 @@ $templates
                                $extraQuery
                        );
                        $context = new ResourceLoaderContext( $resourceLoader, new FauxRequest( $query ) );
-                       // Drop modules that know they're empty
-                       foreach ( $modules as $key => $module ) {
+                       // Extract modules that know they're empty
+                       $emptyModules = array ();
+                       foreach ( $grpModules as $key => $module ) {
                                if ( $module->isKnownEmpty( $context ) ) {
-                                       unset( $modules[$key] );
+                                       $emptyModules[$key] = 'ready';
+                                       unset( $grpModules[$key] );
                                }
                        }
+                       // Inline empty modules: since they're empty, just mark them as 'ready'
+                       if ( count( $emptyModules ) > 0 && $only !== ResourceLoaderModule::TYPE_STYLES ) {
+                               // If we're only getting the styles, we don't need to do anything for empty modules.
+                               $links .= Html::inlineScript(
+
+                                               ResourceLoader::makeLoaderConditionalScript(
+
+                                                               ResourceLoader::makeLoaderStateScript( $emptyModules )
+
+                                               )
+
+                               ) . "\n";
+                       }
+
                        // If there are no modules left, skip this group
-                       if ( $modules === array() ) {
+                       if ( count( $grpModules ) === 0 ) {
                                continue;
                        }
 
@@ -2591,12 +2614,12 @@ $templates
                        if ( $group === 'private' ) {
                                if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
                                        $links .= Html::inlineStyle(
-                                               $resourceLoader->makeModuleResponse( $context, $modules )
+                                               $resourceLoader->makeModuleResponse( $context, $grpModules )
                                        );
                                } else {
                                        $links .= Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
-                                                       $resourceLoader->makeModuleResponse( $context, $modules )
+                                                       $resourceLoader->makeModuleResponse( $context, $grpModules )
                                                )
                                        );
                                }
@@ -2612,7 +2635,7 @@ $templates
                        if ( $group === 'user' ) {
                                // Get the maximum timestamp
                                $timestamp = 1;
-                               foreach ( $modules as $module ) {
+                               foreach ( $grpModules as $module ) {
                                        $timestamp = max( $timestamp, $module->getModifiedTime( $context ) );
                                }
                                // Add a version parameter so cache will break when things change
@@ -2620,7 +2643,7 @@ $templates
                        }
 
                        $url = ResourceLoader::makeLoaderURL(
-                               array_keys( $modules ),
+                               array_keys( $grpModules ),
                                $this->getLanguage()->getCode(),
                                $this->getSkin()->getSkinName(),
                                $user,
@@ -2642,7 +2665,7 @@ $templates
                                // Automatically select style/script elements
                                if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
                                        $link = Html::linkedStyle( $url );
-                               } else if ( $loadCall ) { 
+                               } else if ( $loadCall ) {
                                        $link = Html::inlineScript(
                                                ResourceLoader::makeLoaderConditionalScript(
                                                        Xml::encodeJsCall( 'mw.loader.load', array( $url, 'text/javascript', true ) )
@@ -2670,7 +2693,7 @@ $templates
         */
        function getHeadScripts() {
                global $wgResourceLoaderExperimentalAsyncLoading;
-               
+
                // Startup - this will immediately load jquery and mediawiki modules
                $scripts = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS, true );
 
@@ -2702,7 +2725,7 @@ $templates
                                )
                        );
                }
-               
+
                if ( $wgResourceLoaderExperimentalAsyncLoading ) {
                        $scripts .= $this->getScriptsForBottomQueue( true );
                }
@@ -2748,43 +2771,87 @@ $templates
                // Legacy Scripts
                $scripts .= "\n" . $this->mScripts;
 
-               $userScripts = array();
+               $defaultModules = array();
 
                // Add site JS if enabled
                if ( $wgUseSiteJs ) {
                        $scripts .= $this->makeResourceLoaderLink( 'site', ResourceLoaderModule::TYPE_SCRIPTS,
                                /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
                        );
-                       if( $this->getUser()->isLoggedIn() ){
-                               $userScripts[] = 'user.groups';
-                       }
+                       $defaultModules['site'] = 'loading';
+               } else {
+                       // The wiki is configured to not allow a site module.
+                       $defaultModules['site'] = 'missing';
                }
 
                // Add user JS if enabled
-               if ( $wgAllowUserJs && $this->getUser()->isLoggedIn() ) {
-                       if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
-                               # XXX: additional security check/prompt?
-                               // We're on a preview of a JS subpage
-                               // Exclude this page from the user module in case it's in there (bug 26283)
-                               $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
-                                       array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
-                               );
-                               // Load the previewed JS
-                               $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+               if ( $wgAllowUserJs ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               if( $this->getTitle() && $this->getTitle()->isJsSubpage() && $this->userCanPreview() ) {
+                                       # XXX: additional security check/prompt?
+                                       // We're on a preview of a JS subpage
+                                       // Exclude this page from the user module in case it's in there (bug 26283)
+                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS, false,
+                                               array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() ), $inHead
+                                       );
+                                       // Load the previewed JS
+                                       $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n";
+                                       // FIXME: If the user is previewing, say, ./vector.js, his ./common.js will be loaded
+                                       // asynchronously and may arrive *after* the inline script here. So the previewed code
+                                       // may execute before ./common.js runs. Normally, ./common.js runs before ./vector.js...
+                               } else {
+                                       // Include the user module normally, i.e., raw to avoid it being wrapped in a closure.
+                                       $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+                                               /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
+                                       );
+                               }
+                               $defaultModules['user'] = 'loading';
                        } else {
-                               // Include the user module normally
-                               // We can't do $userScripts[] = 'user'; because the user module would end up
-                               // being wrapped in a closure, so load it raw like 'site'
-                               $scripts .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_SCRIPTS,
+                               // Non-logged-in users have no user module. Treat it as empty and 'ready' to avoid
+                               // blocking default gadgets that might depend on it. Although arguably default-enabled
+                               // gadgets should not depend on the user module, it's harmless and less error-prone to
+                               // handle this case.
+                               $defaultModules['user'] = 'ready';
+                       }
+               } else {
+                       // User JS disabled
+                       $defaultModules['user'] = 'missing';
+               }
+
+               // Group JS is only enabled if site JS is enabled.
+               if ( $wgUseSiteJs ) {
+                       if ( $this->getUser()->isLoggedIn() ) {
+                               $scripts .= $this->makeResourceLoaderLink( 'user.groups', ResourceLoaderModule::TYPE_COMBINED,
                                        /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
                                );
+                               $defaultModules['user.groups'] = 'loading';
+                       } else {
+                               // Non-logged-in users have no user.groups module. Treat it as empty and 'ready' to
+                               // avoid blocking gadgets that might depend upon the module.
+                               $defaultModules['user.groups'] = 'ready';
                        }
+               } else {
+                       // Site (and group JS) disabled
+                       $defaultModules['user.groups'] = 'missing';
                }
-               $scripts .= $this->makeResourceLoaderLink( $userScripts, ResourceLoaderModule::TYPE_COMBINED,
-                       /* $useESI = */ false, /* $extraQuery = */ array(), /* $loadCall = */ $inHead
-               );
 
-               return $scripts;
+               $loaderInit = '';
+               if ( $inHead ) {
+                       // We generate loader calls anyway, so no need to fix the client-side loader's state to 'loading'.
+                       foreach ( $defaultModules as $m => $state ) {
+                               if ( $state == 'loading' ) {
+                                       unset( $defaultModules[$m] );
+                               }
+                       }
+               }
+               if ( count( $defaultModules ) > 0 ) {
+                       $loaderInit = Html::inlineScript(
+                               ResourceLoader::makeLoaderConditionalScript(
+                                       ResourceLoader::makeLoaderStateScript( $defaultModules )
+                               )
+                       ) . "\n";
+               }
+               return $loaderInit . $scripts;
        }
 
        /**
@@ -2939,12 +3006,11 @@ $templates
        }
 
        /**
-        * @param $unused
-        * @param $addContentType bool
+        * @param $addContentType bool: Whether <meta> specifying content type should be returned
         *
-        * @return string HTML tag links to be put in the header.
+        * @return array in format "link name or number => 'link html'".
         */
-       public function getHeadLinks( $unused = null, $addContentType = false ) {
+       public function getHeadLinksArray( $addContentType = false ) {
                global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI,
                        $wgSitename, $wgVersion, $wgHtml5, $wgMimeType,
                        $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes,
@@ -2957,20 +3023,20 @@ $templates
                        if ( $wgHtml5 ) {
                                # More succinct than <meta http-equiv=Content-Type>, has the
                                # same effect
-                               $tags[] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
+                               $tags['meta-charset'] = Html::element( 'meta', array( 'charset' => 'UTF-8' ) );
                        } else {
-                               $tags[] = Html::element( 'meta', array(
+                               $tags['meta-content-type'] = Html::element( 'meta', array(
                                        'http-equiv' => 'Content-Type',
                                        'content' => "$wgMimeType; charset=UTF-8"
                                ) );
-                               $tags[] = Html::element( 'meta', array(  // bug 15835
+                               $tags['meta-content-style-type'] = Html::element( 'meta', array(  // bug 15835
                                        'http-equiv' => 'Content-Style-Type',
                                        'content' => 'text/css'
                                ) );
                        }
                }
 
-               $tags[] = Html::element( 'meta', array(
+               $tags['meta-generator'] = Html::element( 'meta', array(
                        'name' => 'generator',
                        'content' => "MediaWiki $wgVersion",
                ) );
@@ -2979,7 +3045,7 @@ $templates
                if( $p !== 'index,follow' ) {
                        // http://www.robotstxt.org/wc/meta-user.html
                        // Only show if it's different from the default robots policy
-                       $tags[] = Html::element( 'meta', array(
+                       $tags['meta-robots'] = Html::element( 'meta', array(
                                'name' => 'robots',
                                'content' => $p,
                        ) );
@@ -2990,7 +3056,7 @@ $templates
                                "/<.*?" . ">/" => '',
                                "/_/" => ' '
                        );
-                       $tags[] = Html::element( 'meta', array(
+                       $tags['meta-keywords'] = Html::element( 'meta', array(
                                'name' => 'keywords',
                                'content' =>  preg_replace(
                                        array_keys( $strip ),
@@ -3007,7 +3073,11 @@ $templates
                        } else {
                                $a = 'name';
                        }
-                       $tags[] = Html::element( 'meta',
+                       $tagName = "meta-{$tag[0]}";
+                       if ( isset( $tags[$tagName] ) ) {
+                               $tagName .= $tag[1];
+                       }
+                       $tags[$tagName] = Html::element( 'meta',
                                array(
                                        $a => $tag[0],
                                        'content' => $tag[1]
@@ -3026,14 +3096,14 @@ $templates
                                && ( $this->getTitle()->exists() || $this->getTitle()->quickUserCan( 'create', $user ) ) ) {
                                // Original UniversalEditButton
                                $msg = $this->msg( 'edit' )->text();
-                               $tags[] = Html::element( 'link', array(
+                               $tags['universal-edit-button'] = Html::element( 'link', array(
                                        'rel' => 'alternate',
                                        'type' => 'application/x-wiki',
                                        'title' => $msg,
                                        'href' => $this->getTitle()->getLocalURL( 'action=edit' )
                                ) );
                                // Alternate edit link
-                               $tags[] = Html::element( 'link', array(
+                               $tags['alternative-edit'] = Html::element( 'link', array(
                                        'rel' => 'edit',
                                        'title' => $msg,
                                        'href' => $this->getTitle()->getLocalURL( 'action=edit' )
@@ -3046,15 +3116,15 @@ $templates
                # uses whichever one appears later in the HTML source. Make sure
                # apple-touch-icon is specified first to avoid this.
                if ( $wgAppleTouchIcon !== false ) {
-                       $tags[] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
+                       $tags['apple-touch-icon'] = Html::element( 'link', array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) );
                }
 
                if ( $wgFavicon !== false ) {
-                       $tags[] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+                       $tags['favicon'] = Html::element( 'link', array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
                }
 
                # OpenSearch description link
-               $tags[] = Html::element( 'link', array(
+               $tags['opensearch'] = Html::element( 'link', array(
                        'rel' => 'search',
                        'type' => 'application/opensearchdescription+xml',
                        'href' => wfScript( 'opensearch_desc' ),
@@ -3066,7 +3136,7 @@ $templates
                        # for the MediaWiki API (and potentially additional custom API
                        # support such as WordPress or Twitter-compatible APIs for a
                        # blogging extension, etc)
-                       $tags[] = Html::element( 'link', array(
+                       $tags['rsd'] = Html::element( 'link', array(
                                'rel' => 'EditURI',
                                'type' => 'application/rsd+xml',
                                // Output a protocol-relative URL here if $wgServer is protocol-relative
@@ -3086,14 +3156,14 @@ $templates
                                if ( !$urlvar ) {
                                        $variants = $lang->getVariants();
                                        foreach ( $variants as $_v ) {
-                                               $tags[] = Html::element( 'link', array(
+                                               $tags["variant-$_v"] = Html::element( 'link', array(
                                                        'rel' => 'alternate',
                                                        'hreflang' => $_v,
                                                        'href' => $this->getTitle()->getLocalURL( array( 'variant' => $_v ) ) )
                                                );
                                        }
                                } else {
-                                       $tags[] = Html::element( 'link', array(
+                                       $tags['canonical'] = Html::element( 'link', array(
                                                'rel' => 'canonical',
                                                'href' => $this->getTitle()->getCanonicalUrl()
                                        ) );
@@ -3116,7 +3186,7 @@ $templates
                }
 
                if ( $copyright ) {
-                       $tags[] = Html::element( 'link', array(
+                       $tags['copyright'] = Html::element( 'link', array(
                                'rel' => 'copyright',
                                'href' => $copyright )
                        );
@@ -3165,7 +3235,17 @@ $templates
                                }
                        }
                }
-               return implode( "\n", $tags );
+               return $tags;
+       }
+
+       /**
+        * @param $unused
+        * @param $addContentType bool: Whether <meta> specifying content type should be returned
+        *
+        * @return string HTML tag links to be put in the header.
+        */
+       public function getHeadLinks( $unused = null, $addContentType = false ) {
+               return implode( "\n", $this->getHeadLinksArray( $addContentType ) );
        }
 
        /**
@@ -3260,7 +3340,7 @@ $templates
                                $otherTags .= $this->makeResourceLoaderLink( 'user', ResourceLoaderModule::TYPE_STYLES, false,
                                        array( 'excludepage' => $this->getTitle()->getPrefixedDBkey() )
                                );
-                               
+
                                // Load the previewed CSS
                                // If needed, Janus it first. This is user-supplied CSS, so it's
                                // assumed to be right for the content language directionality.
index ec6490a..dad71f8 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Display something vaguely comprehensible in the event of a totally unrecoverable error.
+ *
+ * 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
+ */
+
 /**
  * Display something vaguely comprehensible in the event of a totally unrecoverable error.
  * Does not assume access to *anything*; no globals, no autloader, no database, no localisation.
@@ -17,9 +38,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..01a2439 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Variant of QueryPage which formats the result as a simple link to the 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 SpecialPage
+ */
 
 /**
  * Variant of QueryPage which formats the result as a simple link to the page
@@ -16,11 +37,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 472cb48..bcd6d14 100644 (file)
@@ -1,11 +1,30 @@
 <?php
 /**
- * @defgroup Pager Pager
+ * Efficient paging for SQL queries.
+ *
+ * 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 Pager
  */
 
+/**
+ * @defgroup Pager Pager
+ */
+
 /**
  * Basic pager interface.
  * @ingroup Pager
@@ -294,14 +313,14 @@ abstract class IndexPager extends ContextSource implements Pager {
                $join_conds = isset( $info['join_conds'] ) ? $info['join_conds'] : array();
                $sortColumns = array_merge( array( $this->mIndexField ), $this->mExtraSortFields );
                if ( $descending ) {
-                       $options['ORDER BY'] = implode( ',', $sortColumns );
+                       $options['ORDER BY'] = $sortColumns;
                        $operator = '>';
                } else {
                        $orderBy = array();
                        foreach ( $sortColumns as $col ) {
                                $orderBy[] = $col . ' DESC';
                        }
-                       $options['ORDER BY'] = implode( ',', $orderBy );
+                       $options['ORDER BY'] = $orderBy;
                        $operator = '<';
                }
                if ( $offset != '' ) {
@@ -663,35 +682,24 @@ abstract class AlphabeticPager extends IndexPager {
                        return $this->mNavigationBar;
                }
 
-               $lang = $this->getLanguage();
-
-               $opts = array( 'parsemag', 'escapenoentities' );
                $linkTexts = array(
-                       'prev' => wfMsgExt(
-                               'prevn',
-                               $opts,
-                               $lang->formatNum( $this->mLimit )
-                       ),
-                       'next' => wfMsgExt(
-                               'nextn',
-                               $opts,
-                               $lang->formatNum($this->mLimit )
-                       ),
-                       'first' => wfMsgExt( 'page_first', $opts ),
-                       'last' => wfMsgExt( 'page_last', $opts )
+                       'prev' => $this->msg( 'prevn' )->numParams( $this->mLimit )->escaped(),
+                       'next' => $this->msg( 'nextn' )->numParams( $this->mLimit )->escaped(),
+                       'first' => $this->msg( 'page_first' )->escaped(),
+                       'last' => $this->msg( 'page_last' )->escaped()
                );
 
+               $lang = $this->getLanguage();
+
                $pagingLinks = $this->getPagingLinks( $linkTexts );
                $limitLinks = $this->getLimitLinks();
                $limits = $lang->pipeList( $limitLinks );
 
-               $this->mNavigationBar = wfMessage( 'parentheses' )->rawParams(
-                       $lang->pipeList(
-                               array( $pagingLinks['first'],
-                                       $pagingLinks['last'] )
-                       ) )->escaped() . " " .
-                       wfMsgHtml( 'viewprevnext', $pagingLinks['prev'],
-                               $pagingLinks['next'], $limits );
+               $this->mNavigationBar = $this->msg( 'parentheses' )->rawParams(
+                       $lang->pipeList( array( $pagingLinks['first'],
+                       $pagingLinks['last'] ) ) )->escaped() . " " .
+                       $this->msg( 'viewprevnext' )->rawParams( $pagingLinks['prev'],
+                               $pagingLinks['next'], $limits )->escaped();
 
                if( !is_array( $this->getIndexField() ) ) {
                        # Early return to avoid undue nesting
@@ -705,21 +713,21 @@ abstract class AlphabeticPager extends IndexPager {
                        if( $first ) {
                                $first = false;
                        } else {
-                               $extra .= wfMsgExt( 'pipe-separator' , 'escapenoentities' );
+                               $extra .= $this->msg( 'pipe-separator' )->escaped();
                        }
 
                        if( $order == $this->mOrderType ) {
-                               $extra .= wfMsgHTML( $msgs[$order] );
+                               $extra .= $this->msg( $msgs[$order] )->escaped();
                        } else {
                                $extra .= $this->makeLink(
-                                       wfMsgHTML( $msgs[$order] ),
+                                       $this->msg( $msgs[$order] )->escaped(),
                                        array( 'order' => $order )
                                );
                        }
                }
 
                if( $extra !== '' ) {
-                       $extra = ' ' . wfMessage( 'parentheses' )->rawParams( $extra )->escaped();
+                       $extra = ' ' . $this->msg( 'parentheses' )->rawParams( $extra )->escaped();
                        $this->mNavigationBar .= $extra;
                }
 
@@ -757,35 +765,23 @@ abstract class ReverseChronologicalPager extends IndexPager {
                        return $this->mNavigationBar;
                }
 
-               $nicenumber = $this->getLanguage()->formatNum( $this->mLimit );
                $linkTexts = array(
-                       'prev' => wfMsgExt(
-                               'pager-newer-n',
-                               array( 'parsemag', 'escape' ),
-                               $nicenumber
-                       ),
-                       'next' => wfMsgExt(
-                               'pager-older-n',
-                               array( 'parsemag', 'escape' ),
-                               $nicenumber
-                       ),
-                       'first' => wfMsgHtml( 'histlast' ),
-                       'last' => wfMsgHtml( 'histfirst' )
+                       'prev' => $this->msg( 'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
+                       'next' => $this->msg( 'pager-older-n' )->numParams( $this->mLimit )->escaped(),
+                       'first' => $this->msg( 'histlast' )->escaped(),
+                       'last' => $this->msg( 'histfirst' )->escaped()
                );
 
                $pagingLinks = $this->getPagingLinks( $linkTexts );
                $limitLinks = $this->getLimitLinks();
                $limits = $this->getLanguage()->pipeList( $limitLinks );
-               $firstLastLinks = wfMessage( 'parentheses' )->rawParams( "{$pagingLinks['first']}" .
-                       wfMsgExt( 'pipe-separator' , 'escapenoentities' ) .
+               $firstLastLinks = $this->msg( 'parentheses' )->rawParams( "{$pagingLinks['first']}" .
+                       $this->msg( 'pipe-separator' )->escaped() .
                        "{$pagingLinks['last']}" )->escaped();
 
                $this->mNavigationBar = $firstLastLinks . ' ' .
-                       wfMsgHTML(
-                               'viewprevnext',
-                               $pagingLinks['prev'], $pagingLinks['next'],
-                               $limits
-                       );
+                       $this->msg( 'viewprevnext' )->rawParams(
+                               $pagingLinks['prev'], $pagingLinks['next'], $limits )->escaped();
 
                return $this->mNavigationBar;
        }
@@ -898,13 +894,13 @@ abstract class TablePager extends IndexPager {
                                                $image = 'Arr_d.png';
                                                $query['asc'] = '1';
                                                $query['desc'] = '';
-                                               $alt = htmlspecialchars( wfMsg( 'descending_abbrev' ) );
+                                               $alt = $this->msg( 'descending_abbrev' )->escaped();
                                        } else {
                                                # Ascending
                                                $image = 'Arr_u.png';
                                                $query['asc'] = '';
                                                $query['desc'] = '1';
-                                               $alt = htmlspecialchars( wfMsg( 'ascending_abbrev' ) );
+                                               $alt = $this->msg( 'ascending_abbrev' )->escaped();
                                        }
                                        $image = htmlspecialchars( "$wgStylePath/common/images/$image" );
                                        $link = $this->makeLink(
@@ -936,7 +932,7 @@ abstract class TablePager extends IndexPager {
         */
        function getEmptyBody() {
                $colspan = count( $this->getFieldNames() );
-               $msgEmpty = wfMsgHtml( 'table_pager_empty' );
+               $msgEmpty = $this->msg( 'table_pager_empty' )->escaped();
                return "<tr><td colspan=\"$colspan\">$msgEmpty</td></tr>\n";
        }
 
@@ -1082,7 +1078,7 @@ abstract class TablePager extends IndexPager {
                $linkTexts = array();
                $disabledTexts = array();
                foreach ( $labels as $type => $label ) {
-                       $msgLabel = wfMsgHtml( $label );
+                       $msgLabel = $this->msg( $label )->escaped();
                        $linkTexts[$type] = "<img src=\"$path/{$images[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
                        $disabledTexts[$type] = "<img src=\"$path/{$disabledImages[$type]}\" alt=\"$msgLabel\"/><br />$msgLabel";
                }
@@ -1174,9 +1170,10 @@ abstract class TablePager extends IndexPager {
         */
        function getLimitDropdown() {
                # Make the select with some explanatory text
-               $msgSubmit = wfMsgHtml( 'table_pager_limit_submit' );
+               $msgSubmit = $this->msg( 'table_pager_limit_submit' )->escaped();
 
-               return wfMsgHtml( 'table_pager_limit', $this->getLimitSelect() ) .
+               return $this->msg( 'table_pager_limit' )
+                       ->rawParams( $this->getLimitSelect() )->escaped() .
                        "\n<input type=\"submit\" value=\"$msgSubmit\"/>\n" .
                        $this->getHiddenFields( array( 'limit' ) );
        }
index 9700b90..2dbc7ec 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Parser to extract query parameters out of REQUEST_URI paths.
+ *
+ * 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
+ */
+
 /**
  * PathRouter class.
  * This class can take patterns such as /wiki/$1 and use them to
@@ -34,7 +55,7 @@
  *     the relevant contents
  *   - The default behavior is equivalent to `array( 'title' => '$1' )`,
  *     if you don't want the title parameter you can explicitly use `array( 'title' => false )`
- *   - You can specify a value that won't have replacements in it 
+ *   - You can specify a value that won't have replacements in it
  *     using `'foo' => array( 'value' => 'bar' );`
  *
  * Options:
  */
 class PathRouter {
 
+       /**
+        * @var array
+        */
+       private $patterns = array();
+
        /**
         * Protected helper to do the actual bulk work of adding a single pattern.
         * This is in a separate method so that add() can handle the difference between
         * a single string $path and an array() $path that contains multiple path
         * patterns each with an associated $key to pass on.
+        * @param $path string
+        * @param $params array
+        * @param $options array
+        * @param $key null|string
         */
        protected function doAdd( $path, $params, $options, $key = null ) {
                // Make sure all paths start with a /
@@ -140,6 +170,9 @@ class PathRouter {
        /**
         * Add a new path pattern to the path router with the strict option on
         * @see self::add
+        * @param $path string|array
+        * @param $params array
+        * @param $options array
         */
        public function addStrict( $path, $params = array(), $options = array() ) {
                $options['strict'] = true;
@@ -158,6 +191,10 @@ class PathRouter {
                array_multisort( $weights, SORT_DESC, SORT_NUMERIC, $this->patterns );
        }
 
+       /**
+        * @param $pattern object
+        * @return float|int
+        */
        protected static function makeWeight( $pattern ) {
                # Start with a weight of 0
                $weight = 0;
@@ -202,7 +239,7 @@ class PathRouter {
                // Make sure our patterns are sorted by weight so the most specific
                // matches are tested first
                $this->sortByWeight();
-               
+
                $matches = null;
 
                foreach ( $this->patterns as $pattern ) {
@@ -219,6 +256,11 @@ class PathRouter {
                return is_null( $matches ) ? array() : $matches;
        }
 
+       /**
+        * @param $path string
+        * @param $pattern string
+        * @return array|null
+        */
        protected static function extractTitle( $path, $pattern ) {
                // Convert the path pattern into a regexp we can match with
                $regexp = preg_quote( $pattern->path, '#' );
@@ -321,6 +363,8 @@ class PathRouterPatternReplacer {
         * We do this inside of a replacement callback because after replacement we can't tell the
         * difference between a $1 that was not replaced and a $1 that was part of
         * the content a $1 was replaced with.
+        * @param $value string
+        * @return string
         */
        public function replace( $value ) {
                $this->error = false;
@@ -331,6 +375,10 @@ class PathRouterPatternReplacer {
                return $value;
        }
 
+       /**
+        * @param $m array
+        * @return string
+        */
        protected function callback( $m ) {
                if ( $m[1] == "key" ) {
                        if ( is_null( $this->key ) ) {
index 4edcb06..452dbc5 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Provides of semaphore semantics for restricting the number
+ * of workers that may be concurrently performing the same task.
+ *
+ * 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
+ */
 
 /**
  *  When you have many workers (threads/servers) giving service, and a
index f54d732..bf63d65 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Form to edit user perferences.
+ *
+ * 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
+ */
+
 /**
  * We're now using the HTMLForm object with some customisation to generate the
  * Preferences form. This object handles generic submission, CSRF protection,
@@ -24,7 +45,6 @@
  * Once fields have been retrieved and validated, submission logic is handed
  * over to the tryUISubmit static method of this class.
  */
-
 class Preferences {
        static $defaultPreferences = null;
        static $saveFilters = array(
@@ -351,7 +371,10 @@ class Preferences {
 
                        $emailAddress = $user->getEmail() ? htmlspecialchars( $user->getEmail() ) : '';
                        if ( $wgAuth->allowPropChange( 'emailaddress' ) ) {
-                               $emailAddress .= $emailAddress == '' ? $link : " ($link)";
+                               $emailAddress .= $emailAddress == '' ? $link : (
+                                       $context->msg( 'word-separator' )->plain()
+                                       . $context->msg( 'parentheses' )->rawParams( $link )->plain()
+                               );
                        }
 
 
index 0efe1bd..5d4b35c 100644 (file)
@@ -1,11 +1,31 @@
 <?php
 /**
- * PrefixSearch - Handles searching prefixes of titles and finding any page
+ * Prefix search of page names.
+ *
+ * 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
+ */
+
+/**
+ * Handles searching prefixes of titles and finding any page
  * names that match. Used largely by the OpenSearch implementation.
  *
  * @ingroup Search
  */
-
 class PrefixSearch {
        /**
         * Do a prefix search of titles and return a list of matching page names.
index aa4ce44..349789f 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Functions for dealing with proxies
+ * Functions for dealing with proxies.
+ *
+ * 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 151cc76..4440aac 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * Contain a class for special pages
+ * Base code for "query" special 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 SpecialPage
  */
@@ -360,7 +376,7 @@ abstract class QueryPage extends SpecialPage {
                        $options = isset( $query['options'] ) ? (array)$query['options'] : array();
                        $join_conds = isset( $query['join_conds'] ) ? (array)$query['join_conds'] : array();
                        if ( count( $order ) ) {
-                               $options['ORDER BY'] = implode( ', ', $order );
+                               $options['ORDER BY'] = $order;
                        }
                        if ( $limit !== false ) {
                                $options['LIMIT'] = intval( $limit );
@@ -483,7 +499,7 @@ abstract class QueryPage extends SpecialPage {
                                        $updateddate = $lang->userDate( $ts, $user );
                                        $updatedtime = $lang->userTime( $ts, $user );
                                        $out->addMeta( 'Data-Cache-Time', $ts );
-                                       $out->addInlineScript( "var dataCacheTime = '$ts';" );
+                                       $out->addJsConfigVars( 'dataCacheTime', $ts );
                                        $out->addWikiMsg( 'perfcachedts', $updated, $updateddate, $updatedtime, $maxResults );
                                } else {
                                        $out->addWikiMsg( 'perfcached', $maxResults );
@@ -492,7 +508,7 @@ abstract class QueryPage extends SpecialPage {
                                # If updates on this page have been disabled, let the user know
                                # that the data set won't be refreshed for now
                                if ( is_array( $wgDisableQueryPageUpdate ) && in_array( $this->getName(), $wgDisableQueryPageUpdate ) ) {
-                                       $out->addWikiMsg( 'querypage-no-updates' );
+                                       $out->wrapWikiMsg( "<div class=\"mw-querypage-no-updates\">\n$1\n</div>", 'querypage-no-updates' );
                                }
                        }
                }
@@ -671,7 +687,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 e57efae..cd8a1b5 100644 (file)
@@ -1,5 +1,25 @@
 <?php
-
+/**
+ * Utility class for creating and accessing recent change 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
+ */
 /**
  * Utility class for creating new RC entries
  *
@@ -658,7 +678,9 @@ class RecentChange {
                        $wgCanonicalServer, $wgScript;
 
                if( $this->mAttribs['rc_type'] == RC_LOG ) {
-                       $titleObj = SpecialPage::getTitleFor( 'Log', $this->mAttribs['rc_log_type'] );
+                       // Don't use SpecialPage::getTitleFor, backwards compatibility with
+                       // IRC API which expects "Log".
+                       $titleObj = Title::newFromText( 'Log/' . $this->mAttribs['rc_log_type'], NS_SPECIAL );
                } else {
                        $titleObj =& $this->getTitle();
                }
index 1147e6a..13eaae4 100644 (file)
@@ -1,9 +1,29 @@
 <?php
+/**
+ * Representation of a page version.
+ *
+ * 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
  */
-class Revision {
+class Revision implements IDBAccessObject {
        protected $mId;
        protected $mPage;
        protected $mUserText;
@@ -27,7 +47,7 @@ class Revision {
        const DELETED_RESTRICTED = 8;
        // Convenience field
        const SUPPRESSED_USER = 12;
-       // Audience options for Revision::getText()
+       // Audience options for accessors
        const FOR_PUBLIC = 1;
        const FOR_THIS_USER = 2;
        const RAW = 3;
@@ -36,11 +56,17 @@ class Revision {
         * Load a page revision from a given revision ID number.
         * Returns null if no such revision can be found.
         *
+        * $flags include:
+        *      IDBAccessObject::LATEST_READ  : Select the data from the master
+        *      IDBAccessObject::LOCKING_READ : Select & lock the data from the master
+        *      IDBAccessObject::AVOID_MASTER : Avoid master queries; data may be stale
+        *
         * @param $id Integer
+        * @param $flags Integer (optional)
         * @return Revision or null
         */
-       public static function newFromId( $id ) {
-               return Revision::newFromConds( array( 'rev_id' => intval( $id ) ) );
+       public static function newFromId( $id, $flags = 0 ) {
+               return self::newFromConds( array( 'rev_id' => intval( $id ) ), $flags );
        }
 
        /**
@@ -48,11 +74,17 @@ class Revision {
         * that's attached to a given title. If not attached
         * to that title, will return null.
         *
+        * $flags include:
+        *      IDBAccessObject::LATEST_READ  : Select the data from the master
+        *      IDBAccessObject::LOCKING_READ : Select & lock the data from the master
+        *      IDBAccessObject::AVOID_MASTER : Avoid master queries; data may be stale
+        *
         * @param $title Title
         * @param $id Integer (optional)
+        * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromTitle( $title, $id = 0 ) {
+       public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
                $conds = array(
                        'page_namespace' => $title->getNamespace(),
                        'page_title'     => $title->getDBkey()
@@ -60,7 +92,7 @@ class Revision {
                if ( $id ) {
                        // Use the specified ID
                        $conds['rev_id'] = $id;
-               } elseif ( wfGetLB()->getServerCount() > 1 ) {
+               } elseif ( !( $flags & self::AVOID_MASTER ) && wfGetLB()->getServerCount() > 1 ) {
                        // Get the latest revision ID from the master
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
@@ -72,7 +104,7 @@ class Revision {
                        // Use a join to get the latest revision
                        $conds[] = 'rev_id=page_latest';
                }
-               return Revision::newFromConds( $conds );
+               return self::newFromConds( $conds, $flags );
        }
 
        /**
@@ -80,15 +112,21 @@ class Revision {
         * that's attached to a given page ID.
         * Returns null if no such revision can be found.
         *
+        * $flags include:
+        *      IDBAccessObject::LATEST_READ  : Select the data from the master
+        *      IDBAccessObject::LOCKING_READ : Select & lock the data from the master
+        *      IDBAccessObject::AVOID_MASTER : Avoid master queries; data may be stale
+        *
         * @param $revId Integer
         * @param $pageId Integer (optional)
+        * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromPageId( $pageId, $revId = 0 ) {
+       public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
                $conds = array( 'page_id' => $pageId );
                if ( $revId ) {
                        $conds['rev_id'] = $revId;
-               } elseif ( wfGetLB()->getServerCount() > 1 ) {
+               } elseif ( !( $flags & self::AVOID_MASTER ) && wfGetLB()->getServerCount() > 1 ) {
                        // Get the latest revision ID from the master
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $dbw->selectField( 'page', 'page_latest', $conds, __METHOD__ );
@@ -99,7 +137,7 @@ class Revision {
                } else {
                        $conds[] = 'rev_id = page_latest';
                }
-               return Revision::newFromConds( $conds );
+               return self::newFromConds( $conds, $flags );
        }
 
        /**
@@ -155,7 +193,7 @@ class Revision {
         * @return Revision or null
         */
        public static function loadFromId( $db, $id ) {
-               return Revision::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
+               return self::loadFromConds( $db, array( 'rev_id' => intval( $id ) ) );
        }
 
        /**
@@ -175,7 +213,7 @@ class Revision {
                } else {
                        $conds[] = 'rev_id=page_latest';
                }
-               return Revision::loadFromConds( $db, $conds );
+               return self::loadFromConds( $db, $conds );
        }
 
        /**
@@ -194,7 +232,7 @@ class Revision {
                } else {
                        $matchId = 'page_latest';
                }
-               return Revision::loadFromConds( $db,
+               return self::loadFromConds( $db,
                        array( "rev_id=$matchId",
                                   'page_namespace' => $title->getNamespace(),
                                   'page_title'     => $title->getDBkey() )
@@ -212,7 +250,7 @@ class Revision {
         * @return Revision or null
         */
        public static function loadFromTimestamp( $db, $title, $timestamp ) {
-               return Revision::loadFromConds( $db,
+               return self::loadFromConds( $db,
                        array( 'rev_timestamp'  => $db->timestamp( $timestamp ),
                                   'page_namespace' => $title->getNamespace(),
                                   'page_title'     => $title->getDBkey() )
@@ -223,14 +261,17 @@ class Revision {
         * Given a set of conditions, fetch a revision.
         *
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return Revision or null
         */
-       public static function newFromConds( $conditions ) {
-               $db = wfGetDB( DB_SLAVE );
-               $rev = Revision::loadFromConds( $db, $conditions );
-               if( is_null( $rev ) && wfGetLB()->getServerCount() > 1 ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $rev = Revision::loadFromConds( $dbw, $conditions );
+       private static function newFromConds( $conditions, $flags = 0 ) {
+               $db = wfGetDB( ( $flags & self::LATEST_READ ) ? DB_MASTER : DB_SLAVE );
+               $rev = self::loadFromConds( $db, $conditions, $flags );
+               if ( is_null( $rev ) && wfGetLB()->getServerCount() > 1 ) {
+                       if ( !( $flags & self::LATEST_READ ) && !( $flags & self::AVOID_MASTER ) ) {
+                               $dbw = wfGetDB( DB_MASTER );
+                               $rev = self::loadFromConds( $dbw, $conditions, $flags );
+                       }
                }
                return $rev;
        }
@@ -241,10 +282,11 @@ class Revision {
         *
         * @param $db DatabaseBase
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return Revision or null
         */
-       private static function loadFromConds( $db, $conditions ) {
-               $res = Revision::fetchFromConds( $db, $conditions );
+       private static function loadFromConds( $db, $conditions, $flags = 0 ) {
+               $res = self::fetchFromConds( $db, $conditions, $flags );
                if( $res ) {
                        $row = $res->fetchObject();
                        if( $row ) {
@@ -265,7 +307,7 @@ class Revision {
         * @return ResultWrapper
         */
        public static function fetchRevision( $title ) {
-               return Revision::fetchFromConds(
+               return self::fetchFromConds(
                        wfGetDB( DB_SLAVE ),
                        array( 'rev_id=page_latest',
                                   'page_namespace' => $title->getNamespace(),
@@ -280,20 +322,25 @@ class Revision {
         *
         * @param $db DatabaseBase
         * @param $conditions Array
+        * @param $flags integer (optional)
         * @return ResultWrapper
         */
-       private static function fetchFromConds( $db, $conditions ) {
+       private static function fetchFromConds( $db, $conditions, $flags = 0 ) {
                $fields = array_merge(
                        self::selectFields(),
                        self::selectPageFields(),
                        self::selectUserFields()
                );
+               $options = array( 'LIMIT' => 1 );
+               if ( $flags & self::FOR_UPDATE ) {
+                       $options[] = 'FOR UPDATE';
+               }
                return $db->select(
                        array( 'revision', 'page', 'user' ),
                        $fields,
                        $conditions,
                        __METHOD__,
-                       array( 'LIMIT' => 1 ),
+                       $options,
                        array( 'page' => self::pageJoinCond(), 'user' => self::userJoinCond() )
                );
        }
@@ -361,7 +408,9 @@ class Revision {
                        'page_namespace',
                        'page_title',
                        'page_id',
-                       'page_latest'
+                       'page_latest',
+                       'page_is_redirect',
+                       'page_len',
                );
        }
 
@@ -373,6 +422,29 @@ class Revision {
                return array( 'user_name' );
        }
 
+       /**
+        * Do a batched query to get the parent revision lengths
+        * @param $db DatabaseBase
+        * @param $revIds Array
+        * @return array
+        */
+       public static function getParentLengths( $db, array $revIds ) {
+               $revLens = array();
+               if ( !$revIds ) {
+                       return $revLens; // empty
+               }
+               wfProfileIn( __METHOD__ );
+               $res = $db->select( 'revision',
+                       array( 'rev_id', 'rev_len' ),
+                       array( 'rev_id' => $revIds ),
+                       __METHOD__ );
+               foreach ( $res as $row ) {
+                       $revLens[$row->rev_id] = $row->rev_len;
+               }
+               wfProfileOut( __METHOD__ );
+               return $revLens;
+       }
+
        /**
         * Constructor
         *
@@ -473,7 +545,7 @@ class Revision {
        /**
         * Get revision ID
         *
-        * @return Integer
+        * @return Integer|null
         */
        public function getId() {
                return $this->mId;
@@ -492,7 +564,7 @@ class Revision {
        /**
         * Get text row ID
         *
-        * @return Integer
+        * @return Integer|null
         */
        public function getTextId() {
                return $this->mTextId;
@@ -510,7 +582,7 @@ class Revision {
        /**
         * Returns the length of the text in this revision, or null if unknown.
         *
-        * @return Integer
+        * @return Integer|null
         */
        public function getSize() {
                return $this->mSize;
@@ -519,30 +591,34 @@ class Revision {
        /**
         * Returns the base36 sha1 of the text in this revision, or null if unknown.
         *
-        * @return String
+        * @return String|null
         */
        public function getSha1() {
                return $this->mSha1;
        }
 
        /**
-        * Returns the title of the page associated with this entry.
+        * Returns the title of the page associated with this entry or null.
         *
-        * @return Title
+        * Will do a query, when title is not set and id is given.
+        *
+        * @return Title|null
         */
        public function getTitle() {
                if( isset( $this->mTitle ) ) {
                        return $this->mTitle;
                }
-               $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow(
-                       array( 'page', 'revision' ),
-                       self::selectPageFields(),
-                       array( 'page_id=rev_page',
-                                  'rev_id' => $this->mId ),
-                       __METHOD__ );
-               if ( $row ) {
-                       $this->mTitle = Title::newFromRow( $row );
+               if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL
+                       $dbr = wfGetDB( DB_SLAVE );
+                       $row = $dbr->selectRow(
+                               array( 'page', 'revision' ),
+                               self::selectPageFields(),
+                               array( 'page_id=rev_page',
+                                          'rev_id' => $this->mId ),
+                               __METHOD__ );
+                       if ( $row ) {
+                               $this->mTitle = Title::newFromRow( $row );
+                       }
                }
                return $this->mTitle;
        }
@@ -559,7 +635,7 @@ class Revision {
        /**
         * Get the page ID
         *
-        * @return Integer
+        * @return Integer|null
         */
        public function getPage() {
                return $this->mPage;
@@ -572,7 +648,7 @@ class Revision {
         *
         * @param $audience Integer: one of:
         *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::FOR_THIS_USER    to be displayed to the given user
         *      Revision::RAW              get the ID regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
@@ -604,7 +680,7 @@ class Revision {
         *
         * @param $audience Integer: one of:
         *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::FOR_THIS_USER    to be displayed to the given user
         *      Revision::RAW              get the text regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
@@ -644,7 +720,7 @@ class Revision {
         *
         * @param $audience Integer: one of:
         *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::FOR_THIS_USER    to be displayed to the given user
         *      Revision::RAW              get the text regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
@@ -722,7 +798,7 @@ class Revision {
         *
         * @param $audience Integer: one of:
         *      Revision::FOR_PUBLIC       to be displayed to all users
-        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::FOR_THIS_USER    to be displayed to the given user
         *      Revision::RAW              get the text regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
@@ -785,7 +861,7 @@ class Revision {
                if( $this->getTitle() ) {
                        $prev = $this->getTitle()->getPreviousRevisionID( $this->getId() );
                        if( $prev ) {
-                               return Revision::newFromTitle( $this->getTitle(), $prev );
+                               return self::newFromTitle( $this->getTitle(), $prev );
                        }
                }
                return null;
@@ -800,7 +876,7 @@ class Revision {
                if( $this->getTitle() ) {
                        $next = $this->getTitle()->getNextRevisionID( $this->getId() );
                        if ( $next ) {
-                               return Revision::newFromTitle( $this->getTitle(), $next );
+                               return self::newFromTitle( $this->getTitle(), $next );
                        }
                }
                return null;
@@ -930,7 +1006,7 @@ class Revision {
                                $text = gzdeflate( $text );
                                $flags[] = 'gzip';
                        } else {
-                               wfDebug( "Revision::compressRevisionText() -- no zlib support, not compressing\n" );
+                               wfDebug( __METHOD__ . " -- no zlib support, not compressing\n" );
                        }
                }
                return implode( ',', $flags );
@@ -949,7 +1025,7 @@ class Revision {
                wfProfileIn( __METHOD__ );
 
                $data = $this->mText;
-               $flags = Revision::compressRevisionText( $data );
+               $flags = self::compressRevisionText( $data );
 
                # Write to external storage if required
                if( $wgDefaultExternalStore ) {
@@ -999,7 +1075,7 @@ class Revision {
                                        ? $this->getPreviousRevisionId( $dbw )
                                        : $this->mParentId,
                                'rev_sha1'       => is_null( $this->mSha1 )
-                                       ? Revision::base36Sha1( $this->mText )
+                                       ? self::base36Sha1( $this->mText )
                                        : $this->mSha1
                        ), __METHOD__
                );
@@ -1100,7 +1176,8 @@ class Revision {
 
                $current = $dbw->selectRow(
                        array( 'page', 'revision' ),
-                       array( 'page_latest', 'rev_text_id', 'rev_len', 'rev_sha1' ),
+                       array( 'page_latest', 'page_namespace', 'page_title',
+                               'rev_text_id', 'rev_len', 'rev_sha1' ),
                        array(
                                'page_id' => $pageId,
                                'page_latest=rev_id',
@@ -1117,6 +1194,7 @@ class Revision {
                                'len'        => $current->rev_len,
                                'sha1'       => $current->rev_sha1
                                ) );
+                       $revision->setTitle( Title::makeTitle( $current->page_namespace, $current->page_title ) );
                } else {
                        $revision = null;
                }
@@ -1221,7 +1299,7 @@ class Revision {
        static function countByTitle( $db, $title ) {
                $id = $title->getArticleID();
                if( $id ) {
-                       return Revision::countByPageId( $db, $id );
+                       return self::countByPageId( $db, $id );
                }
                return 0;
        }
index a61120e..fc777b5 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Holders of revision list for a single 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
+ */
+
 /**
  * List for revision table items for a single page
  */
@@ -329,12 +350,12 @@ class RevisionItem extends RevisionItemBase {
         */
        protected function getDiffLink() {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return wfMsgHtml('diff');
+                       return $this->context->msg( 'diff' )->escaped();
                } else {
                        return
                                Linker::link(
                                        $this->list->title,
-                                       wfMsgHtml('diff'),
+                                       $this->context->msg( 'diff' )->escaped(),
                                        array(),
                                        array(
                                                'diff' => $this->revision->getId(),
@@ -350,13 +371,14 @@ class RevisionItem extends RevisionItemBase {
        }
 
        public function getHTML() {
-               $difflink = $this->getDiffLink();
+               $difflink = $this->context->msg( 'parentheses' )
+                       ->rawParams( $this->getDiffLink() )->escaped();
                $revlink = $this->getRevisionLink();
                $userlink = Linker::revUserLink( $this->revision );
                $comment = Linker::revComment( $this->revision );
                if ( $this->isDeleted() ) {
                        $revlink = "<span class=\"history-deleted\">$revlink</span>";
                }
-               return "<li>($difflink) $revlink $userlink $comment</li>";
+               return "<li>$difflink $revlink $userlink $comment</li>";
        }
 }
index a2459c4..8cd5a37 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * XHTML sanitizer for MediaWiki
+ * XHTML sanitizer for %MediaWiki.
  *
  * Copyright © 2002-2005 Brion Vibber <brion@pobox.com> et al
  * http://www.mediawiki.org/
index 97c6bbf..359b20b 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Expansion of the PHP execution time limit feature for a function call.
+ *
+ * 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 to expand PHP execution time for a function call.
index 34d829c..7b98568 100644 (file)
@@ -1,9 +1,28 @@
 <?php
 /**
  * Dynamically change configuration variables based on the test suite name and a cookie value.
+ *
  * For details on how to configure a wiki for a Selenium test, see:
  * http://www.mediawiki.org/wiki/SeleniumFramework#Test_Wiki_configuration
+ *
+ * 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
  */
+
 if ( !defined( 'MEDIAWIKI' ) ) {
        die( 1 );
 }
index 68a715f..18a880e 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Include most things that's need to customize the site
+ * Include most things that's need to customize the site.
+ *
+ * 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
  */
@@ -62,9 +77,6 @@ if ( $wgLogo === false ) $wgLogo = "$wgStylePath/common/images/wiki.png";
 
 if ( $wgUploadPath === false ) $wgUploadPath = "$wgScriptPath/images";
 if ( $wgUploadDirectory === false ) $wgUploadDirectory = "$IP/images";
-
-if ( $wgTmpDirectory === false ) $wgTmpDirectory = "{$wgUploadDirectory}/tmp";
-
 if ( $wgReadOnlyFile === false ) $wgReadOnlyFile = "{$wgUploadDirectory}/lock_yBgMBwiR";
 if ( $wgFileCacheDirectory === false ) $wgFileCacheDirectory = "{$wgUploadDirectory}/cache";
 if ( $wgDeletedDirectory === false ) $wgDeletedDirectory = "{$wgUploadDirectory}/deleted";
@@ -385,7 +397,12 @@ if ( !defined( 'MW_COMPILED' ) ) {
        wfProfileOut( $fname . '-includes' );
 }
 
-# Now that GlobalFunctions is loaded, set the default for $wgCanonicalServer
+# Now that GlobalFunctions is loaded, set defaults that depend
+# on it.
+if ( $wgTmpDirectory === false ) {
+       $wgTmpDirectory = wfTempDir();
+}
+
 if ( $wgCanonicalServer === false ) {
        $wgCanonicalServer = wfExpandUrl( $wgServer, PROTO_HTTP );
 }
index bd5e4d8..6410695 100644 (file)
@@ -1,6 +1,118 @@
 <?php
 /**
- * This is a class used to hold configuration settings, particularly for multi-wiki sites.
+ * Configuration holder, particularly for multi-wiki sites.
+ *
+ * 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
+ */
+
+/**
+ * This is a class for holding configuration settings, particularly for
+ * multi-wiki sites.
+ *
+ * A basic synopsis:
+ *
+ * Consider a wikifarm having three sites: two production sites, one in English
+ * and one in German, and one testing site. You can assign them easy-to-remember
+ * identifiers - ISO 639 codes 'en' and 'de' for language wikis, and 'beta' for
+ * the testing wiki.
+ *
+ * You would thus initialize the site configuration by specifying the wiki
+ * identifiers:
+ *
+ * @code
+ * $conf = new SiteConfiguration;
+ * $conf->wikis = array( 'de', 'en', 'beta' );
+ * @endcode
+ *
+ * When configuring the MediaWiki global settings (the $wg variables),
+ * the identifiers will be available to specify settings on a per wiki basis.
+ *
+ * @code
+ * $conf->settings = array(
+ *     'wgSomeSetting' => array(
+ *
+ *             # production:
+ *             'de'     => false,
+ *             'en'     => false,
+ *
+ *             # test:
+ *             'beta    => true,
+ *     ),
+ * );
+ * @endcode
+ *
+ * With three wikis, that is easy to manage. But what about a farm with
+ * hundreds of wikis? Site configuration provides a special keyword named
+ * 'default' which is the value used when a wiki is not found. Hence
+ * the above code could be written:
+ *
+ * @code
+ * $conf->settings = array(
+ *     'wgSomeSetting' => array(
+ *
+ *             'default' => false,
+ *
+ *             # Enable feature on test
+ *             'beta'    => true,
+ *     ),
+ * );
+ * @endcode
+ *
+ *
+ * Since settings can contain arrays, site configuration provides a way
+ * to merge an array with the default. This is very useful to avoid
+ * repeating settings again and again while still maintaining specific changes
+ * on a per wiki basis.
+ *
+ * @code
+ * $conf->settings = array(
+ *     'wgMergeSetting' = array(
+ *             # Value that will be shared among all wikis:
+ *             'default' => array(  NS_USER => true ),
+ *
+ *             # Leading '+' means merging the array of value with the defaults
+ *             '+beta' => array( NS_HELP => true ),
+ *     ),
+ * );
+ *
+ * # Get configuration for the German site:
+ * $conf->get( 'wgMergeSetting', 'de' );
+ * // --> array( NS_USER => true );
+ *
+ * # Get configuration for the testing site:
+ * $conf->get( 'wgMergeSetting', 'beta' );
+ * // --> array( NS_USER => true, NS_HELP => true );
+ * @endcode
+ *
+ * Finally, to load all configuration settings, extract them in global context:
+ *
+ * @code
+ * # Name / identifier of the wiki as set in $conf->wikis
+ * $wikiID = 'beta';
+ * $globals = $conf->getAll( $wikiID );
+ * extract( $globals );
+ * @endcode
+ *
+ * TODO: give examples for,
+ * suffixes:
+ * $conf->suffixes = array( 'wiki' );
+ * localVHosts
+ * callbacks!
  */
 class SiteConfiguration {
 
index abb1130..7f3f655 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Accessors and mutators for the site-wide statistics.
+ *
+ * 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
+ */
 
 /**
  * Static accessor class for site_stats and related things
@@ -223,53 +243,91 @@ class SiteStats {
  * Class for handling updates to the site_stats table
  */
 class SiteStatsUpdate implements DeferrableUpdate {
-
-       var $mViews, $mEdits, $mGood, $mPages, $mUsers;
-
+       protected $views = 0;
+       protected $edits = 0;
+       protected $pages = 0;
+       protected $articles = 0;
+       protected $users = 0;
+       protected $images = 0;
+
+       // @TODO: deprecate this constructor
        function __construct( $views, $edits, $good, $pages = 0, $users = 0 ) {
-               $this->mViews = $views;
-               $this->mEdits = $edits;
-               $this->mGood = $good;
-               $this->mPages = $pages;
-               $this->mUsers = $users;
+               $this->views = $views;
+               $this->edits = $edits;
+               $this->articles = $good;
+               $this->pages = $pages;
+               $this->users = $users;
        }
 
        /**
-        * @param $sql
-        * @param $field
-        * @param $delta
+        * @param $deltas Array
+        * @return SiteStatsUpdate
         */
-       function appendUpdate( &$sql, $field, $delta ) {
-               if ( $delta ) {
-                       if ( $sql ) {
-                               $sql .= ',';
-                       }
-                       if ( $delta < 0 ) {
-                               $sql .= "$field=$field-1";
-                       } else {
-                               $sql .= "$field=$field+1";
+       public static function factory( array $deltas ) {
+               $update = new self( 0, 0, 0 );
+
+               $fields = array( 'views', 'edits', 'pages', 'articles', 'users', 'images' );
+               foreach ( $fields as $field ) {
+                       if ( isset( $deltas[$field] ) && $deltas[$field] ) {
+                               $update->$field = $deltas[$field];
                        }
                }
+
+               return $update;
        }
 
-       function doUpdate() {
-               $dbw = wfGetDB( DB_MASTER );
+       public function doUpdate() {
+               global $wgSiteStatsAsyncFactor;
+
+               $rate = $wgSiteStatsAsyncFactor; // convenience
+               // If set to do so, only do actual DB updates 1 every $rate times.
+               // The other times, just update "pending delta" values in memcached.
+               if ( $rate && ( $rate < 0 || mt_rand( 0, $rate - 1 ) != 0 ) ) {
+                       $this->doUpdatePendingDeltas();
+               } else {
+                       $dbw = wfGetDB( DB_MASTER );
+
+                       $lockKey = wfMemcKey( 'site_stats' ); // prepend wiki ID
+                       if ( $rate ) {
+                               // Lock the table so we don't have double DB/memcached updates
+                               if ( !$dbw->lockIsFree( $lockKey, __METHOD__ )
+                                       || !$dbw->lock( $lockKey, __METHOD__, 1 ) // 1 sec timeout
+                               ) {
+                                       $this->doUpdatePendingDeltas();
+                                       return;
+                               }
+                               $pd = $this->getPendingDeltas();
+                               // Piggy-back the async deltas onto those of this stats update....
+                               $this->views    += ( $pd['ss_total_views']['+'] - $pd['ss_total_views']['-'] );
+                               $this->edits    += ( $pd['ss_total_edits']['+'] - $pd['ss_total_edits']['-'] );
+                               $this->articles += ( $pd['ss_good_articles']['+'] - $pd['ss_good_articles']['-'] );
+                               $this->pages    += ( $pd['ss_total_pages']['+'] - $pd['ss_total_pages']['-'] );
+                               $this->users    += ( $pd['ss_users']['+'] - $pd['ss_users']['-'] );
+                               $this->images   += ( $pd['ss_images']['+'] - $pd['ss_images']['-'] );
+                       }
 
-               $updates = '';
+                       // Need a separate transaction because this a global lock
+                       $dbw->begin( __METHOD__ );
 
-               $this->appendUpdate( $updates, 'ss_total_views', $this->mViews );
-               $this->appendUpdate( $updates, 'ss_total_edits', $this->mEdits );
-               $this->appendUpdate( $updates, 'ss_good_articles', $this->mGood );
-               $this->appendUpdate( $updates, 'ss_total_pages', $this->mPages );
-               $this->appendUpdate( $updates, 'ss_users', $this->mUsers );
+                       // Build up an SQL query of deltas and apply them...
+                       $updates = '';
+                       $this->appendUpdate( $updates, 'ss_total_views', $this->views );
+                       $this->appendUpdate( $updates, 'ss_total_edits', $this->edits );
+                       $this->appendUpdate( $updates, 'ss_good_articles', $this->articles );
+                       $this->appendUpdate( $updates, 'ss_total_pages', $this->pages );
+                       $this->appendUpdate( $updates, 'ss_users', $this->users );
+                       $this->appendUpdate( $updates, 'ss_images', $this->images );
+                       if ( $updates != '' ) {
+                               $dbw->update( 'site_stats', array( $updates ), array(), __METHOD__ );
+                       }
 
-               if ( $updates ) {
-                       $site_stats = $dbw->tableName( 'site_stats' );
-                       $sql = "UPDATE $site_stats SET $updates";
+                       if ( $rate ) {
+                               // Decrement the async deltas now that we applied them
+                               $this->removePendingDeltas( $pd );
+                               // Commit the updates and unlock the table
+                               $dbw->unlock( $lockKey, __METHOD__ );
+                       }
 
-                       # Need a separate transaction because this a global lock
-                       $dbw->begin( __METHOD__ );
-                       $dbw->query( $sql, __METHOD__ );
                        $dbw->commit( __METHOD__ );
                }
        }
@@ -302,6 +360,102 @@ class SiteStatsUpdate implements DeferrableUpdate {
                );
                return $activeUsers;
        }
+
+       protected function doUpdatePendingDeltas() {
+               $this->adjustPending( 'ss_total_views', $this->views );
+               $this->adjustPending( 'ss_total_edits', $this->edits );
+               $this->adjustPending( 'ss_good_articles', $this->articles );
+               $this->adjustPending( 'ss_total_pages', $this->pages );
+               $this->adjustPending( 'ss_users', $this->users );
+               $this->adjustPending( 'ss_images', $this->images );
+       }
+
+       /**
+        * @param $sql string
+        * @param $field string
+        * @param $delta integer
+        */
+       protected function appendUpdate( &$sql, $field, $delta ) {
+               if ( $delta ) {
+                       if ( $sql ) {
+                               $sql .= ',';
+                       }
+                       if ( $delta < 0 ) {
+                               $sql .= "$field=$field-" . abs( $delta );
+                       } else {
+                               $sql .= "$field=$field+" . abs( $delta );
+                       }
+               }
+       }
+
+       /**
+        * @param $type string
+        * @param $sign string ('+' or '-')
+        * @return string
+        */
+       private function getTypeCacheKey( $type, $sign ) {
+               return wfMemcKey( 'sitestatsupdate', 'pendingdelta', $type, $sign );
+       }
+
+       /**
+        * Adjust the pending deltas for a stat type.
+        * Each stat type has two pending counters, one for increments and decrements
+        * @param $type string
+        * @param $delta integer Delta (positive or negative)
+        * @return void
+        */
+       protected function adjustPending( $type, $delta ) {
+               global $wgMemc;
+
+               if ( $delta < 0 ) { // decrement
+                       $key = $this->getTypeCacheKey( $type, '-' );
+               } else { // increment
+                       $key = $this->getTypeCacheKey( $type, '+' );
+               }
+
+               $magnitude = abs( $delta );
+               if ( !$wgMemc->incr( $key, $magnitude ) ) { // not there?
+                       if ( !$wgMemc->add( $key, $magnitude ) ) { // race?
+                               $wgMemc->incr( $key, $magnitude );
+                       }
+               }
+       }
+
+       /**
+        * Get pending delta counters for each stat type
+        * @return Array Positive and negative deltas for each type
+        * @return void
+        */
+       protected function getPendingDeltas() {
+               global $wgMemc;
+
+               $pending = array();
+               foreach ( array( 'ss_total_views', 'ss_total_edits',
+                       'ss_good_articles', 'ss_total_pages', 'ss_users', 'ss_images' ) as $type )
+               {
+                       // Get pending increments and pending decrements
+                       $pending[$type]['+'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '+' ) );
+                       $pending[$type]['-'] = (int)$wgMemc->get( $this->getTypeCacheKey( $type, '-' ) );
+               }
+
+               return $pending;
+       }
+
+       /**
+        * Reduce pending delta counters after updates have been applied
+        * @param Array $pd Result of getPendingDeltas(), used for DB update
+        * @return void
+        */
+       protected function removePendingDeltas( array $pd ) {
+               global $wgMemc;
+
+               foreach ( $pd as $type => $deltas ) {
+                       foreach ( $deltas as $sign => $magnitude ) {
+                               // Lower the pending counter now that we applied these changes
+                               $wgMemc->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
+                       }
+               }
+       }
 }
 
 /**
index 8b10d7f..8d47b83 100644 (file)
@@ -1,11 +1,28 @@
 <?php
 /**
- * @defgroup Skins Skins
+ * Base class for all skins.
+ *
+ * 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
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
+/**
+ * @defgroup Skins Skins
+ */
 
 /**
  * The main skin class that provide methods and properties for all other skins.
@@ -147,11 +164,6 @@ abstract class Skin extends ContextSource {
                if ( !MWInit::classExists( $className ) ) {
 
                        if ( !defined( 'MW_COMPILED' ) ) {
-                               // Preload base classes to work around APC/PHP5 bug
-                               $deps = "{$wgStyleDirectory}/{$skinName}.deps.php";
-                               if ( file_exists( $deps ) ) {
-                                       include_once( $deps );
-                               }
                                require_once( "{$wgStyleDirectory}/{$skinName}.php" );
                        }
 
@@ -688,6 +700,7 @@ abstract class Skin extends ContextSource {
         * @return string
         */
        function subPageSubtitle() {
+               global $wgLang;
                $out = $this->getOutput();
                $subpages = '';
 
@@ -709,7 +722,7 @@ abstract class Skin extends ContextSource {
                                        $display .= $link;
                                        $linkObj = Title::newFromText( $growinglink );
 
-                                       if ( is_object( $linkObj ) && $linkObj->exists() ) {
+                                       if ( is_object( $linkObj ) && $linkObj->isKnown() ) {
                                                $getlink = Linker::linkKnown(
                                                        $linkObj,
                                                        htmlspecialchars( $display )
@@ -718,7 +731,7 @@ abstract class Skin extends ContextSource {
                                                $c++;
 
                                                if ( $c > 1 ) {
-                                                       $subpages .= $this->msg( 'pipe-separator' )->escaped();
+                                                       $subpages .= $wgLang->getDirMarkEntity() . $this->msg( 'pipe-separator' )->escaped();
                                                } else  {
                                                        $subpages .= '&lt; ';
                                                }
index 480f3eb..e1ec897 100644 (file)
@@ -1,12 +1,25 @@
 <?php
 /**
- * @defgroup Skins Skins
+ * Base class for legacy skins.
+ *
+ * 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
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
-
 class SkinLegacy extends SkinTemplate {
        var $useHeadElement = true;
        protected $mWatchLinkNum = 0; // Appended to end of watch link id's
index 702ca7e..b3dfc9b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Base class for template-based skins
+ * Base class for template-based skins.
  *
  * 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
  * @file
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
-
 /**
  * Wrapper object for MediaWiki's localization functions,
  * to be passed to the template engine.
@@ -276,20 +272,20 @@ class SkinTemplate extends Skin {
                $tpl->setRef( 'logopath', $wgLogo );
                $tpl->setRef( 'sitename', $wgSitename );
 
-               $lang = $this->getLanguage();
-               $userlang = $lang->getHtmlCode();
-               $userdir  = $lang->getDir();
+               $userLang = $this->getLanguage();
+               $userLangCode = $userLang->getHtmlCode();
+               $userLangDir  = $userLang->getDir();
 
-               $tpl->set( 'lang', $userlang );
-               $tpl->set( 'dir', $userdir );
-               $tpl->set( 'rtl', $lang->isRTL() );
+               $tpl->set( 'lang', $userLangCode );
+               $tpl->set( 'dir', $userLangDir );
+               $tpl->set( 'rtl', $userLang->isRTL() );
 
-               $tpl->set( 'capitalizeallnouns', $lang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
+               $tpl->set( 'capitalizeallnouns', $userLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' );
                $tpl->set( 'showjumplinks', $user->getOption( 'showjumplinks' ) );
                $tpl->set( 'username', $this->loggedin ? $this->username : null );
                $tpl->setRef( 'userpage', $this->userpage );
                $tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] );
-               $tpl->set( 'userlang', $userlang );
+               $tpl->set( 'userlang', $userLangCode );
 
                // Users can have their language set differently than the
                // content of the wiki. For these users, tell the web browser
@@ -297,8 +293,12 @@ class SkinTemplate extends Skin {
                $tpl->set( 'userlangattributes', '' );
                $tpl->set( 'specialpageattributes', '' ); # obsolete
 
-               if ( $userlang !== $wgContLang->getHtmlCode() || $userdir !== $wgContLang->getDir() ) {
-                       $attrs = " lang='$userlang' dir='$userdir'";
+               if ( $userLangCode !== $wgContLang->getHtmlCode() || $userLangDir !== $wgContLang->getDir() ) {
+                       $escUserlang = htmlspecialchars( $userLangCode );
+                       $escUserdir = htmlspecialchars( $userLangDir );
+                       // Attributes must be in double quotes because htmlspecialchars() doesn't
+                       // escape single quotes
+                       $attrs = " lang=\"$escUserlang\" dir=\"$escUserdir\"";
                        $tpl->set( 'userlangattributes', $attrs );
                }
 
@@ -322,13 +322,13 @@ class SkinTemplate extends Skin {
                                        }
                                }
 
-                               if( $wgPageShowWatchingUsers ) {
+                               if ( $wgPageShowWatchingUsers ) {
                                        $dbr = wfGetDB( DB_SLAVE );
                                        $num = $dbr->selectField( 'watchlist', 'COUNT(*)',
                                                array( 'wl_title' => $title->getDBkey(), 'wl_namespace' => $title->getNamespace() ),
                                                __METHOD__
                                        );
-                                       if( $num > 0 ) {
+                                       if ( $num > 0 ) {
                                                $tpl->set( 'numberofwatchingusers',
                                                        $this->msg( 'number_of_watching_users_pageview' )->numParams( $num )->parse()
                                                );
@@ -404,7 +404,7 @@ class SkinTemplate extends Skin {
                # when the content is different from the UI language, i.e.:
                # not for special pages or file pages AND only when viewing AND if the page exists
                # (or is in MW namespace, because that has default content)
-               if( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
+               if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
                        in_array( $request->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) &&
                        ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) {
                        $pageLang = $title->getPageLanguage();
@@ -426,10 +426,15 @@ class SkinTemplate extends Skin {
                                unset( $tmp );
                                $nt = Title::newFromText( $l );
                                if ( $nt ) {
+                                       $ilLangName = Language::fetchLanguageName( $nt->getInterwiki() );
+                                       if ( strval( $ilLangName ) === '' ) {
+                                               $ilLangName = $l;
+                                       } else {
+                                               $ilLangName = $this->getLanguage()->ucfirst( $ilLangName );
+                                       }
                                        $language_urls[] = array(
                                                'href' => $nt->getFullURL(),
-                                               'text' => ( Language::fetchLanguageName( $nt->getInterwiki() ) != '' ?
-                                                                       Language::fetchLanguageName( $nt->getInterwiki() ) : $l ),
+                                               'text' => $ilLangName,
                                                'title' => $nt->getText(),
                                                'class' => $class,
                                                'lang' => $nt->getInterwiki(),
@@ -438,7 +443,7 @@ class SkinTemplate extends Skin {
                                }
                        }
                }
-               if( count( $language_urls ) ) {
+               if ( count( $language_urls ) ) {
                        $tpl->setRef( 'language_urls', $language_urls );
                } else {
                        $tpl->set( 'language_urls', false );
@@ -617,13 +622,13 @@ class SkinTemplate extends Skin {
                        $loginlink = $this->getUser()->isAllowed( 'createaccount' ) && $useCombinedLoginLink
                                ? 'nav-login-createaccount'
                                : 'login';
-                       $is_signup = $request->getText('type') == "signup";
+                       $is_signup = $request->getText( 'type' ) == 'signup';
 
                        # anonlogin & login are the same
                        $login_url = array(
                                'text' => $this->msg( $loginlink )->text(),
                                'href' => self::makeSpecialUrl( 'Userlogin', $returnto ),
-                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == "nav-login-createaccount" || !$is_signup )
+                               'active' => $title->isSpecial( 'Userlogin' ) && ( $loginlink == 'nav-login-createaccount' || !$is_signup )
                        );
                        if ( $this->getUser()->isAllowed( 'createaccount' ) && !$useCombinedLoginLink ) {
                                $createaccount_url = array(
@@ -639,15 +644,18 @@ class SkinTemplate extends Skin {
                                $login_url['href']  = $https_url;
                                # @todo FIXME: Class depends on skin
                                $login_url['class'] = 'link-https';
-                               if ( isset($createaccount_url) ) {
+                               if ( isset( $createaccount_url ) ) {
                                        $https_url = preg_replace( '/^http:/', 'https:',
-                                               $title->getFullURL("type=signup") );
+                                               $title->getFullURL( 'type=signup' ) );
                                        $createaccount_url['href']  = $https_url;
                                        # @todo FIXME: Class depends on skin
                                        $createaccount_url['class'] = 'link-https';
                                }
                        }
 
+                       if ( isset( $createaccount_url ) ) {
+                               $personal_urls['createaccount'] = $createaccount_url;
+                       }
 
                        if( $this->showIPinHeader() ) {
                                $href = &$this->userpageUrlDetails['href'];
@@ -669,9 +677,6 @@ class SkinTemplate extends Skin {
                        } else {
                                $personal_urls['login'] = $login_url;
                        }
-                       if ( isset($createaccount_url) ) {
-                               $personal_urls['createaccount'] = $createaccount_url;
-                       }
                }
 
                wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$title ) );
@@ -701,9 +706,9 @@ class SkinTemplate extends Skin {
                // wfMessageFallback will nicely accept $message as an array of fallbacks
                // or just a single key
                $msg = wfMessageFallback( $message )->setContext( $this->getContext() );
-               if ( is_array($message) ) {
+               if ( is_array( $message ) ) {
                        // for hook compatibility just keep the last message name
-                       $message = end($message);
+                       $message = end( $message );
                }
                if ( $msg->exists() ) {
                        $text = $msg->text();
@@ -788,8 +793,9 @@ class SkinTemplate extends Skin {
 
                wfProfileIn( __METHOD__ );
 
-               $title = $this->getRelevantTitle(); // Display tabs for the relevant title rather than always the title itself
-               $onPage = $title->equals($this->getTitle());
+               // Display tabs for the relevant title rather than always the title itself
+               $title = $this->getRelevantTitle();
+               $onPage = $title->equals( $this->getTitle() );
 
                $out = $this->getOutput();
                $request = $this->getRequest();
@@ -833,7 +839,7 @@ class SkinTemplate extends Skin {
                        // Adds namespace links
                        $subjectMsg = array( "nstab-$subjectId" );
                        if ( $subjectPage->isMainPage() ) {
-                               array_unshift($subjectMsg, 'mainpage-nstab');
+                               array_unshift( $subjectMsg, 'mainpage-nstab' );
                        }
                        $content_navigation['namespaces'][$subjectId] = $this->tabAction(
                                $subjectPage, $subjectMsg, !$isTalk && !$preventActiveTabs, '', $userCanRead
@@ -850,9 +856,10 @@ class SkinTemplate extends Skin {
                                        $content_navigation['views']['view'] = $this->tabAction(
                                                $isTalk ? $talkPage : $subjectPage,
                                                array( "$skname-view-view", 'view' ),
-                                               ( $onPage && ($action == 'view' || $action == 'purge' ) ), '', true
+                                               ( $onPage && ( $action == 'view' || $action == 'purge' ) ), '', true
                                        );
-                                       $content_navigation['views']['view']['redundant'] = true; // signal to hide this from simple content_actions
+                                       // signal to hide this from simple content_actions
+                                       $content_navigation['views']['view']['redundant'] = true;
                                }
 
                                wfProfileIn( __METHOD__ . '-edit' );
@@ -870,14 +877,14 @@ class SkinTemplate extends Skin {
                                        $section = $request->getVal( 'section' );
 
                                        $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ?
-                                               "edit" : "create";
+                                               'edit' : 'create';
                                        $content_navigation['views']['edit'] = array(
                                                'class' => ( $isEditing && ( $section !== 'new' || !$showNewSection ) ? 'selected' : '' ) . $isTalkClass,
                                                'text' => wfMessageFallback( "$skname-view-$msgKey", $msgKey )->setContext( $this->getContext() )->text(),
                                                'href' => $title->getLocalURL( $this->editUrlOptions() ),
                                                'primary' => true, // don't collapse this in vector
                                        );
-                                       
+
                                        // section link
                                        if ( $showNewSection ) {
                                                // Adds new section link
@@ -931,7 +938,7 @@ class SkinTemplate extends Skin {
                                        // article doesn't exist or is deleted
                                        if ( $user->isAllowed( 'deletedhistory' ) ) {
                                                $n = $title->isDeleted();
-                                               if( $n ) {
+                                               if ( $n ) {
                                                        $undelTitle = SpecialPage::getTitleFor( 'Undelete' );
                                                        // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead
                                                        $msgKey = $user->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted';
@@ -971,7 +978,8 @@ class SkinTemplate extends Skin {
                                        $token = WatchAction::getWatchToken( $title, $user, $mode );
                                        $content_navigation['actions'][$mode] = array(
                                                'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false,
-                                               'text' => $this->msg( $mode )->text(), // uses 'watch' or 'unwatch' message
+                                               // uses 'watch' or 'unwatch' message
+                                               'text' => $this->msg( $mode )->text(),
                                                'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) )
                                        );
                                }
@@ -985,8 +993,8 @@ class SkinTemplate extends Skin {
                                $variants = $pageLang->getVariants();
                                // Checks that language conversion is enabled and variants exist
                                // And if it is not in the special namespace
-                               if( count( $variants ) > 1 ) {
-                                       // Gets preferred variant (note that user preference is 
+                               if ( count( $variants ) > 1 ) {
+                                       // Gets preferred variant (note that user preference is
                                        // only possible for wiki content language variant)
                                        $preferred = $pageLang->getPreferredVariant();
                                        // Loops over each variant
@@ -1014,7 +1022,7 @@ class SkinTemplate extends Skin {
                        $content_navigation['namespaces']['special'] = array(
                                'class' => 'selected',
                                'text' => $this->msg( 'nstab-special' )->text(),
-                               'href' => $request->getRequestURL(), // @bug 2457, 2510
+                               'href' => $request->getRequestURL(), // @see: bug 2457, bug 2510
                                'context' => 'subject'
                        );
 
@@ -1033,7 +1041,7 @@ class SkinTemplate extends Skin {
                                        $xmlID = 'ca-nstab-' . $xmlID;
                                } elseif ( isset( $link['context'] ) && $link['context'] == 'talk' ) {
                                        $xmlID = 'ca-talk';
-                               } elseif ( $section == "variants" ) {
+                               } elseif ( $section == 'variants' ) {
                                        $xmlID = 'ca-varlang-' . $xmlID;
                                } else {
                                        $xmlID = 'ca-' . $xmlID;
@@ -1048,14 +1056,14 @@ class SkinTemplate extends Skin {
                # give the edit tab an accesskey, because that's fairly su-
                # perfluous and conflicts with an accesskey (Ctrl-E) often
                # used for editing in Safari.
-               if( in_array( $action, array( 'edit', 'submit' ) ) ) {
-                       if ( isset($content_navigation['views']['edit']) ) {
+               if ( in_array( $action, array( 'edit', 'submit' ) ) ) {
+                       if ( isset( $content_navigation['views']['edit'] ) ) {
                                $content_navigation['views']['edit']['tooltiponly'] = true;
                        }
-                       if ( isset($content_navigation['actions']['watch']) ) {
+                       if ( isset( $content_navigation['actions']['watch'] ) ) {
                                $content_navigation['actions']['watch']['tooltiponly'] = true;
                        }
-                       if ( isset($content_navigation['actions']['unwatch']) ) {
+                       if ( isset( $content_navigation['actions']['unwatch'] ) ) {
                                $content_navigation['actions']['unwatch']['tooltiponly'] = true;
                        }
                }
@@ -1084,7 +1092,7 @@ class SkinTemplate extends Skin {
 
                        foreach ( $links as $key => $value ) {
 
-                               if ( isset($value["redundant"]) && $value["redundant"] ) {
+                               if ( isset( $value['redundant'] ) && $value['redundant'] ) {
                                        // Redundant tabs are dropped from content_actions
                                        continue;
                                }
@@ -1093,11 +1101,11 @@ class SkinTemplate extends Skin {
                                // so the xmlID based id is much closer to the actual $key that we want
                                // for that reason we'll just strip out the ca- if present and use
                                // the latter potion of the "id" as the $key
-                               if ( isset($value["id"]) && substr($value["id"], 0, 3) == "ca-" ) {
-                                       $key = substr($value["id"], 3);
+                               if ( isset( $value['id'] ) && substr( $value['id'], 0, 3 ) == 'ca-' ) {
+                                       $key = substr( $value['id'], 3 );
                                }
 
-                               if ( isset($content_actions[$key]) ) {
+                               if ( isset( $content_actions[$key] ) ) {
                                        wfDebug( __METHOD__ . ": Found a duplicate key for $key while flattening content_navigation into content_actions." );
                                        continue;
                                }
@@ -1148,7 +1156,7 @@ class SkinTemplate extends Skin {
 
                // A print stylesheet is attached to all pages, but nobody ever
                // figures that out. :)  Add a link...
-               if( $out->isArticle() ) {
+               if ( $out->isArticle() ) {
                        if ( !$out->isPrintable() ) {
                                $nav_urls['print'] = array(
                                        'text' => $this->msg( 'printableversion' )->text(),
@@ -1417,7 +1425,7 @@ abstract class BaseTemplate extends QuickTemplate {
                }
                if ( isset( $this->data['nav_urls']['permalink'] ) && $this->data['nav_urls']['permalink'] ) {
                        $toolbox['permalink'] = $this->data['nav_urls']['permalink'];
-                       if( $toolbox['permalink']['href'] === '' ) {
+                       if ( $toolbox['permalink']['href'] === '' ) {
                                unset( $toolbox['permalink']['href'] );
                                $toolbox['ispermalink']['tooltiponly'] = true;
                                $toolbox['ispermalink']['id'] = 't-ispermalink';
@@ -1443,20 +1451,24 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        function getPersonalTools() {
                $personal_tools = array();
-               foreach( $this->data['personal_urls'] as $key => $ptool ) {
+               foreach ( $this->data['personal_urls'] as $key => $plink ) {
                        # The class on a personal_urls item is meant to go on the <a> instead
                        # of the <li> so we have to use a single item "links" array instead
-                       # of using most of the personal_url's keys directly
-                       $personal_tools[$key] = array();
-                       $personal_tools[$key]["links"][] = array();
-                       $personal_tools[$key]["links"][0]["single-id"] = $personal_tools[$key]["id"] = "pt-$key";
-                       if ( isset($ptool["active"]) ) {
-                               $personal_tools[$key]["active"] = $ptool["active"];
+                       # of using most of the personal_url's keys directly.
+                       $ptool = array(
+                               'links' => array(
+                                       array( 'single-id' => "pt-$key" ),
+                               ),
+                               'id' => "pt-$key",
+                       );
+                       if ( isset( $plink['active'] ) ) {
+                               $ptool['active'] = $plink['active'];
                        }
-                       foreach ( array("href", "class", "text") as $k ) {
-                               if ( isset($ptool[$k]) )
-                                       $personal_tools[$key]["links"][0][$k] = $ptool[$k];
+                       foreach ( array( 'href', 'class', 'text' ) as $k ) {
+                               if ( isset( $plink[$k] ) )
+                                       $ptool['links'][0][$k] = $plink[$k];
                        }
+                       $personal_tools[$key] = $ptool;
                }
                return $personal_tools;
        }
@@ -1473,7 +1485,7 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( !isset( $sidebar['LANGUAGES'] ) ) {
                        $sidebar['LANGUAGES'] = true;
                }
-               
+
                if ( !isset( $options['search'] ) || $options['search'] !== true ) {
                        unset( $sidebar['SEARCH'] );
                }
@@ -1483,7 +1495,7 @@ abstract class BaseTemplate extends QuickTemplate {
                if ( isset( $options['languages'] ) && $options['languages'] === false ) {
                        unset( $sidebar['LANGUAGES'] );
                }
-               
+
                $boxes = array();
                foreach ( $sidebar as $boxName => $content ) {
                        if ( $content === false ) {
@@ -1493,7 +1505,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        case 'SEARCH':
                                // Search is a special case, skins should custom implement this
                                $boxes[$boxName] = array(
-                                       'id'        => "p-search",
+                                       'id'        => 'p-search',
                                        'header'    => $this->getMsg( 'search' )->text(),
                                        'generated' => false,
                                        'content'   => true,
@@ -1502,7 +1514,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        case 'TOOLBOX':
                                $msgObj = $this->getMsg( 'toolbox' );
                                $boxes[$boxName] = array(
-                                       'id'        => "p-tb",
+                                       'id'        => 'p-tb',
                                        'header'    => $msgObj->exists() ? $msgObj->text() : 'toolbox',
                                        'generated' => false,
                                        'content'   => $this->getToolbox(),
@@ -1512,12 +1524,12 @@ abstract class BaseTemplate extends QuickTemplate {
                                if ( $this->data['language_urls'] ) {
                                        $msgObj = $this->getMsg( 'otherlanguages' );
                                        $boxes[$boxName] = array(
-                                               'id'        => "p-lang",
+                                               'id'        => 'p-lang',
                                                'header'    => $msgObj->exists() ? $msgObj->text() : 'otherlanguages',
                                                'generated' => false,
                                                'content'   => $this->data['language_urls'],
                                        );
-                               } 
+                               }
                                break;
                        default:
                                $msgObj = $this->getMsg( $boxName );
@@ -1530,7 +1542,7 @@ abstract class BaseTemplate extends QuickTemplate {
                                break;
                        }
                }
-               
+
                // HACK: Compatibility with extensions still using SkinTemplateToolboxEnd
                $hookContents = null;
                if ( isset( $boxes['TOOLBOX'] ) ) {
@@ -1545,17 +1557,17 @@ abstract class BaseTemplate extends QuickTemplate {
                        }
                }
                // END hack
-               
+
                if ( isset( $options['htmlOnly'] ) && $options['htmlOnly'] === true ) {
                        foreach ( $boxes as $boxName => $box ) {
                                if ( is_array( $box['content'] ) ) {
-                                       $content = "<ul>";
+                                       $content = '<ul>';
                                        foreach ( $box['content'] as $key => $val ) {
                                                $content .= "\n " . $this->makeListItem( $key, $val );
                                        }
                                        // HACK, shove the toolbox end onto the toolbox if we're rendering itself
                                        if ( $hookContents ) {
-                                               $content .= "\n $hookContents"; 
+                                               $content .= "\n $hookContents";
                                        }
                                        // END hack
                                        $content .= "\n</ul>\n";
@@ -1565,7 +1577,7 @@ abstract class BaseTemplate extends QuickTemplate {
                } else {
                        if ( $hookContents ) {
                                $boxes['TOOLBOXEND'] = array(
-                                       'id'        => "p-toolboxend",
+                                       'id'        => 'p-toolboxend',
                                        'header'    => $boxes['TOOLBOX']['header'],
                                        'generated' => false,
                                        'content'   => "<ul>{$hookContents}</ul>",
@@ -1585,7 +1597,7 @@ abstract class BaseTemplate extends QuickTemplate {
                                // END hack
                        }
                }
-               
+
                return $boxes;
        }
 
@@ -1863,8 +1875,8 @@ abstract class BaseTemplate extends QuickTemplate {
         * body and html tags.
         */
        function printTrail() { ?>
-<?php $this->html('bottomscripts'); /* JS call to runBodyOnloadHook */ ?>
-<?php $this->html('reporttime') ?>
+<?php $this->html( 'bottomscripts' ); /* JS call to runBodyOnloadHook */ ?>
+<?php $this->html( 'reporttime' ) ?>
 <?php if ( $this->data['debug'] ): ?>
 <!-- Debug output:
 <?php $this->text( 'debug' ); ?>
index b529f86..9e6717f 100644 (file)
@@ -1,25 +1,24 @@
 <?php
 /**
- * SpecialPage: handling special pages and lists thereof.
+ * Parent class for all special pages.
  *
- * To add a special page in an extension, add to $wgSpecialPages either
- * an object instance or an array containing the name and constructor
- * parameters. The latter is preferred for performance reasons.
+ * 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.
  *
- * The object instantiated must be either an instance of SpecialPage or a
- * sub-class thereof. It must have an execute() method, which sends the HTML
- * for the special page to $wgOut. The parent class has an execute() method
- * which distributes the call to the historical global functions. Additionally,
- * execute() also checks if the user has the necessary access privileges
- * and bails out if not.
+ * 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.
  *
- * To add a core special page, use the similar static list in
- * SpecialPage::$mList. To remove a core static special page at runtime, use
- * a SpecialPage_initList hook.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
  * @ingroup SpecialPage
- * @defgroup SpecialPage SpecialPage
  */
 
 /**
@@ -627,7 +626,7 @@ class SpecialPage {
                } else {
                        $msg = $summaryMessageKey;
                }
-               if ( !$this->msg( $msg )->isBlank() && !$this->including() ) {
+               if ( !$this->msg( $msg )->isDisabled() && !$this->including() ) {
                        $this->getOutput()->wrapWikiMsg(
                                "<div class='mw-specialpage-summary'>\n$1\n</div>", $msg );
                }
index 6610451..02b8d54 100644 (file)
@@ -1,6 +1,29 @@
 <?php
 /**
- * SpecialPage: handling special pages and lists thereof.
+ * Factory for handling the special page list and generating SpecialPage 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 SpecialPage
+ * @defgroup SpecialPage SpecialPage
+ */
+
+/**
+ * Factory for handling the special page list and generating SpecialPage objects.
  *
  * To add a special page in an extension, add to $wgSpecialPages either
  * an object instance or an array containing the name and constructor
  * SpecialPage::$mList. To remove a core static special page at runtime, use
  * a SpecialPage_initList hook.
  *
- * @file
- * @ingroup SpecialPage
- * @defgroup SpecialPage SpecialPage
- */
-
-/**
- * Factory for handling the special page list and generating SpecialPage objects
  * @ingroup SpecialPage
  * @since 1.17
  */
diff --git a/includes/SqlDataUpdate.php b/includes/SqlDataUpdate.php
new file mode 100644 (file)
index 0000000..6d36a43
--- /dev/null
@@ -0,0 +1,132 @@
+<?php
+/**
+ * Base code for update jobs that put some secondary data extracted
+ * from article content into the 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
+ */
+
+/**
+ * Abstract base class for update jobs that put some secondary data extracted
+ * from article content into the database.
+ */
+abstract class SqlDataUpdate extends DataUpdate {
+
+       protected $mDb;            //!< Database connection reference
+       protected $mOptions;       //!< SELECT options to be used (array)
+
+       private   $mHasTransaction; //!< bool whether a transaction is open on this object (internal use only!)
+
+       /**
+        * Constructor
+       **/
+       public function __construct( ) {
+               global $wgAntiLockFlags;
+
+               parent::__construct( );
+
+               if ( $wgAntiLockFlags & ALF_NO_LINK_LOCK ) {
+                       $this->mOptions = array();
+               } else {
+                       $this->mOptions = array( 'FOR UPDATE' );
+               }
+
+               // @todo: get connection only when it's needed? make sure that doesn't break anything, especially transactions!
+               $this->mDb = wfGetDB( DB_MASTER );
+               $this->mHasTransaction = false;
+       }
+
+       /**
+        * Begin a database transaction.
+        *
+        * Because nested transactions are not supportred by the Database class, this implementation
+        * checkes Database::trxLevel() and only opens a transaction if none is yet active.
+        */
+       public function beginTransaction() {
+               // NOTE: nested transactions are not supported, only start a transaction if none is open
+               if ( $this->mDb->trxLevel() === 0 ) {
+                       $this->mDb->begin( get_class( $this ) . '::beginTransaction'  );
+                       $this->mHasTransaction = true;
+               }
+       }
+
+       /**
+        * Commit the database transaction started via beginTransaction (if any).
+        */
+       public function commitTransaction() {
+               if ( $this->mHasTransaction ) {
+                       $this->mDb->commit( get_class( $this ) . '::commitTransaction' );
+               }
+       }
+
+       /**
+        * Abort the database transaction started via beginTransaction (if any).
+        */
+       public function abortTransaction() {
+               if ( $this->mHasTransaction ) {
+                       $this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
+               }
+       }
+
+       /**
+        * Invalidate the cache of a list of pages from a single namespace.
+        * This is intended for use by subclasses.
+        *
+        * @param $namespace Integer
+        * @param $dbkeys Array
+        */
+       protected function invalidatePages( $namespace, Array $dbkeys ) {
+               if ( !count( $dbkeys ) ) {
+                       return;
+               }
+
+               /**
+                * Determine which pages need to be updated
+                * This is necessary to prevent the job queue from smashing the DB with
+                * large numbers of concurrent invalidations of the same page
+                */
+               $now = $this->mDb->timestamp();
+               $ids = array();
+               $res = $this->mDb->select( 'page', array( 'page_id' ),
+                       array(
+                               'page_namespace' => $namespace,
+                               'page_title' => $dbkeys,
+                               'page_touched < ' . $this->mDb->addQuotes( $now )
+                       ), __METHOD__
+               );
+               foreach ( $res as $row ) {
+                       $ids[] = $row->page_id;
+               }
+               if ( !count( $ids ) ) {
+                       return;
+               }
+
+               /**
+                * Do the update
+                * We still need the page_touched condition, in case the row has changed since
+                * the non-locking select above.
+                */
+               $this->mDb->update( 'page', array( 'page_touched' => $now ),
+                       array(
+                               'page_id' => $ids,
+                               'page_touched < ' . $this->mDb->addQuotes( $now )
+                       ), __METHOD__
+               );
+       }
+
+}
index b0418ba..7cd2b03 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Squid and Varnish 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
+ */
+
 /**
  * An HTTP 1.0 client built for the purposes of purging Squid and Varnish. 
  * Uses asynchronous I/O, allowing purges to be done in a highly parallel 
index 835b2ed..a2df380 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Generic operation result.
+ *
+ * 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
+ */
 
 /**
  * Generic operation result class
index dd527b2..6539e08 100644 (file)
@@ -1,9 +1,28 @@
 <?php
 /**
- * Functions related to the output of file content
+ * Functions related to the output of file content.
+ *
+ * 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
  */
+
+/**
+ * Functions related to the output of file content
+ */
 class StreamFile {
        const READY_STREAM = 1;
        const NOT_MODIFIED = 2;
index 582c6cd..3b500ae 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Methods to play with strings.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
 /**
  * A collection of static methods to play with strings.
  */
index 795b5d6..615bcb5 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Delayed loading of global 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
+ */
 
 /**
  * Class to implement stub globals, which are globals that delay loading the
index 1876d75..439d5af 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Representation a title within %MediaWiki.
+ *
  * See title.txt
  *
  * This program is free software; you can redistribute it and/or modify
@@ -83,6 +85,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 +122,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 +183,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 );
                }
 
@@ -206,7 +209,15 @@ class Title {
         */
        public static function newFromID( $id, $flags = 0 ) {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-               $row = $db->selectRow( 'page', '*', array( 'page_id' => $id ), __METHOD__ );
+               $row = $db->selectRow(
+                       'page',
+                       array(
+                               'page_namespace', 'page_title', 'page_id',
+                               'page_len', 'page_is_redirect', 'page_latest',
+                       ),
+                       array( 'page_id' => $id ),
+                       __METHOD__
+               );
                if ( $row !== false ) {
                        $title = Title::newFromRow( $row );
                } else {
@@ -711,17 +722,9 @@ class Title {
                        }
                }
 
-               // Strip off subpages
-               $pagename = $this->getText();
-               if ( strpos( $pagename, '/' ) !== false ) {
-                       list( $username , ) = explode( '/', $pagename, 2 );
-               } else {
-                       $username = $pagename;
-               }
-
                if ( $wgContLang->needsGenderDistinction() &&
                                MWNamespace::hasGenderDistinction( $this->mNamespace ) ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $username, __METHOD__ );
+                       $gender = GenderCache::singleton()->getGenderOf( $this->getText(), __METHOD__ );
                        return $wgContLang->getGenderNsText( $this->mNamespace, $gender );
                }
 
@@ -866,6 +869,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 ) {
@@ -932,7 +936,7 @@ class Title {
         */
        public function isConversionTable() {
                return $this->getNamespace() == NS_MEDIAWIKI &&
-                       strpos( $this->getText(), 'Conversiontable' ) !== false;
+                       strpos( $this->getText(), 'Conversiontable/' ) === 0;
        }
 
        /**
@@ -1230,6 +1234,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 ) {
@@ -1412,6 +1418,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 ) {
@@ -2476,8 +2484,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 ) {
@@ -2554,7 +2563,10 @@ class Title {
                                        $this->mRestrictions['edit'] = explode( ',', trim( $temp[0] ) );
                                        $this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) );
                                } else {
-                                       $this->mRestrictions[$temp[0]] = explode( ',', trim( $temp[1] ) );
+                                       $restriction = trim( $temp[1] );
+                                       if( $restriction != '' ) { //some old entries are empty
+                                               $this->mRestrictions[$temp[0]] = explode( ',', $restriction );
+                                       }
                                }
                        }
 
@@ -3272,16 +3284,14 @@ class Title {
         * @return Array of String the URLs
         */
        public function getSquidURLs() {
-               global $wgContLang;
-
                $urls = array(
                        $this->getInternalURL(),
                        $this->getInternalURL( 'action=history' )
                );
 
-               // purge variant urls as well
-               if ( $wgContLang->hasVariants() ) {
-                       $variants = $wgContLang->getVariants();
+               $pageLang = $this->getPageLanguage();
+               if ( $pageLang->hasVariants() ) {
+                       $variants = $pageLang->getVariants();
                        foreach ( $variants as $vCode ) {
                                $urls[] = $this->getInternalURL( '', $vCode );
                        }
@@ -3485,12 +3495,7 @@ class Title {
                $protected = $this->isProtected();
 
                // Do the actual move
-               $err = $this->moveToInternal( $nt, $reason, $createRedirect );
-               if ( is_array( $err ) ) {
-                       # @todo FIXME: What about the File we have already moved?
-                       $dbw->rollback( __METHOD__ );
-                       return $err;
-               }
+               $this->moveToInternal( $nt, $reason, $createRedirect );
 
                // Refresh the sortkey for this row.  Be careful to avoid resetting
                // cl_timestamp, which may disturb time-based lists on some sites.
@@ -3566,6 +3571,7 @@ class Title {
         * @param $reason String The reason for the move
         * @param $createRedirect Bool Whether to leave a redirect at the old title.  Ignored
         *   if the user doesn't have the suppressredirect right
+        * @throws MWException
         */
        private function moveToInternal( &$nt, $reason = '', $createRedirect = true ) {
                global $wgUser, $wgContLang;
@@ -3919,7 +3925,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 )
@@ -3927,6 +3933,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id DESC' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -3938,7 +3950,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 )
@@ -3946,6 +3958,12 @@ class Title {
                        __METHOD__,
                        array( 'ORDER BY' => 'rev_id' )
                );
+
+               if ( $revId === false ) {
+                       return false;
+               } else {
+                       return intval( $revId );
+               }
        }
 
        /**
@@ -3958,7 +3976,7 @@ class Title {
                $pageId = $this->getArticleID( $flags );
                if ( $pageId ) {
                        $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
-                       $row = $db->selectRow( 'revision', '*',
+                       $row = $db->selectRow( 'revision', Revision::selectFields(),
                                array( 'rev_page' => $pageId ),
                                __METHOD__,
                                array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 1 )
@@ -4318,9 +4336,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__
                );
@@ -4475,7 +4494,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 9696008..5cdec16 100644 (file)
@@ -1,8 +1,27 @@
 <?php
 /**
+ * Classes to walk into a list of Title objects.
+ *
  * Note: this entire file is a byte-for-byte copy of UserArray.php with
  * s/User/Title/.  If anyone can figure out how to do this nicely with inheri-
  * tance or something, please do so.
+ *
+ * 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 af923ff..01407b1 100644 (file)
@@ -1028,7 +1028,7 @@ class User {
                }
 
                $dbr = wfGetDB( DB_MASTER );
-               $s = $dbr->selectRow( 'user', '*', array( 'user_id' => $this->mId ), __METHOD__ );
+               $s = $dbr->selectRow( 'user', self::selectFields(), array( 'user_id' => $this->mId ), __METHOD__ );
 
                wfRunHooks( 'UserLoadFromDatabase', array( $this, &$s ) );
 
@@ -1283,11 +1283,11 @@ 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' )
-                       && !in_array( $ip, $wgProxyWhitelist ) ) 
+                       && !in_array( $ip, $wgProxyWhitelist ) )
                {
                        # Local list
                        if ( self::isLocallyBlockedProxy( $ip ) ) {
@@ -1926,10 +1926,19 @@ class User {
                        $this->mTouched = self::newTouchedTimestamp();
 
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update( 'user',
-                               array( 'user_touched' => $dbw->timestamp( $this->mTouched ) ),
-                               array( 'user_id' => $this->mId ),
-                               __METHOD__ );
+
+                       // Prevent contention slams by checking user_touched first
+                       $now = $dbw->timestamp( $this->mTouched );
+                       $needsPurge = $dbw->selectField( 'user', '1',
+                               array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) )
+                       );
+                       if ( $needsPurge ) {
+                               $dbw->update( 'user',
+                                       array( 'user_touched' => $now ),
+                                       array( 'user_id' => $this->mId, 'user_touched < ' . $dbw->addQuotes( $now ) ),
+                                       __METHOD__
+                               );
+                       }
 
                        $this->clearSharedCache();
                }
@@ -2281,7 +2290,10 @@ class User {
         * Reset all options to the site defaults
         */
        public function resetOptions() {
+               $this->load();
+
                $this->mOptions = self::getDefaultOptions();
+               $this->mOptionsLoaded = true;
        }
 
        /**
@@ -3011,7 +3023,7 @@ class User {
         */
        public function getPageRenderingHash() {
                wfDeprecated( __METHOD__, '1.17' );
-               
+
                global $wgUseDynamicDates, $wgRenderHashAppend, $wgLang, $wgContLang;
                if( $this->mHash ){
                        return $this->mHash;
@@ -3362,7 +3374,7 @@ class User {
         * @return String New token URL
         */
        private function invalidationTokenUrl( $token ) {
-               return $this->getTokenUrl( 'Invalidateemail', $token );
+               return $this->getTokenUrl( 'InvalidateEmail', $token );
        }
 
        /**
@@ -3924,7 +3936,7 @@ class User {
                } elseif ( $type == ':B:' ) {
                        # Salted
                        list( $salt, $realHash ) = explode( ':', substr( $hash, 3 ), 2 );
-                       return md5( $salt.'-'.md5( $password ) ) == $realHash;
+                       return md5( $salt.'-'.md5( $password ) ) === $realHash;
                } else {
                        # Old-style
                        return self::oldCrypt( $password, $userId ) === $hash;
@@ -4006,7 +4018,7 @@ class User {
 
                        $res = $dbr->select(
                                'user_properties',
-                               '*',
+                               array( 'up_property', 'up_value' ),
                                array( 'up_user' => $this->getId() ),
                                __METHOD__
                        );
@@ -4029,13 +4041,9 @@ class User {
        protected function saveOptions() {
                global $wgAllowPrefChange;
 
-               $extuser = ExternalUser::newFromUser( $this );
-
                $this->loadOptions();
-               $dbw = wfGetDB( DB_MASTER );
-
-               $insert_rows = array();
 
+               // Not using getOptions(), to keep hidden preferences in database
                $saveOptions = $this->mOptions;
 
                // Allow hooks to abort, for instance to save to a global profile.
@@ -4044,13 +4052,17 @@ class User {
                        return;
                }
 
+               $extuser = ExternalUser::newFromUser( $this );
+               $userId = $this->getId();
+               $insert_rows = array();
                foreach( $saveOptions as $key => $value ) {
                        # Don't bother storing default values
-                       if ( ( is_null( self::getDefaultOption( $key ) ) &&
-                                       !( $value === false || is_null($value) ) ) ||
-                                       $value != self::getDefaultOption( $key ) ) {
+                       $defaultOption = self::getDefaultOption( $key );
+                       if ( ( is_null( $defaultOption ) &&
+                                       !( $value === false || is_null( $value ) ) ) ||
+                                       $value != $defaultOption ) {
                                $insert_rows[] = array(
-                                               'up_user' => $this->getId(),
+                                               'up_user' => $userId,
                                                'up_property' => $key,
                                                'up_value' => $value,
                                        );
@@ -4067,7 +4079,8 @@ class User {
                        }
                }
 
-               $dbw->delete( 'user_properties', array( 'up_user' => $this->getId() ), __METHOD__ );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'user_properties', array( 'up_user' => $userId ), __METHOD__ );
                $dbw->insert( 'user_properties', $insert_rows, __METHOD__ );
        }
 
@@ -4129,4 +4142,28 @@ class User {
 
                return $ret;
        }
+
+       /**
+        * Return the list of user fields that should be selected to create
+        * a new user object.
+        * @return array
+        */
+       public static function selectFields() {
+               return array(
+                       'user_id',
+                       'user_name',
+                       'user_real_name',
+                       'user_password',
+                       'user_newpassword',
+                       'user_newpass_time',
+                       'user_email',
+                       'user_touched',
+                       'user_token',
+                       'user_email_authenticated',
+                       'user_email_token',
+                       'user_email_token_expires',
+                       'user_registration',
+                       'user_editcount',
+               );
+       }
 }
index c5ba0b2..3b8f5c1 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Classes to walk into a list of User 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
+ */
 
 abstract class UserArray implements Iterator {
        /**
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 c61ca84..26ac3dc 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Representation of an user on a other locally-hosted wiki.
+ *
+ * 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
+ */
 
 /**
  * Cut-down copy of User interface for local-interwiki-database
index ecff5b5..932af16 100644 (file)
@@ -1,10 +1,29 @@
 <?php
 /**
+ * Accessor and mutator for watchlist 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
  * @ingroup Watchlist
  */
 
 /**
+ * Representation of a pair of user and title for watchlist entries.
+ *
  * @ingroup Watchlist
  */
 class WatchedItem {
index 9d0e579..87526fc 100644 (file)
@@ -671,6 +671,7 @@ class WebRequest {
 
        /**
         * HTML-safe version of appendQuery().
+        * @deprecated: Deprecated in 1.20, warnings in 1.21, remove in 1.22.
         *
         * @param $query String: query string fragment; do not include initial '?'
         * @return String
@@ -980,9 +981,11 @@ HTML;
 
        /**
         * Parse the Accept-Language header sent by the client into an array
-        * @return array array( languageCode => q-value ) sorted by q-value in descending order
+        * @return array array( languageCode => q-value ) sorted by q-value in descending order then
+        *                                                appearing time in the header in ascending order.
         * May contain the "language" '*', which applies to languages other than those explicitly listed.
         * This is aligned with rfc2616 section 14.4
+        * Preference for earlier languages appears in rfc3282 as an extension to HTTP/1.1.
         */
        public function getAcceptLang() {
                // Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
@@ -1003,19 +1006,25 @@ HTML;
                        return array();
                }
 
-               // Create a list like "en" => 0.8
-               $langs = array_combine( $lang_parse[1], $lang_parse[4] );
+               $langcodes = $lang_parse[1];
+               $qvalues = $lang_parse[4];
+               $indices = range( 0, count( $lang_parse[1] ) - 1 );
+
                // Set default q factor to 1
-               foreach ( $langs as $lang => $val ) {
-                       if ( $val === '' ) {
-                               $langs[$lang] = 1;
-                       } elseif ( $val == 0 ) {
-                               unset($langs[$lang]);
+               foreach ( $indices as $index ) {
+                       if ( $qvalues[$index] === '' ) {
+                               $qvalues[$index] = 1;
+                       } elseif ( $qvalues[$index] == 0 ) {
+                               unset( $langcodes[$index], $qvalues[$index], $indices[$index] );
                        }
                }
 
-               // Sort list
-               arsort( $langs, SORT_NUMERIC );
+               // Sort list. First by $qvalues, then by order. Reorder $langcodes the same way
+               array_multisort( $qvalues, SORT_DESC, SORT_NUMERIC, $indices, $langcodes );
+
+               // Create a list like "en" => 0.8
+               $langs = array_combine( $langcodes, $qvalues );
+
                return $langs;
        }
 
index b20cb95..7efb082 100644 (file)
@@ -462,6 +462,8 @@ class MediaWiki {
         * @param $page Page
         */
        private function performAction( Page $page ) {
+               global $wgUseSquid, $wgSquidMaxage;
+
                wfProfileIn( __METHOD__ );
 
                $request = $this->context->getRequest();
@@ -480,6 +482,13 @@ class MediaWiki {
 
                $action = Action::factory( $act, $page );
                if ( $action instanceof Action ) {
+                       # Let Squid cache things if we can purge them.
+                       if ( $wgUseSquid &&
+                               in_array( $request->getFullRequestURL(), $title->getSquidURLs() )
+                       ) {
+                               $output->setSquidMaxage( $wgSquidMaxage );
+                       }
+
                        $action->show();
                        wfProfileOut( __METHOD__ );
                        return;
index 01938cd..d382001 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Special handling for category 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
+ */
+
 /**
  * Special handling for category pages
  */
index 52d8e6d..9fb1522 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Special handling for file 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
+ */
+
 /**
  * Special handling for file pages
  *
index 91e91f9..1190172 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Tools for dealing with other locally-hosted wikis.
+ *
+ * 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
+ */
 
 /**
  * Helper tools for dealing with other locally-hosted wikis
index 6cad466..76a9828 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Base representation for a MediaWiki 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
+ */
+
 /**
  * Abstract class for type hinting (accepts WikiPage, Article, ImagePage, CategoryPage)
  */
@@ -37,6 +58,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 +94,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,15 +165,58 @@ 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 ) {
-               $t = Title::newFromID( $id );
-               if ( $t ) {
-                       return self::factory( $t );
+       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, $from );
+       }
+
+       /**
+        * Constructor from a database row
+        *
+        * @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, $from = 'fromdb' ) {
+               $page = self::factory( Title::newFromRow( $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;
                }
-               return null;
        }
 
        /**
@@ -152,10 +243,20 @@ class WikiPage extends Page {
 
        /**
         * Clear the object
+        * @return void
         */
        public function clear() {
                $this->mDataLoaded = false;
+               $this->mDataLoadedFrom = self::DATA_NOT_LOADED;
+
+               $this->clearCacheFields();
+       }
 
+       /**
+        * Clear the object cache fields
+        * @return void
+        */
+       protected function clearCacheFields() {
                $this->mCounter = null;
                $this->mRedirectTarget = null; # Title object if set
                $this->mLastRevision = null; # Latest revision
@@ -192,14 +293,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 ) );
 
@@ -212,12 +314,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 );
        }
 
        /**
@@ -225,37 +328,69 @@ 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, $from );
+       }
+
+       /**
+        * Load the object from a database row
+        *
+        * @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, $from ) {
                $lc = LinkCache::singleton();
 
                if ( $data ) {
@@ -270,13 +405,22 @@ class WikiPage extends Page {
                        $this->mTouched     = wfTimestamp( TS_MW, $data->page_touched );
                        $this->mIsRedirect  = intval( $data->page_is_redirect );
                        $this->mLatest      = intval( $data->page_latest );
+                       // Bug 37225: $latest may no longer match the cached latest Revision object.
+                       // Double-check the ID of any cached latest Revision object for consistency.
+                       if ( $this->mLastRevision && $this->mLastRevision->getId() != $this->mLatest ) {
+                               $this->mLastRevision = null;
+                               $this->mTimestamp = '';
+                       }
                } else {
                        $lc->addBadLinkObj( $this->mTitle );
 
                        $this->mTitle->loadFromRow( false );
+
+                       $this->clearCacheFields();
                }
 
                $this->mDataLoaded = true;
+               $this->mDataLoadedFrom = self::convertSelectType( $from );
        }
 
        /**
@@ -367,6 +511,45 @@ class WikiPage extends Page {
                return (int)$this->mLatest;
        }
 
+       /**
+        * Get the Revision object of the oldest revision
+        * @return Revision|null
+        */
+       public function getOldestRevision() {
+               wfProfileIn( __METHOD__ );
+
+               // Try using the slave database first, then try the master
+               $continue = 2;
+               $db = wfGetDB( DB_SLAVE );
+               $revSelectFields = Revision::selectFields();
+
+               while ( $continue ) {
+                       $row = $db->selectRow(
+                               array( 'page', 'revision' ),
+                               $revSelectFields,
+                               array(
+                                       'page_namespace' => $this->mTitle->getNamespace(),
+                                       'page_title' => $this->mTitle->getDBkey(),
+                                       'rev_page = page_id'
+                               ),
+                               __METHOD__,
+                               array(
+                                       'ORDER BY' => 'rev_timestamp ASC'
+                               )
+                       );
+
+                       if ( $row ) {
+                               $continue = 0;
+                       } else {
+                               $db = wfGetDB( DB_MASTER );
+                               $continue--;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $row ? Revision::newFromRow( $row ) : null;
+       }
+
        /**
         * Loads everything except the text
         * This isn't necessary for all uses, so it's only done if needed.
@@ -445,7 +628,7 @@ class WikiPage extends Page {
                if ( !$this->mTimestamp ) {
                        $this->loadLastEdit();
                }
-               
+
                return wfTimestamp( TS_MW, $this->mTimestamp );
        }
 
@@ -474,6 +657,24 @@ class WikiPage extends Page {
                }
        }
 
+       /**
+        * Get the User object of the user who created the page
+        * @param $audience Integer: one of:
+        *      Revision::FOR_PUBLIC       to be displayed to all users
+        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::RAW              get the text regardless of permissions
+        * @return User|null
+        */
+       public function getCreator( $audience = Revision::FOR_PUBLIC ) {
+               $revision = $this->getOldestRevision();
+               if ( $revision ) {
+                       $userName = $revision->getUserText( $audience );
+                       return User::newFromName( $userName, false );
+               } else {
+                       return null;
+               }
+       }
+
        /**
         * @param $audience Integer: one of:
         *      Revision::FOR_PUBLIC       to be displayed to all users
@@ -1244,7 +1445,7 @@ class WikiPage extends Page {
         *  Compatibility note: this function previously returned a boolean value indicating success/failure
         */
        public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
-               global $wgUser, $wgDBtransactions, $wgUseAutomaticEditSummaries;
+               global $wgUser, $wgUseAutomaticEditSummaries;
 
                # Low-level sanity check
                if ( $this->mTitle->getText() === '' ) {
@@ -1256,7 +1457,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 );
@@ -1310,11 +1513,6 @@ class WikiPage extends Page {
                                return $status;
                        }
 
-                       # Make sure the revision is either completely inserted or not inserted at all
-                       if ( !$wgDBtransactions ) {
-                               $userAbort = ignore_user_abort( true );
-                       }
-
                        $revision = new Revision( array(
                                'page'       => $this->getId(),
                                'comment'    => $summary,
@@ -1325,6 +1523,9 @@ class WikiPage extends Page {
                                'user_text'  => $user->getName(),
                                'timestamp'  => $now
                        ) );
+                       # Bug 37225: use accessor to get the text as Revision may trim it.
+                       # After trimming, the text may be a duplicate of the current text.
+                       $text = $revision->getText(); // sanity; EditPage should trim already
 
                        $changed = ( strcmp( $text, $oldtext ) != 0 );
 
@@ -1345,11 +1546,6 @@ class WikiPage extends Page {
                                        /* Belated edit conflict! Run away!! */
                                        $status->fatal( 'edit-conflict' );
 
-                                       # Delete the invalid revision if the DB is not transactional
-                                       if ( !$wgDBtransactions ) {
-                                               $dbw->delete( 'revision', array( 'rev_id' => $revisionId ), __METHOD__ );
-                                       }
-
                                        $revisionId = 0;
                                        $dbw->rollback( __METHOD__ );
                                } else {
@@ -1380,10 +1576,6 @@ class WikiPage extends Page {
                                $revision->setId( $this->getLatest() );
                        }
 
-                       if ( !$wgDBtransactions ) {
-                               ignore_user_abort( $userAbort );
-                       }
-
                        // Now that ignore_user_abort is restored, we can respond to fatal errors
                        if ( !$status->isOK() ) {
                                wfProfileOut( __METHOD__ );
@@ -1431,6 +1623,9 @@ class WikiPage extends Page {
                        ) );
                        $revisionId = $revision->insertOn( $dbw );
 
+                       # Bug 37225: use accessor to get the text as Revision may trim it
+                       $text = $revision->getText(); // sanity; EditPage should trim already
+
                        # Update the page record with revision data
                        $this->updateRevisionOn( $dbw, $revision, 0 );
 
@@ -1571,9 +1766,9 @@ class WikiPage extends Page {
                        $parserCache->save( $editInfo->output, $this, $editInfo->popts );
                }
 
-               # Update the links tables
-               $u = new LinksUpdate( $this->mTitle, $editInfo->output );
-               $u->doUpdate();
+               # Update the links tables and other secondary data
+               $updates = $editInfo->output->getSecondaryDataUpdates( $this->mTitle );
+               DataUpdate::runUpdates( $updates );
 
                wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 
@@ -1692,7 +1887,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;
@@ -1958,19 +2153,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
@@ -1985,6 +2185,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
@@ -2052,57 +2253,18 @@ class WikiPage extends Page {
        /**
         * Do some database updates after deletion
         *
-        * @param $id Int: page_id value of the page being deleted
+        * @param $id Int: page_id value of the page being deleted (B/C, currently unused)
         */
        public function doDeleteUpdates( $id ) {
+               # update site status
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
 
-               $dbw = wfGetDB( DB_MASTER );
-
-               # Delete restrictions for it
-               $dbw->delete( 'page_restrictions', array ( 'pr_page' => $id ), __METHOD__ );
-
-               # Fix category table counts
-               $cats = array();
-               $res = $dbw->select( 'categorylinks', 'cl_to', array( 'cl_from' => $id ), __METHOD__ );
-
-               foreach ( $res as $row ) {
-                       $cats [] = $row->cl_to;
-               }
-
-               $this->updateCategoryCounts( array(), $cats );
-
-               # If using cascading deletes, we can skip some explicit deletes
-               if ( !$dbw->cascadingDeletes() ) {
-                       $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
-
-                       # Delete outgoing links
-                       $dbw->delete( 'pagelinks', array( 'pl_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'imagelinks', array( 'il_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'categorylinks', array( 'cl_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'templatelinks', array( 'tl_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'externallinks', array( 'el_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'langlinks', array( 'll_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'iwlinks', array( 'iwl_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'redirect', array( 'rd_from' => $id ), __METHOD__ );
-                       $dbw->delete( 'page_props', array( 'pp_page' => $id ), __METHOD__ );
-               }
-
-               # If using cleanup triggers, we can skip some manual deletes
-               if ( !$dbw->cleanupTriggers() ) {
-                       # Clean up recentchanges entries...
-                       $dbw->delete( 'recentchanges',
-                               array( 'rc_type != ' . RC_LOG,
-                                       'rc_namespace' => $this->mTitle->getNamespace(),
-                                       'rc_title' => $this->mTitle->getDBkey() ),
-                               __METHOD__ );
-                       $dbw->delete( 'recentchanges',
-                               array( 'rc_type != ' . RC_LOG, 'rc_cur_id' => $id ),
-                               __METHOD__ );
-               }
+               # remove secondary indexes, etc
+               $updates = $this->getDeletionUpdates( );
+               DataUpdate::runUpdates( $updates );
 
                # Clear caches
-               self::onArticleDelete( $this->mTitle );
+               WikiPage::onArticleDelete( $this->mTitle );
 
                # Reset this object
                $this->clear();
@@ -2111,13 +2273,23 @@ class WikiPage extends Page {
                $this->mTitle->resetArticleID( 0 );
        }
 
+       public function getDeletionUpdates() {
+               $updates = array(
+                       new LinksDeletionUpdate( $this ),
+               );
+
+               //@todo: make a hook to add update objects
+               //NOTE: deletion updates will be determined by the ContentHandler in the future
+               return $updates;
+       }
+
        /**
         * Roll back the most recent consecutive set of edits to a page
         * from the same user; fails if there are no eligible edits to
         * roll back to, e.g. user is the sole contributor. This function
         * performs permissions checks on $user, then calls commitRollback()
         * to do the dirty work
-        * 
+        *
         * @todo: seperate the business/permission stuff out from backend code
         *
         * @param $fromP String: Name of the user whose edits to rollback.
@@ -2679,6 +2851,7 @@ class WikiPage extends Page {
 
                if ( count( $templates_diff ) > 0 ) {
                        # Whee, link updates time.
+                       # Note: we are only interested in links here. We don't need to get other DataUpdate items from the parser output.
                        $u = new LinksUpdate( $this->mTitle, $parserOutput, false );
                        $u->doUpdate();
                }
@@ -2786,7 +2959,7 @@ class WikiPage extends Page {
        public function quickEdit( $text, $comment = '', $minor = 0 ) {
                wfDeprecated( __METHOD__, '1.18' );
                global $wgUser;
-               return $this->doQuickEdit( $text, $wgUser, $comment, $minor );
+               $this->doQuickEdit( $text, $wgUser, $comment, $minor );
        }
 
        /**
index 2e882ed..6e4bb3a 100644 (file)
@@ -1,9 +1,28 @@
 <?php
+/**
+ * Methods to generate XML.
+ *
+ * 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
+ */
 
 /**
  * Module of static functions for generating XML
  */
-
 class Xml {
        /**
         * Format an XML element with given attributes and, optionally, text content.
index be286f8..b95dd6a 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * XML syntax and type checker.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 class XmlTypeCheck {
        /**
index d3d7916..4299841 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Client for querying zhdaemon.
+ *
+ * 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
+ */
 
 /**
  * Client for querying zhdaemon
index 58bc98c..2a2d31e 100644 (file)
@@ -3273,8 +3273,8 @@ $zh2Hant = array(
 '于伟国' => '于偉國',
 '于偉國' => '于偉國',
 '于光新' => '于光新',
-'于光远' => '于光遠',
 '于光遠' => '于光遠',
+'于光远' => '于光遠',
 '于克-蘭多縣' => '于克-蘭多縣',
 '于克-兰多县' => '于克-蘭多縣',
 '于克勒' => '于克勒',
@@ -3444,8 +3444,8 @@ $zh2Hant = array(
 '于风政' => '于風政',
 '于風政' => '于風政',
 '于飞' => '于飛',
-'于飛島' => '于飛島',
 '于飞岛' => '于飛島',
+'于飛島' => '于飛島',
 '于余曲折' => '于餘曲折',
 '于鬯' => '于鬯',
 '于魁智' => '于魁智',
@@ -6283,8 +6283,8 @@ $zh2Hant = array(
 '有只用' => '有只用',
 '有够赞' => '有夠讚',
 '有征伐' => '有征伐',
-'有征戰' => '有征戰',
 '有征战' => '有征戰',
+'有征戰' => '有征戰',
 '有征服' => '有征服',
 '有征讨' => '有征討',
 '有征討' => '有征討',
@@ -6610,6 +6610,8 @@ $zh2Hant = array(
 '浮松' => '浮鬆',
 '海上布雷' => '海上佈雷',
 '海干' => '海乾',
+'海淀山后' => '海淀山後',
+'海淀山後' => '海淀山後',
 '海湾布雷' => '海灣佈雷',
 '涂善妮' => '涂善妮',
 '涂坤' => '涂坤',
@@ -15595,8 +15597,8 @@ $zh2TW = array(
 '卡塔尔' => '卡達',
 '打印機' => '印表機',
 '打印机' => '印表機',
-'厄立特里亞' => '厄利垂亞',
 '厄立特里亚' => '厄利垂亞',
+'厄立特里亞' => '厄利垂亞',
 '厄瓜多尔' => '厄瓜多',
 '厄瓜多爾' => '厄瓜多',
 '斯威士兰' => '史瓦濟蘭',
@@ -18450,8 +18452,8 @@ $zh2SG = array(
 '方便面' => '快速面',
 '零钱' => '散钱',
 '散紙' => '散钱',
-'榴蓮' => '榴梿',
 '榴莲' => '榴梿',
+'榴蓮' => '榴梿',
 '笨豬跳' => '绑紧跳',
 '蹦极跳' => '绑紧跳',
 '笑星' => '谐星',
index b2ce789..5b96b40 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * ZIP file directories reader, for the purposes of upload verification.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 /**
  * A class for reading ZIP file directories, for the purposes of upload
diff --git a/includes/actions/CachedAction.php b/includes/actions/CachedAction.php
new file mode 100644 (file)
index 0000000..d21f9ae
--- /dev/null
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * Abstract action class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * 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 Action
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @since 1.20
+ */
+abstract class CachedAction extends FormlessAction implements ICacheHelper {
+
+       /**
+        * CacheHelper object to which we forward the non-SpecialPage specific caching work.
+        * Initialized in startCache.
+        *
+        * @since 1.20
+        * @var CacheHelper
+        */
+       protected $cacheHelper;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheHelper->setCacheEnabled( $cacheEnabled );
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               $this->cacheHelper = new CacheHelper();
+
+               $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
+               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+
+               $keyArgs = $this->getCacheKey();
+
+               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                       unset( $keyArgs['action'] );
+               }
+
+               $this->cacheHelper->setCacheKey( $keyArgs );
+
+               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                       $this->cacheHelper->rebuildOnDemand();
+               }
+
+               $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
+       /**
+        * Add some HTML to be cached.
+        * This is done by providing a callback function that should
+        * return the HTML to be added. It will only be called if the
+        * item is not in the cache yet or when the cache has been invalidated.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array $args
+        * @param string|null $key
+        */
+       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               $this->cacheHelper->saveCache();
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheHelper->setExpiry( $cacheExpiry );
+       }
+
+       /**
+        * Returns the variables used to constructed the cache key in an array.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getCacheKey() {
+               return array(
+                       get_class( $this->page ),
+                       $this->getName(),
+                       $this->getLanguage()->getCode()
+               );
+       }
+
+       /**
+        * Gets called after the cache got initialized.
+        *
+        * @since 1.20
+        *
+        * @param boolean $hasCached
+        */
+       public function onCacheInitialized( $hasCached ) {
+               if ( $hasCached ) {
+                       $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
+               }
+       }
+
+}
index c49d232..50d210f 100644 (file)
@@ -3,6 +3,22 @@
  * Page history
  *
  * Split off from Article.php and Skin.php, 2003-12-22
+ *
+ * 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
  */
 
@@ -71,7 +87,7 @@ class HistoryAction extends FormlessAction {
         * Print the history page for an article.
         */
        function onView() {
-               global $wgScript, $wgUseFileCache, $wgSquidMaxage;
+               global $wgScript, $wgUseFileCache;
 
                $out = $this->getOutput();
                $request = $this->getRequest();
@@ -85,10 +101,6 @@ class HistoryAction extends FormlessAction {
 
                wfProfileIn( __METHOD__ );
 
-               if ( $request->getFullRequestURL() == $this->getTitle()->getInternalURL( 'action=history' ) ) {
-                       $out->setSquidMaxage( $wgSquidMaxage );
-               }
-
                $this->preCacheMessages();
 
                # Fill in the file cache if not set already
@@ -192,6 +204,11 @@ class HistoryAction extends FormlessAction {
         * @return ResultWrapper
         */
        function fetchRevisions( $limit, $offset, $direction ) {
+               // Fail if article doesn't exist.
+               if( !$this->getTitle()->exists() ) {
+                       return new FakeResultWrapper( array() );
+               }
+
                $dbr = wfGetDB( DB_SLAVE );
 
                if ( $direction == HistoryPage::DIR_PREV ) {
index 5615ad5..174ca3f 100644 (file)
@@ -7,7 +7,20 @@
  *
  * Based on HistoryPage and SpecialExport
  *
- * License: GPL (http://www.gnu.org/copyleft/gpl.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
  *
  * @author Gabriel Wicke <wicke@wikidev.net>
  * @file
index 4e37381..d57585e 100644 (file)
@@ -34,9 +34,6 @@ class ViewAction extends FormlessAction {
        }
 
        public function show(){
-               global $wgSquidMaxage;
-
-               $this->getOutput()->setSquidMaxage( $wgSquidMaxage );
                $this->page->view();
        }
 
index edd9aca..6a9be24 100644 (file)
@@ -56,6 +56,11 @@ abstract class ApiBase extends ContextSource {
        /// @since 1.17
        const PARAM_RANGE_ENFORCE = 9; // Boolean, if MIN/MAX are set, enforce (die) these? Only applies if TYPE='integer' Use with extreme caution
 
+       const PROP_ROOT = 'ROOT'; // Name of property group that is on the root element of the result, i.e. not part of a list
+       const PROP_LIST = 'LIST'; // Boolean, is the result multiple items? Defaults to true for query modules, to false for other modules
+       const PROP_TYPE = 0; // Type of the property, uses same format as PARAM_TYPE
+       const PROP_NULLABLE = 1; // Boolean, can the property be not included in the result? Defaults to false
+
        const LIMIT_BIG1 = 500; // Fast query, std user limit
        const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
        const LIMIT_SML1 = 50; // Slow query, std user limit
@@ -572,6 +577,51 @@ abstract class ApiBase extends ContextSource {
                return $desc;
        }
 
+       /**
+        * Returns possible properties in the result, grouped by the value of the prop parameter
+        * that shows them.
+        *
+        * Properties that are shown always are in a group with empty string as a key.
+        * Properties that can be shown by several values of prop are included multiple times.
+        * If some properties are part of a list and some are on the root object (see ApiQueryQueryPage),
+        * those on the root object are under the key PROP_ROOT.
+        * The array can also contain a boolean under the key PROP_LIST,
+        * indicating whether the result is a list.
+        *
+        * Don't call this functon directly: use getFinalResultProperties() to
+        * allow hooks to modify descriptions as needed.
+        *
+        * @return array|bool False on no properties
+        */
+       protected function getResultProperties() {
+               return false;
+       }
+
+       /**
+        * Get final possible result properties, after hooks have had a chance to tweak it as
+        * needed.
+        *
+        * @return array
+        */
+       public function getFinalResultProperties() {
+               $properties = $this->getResultProperties();
+               wfRunHooks( 'APIGetResultProperties', array( $this, &$properties ) );
+               return $properties;
+       }
+
+       /**
+        * Add token properties to the array used by getResultProperties,
+        * based on a token functions mapping.
+        */
+       protected static function addTokenProperties( &$props, $tokenFunctions ) {
+               foreach ( array_keys( $tokenFunctions ) as $token ) {
+                       $props[''][$token . 'token'] = array(
+                               ApiBase::PROP_TYPE => 'string',
+                               ApiBase::PROP_NULLABLE => true
+                       );
+               }
+       }
+
        /**
         * Get final module description, after hooks have had a chance to tweak it as
         * needed.
@@ -698,6 +748,53 @@ abstract class ApiBase extends ContextSource {
                );
        }
 
+       /**
+        * @param $params array
+        * @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, $load = false ) {
+               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
+
+               $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'] ) ) {
+                       if ( $load === false ) {
+                               $load = 'fromdb';
+                       }
+                       $pageObj = WikiPage::newFromID( $params['pageid'], $load );
+                       if ( !$pageObj ) {
+                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
+                       }
+               }
+
+               return $pageObj;
+       }
+
+       /**
+        * @return array
+        */
+       public function getTitleOrPageIdErrorMessage() {
+               return array_merge(
+                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       array(
+                               array( 'invalidtitle', 'title' ),
+                               array( 'nosuchpageid', 'pageid' ),
+                       )
+               );
+       }
+
        /**
         * Callback function used in requireOnlyOneParameter to check whether reequired parameters are set
         *
@@ -1215,7 +1312,6 @@ abstract class ApiBase extends ContextSource {
                'noimageredirect-anon' => array( 'code' => 'noimageredirect-anon', 'info' => "Anonymous users can't create image redirects" ),
                'noimageredirect-logged' => array( 'code' => 'noimageredirect', 'info' => "You don't have permission to create image redirects" ),
                'spamdetected' => array( 'code' => 'spamdetected', 'info' => "Your edit was refused because it contained a spam fragment: \"\$1\"" ),
-               'filtered' => array( 'code' => 'filtered', 'info' => "The filter callback function refused your edit" ),
                'contenttoobig' => array( 'code' => 'contenttoobig', 'info' => "The content you supplied exceeds the article size limit of \$1 kilobytes" ),
                'noedit-anon' => array( 'code' => 'noedit-anon', 'info' => "Anonymous users can't edit pages" ),
                'noedit' => array( 'code' => 'noedit', 'info' => "You don't have permission to edit pages" ),
index 7d3a40b..6cd31ae 100644 (file)
@@ -100,12 +100,14 @@ class ApiBlock extends ApiBase {
 
                $block = Block::newFromTarget( $target );
                if( $block instanceof Block ){
-                       $res['expiry'] = $block->mExpiry == wfGetDB( DB_SLAVE )->getInfinity()
+                       $res['expiry'] = $block->mExpiry == $this->getDB()->getInfinity()
                                ? 'infinite'
                                : wfTimestamp( TS_ISO_8601, $block->mExpiry );
+                       $res['id'] = $block->getId();
                } else {
                        # should be unreachable
                        $res['expiry'] = '';
+                       $res['id'] = '';
                }
 
                $res['reason'] = $params['reason'];
@@ -149,7 +151,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 +171,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)',
@@ -181,6 +186,44 @@ class ApiBlock extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'blocktoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'user' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'userID' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'expiry' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'id' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'reason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'anononly' => 'boolean',
+                               'nocreate' => 'boolean',
+                               'autoblock' => 'boolean',
+                               'noemail' => 'boolean',
+                               'hidename' => 'boolean',
+                               'allowusertalk' => 'boolean',
+                               'watchuser' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Block a user';
        }
index 87f0967..ed72b29 100644 (file)
@@ -124,6 +124,25 @@ class ApiComparePages extends ApiBase {
                        'torev' => 'Second revision to compare',
                );
        }
+
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'fromtitle' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'fromrevid' => 'integer',
+                               'totitle' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'torevid' => 'integer',
+                               '*' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Get the difference between 2 pages',
index 8a4a17f..1927490 100644 (file)
@@ -46,25 +46,13 @@ class ApiDelete extends ApiBase {
        public function execute() {
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
-               }
-               if ( !$titleObj->exists() ) {
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               if ( !$pageObj->exists() ) {
                        $this->dieUsageMsg( 'notanarticle' );
                }
 
+               $titleObj = $pageObj->getTitle();
                $reason = ( isset( $params['reason'] ) ? $params['reason'] : null );
-               $pageObj = WikiPage::factory( $titleObj );
                $user = $this->getUser();
 
                if ( $titleObj->getNamespace() == NS_FILE ) {
@@ -233,16 +221,23 @@ class ApiDelete extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'title' => 'string',
+                               'reason' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Delete a page';
        }
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'notanarticle' ),
                                array( 'hookaborted', 'error' ),
                                array( 'delete-toobig', 'limit' ),
index 796b049..9a16007 100644 (file)
@@ -48,18 +48,10 @@ class ApiEditPage extends ApiBase {
                        $this->dieUsageMsg( 'missingtext' );
                }
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj || $titleObj->isExternal() ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
+               $pageObj = $this->getTitleOrPageId( $params );
+               $titleObj = $pageObj->getTitle();
+               if ( $titleObj->isExternal() ) {
+                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                }
 
                $apiResult = $this->getResult();
@@ -291,9 +283,6 @@ class ApiEditPage extends ApiBase {
                        case EditPage::AS_SPAM_ERROR:
                                $this->dieUsageMsg( array( 'spamdetected', $result['spam'] ) );
 
-                       case EditPage::AS_FILTERING:
-                               $this->dieUsageMsg( 'filtered' );
-
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
                                $this->dieUsageMsg( 'blockedtext' );
 
@@ -351,16 +340,11 @@ class ApiEditPage extends ApiBase {
                                $this->dieUsageMsg( 'summaryrequired' );
 
                        case EditPage::AS_END:
+                       default:
                                // $status came from WikiPage::doEdit()
                                $errors = $status->getErrorsArray();
                                $this->dieUsageMsg( $errors[0] ); // TODO: Add new errors to message map
                                break;
-                       default:
-                               if ( is_string( $status->value ) && strlen( $status->value ) ) {
-                                       $this->dieUsage( "An unknown return value was returned by Editpage. The code returned was \"{$status->value}\"" , $status->value );
-                               } else {
-                                       $this->dieUsageMsg( array( 'unknownerror', $status->value ) );
-                               }
                }
                $apiResult->addValue( null, $this->getModuleName(), $r );
        }
@@ -381,11 +365,9 @@ class ApiEditPage extends ApiBase {
                global $wgMaxArticleSize;
 
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'missingtext' ),
-                               array( 'invalidtitle', 'title' ),
                                array( 'createonly-exists' ),
                                array( 'nocreate-missing' ),
                                array( 'nosuchrevid', 'undo' ),
@@ -398,7 +380,6 @@ class ApiEditPage extends ApiBase {
                                array( 'noimageredirect-logged' ),
                                array( 'spamdetected', 'spam' ),
                                array( 'summaryrequired' ),
-                               array( 'filtered' ),
                                array( 'blockedtext' ),
                                array( 'contenttoobig', $wgMaxArticleSize ),
                                array( 'noedit-anon' ),
@@ -484,14 +465,14 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => 'The title for a new section',
                        'text' => 'Page content',
                        'token' => array( 'Edit token. You can get one of these through prop=info.',
-                                               'The token should always be sent as the last parameter, or at least, after the text parameter'
+                                               "The token should always be sent as the last parameter, or at least, after the {$p}text parameter"
                        ),
-                       'summary' => 'Edit summary. Also section title when section=new',
+                       'summary' => "Edit summary. Also section title when {$p}section=new and {$p}sectiontitle is not set",
                        'minor' => 'Minor edit',
                        'notminor' => 'Non-minor edit',
                        'bot' => 'Mark this edit as bot',
                        'basetimestamp' => array( 'Timestamp of the base revision (obtained through prop=revisions&rvprop=timestamp).',
-                                               'Used to detect edit conflicts; leave unset to ignore conflicts.'
+                                               'Used to detect edit conflicts; leave unset to ignore conflicts'
                        ),
                        'starttimestamp' => array( 'Timestamp when you obtained the edit token.',
                                                'Used to detect edit conflicts; leave unset to ignore conflicts'
@@ -505,13 +486,49 @@ class ApiEditPage extends ApiBase {
                        'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
                                        'If set, the edit won\'t be done unless the hash is correct' ),
                        'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
-                       'appendtext' => "Add this text to the end of the page. Overrides {$p}text",
+                       'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
+                                               "Use {$p}section=new to append a new section" ),
                        'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
                        'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
                        'redirect' => 'Automatically resolve redirects',
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'new' => 'boolean',
+                               'result' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'Success',
+                                               'Failure'
+                                       ),
+                               ),
+                               'pageid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'title' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'nochange' => 'boolean',
+                               'oldrevid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'newrevid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'newtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function needsToken() {
                return true;
        }
index d9eed60..4b6ba00 100644 (file)
@@ -55,7 +55,7 @@ class ApiEmailUser extends ApiBase {
                        'Subject' => $params['subject'],
                        'CCMe' => $params['ccme'],
                );
-               $retval = SpecialEmailUser::submit( $data );
+               $retval = SpecialEmailUser::submit( $data, $this->getContext() );
 
                if ( $retval instanceof Status ) {
                        // SpecialEmailUser sometimes returns a status
@@ -113,6 +113,23 @@ class ApiEmailUser extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'result' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'Success',
+                                               'Failure'
+                                       ),
+                               ),
+                               'message' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Email a user.';
        }
index d570534..2ed118f 100644 (file)
@@ -103,6 +103,14 @@ class ApiExpandTemplates extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               '*' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Expands all templates in wikitext';
        }
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..7cac0eb 100644 (file)
@@ -132,15 +132,29 @@ class ApiFileRevert extends ApiBase {
        }
 
        public function getParamDescription() {
-               $params = array(
-                       'filename' => 'Target filename',
+               return array(
+                       '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',
                );
+       }
 
-               return $params;
-
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'result' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'Success',
+                                               'Failure'
+                                       )
+                               ),
+                               'errors' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
        }
 
        public function getDescription() {
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 8f4abc1..ef2c54f 100644 (file)
@@ -215,7 +215,8 @@ class ApiFormatXml extends ApiFormatBase {
        public function getParamDescription() {
                return array(
                        'xmldoublequote' => 'If specified, double quotes all attributes and content',
-                       'xslt' => 'If specified, adds <xslt> as stylesheet',
+                       'xslt' => 'If specified, adds <xslt> as stylesheet. This should be a wiki page '
+                               . 'in the MediaWiki namespace whose page name ends with ".xsl"',
                        'includexmlnamespace' => 'If specified, adds an XML namespace'
                );
        }
index ade9f1f..6663d97 100644 (file)
@@ -126,6 +126,17 @@ class ApiImport extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_LIST => true,
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'revisions' => 'integer'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Import a page from another wiki, or an XML file.' ,
@@ -186,8 +197,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 ) {
+                       # Invalid or non-importable title
+                       $r['title'] = $pageInfo['title'];
+                       $r['invalid'] = '';
+               } else {
+                       ApiQueryBase::addTitleInfo( $r, $title );
+                       $r['revisions'] = intval( $successCount );
+               }
+
                $this->mResultArr[] = $r;
 
                // Piggyback on the parent to do the logging
index aa570cb..2ad2653 100644 (file)
@@ -79,6 +79,8 @@ class ApiLogin extends ApiBase {
                                $user->setOption( 'rememberpassword', 1 );
                                $user->setCookies( $this->getRequest() );
 
+                               ApiQueryInfo::resetTokenCache();
+
                                // Run hooks.
                                // @todo FIXME: Split back and frontend from this hook.
                                // @todo FIXME: This hook should be placed in the backend
@@ -181,6 +183,66 @@ class ApiLogin extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'result' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'Success',
+                                               'NeedToken',
+                                               'WrongToken',
+                                               'NoName',
+                                               'Illegal',
+                                               'WrongPluginPass',
+                                               'NotExists',
+                                               'WrongPass',
+                                               'EmptyPass',
+                                               'CreateBlocked',
+                                               'Throttled',
+                                               'Blocked',
+                                               'Aborted'
+                                       )
+                               ),
+                               'lguserid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'lgusername' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'lgtoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'cookieprefix' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'sessionid' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'token' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'details' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'wait' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'reason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Log in and get the authentication tokens. ',
index 81a054a..cab2430 100644 (file)
@@ -54,6 +54,10 @@ class ApiLogout extends ApiBase {
                return array();
        }
 
+       public function getResultProperties() {
+               return array();
+       }
+
        public function getParamDescription() {
                return array();
        }
index 2105b81..30e9fb6 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() );
                        }
 
@@ -595,12 +596,18 @@ class ApiMain extends ApiBase {
                $moduleParams = $module->extractRequestParams();
 
                // Die if token required, but not provided (unless there is a gettoken parameter)
+               if ( isset( $moduleParams['gettoken'] ) ) {
+                       $gettoken = $moduleParams['gettoken'];
+               } else {
+                       $gettoken = false;
+               }
+
                $salt = $module->getTokenSalt();
-               if ( $salt !== false && isset( $moduleParams['gettoken'] ) && !$moduleParams['gettoken'] ) {
+               if ( $salt !== false && !$gettoken ) {
                        if ( !isset( $moduleParams['token'] ) ) {
                                $this->dieUsageMsg( array( 'missingparam', 'token' ) );
                        } else {
-                               if ( !$this->getUser()->matchEditToken( $moduleParams['token'], $salt ) ) {
+                               if ( !$this->getUser()->matchEditToken( $moduleParams['token'], $salt, $this->getContext()->getRequest() ) ) {
                                        $this->dieUsageMsg( 'sessionfailure' );
                                }
                        }
@@ -708,6 +715,9 @@ class ApiMain extends ApiBase {
                $module->profileOut();
 
                if ( !$this->mInternalMode ) {
+                       //append Debug information
+                       MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
+
                        // Print result data
                        $this->printResult( false );
                }
index f0a25e4..c89f59b 100644 (file)
@@ -224,6 +224,33 @@ class ApiMove extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'from' => 'string',
+                               'to' => 'string',
+                               'reason' => 'string',
+                               'redirectcreated' => 'boolean',
+                               'talkfrom' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'talkto' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'talkmove-error-code' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'talkmove-error-info' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Move a page';
        }
diff --git a/includes/api/ApiOptions.php b/includes/api/ApiOptions.php
new file mode 100644 (file)
index 0000000..2b3d5e3
--- /dev/null
@@ -0,0 +1,166 @@
+<?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 getResultProperties() {
+               return array(
+                       '' => array(
+                               '*' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'success'
+                                       )
+                               )
+                       )
+               );
+       }
+
+       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 cc86c76..b7db4f0 100644 (file)
@@ -367,7 +367,7 @@ class ApiPageSet extends ApiQueryBase {
         */
        public function processDbRow( $row ) {
                // Store Title object in various data structures
-               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $title = Title::newFromRow( $row );
 
                $pageId = intval( $row->page_id );
                $this->mAllPages[$row->page_namespace][$row->page_title] = $pageId;
@@ -481,6 +481,7 @@ class ApiPageSet extends ApiQueryBase {
                        ApiBase::dieDebug( __METHOD__, 'Missing $processTitles parameter when $remaining is provided' );
                }
 
+               $usernames = array();
                if ( $res ) {
                        foreach ( $res as $row ) {
                                $pageId = intval( $row->page_id );
@@ -496,6 +497,11 @@ class ApiPageSet extends ApiQueryBase {
 
                                // Store any extra fields requested by modules
                                $this->processDbRow( $row );
+
+                               // Need gender information
+                               if( MWNamespace::hasGenderDistinction( $row->page_namespace ) ) {
+                                       $usernames[] = $row->page_title;
+                               }
                        }
                }
 
@@ -510,6 +516,11 @@ class ApiPageSet extends ApiQueryBase {
                                                $this->mMissingTitles[$this->mFakePageId] = $title;
                                                $this->mFakePageId--;
                                                $this->mTitles[] = $title;
+
+                                               // need gender information
+                                               if( MWNamespace::hasGenderDistinction( $ns ) ) {
+                                                       $usernames[] = $dbkey;
+                                               }
                                        }
                                }
                        } else {
@@ -521,6 +532,10 @@ class ApiPageSet extends ApiQueryBase {
                                }
                        }
                }
+
+               // Get gender information
+               $genderCache = GenderCache::singleton();
+               $genderCache->doQuery( $usernames, __METHOD__ );
        }
 
        /**
@@ -664,6 +679,9 @@ class ApiPageSet extends ApiQueryBase {
         * @return LinkBatch
         */
        private function processTitlesArray( $titles ) {
+               $genderCache = GenderCache::singleton();
+               $genderCache->doTitlesArray( $titles, __METHOD__ );
+
                $linkBatch = new LinkBatch();
 
                foreach ( $titles as $title ) {
index f226347..dffce5b 100644 (file)
@@ -251,6 +251,62 @@ class ApiParamInfo extends ApiBase {
                }
                $result->setIndexedTagName( $retval['parameters'], 'param' );
 
+               $props = $obj->getFinalResultProperties();
+               $listResult = null;
+               if ( $props !== false ) {
+                       $retval['props'] = array();
+
+                       foreach ( $props as $prop => $properties ) {
+                               $propResult = array();
+                               if ( $prop == ApiBase::PROP_LIST ) {
+                                       $listResult = $properties;
+                                       continue;
+                               }
+                               if ( $prop != ApiBase::PROP_ROOT ) {
+                                       $propResult['name'] = $prop;
+                               }
+                               $propResult['properties'] = array();
+
+                               foreach ( $properties as $name => $p ) {
+                                       $propertyResult = array();
+
+                                       $propertyResult['name'] = $name;
+
+                                       if ( !is_array( $p ) ) {
+                                               $p = array( ApiBase::PROP_TYPE => $p );
+                                       }
+
+                                       $propertyResult['type'] = $p[ApiBase::PROP_TYPE];
+
+                                       if ( is_array( $propertyResult['type'] ) ) {
+                                               $propertyResult['type'] = array_values( $propertyResult['type'] );
+                                               $result->setIndexedTagName( $propertyResult['type'], 't' );
+                                       }
+
+                                       $nullable = null;
+                                       if ( isset( $p[ApiBase::PROP_NULLABLE] ) ) {
+                                               $nullable = $p[ApiBase::PROP_NULLABLE];
+                                       }
+
+                                       if ( $nullable === true ) {
+                                               $propertyResult['nullable'] = '';
+                                       }
+
+                                       $propResult['properties'][] = $propertyResult;
+                               }
+
+                               $result->setIndexedTagName( $propResult['properties'], 'property' );
+                               $retval['props'][] = $propResult;
+                       }
+
+                       // default is true for query modules, false for other modules, overriden by ApiBase::PROP_LIST
+                       if ( $listResult === true || ( $listResult !== false && $obj instanceof ApiQueryBase ) ) {
+                               $retval['listresult'] = '';
+                       }
+
+                       $result->setIndexedTagName( $retval['props'], 'prop' );
+               }
+
                // Errors
                $retval['errors'] = $this->parseErrors( $obj->getPossibleErrors() );
                $result->setIndexedTagName( $retval['errors'], 'error' );
index 141f779..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
                }
        }
 
@@ -328,6 +332,9 @@ class ApiParse extends ApiBase {
                        // Try the parser cache first
                        // getParserOutput will save to Parser cache if able
                        $pout = $page->getParserOutput( $popts );
+                       if ( !$pout ) {
+                               $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
+                       }
                        if ( $getWikitext ) {
                                $this->text = $page->getRawText();
                        }
@@ -461,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 ) {
@@ -496,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',
@@ -515,6 +533,7 @@ class ApiParse extends ApiBase {
                                        'headhtml',
                                        'iwlinks',
                                        'wikitext',
+                                       'properties',
                                )
                        ),
                        'pst' => false,
@@ -553,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',
@@ -569,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 1332f26..45d19d0 100644 (file)
@@ -80,6 +80,16 @@ class ApiPatrol extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'rcid' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Patrol a page or revision';
        }
index ec7b560..0fcaf42 100644 (file)
@@ -37,19 +37,8 @@ class ApiProtect extends ApiBase {
                global $wgRestrictionLevels;
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $titleObj = Title::newFromText( $params['title'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                       }
-               } elseif ( isset( $params['pageid'] ) ) {
-                       $titleObj = Title::newFromID( $params['pageid'] );
-                       if ( !$titleObj ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       }
-               }
+               $pageObj = $this->getTitleOrPageId( $params, 'fromdbmaster' );
+               $titleObj = $pageObj->getTitle();
 
                $errors = $titleObj->getUserPermissionsErrors( 'protect', $this->getUser() );
                if ( $errors ) {
@@ -67,7 +56,7 @@ class ApiProtect extends ApiBase {
                }
 
                $restrictionTypes = $titleObj->getRestrictionTypes();
-               $dbr = wfGetDB( DB_SLAVE );
+               $db = $this->getDB();
 
                $protections = array();
                $expiryarray = array();
@@ -91,7 +80,7 @@ class ApiProtect extends ApiBase {
                        }
 
                        if ( in_array( $expiry[$i], array( 'infinite', 'indefinite', 'never' ) ) ) {
-                               $expiryarray[$p[0]] = $dbr->getInfinity();
+                               $expiryarray[$p[0]] = $db->getInfinity();
                        } else {
                                $exp = strtotime( $expiry[$i] );
                                if ( $exp < 0 || !$exp ) {
@@ -105,7 +94,7 @@ class ApiProtect extends ApiBase {
                                $expiryarray[$p[0]] = $exp;
                        }
                        $resultProtections[] = array( $p[0] => $protections[$p[0]],
-                                       'expiry' => ( $expiryarray[$p[0]] == $dbr->getInfinity() ?
+                                       'expiry' => ( $expiryarray[$p[0]] == $db->getInfinity() ?
                                                                'infinite' :
                                                                wfTimestamp( TS_ISO_8601, $expiryarray[$p[0]] ) ) );
                }
@@ -115,7 +104,6 @@ class ApiProtect extends ApiBase {
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj );
 
-               $pageObj = WikiPage::factory( $titleObj );
                $status = $pageObj->doUpdateRestrictions( $protections, $expiryarray, $cascade, $params['reason'], $this->getUser() );
 
                if ( !$status->isOK() ) {
@@ -196,16 +184,24 @@ class ApiProtect extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'title' => 'string',
+                               'reason' => 'string',
+                               'cascade' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Change the protection level of a page';
        }
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        array(
-                               array( 'invalidtitle', 'title' ),
-                               array( 'nosuchpageid', 'pageid' ),
                                array( 'toofewexpiries', 'noofexpiries', 'noofprotections' ),
                                array( 'create-titleexists' ),
                                array( 'missingtitle-createonly' ),
index 9e9320f..d9acba4 100644 (file)
@@ -88,13 +88,13 @@ class ApiPurge extends ApiBase {
                                if ( !$user->pingLimiter() ) {
                                        global $wgParser, $wgEnableParserCache;
 
-                                       $popts = ParserOptions::newFromContext( $this->getContext() );
+                                       $popts = $page->makeParserOptions( 'canonical' );
                                        $p_result = $wgParser->parse( $page->getRawText(), $title, $popts,
                                                true, true, $page->getLatest() );
 
                                        # Update the links tables
-                                       $u = new LinksUpdate( $title, $p_result );
-                                       $u->doUpdate();
+                                       $updates = $p_result->getSecondaryDataUpdates( $title );
+                                       DataUpdate::runUpdates( $updates );
 
                                        $r['linkupdate'] = '';
 
@@ -103,7 +103,8 @@ class ApiPurge extends ApiBase {
                                                $pcache->save( $p_result, $page, $popts );
                                        }
                                } else {
-                                       $this->setWarning( $this->parseMsg( array( 'actionthrottledtext' ) ) );
+                                       $error = $this->parseMsg( array( 'actionthrottledtext' ) );
+                                       $this->setWarning( $error['info'] );
                                        $forceLinkUpdate = false;
                                }
                        }
@@ -133,6 +134,34 @@ class ApiPurge extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_LIST => true,
+                       '' => array(
+                               'ns' => array(
+                                       ApiBase::PROP_TYPE => 'namespace',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'title' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'pageid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'revid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'invalid' => 'boolean',
+                               'missing' => 'boolean',
+                               'purged' => 'boolean',
+                               'linkupdate' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array( 'Purge the cache for the given titles.',
                        'Requires a POST request if the user is not logged in.'
index c172d24..866b71c 100644 (file)
@@ -64,8 +64,8 @@ class ApiQuery extends ApiBase {
        );
 
        private $mQueryListModules = array(
-               'allimages' => 'ApiQueryAllimages',
-               'allpages' => 'ApiQueryAllpages',
+               'allimages' => 'ApiQueryAllImages',
+               'allpages' => 'ApiQueryAllPages',
                'alllinks' => 'ApiQueryAllLinks',
                'allcategories' => 'ApiQueryAllCategories',
                'allusers' => 'ApiQueryAllUsers',
@@ -95,7 +95,7 @@ class ApiQuery extends ApiBase {
        private $mQueryMetaModules = array(
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
-               'allmessages' => 'ApiQueryAllmessages',
+               'allmessages' => 'ApiQueryAllMessages',
        );
 
        private $mSlaveDB = null;
index 78367a4..60b57bf 100644 (file)
@@ -65,14 +65,20 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
 
                $min = $params['min'];
                $max = $params['max'];
-               $this->addWhereRange( 'cat_pages', $dir, $min, $max );
+               if ( $dir == 'newer' ) {
+                       $this->addWhereRange( 'cat_pages', 'newer', $min, $max );
+               } else {
+                       $this->addWhereRange( 'cat_pages', 'older', $max, $min);
+               }
+    
 
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
                }
 
                $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'] ) );
@@ -106,7 +112,7 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                        // Normalize titles
                        $titleObj = Title::makeTitle( NS_CATEGORY, $row->cat_title );
                        if ( !is_null( $resultPageSet ) ) {
-                               $pages[] = $titleObj->getPrefixedText();
+                               $pages[] = $titleObj;
                        } else {
                                $item = array();
                                $result->setContent( $item, $titleObj->getText() );
@@ -186,6 +192,23 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               '*' => 'string'
+                       ),
+                       'size' => array(
+                               'size' => 'integer',
+                               'pages' => 'integer',
+                               'files' => 'integer',
+                               'subcats' => 'integer'
+                       ),
+                       'hidden' => array(
+                               'hidden' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Enumerate all categories';
        }
diff --git a/includes/api/ApiQueryAllImages.php b/includes/api/ApiQueryAllImages.php
new file mode 100644 (file)
index 0000000..4ab4d72
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+
+/**
+ * API for MediaWiki 1.12+
+ *
+ * Created on Mar 16, 2008
+ *
+ * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
+ * based on ApiQueryAllPages.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
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllImages extends ApiQueryGeneratorBase {
+
+       protected $mRepo;
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ai' );
+               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
+       }
+
+       /**
+        * Override parent method to make sure to make sure the repo's DB is used
+        * which may not necesarilly be the same as the local DB.
+        *
+        * TODO: allow querying non-local repos.
+        * @return DatabaseBase
+        */
+       protected function getDB() {
+               return $this->mRepo->getSlaveDB();
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $repo = $this->mRepo;
+               if ( !$repo instanceof LocalRepo ) {
+                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
+               }
+
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Image filters
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'img_name', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) )
+                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
+               }
+
+               $sha1 = false;
+               if ( isset( $params['sha1'] ) ) {
+                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
+                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
+                       }
+                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
+               } elseif ( isset( $params['sha1base36'] ) ) {
+                       $sha1 = $params['sha1base36'];
+                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
+                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
+                       }
+               }
+               if ( $sha1 ) {
+                       $this->addWhereFld( 'img_sha1', $sha1 );
+               }
+
+               if ( !is_null( $params['mime'] ) ) {
+                       global $wgMiserMode;
+                       if ( $wgMiserMode  ) {
+                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
+                       }
+
+                       list( $major, $minor ) = File::splitMime( $params['mime'] );
+
+                       $this->addWhereFld( 'img_major_mime', $major );
+                       $this->addWhereFld( 'img_minor_mime', $minor );
+               }
+
+               $this->addTables( 'image' );
+
+               $prop = array_flip( $params['prop'] );
+               $this->addFields( LocalFile::selectFields() );
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
+               $this->addOption( 'ORDER BY', 'img_name' . $sort );
+
+               $res = $this->select( __METHOD__ );
+
+               $titles = array();
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $file = $repo->newFileFromRow( $row );
+                               $info = array_merge( array( 'name' => $row->img_name ),
+                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
+                               self::addTitleInfo( $info, $file->getTitle() );
+
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
+                                       break;
+                               }
+                       } else {
+                               $titles[] = Title::makeTitle( NS_FILE, $row->img_name );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
+               } else {
+                       $resultPageSet->populateFromTitles( $titles );
+               }
+       }
+
+       public function getAllowedParams() {
+               return array (
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'sha1' => null,
+                       'sha1base36' => null,
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_DFLT => 'timestamp|url',
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'mime' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'from' => 'The image title to start enumerating from',
+                       'to' => 'The image title to stop enumerating at',
+                       'prefix' => 'Search for all image titles that begin with this value',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to images with at least this many bytes',
+                       'maxsize' => 'Limit to images with at most this many bytes',
+                       'limit' => 'How many images in total to return',
+                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
+                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
+                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
+               );
+       }
+
+       private $propertyFilter = array( 'archivename' );
+
+       public function getResultProperties() {
+               return array_merge(
+                       array(
+                               '' => array(
+                                       'name' => 'string',
+                                       'ns' => 'namespace',
+                                       'title' => 'string'
+                               )
+                       ),
+                       ApiQueryImageInfo::getResultPropertiesFiltered( $this->propertyFilter )
+               );
+       }
+
+       public function getDescription() {
+               return 'Enumerate all images sequentially';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
+                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
+                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
+                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
+                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allimages&aifrom=B' => array(
+                               'Simple Use',
+                               'Show a list of images starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
+                               'Using as Generator',
+                               'Show info about 4 images starting at the letter "T"',
+                       ),
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allimages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index 903f144..6b8fe57 100644 (file)
@@ -76,16 +76,16 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                        $this->dieUsage( 'alcontinue and alfrom cannot be used together', 'params' );
                }
                if ( !is_null( $params['continue'] ) ) {
-                       $arr = explode( '|', $params['continue'] );
-                       if ( count( $arr ) != 2 ) {
+                       $continueArr = explode( '|', $params['continue'] );
+                       if ( count( $continueArr ) != 2 ) {
                                $this->dieUsage( 'Invalid continue parameter', 'badcontinue' );
                        }
-                       $from = $this->getDB()->strencode( $this->titleToKey( $arr[0] ) );
-                       $id = intval( $arr[1] );
+                       $continueTitle = $db->addQuotes( $this->titleToKey( $continueArr[0] ) );
+                       $continueFrom = intval( $continueArr[1] );
                        $this->addWhere(
-                               "pl_title > '$from' OR " .
-                               "(pl_title = '$from' AND " .
-                               "pl_from > $id)"
+                               "pl_title > $continueTitle OR " .
+                               "(pl_title = $continueTitle AND " .
+                               "pl_from > $continueFrom)"
                        );
                }
 
@@ -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__ );
@@ -202,6 +205,18 @@ class ApiQueryAllLinks extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       'ids' => array(
+                               'fromid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Enumerate all links that point to a given namespace';
        }
diff --git a/includes/api/ApiQueryAllMessages.php b/includes/api/ApiQueryAllMessages.php
new file mode 100644 (file)
index 0000000..ac000bf
--- /dev/null
@@ -0,0 +1,298 @@
+<?php
+/**
+ *
+ *
+ * Created on Dec 1, 2007
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * A query action to return messages from site message cache
+ *
+ * @ingroup API
+ */
+class ApiQueryAllMessages extends ApiQueryBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'am' );
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+
+               if ( is_null( $params['lang'] ) ) {
+                       global $wgLang;
+                       $langObj = $wgLang;
+               } else {
+                       $langObj = Language::factory( $params['lang'] );
+               }
+
+               if ( $params['enableparser'] ) {
+                       if ( !is_null( $params['title'] ) ) {
+                               $title = Title::newFromText( $params['title'] );
+                               if ( !$title ) {
+                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
+                               }
+                       } else {
+                               $title = Title::newFromText( 'API' );
+                       }
+               }
+
+               $prop = array_flip( (array)$params['prop'] );
+
+               // Determine which messages should we print
+               if ( in_array( '*', $params['messages'] ) ) {
+                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
+                       if ( $params['includelocal'] ) {
+                               global $wgLanguageCode;
+                               $message_names = array_unique( array_merge(
+                                       $message_names,
+                                       // Pass in the content language code so we get local messages that have a
+                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
+                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
+                                       // just a stupid case.
+                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
+                               ) );
+                       }
+                       sort( $message_names );
+                       $messages_target = $message_names;
+               } else {
+                       $messages_target = $params['messages'];
+               }
+
+               // Filter messages that have the specified prefix
+               // Because we sorted the message array earlier, they will appear in a clump:
+               if ( isset( $params['prefix'] ) ) {
+                       $skip = false;
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // === 0: must be at beginning of string (position 0)
+                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
+                                       if( !$skip ) {
+                                               $skip = true;
+                                       }
+                                       $messages_filtered[] = $message;
+                               } elseif ( $skip ) {
+                                       break;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Filter messages that contain specified string
+               if ( isset( $params['filter'] ) ) {
+                       $messages_filtered = array();
+                       foreach ( $messages_target as $message ) {
+                               // !== is used because filter can be at the beginning of the string
+                               if ( strpos( $message, $params['filter'] ) !== false ) {
+                                       $messages_filtered[] = $message;
+                               }
+                       }
+                       $messages_target = $messages_filtered;
+               }
+
+               // Whether we have any sort of message customisation filtering
+               $customiseFilterEnabled = $params['customised'] !== 'all';
+               if ( $customiseFilterEnabled ) {
+                       global $wgContLang;
+                       $lang = $langObj->getCode();
+
+                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
+                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
+
+                       $customised = $params['customised'] === 'modified';
+               }
+
+               // Get all requested messages and print the result
+               $skip = !is_null( $params['from'] );
+               $useto = !is_null( $params['to'] );
+               $result = $this->getResult();
+               foreach ( $messages_target as $message ) {
+                       // Skip all messages up to $params['from']
+                       if ( $skip && $message === $params['from'] ) {
+                               $skip = false;
+                       }
+
+                       if ( $useto && $message > $params['to'] ) {
+                               break;
+                       }
+
+                       if ( !$skip ) {
+                               $a = array( 'name' => $message );
+                               $args = array();
+                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
+                                       $args = $params['args'];
+                               }
+
+                               if ( $customiseFilterEnabled ) {
+                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
+                                       if ( $customised === $messageIsCustomised ) {
+                                               if ( $customised ) {
+                                                       $a['customised'] = '';
+                                               }
+                                       } else {
+                                               continue;
+                                       }
+                               }
+
+                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
+
+                               if ( !$msg->exists() ) {
+                                       $a['missing'] = '';
+                               } else {
+                                       // Check if the parser is enabled:
+                                       if ( $params['enableparser'] ) {
+                                               $msgString = $msg->title( $title )->text();
+                                       } else {
+                                               $msgString = $msg->plain();
+                                       }
+                                       if ( !$params['nocontent'] ) {
+                                               ApiResult::setContent( $a, $msgString );
+                                       }
+                                       if ( isset( $prop['default'] ) ) {
+                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
+                                               if ( !$default->exists() ) {
+                                                       $a['defaultmissing'] = '';
+                                               } elseif ( $default->plain() != $msgString ) {
+                                                       $a['default'] = $default->plain();
+                                               }
+                                       }
+                               }
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $message );
+                                       break;
+                               }
+                       }
+               }
+               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
+       }
+
+       public function getCacheMode( $params ) {
+               if ( is_null( $params['lang'] ) ) {
+                       // Language not specified, will be fetched from preferences
+                       return 'anon-public-user-private';
+               } elseif ( $params['enableparser'] ) {
+                       // User-specific parser options will be used
+                       return 'anon-public-user-private';
+               } else {
+                       // OK to cache
+                       return 'public';
+               }
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'messages' => array(
+                               ApiBase::PARAM_DFLT => '*',
+                               ApiBase::PARAM_ISMULTI => true,
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'default'
+                               )
+                       ),
+                       'enableparser' => false,
+                       'nocontent' => false,
+                       'includelocal' => false,
+                       'args' => array(
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
+                       ),
+                       'filter' => array(),
+                       'customised' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'modified',
+                                       'unmodified'
+                               )
+                       ),
+                       'lang' => null,
+                       'from' => null,
+                       'to' => null,
+                       'title' => null,
+                       'prefix' => null,
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'messages' => 'Which messages to output. "*" (default) means all messages',
+                       'prop' => 'Which properties to get',
+                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
+                                                       'Will substitute magic words, handle templates etc.' ),
+                       'nocontent' => 'If set, do not include the content of the messages in the output.',
+                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
+                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
+                       ),
+                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
+                       'args' => 'Arguments to be substituted into message',
+                       'prefix' => 'Return messages with this prefix',
+                       'filter' => 'Return only messages with names that contain this string',
+                       'customised' => 'Return only messages in this customisation state',
+                       'lang' => 'Return messages in this language',
+                       'from' => 'Return messages starting at this message',
+                       'to' => 'Return messages ending at this message',
+               );
+       }
+
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'name' => 'string',
+                               'customised' => 'boolean',
+                               'missing' => 'boolean',
+                               '*' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'default' => array(
+                               'defaultmissing' => 'boolean',
+                               'default' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
+       public function getDescription() {
+               return 'Return messages from this site';
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
+                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
diff --git a/includes/api/ApiQueryAllPages.php b/includes/api/ApiQueryAllPages.php
new file mode 100644 (file)
index 0000000..cfc22ff
--- /dev/null
@@ -0,0 +1,343 @@
+<?php
+/**
+ *
+ *
+ * Created on Sep 25, 2006
+ *
+ * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
+ *
+ * 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
+ */
+
+/**
+ * Query module to enumerate all available pages.
+ *
+ * @ingroup API
+ */
+class ApiQueryAllPages extends ApiQueryGeneratorBase {
+
+       public function __construct( $query, $moduleName ) {
+               parent::__construct( $query, $moduleName, 'ap' );
+       }
+
+       public function execute() {
+               $this->run();
+       }
+
+       public function getCacheMode( $params ) {
+               return 'public';
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       public function executeGenerator( $resultPageSet ) {
+               if ( $resultPageSet->isResolvingRedirects() ) {
+                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
+               }
+
+               $this->run( $resultPageSet );
+       }
+
+       /**
+        * @param $resultPageSet ApiPageSet
+        * @return void
+        */
+       private function run( $resultPageSet = null ) {
+               $db = $this->getDB();
+
+               $params = $this->extractRequestParams();
+
+               // Page filters
+               $this->addTables( 'page' );
+
+               if ( $params['filterredir'] == 'redirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 1 );
+               } elseif ( $params['filterredir'] == 'nonredirects' ) {
+                       $this->addWhereFld( 'page_is_redirect', 0 );
+               }
+
+               $this->addWhereFld( 'page_namespace', $params['namespace'] );
+               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
+               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+               $this->addWhereRange( 'page_title', $dir, $from, $to );
+
+               if ( isset( $params['prefix'] ) ) {
+                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $selectFields = array(
+                               'page_namespace',
+                               'page_title',
+                               'page_id'
+                       );
+               } else {
+                       $selectFields = $resultPageSet->getPageTableFields();
+               }
+
+               $this->addFields( $selectFields );
+               $forceNameTitleIndex = true;
+               if ( isset( $params['minsize'] ) ) {
+                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( isset( $params['maxsize'] ) ) {
+                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
+                       $forceNameTitleIndex = false;
+               }
+
+               // Page protection filtering
+               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
+                       $this->addTables( 'page_restrictions' );
+                       $this->addWhere( 'page_id=pr_page' );
+                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
+
+                       if ( count( $params['prtype'] ) ) {
+                               $this->addWhereFld( 'pr_type', $params['prtype'] );
+
+                               if ( isset( $params['prlevel'] ) ) {
+                                       // Remove the empty string and '*' from the prlevel array
+                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
+
+                                       if ( count( $prlevel ) ) {
+                                               $this->addWhereFld( 'pr_level', $prlevel );
+                                       }
+                               }
+                               if ( $params['prfiltercascade'] == 'cascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 1 );
+                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
+                                       $this->addWhereFld( 'pr_cascade', 0 );
+                               }
+
+                               $this->addOption( 'DISTINCT' );
+                       }
+                       $forceNameTitleIndex = false;
+
+                       if ( $params['prexpiry'] == 'indefinite' ) {
+                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
+                       } elseif ( $params['prexpiry'] == 'definite' ) {
+                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
+                       }
+
+               } elseif ( isset( $params['prlevel'] ) ) {
+                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
+               }
+
+               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
+                       $this->addWhere( 'll_from IS NULL' );
+                       $forceNameTitleIndex = false;
+               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
+                       $this->addTables( 'langlinks' );
+                       $this->addWhere( 'page_id=ll_from' );
+                       $this->addOption( 'STRAIGHT_JOIN' );
+                       // We have to GROUP BY all selected fields to stop
+                       // PostgreSQL from whining
+                       $this->addOption( 'GROUP BY', $selectFields );
+                       $forceNameTitleIndex = false;
+               }
+
+               if ( $forceNameTitleIndex ) {
+                       $this->addOption( 'USE INDEX', 'name_title' );
+               }
+
+               $limit = $params['limit'];
+               $this->addOption( 'LIMIT', $limit + 1 );
+               $res = $this->select( __METHOD__ );
+
+               $count = 0;
+               $result = $this->getResult();
+               foreach ( $res as $row ) {
+                       if ( ++ $count > $limit ) {
+                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
+                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
+                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                               break;
+                       }
+
+                       if ( is_null( $resultPageSet ) ) {
+                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                               $vals = array(
+                                       'pageid' => intval( $row->page_id ),
+                                       'ns' => intval( $title->getNamespace() ),
+                                       'title' => $title->getPrefixedText()
+                               );
+                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
+                               if ( !$fit ) {
+                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
+                                       break;
+                               }
+                       } else {
+                               $resultPageSet->processDbRow( $row );
+                       }
+               }
+
+               if ( is_null( $resultPageSet ) ) {
+                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
+               }
+       }
+
+       public function getAllowedParams() {
+               global $wgRestrictionLevels;
+
+               return array(
+                       'from' => null,
+                       'to' => null,
+                       'prefix' => null,
+                       'namespace' => array(
+                               ApiBase::PARAM_DFLT => 0,
+                               ApiBase::PARAM_TYPE => 'namespace',
+                       ),
+                       'filterredir' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'redirects',
+                                       'nonredirects'
+                               )
+                       ),
+                       'minsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'maxsize' => array(
+                               ApiBase::PARAM_TYPE => 'integer',
+                       ),
+                       'prtype' => array(
+                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prlevel' => array(
+                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
+                       'prfiltercascade' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'cascading',
+                                       'noncascading',
+                                       'all'
+                               ),
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 10,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       'ascending',
+                                       'descending'
+                               )
+                       ),
+                       'filterlanglinks' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'withlanglinks',
+                                       'withoutlanglinks',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+                       'prexpiry' => array(
+                               ApiBase::PARAM_TYPE => array(
+                                       'indefinite',
+                                       'definite',
+                                       'all'
+                               ),
+                               ApiBase::PARAM_DFLT => 'all'
+                       ),
+               );
+       }
+
+       public function getParamDescription() {
+               $p = $this->getModulePrefix();
+               return array(
+                       'from' => 'The page title to start enumerating from',
+                       'to' => 'The page title to stop enumerating at',
+                       'prefix' => 'Search for all page titles that begin with this value',
+                       'namespace' => 'The namespace to enumerate',
+                       'filterredir' => 'Which pages to list',
+                       'dir' => 'The direction in which to list',
+                       'minsize' => 'Limit to pages with at least this many bytes',
+                       'maxsize' => 'Limit to pages with at most this many bytes',
+                       'prtype' => 'Limit to protected pages only',
+                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
+                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
+                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
+                       'limit' => 'How many total pages to return.',
+                       'prexpiry' => array(
+                               'Which protection expiry to filter the page on',
+                               ' indefinite - Get only pages with indefinite protection expiry',
+                               ' definite - Get only pages with a definite (specific) protection expiry',
+                               ' all - Get pages with any protections expiry'
+                       ),
+               );
+       }
+
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'pageid' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
+       public function getDescription() {
+               return 'Enumerate all pages sequentially in a given namespace';
+       }
+
+       public function getPossibleErrors() {
+               return array_merge( parent::getPossibleErrors(), array(
+                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
+                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
+               ) );
+       }
+
+       public function getExamples() {
+               return array(
+                       'api.php?action=query&list=allpages&apfrom=B' => array(
+                               'Simple Use',
+                               'Show a list of pages starting at the letter "B"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
+                               'Using as Generator',
+                               'Show info about 4 pages starting at the letter "T"',
+                       ),
+                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
+                               'Show content of first 2 non-redirect pages begining at "Re"',
+                       )
+               );
+       }
+
+       public function getHelpUrls() {
+               return 'https://www.mediawiki.org/wiki/API:Allpages';
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index ac112ef..dda8c72 100644 (file)
@@ -34,6 +34,16 @@ class ApiQueryAllUsers extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'au' );
        }
 
+       /**
+        * This function converts the user name to a canonical form
+        * which is stored in the database.
+        * @param String $name
+        * @return String
+        */
+       private function getCanonicalUserName( $name ) {
+               return str_replace( '_', ' ', $name );
+       }
+
        public function execute() {
                $db = $this->getDB();
                $params = $this->extractRequestParams();
@@ -57,8 +67,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                $useIndex = true;
 
                $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = is_null( $params['from'] ) ? null : $this->keyToTitle( $params['from'] );
-               $to = is_null( $params['to'] ) ? null : $this->keyToTitle( $params['to'] );
+               $from = is_null( $params['from'] ) ? null : $this->getCanonicalUserName( $params['from'] );
+               $to = is_null( $params['to'] ) ? null : $this->getCanonicalUserName( $params['to'] );
 
                # MySQL doesn't seem to use 'equality propagation' here, so like the
                # ActiveUsers special page, we have to use rc_user_text for some cases.
@@ -68,7 +78,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                if ( !is_null( $params['prefix'] ) ) {
                        $this->addWhere( $userFieldToSort .
-                               $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) );
+                               $db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
                }
 
                if ( !is_null( $params['rights'] ) ) {
@@ -144,9 +154,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
 
                        $this->addFields( 'COUNT(*) AS recentedits' );
 
-                       $this->addWhere( "rc_log_type IS NULL OR rc_log_type != 'newusers'" );
+                       $this->addWhere( 'rc_log_type IS NULL OR rc_log_type != ' . $db->addQuotes( 'newusers' ) );
                        $timestamp = $db->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 );
-                       $this->addWhere( "rc_timestamp >= {$db->addQuotes( $timestamp )}" );
+                       $this->addWhere( 'rc_timestamp >= ' . $db->addQuotes( $timestamp ) );
 
                        $this->addOption( 'GROUP BY', $userFieldToSort );
                }
@@ -190,15 +200,14 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        $lastUserData = null;
 
                                        if ( !$fit ) {
-                                               $this->setContinueEnumParameter( 'from',
-                                                               $this->keyToTitle( $lastUserData['name'] ) );
+                                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                                                break;
                                        }
                                }
 
                                if ( $count > $limit ) {
                                        // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->user_name ) );
+                                       $this->setContinueEnumParameter( 'from', $row->user_name );
                                        break;
                                }
 
@@ -209,7 +218,9 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'name' => $lastUser,
                                );
                                if ( $fld_blockinfo && !is_null( $row->ipb_by_text ) ) {
+                                       $lastUserData['blockid'] = $row->ipb_id;
                                        $lastUserData['blockedby'] = $row->ipb_by_text;
+                                       $lastUserData['blockedbyid'] = $row->ipb_by;
                                        $lastUserData['blockreason'] = $row->ipb_reason;
                                        $lastUserData['blockexpiry'] = $row->ipb_expiry;
                                }
@@ -235,17 +246,23 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' );
                        }
 
-                       $lastUserObj = User::newFromName( $lastUser );
+                       $lastUserObj = User::newFromId( $row->user_id );
 
                        // Add user's group info
                        if ( $fld_groups ) {
-                               if ( !isset( $lastUserData['groups'] ) && $lastUserObj ) {
-                                       $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                               if ( !isset( $lastUserData['groups'] ) ) {
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['groups'] = ApiQueryUsers::getAutoGroups( $lastUserObj );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['groups'] = array();
+                                       }
                                }
 
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['groups'][] = $row->ug_group2;
                                }
+
                                $result->setIndexedTagName( $lastUserData['groups'], 'g' );
                        }
 
@@ -254,13 +271,20 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                $result->setIndexedTagName( $lastUserData['implicitgroups'], 'g' );
                        }
                        if ( $fld_rights ) {
-                               if ( !isset( $lastUserData['rights'] ) && $lastUserObj ) {
-                                       $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                               if ( !isset( $lastUserData['rights'] ) ) {
+                                       if ( $lastUserObj ) {
+                                               $lastUserData['rights'] =  User::getGroupPermissions( $lastUserObj->getAutomaticGroups() );
+                                       } else {
+                                               // This should not normally happen
+                                               $lastUserData['rights'] = array();
+                                       }
                                }
+
                                if ( !is_null( $row->ug_group2 ) ) {
                                        $lastUserData['rights'] = array_unique( array_merge( $lastUserData['rights'],
                                                User::getGroupPermissions( array( $row->ug_group2 ) ) ) );
                                }
+
                                $result->setIndexedTagName( $lastUserData['rights'], 'r' );
                        }
                }
@@ -269,8 +293,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fit = $result->addValue( array( 'query', $this->getModuleName() ),
                                null, $lastUserData );
                        if ( !$fit ) {
-                               $this->setContinueEnumParameter( 'from',
-                                       $this->keyToTitle( $lastUserData['name'] ) );
+                               $this->setContinueEnumParameter( 'from', $lastUserData['name'] );
                        }
                }
 
@@ -338,7 +361,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        'dir' => 'Direction to sort in',
                        'group' => 'Limit users to given group name(s)',
                        'excludegroup' => 'Exclude users in given group name(s)',
-                       'rights' => 'Limit users to given right(s)',
+                       'rights' => 'Limit users to given right(s) (does not include rights granted by implicit or auto-promoted groups like *, user, or autoconfirmed)',
                        'prop' => array(
                                'What pieces of information to include.',
                                ' blockinfo      - Adds the information about a current block on the user',
@@ -354,6 +377,48 @@ class ApiQueryAllUsers extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'userid' => 'integer',
+                               'name' => 'string',
+                               'recenteditcount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'blockinfo' => array(
+                               'blockid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedby' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedbyid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedreason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedexpiry' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'hidden' => 'boolean'
+                       ),
+                       'editcount' => array(
+                               'editcount' => 'integer'
+                       ),
+                       'registration' => array(
+                               'registration' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Enumerate all registered users';
        }
diff --git a/includes/api/ApiQueryAllimages.php b/includes/api/ApiQueryAllimages.php
deleted file mode 100644 (file)
index ca344f7..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-<?php
-
-/**
- * API for MediaWiki 1.12+
- *
- * Created on Mar 16, 2008
- *
- * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.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
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllimages extends ApiQueryGeneratorBase {
-
-       protected $mRepo;
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ai' );
-               $this->mRepo = RepoGroup::singleton()->getLocalRepo();
-       }
-
-       /**
-        * Override parent method to make sure to make sure the repo's DB is used
-        * which may not necesarilly be the same as the local DB.
-        *
-        * TODO: allow querying non-local repos.
-        * @return DatabaseBase
-        */
-       protected function getDB() {
-               return $this->mRepo->getSlaveDB();
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $repo = $this->mRepo;
-               if ( !$repo instanceof LocalRepo ) {
-                       $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
-               }
-
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Image filters
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'img_name', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) )
-                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'img_size<=' . intval( $params['maxsize'] ) );
-               }
-
-               $sha1 = false;
-               if ( isset( $params['sha1'] ) ) {
-                       if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
-                               $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
-                       }
-                       $sha1 = wfBaseConvert( $params['sha1'], 16, 36, 31 );
-               } elseif ( isset( $params['sha1base36'] ) ) {
-                       $sha1 = $params['sha1base36'];
-                       if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
-                               $this->dieUsage( 'The SHA1Base36 hash provided is not valid', 'invalidsha1base36hash' );
-                       }
-               }
-               if ( $sha1 ) {
-                       $this->addWhereFld( 'img_sha1', $sha1 );
-               }
-
-               if ( !is_null( $params['mime'] ) ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode  ) {
-                               $this->dieUsage( 'MIME search disabled in Miser Mode', 'mimesearchdisabled' );
-                       }
-
-                       list( $major, $minor ) = File::splitMime( $params['mime'] );
-
-                       $this->addWhereFld( 'img_major_mime', $major );
-                       $this->addWhereFld( 'img_minor_mime', $minor );
-               }
-
-               $this->addTables( 'image' );
-
-               $prop = array_flip( $params['prop'] );
-               $this->addFields( LocalFile::selectFields() );
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $this->addOption( 'ORDER BY', 'img_name' .
-                                               ( $params['dir'] == 'descending' ? ' DESC' : '' ) );
-
-               $res = $this->select( __METHOD__ );
-
-               $titles = array();
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $file = $repo->newFileFromRow( $row );
-                               $info = array_merge( array( 'name' => $row->img_name ),
-                                       ApiQueryImageInfo::getInfo( $file, $prop, $result ) );
-                               self::addTitleInfo( $info, $file->getTitle() );
-
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->img_name ) );
-                                       break;
-                               }
-                       } else {
-                               $titles[] = Title::makeTitle( NS_IMAGE, $row->img_name );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'img' );
-               } else {
-                       $resultPageSet->populateFromTitles( $titles );
-               }
-       }
-
-       public function getAllowedParams() {
-               return array (
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'sha1' => null,
-                       'sha1base36' => null,
-                       'prop' => array(
-                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
-                               ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'mime' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'from' => 'The image title to start enumerating from',
-                       'to' => 'The image title to stop enumerating at',
-                       'prefix' => 'Search for all image titles that begin with this value',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to images with at least this many bytes',
-                       'maxsize' => 'Limit to images with at most this many bytes',
-                       'limit' => 'How many images in total to return',
-                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
-                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
-                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
-                       'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
-               );
-       }
-
-       private $propertyFilter = array( 'archivename' );
-
-       public function getDescription() {
-               return 'Enumerate all images sequentially';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
-                       array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
-                       array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
-                       array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
-                       array( 'code' => 'invalidsha1base36hash', 'info' => 'The SHA1Base36 hash provided is not valid' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allimages&aifrom=B' => array(
-                               'Simple Use',
-                               'Show a list of images starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
-                               'Using as Generator',
-                               'Show info about 4 images starting at the letter "T"',
-                       ),
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allimages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllmessages.php b/includes/api/ApiQueryAllmessages.php
deleted file mode 100644 (file)
index 4477492..0000000
+++ /dev/null
@@ -1,277 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Dec 1, 2007
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * A query action to return messages from site message cache
- *
- * @ingroup API
- */
-class ApiQueryAllmessages extends ApiQueryBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'am' );
-       }
-
-       public function execute() {
-               $params = $this->extractRequestParams();
-
-               if ( is_null( $params['lang'] ) ) {
-                       global $wgLang;
-                       $langObj = $wgLang;
-               } else {
-                       $langObj = Language::factory( $params['lang'] );
-               }
-
-               if ( $params['enableparser'] ) {
-                       if ( !is_null( $params['title'] ) ) {
-                               $title = Title::newFromText( $params['title'] );
-                               if ( !$title ) {
-                                       $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
-                               }
-                       } else {
-                               $title = Title::newFromText( 'API' );
-                       }
-               }
-
-               $prop = array_flip( (array)$params['prop'] );
-
-               // Determine which messages should we print
-               if ( in_array( '*', $params['messages'] ) ) {
-                       $message_names = Language::getMessageKeysFor( $langObj->getCode() );
-                       if ( $params['includelocal'] ) {
-                               global $wgLanguageCode;
-                               $message_names = array_unique( array_merge(
-                                       $message_names,
-                                       // Pass in the content language code so we get local messages that have a
-                                       // MediaWiki:msgkey page. We might theoretically miss messages that have no
-                                       // MediaWiki:msgkey page but do have a MediaWiki:msgkey/lang page, but that's
-                                       // just a stupid case.
-                                       MessageCache::singleton()->getAllMessageKeys( $wgLanguageCode )
-                               ) );
-                       }
-                       sort( $message_names );
-                       $messages_target = $message_names;
-               } else {
-                       $messages_target = $params['messages'];
-               }
-
-               // Filter messages that have the specified prefix
-               // Because we sorted the message array earlier, they will appear in a clump:
-               if ( isset( $params['prefix'] ) ) {
-                       $skip = false;
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // === 0: must be at beginning of string (position 0)
-                               if ( strpos( $message, $params['prefix'] ) === 0 ) {
-                                       if( !$skip ) {
-                                               $skip = true;
-                                       }
-                                       $messages_filtered[] = $message;
-                               } elseif ( $skip ) {
-                                       break;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Filter messages that contain specified string
-               if ( isset( $params['filter'] ) ) {
-                       $messages_filtered = array();
-                       foreach ( $messages_target as $message ) {
-                               // !== is used because filter can be at the beginning of the string
-                               if ( strpos( $message, $params['filter'] ) !== false ) {
-                                       $messages_filtered[] = $message;
-                               }
-                       }
-                       $messages_target = $messages_filtered;
-               }
-
-               // Whether we have any sort of message customisation filtering
-               $customiseFilterEnabled = $params['customised'] !== 'all';
-               if ( $customiseFilterEnabled ) {
-                       global $wgContLang;
-                       $lang = $langObj->getCode();
-
-                       $customisedMessages = AllmessagesTablePager::getCustomisedStatuses(
-                               array_map( array( $langObj, 'ucfirst'), $messages_target ), $lang, $lang != $wgContLang->getCode() );
-
-                       $customised = $params['customised'] === 'modified';
-               }
-
-               // Get all requested messages and print the result
-               $skip = !is_null( $params['from'] );
-               $useto = !is_null( $params['to'] );
-               $result = $this->getResult();
-               foreach ( $messages_target as $message ) {
-                       // Skip all messages up to $params['from']
-                       if ( $skip && $message === $params['from'] ) {
-                               $skip = false;
-                       }
-
-                       if ( $useto && $message > $params['to'] ) {
-                               break;
-                       }
-
-                       if ( !$skip ) {
-                               $a = array( 'name' => $message );
-                               $args = array();
-                               if ( isset( $params['args'] ) && count( $params['args'] ) != 0 ) {
-                                       $args = $params['args'];
-                               }
-
-                               if ( $customiseFilterEnabled ) {
-                                       $messageIsCustomised = isset( $customisedMessages['pages'][ $langObj->ucfirst( $message ) ] );
-                                       if ( $customised === $messageIsCustomised ) {
-                                               if ( $customised ) {
-                                                       $a['customised'] = '';
-                                               }
-                                       } else {
-                                               continue;
-                                       }
-                               }
-
-                               $msg = wfMessage( $message, $args )->inLanguage( $langObj );
-
-                               if ( !$msg->exists() ) {
-                                       $a['missing'] = '';
-                               } else {
-                                       // Check if the parser is enabled:
-                                       if ( $params['enableparser'] ) {
-                                               $msgString = $msg->title( $title )->text();
-                                       } else {
-                                               $msgString = $msg->plain();
-                                       }
-                                       if ( !$params['nocontent'] ) {
-                                               ApiResult::setContent( $a, $msgString );
-                                       }
-                                       if ( isset( $prop['default'] ) ) {
-                                               $default = wfMessage( $message )->inLanguage( $langObj )->useDatabase( false );
-                                               if ( !$default->exists() ) {
-                                                       $a['defaultmissing'] = '';
-                                               } elseif ( $default->plain() != $msgString ) {
-                                                       $a['default'] = $default->plain();
-                                               }
-                                       }
-                               }
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $a );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $message );
-                                       break;
-                               }
-                       }
-               }
-               $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'message' );
-       }
-
-       public function getCacheMode( $params ) {
-               if ( is_null( $params['lang'] ) ) {
-                       // Language not specified, will be fetched from preferences
-                       return 'anon-public-user-private';
-               } elseif ( $params['enableparser'] ) {
-                       // User-specific parser options will be used
-                       return 'anon-public-user-private';
-               } else {
-                       // OK to cache
-                       return 'public';
-               }
-       }
-
-       public function getAllowedParams() {
-               return array(
-                       'messages' => array(
-                               ApiBase::PARAM_DFLT => '*',
-                               ApiBase::PARAM_ISMULTI => true,
-                       ),
-                       'prop' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'default'
-                               )
-                       ),
-                       'enableparser' => false,
-                       'nocontent' => false,
-                       'includelocal' => false,
-                       'args' => array(
-                               ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_ALLOW_DUPLICATES => true,
-                       ),
-                       'filter' => array(),
-                       'customised' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'modified',
-                                       'unmodified'
-                               )
-                       ),
-                       'lang' => null,
-                       'from' => null,
-                       'to' => null,
-                       'title' => null,
-                       'prefix' => null,
-               );
-       }
-
-       public function getParamDescription() {
-               return array(
-                       'messages' => 'Which messages to output. "*" (default) means all messages',
-                       'prop' => 'Which properties to get',
-                       'enableparser' => array( 'Set to enable parser, will preprocess the wikitext of message',
-                                                       'Will substitute magic words, handle templates etc.' ),
-                       'nocontent' => 'If set, do not include the content of the messages in the output.',
-                       'includelocal' => array( "Also include local messages, i.e. messages that don't exist in the software but do exist as a MediaWiki: page.",
-                                                       "This lists all MediaWiki: pages, so it will also list those that aren't 'really' messages such as Common.js",
-                       ),
-                       'title' => 'Page name to use as context when parsing message (for enableparser option)',
-                       'args' => 'Arguments to be substituted into message',
-                       'prefix' => 'Return messages with this prefix',
-                       'filter' => 'Return only messages with names that contain this string',
-                       'customised' => 'Return only messages in this customisation state',
-                       'lang' => 'Return messages in this language',
-                       'from' => 'Return messages starting at this message',
-                       'to' => 'Return messages ending at this message',
-               );
-       }
-
-       public function getDescription() {
-               return 'Return messages from this site';
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&meta=allmessages&amprefix=ipb-',
-                       'api.php?action=query&meta=allmessages&ammessages=august|mainpage&amlang=de',
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Meta#allmessages_.2F_am';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php
deleted file mode 100644 (file)
index e003ee9..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Sep 25, 2006
- *
- * Copyright © 2006 Yuri Astrakhan <Firstname><Lastname>@gmail.com
- *
- * 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
- */
-
-/**
- * Query module to enumerate all available pages.
- *
- * @ingroup API
- */
-class ApiQueryAllpages extends ApiQueryGeneratorBase {
-
-       public function __construct( $query, $moduleName ) {
-               parent::__construct( $query, $moduleName, 'ap' );
-       }
-
-       public function execute() {
-               $this->run();
-       }
-
-       public function getCacheMode( $params ) {
-               return 'public';
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       public function executeGenerator( $resultPageSet ) {
-               if ( $resultPageSet->isResolvingRedirects() ) {
-                       $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' );
-               }
-
-               $this->run( $resultPageSet );
-       }
-
-       /**
-        * @param $resultPageSet ApiPageSet
-        * @return void
-        */
-       private function run( $resultPageSet = null ) {
-               $db = $this->getDB();
-
-               $params = $this->extractRequestParams();
-
-               // Page filters
-               $this->addTables( 'page' );
-
-               if ( $params['filterredir'] == 'redirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 1 );
-               } elseif ( $params['filterredir'] == 'nonredirects' ) {
-                       $this->addWhereFld( 'page_is_redirect', 0 );
-               }
-
-               $this->addWhereFld( 'page_namespace', $params['namespace'] );
-               $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' );
-               $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
-               $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
-               $this->addWhereRange( 'page_title', $dir, $from, $to );
-
-               if ( isset( $params['prefix'] ) ) {
-                       $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $selectFields = array(
-                               'page_namespace',
-                               'page_title',
-                               'page_id'
-                       );
-               } else {
-                       $selectFields = $resultPageSet->getPageTableFields();
-               }
-
-               $this->addFields( $selectFields );
-               $forceNameTitleIndex = true;
-               if ( isset( $params['minsize'] ) ) {
-                       $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( isset( $params['maxsize'] ) ) {
-                       $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               // Page protection filtering
-               if ( count( $params['prtype'] ) || $params['prexpiry'] != 'all' ) {
-                       $this->addTables( 'page_restrictions' );
-                       $this->addWhere( 'page_id=pr_page' );
-                       $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) );
-
-                       if ( count( $params['prtype'] ) ) {
-                               $this->addWhereFld( 'pr_type', $params['prtype'] );
-
-                               if ( isset( $params['prlevel'] ) ) {
-                                       // Remove the empty string and '*' from the prlevel array
-                                       $prlevel = array_diff( $params['prlevel'], array( '', '*' ) );
-
-                                       if ( count( $prlevel ) ) {
-                                               $this->addWhereFld( 'pr_level', $prlevel );
-                                       }
-                               }
-                               if ( $params['prfiltercascade'] == 'cascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 1 );
-                               } elseif ( $params['prfiltercascade'] == 'noncascading' ) {
-                                       $this->addWhereFld( 'pr_cascade', 0 );
-                               }
-
-                               $this->addOption( 'DISTINCT' );
-                       }
-                       $forceNameTitleIndex = false;
-
-                       if ( $params['prexpiry'] == 'indefinite' ) {
-                               $this->addWhere( "pr_expiry = {$db->addQuotes( $db->getInfinity() )} OR pr_expiry IS NULL" );
-                       } elseif ( $params['prexpiry'] == 'definite' ) {
-                               $this->addWhere( "pr_expiry != {$db->addQuotes( $db->getInfinity() )}" );
-                       }
-
-               } elseif ( isset( $params['prlevel'] ) ) {
-                       $this->dieUsage( 'prlevel may not be used without prtype', 'params' );
-               }
-
-               if ( $params['filterlanglinks'] == 'withoutlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) );
-                       $this->addWhere( 'll_from IS NULL' );
-                       $forceNameTitleIndex = false;
-               } elseif ( $params['filterlanglinks'] == 'withlanglinks' ) {
-                       $this->addTables( 'langlinks' );
-                       $this->addWhere( 'page_id=ll_from' );
-                       $this->addOption( 'STRAIGHT_JOIN' );
-                       // We have to GROUP BY all selected fields to stop
-                       // PostgreSQL from whining
-                       $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) );
-                       $forceNameTitleIndex = false;
-               }
-
-               if ( $forceNameTitleIndex ) {
-                       $this->addOption( 'USE INDEX', 'name_title' );
-               }
-
-               $limit = $params['limit'];
-               $this->addOption( 'LIMIT', $limit + 1 );
-               $res = $this->select( __METHOD__ );
-
-               $count = 0;
-               $result = $this->getResult();
-               foreach ( $res as $row ) {
-                       if ( ++ $count > $limit ) {
-                               // We've reached the one extra which shows that there are additional pages to be had. Stop here...
-                               // TODO: Security issue - if the user has no right to view next title, it will still be shown
-                               $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                               break;
-                       }
-
-                       if ( is_null( $resultPageSet ) ) {
-                               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                               $vals = array(
-                                       'pageid' => intval( $row->page_id ),
-                                       'ns' => intval( $title->getNamespace() ),
-                                       'title' => $title->getPrefixedText()
-                               );
-                               $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
-                               if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) );
-                                       break;
-                               }
-                       } else {
-                               $resultPageSet->processDbRow( $row );
-                       }
-               }
-
-               if ( is_null( $resultPageSet ) ) {
-                       $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' );
-               }
-       }
-
-       public function getAllowedParams() {
-               global $wgRestrictionLevels;
-
-               return array(
-                       'from' => null,
-                       'to' => null,
-                       'prefix' => null,
-                       'namespace' => array(
-                               ApiBase::PARAM_DFLT => 0,
-                               ApiBase::PARAM_TYPE => 'namespace',
-                       ),
-                       'filterredir' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'all',
-                                       'redirects',
-                                       'nonredirects'
-                               )
-                       ),
-                       'minsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'maxsize' => array(
-                               ApiBase::PARAM_TYPE => 'integer',
-                       ),
-                       'prtype' => array(
-                               ApiBase::PARAM_TYPE => Title::getFilteredRestrictionTypes( true ),
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prlevel' => array(
-                               ApiBase::PARAM_TYPE => $wgRestrictionLevels,
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'prfiltercascade' => array(
-                               ApiBase::PARAM_DFLT => 'all',
-                               ApiBase::PARAM_TYPE => array(
-                                       'cascading',
-                                       'noncascading',
-                                       'all'
-                               ),
-                       ),
-                       'limit' => array(
-                               ApiBase::PARAM_DFLT => 10,
-                               ApiBase::PARAM_TYPE => 'limit',
-                               ApiBase::PARAM_MIN => 1,
-                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
-                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'filterlanglinks' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'withlanglinks',
-                                       'withoutlanglinks',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-                       'prexpiry' => array(
-                               ApiBase::PARAM_TYPE => array(
-                                       'indefinite',
-                                       'definite',
-                                       'all'
-                               ),
-                               ApiBase::PARAM_DFLT => 'all'
-                       ),
-               );
-       }
-
-       public function getParamDescription() {
-               $p = $this->getModulePrefix();
-               return array(
-                       'from' => 'The page title to start enumerating from',
-                       'to' => 'The page title to stop enumerating at',
-                       'prefix' => 'Search for all page titles that begin with this value',
-                       'namespace' => 'The namespace to enumerate',
-                       'filterredir' => 'Which pages to list',
-                       'dir' => 'The direction in which to list',
-                       'minsize' => 'Limit to pages with at least this many bytes',
-                       'maxsize' => 'Limit to pages with at most this many bytes',
-                       'prtype' => 'Limit to protected pages only',
-                       'prlevel' => "The protection level (must be used with {$p}prtype= parameter)",
-                       'prfiltercascade' => "Filter protections based on cascadingness (ignored when {$p}prtype isn't set)",
-                       'filterlanglinks' => 'Filter based on whether a page has langlinks',
-                       'limit' => 'How many total pages to return.',
-                       'prexpiry' => array(
-                               'Which protection expiry to filter the page on',
-                               ' indefinite - Get only pages with indefinite protection expiry',
-                               ' definite - Get only pages with a definite (specific) protection expiry',
-                               ' all - Get pages with any protections expiry'
-                       ),
-               );
-       }
-
-       public function getDescription() {
-               return 'Enumerate all pages sequentially in a given namespace';
-       }
-
-       public function getPossibleErrors() {
-               return array_merge( parent::getPossibleErrors(), array(
-                       array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ),
-                       array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ),
-               ) );
-       }
-
-       public function getExamples() {
-               return array(
-                       'api.php?action=query&list=allpages&apfrom=B' => array(
-                               'Simple Use',
-                               'Show a list of pages starting at the letter "B"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=4&gapfrom=T&prop=info' => array(
-                               'Using as Generator',
-                               'Show info about 4 pages starting at the letter "T"',
-                       ),
-                       'api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content' => array(
-                               'Show content of first 2 non-redirect pages begining at "Re"',
-                       )
-               );
-       }
-
-       public function getHelpUrls() {
-               return 'https://www.mediawiki.org/wiki/API:Allpages';
-       }
-
-       public function getVersion() {
-               return __CLASS__ . ': $Id$';
-       }
-}
index 381ef55..9704b6d 100644 (file)
@@ -188,25 +188,25 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                $titleWhere = array();
                foreach ( $this->redirTitles as $t ) {
                        $titleWhere[] = "{$this->bl_title} = " . $db->addQuotes( $t->getDBkey() ) .
-                                       ( $this->hasNS ? " AND {$this->bl_ns} = '{$t->getNamespace()}'" : '' );
+                                       ( $this->hasNS ? " AND {$this->bl_ns} = {$t->getNamespace()}" : '' );
                }
                $this->addWhere( $db->makeList( $titleWhere, LIST_OR ) );
                $this->addWhereFld( 'page_namespace', $this->params['namespace'] );
 
                if ( !is_null( $this->redirID ) ) {
                        $first = $this->redirTitles[0];
-                       $title = $db->strencode( $first->getDBkey() );
+                       $title = $db->addQuotes( $first->getDBkey() );
                        $ns = $first->getNamespace();
                        $from = $this->redirID;
                        if ( $this->hasNS ) {
                                $this->addWhere( "{$this->bl_ns} > $ns OR " .
                                                "({$this->bl_ns} = $ns AND " .
-                                               "({$this->bl_title} > '$title' OR " .
-                                               "({$this->bl_title} = '$title' AND " .
+                                               "({$this->bl_title} > $title OR " .
+                                               "({$this->bl_title} = $title AND " .
                                                "{$this->bl_from} >= $from)))" );
                        } else {
-                               $this->addWhere( "{$this->bl_title} > '$title' OR " .
-                                               "({$this->bl_title} = '$title' AND " .
+                               $this->addWhere( "{$this->bl_title} > $title OR " .
+                                               "({$this->bl_title} = $title AND " .
                                                "{$this->bl_from} >= $from)" );
                        }
                }
@@ -277,7 +277,7 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                                        if ( $this->hasNS ) {
                                                $parentID = $this->pageMap[$row-> { $this->bl_ns } ][$row-> { $this->bl_title } ];
                                        } else {
-                                               $parentID = $this->pageMap[NS_IMAGE][$row-> { $this->bl_title } ];
+                                               $parentID = $this->pageMap[NS_FILE][$row-> { $this->bl_title } ];
                                        }
                                        $this->continueStr = $this->getContinueRedirStr( $parentID, $row->page_id );
                                        break;
@@ -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',
                );
@@ -485,6 +481,17 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                ) );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'pageid' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'redirect' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                switch ( $this->getModuleName() ) {
                        case 'backlinks':
@@ -499,11 +506,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 2666045..92fabdd 100644 (file)
@@ -233,7 +233,7 @@ abstract class ApiQueryBase extends ApiBase {
         */
        protected function addTimestampWhereRange( $field, $dir, $start, $end, $sort = true ) {
                $db = $this->getDb();
-               return $this->addWhereRange( $field, $dir,
+               $this->addWhereRange( $field, $dir,
                        $db->timestampOrNull( $start ), $db->timestampOrNull( $end ), $sort );
        }
 
@@ -519,7 +519,7 @@ abstract class ApiQueryBase extends ApiBase {
                        $this->addFields( 'ipb_deleted' );
 
                        if ( $showBlockInfo ) {
-                               $this->addFields( array( 'ipb_reason', 'ipb_by_text', 'ipb_expiry' ) );
+                               $this->addFields( array( 'ipb_id', 'ipb_by', 'ipb_by_text', 'ipb_reason', 'ipb_expiry' ) );
                        }
 
                        // Don't show hidden names
index 824589c..49cd590 100644 (file)
@@ -103,10 +103,15 @@ class ApiQueryBlocks extends ApiQueryBase {
                        }
                        $prefix = substr( $lower, 0, 4 );
 
+                       # Fairly hard to make a malicious SQL statement out of hex characters,
+                       # but it is good practice to add quotes
+                       $lower = $db->addQuotes( $lower );
+                       $upper = $db->addQuotes( $upper );
+
                        $this->addWhere( array(
                                'ipb_range_start' . $db->buildLike( $prefix, $db->anyString() ),
-                               "ipb_range_start <= '$lower'",
-                               "ipb_range_end >= '$upper'",
+                               'ipb_range_start <= ' . $lower,
+                               'ipb_range_end >= ' . $upper,
                                'ipb_auto' => 0
                        ) );
                }
@@ -319,6 +324,60 @@ class ApiQueryBlocks extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       'id' => array(
+                               'id' => 'integer'
+                       ),
+                       'user' => array(
+                               'user' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'userid' => array(
+                               'userid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'by' => array(
+                               'by' => 'string'
+                       ),
+                       'byid' => array(
+                               'byid' => 'integer'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'expiry' => array(
+                               'expiry' => 'timestamp'
+                       ),
+                       'reason' => array(
+                               'reason' => 'string'
+                       ),
+                       'range' => array(
+                               'rangestart' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'rangeend' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'flags' => array(
+                               'automatic' => 'boolean',
+                               'anononly' => 'boolean',
+                               'nocreate' => 'boolean',
+                               'autoblock' => 'boolean',
+                               'noemail' => 'boolean',
+                               'hidden' => 'boolean',
+                               'allowusertalk' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List all blocked users and IP addresses';
        }
index 1c1f155..283eb13 100644 (file)
@@ -89,12 +89,13 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                                $this->dieUsage( "Invalid continue param. You should pass the " .
                                        "original value returned by the previous query", "_badcontinue" );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $clfrom = intval( $cont[0] );
-                       $clto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $clto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "cl_from > $clfrom OR " .
+                               "cl_from $op $clfrom OR " .
                                "(cl_from = $clfrom AND " .
-                               "cl_to >= '$clto')"
+                               "cl_to $op= $clto)"
                        );
                }
 
@@ -123,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
                        ));
                }
 
@@ -239,6 +240,25 @@ class ApiQueryCategories extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'sortkey' => array(
+                               'sortkey' => 'string',
+                               'sortkeyprefix' => 'string'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'hidden' => array(
+                               'hidden' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List all categories the page(s) belong to';
        }
index c5070e8..e5eca85 100644 (file)
@@ -106,6 +106,34 @@ class ApiQueryCategoryInfo extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_LIST => false,
+                       '' => array(
+                               'size' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'pages' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'files' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'subcats' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'hidden' => array(
+                                       ApiBase::PROP_TYPE => 'boolean',
+                                       ApiBase::PROP_NULLABLE => false
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Returns information about the given categories';
        }
index fb1237f..9f66f22 100644 (file)
@@ -54,22 +54,9 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
        private function run( $resultPageSet = null ) {
                $params = $this->extractRequestParams();
 
-               $this->requireOnlyOneParameter( $params, 'title', 'pageid' );
-
-               if ( isset( $params['title'] ) ) {
-                       $categoryTitle = Title::newFromText( $params['title'] );
-
-                       if ( is_null( $categoryTitle ) || $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                               $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
-                       }
-               } elseif( isset( $params['pageid'] ) ) {
-                       $categoryTitle = Title::newFromID( $params['pageid'] );
-
-                       if ( !$categoryTitle ) {
-                               $this->dieUsageMsg( array( 'nosuchpageid', $params['pageid'] ) );
-                       } elseif ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
-                               $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
-                       }
+               $categoryTitle = $this->getTitleOrPageId( $params )->getTitle();
+               if ( $categoryTitle->getNamespace() != NS_CATEGORY ) {
+                       $this->dieUsage( 'The category name you entered is not valid', 'invalidcategory' );
                }
 
                $prop = array_flip( $params['prop'] );
@@ -110,7 +97,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                $dir = in_array( $params['dir'], array( 'asc', 'ascending', 'newer' ) ) ? 'newer' : 'older';
 
                if ( $params['sort'] == 'timestamp' ) {
-                       $this->addWhereRange( 'cl_timestamp',
+                       $this->addTimestampWhereRange( 'cl_timestamp',
                                $dir,
                                $params['start'],
                                $params['end'] );
@@ -362,7 +349,7 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                        'endsortkey' => "Sortkey to end listing at. Must be given in binary format. Can only be used with {$p}sort=sortkey",
                        'startsortkeyprefix' => "Sortkey prefix to start listing from. Can only be used with {$p}sort=sortkey. Overrides {$p}startsortkey",
                        'endsortkeyprefix' => "Sortkey prefix to end listing BEFORE (not at, if this value occurs it will not be included!). Can only be used with {$p}sort=sortkey. Overrides {$p}endsortkey",
-                       'continue' => 'For large categories, give the value retured from previous query',
+                       'continue' => 'For large categories, give the value returned from previous query',
                        'limit' => 'The maximum number of pages to return.',
                );
 
@@ -377,17 +364,46 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                return $desc;
        }
 
+       public function getResultProperties() {
+               return array(
+                       'ids' => array(
+                               'pageid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'sortkey' => array(
+                               'sortkey' => 'string'
+                       ),
+                       'sortkeyprefix' => array(
+                               'sortkeyprefix' => 'string'
+                       ),
+                       'type' => array(
+                               'type' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'page',
+                                               'subcat',
+                                               'file'
+                                       )
+                               )
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List all pages in a given category';
        }
 
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(),
-                       $this->getRequireOnlyOneParameterErrorMessages( array( 'title', 'pageid' ) ),
+                       $this->getTitleOrPageIdErrorMessage(),
                        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..06f649d 100644 (file)
@@ -155,7 +155,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $this->addWhereFld( 'ar_user_text', $params['user'] );
                } elseif ( !is_null( $params['excludeuser'] ) ) {
                        $this->addWhere( 'ar_user_text != ' .
-                               $this->getDB()->addQuotes( $params['excludeuser'] ) );
+                               $db->addQuotes( $params['excludeuser'] ) );
                }
 
                if ( !is_null( $params['continue'] ) && ( $mode == 'all' || $mode == 'revs' ) ) {
@@ -164,14 +164,14 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the original value returned by the previous query', 'badcontinue' );
                        }
                        $ns = intval( $cont[0] );
-                       $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
-                       $ts = $this->getDB()->strencode( $cont[2] );
+                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
+                       $ts = $db->addQuotes( $db->timestamp( $cont[2] ) );
                        $op = ( $dir == 'newer' ? '>' : '<' );
                        $this->addWhere( "ar_namespace $op $ns OR " .
                                        "(ar_namespace = $ns AND " .
-                                       "(ar_title $op '$title' OR " .
-                                       "(ar_title = '$title' AND " .
-                                       "ar_timestamp $op= '$ts')))" );
+                                       "(ar_title $op $title OR " .
+                                       "(ar_title = $title AND " .
+                                       "ar_timestamp $op= $ts)))" );
                }
 
                $this->addOption( 'LIMIT', $limit + 1 );
@@ -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' ) {
@@ -363,6 +366,18 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'token' => array(
+                               'token' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                $p = $this->getModulePrefix();
                return array(
index beca587..856d0fd 100644 (file)
@@ -80,17 +80,27 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
-                       $orig = $this->getDB()->strencode( $this->titleTokey( $cont[0] ) );
-                       $dup = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $db = $this->getDB();
+                       $orig = $db->addQuotes( $this->titleTokey( $cont[0] ) );
+                       $dup = $db->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "i1.img_name > '$orig' OR " .
-                               "(i1.img_name = '$orig' AND " .
-                               "i2.img_name >= '$dup')"
+                               "i1.img_name $op $orig OR " .
+                               "(i1.img_name = $orig AND " .
+                               "i2.img_name $op= $dup)"
                        );
                }
 
-               $dir = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-               $this->addOption( 'ORDER BY', 'i1.img_name' . $dir );
+               $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' . $sort );
+               } else {
+                       $this->addOption( 'ORDER BY', array(
+                                       'i1.img_name' . $sort,
+                                       'i2.img_name' . $sort
+                       ));
+               }
                $this->addOption( 'LIMIT', $params['limit'] + 1 );
 
                $res = $this->select( __METHOD__ );
@@ -155,6 +165,16 @@ class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'name' => 'string',
+                               'user' => 'string',
+                               'timestamp' => 'timestamp'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List all files that are duplicates of the given file(s)';
        }
index 93c71e2..221ffac 100644 (file)
@@ -232,6 +232,21 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                return $desc;
        }
 
+       public function getResultProperties() {
+               return array(
+                       'ids' => array(
+                               'pageid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'url' => array(
+                               'url' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Enumerate pages that contain a given URL';
        }
index a9fbc83..999ddc8 100644 (file)
@@ -133,6 +133,14 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               '*' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Returns all external urls (not interwikies) from the given page(s)';
        }
index be995f3..07d5b41 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright © 2010 Sam Reed
  * Copyright © 2008 Vasiliev Victor vasilvv@gmail.com,
- * based on ApiQueryAllpages.php
+ * based on ApiQueryAllPages.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
@@ -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,71 @@ 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',
-            ),
+                       ),
+               );
+       }
+
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'name' => 'string',
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'filehidden' => 'boolean',
+                               'commenthidden' => 'boolean',
+                               'userhidden' => 'boolean',
+                               'suppressed' => 'boolean'
+                       ),
+                       'sha1' => array(
+                               'sha1' => 'string'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'user' => array(
+                               'userid' => 'integer',
+                               'user' => 'string'
+                       ),
+                       'size' => array(
+                               'size' => 'integer',
+                               'pagecount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'height' => 'integer',
+                               'width' => 'integer'
+                       ),
+                       'dimensions' => array(
+                               'size' => 'integer',
+                               'pagecount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'height' => 'integer',
+                               'width' => 'integer'
+                       ),
+                       'description' => array(
+                               'description' => 'string'
+                       ),
+                       'parseddescription' => array(
+                               'description' => 'string',
+                               'parseddescription' => 'string'
+                       ),
+                       'metadata' => array(
+                               'metadata' => 'string'
+                       ),
+                       'bitdepth' => array(
+                               'bitdepth' => 'integer'
+                       ),
+                       'mime' => array(
+                               'mime' => 'string'
+                       ),
+                       'mediatype' => array(
+                               'mediatype' => 'string'
+                       )
                );
        }
 
index feda177..d2837e9 100644 (file)
@@ -61,14 +61,15 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                                        'original value returned by the previous query', '_badcontinue' );
                        }
 
-                       $prefix = $this->getDB()->strencode( $cont[0] );
-                       $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $db = $this->getDB();
+                       $prefix = $db->addQuotes( $cont[0] );
+                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
                        $from = intval( $cont[2] );
                        $this->addWhere(
-                               "iwl_prefix > '$prefix' OR " .
-                               "(iwl_prefix = '$prefix' AND " .
-                               "(iwl_title > '$title' OR " .
-                               "(iwl_title = '$title' AND " .
+                               "iwl_prefix > $prefix OR " .
+                               "(iwl_prefix = $prefix AND " .
+                               "(iwl_title > $title OR " .
+                               "(iwl_title = $title AND " .
                                "iwl_from >= $from)))"
                        );
                }
@@ -89,10 +90,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 );
@@ -187,6 +195,23 @@ class ApiQueryIWBacklinks extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'pageid' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'redirect' => 'boolean'
+                       ),
+                       'iwprefix' => array(
+                               'iwprefix' => 'string'
+                       ),
+                       'iwtitle' => array(
+                               'iwtitle' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array( 'Find all pages that link to the given interwiki link.',
                        'Can be used to find all links with a prefix, or',
@@ -205,7 +230,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 13256ad..7e69513 100644 (file)
@@ -62,38 +62,40 @@ class ApiQueryIWLinks extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
+                       $db = $this->getDB();
                        $iwlfrom = intval( $cont[0] );
-                       $iwlprefix = $this->getDB()->strencode( $cont[1] );
-                       $iwltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
+                       $iwlprefix = $db->addQuotes( $cont[1] );
+                       $iwltitle = $db->addQuotes( $this->titleToKey( $cont[2] ) );
                        $this->addWhere(
-                               "iwl_from > $iwlfrom OR " .
+                               "iwl_from $op $iwlfrom OR " .
                                "(iwl_from = $iwlfrom AND " .
-                               "(iwl_prefix > '$iwlprefix' OR " .
-                               "(iwl_prefix = '$iwlprefix' AND " .
-                               "iwl_title >= '$iwltitle')))"
+                               "(iwl_prefix $op $iwlprefix OR " .
+                               "(iwl_prefix = $iwlprefix AND " .
+                               "iwl_title $op= $iwltitle)))"
                        );
                }
 
-               $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
                                ));
                        }
                }
@@ -165,6 +167,19 @@ class ApiQueryIWLinks extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'prefix' => 'string',
+                               'url' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               '*' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Returns all interwiki links from the given page(s)';
        }
index 03a2482..4d2d04b 100644 (file)
@@ -81,14 +81,14 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                }
 
                                $start = $skip ? $fromTimestamp : $params['start'];
-                               $pageId = $pageIds[NS_IMAGE][ $img->getOriginalTitle()->getDBkey() ];
+                               $pageId = $pageIds[NS_FILE][ $img->getOriginalTitle()->getDBkey() ];
 
                                $fit = $result->addValue(
                                        array( 'query', 'pages', intval( $pageId ) ),
                                        'imagerepository', $img->getRepoName()
                                );
                                if ( !$fit ) {
-                                       if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                       if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                // The user is screwed. imageinfo can't be solely
                                                // responsible for exceeding the limit in this case,
                                                // so set a query-continue that just returns the same
@@ -119,7 +119,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                self::getInfo( $img, $prop, $result,
                                                        $finalThumbParams, $params['metadataversion'] ) );
                                        if ( !$fit ) {
-                                               if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                               if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        // See the 'the user is screwed' comment above
                                                        $this->setContinueEnumParameter( 'start',
                                                                wfTimestamp( TS_ISO_8601, $img->getTimestamp() ) );
@@ -149,7 +149,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                                self::getInfo( $oldie, $prop, $result,
                                                        $finalThumbParams, $params['metadataversion'] ) );
                                        if ( !$fit ) {
-                                               if ( count( $pageIds[NS_IMAGE] ) == 1 ) {
+                                               if ( count( $pageIds[NS_FILE] ) == 1 ) {
                                                        $this->setContinueEnumParameter( 'start',
                                                                wfTimestamp( TS_ISO_8601, $oldie->getTimestamp() ) );
                                                } else {
@@ -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();
        }
@@ -547,6 +547,114 @@ class ApiQueryImageInfo extends ApiQueryBase {
                );
        }
 
+       public static function getResultPropertiesFiltered( $filter = array() ) {
+               $props = array(
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'user' => array(
+                               'userhidden' => 'boolean',
+                               'user' => 'string',
+                               'anon' => 'boolean'
+                       ),
+                       'userid' => array(
+                               'userhidden' => 'boolean',
+                               'userid' => 'integer',
+                               'anon' => 'boolean'
+                       ),
+                       'size' => array(
+                               'size' => 'integer',
+                               'width' => 'integer',
+                               'height' => 'integer',
+                               'pagecount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'comment' => array(
+                               'commenthidden' => 'boolean',
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'commenthidden' => 'boolean',
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'url' => array(
+                               'filehidden' => 'boolean',
+                               'thumburl' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'thumbwidth' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'thumbheight' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'thumberror' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'url' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'descriptionurl' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'sha1' => array(
+                               'filehidden' => 'boolean',
+                               'sha1' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'mime' => array(
+                               'filehidden' => 'boolean',
+                               'mime' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'mediatype' => array(
+                               'filehidden' => 'boolean',
+                               'mediatype' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'archivename' => array(
+                               'filehidden' => 'boolean',
+                               'archivename' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'bitdepth' => array(
+                               'filehidden' => 'boolean',
+                               'bitdepth' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+               );
+               return array_diff_key( $props, array_flip( $filter ) );
+       }
+
+       public function getResultProperties() {
+               return self::getResultPropertiesFiltered();
+       }
+
        public function getDescription() {
                return 'Returns image information and upload history';
        }
index f03b287..147ab67 100644 (file)
@@ -65,23 +65,24 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $ilfrom = intval( $cont[0] );
-                       $ilto = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $ilto = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
                        $this->addWhere(
-                               "il_from > $ilfrom OR " .
+                               "il_from $op $ilfrom OR " .
                                "(il_from = $ilfrom AND " .
-                               "il_to >= '$ilto')"
+                               "il_to $op= $ilto)"
                        );
                }
 
-               $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 );
@@ -173,6 +174,15 @@ class ApiQueryImages extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Returns all images contained on the given page(s)';
        }
index d28642a..87fd58b 100644 (file)
@@ -99,6 +99,12 @@ class ApiQueryInfo extends ApiQueryBase {
                return $this->tokenFunctions;
        }
 
+       static $cachedTokens = array();
+
+       public static function resetTokenCache() {
+               ApiQueryInfo::$cachedTokens = array();
+       }
+
        public static function getEditToken( $pageid, $title ) {
                // We could check for $title->userCan('edit') here,
                // but that's too expensive for this purpose
@@ -108,14 +114,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               // The edit token is always the same, let's exploit that
-               static $cachedEditToken = null;
-               if ( !is_null( $cachedEditToken ) ) {
-                       return $cachedEditToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'edit' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'edit' ] = $wgUser->getEditToken();
                }
 
-               $cachedEditToken = $wgUser->getEditToken();
-               return $cachedEditToken;
+               return ApiQueryInfo::$cachedTokens[ 'edit' ];
        }
 
        public static function getDeleteToken( $pageid, $title ) {
@@ -124,13 +128,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedDeleteToken = null;
-               if ( !is_null( $cachedDeleteToken ) ) {
-                       return $cachedDeleteToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'delete' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'delete' ] = $wgUser->getEditToken();
                }
 
-               $cachedDeleteToken = $wgUser->getEditToken();
-               return $cachedDeleteToken;
+               return ApiQueryInfo::$cachedTokens[ 'delete' ];
        }
 
        public static function getProtectToken( $pageid, $title ) {
@@ -139,13 +142,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedProtectToken = null;
-               if ( !is_null( $cachedProtectToken ) ) {
-                       return $cachedProtectToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'protect' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'protect' ] = $wgUser->getEditToken();
                }
 
-               $cachedProtectToken = $wgUser->getEditToken();
-               return $cachedProtectToken;
+               return ApiQueryInfo::$cachedTokens[ 'protect' ];
        }
 
        public static function getMoveToken( $pageid, $title ) {
@@ -154,13 +156,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedMoveToken = null;
-               if ( !is_null( $cachedMoveToken ) ) {
-                       return $cachedMoveToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'move' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'move' ] = $wgUser->getEditToken();
                }
 
-               $cachedMoveToken = $wgUser->getEditToken();
-               return $cachedMoveToken;
+               return ApiQueryInfo::$cachedTokens[ 'move' ];
        }
 
        public static function getBlockToken( $pageid, $title ) {
@@ -169,13 +170,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedBlockToken = null;
-               if ( !is_null( $cachedBlockToken ) ) {
-                       return $cachedBlockToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'block' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'block' ] = $wgUser->getEditToken();
                }
 
-               $cachedBlockToken = $wgUser->getEditToken();
-               return $cachedBlockToken;
+               return ApiQueryInfo::$cachedTokens[ 'block' ];
        }
 
        public static function getUnblockToken( $pageid, $title ) {
@@ -189,13 +189,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedEmailToken = null;
-               if ( !is_null( $cachedEmailToken ) ) {
-                       return $cachedEmailToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'email' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'email' ] = $wgUser->getEditToken();
                }
 
-               $cachedEmailToken = $wgUser->getEditToken();
-               return $cachedEmailToken;
+               return ApiQueryInfo::$cachedTokens[ 'email' ];
        }
 
        public static function getImportToken( $pageid, $title ) {
@@ -204,13 +203,12 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedImportToken = null;
-               if ( !is_null( $cachedImportToken ) ) {
-                       return $cachedImportToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'import' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'import' ] = $wgUser->getEditToken();
                }
 
-               $cachedImportToken = $wgUser->getEditToken();
-               return $cachedImportToken;
+               return ApiQueryInfo::$cachedTokens[ 'import' ];
        }
 
        public static function getWatchToken( $pageid, $title ) {
@@ -219,13 +217,26 @@ class ApiQueryInfo extends ApiQueryBase {
                        return false;
                }
 
-               static $cachedWatchToken = null;
-               if ( !is_null( $cachedWatchToken ) ) {
-                       return $cachedWatchToken;
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'watch' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'watch' ] = $wgUser->getEditToken( 'watch' );
+               }
+
+               return ApiQueryInfo::$cachedTokens[ 'watch' ];
+       }
+
+       public static function getOptionsToken( $pageid, $title ) {
+               global $wgUser;
+               if ( !$wgUser->isLoggedIn() ) {
+                       return false;
+               }
+
+               // The token is always the same, let's exploit that
+               if ( !isset( ApiQueryInfo::$cachedTokens[ 'options' ] ) ) {
+                       ApiQueryInfo::$cachedTokens[ 'options' ] = $wgUser->getEditToken();
                }
 
-               $cachedWatchToken = $wgUser->getEditToken( 'watch' );
-               return $cachedWatchToken;
+               return ApiQueryInfo::$cachedTokens[ 'options' ];
        }
 
        public function execute() {
@@ -322,7 +333,10 @@ class ApiQueryInfo extends ApiQueryBase {
         */
        private function extractPageInfo( $pageid, $title ) {
                $pageInfo = array();
-               if ( $title->exists() ) {
+               $titleExists = $pageid > 0; //$title->exists() needs pageid, which is not set for all title objects
+               $ns = $title->getNamespace();
+               $dbkey = $title->getDBkey();
+               if ( $titleExists ) {
                        global $wgDisableCounters;
 
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
@@ -355,23 +369,23 @@ class ApiQueryInfo extends ApiQueryBase {
 
                if ( $this->fld_protection ) {
                        $pageInfo['protection'] = array();
-                       if ( isset( $this->protections[$title->getNamespace()][$title->getDBkey()] ) ) {
+                       if ( isset( $this->protections[$ns][$dbkey] ) ) {
                                $pageInfo['protection'] =
-                                       $this->protections[$title->getNamespace()][$title->getDBkey()];
+                                       $this->protections[$ns][$dbkey];
                        }
                        $this->getResult()->setIndexedTagName( $pageInfo['protection'], 'pr' );
                }
 
-               if ( $this->fld_watched && isset( $this->watched[$title->getNamespace()][$title->getDBkey()] ) ) {
+               if ( $this->fld_watched && isset( $this->watched[$ns][$dbkey] ) ) {
                        $pageInfo['watched'] = '';
                }
 
-               if ( $this->fld_talkid && isset( $this->talkids[$title->getNamespace()][$title->getDBkey()] ) ) {
-                       $pageInfo['talkid'] = $this->talkids[$title->getNamespace()][$title->getDBkey()];
+               if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) )        {
+                       $pageInfo['talkid'] = $this->talkids[$ns][$dbkey];
                }
 
-               if ( $this->fld_subjectid && isset( $this->subjectids[$title->getNamespace()][$title->getDBkey()] ) ) {
-                       $pageInfo['subjectid'] = $this->subjectids[$title->getNamespace()][$title->getDBkey()];
+               if ( $this->fld_subjectid && isset( $this->subjectids[$ns][$dbkey] ) ) {
+                       $pageInfo['subjectid'] = $this->subjectids[$ns][$dbkey];
                }
 
                if ( $this->fld_url ) {
@@ -383,7 +397,7 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                if ( $this->fld_preload ) {
-                       if ( $title->exists() ) {
+                       if ( $titleExists ) {
                                $pageInfo['preload'] = '';
                        } else {
                                $text = null;
@@ -394,8 +408,8 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                if ( $this->fld_displaytitle ) {
-                       if ( isset( $this->displaytitles[$title->getArticleID()] ) ) {
-                               $pageInfo['displaytitle'] = $this->displaytitles[$title->getArticleID()];
+                       if ( isset( $this->displaytitles[$pageid] ) ) {
+                               $pageInfo['displaytitle'] = $this->displaytitles[$pageid];
                        } else {
                                $pageInfo['displaytitle'] = $title->getPrefixedText();
                        }
@@ -706,6 +720,59 @@ class ApiQueryInfo extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               $props = array(
+                       ApiBase::PROP_LIST => false,
+                       '' => array(
+                               'touched' => 'timestamp',
+                               'lastrevid' => 'integer',
+                               'counter' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'length' => 'integer',
+                               'redirect' => 'boolean',
+                               'new' => 'boolean',
+                               'starttimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'watched' => array(
+                               'watched' => 'boolean'
+                       ),
+                       'talkid' => array(
+                               'talkid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'subjectid' => array(
+                               'subjectid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'url' => array(
+                               'fullurl' => 'string',
+                               'editurl' => 'string'
+                       ),
+                       'readable' => array(
+                               'readable' => 'boolean'
+                       ),
+                       'preload' => array(
+                               'preload' => 'string'
+                       ),
+                       'displaytitle' => array(
+                               'displaytitle' => 'string'
+                       )
+               );
+
+               self::addTokenProperties( $props, $this->getTokenFunctions() );
+
+               return $props;
+       }
+
        public function getDescription() {
                return 'Get basic page information such as namespace, title, last touched date, ...';
        }
index 1573494..f423719 100644 (file)
@@ -61,14 +61,15 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                                        'original value returned by the previous query', '_badcontinue' );
                        }
 
-                       $prefix = $this->getDB()->strencode( $cont[0] );
-                       $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $db = $this->getDB();
+                       $prefix = $db->addQuotes( $cont[0] );
+                       $title = $db->addQuotes( $this->titleToKey( $cont[1] ) );
                        $from = intval( $cont[2] );
                        $this->addWhere(
-                               "ll_lang > '$prefix' OR " .
-                               "(ll_lang = '$prefix' AND " .
-                               "(ll_title > '$title' OR " .
-                               "(ll_title = '$title' AND " .
+                               "ll_lang > $prefix OR " .
+                               "(ll_lang = $prefix AND " .
+                               "(ll_title > $title OR " .
+                               "(ll_title = $title AND " .
                                "ll_from >= $from)))"
                        );
                }
@@ -89,10 +90,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 );
@@ -187,6 +195,23 @@ class ApiQueryLangBacklinks extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'pageid' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'redirect' => 'boolean'
+                       ),
+                       'lllang' => array(
+                               'lllang' => 'string'
+                       ),
+                       'lltitle' => array(
+                               'lltitle' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array( 'Find all pages that link to the given language link.',
                        'Can be used to find all links with a language code, or',
@@ -205,7 +230,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 fdba846..7cab739 100644 (file)
@@ -60,35 +60,36 @@ class ApiQueryLangLinks extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $llfrom = intval( $cont[0] );
-                       $lllang = $this->getDB()->strencode( $cont[1] );
+                       $lllang = $this->getDB()->addQuotes( $cont[1] );
                        $this->addWhere(
-                               "ll_from > $llfrom OR " .
+                               "ll_from $op $llfrom OR " .
                                "(ll_from = $llfrom AND " .
-                               "ll_lang >= '$lllang')"
+                               "ll_lang $op= $lllang)"
                        );
                }
 
-           $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
                                ));
                        }
                }
@@ -158,6 +159,19 @@ class ApiQueryLangLinks extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'lang' => 'string',
+                               'url' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               '*' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Returns all interlanguage links from the given page(s)';
        }
index 0377edd..5cf9068 100644 (file)
@@ -116,19 +116,20 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the ' .
                                        'original value returned by the previous query', '_badcontinue' );
                        }
+                       $op = $params['dir'] == 'descending' ? '<' : '>';
                        $plfrom = intval( $cont[0] );
                        $plns = intval( $cont[1] );
-                       $pltitle = $this->getDB()->strencode( $this->titleToKey( $cont[2] ) );
+                       $pltitle = $this->getDB()->addQuotes( $this->titleToKey( $cont[2] ) );
                        $this->addWhere(
-                               "{$this->prefix}_from > $plfrom OR " .
+                               "{$this->prefix}_from $op $plfrom OR " .
                                "({$this->prefix}_from = $plfrom AND " .
-                               "({$this->prefix}_namespace > $plns OR " .
+                               "({$this->prefix}_namespace $op $plns OR " .
                                "({$this->prefix}_namespace = $plns AND " .
-                               "{$this->prefix}_title >= '$pltitle')))"
+                               "{$this->prefix}_title $op= $pltitle)))"
                        );
                }
 
-               $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
@@ -136,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 );
@@ -226,6 +227,15 @@ class ApiQueryLinks extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return "Returns all {$this->description}s from the given page(s)";
        }
index e017c4b..bb4b429 100644 (file)
@@ -447,6 +447,62 @@ class ApiQueryLogEvents extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               global $wgLogTypes;
+               return array(
+                       'ids' => array(
+                               'logid' => 'integer',
+                               'pageid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'type' => array(
+                               'type' => array(
+                                       ApiBase::PROP_TYPE => $wgLogTypes
+                               ),
+                               'action' => 'string'
+                       ),
+                       'details' => array(
+                               'actionhidden' => 'boolean'
+                       ),
+                       'user' => array(
+                               'userhidden' => 'boolean',
+                               'user' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'anon' => 'boolean'
+                       ),
+                       'userid' => array(
+                               'userhidden' => 'boolean',
+                               'userid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'anon' => 'boolean'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'comment' => array(
+                               'commenthidden' => 'boolean',
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'commenthidden' => 'boolean',
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Get events from logs';
        }
index 44cc1d3..360183c 100644 (file)
@@ -214,6 +214,40 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               global $wgRestrictionLevels;
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'user' => array(
+                               'user' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'userid' => 'integer'
+                       ),
+                       'comment' => array(
+                               'comment' => 'string'
+                       ),
+                       'parsedcomment' => array(
+                               'parsedcomment' => 'string'
+                       ),
+                       'expiry' => array(
+                               'expiry' => 'timestamp'
+                       ),
+                       'level' => array(
+                               'level' => array(
+                                       ApiBase::PROP_TYPE => array_diff( $wgRestrictionLevels, array( '' ) )
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List all titles protected from creation';
        }
index 5eba0de..2c7ba12 100644 (file)
@@ -70,6 +70,8 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param $resultPageSet ApiPageSet
         */
        public function run( $resultPageSet = null ) {
+               global $wgQueryCacheLimit;
+
                $params = $this->extractRequestParams();
                $result = $this->getResult();
 
@@ -88,6 +90,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                                if ( $ts ) {
                                        $r['cachedtimestamp'] = wfTimestamp( TS_ISO_8601, $ts );
                                }
+                               $r['maxresults'] = $wgQueryCacheLimit;
                        }
                }
                $result->addValue( array( 'query' ), $this->getModuleName(), $r );
@@ -170,6 +173,38 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_ROOT => array(
+                               'name' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'disabled' => array(
+                                       ApiBase::PROP_TYPE => 'boolean',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'cached' => array(
+                                       ApiBase::PROP_TYPE => 'boolean',
+                                       ApiBase::PROP_NULLABLE => false
+                               ),
+                               'cachedtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       '' => array(
+                               'value' => 'string',
+                               'timestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Get a list provided by a QueryPage-based special page';
        }
index 2e9e2dd..ddf5841 100644 (file)
@@ -161,6 +161,16 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'id' => 'integer',
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Get a set of random pages',
index 2d2d9ff..62c6678 100644 (file)
@@ -144,7 +144,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Build our basic query. Namely, something along the lines of:
                 * SELECT * FROM recentchanges WHERE rc_timestamp > $start
                 *              AND rc_timestamp < $end AND rc_namespace = $namespace
-                *              AND rc_deleted = '0'
+                *              AND rc_deleted = 0
                 */
                $this->addTables( 'recentchanges' );
                $index = array( 'recentchanges' => 'rc_timestamp' ); // May change
@@ -629,6 +629,97 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               global $wgLogTypes;
+               $props = array(
+                       '' => array(
+                               'type' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'edit',
+                                               'new',
+                                               'move',
+                                               'log',
+                                               'move over redirect'
+                                       )
+                               )
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string',
+                               'new_ns' => array(
+                                       ApiBase::PROP_TYPE => 'namespace',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'new_title' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'ids' => array(
+                               'rcid' => 'integer',
+                               'pageid' => 'integer',
+                               'revid' => 'integer',
+                               'old_revid' => 'integer'
+                       ),
+                       'user' => array(
+                               'user' => 'string',
+                               'anon' => 'boolean'
+                       ),
+                       'userid' => array(
+                               'userid' => 'integer',
+                               'anon' => 'boolean'
+                       ),
+                       'flags' => array(
+                               'bot' => 'boolean',
+                               'new' => 'boolean',
+                               'minor' => 'boolean'
+                       ),
+                       'sizes' => array(
+                               'oldlen' => 'integer',
+                               'newlen' => 'integer'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'comment' => array(
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'redirect' => array(
+                               'redirect' => 'boolean'
+                       ),
+                       'patrolled' => array(
+                               'patrolled' => 'boolean'
+                       ),
+                       'loginfo' => array(
+                               'logid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'logtype' => array(
+                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'logaction' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+
+               self::addTokenProperties( $props, $this->getTokenFunctions() );
+
+               return $props;
+       }
+
        public function getDescription() {
                return 'Enumerate recent changes';
        }
index fa58bdf..1a5ad17 100644 (file)
@@ -224,6 +224,13 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                }
 
+               // add user name, if needed
+               if ( $this->fld_user ) {
+                       $this->addTables( 'user' );
+                       $this->addJoinConds( array( 'user' => Revision::userJoinCond() ) );
+                       $this->addFields( Revision::selectUserFields() );
+               }
+
                // Bug 24166 - API error when using rvprop=tags
                $this->addTables( 'revision' );
 
@@ -290,7 +297,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        $this->addWhereFld( 'rev_id', array_keys( $revs ) );
 
                        if ( !is_null( $params['continue'] ) ) {
-                               $this->addWhere( "rev_id >= '" . intval( $params['continue'] ) . "'" );
+                               $this->addWhere( 'rev_id >= ' . intval( $params['continue'] ) );
                        }
                        $this->addOption( 'ORDER BY', 'rev_id' );
 
@@ -322,12 +329,15 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $pageid = intval( $cont[0] );
                                $revid = intval( $cont[1] );
                                $this->addWhere(
-                                       "rev_page > '$pageid' OR " .
-                                       "(rev_page = '$pageid' AND " .
-                                       "rev_id >= '$revid')"
+                                       "rev_page > $pageid OR " .
+                                       "(rev_page = $pageid AND " .
+                                       "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;
@@ -638,6 +648,66 @@ class ApiQueryRevisions extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               $props = array(
+                       '' => array(),
+                       'ids' => array(
+                               'revid' => 'integer',
+                               'parentid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'flags' => array(
+                               'minor' => 'boolean'
+                       ),
+                       'user' => array(
+                               'userhidden' => 'boolean',
+                               'user' => 'string',
+                               'anon' => 'boolean'
+                       ),
+                       'userid' => array(
+                               'userhidden' => 'boolean',
+                               'userid' => 'integer',
+                               'anon' => 'boolean'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'size' => array(
+                               'size' => 'integer'
+                       ),
+                       'sha1' => array(
+                               'sha1' => 'string'
+                       ),
+                       'comment' => array(
+                               'commenthidden' => 'boolean',
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'commenthidden' => 'boolean',
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'content' => array(
+                               '*' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'texthidden' => 'boolean'
+                       )
+               );
+
+               self::addTokenProperties( $props, $this->getTokenFunctions() );
+
+               return $props;
+       }
+
        public function getDescription() {
                return array(
                        'Get revision information',
index 40aac05..ed6c3cb 100644 (file)
@@ -280,6 +280,63 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'snippet' => array(
+                               'snippet' => 'string'
+                       ),
+                       'size' => array(
+                               'size' => 'integer'
+                       ),
+                       'wordcount' => array(
+                               'wordcount' => 'integer'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'score' => array(
+                               'score' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'titlesnippet' => array(
+                               'titlesnippet' => 'string'
+                       ),
+                       'redirecttitle' => array(
+                               'redirecttitle' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'redirectsnippet' => array(
+                               'redirectsnippet' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'sectiontitle' => array(
+                               'sectiontitle' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'sectionsnippet' => array(
+                               'sectionsnippet' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'hasrelated' => array(
+                               'hasrelated' => 'boolean'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Perform a full text search';
        }
index e11d110..e7102e0 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::isNonincludable( $ns ) ) {
+                               $data[$ns]['nonincludable'] = '';
+                       }
                }
 
                $this->getResult()->setIndexedTagName( $data, 'ns' );
index 4501ec5..02484ae 100644 (file)
@@ -123,6 +123,10 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                );
        }
 
+       public function getResultProperties() {
+               return ApiQueryImageInfo::getResultPropertiesFiltered( $this->propertyFilter );
+       }
+
        public function getDescription() {
                return 'Returns image information for stashed images';
        }
index 12cea1d..edd1553 100644 (file)
@@ -169,6 +169,23 @@ class ApiQueryTags extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'name' => 'string'
+                       ),
+                       'displayname' => array(
+                               'displayname' => 'string'
+                       ),
+                       'description' => array(
+                               'description' => 'string'
+                       ),
+                       'hitcount' => array(
+                               'hitcount' => 'integer'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'List change tags';
        }
index 8e2f20d..f531980 100644 (file)
@@ -35,10 +35,10 @@ class ApiQueryContributions extends ApiQueryBase {
                parent::__construct( $query, $moduleName, 'uc' );
        }
 
-       private $params, $prefixMode, $userprefix, $multiUserMode, $usernames;
+       private $params, $prefixMode, $userprefix, $multiUserMode, $usernames, $parentLens;
        private $fld_ids = false, $fld_title = false, $fld_timestamp = false,
                        $fld_comment = false, $fld_parsedcomment = false, $fld_flags = false,
-                       $fld_patrolled = false, $fld_tags = false, $fld_size = false;
+                       $fld_patrolled = false, $fld_tags = false, $fld_size = false, $fld_sizediff = false;
 
        public function execute() {
                // Parse some parameters
@@ -50,6 +50,7 @@ class ApiQueryContributions extends ApiQueryBase {
                $this->fld_comment = isset( $prop['comment'] );
                $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
                $this->fld_size = isset( $prop['size'] );
+               $this->fld_sizediff = isset( $prop['sizediff'] );
                $this->fld_flags = isset( $prop['flags'] );
                $this->fld_timestamp = isset( $prop['timestamp'] );
                $this->fld_patrolled = isset( $prop['patrolled'] );
@@ -82,6 +83,17 @@ class ApiQueryContributions extends ApiQueryBase {
                // Do the actual query.
                $res = $this->select( __METHOD__ );
 
+               if( $this->fld_sizediff ) {
+                       $revIds = array();
+                       foreach ( $res as $row ) {
+                               if( $row->rev_parent_id ) {
+                                       $revIds[] = $row->rev_parent_id;
+                               }
+                       }
+                       $this->parentLens = Revision::getParentLengths( $this->getDB(), $revIds );
+                       $res->rewind(); // reset
+               }
+
                // Initialise some variables
                $count = 0;
                $limit = $this->params['limit'];
@@ -152,13 +164,14 @@ class ApiQueryContributions extends ApiQueryBase {
                                $this->dieUsage( 'Invalid continue param. You should pass the original ' .
                                        'value returned by the previous query', '_badcontinue' );
                        }
-                       $encUser = $this->getDB()->strencode( $continue[0] );
-                       $encTS = wfTimestamp( TS_MW, $continue[1] );
+                       $db = $this->getDB();
+                       $encUser = $db->addQuotes( $continue[0] );
+                       $encTS = $db->addQuotes( $db->timestamp( $continue[1] ) );
                        $op = ( $this->params['dir'] == 'older' ? '<' : '>' );
                        $this->addWhere(
-                               "rev_user_text $op '$encUser' OR " .
-                               "(rev_user_text = '$encUser' AND " .
-                               "rev_timestamp $op= '$encTS')"
+                               "rev_user_text $op $encUser OR " .
+                               "(rev_user_text = $encUser AND " .
+                               "rev_timestamp $op= $encTS)"
                        );
                }
 
@@ -185,7 +198,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' );
                        }
 
@@ -244,7 +257,8 @@ class ApiQueryContributions extends ApiQueryBase {
                // $this->addFieldsIf( 'rev_text_id', $this->fld_ids ); // Should this field be exposed?
                $this->addFieldsIf( 'rev_comment', $this->fld_comment || $this->fld_parsedcomment );
                $this->addFieldsIf( 'rev_len', $this->fld_size );
-               $this->addFieldsIf( array( 'rev_minor_edit', 'rev_parent_id' ), $this->fld_flags );
+               $this->addFieldsIf( 'rev_minor_edit', $this->fld_flags );
+               $this->addFieldsIf( 'rev_parent_id', $this->fld_flags || $this->fld_sizediff );
                $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
 
                if ( $this->fld_tags ) {
@@ -332,6 +346,11 @@ class ApiQueryContributions extends ApiQueryBase {
                        $vals['size'] = intval( $row->rev_len );
                }
 
+               if ( $this->fld_sizediff && !is_null( $row->rev_len ) && !is_null( $row->rev_parent_id ) ) {
+                       $parentLen = isset( $this->parentLens[$row->rev_parent_id] ) ? $this->parentLens[$row->rev_parent_id] : 0;
+                       $vals['sizediff'] = intval( $row->rev_len - $parentLen );
+               }
+
                if ( $this->fld_tags ) {
                        if ( $row->ts_tags ) {
                                $tags = explode( ',', $row->ts_tags );
@@ -397,6 +416,7 @@ class ApiQueryContributions extends ApiQueryBase {
                                        'comment',
                                        'parsedcomment',
                                        'size',
+                                       'sizediff',
                                        'flags',
                                        'patrolled',
                                        'tags'
@@ -435,7 +455,8 @@ class ApiQueryContributions extends ApiQueryBase {
                                ' timestamp      - Adds the timestamp of the edit',
                                ' comment        - Adds the comment of the edit',
                                ' parsedcomment  - Adds the parsed comment of the edit',
-                               ' size           - Adds the size of the page',
+                               ' size           - Adds the new size of the edit',
+                               ' sizediff       - Adds the size delta of the edit against its parent',
                                ' flags          - Adds flags of the edit',
                                ' patrolled      - Tags patrolled edits',
                                ' tags           - Lists tags for the edit',
@@ -447,6 +468,55 @@ class ApiQueryContributions extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'userid' => 'integer',
+                               'user' => 'string',
+                               'userhidden' => 'boolean'
+                       ),
+                       'ids' => array(
+                               'pageid' => 'integer',
+                               'revid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'flags' => array(
+                               'new' => 'boolean',
+                               'minor' => 'boolean',
+                               'top' => 'boolean'
+                       ),
+                       'comment' => array(
+                               'commenthidden' => 'boolean',
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'commenthidden' => 'boolean',
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'patrolled' => array(
+                               'patrolled' => 'boolean'
+                       ),
+                       'size' => array(
+                               'size' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Get all edits by a user';
        }
index a0ee227..e4617d9 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();
@@ -63,7 +63,10 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
                if ( isset( $this->prop['blockinfo'] ) ) {
                        if ( $user->isBlocked() ) {
-                               $vals['blockedby'] = User::whoIs( $user->blockedBy() );
+                               $block = $user->getBlock();
+                               $vals['blockid'] = $block->getId();
+                               $vals['blockedby'] = $block->getByName();
+                               $vals['blockedbyid'] = $block->getBy();
                                $vals['blockreason'] = $user->blockedFor();
                        }
                }
@@ -136,7 +139,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 );
@@ -231,6 +234,63 @@ class ApiQueryUserInfo extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       ApiBase::PROP_LIST => false,
+                       '' => array(
+                               'id' => 'integer',
+                               'name' => 'string',
+                               'anon' => 'boolean'
+                       ),
+                       'blockinfo' => array(
+                               'blockid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedby' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedbyid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedreason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'hasmsg' => array(
+                               'messages' => 'boolean'
+                       ),
+                       'preferencestoken' => array(
+                               'preferencestoken' => 'string'
+                       ),
+                       'editcount' => array(
+                               'editcount' => 'integer'
+                       ),
+                       'realname' => array(
+                               'realname' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'email' => array(
+                               'email' => 'string',
+                               'emailauthenticated' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'registrationdate' => array(
+                               'registrationdate' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Get information about the current user';
        }
index 31624bd..02fcf01 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,
@@ -107,7 +107,7 @@ class ApiQueryUsers extends ApiQueryBase {
 
                if ( count( $goodNames ) ) {
                        $this->addTables( 'user' );
-                       $this->addFields( '*' );
+                       $this->addFields( User::selectFields() );
                        $this->addWhereFld( 'user_name', $goodNames );
 
                        if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
@@ -165,7 +165,9 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$name]['hidden'] = '';
                                }
                                if ( isset( $this->prop['blockinfo'] ) && !is_null( $row->ipb_by_text ) ) {
+                                       $data[$name]['blockid'] = $row->ipb_id;
                                        $data[$name]['blockedby'] = $row->ipb_by_text;
+                                       $data[$name]['blockedbyid'] = $row->ipb_by;
                                        $data[$name]['blockreason'] = $row->ipb_reason;
                                        $data[$name]['blockexpiry'] = $row->ipb_expiry;
                                }
@@ -313,6 +315,73 @@ class ApiQueryUsers extends ApiQueryBase {
                );
        }
 
+       public function getResultProperties() {
+               $props = array(
+                       '' => array(
+                               'userid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'name' => 'string',
+                               'invalid' => 'boolean',
+                               'hidden' => 'boolean',
+                               'interwiki' => 'boolean',
+                               'missing' => 'boolean'
+                       ),
+                       'editcount' => array(
+                               'editcount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'registration' => array(
+                               'registration' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'blockinfo' => array(
+                               'blockid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedby' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedbyid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedreason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blockedexpiry' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'emailable' => array(
+                               'emailable' => 'boolean'
+                       ),
+                       'gender' => array(
+                               'gender' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'male',
+                                               'female',
+                                               'unknown'
+                                       ),
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+
+               self::addTokenProperties( $props, $this->getTokenFunctions() );
+
+               return $props;
+       }
+
        public function getDescription() {
                return 'Get information about a list of users';
        }
index 77f6ce9..a93f94f 100644 (file)
@@ -418,6 +418,76 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               global $wgLogTypes;
+               return array(
+                       'ids' => array(
+                               'pageid' => 'integer',
+                               'revid' => 'integer',
+                               'old_revid' => 'integer'
+                       ),
+                       'title' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'user' => array(
+                               'user' => 'string',
+                               'anon' => 'boolean'
+                       ),
+                       'userid' => array(
+                               'userid' => 'integer',
+                               'anon' => 'boolean'
+                       ),
+                       'flags' => array(
+                               'new' => 'boolean',
+                               'minor' => 'boolean',
+                               'bot' => 'boolean'
+                       ),
+                       'patrol' => array(
+                               'patrolled' => 'boolean'
+                       ),
+                       'timestamp' => array(
+                               'timestamp' => 'timestamp'
+                       ),
+                       'sizes' => array(
+                               'oldlen' => 'integer',
+                               'newlen' => 'integer'
+                       ),
+                       'notificationtimestamp' => array(
+                               'notificationtimestamp' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'comment' => array(
+                               'comment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'parsedcomment' => array(
+                               'parsedcomment' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
+                       'loginfo' => array(
+                               'logid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'logtype' => array(
+                                       ApiBase::PROP_TYPE => $wgLogTypes,
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'logaction' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return "Get all recent changes to pages in the logged in user's watchlist";
        }
index 4adadf1..1b1eee0 100644 (file)
@@ -76,12 +76,12 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                                        "original value returned by the previous query", "_badcontinue" );
                        }
                        $ns = intval( $cont[0] );
-                       $title = $this->getDB()->strencode( $this->titleToKey( $cont[1] ) );
+                       $title = $this->getDB()->addQuotes( $this->titleToKey( $cont[1] ) );
                        $op = $params['dir'] == 'ascending' ? '>' : '<';
                        $this->addWhere(
-                               "wl_namespace $op '$ns' OR " .
-                               "(wl_namespace = '$ns' AND " .
-                               "wl_title $op= '$title')"
+                               "wl_namespace $op $ns OR " .
+                               "(wl_namespace = $ns AND " .
+                               "wl_title $op= $title)"
                        );
                }
 
@@ -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__ );
@@ -189,6 +192,21 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'ns' => 'namespace',
+                               'title' => 'string'
+                       ),
+                       'changed' => array(
+                               'changed' => array(
+                                       ApiBase::PROP_TYPE => 'timestamp',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return "Get all pages on the logged in user's watchlist";
        }
index 436c392..4de49ea 100644 (file)
@@ -116,6 +116,19 @@ class ApiRollback extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'title' => 'string',
+                               'pageid' => 'integer',
+                               'summary' => 'string',
+                               'revid' => 'integer',
+                               'old_revid' => 'integer',
+                               'last_revid' => 'integer'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Undo the last edit to the page. If the last user who edited the page made multiple edits in a row,',
index 7964095..2c9b482 100644 (file)
@@ -35,19 +35,16 @@ class ApiTokens extends ApiBase {
        }
 
        public function execute() {
+               wfProfileIn( __METHOD__ );
                $params = $this->extractRequestParams();
                $res = array();
 
+               $types = $this->getTokenTypes();
                foreach ( $params['type'] as $type ) {
                        $type = strtolower( $type );
-                       $func = 'get' .
-                                       ucfirst( $type ) .
-                                       'Token';
-                       if ( $type === 'patrol' ) {
-                               $val = call_user_func( array( 'ApiQueryRecentChanges', $func ), null, null );
-                       } else {
-                               $val = call_user_func( array( 'ApiQueryInfo', $func ), null, null );
-                       }
+
+                       $val = call_user_func( $types[$type], null, null );
+
                        if ( $val === false ) {
                                $this->setWarning( "Action '$type' is not allowed for the current user" );
                        } else {
@@ -56,6 +53,25 @@ class ApiTokens extends ApiBase {
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
+               wfProfileOut( __METHOD__ );
+       }
+
+       private function getTokenTypes() {
+               static $types = null;
+               if ( $types ) {
+                       return $types;
+               }
+               wfProfileIn( __METHOD__ );
+               $types = array( 'patrol' => 'ApiQueryRecentChanges::getPatrolToken' );
+               $names = array( 'edit', 'delete', 'protect', 'move', 'block', 'unblock',
+                       'email', 'import', 'watch', 'options' );
+               foreach ( $names as $name ) {
+                       $types[$name] = 'ApiQueryInfo::get' . ucfirst( $name ) . 'Token';
+               }
+               wfRunHooks( 'ApiTokensGetTokenTypes', array( &$types ) );
+               ksort( $types );
+               wfProfileOut( __METHOD__ );
+               return $types;
        }
 
        public function getAllowedParams() {
@@ -63,9 +79,57 @@ class ApiTokens extends ApiBase {
                        'type' => array(
                                ApiBase::PARAM_DFLT => 'edit',
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_TYPE => array(
-                                       'edit', 'delete', 'protect', 'move', 'block', 'unblock',
-                                       'email', 'import', 'watch', 'patrol'
+                               ApiBase::PARAM_TYPE => array_keys( $this->getTokenTypes() ),
+                       ),
+               );
+       }
+
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'patroltoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'edittoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'deletetoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'protecttoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'movetoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'blocktoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'unblocktoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'emailtoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'importtoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'watchtoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'optionstoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
                                )
                        )
                );
index e599e32..40a6d44 100644 (file)
@@ -78,7 +78,9 @@ class ApiUnblock extends ApiBase {
                }
 
                $res['id'] = $block->getId();
-               $res['user'] = $block->getType() == Block::TYPE_AUTO ? '' : $block->getTarget();
+               $target = $block->getType() == Block::TYPE_AUTO ? '' : $block->getTarget();
+               $res['user'] = $target;
+               $res['userid'] = $target instanceof User ? $target->getId() : 0;
                $res['reason'] = $params['reason'];
                $this->getResult()->addValue( null, $this->getModuleName(), $res );
        }
@@ -98,7 +100,10 @@ class ApiUnblock extends ApiBase {
                        ),
                        'user' => null,
                        'token' => null,
-                       'gettoken' => false,
+                       'gettoken' => array(
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true,
+                       ),
                        'reason' => null,
                );
        }
@@ -108,12 +113,39 @@ 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)',
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'unblocktoken' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'id' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'user' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'userid' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'reason' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Unblock a user';
        }
index d342997..c89f49a 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 );
        }
 
@@ -122,6 +122,17 @@ class ApiUndelete extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'title' => 'string',
+                               'revisions' => 'integer',
+                               'filerevisions' => 'integer',
+                               'reason' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Restore certain revisions of a deleted page. A list of deleted revisions (including timestamps) can be',
index 5040c70..db1ee16 100644 (file)
@@ -173,7 +173,7 @@ class ApiUpload extends ApiBase {
         */
        private function getChunkResult(){
                $result = array();
-               
+
                $result['result'] = 'Continue';
                $request = $this->getMain()->getRequest();
                $chunkPath = $request->getFileTempname( 'chunk' );
@@ -185,7 +185,7 @@ class ApiUpload extends ApiBase {
                                                                                $this->mParams['offset']);
                        if ( !$status->isGood() ) {
                                $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                               return ;
+                               return array();
                        }
 
                        // Check we added the last chunk: 
@@ -194,7 +194,7 @@ class ApiUpload extends ApiBase {
 
                                if ( !$status->isGood() ) {
                                        $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                                       return ;
+                                       return array();
                                }
 
                                // We have a new filekey for the fully concatenated file.
@@ -623,6 +623,41 @@ class ApiUpload extends ApiBase {
 
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'result' => array(
+                                       ApiBase::PROP_TYPE => array(
+                                               'Success',
+                                               'Warning',
+                                               'Continue',
+                                               'Queued'
+                                       ),
+                               ),
+                               'filekey' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'sessionkey' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'offset' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'statuskey' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               ),
+                               'filename' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       )
+               );
+       }
+
        public function getDescription() {
                return array(
                        'Upload a file, or get the status of pending uploads. Several methods are available:',
index 191dd3e..399bc54 100644 (file)
@@ -43,6 +43,7 @@ class ApiUserrights extends ApiBase {
 
                $form = new UserrightsPage;
                $r['user'] = $user->getName();
+               $r['userid'] = $user->getId();
                list( $r['added'], $r['removed'] ) =
                        $form->doSaveUserGroups(
                                $user, (array)$params['add'],
index fa382b3..c923c6d 100644 (file)
@@ -100,6 +100,17 @@ class ApiWatch extends ApiBase {
                );
        }
 
+       public function getResultProperties() {
+               return array(
+                       '' => array(
+                               'title' => 'string',
+                               'unwatched' => 'boolean',
+                               'watched' => 'boolean',
+                               'message' => 'string'
+                       )
+               );
+       }
+
        public function getDescription() {
                return 'Add or remove a page from/to the current user\'s watchlist';
        }
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 2cc1061..2a169bb 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 {
@@ -48,7 +70,7 @@ class GenderCache {
                        $username = $username->getName();
                }
 
-               $username = strtr( $username, '_', ' ' );
+               $username = self::normalizeUsername( $username );
                if ( !isset( $this->cache[$username] ) ) {
 
                        if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
@@ -60,11 +82,7 @@ class GenderCache {
 
                        } else {
                                $this->misses++;
-                               if ( !User::isValidUserName( $username ) ) {
-                                       $this->cache[$username] = $this->getDefault();
-                               } else {
-                                       $this->doQuery( $username, $caller );
-                               }
+                               $this->doQuery( $username, $caller );
                        }
 
                }
@@ -86,7 +104,6 @@ class GenderCache {
                foreach ( $data as $ns => $pagenames ) {
                        if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue;
                        foreach ( array_keys( $pagenames ) as $username ) {
-                               if ( isset( $this->cache[$username] ) ) continue;
                                $users[$username] = true;
                        }
                }
@@ -94,6 +111,29 @@ class GenderCache {
                $this->doQuery( array_keys( $users ), $caller );
        }
 
+       /**
+        * Wrapper for doQuery that processes a title or string array.
+        *
+        * @since 1.20
+        * @param $titles List: array of Title objects or strings
+        * @param $caller String: the calling method
+        */
+       public function doTitlesArray( $titles, $caller = '' ) {
+               $users = array();
+               foreach ( $titles as $title ) {
+                       $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
+                       if ( !$titleObj ) {
+                               continue;
+                       }
+                       if ( !MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) {
+                               continue;
+                       }
+                       $users[] = $titleObj->getText();
+               }
+
+               $this->doQuery( $users, $caller );
+       }
+
        /**
         * Preloads genders for given list of users.
         * @param $users List|String: usernames
@@ -102,26 +142,28 @@ class GenderCache {
        public function doQuery( $users, $caller = '' ) {
                $default = $this->getDefault();
 
-               foreach ( (array) $users as $index => $value ) {
-                       $name = strtr( $value, '_', ' ' );
-                       if ( isset( $this->cache[$name] ) ) {
-                               // Skip users whose gender setting we already know
-                               unset( $users[$index] );
-                       } else {
-                               $users[$index] = $name;
+               $usersToCheck = array();
+               foreach ( (array) $users as $value ) {
+                       $name = self::normalizeUsername( $value );
+                       // Skip users whose gender setting we already know
+                       if ( !isset( $this->cache[$name] ) ) {
                                // For existing users, this value will be overwritten by the correct value
                                $this->cache[$name] = $default;
+                               // query only for valid names, which can be in the database
+                               if( User::isValidUserName( $name ) ) {
+                                       $usersToCheck[] = $name;
+                               }
                        }
                }
 
-               if ( count( $users ) === 0 ) {
+               if ( count( $usersToCheck ) === 0 ) {
                        return;
                }
 
                $dbr = wfGetDB( DB_SLAVE );
                $table = array( 'user', 'user_properties' );
                $fields = array( 'user_name', 'up_value' );
-               $conds = array( 'user_name' => $users );
+               $conds = array( 'user_name' => $usersToCheck );
                $joins = array( 'user_properties' =>
                        array( 'LEFT JOIN', array( 'user_id = up_user', 'up_property' => 'gender' ) ) );
 
@@ -129,11 +171,20 @@ class GenderCache {
                if ( strval( $caller ) !== '' ) {
                        $comment .= "/$caller";
                }
-               $res = $dbr->select( $table, $fields, $conds, $comment, $joins, $joins );
+               $res = $dbr->select( $table, $fields, $conds, $comment, array(), $joins );
 
                foreach ( $res as $row ) {
                        $this->cache[$row->user_name] = $row->up_value ? $row->up_value : $default;
                }
        }
 
+       private static function normalizeUsername( $username ) {
+               // Strip off subpages
+               $indexSlash = strpos( $username, '/' );
+               if ( $indexSlash !== false ) {
+                       $username = substr( $username, 0, $indexSlash );
+               }
+               // normalize underscore/spaces
+               return strtr( $username, '_', ' ' );
+       }
 }
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..6bfeed3 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
@@ -118,6 +142,8 @@ class HTMLFileCache extends FileCacheBase {
                                wfDebug( __METHOD__ . " uncompressing cache file and sending it\n" );
                                readgzfile( $filename );
                        }
+               } else {
+                       readfile( $filename );
                }
                $context->getOutput()->disable(); // tell $wgOut that output is taken care of
        }
index 29fde03..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
@@ -195,7 +216,7 @@ class LinkBatch {
                }
 
                $genderCache = GenderCache::singleton();
-               $genderCache->dolinkBatch( $this->data, $this->caller );
+               $genderCache->doLinkBatch( $this->data, $this->caller );
                return true;
        }
 
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..24f32d6 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
  */
@@ -115,6 +132,7 @@ class MessageCache {
        function getParserOptions() {
                if ( !$this->mParserOptions ) {
                        $this->mParserOptions = new ParserOptions;
+                       $this->mParserOptions->setEditSection( false );
                }
                return $this->mParserOptions;
        }
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
  */
diff --git a/includes/dao/IDBAccessObject.php b/includes/dao/IDBAccessObject.php
new file mode 100644 (file)
index 0000000..cd5dda9
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+/**
+ * This file contains database access object related constants.
+ *
+ * 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 Database
+ */
+
+/**
+ * Interface for database access objects
+ */
+interface IDBAccessObject {
+       const LATEST_READ  = 1; // read from the master
+       const FOR_UPDATE   = 2; // lock the rows read
+       const LOCKING_READ = 3; // LATEST_READ | FOR_UPDATE
+       const AVOID_MASTER = 4; // avoiding checking the master
+}
index bd0895c..4e43642 100644 (file)
@@ -20,6 +20,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Database
  */
 
index 5c03617..0a1f988 100644 (file)
@@ -2,10 +2,26 @@
 /**
  * @defgroup Database Database
  *
+ * This file deals with database interface functions
+ * and query specifics/optimisations.
+ *
+ * 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 Database
- * This file deals with database interface functions
- * and query specifics/optimisations
  */
 
 /** Number of times to re-try an operation in case of deadlock */
@@ -514,7 +530,11 @@ abstract class DatabaseBase implements DatabaseType {
         *   - DBO_PERSISTENT: use persistant database connection
         */
        function setFlag( $flag ) {
+               global $wgDebugDBTransactions;
                $this->mFlags |= $flag;
+               if ( ( $flag & DBO_TRX) & $wgDebugDBTransactions ) {
+                       wfDebug("Implicit transactions are now  disabled.\n");
+               }
        }
 
        /**
@@ -523,7 +543,11 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $flag: same as setFlag()'s $flag param
         */
        function clearFlag( $flag ) {
+               global $wgDebugDBTransactions;
                $this->mFlags &= ~$flag;
+               if ( ( $flag & DBO_TRX ) && $wgDebugDBTransactions ) {
+                       wfDebug("Implicit transactions are now disabled.\n");
+               }
        }
 
        /**
@@ -588,15 +612,21 @@ abstract class DatabaseBase implements DatabaseType {
        function __construct( $server = false, $user = false, $password = false, $dbName = false,
                $flags = 0, $tablePrefix = 'get from global'
        ) {
-               global $wgDBprefix, $wgCommandLineMode;
+               global $wgDBprefix, $wgCommandLineMode, $wgDebugDBTransactions;
 
                $this->mFlags = $flags;
 
                if ( $this->mFlags & DBO_DEFAULT ) {
                        if ( $wgCommandLineMode ) {
                                $this->mFlags &= ~DBO_TRX;
+                               if ( $wgDebugDBTransactions ) {
+                                       wfDebug("Implicit transaction open disabled.\n");
+                               }
                        } else {
                                $this->mFlags |= DBO_TRX;
+                               if ( $wgDebugDBTransactions ) {
+                                       wfDebug("Implicit transaction open enabled.\n");
+                               }
                        }
                }
 
@@ -782,7 +812,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 );
        }
 
        /**
@@ -852,8 +882,13 @@ abstract class DatabaseBase implements DatabaseType {
                        # that would delay transaction initializations to once connection
                        # is really used by application
                        $sqlstart = substr( $sql, 0, 10 ); // very much worth it, benchmark certified(tm)
-                       if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 )
+                       if ( strpos( $sqlstart, "SHOW " ) !== 0 && strpos( $sqlstart, "SET " ) !== 0 ) {
+                               global $wgDebugDBTransactions;
+                               if ( $wgDebugDBTransactions ) {
+                                       wfDebug("Implicit transaction start.\n");
+                               }
                                $this->begin( __METHOD__ . " ($fname)" );
+                       }
                }
 
                if ( $this->debug() ) {
@@ -1459,6 +1494,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 );
 
@@ -2868,7 +2904,7 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Begin a transaction, committing any previously open transaction
+        * Begin a transaction
         *
         * @param $fname string
         */
@@ -3347,6 +3383,18 @@ abstract class DatabaseBase implements DatabaseType {
                return 'CONCAT(' . implode( ',', $stringList ) . ')';
        }
 
+       /**
+        * Check to see if a named lock is available. This is non-blocking.
+        *
+        * @param $lockName String: name of lock to poll
+        * @param $method String: name of method calling us
+        * @return Boolean
+        * @since 1.20
+        */
+       public function lockIsFree( $lockName, $method ) {
+               return true;
+       }
+
        /**
         * Acquire a named lock
         *
@@ -3477,4 +3525,11 @@ abstract class DatabaseBase implements DatabaseType {
        public function setBigSelects( $value = true ) {
                // no-op
        }
+
+       /**
+        * @since 1.19
+        */
+       public function __toString() {
+               return (string)$this->mConn;
+       }
 }
index 836d781..53341c3 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * This file contains database error classes.
+ *
+ * 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 Database
+ */
 
 /**
  * Database error base class
@@ -189,7 +210,7 @@ class DBConnectionError extends DBError {
         * @return string
         */
        function searchForm() {
-               global $wgSitename, $wgServer, $wgRequest;
+               global $wgSitename, $wgCanonicalServer, $wgRequest;
 
                $usegoogle = htmlspecialchars( $this->msg( 'dberr-usegoogle', 'You can try searching via Google in the meantime.' ) );
                $outofdate = htmlspecialchars( $this->msg( 'dberr-outofdate', 'Note that their indexes of our content may be out of date.' ) );
@@ -197,7 +218,7 @@ class DBConnectionError extends DBError {
 
                $search = htmlspecialchars( $wgRequest->getVal( 'search' ) );
 
-               $server = htmlspecialchars( $wgServer );
+               $server = htmlspecialchars( $wgCanonicalServer );
                $sitename = htmlspecialchars( $wgSitename );
 
                $trygoogle = <<<EOT
index c9c311d..1fdcd5c 100644 (file)
@@ -2,7 +2,22 @@
 /**
  * This is the IBM DB2 database abstraction layer.
  * See maintenance/ibm_db2/README for development notes
- * and other specific information
+ * and other specific information.
+ *
+ * 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 Database
@@ -1418,7 +1433,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
                // db2_ping() doesn't exist
                // Emulate
                $this->close();
-               $this->mConn = $this->openUncataloged( $this->mDBName, $this->mUser,
+               $this->openUncataloged( $this->mDBName, $this->mUser,
                        $this->mPassword, $this->mServer, $this->mPort );
 
                return false;
index 61963b6..7a75e1e 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the MS SQL Server Native database abstraction layer.
  *
+ * 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 Database
  * @author Joel Penner <a-joelpe at microsoft dot com>
index 4fce0a5..1d03073 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the MySQL database abstraction layer.
  *
+ * 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 Database
  */
@@ -98,14 +113,14 @@ class DatabaseMysql extends DatabaseBase {
                $phpError = $this->restoreErrorHandler();
                # Always log connection errors
                if ( !$this->mConn ) {
-                       $error = $this->lastError();
+                       $error = $phpError;
                        if ( !$error ) {
-                               $error = $phpError;
+                               $error = $this->lastError();
                        }
                        wfLogDBError( "Error connecting to {$this->mServer}: $error\n" );
                        wfDebug( "DB connection error\n" );
                        wfDebug( "Server: $server, User: $user, Password: " .
-                               substr( $password, 0, 3 ) . "..., error: " . mysql_error() . "\n" );
+                               substr( $password, 0, 3 ) . "..., error: " . $error . "\n" );
                }
 
                wfProfileOut("dbconnect-$server");
@@ -671,6 +686,21 @@ class DatabaseMysql extends DatabaseBase {
                return parent::streamStatementEnd( $sql, $newLine );
        }
 
+       /**
+        * Check to see if a named lock is available. This is non-blocking.
+        *
+        * @param $lockName String: name of lock to poll
+        * @param $method String: name of method calling us
+        * @return Boolean
+        * @since 1.20
+        */
+       public function lockIsFree( $lockName, $method ) {
+               $lockName = $this->addQuotes( $lockName );
+               $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
+               $row = $this->fetchObject( $result );
+               return ( $row->lockstatus == 1 );
+       }
+
        /**
         * @param $lockName string
         * @param $method string
@@ -700,7 +730,7 @@ class DatabaseMysql extends DatabaseBase {
                $lockName = $this->addQuotes( $lockName );
                $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
                $row = $this->fetchObject( $result );
-               return $row->lockstatus;
+               return ( $row->lockstatus == 1 );
        }
 
        /**
index 58cb28b..8ce6e70 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the Oracle database abstraction layer.
  *
+ * 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 Database
  */
index fc9c65a..763ca52 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * This is the Postgres database abstraction layer.
  *
+ * 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 Database
  */
@@ -122,14 +137,14 @@ class PostgresTransactionState {
 
        static $WATCHED = array(
                array(
-                       "desc" => "Connection state changed from %s -> %s\n",
+                       "desc" => "%s: Connection state changed from %s -> %s\n",
                        "states" => array(
                                PGSQL_CONNECTION_OK       => "OK",
                                PGSQL_CONNECTION_BAD      => "BAD"
                        )
                ),
                array(
-                       "desc" => "Transaction state changed from %s -> %s\n",
+                       "desc" => "%s: Transaction state changed from %s -> %s\n",
                        "states" => array(
                                PGSQL_TRANSACTION_IDLE    => "IDLE",
                                PGSQL_TRANSACTION_ACTIVE  => "ACTIVE",
@@ -183,12 +198,86 @@ class PostgresTransactionState {
 
        protected function log_changed( $old, $new, $watched ) {
                wfDebug(sprintf($watched["desc"],
+                       $this->mConn,
                        $this->describe_changed( $old, $watched["states"] ),
                        $this->describe_changed( $new, $watched["states"] ))
                );
        }
 }
 
+/**
+ * Manage savepoints within a transaction
+ * @ingroup Database
+ * @since 1.19
+ */
+class SavepointPostgres {
+       /**
+        * Establish a savepoint within a transaction
+        */
+       protected $dbw;
+       protected $id;
+       protected $didbegin;
+
+       public function __construct ($dbw, $id) {
+               $this->dbw = $dbw;
+               $this->id = $id;
+               $this->didbegin = false;
+               /* If we are not in a transaction, we need to be for savepoint trickery */
+               if ( !$dbw->trxLevel() ) {
+                               $dbw->begin( "FOR SAVEPOINT" );
+                               $this->didbegin = true;
+               }
+       }
+
+       public function __destruct() {
+               if ( $this->didbegin ) {
+                       $this->dbw->rollback();
+               }
+       }
+
+       public function commit() {
+               if ( $this->didbegin ) {
+                       $this->dbw->commit();
+               }
+       }
+
+       protected function query( $keyword, $msg_ok, $msg_failed ) {
+               global $wgDebugDBTransactions;
+               if ( $this->dbw->doQuery( $keyword . " " . $this->id ) !== false ) {
+                       if ( $wgDebugDBTransactions ) {
+                               wfDebug( sprintf ($msg_ok, $this->id ) );
+                       }
+               } else {
+                       wfDebug( sprintf ($msg_failed, $this->id ) );
+               }
+       }
+
+       public function savepoint() {
+               $this->query("SAVEPOINT",
+                       "Transaction state: savepoint \"%s\" established.\n",
+                       "Transaction state: establishment of savepoint \"%s\" FAILED.\n"
+               );
+       }
+
+       public function release() {
+               $this->query("RELEASE",
+                       "Transaction state: savepoint \"%s\" released.\n",
+                       "Transaction state: release of savepoint \"%s\" FAILED.\n"
+               );
+       }
+
+       public function rollback() {
+               $this->query("ROLLBACK TO",
+                       "Transaction state: savepoint \"%s\" rolled back.\n",
+                       "Transaction state: rollback of savepoint \"%s\" FAILED.\n"
+               );
+       }
+
+       public function __toString() {
+               return (string)$this->id;
+       }
+}
+
 /**
  * @ingroup Database
  */
@@ -330,7 +419,7 @@ class DatabasePostgres extends DatabaseBase {
                return pg_close( $this->mConn );
        }
 
-       protected function doQuery( $sql ) {
+       public function doQuery( $sql ) {
                if ( function_exists( 'mb_convert_encoding' ) ) {
                        $sql = mb_convert_encoding( $sql, 'UTF-8' );
                }
@@ -559,7 +648,7 @@ class DatabasePostgres extends DatabaseBase {
                                i.indoption[s.g] as option,
                                pg_am.amname
                        FROM
-                               (SELECT generate_subscripts(isub.indkey, 1) AS g
+                               (SELECT generate_series(array_lower(isub.indkey,1), array_upper(isub.indkey,1)) AS g
                                        FROM
                                                pg_index isub
                                        JOIN pg_class cis
@@ -652,15 +741,9 @@ __INDEXATTR__;
                }
 
                // If IGNORE is set, we use savepoints to emulate mysql's behavior
-               $ignore = in_array( 'IGNORE', $options ) ? 'mw' : '';
-
-               // If we are not in a transaction, we need to be for savepoint trickery
-               $didbegin = 0;
-               if ( $ignore ) {
-                       if ( !$this->mTrxLevel ) {
-                               $this->begin( __METHOD__ );
-                               $didbegin = 1;
-                       }
+               $savepoint = null;
+               if ( in_array( 'IGNORE', $options ) ) {
+                       $savepoint = new SavepointPostgres( $this, 'mw' );
                        $olde = error_reporting( 0 );
                        // For future use, we may want to track the number of actual inserts
                        // Right now, insert (all writes) simply return true/false
@@ -670,7 +753,7 @@ __INDEXATTR__;
                $sql = "INSERT INTO $table (" . implode( ',', $keys ) . ') VALUES ';
 
                if ( $multi ) {
-                       if ( $this->numeric_version >= 8.2 && !$ignore ) {
+                       if ( $this->numeric_version >= 8.2 && !$savepoint ) {
                                $first = true;
                                foreach ( $args as $row ) {
                                        if ( $first ) {
@@ -680,7 +763,7 @@ __INDEXATTR__;
                                        }
                                        $sql .= '(' . $this->makeList( $row ) . ')';
                                }
-                               $res = (bool)$this->query( $sql, $fname, $ignore );
+                               $res = (bool)$this->query( $sql, $fname, $savepoint );
                        } else {
                                $res = true;
                                $origsql = $sql;
@@ -688,18 +771,18 @@ __INDEXATTR__;
                                        $tempsql = $origsql;
                                        $tempsql .= '(' . $this->makeList( $row ) . ')';
 
-                                       if ( $ignore ) {
-                                               $this->doQuery( "SAVEPOINT $ignore" );
+                                       if ( $savepoint ) {
+                                               $savepoint->savepoint();
                                        }
 
-                                       $tempres = (bool)$this->query( $tempsql, $fname, $ignore );
+                                       $tempres = (bool)$this->query( $tempsql, $fname, $savepoint );
 
-                                       if ( $ignore ) {
+                                       if ( $savepoint ) {
                                                $bar = pg_last_error();
                                                if ( $bar != false ) {
-                                                       $this->doQuery( $this->mConn, "ROLLBACK TO $ignore" );
+                                                       $savepoint->rollback();
                                                } else {
-                                                       $this->doQuery( $this->mConn, "RELEASE $ignore" );
+                                                       $savepoint->release();
                                                        $numrowsinserted++;
                                                }
                                        }
@@ -713,27 +796,25 @@ __INDEXATTR__;
                        }
                } else {
                        // Not multi, just a lone insert
-                       if ( $ignore ) {
-                               $this->doQuery( "SAVEPOINT $ignore" );
+                       if ( $savepoint ) {
+                               $savepoint->savepoint();
                        }
 
                        $sql .= '(' . $this->makeList( $args ) . ')';
-                       $res = (bool)$this->query( $sql, $fname, $ignore );
-                       if ( $ignore ) {
+                       $res = (bool)$this->query( $sql, $fname, $savepoint );
+                       if ( $savepoint ) {
                                $bar = pg_last_error();
                                if ( $bar != false ) {
-                                       $this->doQuery( "ROLLBACK TO $ignore" );
+                                       $savepoint->rollback();
                                } else {
-                                       $this->doQuery( "RELEASE $ignore" );
+                                       $savepoint->release();
                                        $numrowsinserted++;
                                }
                        }
                }
-               if ( $ignore ) {
+               if ( $savepoint ) {
                        $olde = error_reporting( $olde );
-                       if ( $didbegin ) {
-                               $this->commit( __METHOD__ );
-                       }
+                       $savepoint->commit();
 
                        // Set the affected row count for the whole operation
                        $this->mAffectedRows = $numrowsinserted;
@@ -759,12 +840,22 @@ __INDEXATTR__;
        {
                $destTable = $this->tableName( $destTable );
 
-               // If IGNORE is set, we use savepoints to emulate mysql's behavior
-               $ignore = in_array( 'IGNORE', $insertOptions ) ? 'mw' : '';
+               if( !is_array( $insertOptions ) ) {
+                       $insertOptions = array( $insertOptions );
+               }
 
-               if( is_array( $insertOptions ) ) {
-                       $insertOptions = implode( ' ', $insertOptions ); // FIXME: This is unused
+               /*
+                * If IGNORE is set, we use savepoints to emulate mysql's behavior
+                * Ignore LOW PRIORITY option, since it is MySQL-specific
+                */
+               $savepoint = null;
+               if ( in_array( 'IGNORE', $insertOptions ) ) {
+                       $savepoint = new SavepointPostgres( $this, 'mw' );
+                       $olde = error_reporting( 0 );
+                       $numrowsinserted = 0;
+                       $savepoint->savepoint();
                }
+
                if( !is_array( $selectOptions ) ) {
                        $selectOptions = array( $selectOptions );
                }
@@ -775,18 +866,6 @@ __INDEXATTR__;
                        $srcTable = $this->tableName( $srcTable );
                }
 
-               // If we are not in a transaction, we need to be for savepoint trickery
-               $didbegin = 0;
-               if ( $ignore ) {
-                       if( !$this->mTrxLevel ) {
-                               $this->begin( __METHOD__ );
-                               $didbegin = 1;
-                       }
-                       $olde = error_reporting( 0 );
-                       $numrowsinserted = 0;
-                       $this->doQuery( "SAVEPOINT $ignore" );
-               }
-
                $sql = "INSERT INTO $destTable (" . implode( ',', array_keys( $varMap ) ) . ')' .
                                " SELECT $startOpts " . implode( ',', $varMap ) .
                                " FROM $srcTable $useIndex";
@@ -797,19 +876,17 @@ __INDEXATTR__;
 
                $sql .= " $tailOpts";
 
-               $res = (bool)$this->query( $sql, $fname, $ignore );
-               if( $ignore ) {
+               $res = (bool)$this->query( $sql, $fname, $savepoint );
+               if( $savepoint ) {
                        $bar = pg_last_error();
                        if( $bar != false ) {
-                               $this->doQuery( "ROLLBACK TO $ignore" );
+                               $savepoint->rollback();
                        } else {
-                               $this->doQuery( "RELEASE $ignore" );
+                               $savepoint->release();
                                $numrowsinserted++;
                        }
                        $olde = error_reporting( $olde );
-                       if( $didbegin ) {
-                               $this->commit( __METHOD__ );
-                       }
+                       $savepoint->commit();
 
                        // Set the affected row count for the whole operation
                        $this->mAffectedRows = $numrowsinserted;
@@ -1041,7 +1118,7 @@ __INDEXATTR__;
         * This will be also called by the installer after the schema is created
         *
         * @since 1.19
-        * @param desired_schema string
+        * @param $desired_schema string
         */
        function determineCoreSchema( $desired_schema ) {
                $this->begin( __METHOD__ );
index dc086b4..15d1ad0 100644 (file)
@@ -3,6 +3,21 @@
  * This is the SQLite database abstraction layer.
  * See maintenance/sqlite/README for development notes and other specific information
  *
+ * 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 Database
  */
index 0ea713c..eacebcf 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * This file contains database-related utiliy classes.
+ *
+ * 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 Database
+ */
+
 /**
  * Utility class.
  * @ingroup Database
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
new file mode 100644 (file)
index 0000000..a530620
--- /dev/null
@@ -0,0 +1,273 @@
+<?php
+/**
+ * Interface for representing objects that are stored in some DB table.
+ * This is basically an ORM-like wrapper around rows in database tables that
+ * aims to be both simple and very flexible. It is centered around an associative
+ * array of fields and various methods to do common interaction with the 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
+ *
+ * @since 1.20
+ *
+ * @file
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+interface IORMRow {
+
+
+       /**
+        * Constructor.
+        *
+        * @since 1.20
+        *
+        * @param IORMTable $table
+        * @param array|null $fields
+        * @param boolean $loadDefaults
+        */
+       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false );
+
+       /**
+        * Load the specified fields from the database.
+        *
+        * @since 1.20
+        *
+        * @param array|null $fields
+        * @param boolean $override
+        * @param boolean $skipLoaded
+        *
+        * @return bool Success indicator
+        */
+       public function loadFields( $fields = null, $override = true, $skipLoaded = false );
+
+       /**
+        * Gets the value of a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $default
+        *
+        * @throws MWException
+        * @return mixed
+        */
+       public function getField( $name, $default = null );
+
+       /**
+        * Gets the value of a field but first loads it if not done so already.
+        *
+        * @since 1.20
+        *
+        * @param string$name
+        *
+        * @return mixed
+        */
+       public function loadAndGetField( $name );
+
+       /**
+        * Remove a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        */
+       public function removeField( $name );
+
+       /**
+        * Returns the objects database id.
+        *
+        * @since 1.20
+        *
+        * @return integer|null
+        */
+       public function getId();
+
+       /**
+        * Sets the objects database id.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $id
+        */
+       public function setId( $id );
+
+       /**
+        * Gets if a certain field is set.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function hasField( $name );
+
+       /**
+        * Gets if the id field is set.
+        *
+        * @since 1.20
+        *
+        * @return boolean
+        */
+       public function hasIdField();
+
+       /**
+        * Sets multiple fields.
+        *
+        * @since 1.20
+        *
+        * @param array $fields The fields to set
+        * @param boolean $override Override already set fields with the provided values?
+        */
+       public function setFields( array $fields, $override = true );
+
+       /**
+        * Serializes the object to an associative array which
+        * can then easily be converted into JSON or similar.
+        *
+        * @since 1.20
+        *
+        * @param null|array $fields
+        * @param boolean $incNullId
+        *
+        * @return array
+        */
+       public function toArray( $fields = null, $incNullId = false );
+
+       /**
+        * Load the default values, via getDefaults.
+        *
+        * @since 1.20
+        *
+        * @param boolean $override
+        */
+       public function loadDefaults( $override = true );
+
+       /**
+        * Writes the answer to the database, either updating it
+        * when it already exists, or inserting it when it doesn't.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function save( $functionName = null );
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @return boolean Success indicator
+        */
+       public function remove();
+
+       /**
+        * Return the names and values of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFields();
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSetFieldNames();
+
+       /**
+        * Sets the value of a field.
+        * Strings can be provided for other types,
+        * so this method can be called from unserialization handlers.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $value
+        *
+        * @throws MWException
+        */
+       public function setField( $name, $value );
+
+       /**
+        * Add an amount (can be negative) to the specified field (needs to be numeric).
+        * TODO: most off this stuff makes more sense in the table class
+        *
+        * @since 1.20
+        *
+        * @param string $field
+        * @param integer $amount
+        *
+        * @return boolean Success indicator
+        */
+       public function addToField( $field, $amount );
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames();
+
+       /**
+        * Computes and updates the values of the summary fields.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        */
+       public function loadSummaryFields( $summaryFields = null );
+
+       /**
+        * Sets the value for the @see $updateSummaries field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $update
+        */
+       public function setUpdateSummaries( $update );
+
+       /**
+        * Sets the value for the @see $inSummaryMode field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $summaryMode
+        */
+       public function setSummaryMode( $summaryMode );
+
+       /**
+        * Returns the table this IORMRow is a row in.
+        *
+        * @since 1.20
+        *
+        * @return IORMTable
+        */
+       public function getTable();
+
+}
\ No newline at end of file
diff --git a/includes/db/IORMTable.php b/includes/db/IORMTable.php
new file mode 100644 (file)
index 0000000..8fa7220
--- /dev/null
@@ -0,0 +1,447 @@
+<?php
+/**
+ * Interface for objects representing a single database 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
+ *
+ * @since 1.20
+ *
+ * @file
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+interface IORMTable {
+
+       /**
+        * Returns the name of the database table objects of this type are stored in.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function getName();
+
+       /**
+        * Returns the name of a IORMRow implementing class that
+        * represents single rows in this table.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function getRowClass();
+
+       /**
+        * Returns an array with the fields and their types this object contains.
+        * This corresponds directly to the fields in the database, without prefix.
+        *
+        * field name => type
+        *
+        * Allowed types:
+        * * id
+        * * str
+        * * int
+        * * float
+        * * bool
+        * * array
+        * * blob
+        *
+        * TODO: get rid of the id field. Every row instance needs to have
+        * one so this is just causing hassle at various locations by requiring an extra check for field name.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFields();
+
+       /**
+        * Returns a list of default field values.
+        * field name => field value
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getDefaults();
+
+       /**
+        * Returns a list of the summary fields.
+        * These are fields that cache computed values, such as the amount of linked objects of $type.
+        * This is relevant as one might not want to do actions such as log changes when these get updated.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSummaryFields();
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ORMResult
+        */
+       public function select( $fields = null, array $conditions = array(),
+                                                       array $options = array(), $functionName = null );
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return array of self
+        */
+       public function selectObjects( $fields = null, array $conditions = array(),
+                                                                  array $options = array(), $functionName = null );
+
+       /**
+        * Do the actual select.
+        *
+        * @since 1.20
+        *
+        * @param null|string|array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param null|string $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelect( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName = null );
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as associative arrays.
+        * Provided field names get prefixed.
+        * Returned field names will not have a prefix.
+        *
+        * When $collapse is true:
+        * If one field is selected, each item in the result array will be this field.
+        * If two fields are selected, each item in the result array will have as key
+        * the first field and as value the second field.
+        * If more then two fields are selected, each item will be an associative array.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return array of array
+        */
+       public function selectFields( $fields = null, array $conditions = array(),
+                                                                 array $options = array(), $collapse = true, $functionName = null );
+
+       /**
+        * Selects the the specified fields of the first matching record.
+        * Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return IORMRow|bool False on failure
+        */
+       public function selectRow( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName = null );
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions. Field names do NOT get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelectRow( array $fields, array $conditions = array(),
+                                                                 array $options = array(), $functionName = null );
+
+       /**
+        * Selects the the specified fields of the first record matching the provided
+        * conditions and returns it as an associative array, or false when nothing matches.
+        * This method makes use of selectFields and expects the same parameters and
+        * returns the same results (if there are any, if there are none, this method returns false).
+        * @see IORMTable::selectFields
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return mixed|array|bool False on failure
+        */
+       public function selectFieldsRow( $fields = null, array $conditions = array(),
+                                                                        array $options = array(), $collapse = true, $functionName = null );
+
+       /**
+        * Returns if there is at least one record matching the provided conditions.
+        * Condition field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        *
+        * @return boolean
+        */
+       public function has( array $conditions = array() );
+
+       /**
+        * Returns the amount of matching records.
+        * Condition field names get prefixed.
+        *
+        * Note that this can be expensive on large tables.
+        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param array $options
+        *
+        * @return integer
+        */
+       public function count( array $conditions = array(), array $options = array() );
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function delete( array $conditions, $functionName = null );
+
+       /**
+        * Get API parameters for the fields supported by this object.
+        *
+        * @since 1.20
+        *
+        * @param boolean $requireParams
+        * @param boolean $setDefaults
+        *
+        * @return array
+        */
+       public function getAPIParams( $requireParams = false, $setDefaults = false );
+
+       /**
+        * Returns an array with the fields and their descriptions.
+        *
+        * field name => field description
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldDescriptions();
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @since 1.20
+        *
+        * @return integer DB_ enum
+        */
+       public function getReadDb();
+
+       /**
+        * Set the database type to use for read operations.
+        *
+        * @param integer $db
+        *
+        * @since 1.20
+        */
+       public function setReadDb( $db );
+
+       /**
+        * Update the records matching the provided conditions by
+        * setting the fields that are keys in the $values param to
+        * their corresponding values.
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        * @param array $conditions
+        *
+        * @return boolean Success indicator
+        */
+       public function update( array $values, array $conditions = array() );
+
+       /**
+        * Computes the values of the summary fields of the objects matching the provided conditions.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        * @param array $conditions
+        */
+       public function updateSummaryFields( $summaryFields = null, array $conditions = array() );
+
+       /**
+        * Takes in an associative array with field names as keys and
+        * their values as value. The field names are prefixed with the
+        * db field prefix.
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        *
+        * @return array
+        */
+       public function getPrefixedValues( array $values );
+
+       /**
+        * Takes in a field or array of fields and returns an
+        * array with their prefixed versions, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param array|string $fields
+        *
+        * @return array
+        */
+       public function getPrefixedFields( array $fields );
+
+       /**
+        * Takes in a field and returns an it's prefixed version, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param string|array $field
+        *
+        * @return string
+        */
+       public function getPrefixedField( $field );
+
+       /**
+        * Takes an array of field names with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param array $fieldNames
+        *
+        * @return array
+        */
+       public function unprefixFieldNames( array $fieldNames );
+
+       /**
+        * Takes a field name with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param string $fieldName
+        *
+        * @return string
+        */
+       public function unprefixFieldName( $fieldName );
+
+       /**
+        * Get an instance of this class.
+        *
+        * @since 1.20
+        *
+        * @return IORMTable
+        */
+       public static function singleton();
+
+       /**
+        * Get an array with fields from a database result,
+        * that can be fed directly to the constructor or
+        * to setFields.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return array
+        */
+       public function getFieldsFromDBResult( stdClass $result );
+
+       /**
+        * Get a new instance of the class from a database result.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return IORMRow
+        */
+       public function newFromDBResult( stdClass $result );
+
+       /**
+        * Get a new instance of the class from an array.
+        *
+        * @since 1.20
+        *
+        * @param array $data
+        * @param boolean $loadDefaults
+        *
+        * @return IORMRow
+        */
+       public function newFromArray( array $data, $loadDefaults = false );
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames();
+
+       /**
+        * Gets if the object can take a certain field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function canHaveField( $name );
+
+}
index dec6ae1..aaca12c 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Generator of database load balancing objects
+ * Generator of database load balancing 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 Database
index b7977a2..6008813 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Advanced generator of database load balancing objects for wiki farms
+ * Advanced generator of database load balancing objects for wiki farms.
+ *
+ * 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 Database
index f80aa4b..4b165b2 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Simple generator of database connections that always returns the same object.
+ *
+ * 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 Database
+ */
 
 /**
  * An LBFactory class that always returns a single database object.
index db348e8..c40ac0c 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Database load balancing
+ * Database load balancing.
+ *
+ * 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 Database
index 16a0343..146ac61 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Database load monitoring
+ * Database load monitoring.
+ *
+ * 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 Database
diff --git a/includes/db/ORMIterator.php b/includes/db/ORMIterator.php
new file mode 100644 (file)
index 0000000..090b893
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * Interface for Iterators containing IORMRows.
+ *
+ * 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
+ *
+ * @since 1.20
+ *
+ * @file
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface ORMIterator extends Iterator {
+
+}
\ No newline at end of file
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
new file mode 100644 (file)
index 0000000..1342b02
--- /dev/null
@@ -0,0 +1,121 @@
+<?php
+/**
+ * ORMIterator that takes a ResultWrapper object returned from
+ * a select operation returning IORMRow objects (ie IORMTable::select).
+ *
+ * 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
+ *
+ * @since 1.20
+ *
+ * @file ORMResult.php
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+class ORMResult implements ORMIterator {
+
+       /**
+        * @var ResultWrapper
+        */
+       protected $res;
+
+       /**
+        * @var integer
+        */
+       protected $key;
+
+       /**
+        * @var IORMRow
+        */
+       protected $current;
+
+       /**
+        * @var IORMTable
+        */
+       protected $table;
+
+       /**
+        * @param IORMTable $table
+        * @param ResultWrapper $res
+        */
+       public function __construct( IORMTable $table, ResultWrapper $res ) {
+               $this->table = $table;
+               $this->res = $res;
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @param $row
+        */
+       protected function setCurrent( $row ) {
+               if ( $row === false ) {
+                       $this->current = false;
+               } else {
+                       $this->current = $this->table->newFromDBResult( $row );
+               }
+       }
+
+       /**
+        * @return integer
+        */
+       public function count() {
+               return $this->res->numRows();
+       }
+
+       /**
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->res->numRows() === 0;
+       }
+
+       /**
+        * @return IORMRow
+        */
+       public function current() {
+               return $this->current;
+       }
+
+       /**
+        * @return integer
+        */
+       public function key() {
+               return $this->key;
+       }
+
+       public function next() {
+               $row = $this->res->next();
+               $this->setCurrent( $row );
+               $this->key++;
+       }
+
+       public function rewind() {
+               $this->res->rewind();
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @return boolean
+        */
+       public function valid() {
+               return $this->current !== false;
+       }
+
+}
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
new file mode 100644 (file)
index 0000000..6f19fe1
--- /dev/null
@@ -0,0 +1,661 @@
+<?php
+/**
+ * Abstract base class for representing objects that are stored in some DB table.
+ * This is basically an ORM-like wrapper around rows in database tables that
+ * aims to be both simple and very flexible. It is centered around an associative
+ * array of fields and various methods to do common interaction with the 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
+ *
+ * @since 1.20
+ *
+ * @file ORMRow.php
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+abstract class ORMRow implements IORMRow {
+
+       /**
+        * The fields of the object.
+        * field name (w/o prefix) => value
+        *
+        * @since 1.20
+        * @var array
+        */
+       protected $fields = array( 'id' => null );
+
+       /**
+        * @since 1.20
+        * @var ORMTable
+        */
+       protected $table;
+
+       /**
+        * If the object should update summaries of linked items when changed.
+        * For example, update the course_count field in universities when a course in courses is deleted.
+        * Settings this to false can prevent needless updating work in situations
+        * such as deleting a university, which will then delete all it's courses.
+        *
+        * @since 1.20
+        * @var bool
+        */
+       protected $updateSummaries = true;
+
+       /**
+        * Indicates if the object is in summary mode.
+        * This mode indicates that only summary fields got updated,
+        * which allows for optimizations.
+        *
+        * @since 1.20
+        * @var bool
+        */
+       protected $inSummaryMode = false;
+
+       /**
+        * Constructor.
+        *
+        * @since 1.20
+        *
+        * @param IORMTable $table
+        * @param array|null $fields
+        * @param boolean $loadDefaults
+        */
+       public function __construct( IORMTable $table, $fields = null, $loadDefaults = false ) {
+               $this->table = $table;
+
+               if ( !is_array( $fields ) ) {
+                       $fields = array();
+               }
+
+               if ( $loadDefaults ) {
+                       $fields = array_merge( $this->table->getDefaults(), $fields );
+               }
+
+               $this->setFields( $fields );
+       }
+
+       /**
+        * Load the specified fields from the database.
+        *
+        * @since 1.20
+        *
+        * @param array|null $fields
+        * @param boolean $override
+        * @param boolean $skipLoaded
+        *
+        * @return bool Success indicator
+        */
+       public function loadFields( $fields = null, $override = true, $skipLoaded = false ) {
+               if ( is_null( $this->getId() ) ) {
+                       return false;
+               }
+
+               if ( is_null( $fields ) ) {
+                       $fields = array_keys( $this->table->getFields() );
+               }
+
+               if ( $skipLoaded ) {
+                       $fields = array_diff( $fields, array_keys( $this->fields ) );
+               }
+
+               if ( !empty( $fields ) ) {
+                       $result = $this->table->rawSelectRow(
+                               $this->table->getPrefixedFields( $fields ),
+                               array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
+                               array( 'LIMIT' => 1 )
+                       );
+
+                       if ( $result !== false ) {
+                               $this->setFields( $this->table->getFieldsFromDBResult( $result ), $override );
+                               return true;
+                       }
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Gets the value of a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $default
+        *
+        * @throws MWException
+        * @return mixed
+        */
+       public function getField( $name, $default = null ) {
+               if ( $this->hasField( $name ) ) {
+                       return $this->fields[$name];
+               } elseif ( !is_null( $default ) ) {
+                       return $default;
+               } else {
+                       throw new MWException( 'Attempted to get not-set field ' . $name );
+               }
+       }
+
+       /**
+        * Gets the value of a field but first loads it if not done so already.
+        *
+        * @since 1.20
+        *
+        * @param string$name
+        *
+        * @return mixed
+        */
+       public function loadAndGetField( $name ) {
+               if ( !$this->hasField( $name ) ) {
+                       $this->loadFields( array( $name ) );
+               }
+
+               return $this->getField( $name );
+       }
+
+       /**
+        * Remove a field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        */
+       public function removeField( $name ) {
+               unset( $this->fields[$name] );
+       }
+
+       /**
+        * Returns the objects database id.
+        *
+        * @since 1.20
+        *
+        * @return integer|null
+        */
+       public function getId() {
+               return $this->getField( 'id' );
+       }
+
+       /**
+        * Sets the objects database id.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $id
+        */
+       public function setId( $id ) {
+               $this->setField( 'id', $id );
+       }
+
+       /**
+        * Gets if a certain field is set.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function hasField( $name ) {
+               return array_key_exists( $name, $this->fields );
+       }
+
+       /**
+        * Gets if the id field is set.
+        *
+        * @since 1.20
+        *
+        * @return boolean
+        */
+       public function hasIdField() {
+               return $this->hasField( 'id' )
+                       && !is_null( $this->getField( 'id' ) );
+       }
+
+       /**
+        * Sets multiple fields.
+        *
+        * @since 1.20
+        *
+        * @param array $fields The fields to set
+        * @param boolean $override Override already set fields with the provided values?
+        */
+       public function setFields( array $fields, $override = true ) {
+               foreach ( $fields as $name => $value ) {
+                       if ( $override || !$this->hasField( $name ) ) {
+                               $this->setField( $name, $value );
+                       }
+               }
+       }
+
+       /**
+        * Gets the fields => values to write to the table.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getWriteValues() {
+               $values = array();
+
+               foreach ( $this->table->getFields() as $name => $type ) {
+                       if ( array_key_exists( $name, $this->fields ) ) {
+                               $value = $this->fields[$name];
+
+                               switch ( $type ) {
+                                       case 'array':
+                                               $value = (array)$value;
+                                       case 'blob':
+                                               $value = serialize( $value );
+                               }
+
+                               $values[$this->table->getPrefixedField( $name )] = $value;
+                       }
+               }
+
+               return $values;
+       }
+
+       /**
+        * Serializes the object to an associative array which
+        * can then easily be converted into JSON or similar.
+        *
+        * @since 1.20
+        *
+        * @param null|array $fields
+        * @param boolean $incNullId
+        *
+        * @return array
+        */
+       public function toArray( $fields = null, $incNullId = false ) {
+               $data = array();
+               $setFields = array();
+
+               if ( !is_array( $fields ) ) {
+                       $setFields = $this->getSetFieldNames();
+               } else {
+                       foreach ( $fields as $field ) {
+                               if ( $this->hasField( $field ) ) {
+                                       $setFields[] = $field;
+                               }
+                       }
+               }
+
+               foreach ( $setFields as $field ) {
+                       if ( $incNullId || $field != 'id' || $this->hasIdField() ) {
+                               $data[$field] = $this->getField( $field );
+                       }
+               }
+
+               return $data;
+       }
+
+       /**
+        * Load the default values, via getDefaults.
+        *
+        * @since 1.20
+        *
+        * @param boolean $override
+        */
+       public function loadDefaults( $override = true ) {
+               $this->setFields( $this->table->getDefaults(), $override );
+       }
+
+       /**
+        * Writes the answer to the database, either updating it
+        * when it already exists, or inserting it when it doesn't.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function save( $functionName = null ) {
+               if ( $this->hasIdField() ) {
+                       return $this->saveExisting( $functionName );
+               } else {
+                       return $this->insert( $functionName );
+               }
+       }
+
+       /**
+        * Updates the object in the database.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       protected function saveExisting( $functionName = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $success = $dbw->update(
+                       $this->table->getName(),
+                       $this->getWriteValues(),
+                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName
+               );
+
+               // DatabaseBase::update does not always return true for success as documented...
+               return $success !== false;
+       }
+
+       /**
+        * Returns the WHERE considtions needed to identify this object so
+        * it can be updated.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getUpdateConditions() {
+               return array( 'id' => $this->getId() );
+       }
+
+       /**
+        * Inserts the object into the database.
+        *
+        * @since 1.20
+        *
+        * @param string|null $functionName
+        * @param array|null $options
+        *
+        * @return boolean Success indicator
+        */
+       protected function insert( $functionName = null, array $options = null ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $success = $dbw->insert(
+                       $this->table->getName(),
+                       $this->getWriteValues(),
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       is_null( $options ) ? array( 'IGNORE' ) : $options
+               );
+
+               // DatabaseBase::insert does not always return true for success as documented...
+               $success = $success !== false;
+
+               if ( $success ) {
+                       $this->setField( 'id', $dbw->insertId() );
+               }
+
+               return $success;
+       }
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @return boolean Success indicator
+        */
+       public function remove() {
+               $this->beforeRemove();
+
+               $success = $this->table->delete( array( 'id' => $this->getId() ) );
+
+               // DatabaseBase::delete does not always return true for success as documented...
+               $success = $success !== false;
+
+               if ( $success ) {
+                       $this->onRemoved();
+               }
+
+               return $success;
+       }
+
+       /**
+        * Gets called before an object is removed from the database.
+        *
+        * @since 1.20
+        */
+       protected function beforeRemove() {
+               $this->loadFields( $this->getBeforeRemoveFields(), false, true );
+       }
+
+       /**
+        * Before removal of an object happens, @see beforeRemove gets called.
+        * This method loads the fields of which the names have been returned by this one (or all fields if null is returned).
+        * This allows for loading info needed after removal to get rid of linked data and the like.
+        *
+        * @since 1.20
+        *
+        * @return array|null
+        */
+       protected function getBeforeRemoveFields() {
+               return array();
+       }
+
+       /**
+        * Gets called after successfull removal.
+        * Can be overriden to get rid of linked data.
+        *
+        * @since 1.20
+        */
+       protected function onRemoved() {
+               $this->setField( 'id', null );
+       }
+
+       /**
+        * Return the names and values of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFields() {
+               return $this->fields;
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSetFieldNames() {
+               return array_keys( $this->fields );
+       }
+
+       /**
+        * Sets the value of a field.
+        * Strings can be provided for other types,
+        * so this method can be called from unserialization handlers.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        * @param mixed $value
+        *
+        * @throws MWException
+        */
+       public function setField( $name, $value ) {
+               $fields = $this->table->getFields();
+
+               if ( array_key_exists( $name, $fields ) ) {
+                       switch ( $fields[$name] ) {
+                               case 'int':
+                                       $value = (int)$value;
+                                       break;
+                               case 'float':
+                                       $value = (float)$value;
+                                       break;
+                               case 'bool':
+                                       if ( is_string( $value ) ) {
+                                               $value = $value !== '0';
+                                       } elseif ( is_int( $value ) ) {
+                                               $value = $value !== 0;
+                                       }
+                                       break;
+                               case 'array':
+                                       if ( is_string( $value ) ) {
+                                               $value = unserialize( $value );
+                                       }
+
+                                       if ( !is_array( $value ) ) {
+                                               $value = array();
+                                       }
+                                       break;
+                               case 'blob':
+                                       if ( is_string( $value ) ) {
+                                               $value = unserialize( $value );
+                                       }
+                                       break;
+                               case 'id':
+                                       if ( is_string( $value ) ) {
+                                               $value = (int)$value;
+                                       }
+                                       break;
+                       }
+
+                       $this->fields[$name] = $value;
+               } else {
+                       throw new MWException( 'Attempted to set unknown field ' . $name );
+               }
+       }
+
+       /**
+        * Add an amount (can be negative) to the specified field (needs to be numeric).
+        * TODO: most off this stuff makes more sense in the table class
+        *
+        * @since 1.20
+        *
+        * @param string $field
+        * @param integer $amount
+        *
+        * @return boolean Success indicator
+        */
+       public function addToField( $field, $amount ) {
+               if ( $amount == 0 ) {
+                       return true;
+               }
+
+               if ( !$this->hasIdField() ) {
+                       return false;
+               }
+
+               $absoluteAmount = abs( $amount );
+               $isNegative = $amount < 0;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $fullField = $this->table->getPrefixedField( $field );
+
+               $success = $dbw->update(
+                       $this->table->getName(),
+                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
+                       array( $this->table->getPrefixedField( 'id' ) => $this->getId() ),
+                       __METHOD__
+               );
+
+               if ( $success && $this->hasField( $field ) ) {
+                       $this->setField( $field, $this->getField( $field ) + $amount );
+               }
+
+               return $success;
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames() {
+               return array_keys( $this->table->getFields() );
+       }
+
+       /**
+        * Computes and updates the values of the summary fields.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        */
+       public function loadSummaryFields( $summaryFields = null ) {
+
+       }
+
+       /**
+        * Sets the value for the @see $updateSummaries field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $update
+        */
+       public function setUpdateSummaries( $update ) {
+               $this->updateSummaries = $update;
+       }
+
+       /**
+        * Sets the value for the @see $inSummaryMode field.
+        *
+        * @since 1.20
+        *
+        * @param boolean $summaryMode
+        */
+       public function setSummaryMode( $summaryMode ) {
+               $this->inSummaryMode = $summaryMode;
+       }
+
+       /**
+        * Return if any fields got changed.
+        *
+        * @since 1.20
+        *
+        * @param IORMRow $object
+        * @param boolean|array $excludeSummaryFields
+        *  When set to true, summary field changes are ignored.
+        *  Can also be an array of fields to ignore.
+        *
+        * @return boolean
+        */
+       protected function fieldsChanged( IORMRow $object, $excludeSummaryFields = false ) {
+               $exclusionFields = array();
+
+               if ( $excludeSummaryFields !== false ) {
+                       $exclusionFields = is_array( $excludeSummaryFields ) ? $excludeSummaryFields : $this->table->getSummaryFields();
+               }
+
+               foreach ( $this->fields as $name => $value ) {
+                       $excluded = $excludeSummaryFields && in_array( $name, $exclusionFields );
+
+                       if ( !$excluded && $object->getField( $name ) !== $value ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * Returns the table this IORMRow is a row in.
+        *
+        * @since 1.20
+        *
+        * @return IORMTable
+        */
+       public function getTable() {
+               return $this->table;
+       }
+
+}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
new file mode 100644 (file)
index 0000000..b6e2d52
--- /dev/null
@@ -0,0 +1,672 @@
+<?php
+/**
+ * Abstract base class for representing a single database 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
+ *
+ * @since 1.20
+ *
+ * @file ORMTable.php
+ * @ingroup ORM
+ *
+ * @licence GNU GPL v2 or later
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+abstract class ORMTable implements IORMTable {
+
+       /**
+        * Gets the db field prefix.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected abstract function getFieldPrefix();
+
+       /**
+        * Cache for instances, used by the singleton method.
+        *
+        * @since 1.20
+        * @var array of DBTable
+        */
+       protected static $instanceCache = array();
+
+       /**
+        * The database connection to use for read operations.
+        * Can be changed via @see setReadDb.
+        *
+        * @since 1.20
+        * @var integer DB_ enum
+        */
+       protected $readDb = DB_SLAVE;
+
+       /**
+        * Returns a list of default field values.
+        * field name => field value
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getDefaults() {
+               return array();
+       }
+
+       /**
+        * Returns a list of the summary fields.
+        * These are fields that cache computed values, such as the amount of linked objects of $type.
+        * This is relevant as one might not want to do actions such as log changes when these get updated.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getSummaryFields() {
+               return array();
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ORMResult
+        */
+       public function select( $fields = null, array $conditions = array(),
+                                                       array $options = array(), $functionName  = null ) {
+               return new ORMResult( $this, $this->rawSelect( $fields, $conditions, $options, $functionName ) );
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as DBDataObject. Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return array of self
+        */
+       public function selectObjects( $fields = null, array $conditions = array(),
+                                                                  array $options = array(), $functionName  = null ) {
+               $result = $this->selectFields( $fields, $conditions, $options, false, $functionName );
+
+               $objects = array();
+
+               foreach ( $result as $record ) {
+                       $objects[] = $this->newFromArray( $record );
+               }
+
+               return $objects;
+       }
+
+       /**
+        * Do the actual select.
+        *
+        * @since 1.20
+        *
+        * @param null|string|array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param null|string $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelect( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName  = null ) {
+               if ( is_null( $fields ) ) {
+                       $fields = array_keys( $this->getFields() );
+               }
+               else {
+                       $fields = (array)$fields;
+               }
+
+               return wfGetDB( $this->getReadDb() )->select(
+                       $this->getName(),
+                       $this->getPrefixedFields( $fields ),
+                       $this->getPrefixedValues( $conditions ),
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       $options
+               );
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions and returns them as associative arrays.
+        * Provided field names get prefixed.
+        * Returned field names will not have a prefix.
+        *
+        * When $collapse is true:
+        * If one field is selected, each item in the result array will be this field.
+        * If two fields are selected, each item in the result array will have as key
+        * the first field and as value the second field.
+        * If more then two fields are selected, each item will be an associative array.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return array of array
+        */
+       public function selectFields( $fields = null, array $conditions = array(),
+                                                                 array $options = array(), $collapse = true, $functionName  = null ) {
+               $objects = array();
+
+               $result = $this->rawSelect( $fields, $conditions, $options, $functionName );
+
+               foreach ( $result as $record ) {
+                       $objects[] = $this->getFieldsFromDBResult( $record );
+               }
+
+               if ( $collapse ) {
+                       if ( count( $fields ) === 1 ) {
+                               $objects = array_map( 'array_shift', $objects );
+                       }
+                       elseif ( count( $fields ) === 2 ) {
+                               $o = array();
+
+                               foreach ( $objects as $object ) {
+                                       $o[array_shift( $object )] = array_shift( $object );
+                               }
+
+                               $objects = $o;
+                       }
+               }
+
+               return $objects;
+       }
+
+       /**
+        * Selects the the specified fields of the first matching record.
+        * Field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return IORMRow|bool False on failure
+        */
+       public function selectRow( $fields = null, array $conditions = array(),
+                                                          array $options = array(), $functionName = null ) {
+               $options['LIMIT'] = 1;
+
+               $objects = $this->select( $fields, $conditions, $options, $functionName );
+
+               return $objects->isEmpty() ? false : $objects->current();
+       }
+
+       /**
+        * Selects the the specified fields of the records matching the provided
+        * conditions. Field names do NOT get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $fields
+        * @param array $conditions
+        * @param array $options
+        * @param string|null $functionName
+        *
+        * @return ResultWrapper
+        */
+       public function rawSelectRow( array $fields, array $conditions = array(),
+                                                                 array $options = array(), $functionName = null ) {
+               $dbr = wfGetDB( $this->getReadDb() );
+
+               return $dbr->selectRow(
+                       $this->getName(),
+                       $fields,
+                       $conditions,
+                       is_null( $functionName ) ? __METHOD__ : $functionName,
+                       $options
+               );
+       }
+
+       /**
+        * Selects the the specified fields of the first record matching the provided
+        * conditions and returns it as an associative array, or false when nothing matches.
+        * This method makes use of selectFields and expects the same parameters and
+        * returns the same results (if there are any, if there are none, this method returns false).
+        * @see ORMTable::selectFields
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $fields
+        * @param array $conditions
+        * @param array $options
+        * @param boolean $collapse Set to false to always return each result row as associative array.
+        * @param string|null $functionName
+        *
+        * @return mixed|array|bool False on failure
+        */
+       public function selectFieldsRow( $fields = null, array $conditions = array(),
+                                                                        array $options = array(), $collapse = true, $functionName = null ) {
+               $options['LIMIT'] = 1;
+
+               $objects = $this->selectFields( $fields, $conditions, $options, $collapse, $functionName );
+
+               return empty( $objects ) ? false : $objects[0];
+       }
+
+       /**
+        * Returns if there is at least one record matching the provided conditions.
+        * Condition field names get prefixed.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        *
+        * @return boolean
+        */
+       public function has( array $conditions = array() ) {
+               return $this->selectRow( array( 'id' ), $conditions ) !== false;
+       }
+
+       /**
+        * Returns the amount of matching records.
+        * Condition field names get prefixed.
+        *
+        * Note that this can be expensive on large tables.
+        * In such cases you might want to use DatabaseBase::estimateRowCount instead.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param array $options
+        *
+        * @return integer
+        */
+       public function count( array $conditions = array(), array $options = array() ) {
+               $res = $this->rawSelectRow(
+                       array( 'COUNT(*) AS rowcount' ),
+                       $this->getPrefixedValues( $conditions ),
+                       $options
+               );
+
+               return $res->rowcount;
+       }
+
+       /**
+        * Removes the object from the database.
+        *
+        * @since 1.20
+        *
+        * @param array $conditions
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function delete( array $conditions, $functionName = null ) {
+               return wfGetDB( DB_MASTER )->delete(
+                       $this->getName(),
+                       $this->getPrefixedValues( $conditions ),
+                       $functionName
+               ) !== false; // DatabaseBase::delete does not always return true for success as documented...
+       }
+       
+       /**
+        * Get API parameters for the fields supported by this object.
+        *
+        * @since 1.20
+        *
+        * @param boolean $requireParams
+        * @param boolean $setDefaults
+        *
+        * @return array
+        */
+       public function getAPIParams( $requireParams = false, $setDefaults = false ) {
+               $typeMap = array(
+                       'id' => 'integer',
+                       'int' => 'integer',
+                       'float' => 'NULL',
+                       'str' => 'string',
+                       'bool' => 'integer',
+                       'array' => 'string',
+                       'blob' => 'string',
+               );
+
+               $params = array();
+               $defaults = $this->getDefaults();
+
+               foreach ( $this->getFields() as $field => $type ) {
+                       if ( $field == 'id' ) {
+                               continue;
+                       }
+
+                       $hasDefault = array_key_exists( $field, $defaults );
+
+                       $params[$field] = array(
+                               ApiBase::PARAM_TYPE => $typeMap[$type],
+                               ApiBase::PARAM_REQUIRED => $requireParams && !$hasDefault
+                       );
+
+                       if ( $type == 'array' ) {
+                               $params[$field][ApiBase::PARAM_ISMULTI] = true;
+                       }
+
+                       if ( $setDefaults && $hasDefault ) {
+                               $default = is_array( $defaults[$field] ) ? implode( '|', $defaults[$field] ) : $defaults[$field];
+                               $params[$field][ApiBase::PARAM_DFLT] = $default;
+                       }
+               }
+
+               return $params;
+       }
+
+       /**
+        * Returns an array with the fields and their descriptions.
+        *
+        * field name => field description
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldDescriptions() {
+               return array();
+       }
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @since 1.20
+        *
+        * @return integer DB_ enum
+        */
+       public function getReadDb() {
+               return $this->readDb;
+       }
+
+       /**
+        * Set the database type to use for read operations.
+        *
+        * @param integer $db
+        *
+        * @since 1.20
+        */
+       public function setReadDb( $db ) {
+               $this->readDb = $db;
+       }
+
+       /**
+        * Update the records matching the provided conditions by
+        * setting the fields that are keys in the $values param to
+        * their corresponding values.
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        * @param array $conditions
+        *
+        * @return boolean Success indicator
+        */
+       public function update( array $values, array $conditions = array() ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               return $dbw->update(
+                       $this->getName(),
+                       $this->getPrefixedValues( $values ),
+                       $this->getPrefixedValues( $conditions ),
+                       __METHOD__
+               ) !== false; // DatabaseBase::update does not always return true for success as documented...
+       }
+
+       /**
+        * Computes the values of the summary fields of the objects matching the provided conditions.
+        *
+        * @since 1.20
+        *
+        * @param array|string|null $summaryFields
+        * @param array $conditions
+        */
+       public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
+               $this->setReadDb( DB_MASTER );
+
+               foreach ( $this->select( null, $conditions ) as /* IORMRow */ $item ) {
+                       $item->loadSummaryFields( $summaryFields );
+                       $item->setSummaryMode( true );
+                       $item->save();
+               }
+
+               $this->setReadDb( DB_SLAVE );
+       }
+
+       /**
+        * Takes in an associative array with field names as keys and
+        * their values as value. The field names are prefixed with the
+        * db field prefix.
+        *
+        * @since 1.20
+        *
+        * @param array $values
+        *
+        * @return array
+        */
+       public function getPrefixedValues( array $values ) {
+               $prefixedValues = array();
+
+               foreach ( $values as $field => $value ) {
+                       if ( is_integer( $field ) ) {
+                               if ( is_array( $value ) ) {
+                                       $field = $value[0];
+                                       $value = $value[1];
+                               }
+                               else {
+                                       $value = explode( ' ', $value, 2 );
+                                       $value[0] = $this->getPrefixedField( $value[0] );
+                                       $prefixedValues[] = implode( ' ', $value );
+                                       continue;
+                               }
+                       }
+
+                       $prefixedValues[$this->getPrefixedField( $field )] = $value;
+               }
+
+               return $prefixedValues;
+       }
+
+       /**
+        * Takes in a field or array of fields and returns an
+        * array with their prefixed versions, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param array|string $fields
+        *
+        * @return array
+        */
+       public function getPrefixedFields( array $fields ) {
+               foreach ( $fields as &$field ) {
+                       $field = $this->getPrefixedField( $field );
+               }
+
+               return $fields;
+       }
+
+       /**
+        * Takes in a field and returns an it's prefixed version, ready for db usage.
+        *
+        * @since 1.20
+        *
+        * @param string|array $field
+        *
+        * @return string
+        */
+       public function getPrefixedField( $field ) {
+               return $this->getFieldPrefix() . $field;
+       }
+
+       /**
+        * Takes an array of field names with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param array $fieldNames
+        *
+        * @return array
+        */
+       public function unprefixFieldNames( array $fieldNames ) {
+               return array_map( array( $this, 'unprefixFieldName' ), $fieldNames );
+       }
+
+       /**
+        * Takes a field name with prefix and returns the unprefixed equivalent.
+        *
+        * @since 1.20
+        *
+        * @param string $fieldName
+        *
+        * @return string
+        */
+       public function unprefixFieldName( $fieldName ) {
+               return substr( $fieldName, strlen( $this->getFieldPrefix() ) );
+       }
+
+       /**
+        * Get an instance of this class.
+        *
+        * @since 1.20
+        *
+        * @return IORMTable
+        */
+       public static function singleton() {
+               $class = function_exists( 'get_called_class' ) ? get_called_class() : self::get_called_class();
+
+               if ( !array_key_exists( $class, self::$instanceCache ) ) {
+                       self::$instanceCache[$class] = new $class;
+               }
+
+               return self::$instanceCache[$class];
+       }
+
+       /**
+        * Compatibility fallback function so the singleton method works on PHP < 5.3.
+        * Code borrowed from http://www.php.net/manual/en/function.get-called-class.php#107445
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected static function get_called_class() {
+               $bt = debug_backtrace();
+               $l = count($bt) - 1;
+               $matches = array();
+               while(empty($matches) && $l > -1){
+                       $lines = file($bt[$l]['file']);
+                       $callerLine = $lines[$bt[$l]['line']-1];
+                       preg_match('/([a-zA-Z0-9\_]+)::'.$bt[$l--]['function'].'/',
+                               $callerLine,
+                               $matches);
+               }
+               if (!isset($matches[1])) $matches[1]=NULL; //for notices
+               if ($matches[1] == 'self') {
+                       $line = $bt[$l]['line']-1;
+                       while ($line > 0 && strpos($lines[$line], 'class') === false) {
+                               $line--;
+                       }
+                       preg_match('/class[\s]+(.+?)[\s]+/si', $lines[$line], $matches);
+               }
+               return $matches[1];
+       }
+
+       /**
+        * Get an array with fields from a database result,
+        * that can be fed directly to the constructor or
+        * to setFields.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return array
+        */
+       public function getFieldsFromDBResult( stdClass $result ) {
+               $result = (array)$result;
+               return array_combine(
+                       $this->unprefixFieldNames( array_keys( $result ) ),
+                       array_values( $result )
+               );
+       }
+
+       /**
+        * Get a new instance of the class from a database result.
+        *
+        * @since 1.20
+        *
+        * @param stdClass $result
+        *
+        * @return IORMRow
+        */
+       public function newFromDBResult( stdClass $result ) {
+               return $this->newFromArray( $this->getFieldsFromDBResult( $result ) );
+       }
+
+       /**
+        * Get a new instance of the class from an array.
+        *
+        * @since 1.20
+        *
+        * @param array $data
+        * @param boolean $loadDefaults
+        *
+        * @return IORMRow
+        */
+       public function newFromArray( array $data, $loadDefaults = false ) {
+               $class = $this->getRowClass();
+               return new $class( $this, $data, $loadDefaults );
+       }
+
+       /**
+        * Return the names of the fields.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFieldNames() {
+               return array_keys( $this->getFields() );
+       }
+
+       /**
+        * Gets if the object can take a certain field.
+        *
+        * @since 1.20
+        *
+        * @param string $name
+        *
+        * @return boolean
+        */
+       public function canHaveField( $name ) {
+               return array_key_exists( $name, $this->getFields() );
+       }
+
+}
index 10905f2..0c0052f 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Debug toolbar related 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
+ */
 
 /**
  * New debugger system that outputs a toolbar on page view
@@ -7,6 +27,8 @@
  * to explicitly call MWDebug::init() to enabled them.
  *
  * @todo Profiler support
+ *
+ * @since 1.19
  */
 class MWDebug {
 
@@ -49,6 +71,8 @@ class MWDebug {
        /**
         * Enabled the debugger and load resource module.
         * This is called by Setup.php when $wgDebugToolbar is true.
+        *
+        * @since 1.19
         */
        public static function init() {
                self::$enabled = true;
@@ -58,6 +82,7 @@ class MWDebug {
         * Add ResourceLoader modules to the OutputPage object if debugging is
         * enabled.
         *
+        * @since 1.19
         * @param $out OutputPage
         */
        public static function addModules( OutputPage $out ) {
@@ -71,6 +96,7 @@ class MWDebug {
         *
         * @todo Add support for passing objects
         *
+        * @since 1.19
         * @param $str string
         */
        public static function log( $str ) {
@@ -87,6 +113,7 @@ class MWDebug {
 
        /**
         * Returns internal log array
+        * @since 1.19
         * @return array
         */
        public static function getLog() {
@@ -95,6 +122,7 @@ class MWDebug {
 
        /**
         * Clears internal log array and deprecation tracking
+        * @since 1.19
         */
        public static function clearLog() {
                self::$log = array();
@@ -104,6 +132,7 @@ class MWDebug {
        /**
         * Adds a warning entry to the log
         *
+        * @since 1.19
         * @param $msg
         * @param int $callerOffset
         * @return mixed
@@ -116,9 +145,10 @@ class MWDebug {
                // Check to see if there was already a deprecation notice, so not to
                // get a duplicate warning
                $logCount = count( self::$log );
+               $caller = wfGetCaller( $callerOffset + 1 );
                if ( $logCount ) {
                        $lastLog = self::$log[ $logCount - 1 ];
-                       if ( $lastLog['type'] == 'deprecated' && $lastLog['caller'] == wfGetCaller( $callerOffset + 1 ) ) {
+                       if ( $lastLog['type'] == 'deprecated' && $lastLog['caller'] == $caller ) {
                                return;
                        }
                }
@@ -126,13 +156,14 @@ class MWDebug {
                self::$log[] = array(
                        'msg' => htmlspecialchars( $msg ),
                        'type' => 'warn',
-                       'caller' => wfGetCaller( $callerOffset ),
+                       'caller' => $caller,
                );
        }
 
        /**
         * Adds a depreciation entry to the log, along with a backtrace
         *
+        * @since 1.19
         * @param $function
         * @param $version
         * @param $component
@@ -172,6 +203,7 @@ class MWDebug {
         * This is a method to pass messages from wfDebug to the pretty debugger.
         * Do NOT use this method, use MWDebug::log or wfDebug()
         *
+        * @since 1.19
         * @param $str string
         */
        public static function debugMsg( $str ) {
@@ -185,6 +217,7 @@ class MWDebug {
        /**
         * Begins profiling on a database query
         *
+        * @since 1.19
         * @param $sql string
         * @param $function string
         * @param $isMaster bool
@@ -210,6 +243,7 @@ class MWDebug {
        /**
         * Calculates how long a query took.
         *
+        * @since 1.19
         * @param $id int
         */
        public static function queryTime( $id ) {
@@ -244,6 +278,7 @@ class MWDebug {
        /**
         * Returns the HTML to add to the page for the toolbar
         *
+        * @since 1.19
         * @param $context IContextSource
         * @return string
         */
@@ -252,10 +287,61 @@ class MWDebug {
                        return '';
                }
 
-               global $wgVersion, $wgRequestTime;
                MWDebug::log( 'MWDebug output complete' );
+               $debugInfo = self::getDebugInfo( $context );
+
+               // Cannot use OutputPage::addJsConfigVars because those are already outputted
+               // by the time this method is called.
+               $html = Html::inlineScript(
+                       ResourceLoader::makeLoaderConditionalScript(
+                               ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
+                       )
+               );
+
+               return $html;
+       }
+
+       /**
+        * Append the debug info to given ApiResult
+        *
+        * @param $context IContextSource
+        * @param $result ApiResult
+        */
+       public static function appendDebugInfoToApiResult( IContextSource $context, ApiResult $result ) {
+               if ( !self::$enabled ) {
+                       return;
+               }
+
+               MWDebug::log( 'MWDebug output complete' );
+               $debugInfo = self::getDebugInfo( $context );
+
+               $result->setIndexedTagName( $debugInfo, 'debuginfo' );
+               $result->setIndexedTagName( $debugInfo['log'], 'line' );
+               foreach( $debugInfo['debugLog'] as $index => $debugLogText ) {
+                       $vals = array();
+                       ApiResult::setContent( $vals, $debugLogText );
+                       $debugInfo['debugLog'][$index] = $vals; //replace
+               }
+               $result->setIndexedTagName( $debugInfo['debugLog'], 'msg' );
+               $result->setIndexedTagName( $debugInfo['queries'], 'query' );
+               $result->setIndexedTagName( $debugInfo['includes'], 'queries' );
+               $result->addValue( array(), 'debuginfo', $debugInfo );
+       }
+
+       /**
+        * Returns the HTML to add to the page for the toolbar
+        *
+        * @param $context IContextSource
+        * @return array
+        */
+       public static function getDebugInfo( IContextSource $context ) {
+               if ( !self::$enabled ) {
+                       return array();
+               }
+
+               global $wgVersion, $wgRequestTime;
                $request = $context->getRequest();
-               $debugInfo = array(
+               return array(
                        'mwVersion' => $wgVersion,
                        'phpVersion' => PHP_VERSION,
                        'gitRevision' => GitInfo::headSHA1(),
@@ -275,15 +361,5 @@ class MWDebug {
                        'memoryPeak' => $context->getLanguage()->formatSize( memory_get_peak_usage() ),
                        'includes' => self::getFilesIncluded( $context ),
                );
-
-               // Cannot use OutputPage::addJsConfigVars because those are already outputted
-               // by the time this method is called.
-               $html = Html::inlineScript(
-                       ResourceLoader::makeLoaderConditionalScript(
-                               ResourceLoader::makeConfigSetScript( array( 'debugInfo' => $debugInfo ) )
-                       )
-               );
-
-               return $html;
        }
 }
index e8f35f0..eb3a319 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
@@ -239,8 +254,7 @@ class DifferenceEngine extends ContextSource {
                # a diff between a version V and its previous version V' AND the version V
                # is the first version of that article. In that case, V' does not exist.
                if ( $this->mOldRev === false ) {
-                       $out->setPageTitle( $this->mNewPage->getPrefixedText() );
-                       $out->addSubtitle( $this->msg( 'difference' ) );
+                       $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                        $samePage = true;
                        $oldHeader = '';
                } else {
@@ -252,11 +266,11 @@ class DifferenceEngine extends ContextSource {
                        }
 
                        if ( $this->mNewPage->equals( $this->mOldPage ) ) {
-                               $out->setPageTitle( $this->mNewPage->getPrefixedText() );
-                               $out->addSubtitle( $this->msg( 'difference' ) );
+                               $out->setPageTitle( $this->msg( 'difference-title', $this->mNewPage->getPrefixedText() ) );
                                $samePage = true;
                        } else {
-                               $out->setPageTitle( $this->mOldPage->getPrefixedText() . ', ' . $this->mNewPage->getPrefixedText() );
+                               $out->setPageTitle( $this->msg( 'difference-title-multipage', $this->mOldPage->getPrefixedText(),
+                                       $this->mNewPage->getPrefixedText() ) );
                                $out->addSubtitle( $this->msg( 'difference-multipage' ) );
                                $samePage = false;
                        }
@@ -598,7 +612,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
                // Short-circuit
-               // If mOldRev is false, it means that the 
+               // If mOldRev is false, it means that the
                if ( $this->mOldRev === false || ( $this->mOldRev && $this->mNewRev
                        && $this->mOldRev->getID() == $this->mNewRev->getID() ) )
                {
@@ -706,9 +720,9 @@ class DifferenceEngine extends ContextSource {
                }
                if ( $wgExternalDiffEngine != 'wikidiff3' && $wgExternalDiffEngine !== false ) {
                        # Diff via the shell
-                       global $wgTmpDirectory;
-                       $tempName1 = tempnam( $wgTmpDirectory, 'diff_' );
-                       $tempName2 = tempnam( $wgTmpDirectory, 'diff_' );
+                       $tmpDir = wfTempDir();
+                       $tempName1 = tempnam( $tmpDir, 'diff_' );
+                       $tempName2 = tempnam( $tmpDir, 'diff_' );
 
                        $tempFile1 = fopen( $tempName1, "w" );
                        if ( !$tempFile1 ) {
@@ -1005,7 +1019,7 @@ class DifferenceEngine extends ContextSource {
                // Load the new revision object
                $this->mNewRev = $this->mNewid
                        ? Revision::newFromId( $this->mNewid )
-                       : Revision::newFromTitle( $this->getTitle() );
+                       : Revision::newFromTitle( $this->getTitle(), false, Revision::AVOID_MASTER );
 
                if ( !$this->mNewRev instanceof Revision ) {
                        return false;
index 22dbdef..9c8d85d 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
  */
  * @deprecated since 1.19
  */
 class FSRepo extends FileRepo {
+
+       /**
+        * @param $info array
+        * @throws MWException
+        */
        function __construct( array $info ) {
                if ( !isset( $info['backend'] ) ) {
                        // B/C settings...
index dcc9610..d4eef87 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
  */
@@ -45,7 +60,11 @@ class FileRepo {
        var $oldFileFactory = false;
        var $fileFactoryKey = false, $oldFileFactoryKey = false;
 
-       function __construct( array $info = null ) {
+       /**
+        * @param $info array|null
+        * @throws MWException
+        */
+       public function __construct( array $info = null ) {
                // Verify required settings presence
                if(
                        $info === null
@@ -99,11 +118,11 @@ class FileRepo {
                        : array();
                // Give defaults for the basic zones...
                foreach ( array( 'public', 'thumb', 'temp', 'deleted' ) as $zone ) {
-                       if ( !isset( $this->zones[$zone] ) ) {
-                               $this->zones[$zone] = array(
-                                       'container' => "{$this->name}-{$zone}",
-                                       'directory' => '' // container root
-                               );
+                       if ( !isset( $this->zones[$zone]['container'] ) ) {
+                               $this->zones[$zone]['container'] = "{$this->name}-{$zone}";
+                       }
+                       if ( !isset( $this->zones[$zone]['directory'] ) ) {
+                               $this->zones[$zone]['directory'] = '';
                        }
                }
        }
@@ -131,6 +150,7 @@ class FileRepo {
         * Check if a single zone or list of zones is defined for usage
         *
         * @param $doZones Array Only do a particular zones
+        * @throws MWException
         * @return Status
         */
        protected function initZones( $doZones = array() ) {
@@ -171,7 +191,7 @@ class FileRepo {
         * The suffix, if supplied, is considered to be unencoded, and will be
         * URL-encoded before being returned.
         *
-        * @param $suffix string
+        * @param $suffix string|bool
         * @return string
         */
        public function getVirtualUrl( $suffix = false ) {
@@ -189,6 +209,11 @@ class FileRepo {
         * @return String or false
         */
        public function getZoneUrl( $zone ) {
+               if ( isset( $this->zones[$zone]['url'] )
+                       && in_array( $zone, array( 'public', 'temp', 'thumb' ) ) )
+               {
+                       return $this->zones[$zone]['url']; // custom URL
+               }
                switch ( $zone ) {
                        case 'public':
                                return $this->url;
@@ -208,6 +233,7 @@ class FileRepo {
         * Use this function wisely.
         *
         * @param $url string
+        * @throws MWException
         * @return string
         */
        public function resolveVirtualUrl( $url ) {
@@ -418,6 +444,7 @@ class FileRepo {
         * SHA-1 content hash.
         *
         * STUB
+        * @param $hash
         * @return array
         */
        public function findBySha1( $hash ) {
@@ -427,10 +454,11 @@ class FileRepo {
        /**
         * Get the public root URL of the repository
         *
+        * @deprecated since 1.20
         * @return string
         */
        public function getRootUrl() {
-               return $this->url;
+               return $this->getZoneUrl( 'public' );
        }
 
        /**
@@ -669,6 +697,7 @@ class FileRepo {
         *     self::OVERWRITE_SAME    Overwrite the file if the destination exists and has the
         *                             same contents as the source
         *     self::SKIP_LOCKING      Skip any file locking when doing the store
+        * @throws MWException
         * @return FileRepoStatus
         */
        public function storeBatch( array $triplets, $flags = 0 ) {
@@ -706,9 +735,7 @@ class FileRepo {
                        }
 
                        // Resolve source to a storage path if virtual
-                       if ( self::isVirtualUrl( $srcPath ) ) {
-                               $srcPath = $this->resolveVirtualUrl( $srcPath );
-                       }
+                       $srcPath = $this->resolveToStoragePath( $srcPath );
 
                        // Get the appropriate file operation
                        if ( FileBackend::isStoragePath( $srcPath ) ) {
@@ -749,7 +776,7 @@ class FileRepo {
         * Each file can be a (zone, rel) pair, virtual url, storage path.
         * It will try to delete each file, but ignores any errors that may occur.
         *
-        * @param $pairs array List of files to delete
+        * @param $files array List of files to delete
         * @param $flags Integer: bitwise combination of the following flags:
         *     self::SKIP_LOCKING      Skip any file locking when doing the deletions
         * @return FileRepoStatus
@@ -767,9 +794,7 @@ class FileRepo {
                                $path = $this->getZonePath( $zone ) . "/$rel";
                        } else {
                                // Resolve source to a storage path if virtual
-                               if ( self::isVirtualUrl( $path ) ) {
-                                       $path = $this->resolveVirtualUrl( $path );
-                               }
+                               $path = $this->resolveToStoragePath( $path );
                        }
                        $operations[] = array( 'op' => 'delete', 'src' => $path );
                }
@@ -783,6 +808,96 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Import a file from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $src string File system path
+        * @param $dst string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickImport( $src, $dst ) {
+               return $this->quickImportBatch( array( array( $src, $dst ) ) );
+       }
+
+       /**
+        * Purge a file from the repo. This does no locking nor journaling.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for purging thumbnails.
+        *
+        * @param $path string Virtual URL or storage path
+        * @return FileRepoStatus
+        */
+       final public function quickPurge( $path ) {
+               return $this->quickPurgeBatch( array( $path ) );
+       }
+
+       /**
+        * Deletes a directory if empty.
+        * This function can be used to write to otherwise read-only foreign repos.
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function quickCleanDir( $dir ) {
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+               return $status;
+       }
+
+       /**
+        * Import a batch of files from the local file system into the repo.
+        * This does no locking nor journaling and overrides existing files.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This is intended for copying generated thumbnails into the repo.
+        *
+        * @param $pairs Array List of tuples (file system path, virtual URL or storage path)
+        * @return FileRepoStatus
+        */
+       public function quickImportBatch( array $pairs ) {
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $pairs as $pair ) {
+                       list ( $src, $dst ) = $pair;
+                       $operations[] = array(
+                               'op'        => 'store',
+                               'src'       => $src,
+                               'dst'       => $this->resolveToStoragePath( $dst )
+                       );
+                       $this->backend->prepare( array( 'dir' => dirname( $dst ) ) );
+               }
+               $status->merge( $this->backend->doQuickOperations( $operations ) );
+
+               return $status;
+       }
+
+       /**
+        * Purge a batch of files from the repo.
+        * This function can be used to write to otherwise read-only foreign repos.
+        * This does no locking nor journaling and is intended for purging thumbnails.
+        *
+        * @param $paths Array List of virtual URLs or storage paths
+        * @return FileRepoStatus
+        */
+       public function quickPurgeBatch( array $paths ) {
+               $status = $this->newGood();
+               $operations = array();
+               foreach ( $paths as $path ) {
+                       $operations[] = array(
+                               'op'                  => 'delete',
+                               'src'                 => $this->resolveToStoragePath( $path ),
+                               'ignoreMissingSource' => true
+                       );
+               }
+               $status->merge( $this->backend->doQuickOperations( $operations ) );
+
+               return $status;
+       }
+
        /**
         * Pick a random name in the temp zone and store a file to it.
         * Returns a FileRepoStatus object with the file Virtual URL in the value,
@@ -907,6 +1022,7 @@ class FileRepo {
         * @param $triplets Array: (source, dest, archive) triplets as per publish()
         * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
         *        that the source files should be deleted if possible
+        * @throws MWException
         * @return FileRepoStatus
         */
        public function publishBatch( array $triplets, $flags = 0 ) {
@@ -927,9 +1043,7 @@ class FileRepo {
                foreach ( $triplets as $i => $triplet ) {
                        list( $srcPath, $dstRel, $archiveRel ) = $triplet;
                        // Resolve source to a storage path if virtual
-                       if ( substr( $srcPath, 0, 9 ) == 'mwrepo://' ) {
-                               $srcPath = $this->resolveVirtualUrl( $srcPath );
-                       }
+                       $srcPath = $this->resolveToStoragePath( $srcPath );
                        if ( !$this->validateFilename( $dstRel ) ) {
                                throw new MWException( 'Validation error in $dstRel' );
                        }
@@ -1012,6 +1126,22 @@ class FileRepo {
                return $status;
        }
 
+       /**
+        * Deletes a directory if empty.
+        *
+        * @param $dir string Virtual URL (or storage path) of directory to clean
+        * @return Status
+        */
+       public function cleanDir( $dir ) {
+               $this->assertWritableRepo(); // fail out if read-only
+
+               $status = $this->newGood();
+               $status->merge( $this->backend->clean(
+                       array( 'dir' => $this->resolveToStoragePath( $dir ) ) ) );
+
+               return $status;
+       }
+
        /**
         * Checks existence of a a file
         *
@@ -1032,9 +1162,7 @@ class FileRepo {
        public function fileExistsBatch( array $files ) {
                $result = array();
                foreach ( $files as $key => $file ) {
-                       if ( self::isVirtualUrl( $file ) ) {
-                               $file = $this->resolveVirtualUrl( $file );
-                       }
+                       $file = $this->resolveToStoragePath( $file );
                        $result[$key] = $this->backend->fileExists( array( 'src' => $file ) );
                }
                return $result;
@@ -1070,6 +1198,7 @@ class FileRepo {
         *        is a two-element array containing the source file path relative to the
         *        public root in the first element, and the archive file path relative
         *        to the deleted zone root in the second element.
+        * @throws MWException
         * @return FileRepoStatus
         */
        public function deleteBatch( array $sourceDestPairs ) {
@@ -1139,6 +1268,7 @@ class FileRepo {
         * Get a relative path for a deletion archive key,
         * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
         *
+        * @param $key string
         * @return string
         */
        public function getDeletedHashPath( $key ) {
@@ -1342,6 +1472,7 @@ class FileRepo {
        /**
         * Create a new good result
         *
+        * @param $value null|string
         * @return FileRepoStatus
         */
        public function newGood( $value = null ) {
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..13de9e6 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
  */
@@ -36,6 +51,9 @@ class ForeignAPIRepo extends FileRepo {
        protected $mQueryCache = array();
        protected $mFileExists = array();
 
+       /**
+        * @param $info array|null
+        */
        function __construct( $info ) {
                global $wgLocalFileRepo;
                parent::__construct( $info );
@@ -66,6 +84,8 @@ class ForeignAPIRepo extends FileRepo {
         * Per docs in FileRepo, this needs to return false if we don't support versioned
         * files. Well, we don't.
         *
+        * @param $title Title
+        * @param $time string|bool
         * @return File
         */
        function newFile( $title, $time = false ) {
@@ -75,6 +95,10 @@ class ForeignAPIRepo extends FileRepo {
                return parent::newFile( $title, $time );
        }
 
+       /**
+        * @param $files array
+        * @return array
+        */
        function fileExistsBatch( array $files ) {
                $results = array();
                foreach ( $files as $k => $f ) {
@@ -87,6 +111,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'." );
                        }
                }
 
@@ -102,17 +130,25 @@ class ForeignAPIRepo extends FileRepo {
                return $results;
        }
 
+       /**
+        * @param $virtualUrl string
+        * @return bool
+        */
        function getFileProps( $virtualUrl ) {
                return false;
        }
 
+       /**
+        * @param $query array
+        * @return string
+        */
        function fetchImageQuery( $query ) {
                global $wgMemc;
 
                $query = array_merge( $query,
                        array(
-                               'format' => 'json',
-                               'action' => 'query',
+                               'format'    => 'json',
+                               'action'    => 'query',
                                'redirects' => 'true'
                        ) );
                if ( $this->mApiBase ) {
@@ -141,6 +177,10 @@ class ForeignAPIRepo extends FileRepo {
                return FormatJson::decode( $this->mQueryCache[$url], true );
        }
 
+       /**
+        * @param $data array
+        * @return bool|array
+        */
        function getImageInfo( $data ) {
                if( $data && isset( $data['query']['pages'] ) ) {
                        foreach( $data['query']['pages'] as $info ) {
@@ -152,6 +192,10 @@ class ForeignAPIRepo extends FileRepo {
                return false;
        }
 
+       /**
+        * @param $hash string
+        * @return array
+        */
        function findBySha1( $hash ) {
                $results = $this->fetchImageQuery( array(
                                                                                'aisha1base36' => $hash,
@@ -170,6 +214,14 @@ class ForeignAPIRepo extends FileRepo {
                return $ret;
        }
 
+       /**
+        * @param $name string
+        * @param $width int
+        * @param $height int
+        * @param $result null
+        * @param $otherParams string
+        * @return bool
+        */
        function getThumbUrl( $name, $width = -1, $height = -1, &$result = null, $otherParams = '' ) {
                $data = $this->fetchImageQuery( array(
                        'titles' => 'File:' . $name,
@@ -198,11 +250,14 @@ class ForeignAPIRepo extends FileRepo {
         * @param $name String is a dbkey form of a title
         * @param $width
         * @param $height
-        * @param String $param Other rendering parameters (page number, etc) from handler's makeParamString.
+        * @param String $params Other rendering parameters (page number, etc) from handler's makeParamString.
         * @return bool|string
         */
-       function getThumbUrlFromCache( $name, $width, $height, $params="" ) {
+       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 +298,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 );
@@ -263,16 +320,14 @@ class ForeignAPIRepo extends FileRepo {
                        return false;
                }
 
+
                # @todo FIXME: Delete old thumbs that aren't being used. Maintenance script?
-               wfSuppressWarnings();
-               $backend = $this->getBackend();
-               $op = array( 'op' => 'create', 'dst' => $localFilename, 'content' => $thumb );
-               if( !$backend->doOperation( $op )->isOK() ) {
-                       wfRestoreWarnings();
-                       wfDebug( __METHOD__ . " could not write to thumb path\n" );
+               $backend->prepare( array( 'dir' => dirname( $localFilename ) ) );
+               $params = array( 'dst' => $localFilename, 'content' => $thumb );
+               if( !$backend->quickCreate( $params )->isOK() ) {
+                       wfDebug( __METHOD__ . " could not write to thumb path '$localFilename'\n" );
                        return $foreignUrl;
                }
-               wfRestoreWarnings();
                $knownThumbUrls[$sizekey] = $localUrl;
                $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
@@ -281,6 +336,7 @@ class ForeignAPIRepo extends FileRepo {
 
        /**
         * @see FileRepo::getZoneUrl()
+        * @param $zone String
         * @return String
         */
        function getZoneUrl( $zone ) {
@@ -296,6 +352,7 @@ class ForeignAPIRepo extends FileRepo {
 
        /**
         * Get the local directory corresponding to one of the basic zones
+        * @param $zone string
         * @return bool|null|string
         */
        function getZonePath( $zone ) {
@@ -325,6 +382,9 @@ class ForeignAPIRepo extends FileRepo {
        /**
         * Like a Http:get request, but with custom User-Agent.
         * @see Http:get
+        * @param $url string
+        * @param $timeout string
+        * @param $options array
         * @return bool|String
         */
        public static function httpGet( $url, $timeout = 'default', $options = array() ) {
@@ -349,10 +409,17 @@ class ForeignAPIRepo extends FileRepo {
                }
        }
 
+       /**
+        * @param $callback Array|string
+        * @throws MWException
+        */
        function enumFiles( $callback ) {
                throw new MWException( 'enumFiles is not supported by ' . get_class( $this ) );
        }
 
+       /**
+        * @throws MWException
+        */
        protected function assertWritableRepo() {
                throw new MWException( get_class( $this ) . ': write operations are not supported.' );
        }
index 30f9977..4b206c3 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
@@ -21,6 +36,9 @@ class ForeignDBRepo extends LocalRepo {
        var $fileFactory = array( 'ForeignDBFile', 'newFromTitle' );
        var $fileFromRowFactory = array( 'ForeignDBFile', 'newFromRow' );
 
+       /**
+        * @param $info array|null
+        */
        function __construct( $info ) {
                parent::__construct( $info );
                $this->dbType = $info['dbType'];
@@ -33,6 +51,9 @@ class ForeignDBRepo extends LocalRepo {
                $this->hasSharedCache = $info['hasSharedCache'];
        }
 
+       /**
+        * @return DatabaseBase
+        */
        function getMasterDB() {
                if ( !isset( $this->dbConn ) ) {
                        $this->dbConn = DatabaseBase::factory( $this->dbType,
@@ -49,10 +70,16 @@ class ForeignDBRepo extends LocalRepo {
                return $this->dbConn;
        }
 
+       /**
+        * @return DatabaseBase
+        */
        function getSlaveDB() {
                return $this->getMasterDB();
        }
 
+       /**
+        * @return bool
+        */
        function hasSharedCache() {
                return $this->hasSharedCache;
        }
index 602902d..bd76fce 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
@@ -16,6 +31,9 @@ class ForeignDBViaLBRepo extends LocalRepo {
        var $fileFactory = array( 'ForeignDBFile', 'newFromTitle' );
        var $fileFromRowFactory = array( 'ForeignDBFile', 'newFromRow' );
 
+       /**
+        * @param $info array|null
+        */
        function __construct( $info ) {
                parent::__construct( $info );
                $this->wiki = $info['wiki'];
@@ -23,10 +41,16 @@ class ForeignDBViaLBRepo extends LocalRepo {
                $this->hasSharedCache = $info['hasSharedCache'];
        }
 
+       /**
+        * @return DatabaseBase
+        */
        function getMasterDB() {
                return wfGetDB( DB_MASTER, array(), $this->wiki );
        }
 
+       /**
+        * @return DatabaseBase
+        */
        function getSlaveDB() {
                return wfGetDB( DB_SLAVE, array(), $this->wiki );
        }
index eecd67a..c616e16 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
  */
@@ -24,7 +39,7 @@ class LocalRepo extends FileRepo {
        /**
         * @throws MWException
         * @param $row
-        * @return File
+        * @return LocalFile
         */
        function newFileFromRow( $row ) {
                if ( isset( $row->img_name ) ) {
@@ -133,7 +148,7 @@ class LocalRepo extends FileRepo {
        public static function getHashFromKey( $key ) {
                return strtok( $key, '.' );
        }
-       
+
        /**
         * Checks if there is a redirect named as $title
         *
@@ -183,7 +198,6 @@ class LocalRepo extends FileRepo {
                }
        }
 
-
        /**
         * Function link Title::getArticleID().
         * We can't say Title object, what database it should use, so we duplicate that function here.
@@ -220,7 +234,8 @@ class LocalRepo extends FileRepo {
                $res = $dbr->select(
                        'image',
                        LocalFile::selectFields(),
-                       array( 'img_sha1' => $hash )
+                       array( 'img_sha1' => $hash ),
+                       __METHOD__
                );
                
                $result = array();
index 9d58bc8..dda51ce 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
  */
  * @ingroup FileRepo
  */
 class NullRepo extends FileRepo {
+
+       /**
+        * @param $info array|null
+        */
        function __construct( $info ) {}
 
        protected function assertWritableRepo() {
index b109803..709655a 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
@@ -150,6 +165,10 @@ class RepoGroup {
                return $image;
        }
 
+       /**
+        * @param $inputItems array
+        * @return array
+        */
        function findFiles( $inputItems ) {
                if ( !$this->reposInitialised ) {
                        $this->initialiseRepos();
@@ -181,6 +200,7 @@ class RepoGroup {
 
        /**
         * Interface for FileRepo::checkRedirect()
+        * @param $title Title
         * @return bool
         */
        function checkRedirect( Title $title ) {
@@ -244,6 +264,7 @@ class RepoGroup {
 
        /**
         * Get the repo instance with a given key.
+        * @param $index string|int
         * @return bool|LocalRepo
         */
        function getRepo( $index ) {
@@ -258,8 +279,10 @@ class RepoGroup {
                        return false;
                }
        }
+
        /**
         * Get the repo instance by its name
+        * @param $name string
         * @return bool
         */
        function getRepoByName( $name ) {
@@ -267,8 +290,9 @@ class RepoGroup {
                        $this->initialiseRepos();
                }
                foreach ( $this->foreignRepos as $repo ) {
-                       if ( $repo->name == $name)
+                       if ( $repo->name == $name ) {
                                return $repo;
+                       }
                }
                return false;
        }
@@ -336,6 +360,7 @@ class RepoGroup {
        /**
         * Split a virtual URL into repo, zone and rel parts
         * @param $url string
+        * @throws MWException
         * @return array containing repo, zone and rel
         */
        function splitVirtualUrl( $url ) {
@@ -350,6 +375,10 @@ class RepoGroup {
                return $bits;
        }
 
+       /**
+        * @param $fileName string
+        * @return array
+        */
        function getFileProps( $fileName ) {
                if ( FileRepo::isVirtualUrl( $fileName ) ) {
                        list( $repoName, /* $zone */, /* $rel */ ) = $this->splitVirtualUrl( $fileName );
index 5d2bb52..e07c99d 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
  */
@@ -15,7 +32,8 @@ class FSFile {
        /**
         * Sets up the file object
         *
-        * @param String $path Path to temporary file on local disk
+        * @param $path string Path to temporary file on local disk
+        * @throws MWException
         */
        public function __construct( $path ) {
                if ( FileBackend::isStoragePath( $path ) ) {
@@ -152,6 +170,7 @@ class FSFile {
        /**
         * Exract image size information
         *
+        * @param $gis array
         * @return Array
         */
        protected function extractImageSizeInfo( array $gis ) {
index 4a27ca1..8157916 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
 
 /**
  * @brief Class for a file system (FS) based file backend.
- * 
+ *
  * All "containers" each map to a directory under the backend's base directory.
  * For backwards-compatibility, some container paths can be set to custom paths.
  * The wiki ID will not be used in any custom paths, so this should be avoided.
- * 
+ *
  * Having directories with thousands of files will diminish performance.
  * Sharding can be accomplished by using FileRepo-style hash paths.
  *
@@ -61,6 +78,8 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * @see FileBackendStore::resolveContainerPath()
+        * @param $container string
+        * @param $relStoragePath string
         * @return null|string
         */
        protected function resolveContainerPath( $container, $relStoragePath ) {
@@ -76,7 +95,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * Sanity check a relative file system path for validity
-        * 
+        *
         * @param $path string Normalized relative path
         * @return bool
         */
@@ -95,14 +114,14 @@ class FSFileBackend extends FileBackendStore {
        /**
         * Given the short (unresolved) and full (resolved) name of
         * a container, return the file system path of the container.
-        * 
+        *
         * @param $shortCont string
         * @param $fullCont string
-        * @return string|null 
+        * @return string|null
         */
        protected function containerFSRoot( $shortCont, $fullCont ) {
                if ( isset( $this->containerPaths[$shortCont] ) ) {
-                       return $this->containerPaths[$shortCont]; 
+                       return $this->containerPaths[$shortCont];
                } elseif ( isset( $this->basePath ) ) {
                        return "{$this->basePath}/{$fullCont}";
                }
@@ -111,7 +130,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * Get the absolute file system path for a storage path
-        * 
+        *
         * @param $storagePath string Storage path
         * @return string|null
         */
@@ -174,17 +193,39 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $ok = copy( $params['src'], $dest );
-               if ( !$ok ) {
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
-                       return $status;
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Store', $cmd, $dest );
+               } else { // immediate write
+                       $ok = copy( $params['src'], $dest );
+                       // 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;
+                       }
+                       $this->chmod( $dest );
                }
 
-               $this->chmod( $dest );
-
                return $status;
        }
 
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseStore( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doCopyInternal()
         * @return Status
@@ -217,17 +258,39 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $ok = copy( $source, $dest );
-               if ( !$ok ) {
-                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-                       return $status;
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd, $dest );
+               } else { // immediate write
+                       $ok = copy( $source, $dest );
+                       // 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;
+                       }
+                       $this->chmod( $dest );
                }
 
-               $this->chmod( $dest );
-
                return $status;
        }
 
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCopy( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doMoveInternal()
         * @return Status
@@ -263,16 +326,34 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $ok = rename( $source, $dest );
-               clearstatcache(); // file no longer at source
-               if ( !$ok ) {
-                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
-                       return $status;
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'MOVE' : 'mv',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Move', $cmd );
+               } else { // immediate write
+                       $ok = rename( $source, $dest );
+                       clearstatcache(); // file no longer at source
+                       if ( !$ok ) {
+                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               return $status;
+                       }
                }
 
                return $status;
        }
 
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseMove( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doDeleteInternal()
         * @return Status
@@ -293,15 +374,32 @@ class FSFileBackend extends FileBackendStore {
                        return $status; // do nothing; either OK or bad status
                }
 
-               $ok = unlink( $source );
-               if ( !$ok ) {
-                       $status->fatal( 'backend-fail-delete', $params['src'] );
-                       return $status;
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'DEL' : 'unlink',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
+               } else { // immediate write
+                       $ok = unlink( $source );
+                       if ( !$ok ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                               return $status;
+                       }
                }
 
                return $status;
        }
 
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseDelete( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-delete', $params['src'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doCreateInternal()
         * @return Status
@@ -328,17 +426,45 @@ class FSFileBackend extends FileBackendStore {
                        }
                }
 
-               $bytes = file_put_contents( $dest, $params['content'] );
-               if ( $bytes === false ) {
-                       $status->fatal( 'backend-fail-create', $params['dst'] );
-                       return $status;
+               if ( !empty( $params['async'] ) ) { // deferred
+                       $tempFile = TempFSFile::factory( 'create_', 'tmp' );
+                       if ( !$tempFile ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $bytes = file_put_contents( $tempFile->getPath(), $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                               wfEscapeShellArg( $this->cleanPathSlashes( $tempFile->getPath() ) ),
+                               wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
+                       ) );
+                       $status->value = new FSFileOpHandle( $this, $params, 'Create', $cmd, $dest );
+                       $tempFile->bind( $status->value );
+               } else { // immediate write
+                       $bytes = file_put_contents( $dest, $params['content'] );
+                       if ( $bytes === false ) {
+                               $status->fatal( 'backend-fail-create', $params['dst'] );
+                               return $status;
+                       }
+                       $this->chmod( $dest );
                }
 
-               $this->chmod( $dest );
-
                return $status;
        }
 
+       /**
+        * @see FSFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCreate( $errors, Status $status, array $params, $cmd ) {
+               if ( $errors !== '' && !( wfIsWindows() && $errors[0] === " " ) ) {
+                       $status->fatal( 'backend-fail-create', $params['dst'] );
+                       trigger_error( "$cmd\n$errors", E_USER_WARNING ); // command output
+               }
+       }
+
        /**
         * @see FileBackendStore::doPrepareInternal()
         * @return Status
@@ -439,6 +565,41 @@ class FSFileBackend extends FileBackendStore {
                clearstatcache(); // clear the PHP file stat cache
        }
 
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+
+               $this->trapWarnings(); // don't trust 'false' if there were errors
+               $exists = is_dir( $dir );
+               $hadError = $this->untrapWarnings();
+
+               return $hadError ? null : $exists;
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return Array|null
+        */
+       public function getDirectoryListInternal( $fullCont, $dirRel, array $params ) {
+               list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
+               $contRoot = $this->containerFSRoot( $shortCont, $fullCont ); // must be valid
+               $dir = ( $dirRel != '' ) ? "{$contRoot}/{$dirRel}" : $contRoot;
+               $exists = is_dir( $dir );
+               if ( !$exists ) {
+                       wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
+                       return array(); // nothing under this dir
+               } elseif ( !is_readable( $dir ) ) {
+                       wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
+                       return null; // bad permissions?
+               }
+               return new FSFileBackendDirList( $dir, $params );
+       }
+
        /**
         * @see FileBackendStore::getFileListInternal()
         * @return array|FSFileBackendFileList|null
@@ -451,13 +612,11 @@ class FSFileBackend extends FileBackendStore {
                if ( !$exists ) {
                        wfDebug( __METHOD__ . "() given directory does not exist: '$dir'\n" );
                        return array(); // nothing under this dir
-               }
-               $readable = is_readable( $dir );
-               if ( !$readable ) {
+               } elseif ( !is_readable( $dir ) ) {
                        wfDebug( __METHOD__ . "() given directory is unreadable: '$dir'\n" );
                        return null; // bad permissions?
                }
-               return new FSFileBackendFileList( $dir );
+               return new FSFileBackendFileList( $dir, $params );
        }
 
        /**
@@ -501,6 +660,48 @@ class FSFileBackend extends FileBackendStore {
                return $tmpFile;
        }
 
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return false;
+       }
+
+       /**
+        * @see FileBackendStore::doExecuteOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               $statuses = array();
+
+               $pipes = array();
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $pipes[$index] = popen( "{$fileOpHandle->cmd} 2>&1", 'r' );
+               }
+
+               $errs = array();
+               foreach ( $pipes as $index => $pipe ) {
+                       // Result will be empty on success in *NIX. On Windows,
+                       // it may be something like "        1 file(s) [copied|moved].".
+                       $errs[$index] = stream_get_contents( $pipe );
+                       fclose( $pipe );
+               }
+
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $status = Status::newGood();
+                       $function = '_getResponse' . $fileOpHandle->call;
+                       $this->$function( $errs[$index], $status, $fileOpHandle->params, $fileOpHandle->cmd );
+                       $statuses[$index] = $status;
+                       if ( $status->isOK() && $fileOpHandle->chmodPath ) {
+                               $this->chmod( $fileOpHandle->chmodPath );
+                       }
+               }
+
+               clearstatcache(); // files changed
+               return $statuses;
+       }
+
        /**
         * Chmod a file, suppressing the warnings
         *
@@ -515,6 +716,16 @@ class FSFileBackend extends FileBackendStore {
                return $ok;
        }
 
+       /**
+        * Clean up directory separators for the given OS
+        *
+        * @param $path string FS path
+        * @return string
+        */
+       protected function cleanPathSlashes( $path ) {
+               return wfIsWindows() ? strtr( $path, '/', '\\' ) : $path;
+       }
+
        /**
         * Listen for E_WARNING errors and track whether any happen
         *
@@ -536,6 +747,9 @@ class FSFileBackend extends FileBackendStore {
                return array_pop( $this->hadWarningErrors ); // pop from stack
        }
 
+       /**
+        * @return bool
+        */
        private function handleWarning() {
                $this->hadWarningErrors[count( $this->hadWarningErrors ) - 1] = true;
                return true; // suppress from PHP handler
@@ -543,51 +757,79 @@ class FSFileBackend extends FileBackendStore {
 }
 
 /**
- * Wrapper around RecursiveDirectoryIterator that catches
- * exception or does any custom behavoir that we may want.
+ * @see FileBackendStoreOpHandle
+ */
+class FSFileOpHandle extends FileBackendStoreOpHandle {
+       public $cmd; // string; shell command
+       public $chmodPath; // string; file to chmod
+
+       /**
+        * @param $backend
+        * @param $params array
+        * @param $call
+        * @param $cmd
+        * @param $chmodPath null
+        */
+       public function __construct( $backend, array $params, $call, $cmd, $chmodPath = null ) {
+               $this->backend = $backend;
+               $this->params = $params;
+               $this->call = $call;
+               $this->cmd = $cmd;
+               $this->chmodPath = $chmodPath;
+       }
+}
+
+/**
+ * Wrapper around RecursiveDirectoryIterator/DirectoryIterator that
+ * catches exception or does any custom behavoir that we may want.
  * Do not use this class from places outside FSFileBackend.
  *
  * @ingroup FileBackend
  */
-class FSFileBackendFileList implements Iterator {
-       /** @var RecursiveIteratorIterator */
+abstract class FSFileBackendList implements Iterator {
+       /** @var Iterator */
        protected $iter;
        protected $suffixStart; // integer
        protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
 
        /**
         * @param $dir string file system directory
+        * @param $params array
         */
-       public function __construct( $dir ) {
+       public function __construct( $dir, array $params ) {
                $dir = realpath( $dir ); // normalize
                $this->suffixStart = strlen( $dir ) + 1; // size of "path/to/dir/"
+               $this->params = $params;
+
                try {
-                       # 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_FILEINFO | FilesystemIterator::SKIP_DOTS;
-                               $this->iter = new RecursiveIteratorIterator( 
-                                       new RecursiveDirectoryIterator( $dir, $flags ) );
-                       } else { // PHP < 5.3
-                               # RecursiveDirectoryIterator extends DirectoryIterator
-                               $this->iter = new RecursiveIteratorIterator( 
-                                       new RecursiveDirectoryIterator( $dir ) );
-                       }
+                       $this->iter = $this->initIterator( $dir );
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null; // bad permissions? deleted?
                }
        }
 
        /**
-        * @see Iterator::current()
-        * @return string|bool String or false
+        * Return an appropriate iterator object to wrap
+        *
+        * @param $dir string file system directory
+        * @return Iterator
         */
-       public function current() {
-               // Return only the relative path and normalize slashes to FileBackend-style
-               // Make sure to use the realpath since the suffix is based upon that
-               return str_replace( '\\', '/',
-                       substr( realpath( $this->iter->current() ), $this->suffixStart ) );
+       protected function initIterator( $dir ) {
+               if ( !empty( $this->params['topOnly'] ) ) { // non-recursive
+                       # Get an iterator that will get direct sub-nodes
+                       return new DirectoryIterator( $dir );
+               } else { // recursive
+                       # Get an iterator that will return leaf nodes (non-directories)
+                       # 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
+                       );
+               }
        }
 
        /**
@@ -598,6 +840,14 @@ class FSFileBackendFileList implements Iterator {
                return $this->pos;
        }
 
+       /**
+        * @see Iterator::current()
+        * @return string|bool String or false
+        */
+       public function current() {
+               return $this->getRelPath( $this->iter->current()->getPathname() );
+       }
+
        /**
         * @see Iterator::next()
         * @return void
@@ -605,6 +855,7 @@ class FSFileBackendFileList implements Iterator {
        public function next() {
                try {
                        $this->iter->next();
+                       $this->filterViaNext();
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null;
                }
@@ -619,6 +870,7 @@ class FSFileBackendFileList implements Iterator {
                $this->pos = 0;
                try {
                        $this->iter->rewind();
+                       $this->filterViaNext();
                } catch ( UnexpectedValueException $e ) {
                        $this->iter = null;
                }
@@ -631,4 +883,44 @@ class FSFileBackendFileList implements Iterator {
        public function valid() {
                return $this->iter && $this->iter->valid();
        }
+
+       /**
+        * Filter out items by advancing to the next ones
+        */
+       protected function filterViaNext() {}
+
+       /**
+        * Return only the relative path and normalize slashes to FileBackend-style.
+        * Uses the "real path" since the suffix is based upon that.
+        *
+        * @param $path string
+        * @return string
+        */
+       protected function getRelPath( $path ) {
+               return strtr( substr( realpath( $path ), $this->suffixStart ), '\\', '/' );
+       }
+}
+
+class FSFileBackendDirList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( $this->iter->current()->isDot() || !$this->iter->current()->isDir() ) {
+                               $this->iter->next(); // skip non-directories and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
+}
+
+class FSFileBackendFileList extends FSFileBackendList {
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       if ( !$this->iter->current()->isFile() ) {
+                               $this->iter->next(); // skip non-files and dot files
+                       } else {
+                               break;
+                       }
+               }
+       }
 }
index 44f4d94..3cc9021 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
  *
  * This class defines the methods as abstract that subclasses must implement.
  * Outside callers can assume that all backends will have these functions.
- * 
+ *
  * All "storage paths" are of the format "mwstore://<backend>/<container>/<path>".
- * The <path> portion is a relative path that uses UNIX file system (FS) notation, 
- * though any particular backend may not actually be using a local filesystem. 
+ * The <path> portion is a relative path that uses UNIX file system (FS) notation,
+ * though any particular backend may not actually be using a local filesystem.
  * Therefore, the relative paths are only virtual.
- * 
+ *
  * Backend contents are stored under wiki-specific container names by default.
  * For legacy reasons, this has no effect for the FS backend class, and per-wiki
  * segregation must be done by setting the container paths appropriately.
- * 
+ *
  * FS-based backends are somewhat more restrictive due to the existence of real
  * directory files; a regular file cannot have the same name as a directory. Other
  * backends with virtual directories may not have this limitation. Callers should
  * store files in such a way that no files and directories are under the same path.
- * 
+ *
  * Methods should avoid throwing exceptions at all costs.
  * As a corollary, external dependencies should be kept to a minimum.
- * 
+ *
  * @ingroup FileBackend
  * @since 1.19
  */
@@ -43,6 +60,9 @@ abstract class FileBackend {
        protected $name; // string; unique backend name
        protected $wikiId; // string; unique wiki name
        protected $readOnly; // string; read-only explanation message
+       protected $parallelize; // string; when to do operations in parallel
+       protected $concurrency; // integer; how many operations can be done in parallel
+
        /** @var LockManager */
        protected $lockManager;
        /** @var FileJournal */
@@ -51,7 +71,7 @@ abstract class FileBackend {
        /**
         * Create a new backend instance from configuration.
         * This should only be called from within FileBackendGroup.
-        * 
+        *
         * $config includes:
         *     'name'        : The unique name of this backend.
         *                     This should consist of alphanumberic, '-', and '_' characters.
@@ -63,8 +83,12 @@ abstract class FileBackend {
         *                     Journals simply log changes to files stored in the backend.
         *     'readOnly'    : Write operations are disallowed if this is a non-empty string.
         *                     It should be an explanation for the backend being read-only.
-        * 
+        *     'parallelize' : When to do file operations in parallel (when possible).
+        *                     Allowed values are "implicit", "explicit" and "off".
+        *     'concurrency' : How many file operations can be done in parallel.
+        *
         * @param $config Array
+        * @throws MWException
         */
        public function __construct( array $config ) {
                $this->name = $config['name'];
@@ -83,13 +107,19 @@ abstract class FileBackend {
                $this->readOnly = isset( $config['readOnly'] )
                        ? (string)$config['readOnly']
                        : '';
+               $this->parallelize = isset( $config['parallelize'] )
+                       ? (string)$config['parallelize']
+                       : 'off';
+               $this->concurrency = isset( $config['concurrency'] )
+                       ? (int)$config['concurrency']
+                       : 50;
        }
 
        /**
         * Get the unique backend name.
         * We may have multiple different backends of the same type.
         * For example, we can have two Swift backends using different proxies.
-        * 
+        *
         * @return string
         */
        final public function getName() {
@@ -98,7 +128,7 @@ abstract class FileBackend {
 
        /**
         * Check if this backend is read-only
-        * 
+        *
         * @return bool
         */
        final public function isReadOnly() {
@@ -107,7 +137,7 @@ abstract class FileBackend {
 
        /**
         * Get an explanatory message if this backend is read-only
-        * 
+        *
         * @return string|bool Returns false if the backend is not read-only
         */
        final public function getReadOnlyReason() {
@@ -119,10 +149,10 @@ abstract class FileBackend {
         * Callers supply an ordered list of operations to perform as a transaction.
         * Files will be locked, the stat cache cleared, and then the operations attempted.
         * If any serious errors occur, all attempted operations will be rolled back.
-        * 
+        *
         * $ops is an array of arrays. The outer array holds a list of operations.
         * Each inner array is a set of key value pairs that specify an operation.
-        * 
+        *
         * Supported operations and their parameters:
         * a) Create a new file in storage with the contents of a string
         *     array(
@@ -166,7 +196,7 @@ abstract class FileBackend {
         *     array(
         *         'op'                  => 'null',
         *     )
-        * 
+        *
         * Boolean flags for operations (operation-specific):
         * 'ignoreMissingSource' : The operation will simply succeed and do
         *                         nothing if the source file does not exist.
@@ -174,10 +204,11 @@ abstract class FileBackend {
         * 'overwriteSame'       : An error will not be given if a file already
         *                         exists at the destination that has the same
         *                         contents as the new contents to be written there.
-        * 
+        *
         * $opts is an associative of boolean flags, including:
-        * 'force'               : Errors that would normally cause a rollback do not.
-        *                         The remaining operations are still attempted if any fail.
+        * 'force'               : Operation precondition errors no longer trigger an abort.
+        *                         Any remaining operations are still attempted. Unexpected
+        *                         failures may still cause remaning operations to be aborted.
         * 'nonLocking'          : No locks are acquired for the operations.
         *                         This can increase performance for non-critical writes.
         *                         This has no effect unless the 'force' flag is set.
@@ -186,19 +217,20 @@ abstract class FileBackend {
         *                         This has no effect unless the 'force' flag is set.
         * 'nonJournaled'        : Don't log this operation batch in the file journal.
         *                         This limits the ability of recovery scripts.
-        * 
+        * 'parallelize'         : Try to do operations in parallel when possible.
+        *
         * Remarks on locking:
         * File system paths given to operations should refer to files that are
         * already locked or otherwise safe from modification from other processes.
         * Normally these files will be new temp files, which should be adequate.
-        * 
+        *
         * Return value:
         * This returns a Status, which contains all warnings and fatals that occured
         * during the operation. The 'failCount', 'successCount', and 'success' members
         * will reflect each operation attempted. The status will be "OK" unless:
         *     a) unexpected operation errors occurred (network partitions, disk full...)
         *     b) significant operation errors occured and 'force' was not set
-        * 
+        *
         * @param $ops Array List of operations to execute in order
         * @param $opts Array Batch operation options
         * @return Status
@@ -211,6 +243,16 @@ abstract class FileBackend {
                        unset( $opts['nonLocking'] );
                        unset( $opts['allowStale'] );
                }
+               $opts['concurrency'] = 1; // off
+               if ( $this->parallelize === 'implicit' ) {
+                       if ( !isset( $opts['parallelize'] ) || $opts['parallelize'] ) {
+                               $opts['concurrency'] = $this->concurrency;
+                       }
+               } elseif ( $this->parallelize === 'explicit' ) {
+                       if ( !empty( $opts['parallelize'] ) ) {
+                               $opts['concurrency'] = $this->concurrency;
+                       }
+               }
                return $this->doOperationsInternal( $ops, $opts );
        }
 
@@ -245,8 +287,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function create( array $params, array $opts = array() ) {
-               $params['op'] = 'create';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'create' ) + $params, $opts );
        }
 
        /**
@@ -260,8 +301,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function store( array $params, array $opts = array() ) {
-               $params['op'] = 'store';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'store' ) + $params, $opts );
        }
 
        /**
@@ -275,8 +315,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function copy( array $params, array $opts = array() ) {
-               $params['op'] = 'copy';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'copy' ) + $params, $opts );
        }
 
        /**
@@ -290,8 +329,7 @@ abstract class FileBackend {
         * @return Status
         */
        final public function move( array $params, array $opts = array() ) {
-               $params['op'] = 'move';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'move' ) + $params, $opts );
        }
 
        /**
@@ -305,8 +343,164 @@ abstract class FileBackend {
         * @return Status
         */
        final public function delete( array $params, array $opts = array() ) {
-               $params['op'] = 'delete';
-               return $this->doOperation( $params, $opts );
+               return $this->doOperation( array( 'op' => 'delete' ) + $params, $opts );
+       }
+
+       /**
+        * Perform a set of independent file operations on some files.
+        *
+        * This does no locking, nor journaling, and possibly no stat calls.
+        * Any destination files that already exist will be overwritten.
+        * This should *only* be used on non-original files, like cache files.
+        *
+        * Supported operations and their parameters:
+        * a) Create a new file in storage with the contents of a string
+        *     array(
+        *         'op'                  => 'create',
+        *         'dst'                 => <storage path>,
+        *         'content'             => <string of new file contents>
+        *     )
+        * b) Copy a file system file into storage
+        *     array(
+        *         'op'                  => 'store',
+        *         'src'                 => <file system path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * c) Copy a file within storage
+        *     array(
+        *         'op'                  => 'copy',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * d) Move a file within storage
+        *     array(
+        *         'op'                  => 'move',
+        *         'src'                 => <storage path>,
+        *         'dst'                 => <storage path>
+        *     )
+        * e) Delete a file within storage
+        *     array(
+        *         'op'                  => 'delete',
+        *         'src'                 => <storage path>,
+        *         'ignoreMissingSource' => <boolean>
+        *     )
+        * f) Do nothing (no-op)
+        *     array(
+        *         'op'                  => 'null',
+        *     )
+        *
+        * Boolean flags for operations (operation-specific):
+        * 'ignoreMissingSource' : The operation will simply succeed and do
+        *                         nothing if the source file does not exist.
+        *
+        * Return value:
+        * This returns a Status, which contains all warnings and fatals that occured
+        * during the operation. The 'failCount', 'successCount', and 'success' members
+        * will reflect each operation attempted for the given files. The status will be
+        * considered "OK" as long as no fatal errors occured.
+        *
+        * @param $ops Array Set of operations to execute
+        * @return Status
+        * @since 1.20
+        */
+       final public function doQuickOperations( array $ops ) {
+               if ( $this->isReadOnly() ) {
+                       return Status::newFatal( 'backend-fail-readonly', $this->name, $this->readOnly );
+               }
+               foreach ( $ops as &$op ) {
+                       $op['overwrite'] = true; // avoids RTTs in key/value stores
+               }
+               return $this->doQuickOperationsInternal( $ops );
+       }
+
+       /**
+        * @see FileBackend::doQuickOperations()
+        * @since 1.20
+        */
+       abstract protected function doQuickOperationsInternal( array $ops );
+
+       /**
+        * Same as doQuickOperations() except it takes a single operation.
+        * If you are doing a batch of operations, then use that function instead.
+        *
+        * @see FileBackend::doQuickOperations()
+        *
+        * @param $op Array Operation
+        * @return Status
+        * @since 1.20
+        */
+       final public function doQuickOperation( array $op ) {
+               return $this->doQuickOperations( array( $op ) );
+       }
+
+       /**
+        * Performs a single quick create operation.
+        * This sets $params['op'] to 'create' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCreate( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'create' ) + $params );
+       }
+
+       /**
+        * Performs a single quick store operation.
+        * This sets $params['op'] to 'store' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickStore( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'store' ) + $params );
+       }
+
+       /**
+        * Performs a single quick copy operation.
+        * This sets $params['op'] to 'copy' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickCopy( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'copy' ) + $params );
+       }
+
+       /**
+        * Performs a single quick move operation.
+        * This sets $params['op'] to 'move' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickMove( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'move' ) + $params );
+       }
+
+       /**
+        * Performs a single quick delete operation.
+        * This sets $params['op'] to 'delete' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.20
+        */
+       final public function quickDelete( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'delete' ) + $params );
        }
 
        /**
@@ -315,8 +509,8 @@ abstract class FileBackend {
         * otherwise safe from modification from other processes. Normally,
         * the file will be a new temp file, which should be adequate.
         * $params include:
-        *     srcs          : ordered source storage paths (e.g. chunk1, chunk2, ...)
-        *     dst           : file system path to 0-byte temp file
+        *     srcs : ordered source storage paths (e.g. chunk1, chunk2, ...)
+        *     dst  : file system path to 0-byte temp file
         *
         * @param $params Array Operation parameters
         * @return Status
@@ -327,10 +521,10 @@ abstract class FileBackend {
         * Prepare a storage directory for usage.
         * This will create any required containers and parent directories.
         * Backends using key/value stores only need to create the container.
-        * 
+        *
         * $params include:
         *     dir : storage directory
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -352,12 +546,12 @@ abstract class FileBackend {
         * files whereas key/value store backends might restrict container
         * access to the auth user that represents end-users in web request.
         * This is not guaranteed to actually do anything.
-        * 
+        *
         * $params include:
         *     dir       : storage directory
         *     noAccess  : try to deny file access
         *     noListing : try to deny file listing
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -381,10 +575,11 @@ abstract class FileBackend {
         * Delete a storage directory if it is empty.
         * Backends using key/value stores may do nothing unless the directory
         * is that of an empty container, in which case it should be deleted.
-        * 
+        *
         * $params include:
-        *     dir : storage directory
-        * 
+        *     dir       : storage directory
+        *     recursive : recursively delete empty subdirectories first (@since 1.20)
+        *
         * @param $params Array
         * @return Status
         */
@@ -403,11 +598,11 @@ abstract class FileBackend {
        /**
         * Check if a file exists at a storage path in the backend.
         * This returns false if only a directory exists at the path.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return bool|null Returns null on failure
         */
@@ -415,11 +610,11 @@ abstract class FileBackend {
 
        /**
         * Get the last-modified timestamp of the file at a storage path.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool TS_MW timestamp or false on failure
         */
@@ -428,11 +623,11 @@ abstract class FileBackend {
        /**
         * Get the contents of a file at a storage path in the backend.
         * This should be avoided for potentially large files.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool Returns false on failure
         */
@@ -440,11 +635,11 @@ abstract class FileBackend {
 
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return integer|bool Returns false on failure
         */
@@ -457,11 +652,11 @@ abstract class FileBackend {
         *     mtime  : the last-modified timestamp (TS_MW)
         *     size   : the file size (bytes)
         * Additional values may be included for internal use only.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Array|bool|null Returns null on failure
         */
@@ -469,11 +664,11 @@ abstract class FileBackend {
 
        /**
         * Get a SHA-1 hash of the file at a storage path in the backend.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return string|bool Hash string or false on failure
         */
@@ -482,11 +677,11 @@ abstract class FileBackend {
        /**
         * Get the properties of the file at a storage path in the backend.
         * Returns FSFile::placeholderProps() on failure.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Array
         */
@@ -498,12 +693,12 @@ abstract class FileBackend {
         * Appropriate HTTP headers (Status, Content-Type, Content-Length)
         * must be sent if streaming began, while none should be sent otherwise.
         * Implementations should flush the output buffer before sending data.
-        * 
+        *
         * $params include:
         *     src     : source storage path
         *     headers : additional HTTP headers to send on success
         *     latest  : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return Status
         */
@@ -516,16 +711,16 @@ abstract class FileBackend {
         *    The temporary copy will have the same extension as the source.
         * b) An original of the file at a storage path in the backend.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * Write operations should *never* be done on this file as some backends
         * may do internal tracking or may be instances of FileBackendMultiWrite.
         * In that later case, there are copies of the file that must stay in sync.
         * Additionally, further calls to this function may return the same file.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return FSFile|null Returns null on failure
         */
@@ -535,33 +730,105 @@ abstract class FileBackend {
         * Get a local copy on disk of the file at a storage path in the backend.
         * The temporary copy will have the same file extension as the source.
         * Temporary files may be purged when the file object falls out of scope.
-        * 
+        *
         * $params include:
         *     src    : source storage path
         *     latest : use the latest available data
-        * 
+        *
         * @param $params Array
         * @return TempFSFile|null Returns null on failure
         */
        abstract public function getLocalCopy( array $params );
 
        /**
-        * Get an iterator to list out all stored files under a storage directory.
-        * If the directory is of the form "mwstore://backend/container", 
+        * Check if a directory exists at a given storage path.
+        * Backends using key/value stores will check if the path is a
+        * virtual directory, meaning there are files under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @param $params array
+        * @return bool|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function directoryExists( array $params );
+
+       /**
+        * Get an iterator to list *all* directories under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
+        * then all directories in the container should be listed.
+        * If the directory is of form "mwstore://backend/container/dir",
+        * then all directories directly under that directory should be listed.
+        * Results should be storage directories relative to the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir     : storage directory
+        *     topOnly : only return direct child dirs of the directory
+        *
+        * @param $params array
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       abstract public function getDirectoryList( array $params );
+
+       /**
+        * Same as FileBackend::getDirectoryList() except only lists
+        * directories that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @param $params array
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopDirectoryList( array $params ) {
+               return $this->getDirectoryList( array( 'topOnly' => true ) + $params );
+       }
+
+       /**
+        * Get an iterator to list *all* stored files under a storage directory.
+        * If the directory is of the form "mwstore://backend/container",
         * then all files in the container should be listed.
         * If the directory is of form "mwstore://backend/container/dir",
-        * then all files under that container directory should be listed.
+        * then all files under that directory should be listed.
         * Results should be storage paths relative to the given directory.
-        * 
+        *
         * Storage backends with eventual consistency might return stale data.
-        * 
+        *
         * $params include:
-        *     dir : storage path directory
+        *     dir     : storage directory
+        *     topOnly : only return direct child files of the directory (@since 1.20)
         *
+        * @param $params array
         * @return Traversable|Array|null Returns null on failure
         */
        abstract public function getFileList( array $params );
 
+       /**
+        * Same as FileBackend::getFileList() except only lists
+        * files that are immediately under the given directory.
+        *
+        * Storage backends with eventual consistency might return stale data.
+        *
+        * $params include:
+        *     dir : storage directory
+        *
+        * @param $params array
+        * @return Traversable|Array|null Returns null on failure
+        * @since 1.20
+        */
+       final public function getTopFileList( array $params ) {
+               return $this->getFileList( array( 'topOnly' => true ) + $params );
+       }
+
        /**
         * Invalidate any in-process file existence and property cache.
         * If $paths is given, then only the cache for those files will be cleared.
@@ -574,9 +841,9 @@ abstract class FileBackend {
        /**
         * Lock the files at the given storage paths in the backend.
         * This will either lock all the files or none (on failure).
-        * 
+        *
         * Callers should consider using getScopedFileLocks() instead.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
@@ -587,7 +854,7 @@ abstract class FileBackend {
 
        /**
         * Unlock the files at the given storage paths in the backend.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return Status
@@ -600,10 +867,10 @@ abstract class FileBackend {
         * Lock the files at the given storage paths in the backend.
         * This will either lock all the files or none (on failure).
         * On failure, the status object will be updated with errors.
-        * 
+        *
         * Once the return value goes out scope, the locks will be released and
         * the status updated. Unlock fatals will not change the status "OK" value.
-        * 
+        *
         * @param $paths Array Storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @param $status Status Status to update on lock/unlock
@@ -613,10 +880,48 @@ abstract class FileBackend {
                return ScopedLock::factory( $this->lockManager, $paths, $type, $status );
        }
 
+       /**
+        * Get an array of scoped locks needed for a batch of file operations.
+        *
+        * Normally, FileBackend::doOperations() handles locking, unless
+        * the 'nonLocking' param is passed in. This function is useful if you
+        * want the files to be locked for a broader scope than just when the
+        * files are changing. For example, if you need to update DB metadata,
+        * you may want to keep the files locked until finished.
+        *
+        * @see FileBackend::doOperations()
+        *
+        * @param $ops Array List of file operations to FileBackend::doOperations()
+        * @param $status Status Status to update on lock/unlock
+        * @return Array List of ScopedFileLocks or null values
+        * @since 1.20
+        */
+       abstract public function getScopedLocksForOps( array $ops, Status $status );
+
+       /**
+        * Get the root storage path of this backend.
+        * All container paths are "subdirectories" of this path.
+        *
+        * @return string Storage path
+        * @since 1.20
+        */
+       final public function getRootStoragePath() {
+               return "mwstore://{$this->name}";
+       }
+
+       /**
+        * Get the file journal object for this backend
+        *
+        * @return FileJournal
+        */
+       final public function getJournal() {
+               return $this->fileJournal;
+       }
+
        /**
         * Check if a given path is a "mwstore://" path.
         * This does not do any further validation or any existence checks.
-        * 
+        *
         * @param $path string
         * @return bool
         */
@@ -625,7 +930,7 @@ abstract class FileBackend {
        }
 
        /**
-        * Split a storage path into a backend name, a container name, 
+        * Split a storage path into a backend name, a container name,
         * and a relative file path. The relative path may be the empty string.
         * This does not do any path normalization or traversal checks.
         *
@@ -640,7 +945,7 @@ abstract class FileBackend {
                                if ( count( $parts ) == 3 ) {
                                        return $parts; // e.g. "backend/container/path"
                                } else {
-                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container" 
+                                       return array( $parts[0], $parts[1], '' ); // e.g. "backend/container"
                                }
                        }
                }
@@ -650,9 +955,9 @@ abstract class FileBackend {
        /**
         * Normalize a storage path by cleaning up directory separators.
         * Returns null if the path is not of the format of a valid storage path.
-        * 
+        *
         * @param $storagePath string
-        * @return string|null 
+        * @return string|null
         */
        final public static function normalizeStoragePath( $storagePath ) {
                list( $backend, $container, $relPath ) = self::splitStoragePath( $storagePath );
@@ -671,7 +976,7 @@ abstract class FileBackend {
         * Get the parent storage directory of a storage path.
         * This returns a path like "mwstore://backend/container",
         * "mwstore://backend/container/...", or null if there is no parent.
-        * 
+        *
         * @param $storagePath string
         * @return string|null
         */
@@ -683,7 +988,7 @@ abstract class FileBackend {
 
        /**
         * Get the final extension from a storage or FS path
-        * 
+        *
         * @param $path string
         * @return string
         */
@@ -697,6 +1002,7 @@ abstract class FileBackend {
         *
         * @param $path string
         * @return bool
+        * @since 1.20
         */
        final public static function isPathTraversalFree( $path ) {
                return ( self::normalizeContainerPath( $path ) !== null );
@@ -728,7 +1034,7 @@ abstract class FileBackend {
                                strpos( $path, '../' ) === 0 ||
                                strpos( $path, '/./' ) !== false ||
                                strpos( $path, '/../' ) !== false
-                       ) { 
+                       ) {
                                return null;
                        }
                }
index 73815cf..8bbc96d 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
@@ -21,7 +38,6 @@ class FileBackendGroup {
        protected $backends = array();
 
        protected function __construct() {}
-       protected function __clone() {}
 
        /**
         * @return FileBackendGroup
@@ -36,7 +52,7 @@ class FileBackendGroup {
 
        /**
         * Destroy the singleton instance
-        * 
+        *
         * @return void
         */
        public static function destroySingleton() {
@@ -45,7 +61,7 @@ class FileBackendGroup {
 
        /**
         * Register file backends from the global variables
-        * 
+        *
         * @return void
         */
        protected function initFromGlobals() {
@@ -140,6 +156,21 @@ class FileBackendGroup {
                return $this->backends[$name]['instance'];
        }
 
+       /**
+        * Get the config array for a backend object with a given name
+        *
+        * @param $name string
+        * @return Array
+        * @throws MWException
+        */
+       public function config( $name ) {
+               if ( !isset( $this->backends[$name] ) ) {
+                       throw new MWException( "No backend defined with the name `$name`." );
+               }
+               $class = $this->backends[$name]['class'];
+               return array( 'class' => $class ) + $this->backends[$name]['config'];
+       }
+
        /**
         * Get an appropriate backend object from a storage path
         *
index 9c3cf5b..efc6053 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
@@ -7,7 +24,7 @@
 
 /**
  * @brief Proxy backend that mirrors writes to several internal backends.
- * 
+ *
  * This class defines a multi-write backend. Multiple backends can be
  * registered to this proxy backend and it will act as a single backend.
  * Use this when all access to those backends is through this proxy backend.
@@ -40,6 +57,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                     FileBackendStore class, but with these additional settings:
         *                         'class'         : The name of the backend class
         *                         'isMultiMaster' : This must be set for one backend.
+        *                         'template:      : If given a backend name, this will use
+        *                                           the config of that backend as a template.
+        *                                           Values specified here take precedence.
         *     'syncChecks'  : Integer bitfield of internal backend sync checks to perform.
         *                     Possible bits include self::CHECK_SIZE and self::CHECK_TIME.
         *                     The checks are done before allowing any file operations.
@@ -51,6 +71,11 @@ class FileBackendMultiWrite extends FileBackend {
                // Construct backends here rather than via registration
                // to keep these backends hidden from outside the proxy.
                foreach ( $config['backends'] as $index => $config ) {
+                       if ( isset( $config['template'] ) ) {
+                               // Config is just a modified version of a registered backend's.
+                               // This should only be used when that config is used only be this backend.
+                               $config = $config + FileBackendGroup::singleton()->config( $config['template'] );
+                       }
                        $name = $config['name'];
                        if ( isset( $namesUsed[$name] ) ) { // don't break FileOp predicates
                                throw new MWException( "Two or more backends defined with the name $name." );
@@ -84,8 +109,7 @@ class FileBackendMultiWrite extends FileBackend {
                $status = Status::newGood();
 
                $performOps = array(); // list of FileOp objects
-               $filesRead = array(); // storage paths read from
-               $filesChanged = array(); // storage paths written to
+               $paths = array(); // storage paths read from or written to
                // Build up a list of FileOps. The list will have all the ops
                // for one backend, then all the ops for the next, and so on.
                // These batches of ops are all part of a continuous array.
@@ -93,29 +117,23 @@ class FileBackendMultiWrite extends FileBackend {
                foreach ( $this->backends as $index => $backend ) {
                        $backendOps = $this->substOpBatchPaths( $ops, $backend );
                        // Add on the operation batch for this backend
-                       $performOps = array_merge( $performOps, $backend->getOperations( $backendOps ) );
+                       $performOps = array_merge( $performOps,
+                               $backend->getOperationsInternal( $backendOps ) );
                        if ( $index == 0 ) { // first batch
                                // Get the files used for these operations. Each backend has a batch of
                                // the same operations, so we only need to get them from the first batch.
-                               foreach ( $performOps as $fileOp ) {
-                                       $filesRead = array_merge( $filesRead, $fileOp->storagePathsRead() );
-                                       $filesChanged = array_merge( $filesChanged, $fileOp->storagePathsChanged() );
-                               }
+                               $paths = $backend->getPathsToLockForOpsInternal( $performOps );
                                // Get the paths under the proxy backend's name
-                               $filesRead = $this->unsubstPaths( $filesRead );
-                               $filesChanged = $this->unsubstPaths( $filesChanged );
+                               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+                               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
                        }
                }
 
                // Try to lock those files for the scope of this function...
                if ( empty( $opts['nonLocking'] ) ) {
-                       $filesLockSh = array_diff( $filesRead, $filesChanged ); // optimization
-                       $filesLockEx = $filesChanged;
-                       // Get a shared lock on the parent directory of each path changed
-                       $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
@@ -126,14 +144,14 @@ class FileBackendMultiWrite extends FileBackend {
 
                // Do a consistency check to see if the backends agree
                if ( count( $this->backends ) > 1 ) {
-                       $status->merge( $this->consistencyCheck( array_merge( $filesRead, $filesChanged ) ) );
+                       $status->merge( $this->consistencyCheck( array_merge( $paths['sh'], $paths['ex'] ) ) );
                        if ( !$status->isOK() ) {
                                return $status; // abort
                        }
                }
 
                // Actually attempt the operation batch...
-               $subStatus = FileOp::attemptBatch( $performOps, $opts, $this->fileJournal );
+               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
 
                $success = array();
                $failCount = 0;
@@ -220,7 +238,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * Substitute the backend name in storage path parameters
         * for a set of operations with that of a given internal backend.
-        * 
+        *
         * @param $ops Array List of file operation arrays
         * @param $backend FileBackendStore
         * @return Array
@@ -241,8 +259,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Same as substOpBatchPaths() but for a single operation
-        * 
-        * @param $op File operation array
+        *
+        * @param $ops array File operation array
         * @param $backend FileBackendStore
         * @return Array
         */
@@ -253,7 +271,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Substitute the backend of storage paths with an internal backend's name
-        * 
+        *
         * @param $paths Array|string List of paths or single string path
         * @param $backend FileBackendStore
         * @return Array|string
@@ -268,7 +286,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * Substitute the backend of internal storage paths with the proxy backend's name
-        * 
+        *
         * @param $paths Array|string List of paths or single string path
         * @return Array|string
         */
@@ -280,6 +298,24 @@ class FileBackendMultiWrite extends FileBackend {
                );
        }
 
+       /**
+        * @see FileBackend::doQuickOperationsInternal()
+        * @return Status
+        */
+       public function doQuickOperationsInternal( array $ops ) {
+               // Do the operations on the master backend; setting Status fields...
+               $realOps = $this->substOpBatchPaths( $ops, $this->backends[$this->masterIndex] );
+               $status = $this->backends[$this->masterIndex]->doQuickOperations( $realOps );
+               // Propagate the operations to the clone backends...
+               foreach ( $this->backends as $index => $backend ) {
+                       if ( $index !== $this->masterIndex ) { // not done already
+                               $realOps = $this->substOpBatchPaths( $ops, $backend );
+                               $status->merge( $backend->doQuickOperations( $realOps ) );
+                       }
+               }
+               return $status;
+       }
+
        /**
         * @see FileBackend::doPrepare()
         * @return Status
@@ -295,6 +331,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::doSecure()
+        * @param $params array
         * @return Status
         */
        protected function doSecure( array $params ) {
@@ -308,6 +345,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::doClean()
+        * @param $params array
         * @return Status
         */
        protected function doClean( array $params ) {
@@ -320,7 +358,9 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        /**
-        * @see FileBackend::getFileList()
+        * @see FileBackend::concatenate()
+        * @param $params array
+        * @return Status
         */
        public function concatenate( array $params ) {
                // We are writing to an FS file, so we don't need to do this per-backend
@@ -330,6 +370,7 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::fileExists()
+        * @param $params array
         */
        public function fileExists( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -338,6 +379,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileTimestamp()
+        * @param $params array
+        * @return bool|string
         */
        public function getFileTimestamp( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -346,6 +389,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileSize()
+        * @param $params array
+        * @return bool|int
         */
        public function getFileSize( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -354,6 +399,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileStat()
+        * @param $params array
+        * @return Array|bool|null
         */
        public function getFileStat( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -362,6 +409,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileContents()
+        * @param $params array
+        * @return bool|string
         */
        public function getFileContents( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -370,6 +419,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileSha1Base36()
+        * @param $params array
+        * @return bool|string
         */
        public function getFileSha1Base36( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -378,6 +429,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getFileProps()
+        * @param $params array
+        * @return Array
         */
        public function getFileProps( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -386,6 +439,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::streamFile()
+        * @param $params array
+        * @return \Status
         */
        public function streamFile( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -394,6 +449,8 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getLocalReference()
+        * @param $params array
+        * @return FSFile|null
         */
        public function getLocalReference( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -402,14 +459,38 @@ class FileBackendMultiWrite extends FileBackend {
 
        /**
         * @see FileBackend::getLocalCopy()
+        * @param $params array
+        * @return null|TempFSFile
         */
        public function getLocalCopy( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
                return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
        }
 
+       /**
+        * @see FileBackend::directoryExists()
+        * @param $params array
+        * @return bool|null
+        */
+       public function directoryExists( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->directoryExists( $realParams );
+       }
+
+       /**
+        * @see FileBackend::getSubdirectoryList()
+        * @param $params array
+        * @return Array|null|Traversable
+        */
+       public function getDirectoryList( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               return $this->backends[$this->masterIndex]->getDirectoryList( $realParams );
+       }
+
        /**
         * @see FileBackend::getFileList()
+        * @param $params array
+        * @return Array|null|\Traversable
         */
        public function getFileList( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -425,4 +506,20 @@ class FileBackendMultiWrite extends FileBackend {
                        $backend->clearCache( $realPaths );
                }
        }
+
+       /**
+        * @see FileBackend::getScopedLocksForOps()
+        */
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               $fileOps = $this->backends[$this->masterIndex]->getOperationsInternal( $ops );
+               // Get the paths to lock from the master backend
+               $paths = $this->backends[$this->masterIndex]->getPathsToLockForOpsInternal( $fileOps );
+               // Get the paths under the proxy backend's name
+               $paths['sh'] = $this->unsubstPaths( $paths['sh'] );
+               $paths['ex'] = $this->unsubstPaths( $paths['ex'] );
+               return array(
+                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
+                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+               );
+       }
 }
index 55dedc1..f2860f3 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
  * @since 1.19
  */
 abstract class FileBackendStore extends FileBackend {
+       /** @var BagOStuff */
+       protected $memCache;
+
        /** @var Array Map of paths to small (RAM/disk) cache items */
        protected $cache = array(); // (storage path => key => value)
-       protected $maxCacheSize = 100; // integer; max paths with entries
+       protected $maxCacheSize = 300; // integer; max paths with entries
        /** @var Array Map of paths to large (RAM/disk) cache items */
        protected $expensiveCache = array(); // (storage path => key => value)
-       protected $maxExpensiveCacheSize = 10; // integer; max paths with entries
+       protected $maxExpensiveCacheSize = 5; // integer; max paths with entries
 
        /** @var Array Map of container names to sharding settings */
        protected $shardViaHashLevels = array(); // (container name => config array)
 
        protected $maxFileSize = 4294967296; // integer bytes (4GiB)
 
+       /**
+        * @see FileBackend::__construct()
+        *
+        * @param $config Array
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+               $this->memCache = new EmptyBagOStuff(); // disabled by default
+       }
+
        /**
         * Get the maximum allowable file size given backend
         * medium restrictions and basic performance constraints.
@@ -60,6 +90,9 @@ abstract class FileBackendStore extends FileBackend {
         *     content       : the raw file contents
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
+        *     async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
         *
         * @param $params Array
         * @return Status
@@ -73,6 +106,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = $this->doCreateInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -92,6 +126,9 @@ abstract class FileBackendStore extends FileBackend {
         *     src           : source path on disk
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
+        *     async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
         *
         * @param $params Array
         * @return Status
@@ -100,10 +137,12 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
                if ( filesize( $params['src'] ) > $this->maxFileSizeInternal() ) {
-                       $status = Status::newFatal( 'backend-fail-store', $params['dst'] );
+                       $status = Status::newFatal( 'backend-fail-maxsize',
+                               $params['dst'], $this->maxFileSizeInternal() );
                } else {
                        $status = $this->doStoreInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
+                       $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -123,6 +162,9 @@ abstract class FileBackendStore extends FileBackend {
         *     src           : source storage path
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
+        *     async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
         *
         * @param $params Array
         * @return Status
@@ -132,6 +174,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( array( $params['dst'] ) );
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -149,6 +192,9 @@ abstract class FileBackendStore extends FileBackend {
         * $params include:
         *     src                 : source storage path
         *     ignoreMissingSource : do nothing if the source file does not exist
+        *     async               : Status will be returned immediately if supported.
+        *                           If the status is OK, then its value field will be
+        *                           set to a FileBackendStoreOpHandle object.
         *
         * @param $params Array
         * @return Status
@@ -158,6 +204,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doDeleteInternal( $params );
                $this->clearCache( array( $params['src'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -176,6 +223,9 @@ abstract class FileBackendStore extends FileBackend {
         *     src           : source storage path
         *     dst           : destination storage path
         *     overwrite     : overwrite any file that exists at the destination
+        *     async         : Status will be returned immediately if supported.
+        *                     If the status is OK, then its value field will be
+        *                     set to a FileBackendStoreOpHandle object.
         *
         * @param $params Array
         * @return Status
@@ -185,6 +235,8 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doMoveInternal( $params );
                $this->clearCache( array( $params['src'], $params['dst'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
+               $this->deleteFileCache( $params['dst'] ); // persistent cache
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
                return $status;
@@ -195,6 +247,7 @@ abstract class FileBackendStore extends FileBackend {
         * @return Status
         */
        protected function doMoveInternal( array $params ) {
+               unset( $params['async'] ); // two steps, won't work here :)
                // Copy source to dest
                $status = $this->copyInternal( $params );
                if ( $status->isOK() ) {
@@ -205,6 +258,17 @@ abstract class FileBackendStore extends FileBackend {
                return $status;
        }
 
+       /**
+        * No-op file operation that does nothing.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * @param $params Array
+        * @return Status
+        */
+       final public function nullInternal( array $params ) {
+               return Status::newGood();
+       }
+
        /**
         * @see FileBackend::concatenate()
         * @return Status
@@ -371,6 +435,17 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = Status::newGood();
 
+               // Recursive: first delete all empty subdirs recursively
+               if ( !empty( $params['recursive'] ) && !$this->directoriesAreVirtual() ) {
+                       $subDirsRel = $this->getTopDirectoryList( array( 'dir' => $params['dir'] ) );
+                       if ( $subDirsRel !== null ) { // no errors
+                               foreach ( $subDirsRel as $subDirRel ) {
+                                       $subDir = $params['dir'] . "/{$subDirRel}"; // full path
+                                       $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
+                               }
+                       }
+               }
+
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) {
                        $status->fatal( 'backend-fail-invalidpath', $params['dir'] );
@@ -390,11 +465,13 @@ abstract class FileBackendStore extends FileBackend {
 
                if ( $shard !== null ) { // confined to a single container/shard
                        $status->merge( $this->doCleanInternal( $fullCont, $dir, $params ) );
+                       $this->deleteContainerCache( $fullCont ); // purge cache
                } else { // directory is on several shards
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
                        foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
                                $status->merge( $this->doCleanInternal( "{$fullCont}{$suffix}", $dir, $params ) );
+                               $this->deleteContainerCache( "{$fullCont}{$suffix}" ); // purge cache
                        }
                }
 
@@ -455,15 +532,16 @@ abstract class FileBackendStore extends FileBackend {
         * @return bool
         */
        final public function getFileStat( array $params ) {
-               wfProfileIn( __METHOD__ );
-               wfProfileIn( __METHOD__ . '-' . $this->name );
                $path = self::normalizeStoragePath( $params['src'] );
                if ( $path === null ) {
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
                        return false; // invalid storage path
                }
-               $latest = !empty( $params['latest'] );
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $latest = !empty( $params['latest'] ); // use latest data?
+               if ( !isset( $this->cache[$path]['stat'] ) ) {
+                       $this->primeFileCache( array( $path ) ); // check persistent cache
+               }
                if ( isset( $this->cache[$path]['stat'] ) ) {
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
@@ -480,9 +558,17 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
                if ( is_array( $stat ) ) { // don't cache negatives
+                       $stat['latest'] = $latest;
                        $this->trimCache(); // limit memory
                        $this->cache[$path]['stat'] = $stat;
-                       $this->cache[$path]['stat']['latest'] = $latest;
+                       $this->setFileCache( $path, $stat ); // update persistent cache
+                       if ( isset( $stat['sha1'] ) ) { // some backends store SHA-1 as metadata
+                               $this->trimCache(); // limit memory
+                               $this->cache[$path]['sha1'] =
+                                       array( 'hash' => $stat['sha1'], 'latest' => $latest );
+                       }
+               } else {
+                       wfDebug( __METHOD__ . ": File $path does not exist.\n" );
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -520,14 +606,22 @@ abstract class FileBackendStore extends FileBackend {
         * @return bool|string
         */
        final public function getFileSha1Base36( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return false; // invalid storage path
+               }
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
-               $path = $params['src'];
+               $latest = !empty( $params['latest'] ); // use latest data?
                if ( isset( $this->cache[$path]['sha1'] ) ) {
-                       $this->pingCache( $path ); // LRU
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $this->cache[$path]['sha1'];
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $this->cache[$path]['sha1']['latest'] ) {
+                               $this->pingCache( $path ); // LRU
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $this->cache[$path]['sha1']['hash'];
+                       }
                }
                wfProfileIn( __METHOD__ . '-miss' );
                wfProfileIn( __METHOD__ . '-miss-' . $this->name );
@@ -536,7 +630,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileOut( __METHOD__ . '-miss' );
                if ( $hash ) { // don't cache negatives
                        $this->trimCache(); // limit memory
-                       $this->cache[$path]['sha1'] = $hash;
+                       $this->cache[$path]['sha1'] = array( 'hash' => $hash, 'latest' => $latest );
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -545,7 +639,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::getFileSha1Base36()
-        * @return bool
+        * @return bool|string
         */
        protected function doGetFileSha1Base36( array $params ) {
                $fsFile = $this->getLocalReference( $params );
@@ -575,19 +669,28 @@ abstract class FileBackendStore extends FileBackend {
         * @return TempFSFile|null
         */
        public function getLocalReference( array $params ) {
+               $path = self::normalizeStoragePath( $params['src'] );
+               if ( $path === null ) {
+                       return null; // invalid storage path
+               }
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
-               $path = $params['src'];
+               $latest = !empty( $params['latest'] ); // use latest data?
                if ( isset( $this->expensiveCache[$path]['localRef'] ) ) {
-                       $this->pingExpensiveCache( $path );
-                       wfProfileOut( __METHOD__ . '-' . $this->name );
-                       wfProfileOut( __METHOD__ );
-                       return $this->expensiveCache[$path]['localRef'];
+                       // If we want the latest data, check that this cached
+                       // value was in fact fetched with the latest available data.
+                       if ( !$latest || $this->expensiveCache[$path]['localRef']['latest'] ) {
+                               $this->pingExpensiveCache( $path );
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               return $this->expensiveCache[$path]['localRef']['object'];
+                       }
                }
                $tmpFile = $this->getLocalCopy( $params );
                if ( $tmpFile ) { // don't cache negatives
                        $this->trimExpensiveCache(); // limit memory
-                       $this->expensiveCache[$path]['localRef'] = $tmpFile;
+                       $this->expensiveCache[$path]['localRef'] =
+                               array( 'object' => $tmpFile, 'latest' => $latest );
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -646,22 +749,60 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * @copydoc FileBackend::getFileList()
-        * @return Array|null|Traversable
+        * @see FileBackend::directoryExists()
+        * @return bool|null
         */
-       final public function getFileList( array $params ) {
+       final public function directoryExists( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) {
+                       return false; // invalid storage path
+               }
+               if ( $shard !== null ) { // confined to a single container/shard
+                       return $this->doDirectoryExists( $fullCont, $dir, $params );
+               } else { // directory is on several shards
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       $res = false; // response
+                       foreach ( $this->getContainerSuffixes( $shortCont ) as $suffix ) {
+                               $exists = $this->doDirectoryExists( "{$fullCont}{$suffix}", $dir, $params );
+                               if ( $exists ) {
+                                       $res = true;
+                                       break; // found one!
+                               } elseif ( $exists === null ) { // error?
+                                       $res = null; // if we don't find anything, it is indeterminate
+                               }
+                       }
+                       return $res;
+               }
+       }
+
+       /**
+        * @see FileBackendStore::directoryExists()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return bool|null
+        */
+       abstract protected function doDirectoryExists( $container, $dir, array $params );
+
+       /**
+        * @see FileBackend::getDirectoryList()
+        * @return Traversable|Array|null Returns null on failure
+        */
+       final public function getDirectoryList( array $params ) {
                list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
                if ( $dir === null ) { // invalid storage path
                        return null;
                }
                if ( $shard !== null ) {
                        // File listing is confined to a single container/shard
-                       return $this->getFileListInternal( $fullCont, $dir, $params );
+                       return $this->getDirectoryListInternal( $fullCont, $dir, $params );
                } else {
                        wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
                        // File listing spans multiple containers/shards
                        list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
-                       return new FileBackendStoreShardListIterator( $this,
+                       return new FileBackendStoreShardDirIterator( $this,
                                $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
                }
        }
@@ -669,31 +810,48 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Do not call this function from places outside FileBackend
         *
-        * @see FileBackendStore::getFileList()
+        * @see FileBackendStore::getDirectoryList()
         *
         * @param $container string Resolved container name
         * @param $dir string Resolved path relative to container
         * @param $params Array
-        * @return Traversable|Array|null
+        * @return Traversable|Array|null Returns null on failure
         */
-       abstract public function getFileListInternal( $container, $dir, array $params );
+       abstract public function getDirectoryListInternal( $container, $dir, array $params );
 
        /**
-        * Get the list of supported operations and their corresponding FileOp classes.
-        *
-        * @return Array
+        * @see FileBackend::getFileList()
+        * @return Traversable|Array|null Returns null on failure
         */
-       protected function supportedOperations() {
-               return array(
-                       'store'       => 'StoreFileOp',
-                       'copy'        => 'CopyFileOp',
-                       'move'        => 'MoveFileOp',
-                       'delete'      => 'DeleteFileOp',
-                       'create'      => 'CreateFileOp',
-                       'null'        => 'NullFileOp'
-               );
+       final public function getFileList( array $params ) {
+               list( $fullCont, $dir, $shard ) = $this->resolveStoragePath( $params['dir'] );
+               if ( $dir === null ) { // invalid storage path
+                       return null;
+               }
+               if ( $shard !== null ) {
+                       // File listing is confined to a single container/shard
+                       return $this->getFileListInternal( $fullCont, $dir, $params );
+               } else {
+                       wfDebug( __METHOD__ . ": iterating over all container shards.\n" );
+                       // File listing spans multiple containers/shards
+                       list( $b, $shortCont, $r ) = self::splitStoragePath( $params['dir'] );
+                       return new FileBackendStoreShardFileIterator( $this,
+                               $fullCont, $dir, $this->getContainerSuffixes( $shortCont ), $params );
+               }
        }
 
+       /**
+        * Do not call this function from places outside FileBackend
+        *
+        * @see FileBackendStore::getFileList()
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract public function getFileListInternal( $container, $dir, array $params );
+
        /**
         * Return a list of FileOp objects from a list of operations.
         * Do not call this function from places outside FileBackend.
@@ -705,8 +863,15 @@ abstract class FileBackendStore extends FileBackend {
         * @return Array List of FileOp objects
         * @throws MWException
         */
-       final public function getOperations( array $ops ) {
-               $supportedOps = $this->supportedOperations();
+       final public function getOperationsInternal( array $ops ) {
+               $supportedOps = array(
+                       'store'       => 'StoreFileOp',
+                       'copy'        => 'CopyFileOp',
+                       'move'        => 'MoveFileOp',
+                       'delete'      => 'DeleteFileOp',
+                       'create'      => 'CreateFileOp',
+                       'null'        => 'NullFileOp'
+               );
 
                $performOps = array(); // array of FileOp objects
                // Build up ordered array of FileOps...
@@ -719,13 +884,48 @@ abstract class FileBackendStore extends FileBackend {
                                // Append the FileOp class
                                $performOps[] = new $class( $this, $params );
                        } else {
-                               throw new MWException( "Operation `$opName` is not supported." );
+                               throw new MWException( "Operation '$opName' is not supported." );
                        }
                }
 
                return $performOps;
        }
 
+       /**
+        * Get a list of storage paths to lock for a list of operations
+        * Returns an array with 'sh' (shared) and 'ex' (exclusive) keys,
+        * each corresponding to a list of storage paths to be locked.
+        *
+        * @param $performOps Array List of FileOp objects
+        * @return Array ('sh' => list of paths, 'ex' => list of paths)
+        */
+       final public function getPathsToLockForOpsInternal( array $performOps ) {
+               // Build up a list of files to lock...
+               $paths = array( 'sh' => array(), 'ex' => array() );
+               foreach ( $performOps as $fileOp ) {
+                       $paths['sh'] = array_merge( $paths['sh'], $fileOp->storagePathsRead() );
+                       $paths['ex'] = array_merge( $paths['ex'], $fileOp->storagePathsChanged() );
+               }
+               // Optimization: if doing an EX lock anyway, don't also set an SH one
+               $paths['sh'] = array_diff( $paths['sh'], $paths['ex'] );
+               // Get a shared lock on the parent directory of each path changed
+               $paths['sh'] = array_merge( $paths['sh'], array_map( 'dirname', $paths['ex'] ) );
+
+               return $paths;
+       }
+
+       /**
+        * @see FileBackend::getScopedLocksForOps()
+        * @return Array
+        */
+       public function getScopedLocksForOps( array $ops, Status $status ) {
+               $paths = $this->getPathsToLockForOpsInternal( $this->getOperationsInternal( $ops ) );
+               return array(
+                       $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status ),
+                       $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status )
+               );
+       }
+
        /**
         * @see FileBackend::doOperationsInternal()
         * @return Status
@@ -736,23 +936,15 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Build up a list of FileOps...
-               $performOps = $this->getOperations( $ops );
+               $performOps = $this->getOperationsInternal( $ops );
 
                // Acquire any locks as needed...
                if ( empty( $opts['nonLocking'] ) ) {
                        // Build up a list of files to lock...
-                       $filesLockEx = $filesLockSh = array();
-                       foreach ( $performOps as $fileOp ) {
-                               $filesLockSh = array_merge( $filesLockSh, $fileOp->storagePathsRead() );
-                               $filesLockEx = array_merge( $filesLockEx, $fileOp->storagePathsChanged() );
-                       }
-                       // Optimization: if doing an EX lock anyway, don't also set an SH one
-                       $filesLockSh = array_diff( $filesLockSh, $filesLockEx );
-                       // Get a shared lock on the parent directory of each path changed
-                       $filesLockSh = array_merge( $filesLockSh, array_map( 'dirname', $filesLockEx ) );
+                       $paths = $this->getPathsToLockForOpsInternal( $performOps );
                        // Try to lock those files for the scope of this function...
-                       $scopeLockS = $this->getScopedFileLocks( $filesLockSh, LockManager::LOCK_UW, $status );
-                       $scopeLockE = $this->getScopedFileLocks( $filesLockEx, LockManager::LOCK_EX, $status );
+                       $scopeLockS = $this->getScopedFileLocks( $paths['sh'], LockManager::LOCK_UW, $status );
+                       $scopeLockE = $this->getScopedFileLocks( $paths['ex'], LockManager::LOCK_EX, $status );
                        if ( !$status->isOK() ) {
                                wfProfileOut( __METHOD__ . '-' . $this->name );
                                wfProfileOut( __METHOD__ );
@@ -760,11 +952,15 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               // Clear any cache entries (after locks acquired)
+               // Clear any file cache entries (after locks acquired)
                $this->clearCache();
 
+               // Load from the persistent file and container caches
+               $this->primeFileCache( $performOps );
+               $this->primeContainerCache( $performOps );
+
                // Actually attempt the operation batch...
-               $subStatus = FileOp::attemptBatch( $performOps, $opts, $this->fileJournal );
+               $subStatus = FileOpBatch::attempt( $performOps, $opts, $this->fileJournal );
 
                // Merge errors into status fields
                $status->merge( $subStatus );
@@ -775,6 +971,105 @@ abstract class FileBackendStore extends FileBackend {
                return $status;
        }
 
+       /**
+        * @see FileBackend::doQuickOperationsInternal()
+        * @return Status
+        * @throws MWException
+        */
+       final protected function doQuickOperationsInternal( array $ops ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = Status::newGood();
+
+               $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
+               $async = ( $this->parallelize === 'implicit' );
+               $maxConcurrency = $this->concurrency; // throttle
+
+               $statuses = array(); // array of (index => Status)
+               $fileOpHandles = array(); // list of (index => handle) arrays
+               $curFileOpHandles = array(); // current handle batch
+               // Perform the sync-only ops and build up op handles for the async ops...
+               foreach ( $ops as $index => $params ) {
+                       if ( !in_array( $params['op'], $supportedOps ) ) {
+                               wfProfileOut( __METHOD__ . '-' . $this->name );
+                               wfProfileOut( __METHOD__ );
+                               throw new MWException( "Operation '{$params['op']}' is not supported." );
+                       }
+                       $method = $params['op'] . 'Internal'; // e.g. "storeInternal"
+                       $subStatus = $this->$method( array( 'async' => $async ) + $params );
+                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) { // async
+                               if ( count( $curFileOpHandles ) >= $maxConcurrency ) {
+                                       $fileOpHandles[] = $curFileOpHandles; // push this batch
+                                       $curFileOpHandles = array();
+                               }
+                               $curFileOpHandles[$index] = $subStatus->value; // keep index
+                       } else { // error or completed
+                               $statuses[$index] = $subStatus; // keep index
+                       }
+               }
+               if ( count( $curFileOpHandles ) ) {
+                       $fileOpHandles[] = $curFileOpHandles; // last batch
+               }
+               // Do all the async ops that can be done concurrently...
+               foreach ( $fileOpHandles as $fileHandleBatch ) {
+                       $statuses = $statuses + $this->executeOpHandlesInternal( $fileHandleBatch );
+               }
+               // Marshall and merge all the responses...
+               foreach ( $statuses as $index => $subStatus ) {
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               $status->success[$index] = true;
+                               ++$status->successCount;
+                       } else {
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Execute a list of FileBackendStoreOpHandle handles in parallel.
+        * The resulting Status object fields will correspond
+        * to the order in which the handles where given.
+        *
+        * @param $handles Array List of FileBackendStoreOpHandle objects
+        * @return Array Map of Status objects
+        * @throws MWException
+        */
+       final public function executeOpHandlesInternal( array $fileOpHandles ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               foreach ( $fileOpHandles as $fileOpHandle ) {
+                       if ( !( $fileOpHandle instanceof FileBackendStoreOpHandle ) ) {
+                               throw new MWException( "Given a non-FileBackendStoreOpHandle object." );
+                       } elseif ( $fileOpHandle->backend->getName() !== $this->getName() ) {
+                               throw new MWException( "Given a FileBackendStoreOpHandle for the wrong backend." );
+                       }
+               }
+               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
+               foreach ( $fileOpHandles as $fileOpHandle ) {
+                       $fileOpHandle->closeResources();
+               }
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see FileBackendStore::executeOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               foreach ( $fileOpHandles as $fileOpHandle ) { // OK if empty
+                       throw new MWException( "This backend supports no asynchronous operations." );
+               }
+               return array();
+       }
+
        /**
         * @see FileBackend::clearCache()
         */
@@ -805,10 +1100,20 @@ abstract class FileBackendStore extends FileBackend {
         */
        protected function doClearCache( array $paths = null ) {}
 
+       /**
+        * Is this a key/value store where directories are just virtual?
+        * Virtual directories exists in so much as files exists that are
+        * prefixed with the directory path followed by a forward slash.
+        *
+        * @return bool
+        */
+       abstract protected function directoriesAreVirtual();
+
        /**
         * Move a cache entry to the top (such as when accessed)
         *
         * @param $path string Storage path
+        * @return void
         */
        protected function pingCache( $path ) {
                if ( isset( $this->cache[$path] ) ) {
@@ -834,6 +1139,7 @@ abstract class FileBackendStore extends FileBackend {
         * Move a cache entry to the top (such as when accessed)
         *
         * @param $path string Storage path
+        * @return void
         */
        protected function pingExpensiveCache( $path ) {
                if ( isset( $this->expensiveCache[$path] ) ) {
@@ -931,7 +1237,7 @@ abstract class FileBackendStore extends FileBackend {
         * Any empty suffix means the container is not sharded.
         *
         * @param $container string Container name
-        * @param $relStoragePath string Storage path relative to the container
+        * @param $relPath string Storage path relative to the container
         * @return string|null Returns null if shard could not be determined
         */
        final protected function getContainerShard( $container, $relPath ) {
@@ -962,6 +1268,19 @@ abstract class FileBackendStore extends FileBackend {
                return ''; // no sharding
        }
 
+       /**
+        * Check if a storage path maps to a single shard.
+        * Container dirs like "a", where the container shards on "x/xy",
+        * can reside on several shards. Such paths are tricky to handle.
+        *
+        * @param $storagePath string Storage path
+        * @return bool
+        */
+       final public function isSingleShardPathInternal( $storagePath ) {
+               list( $c, $r, $shard ) = $this->resolveStoragePath( $storagePath );
+               return ( $shard !== null );
+       }
+
        /**
         * Get the sharding config for a container.
         * If greater than 0, then all file storage paths within
@@ -1041,29 +1360,228 @@ abstract class FileBackendStore extends FileBackend {
        protected function resolveContainerPath( $container, $relStoragePath ) {
                return $relStoragePath;
        }
+
+       /**
+        * Get the cache key for a container
+        *
+        * @param $container string Resolved container name
+        * @return string
+        */
+       private function containerCacheKey( $container ) {
+               return wfMemcKey( 'backend', $this->getName(), 'container', $container );
+       }
+
+       /**
+        * Set the cached info for a container
+        *
+        * @param $container string Resolved container name
+        * @param $val mixed Information to cache
+        */
+       final protected function setContainerCache( $container, $val ) {
+               $this->memCache->add( $this->containerCacheKey( $container ), $val, 14*86400 );
+       }
+
+       /**
+        * Delete the cached info for a container.
+        * The cache key is salted for a while to prevent race conditions.
+        *
+        * @param $container string Resolved container name
+        */
+       final protected function deleteContainerCache( $container ) {
+               if ( !$this->memCache->set( $this->containerCacheKey( $container ), 'PURGED', 300 ) ) {
+                       trigger_error( "Unable to delete stat cache for container $container." );
+               }
+       }
+
+       /**
+        * Do a batch lookup from cache for container stats for all containers
+        * used in a list of container names, storage paths, or FileOp objects.
+        *
+        * @param $items Array
+        * @return void
+        */
+       final protected function primeContainerCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $paths = array(); // list of storage paths
+               $contNames = array(); // (cache key => resolved container name)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       } elseif ( is_string( $item ) ) { // full container name
+                               $contNames[$this->containerCacheKey( $item )] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $fullCont, $r, $s ) = $this->resolveStoragePath( $path );
+                       if ( $fullCont !== null ) { // valid path for this backend
+                               $contNames[$this->containerCacheKey( $fullCont )] = $fullCont;
+                       }
+               }
+
+               $contInfo = array(); // (resolved container name => cache value)
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getMulti( array_keys( $contNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       $contInfo[$contNames[$cacheKey]] = $val;
+               }
+
+               // Populate the container process cache for the backend...
+               $this->doPrimeContainerCache( array_filter( $contInfo, 'is_array' ) );
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Fill the backend-specific process cache given an array of
+        * resolved container names and their corresponding cached info.
+        * Only containers that actually exist should appear in the map.
+        *
+        * @param $containerInfo Array Map of resolved container names to cached info
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {}
+
+       /**
+        * Get the cache key for a file path
+        *
+        * @param $path string Storage path
+        * @return string
+        */
+       private function fileCacheKey( $path ) {
+               return wfMemcKey( 'backend', $this->getName(), 'file', sha1( $path ) );
+       }
+
+       /**
+        * Set the cached stat info for a file path
+        *
+        * @param $path string Storage path
+        * @param $val mixed Information to cache
+        */
+       final protected function setFileCache( $path, $val ) {
+               $this->memCache->add( $this->fileCacheKey( $path ), $val, 7*86400 );
+       }
+
+       /**
+        * Delete the cached stat info for a file path.
+        * The cache key is salted for a while to prevent race conditions.
+        *
+        * @param $path string Storage path
+        */
+       final protected function deleteFileCache( $path ) {
+               if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
+                       trigger_error( "Unable to delete stat cache for file $path." );
+               }
+       }
+
+       /**
+        * Do a batch lookup from cache for file stats for all paths
+        * used in a list of storage paths or FileOp objects.
+        *
+        * @param $items Array List of storage paths or FileOps
+        * @return void
+        */
+       final protected function primeFileCache( array $items ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $paths = array(); // list of storage paths
+               $pathNames = array(); // (cache key => storage path)
+               // Get all the paths/containers from the items...
+               foreach ( $items as $item ) {
+                       if ( $item instanceof FileOp ) {
+                               $paths = array_merge( $paths, $item->storagePathsRead() );
+                               $paths = array_merge( $paths, $item->storagePathsChanged() );
+                       } elseif ( self::isStoragePath( $item ) ) {
+                               $paths[] = $item;
+                       }
+               }
+               // Get all the corresponding cache keys for paths...
+               foreach ( $paths as $path ) {
+                       list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
+                       if ( $rel !== null ) { // valid path for this backend
+                               $pathNames[$this->fileCacheKey( $path )] = $path;
+                       }
+               }
+               // Get all cache entries for these container cache keys...
+               $values = $this->memCache->getMulti( array_keys( $pathNames ) );
+               foreach ( $values as $cacheKey => $val ) {
+                       if ( is_array( $val ) ) {
+                               $path = $pathNames[$cacheKey];
+                               $this->trimCache(); // limit memory
+                               $this->cache[$path]['stat'] = $val;
+                               if ( isset( $val['sha1'] ) ) { // some backends store SHA-1 as metadata
+                                       $this->trimCache(); // limit memory
+                                       $this->cache[$path]['sha1'] =
+                                               array( 'hash' => $val['sha1'], 'latest' => $val['latest'] );
+                               }
+                       }
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+       }
 }
 
 /**
- * FileBackendStore helper function to handle file listings that span container shards.
+ * FileBackendStore helper class for performing asynchronous file operations.
+ *
+ * For example, calling FileBackendStore::createInternal() with the "async"
+ * param flag may result in a Status that contains this object as a value.
+ * This class is largely backend-specific and is mostly just "magic" to be
+ * passed to FileBackendStore::executeOpHandlesInternal().
+ */
+abstract class FileBackendStoreOpHandle {
+       /** @var Array */
+       public $params = array(); // params to caller functions
+       /** @var FileBackendStore */
+       public $backend;
+       /** @var Array */
+       public $resourcesToClose = array();
+
+       public $call; // string; name that identifies the function called
+
+       /**
+        * Close all open file handles
+        *
+        * @return void
+        */
+       public function closeResources() {
+               array_map( 'fclose', $this->resourcesToClose );
+       }
+}
+
+/**
+ * FileBackendStore helper function to handle listings that span container shards.
  * Do not use this class from places outside of FileBackendStore.
  *
  * @ingroup FileBackend
  */
-class FileBackendStoreShardListIterator implements Iterator {
-       /* @var FileBackendStore */
+abstract class FileBackendStoreShardListIterator implements Iterator {
+       /** @var FileBackendStore */
        protected $backend;
-       /* @var Array */
+       /** @var Array */
        protected $params;
-       /* @var Array */
+       /** @var Array */
        protected $shardSuffixes;
-       protected $container; // string
-       protected $directory; // string
+       protected $container; // string; full container name
+       protected $directory; // string; resolved relative path
 
-       /* @var Traversable */
+       /** @var Traversable */
        protected $iter;
        protected $curShard = 0; // integer
        protected $pos = 0; // integer
 
+       /** @var Array */
+       protected $multiShardPaths = array(); // (rel path => 1)
+
        /**
         * @param $backend FileBackendStore
         * @param $container string Full storage container name
@@ -1112,6 +1630,8 @@ class FileBackendStoreShardListIterator implements Iterator {
                } else {
                        $this->iter->next();
                }
+               // Filter out items that we already listed
+               $this->filterViaNext();
                // Find the next non-empty shard if no elements are left
                $this->nextShardIteratorIfNotValid();
        }
@@ -1124,6 +1644,8 @@ class FileBackendStoreShardListIterator implements Iterator {
                $this->pos = 0;
                $this->curShard = 0;
                $this->setIteratorFromCurrentShard();
+               // Filter out items that we already listed
+               $this->filterViaNext();
                // Find the next non-empty shard if this one has no elements
                $this->nextShardIteratorIfNotValid();
        }
@@ -1133,7 +1655,7 @@ class FileBackendStoreShardListIterator implements Iterator {
         * @return bool
         */
        public function valid() {
-               if ( $this->iter == null ) {
+               if ( $this->iter === null ) {
                        return false; // some failure?
                } elseif ( is_array( $this->iter ) ) {
                        return ( current( $this->iter ) !== false ); // no paths can have this value
@@ -1142,6 +1664,25 @@ class FileBackendStoreShardListIterator implements Iterator {
                }
        }
 
+       /**
+        * Filter out duplicate items by advancing to the next ones
+        */
+       protected function filterViaNext() {
+               while ( $this->iter->valid() ) {
+                       $rel = $this->iter->current(); // path relative to given directory
+                       $path = $this->params['dir'] . "/{$rel}"; // full storage path
+                       if ( !$this->backend->isSingleShardPathInternal( $path ) ) {
+                               // Don't keep listing paths that are on multiple shards
+                               if ( isset( $this->multiShardPaths[$rel] ) ) {
+                                       $this->iter->next(); // we already listed this path
+                               } else {
+                                       $this->multiShardPaths[$rel] = 1;
+                                       break;
+                               }
+                       }
+               }
+       }
+
        /**
         * If the list iterator for this container shard is out of items,
         * then move on to the next container that has items.
@@ -1161,7 +1702,47 @@ class FileBackendStoreShardListIterator implements Iterator {
         */
        protected function setIteratorFromCurrentShard() {
                $suffix = $this->shardSuffixes[$this->curShard];
-               $this->iter = $this->backend->getFileListInternal(
+               $this->iter = $this->listFromShard(
                        "{$this->container}{$suffix}", $this->directory, $this->params );
        }
+
+       /**
+        * Get the list for a given container shard
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $params Array
+        * @return Traversable|Array|null
+        */
+       abstract protected function listFromShard( $container, $dir, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class FileBackendStoreShardDirIterator extends FileBackendStoreShardListIterator {
+       /**
+        * @param string $container
+        * @param string $dir
+        * @param array $params
+        * @return Array|null|Traversable
+        */
+       protected function listFromShard( $container, $dir, array $params ) {
+               return $this->backend->getDirectoryListInternal( $container, $dir, $params );
+       }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class FileBackendStoreShardFileIterator extends FileBackendStoreShardListIterator {
+       /**
+        * @param string $container
+        * @param string $dir
+        * @param array $params
+        * @return Array|null|Traversable
+        */
+       protected function listFromShard( $container, $dir, array $params ) {
+               return $this->backend->getFileListInternal( $container, $dir, $params );
+       }
 }
index 9c9f3e2..ac2496d 100644 (file)
@@ -1,16 +1,34 @@
 <?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
  */
 
 /**
- * Helper class for representing operations with transaction support.
+ * FileBackend helper class for representing operations.
  * Do not use this class from places outside FileBackend.
  *
- * Methods called from attemptBatch() should avoid throwing exceptions at all costs.
- * FileOp objects should be lightweight in order to support large arrays in memory.
+ * Methods called from FileOpBatch::attempt() should avoid throwing
+ * exceptions at all costs. FileOp objects should be lightweight in order
+ * to support large arrays in memory and serialization.
  *
  * @ingroup FileBackend
  * @since 1.19
@@ -23,6 +41,7 @@ abstract class FileOp {
 
        protected $state = self::STATE_NEW; // integer
        protected $failed = false; // boolean
+       protected $async = false; // boolean
        protected $useLatest = true; // boolean
        protected $batchId; // string
 
@@ -34,10 +53,6 @@ abstract class FileOp {
        const STATE_CHECKED = 2;
        const STATE_ATTEMPTED = 3;
 
-       /* Timeout related parameters */
-       const MAX_BATCH_SIZE = 1000;
-       const TIME_LIMIT_SEC = 300; // 5 minutes
-
        /**
         * Build a new file operation transaction
         *
@@ -69,7 +84,7 @@ abstract class FileOp {
         * @param $batchId string
         * @return void
         */
-       final protected function setBatchId( $batchId ) {
+       final public function setBatchId( $batchId ) {
                $this->batchId = $batchId;
        }
 
@@ -79,130 +94,99 @@ abstract class FileOp {
         * @param $allowStale bool
         * @return void
         */
-       final protected function allowStaleReads( $allowStale ) {
+       final public function allowStaleReads( $allowStale ) {
                $this->useLatest = !$allowStale;
        }
 
        /**
-        * Attempt to perform a series of file operations.
-        * Callers are responsible for handling file locking.
+        * Get the value of the parameter with the given name
         *
-        * $opts is an array of options, including:
-        * 'force'        : Errors that would normally cause a rollback do not.
-        *                  The remaining operations are still attempted if any fail.
-        * 'allowStale'   : Don't require the latest available data.
-        *                  This can increase performance for non-critical writes.
-        *                  This has no effect unless the 'force' flag is set.
-        * 'nonJournaled' : Don't log this operation batch in the file journal.
+        * @param $name string
+        * @return mixed Returns null if the parameter is not set
+        */
+       final public function getParam( $name ) {
+               return isset( $this->params[$name] ) ? $this->params[$name] : null;
+       }
+
+       /**
+        * Check if this operation failed precheck() or attempt()
         *
-        * The resulting Status will be "OK" unless:
-        *     a) unexpected operation errors occurred (network partitions, disk full...)
-        *     b) significant operation errors occured and 'force' was not set
+        * @return bool
+        */
+       final public function failed() {
+               return $this->failed;
+       }
+
+       /**
+        * Get a new empty predicates array for precheck()
         *
-        * @param $performOps Array List of FileOp operations
-        * @param $opts Array Batch operation options
-        * @param $journal FileJournal Journal to log operations to
-        * @return Status
+        * @return Array
         */
-       final public static function attemptBatch(
-               array $performOps, array $opts, FileJournal $journal
-       ) {
-               $status = Status::newGood();
+       final public static function newPredicates() {
+               return array( 'exists' => array(), 'sha1' => array() );
+       }
 
-               $n = count( $performOps );
-               if ( $n > self::MAX_BATCH_SIZE ) {
-                       $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
-                       return $status;
-               }
+       /**
+        * Get a new empty dependency tracking array for paths read/written to
+        *
+        * @return Array
+        */
+       final public static function newDependencies() {
+               return array( 'read' => array(), 'write' => array() );
+       }
 
-               $batchId = $journal->getTimestampedUUID();
-               $allowStale = !empty( $opts['allowStale'] );
-               $ignoreErrors = !empty( $opts['force'] );
-               $journaled = empty( $opts['nonJournaled'] );
-
-               $entries = array(); // file journal entries
-               $predicates = FileOp::newPredicates(); // account for previous op in prechecks
-               // Do pre-checks for each operation; abort on failure...
-               foreach ( $performOps as $index => $fileOp ) {
-                       $fileOp->setBatchId( $batchId );
-                       $fileOp->allowStaleReads( $allowStale );
-                       $oldPredicates = $predicates;
-                       $subStatus = $fileOp->precheck( $predicates ); // updates $predicates
-                       $status->merge( $subStatus );
-                       if ( $subStatus->isOK() ) {
-                               if ( $journaled ) { // journal log entry
-                                       $entries = array_merge( $entries,
-                                               self::getJournalEntries( $fileOp, $oldPredicates, $predicates ) );
-                               }
-                       } else { // operation failed?
-                               $status->success[$index] = false;
-                               ++$status->failCount;
-                               if ( !$ignoreErrors ) {
-                                       return $status; // abort
-                               }
-                       }
-               }
+       /**
+        * Update a dependency tracking array to account for this operation
+        *
+        * @param $deps Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @return Array
+        */
+       final public function applyDependencies( array $deps ) {
+               $deps['read']  += array_fill_keys( $this->storagePathsRead(), 1 );
+               $deps['write'] += array_fill_keys( $this->storagePathsChanged(), 1 );
+               return $deps;
+       }
 
-               // Log the operations in file journal...
-               if ( count( $entries ) ) {
-                       $subStatus = $journal->logChangeBatch( $entries, $batchId );
-                       if ( !$subStatus->isOK() ) {
-                               return $subStatus; // abort
+       /**
+        * Check if this operation changes files listed in $paths
+        *
+        * @param $paths Array Prior path reads/writes; format of FileOp::newPredicates()
+        * @return boolean
+        */
+       final public function dependsOn( array $deps ) {
+               foreach ( $this->storagePathsChanged() as $path ) {
+                       if ( isset( $deps['read'][$path] ) || isset( $deps['write'][$path] ) ) {
+                               return true; // "output" or "anti" dependency
                        }
                }
-
-               if ( $ignoreErrors ) { // treat precheck() fatals as mere warnings
-                       $status->setResult( true, $status->value );
-               }
-
-               // Attempt each operation...
-               foreach ( $performOps as $index => $fileOp ) {
-                       if ( $fileOp->failed() ) {
-                               continue; // nothing to do
-                       }
-                       $subStatus = $fileOp->attempt();
-                       $status->merge( $subStatus );
-                       if ( $subStatus->isOK() ) {
-                               $status->success[$index] = true;
-                               ++$status->successCount;
-                       } else {
-                               $status->success[$index] = false;
-                               ++$status->failCount;
-                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
-                               // Log the remaining ops as failed for recovery...
-                               for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
-                                       $performOps[$i]->logFailure( 'attempt_aborted' );
-                               }
-                               return $status; // bail out
+               foreach ( $this->storagePathsRead() as $path ) {
+                       if ( isset( $deps['write'][$path] ) ) {
+                               return true; // "flow" dependency
                        }
                }
-
-               return $status;
+               return false;
        }
 
        /**
-        * Get the file journal entries for a single file operation
+        * Get the file journal entries for this file operation
         *
-        * @param $fileOp FileOp
-        * @param $oPredicates Array Pre-op information about files
-        * @param $nPredicates Array Post-op information about files
+        * @param $oPredicates Array Pre-op info about files (format of FileOp::newPredicates)
+        * @param $nPredicates Array Post-op info about files (format of FileOp::newPredicates)
         * @return Array
         */
-       final protected static function getJournalEntries(
-               FileOp $fileOp, array $oPredicates, array $nPredicates
-       ) {
+       final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
                $nullEntries = array();
                $updateEntries = array();
                $deleteEntries = array();
-               $pathsUsed = array_merge( $fileOp->storagePathsRead(), $fileOp->storagePathsChanged() );
+               $pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
                foreach ( $pathsUsed as $path ) {
                        $nullEntries[] = array( // assertion for recovery
                                'op'      => 'null',
                                'path'    => $path,
-                               'newSha1' => $fileOp->fileSha1( $path, $oPredicates )
+                               'newSha1' => $this->fileSha1( $path, $oPredicates )
                        );
                }
-               foreach ( $fileOp->storagePathsChanged() as $path ) {
+               foreach ( $this->storagePathsChanged() as $path ) {
                        if ( $nPredicates['sha1'][$path] === false ) { // deleted
                                $deleteEntries[] = array(
                                        'op'      => 'delete',
@@ -211,7 +195,7 @@ abstract class FileOp {
                                );
                        } else { // created/updated
                                $updateEntries[] = array(
-                                       'op'      => $fileOp->fileExists( $path, $oPredicates ) ? 'update' : 'create',
+                                       'op'      => $this->fileExists( $path, $oPredicates ) ? 'update' : 'create',
                                        'path'    => $path,
                                        'newSha1' => $nPredicates['sha1'][$path]
                                );
@@ -220,34 +204,6 @@ abstract class FileOp {
                return array_merge( $nullEntries, $updateEntries, $deleteEntries );
        }
 
-       /**
-        * Get the value of the parameter with the given name
-        *
-        * @param $name string
-        * @return mixed Returns null if the parameter is not set
-        */
-       final public function getParam( $name ) {
-               return isset( $this->params[$name] ) ? $this->params[$name] : null;
-       }
-
-       /**
-        * Check if this operation failed precheck() or attempt()
-        *
-        * @return bool
-        */
-       final public function failed() {
-               return $this->failed;
-       }
-
-       /**
-        * Get a new empty predicates array for precheck()
-        *
-        * @return Array
-        */
-       final public static function newPredicates() {
-               return array( 'exists' => array(), 'sha1' => array() );
-       }
-
        /**
         * Check preconditions of the operation without writing anything
         *
@@ -267,7 +223,14 @@ abstract class FileOp {
        }
 
        /**
-        * Attempt the operation, backing up files as needed; this must be reversible
+        * @return Status
+        */
+       protected function doPrecheck( array &$predicates ) {
+               return Status::newGood();
+       }
+
+       /**
+        * Attempt the operation
         *
         * @return Status
         */
@@ -286,6 +249,25 @@ abstract class FileOp {
                return $status;
        }
 
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               return Status::newGood();
+       }
+
+       /**
+        * Attempt the operation in the background
+        *
+        * @return Status
+        */
+       final public function attemptAsync() {
+               $this->async = true;
+               $result = $this->attempt();
+               $this->async = false;
+               return $result;
+       }
+
        /**
         * Get the file operation parameters
         *
@@ -295,36 +277,48 @@ abstract class FileOp {
                return array( array(), array() );
        }
 
+       /**
+        * Adjust params to FileBackendStore internal file calls
+        *
+        * @param $params Array
+        * @return Array (required params list, optional params list)
+        */
+       protected function setFlags( array $params ) {
+               return array( 'async' => $this->async ) + $params;
+       }
+
        /**
         * Get a list of storage paths read from for this operation
         *
         * @return Array
         */
-       public function storagePathsRead() {
-               return array();
+       final public function storagePathsRead() {
+               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsRead() );
        }
 
        /**
-        * Get a list of storage paths written to for this operation
-        *
+        * @see FileOp::storagePathsRead()
         * @return Array
         */
-       public function storagePathsChanged() {
+       protected function doStoragePathsRead() {
                return array();
        }
 
        /**
-        * @return Status
+        * Get a list of storage paths written to for this operation
+        *
+        * @return Array
         */
-       protected function doPrecheck( array &$predicates ) {
-               return Status::newGood();
+       final public function storagePathsChanged() {
+               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsChanged() );
        }
 
        /**
-        * @return Status
+        * @see FileOp::storagePathsChanged()
+        * @return Array
         */
-       protected function doAttempt() {
-               return Status::newGood();
+       protected function doStoragePathsChanged() {
+               return array();
        }
 
        /**
@@ -408,13 +402,22 @@ abstract class FileOp {
                }
        }
 
+       /**
+        * Get the backend this operation is for
+        *
+        * @return FileBackendStore
+        */
+       public function getBackend() {
+               return $this->backend;
+       }
+
        /**
         * Log a file operation failure and preserve any temp files
         *
         * @param $action string
         * @return void
         */
-       final protected function logFailure( $action ) {
+       final public function logFailure( $action ) {
                $params = $this->params;
                $params['failedAction'] = $action;
                try {
@@ -435,10 +438,17 @@ abstract class FileOp {
  *     overwriteSame : override any existing file at destination
  */
 class StoreFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
        }
 
+       /**
+        * @param $predicates array
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists on the file system
@@ -447,10 +457,13 @@ class StoreFileOp extends FileOp {
                        return $status;
                // Check if the source file is too big
                } elseif ( filesize( $this->params['src'] ) > $this->backend->maxFileSizeInternal() ) {
+                       $status->fatal( 'backend-fail-maxsize',
+                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
                        $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
                // Check if a file can be placed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
                        $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
                }
@@ -464,15 +477,20 @@ class StoreFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
+       /**
+        * @return Status
+        */
        protected function doAttempt() {
-               $status = Status::newGood();
                // Store the file at the destination
                if ( !$this->destSameAsSource ) {
-                       $status->merge( $this->backend->storeInternal( $this->params ) );
+                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
                }
-               return $status;
+               return Status::newGood();
        }
 
+       /**
+        * @return bool|string
+        */
        protected function getSourceSha1Base36() {
                wfSuppressWarnings();
                $hash = sha1_file( $this->params['src'] );
@@ -483,7 +501,7 @@ class StoreFileOp extends FileOp {
                return $hash;
        }
 
-       public function storagePathsChanged() {
+       protected function doStoragePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
@@ -505,10 +523,13 @@ class CreateFileOp extends FileOp {
                $status = Status::newGood();
                // Check if the source data is too big
                if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+                       $status->fatal( 'backend-fail-maxsize',
+                               $this->params['dst'], $this->backend->maxFileSizeInternal() );
                        $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
                // Check if a file can be placed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
                        $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
                }
@@ -522,20 +543,28 @@ class CreateFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
+       /**
+        * @return Status
+        */
        protected function doAttempt() {
-               $status = Status::newGood();
-               // Create the file at the destination
                if ( !$this->destSameAsSource ) {
-                       $status->merge( $this->backend->createInternal( $this->params ) );
+                       // Create the file at the destination
+                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
                }
-               return $status;
+               return Status::newGood();
        }
 
+       /**
+        * @return bool|String
+        */
        protected function getSourceSha1Base36() {
                return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
        }
 
-       public function storagePathsChanged() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
@@ -549,10 +578,17 @@ class CreateFileOp extends FileOp {
  *     overwriteSame : override any existing file at destination
  */
 class CopyFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
        }
 
+       /**
+        * @param $predicates array
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -561,6 +597,7 @@ class CopyFileOp extends FileOp {
                        return $status;
                // Check if a file can be placed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
                        $status->fatal( 'backend-fail-copy', $this->params['src'], $this->params['dst'] );
                        return $status;
                }
@@ -574,23 +611,31 @@ class CopyFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
+       /**
+        * @return Status
+        */
        protected function doAttempt() {
-               $status = Status::newGood();
                // Do nothing if the src/dst paths are the same
                if ( $this->params['src'] !== $this->params['dst'] ) {
                        // Copy the file into the destination
                        if ( !$this->destSameAsSource ) {
-                               $status->merge( $this->backend->copyInternal( $this->params ) );
+                               return $this->backend->copyInternal( $this->setFlags( $this->params ) );
                        }
                }
-               return $status;
+               return Status::newGood();
        }
 
-       public function storagePathsRead() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsRead() {
                return array( $this->params['src'] );
        }
 
-       public function storagePathsChanged() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
@@ -604,10 +649,17 @@ class CopyFileOp extends FileOp {
  *     overwriteSame : override any existing file at destination
  */
 class MoveFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ), array( 'overwrite', 'overwriteSame' ) );
        }
 
+       /**
+        * @param $predicates array
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -616,6 +668,7 @@ class MoveFileOp extends FileOp {
                        return $status;
                // Check if a file can be placed at the destination
                } elseif ( !$this->backend->isPathUsableInternal( $this->params['dst'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['dst'] );
                        $status->fatal( 'backend-fail-move', $this->params['src'], $this->params['dst'] );
                        return $status;
                }
@@ -631,27 +684,35 @@ class MoveFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
+       /**
+        * @return Status
+        */
        protected function doAttempt() {
-               $status = Status::newGood();
                // Do nothing if the src/dst paths are the same
                if ( $this->params['src'] !== $this->params['dst'] ) {
                        if ( !$this->destSameAsSource ) {
                                // Move the file into the destination
-                               $status->merge( $this->backend->moveInternal( $this->params ) );
+                               return $this->backend->moveInternal( $this->setFlags( $this->params ) );
                        } else {
                                // Just delete source as the destination needs no changes
                                $params = array( 'src' => $this->params['src'] );
-                               $status->merge( $this->backend->deleteInternal( $params ) );
+                               return $this->backend->deleteInternal( $this->setFlags( $params ) );
                        }
                }
-               return $status;
+               return Status::newGood();
        }
 
-       public function storagePathsRead() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsRead() {
                return array( $this->params['src'] );
        }
 
-       public function storagePathsChanged() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
                return array( $this->params['src'], $this->params['dst'] );
        }
 }
@@ -663,12 +724,19 @@ class MoveFileOp extends FileOp {
  *     ignoreMissingSource : don't return an error if the file does not exist
  */
 class DeleteFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
                return array( array( 'src' ), array( 'ignoreMissingSource' ) );
        }
 
        protected $needsDelete = true;
 
+       /**
+        * @param array $predicates
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
                // Check if the source file exists
@@ -685,16 +753,21 @@ class DeleteFileOp extends FileOp {
                return $status; // safe to call attempt()
        }
 
+       /**
+        * @return Status
+        */
        protected function doAttempt() {
-               $status = Status::newGood();
                if ( $this->needsDelete ) {
                        // Delete the source file
-                       $status->merge( $this->backend->deleteInternal( $this->params ) );
+                       return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
                }
-               return $status;
+               return Status::newGood();
        }
 
-       public function storagePathsChanged() {
+       /**
+        * @return array
+        */
+       protected function doStoragePathsChanged() {
                return array( $this->params['src'] );
        }
 }
diff --git a/includes/filerepo/backend/FileOpBatch.php b/includes/filerepo/backend/FileOpBatch.php
new file mode 100644 (file)
index 0000000..d22a2ec
--- /dev/null
@@ -0,0 +1,240 @@
+<?php
+/**
+ * Helper class for representing batch file 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 FileBackend
+ * @author Aaron Schulz
+ */
+
+/**
+ * Helper class for representing batch file operations.
+ * Do not use this class from places outside FileBackend.
+ *
+ * Methods should avoid throwing exceptions at all costs.
+ *
+ * @ingroup FileBackend
+ * @since 1.20
+ */
+class FileOpBatch {
+       /* Timeout related parameters */
+       const MAX_BATCH_SIZE = 1000; // integer
+
+       /**
+        * Attempt to perform a series of file operations.
+        * Callers are responsible for handling file locking.
+        *
+        * $opts is an array of options, including:
+        * 'force'        : Errors that would normally cause a rollback do not.
+        *                  The remaining operations are still attempted if any fail.
+        * 'allowStale'   : Don't require the latest available data.
+        *                  This can increase performance for non-critical writes.
+        *                  This has no effect unless the 'force' flag is set.
+        * 'nonJournaled' : Don't log this operation batch in the file journal.
+        * 'concurrency'  : Try to do this many operations in parallel when possible.
+        *
+        * The resulting Status will be "OK" unless:
+        *     a) unexpected operation errors occurred (network partitions, disk full...)
+        *     b) significant operation errors occured and 'force' was not set
+        *
+        * @param $performOps Array List of FileOp operations
+        * @param $opts Array Batch operation options
+        * @param $journal FileJournal Journal to log operations to
+        * @return Status
+        */
+       public static function attempt( array $performOps, array $opts, FileJournal $journal ) {
+               wfProfileIn( __METHOD__ );
+               $status = Status::newGood();
+
+               $n = count( $performOps );
+               if ( $n > self::MAX_BATCH_SIZE ) {
+                       $status->fatal( 'backend-fail-batchsize', $n, self::MAX_BATCH_SIZE );
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
+               $batchId = $journal->getTimestampedUUID();
+               $allowStale = !empty( $opts['allowStale'] );
+               $ignoreErrors = !empty( $opts['force'] );
+               $journaled = empty( $opts['nonJournaled'] );
+               $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
+
+               $entries = array(); // file journal entry list
+               $predicates = FileOp::newPredicates(); // account for previous ops in prechecks
+               $curBatch = array(); // concurrent FileOp sub-batch accumulation
+               $curBatchDeps = FileOp::newDependencies(); // paths used in FileOp sub-batch
+               $pPerformOps = array(); // ordered list of concurrent FileOp sub-batches
+               $lastBackend = null; // last op backend name
+               // Do pre-checks for each operation; abort on failure...
+               foreach ( $performOps as $index => $fileOp ) {
+                       $backendName = $fileOp->getBackend()->getName();
+                       $fileOp->setBatchId( $batchId ); // transaction ID
+                       $fileOp->allowStaleReads( $allowStale ); // consistency level
+                       // Decide if this op can be done concurrently within this sub-batch
+                       // or if a new concurrent sub-batch must be started after this one...
+                       if ( $fileOp->dependsOn( $curBatchDeps )
+                               || count( $curBatch ) >= $maxConcurrency
+                               || ( $backendName !== $lastBackend && count( $curBatch ) )
+                       ) {
+                               $pPerformOps[] = $curBatch; // push this batch
+                               $curBatch = array(); // start a new sub-batch
+                               $curBatchDeps = FileOp::newDependencies();
+                       }
+                       $lastBackend = $backendName;
+                       $curBatch[$index] = $fileOp; // keep index
+                       // Update list of affected paths in this batch
+                       $curBatchDeps = $fileOp->applyDependencies( $curBatchDeps );
+                       // Simulate performing the operation...
+                       $oldPredicates = $predicates;
+                       $subStatus = $fileOp->precheck( $predicates ); // updates $predicates
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               if ( $journaled ) { // journal log entries
+                                       $entries = array_merge( $entries,
+                                               $fileOp->getJournalEntries( $oldPredicates, $predicates ) );
+                               }
+                       } else { // operation failed?
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                               if ( !$ignoreErrors ) {
+                                       wfProfileOut( __METHOD__ );
+                                       return $status; // abort
+                               }
+                       }
+               }
+               // Push the last sub-batch
+               if ( count( $curBatch ) ) {
+                       $pPerformOps[] = $curBatch;
+               }
+
+               // Log the operations in the file journal...
+               if ( count( $entries ) ) {
+                       $subStatus = $journal->logChangeBatch( $entries, $batchId );
+                       if ( !$subStatus->isOK() ) {
+                               wfProfileOut( __METHOD__ );
+                               return $subStatus; // abort
+                       }
+               }
+
+               if ( $ignoreErrors ) { // treat precheck() fatals as mere warnings
+                       $status->setResult( true, $status->value );
+               }
+
+               // Attempt each operation (in parallel if allowed and possible)...
+               if ( count( $pPerformOps ) < count( $performOps ) ) {
+                       self::runBatchParallel( $pPerformOps, $status );
+               } else {
+                       self::runBatchSeries( $performOps, $status );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * Attempt a list of file operations in series.
+        * This will abort remaining ops on failure.
+        *
+        * @param $performOps Array
+        * @param $status Status
+        * @return bool Success
+        */
+       protected static function runBatchSeries( array $performOps, Status $status ) {
+               foreach ( $performOps as $index => $fileOp ) {
+                       if ( $fileOp->failed() ) {
+                               continue; // nothing to do
+                       }
+                       $subStatus = $fileOp->attempt();
+                       $status->merge( $subStatus );
+                       if ( $subStatus->isOK() ) {
+                               $status->success[$index] = true;
+                               ++$status->successCount;
+                       } else {
+                               $status->success[$index] = false;
+                               ++$status->failCount;
+                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
+                               // Log the remaining ops as failed for recovery...
+                               for ( $i = ($index + 1); $i < count( $performOps ); $i++ ) {
+                                       $performOps[$i]->logFailure( 'attempt_aborted' );
+                               }
+                               return false; // bail out
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Attempt a list of file operations sub-batches in series.
+        *
+        * The operations *in* each sub-batch will be done in parallel.
+        * The caller is responsible for making sure the operations
+        * within any given sub-batch do not depend on each other.
+        * This will abort remaining ops on failure.
+        *
+        * @param $pPerformOps Array
+        * @param $status Status
+        * @return bool Success
+        */
+       protected static function runBatchParallel( array $pPerformOps, Status $status ) {
+               $aborted = false;
+               foreach ( $pPerformOps as $performOpsBatch ) {
+                       if ( $aborted ) { // check batch op abort flag...
+                               // We can't continue (even with $ignoreErrors) as $predicates is wrong.
+                               // Log the remaining ops as failed for recovery...
+                               foreach ( $performOpsBatch as $i => $fileOp ) {
+                                       $performOpsBatch[$i]->logFailure( 'attempt_aborted' );
+                               }
+                               continue;
+                       }
+                       $statuses = array();
+                       $opHandles = array();
+                       // Get the backend; all sub-batch ops belong to a single backend
+                       $backend = reset( $performOpsBatch )->getBackend();
+                       // If attemptAsync() returns synchronously, it was either an
+                       // error Status or the backend just doesn't support async ops.
+                       foreach ( $performOpsBatch as $i => $fileOp ) {
+                               if ( !$fileOp->failed() ) { // failed => already has Status
+                                       $subStatus = $fileOp->attemptAsync();
+                                       if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
+                                               $opHandles[$i] = $subStatus->value; // deferred
+                                       } else {
+                                               $statuses[$i] = $subStatus; // done already
+                                       }
+                               }
+                       }
+                       // Try to do all the operations concurrently...
+                       $statuses = $statuses + $backend->executeOpHandlesInternal( $opHandles );
+                       // Marshall and merge all the responses (blocking)...
+                       foreach ( $performOpsBatch as $i => $fileOp ) {
+                               if ( !$fileOp->failed() ) { // failed => already has Status
+                                       $subStatus = $statuses[$i];
+                                       $status->merge( $subStatus );
+                                       if ( $subStatus->isOK() ) {
+                                               $status->success[$i] = true;
+                                               ++$status->successCount;
+                                       } else {
+                                               $status->success[$i] = false;
+                                               ++$status->failCount;
+                                               $aborted = true; // set abort flag; we can't continue
+                                       }
+                               }
+                       }
+               }
+               return $status;
+       }
+}
index 3ad78e3..2b10917 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
@@ -24,12 +41,17 @@ class SwiftFileBackend extends FileBackendStore {
        protected $auth; // Swift authentication handler
        protected $authTTL; // integer seconds
        protected $swiftAnonUser; // string; username to handle unauthenticated requests
-       protected $maxContCacheSize = 100; // integer; max containers with entries
+       protected $swiftUseCDN; // boolean; whether CloudFiles CDN is enabled
+       protected $swiftCDNExpiry; // integer; how long to cache things in the CDN
+       protected $swiftCDNPurgable; // boolean; whether object CDN purging is enabled
+
+       protected $maxContCacheSize = 300; // integer; max containers with entries
 
        /** @var CF_Connection */
        protected $conn; // Swift connection handle
        protected $connStarted = 0; // integer UNIX timestamp
        protected $connContainers = array(); // container object cache
+       protected $connException; // CloudFiles exception
 
        /**
         * @see FileBackendStore::__construct()
@@ -39,31 +61,51 @@ class SwiftFileBackend extends FileBackendStore {
         *    swiftKey           : Swift authentication key for the above user
         *    swiftAuthTTL       : Swift authentication TTL (seconds)
         *    swiftAnonUser      : Swift user used for end-user requests (account:username)
+        *    swiftUseCDN        : Whether a Cloud Files Content Delivery Network is set up
+        *    swiftCDNExpiry     : How long (in seconds) to store content in the CDN.
+        *                         If files may likely change, this should probably not exceed
+        *                         a few days. For example, deletions may take this long to apply.
+        *                         If object purging is enabled, however, this is not an issue.
+        *    swiftCDNPurgable   : Whether object purge requests are allowed by the CDN.
         *    shardViaHashLevels : Map of container names to sharding config with:
         *                         'base'   : base of hash characters, 16 or 36
         *                         'levels' : the number of hash levels (and digits)
-        *                         'repeat' : hash subdirectories are prefixed with all the 
+        *                         'repeat' : hash subdirectories are prefixed with all the
         *                                    parent hash directory names (e.g. "a/ab/abc")
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
+               if ( !MWInit::classExists( 'CF_Constants' ) ) {
+                       throw new MWException( 'SwiftCloudFiles extension not installed.' );
+               }
                // Required settings
                $this->auth = new CF_Authentication(
-                       $config['swiftUser'], 
-                       $config['swiftKey'], 
+                       $config['swiftUser'],
+                       $config['swiftKey'],
                        null, // account; unused
-                       $config['swiftAuthUrl'] 
+                       $config['swiftAuthUrl']
                );
                // Optional settings
                $this->authTTL = isset( $config['swiftAuthTTL'] )
                        ? $config['swiftAuthTTL']
-                       : 120; // some sane number
+                       : 5 * 60; // some sane number
                $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
                        ? $config['swiftAnonUser']
                        : '';
                $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
                        ? $config['shardViaHashLevels']
                        : '';
+               $this->swiftUseCDN = isset( $config['swiftUseCDN'] )
+                       ? $config['swiftUseCDN']
+                       : false;
+               $this->swiftCDNExpiry = isset( $config['swiftCDNExpiry'] )
+                       ? $config['swiftCDNExpiry']
+                       : 3600; // hour
+               $this->swiftCDNPurgable = isset( $config['swiftCDNPurgable'] )
+                       ? $config['swiftCDNPurgable']
+                       : true;
+               // Cache container info to mask latency
+               $this->memCache = wfGetMainCache();
        }
 
        /**
@@ -91,9 +133,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $this->getContainer( $container );
                        return true; // container exists
                } catch ( NoSuchContainerException $e ) {
-               } catch ( InvalidResponseException $e ) {
-               } catch ( Exception $e ) { // some other exception?
-                       $this->logException( $e, __METHOD__, array( 'path' => $storagePath ) );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, array( 'path' => $storagePath ) );
                }
 
                return false;
@@ -116,7 +157,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -124,12 +165,8 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( NoSuchContainerException $e ) {
                        $status->fatal( 'backend-fail-create', $params['dst'] );
                        return $status;
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
@@ -148,20 +185,36 @@ class SwiftFileBackend extends FileBackendStore {
                        $obj->set_etag( md5( $params['content'] ) );
                        // Use the same content type as StreamFile for security
                        $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-                       // Actually write the object in Swift
-                       $obj->write( $params['content'] );
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $obj->write_async( $params['content'] );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Create', $handle );
+                               $status->value->affectedObjects[] = $obj;
+                       } else { // actually write the object in Swift
+                               $obj->write( $params['content'] );
+                               $this->purgeCDNCache( array( $obj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
                } catch ( BadContentTypeException $e ) {
                        $status->fatal( 'backend-fail-contenttype', $params['dst'] );
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
        }
 
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCreate( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               }
+       }
+
        /**
         * @see FileBackendStore::doStoreInternal()
         * @return Status
@@ -179,7 +232,7 @@ class SwiftFileBackend extends FileBackendStore {
                try {
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -187,12 +240,8 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( NoSuchContainerException $e ) {
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        return $status;
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
@@ -215,22 +264,48 @@ class SwiftFileBackend extends FileBackendStore {
                        $obj->set_etag( md5_file( $params['src'] ) );
                        // Use the same content type as StreamFile for security
                        $obj->content_type = StreamFile::contentTypeFromPath( $params['dst'] );
-                       // Actually write the object in Swift
-                       $obj->load_from_filename( $params['src'], True ); // calls $obj->write()
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               wfSuppressWarnings();
+                               $fp = fopen( $params['src'], 'rb' );
+                               wfRestoreWarnings();
+                               if ( !$fp ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               } else {
+                                       $handle = $obj->write_async( $fp, filesize( $params['src'] ), true );
+                                       $status->value = new SwiftFileOpHandle( $this, $params, 'Store', $handle );
+                                       $status->value->resourcesToClose[] = $fp;
+                                       $status->value->affectedObjects[] = $obj;
+                               }
+                       } else { // actually write the object in Swift
+                               $obj->load_from_filename( $params['src'], true ); // calls $obj->write()
+                               $this->purgeCDNCache( array( $obj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
                } catch ( BadContentTypeException $e ) {
                        $status->fatal( 'backend-fail-contenttype', $params['dst'] );
                } catch ( IOException $e ) {
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
        }
 
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseStore( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( BadContentTypeException $e ) {
+                       $status->fatal( 'backend-fail-contenttype', $params['dst'] );
+               } catch ( IOException $e ) {
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               }
+       }
+
        /**
         * @see FileBackendStore::doCopyInternal()
         * @return Status
@@ -255,7 +330,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $sContObj = $this->getContainer( $srcCont );
                        $dContObj = $this->getContainer( $dstCont );
                        if ( empty( $params['overwrite'] ) &&
-                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) ) 
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
                        {
                                $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
                                return $status;
@@ -263,30 +338,116 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( NoSuchContainerException $e ) {
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
                        return $status;
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
                // (b) Actually copy the file to the destination
                try {
-                       $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel );
+                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $handle );
+                               $status->value->affectedObjects[] = $dstObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel );
+                               $this->purgeCDNCache( array( $dstObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
                } catch ( NoSuchObjectException $e ) { // source object does not exist
                        $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
        }
 
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseCopy( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+               }
+       }
+
+       /**
+        * @see FileBackendStore::doMoveInternal()
+        * @return Status
+        */
+       protected function doMoveInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               list( $dstCont, $dstRel ) = $this->resolveStoragePathReal( $params['dst'] );
+               if ( $dstRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['dst'] );
+                       return $status;
+               }
+
+               // (a) Check the source/destination containers and destination object
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       $dContObj = $this->getContainer( $dstCont );
+                       if ( empty( $params['overwrite'] ) &&
+                               $this->fileExists( array( 'src' => $params['dst'], 'latest' => 1 ) ) )
+                       {
+                               $status->fatal( 'backend-fail-alreadyexists', $params['dst'] );
+                               return $status;
+                       }
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       return $status;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+                       return $status;
+               }
+
+               // (b) Actually move the file to the destination
+               try {
+                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       $dstObj = new CF_Object( $dContObj, $dstRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Move', $handle );
+                               $status->value->affectedObjects[] = $srcObj;
+                               $status->value->affectedObjects[] = $dstObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->move_object_to( $srcRel, $dContObj, $dstRel );
+                               $this->purgeCDNCache( array( $srcObj, $dstObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseMove( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchObjectException $e ) { // source object does not exist
+                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+               }
+       }
+
        /**
         * @see FileBackendStore::doDeleteInternal()
         * @return Status
@@ -302,23 +463,45 @@ class SwiftFileBackend extends FileBackendStore {
 
                try {
                        $sContObj = $this->getContainer( $srcCont );
-                       $sContObj->delete_object( $srcRel );
+                       $srcObj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                       if ( !empty( $params['async'] ) ) { // deferred
+                               $handle = $sContObj->delete_object_async( $srcRel );
+                               $status->value = new SwiftFileOpHandle( $this, $params, 'Delete', $handle );
+                               $status->value->affectedObjects[] = $srcObj;
+                       } else { // actually write the object in Swift
+                               $sContObj->delete_object( $srcRel );
+                               $this->purgeCDNCache( array( $srcObj ) );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
                } catch ( NoSuchContainerException $e ) {
                        $status->fatal( 'backend-fail-delete', $params['src'] );
                } catch ( NoSuchObjectException $e ) {
                        if ( empty( $params['ignoreMissingSource'] ) ) {
                                $status->fatal( 'backend-fail-delete', $params['src'] );
                        }
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
        }
 
+       /**
+        * @see SwiftFileBackend::doExecuteOpHandlesInternal()
+        */
+       protected function _getResponseDelete( CF_Async_Op $cfOp, Status $status, array $params ) {
+               try {
+                       $cfOp->getLastResponse();
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-delete', $params['src'] );
+               } catch ( NoSuchObjectException $e ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-delete', $params['src'] );
+                       }
+               }
+       }
+
        /**
         * @see FileBackendStore::doPrepareInternal()
         * @return Status
@@ -333,32 +516,29 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status; // already exists
                } catch ( NoSuchContainerException $e ) {
                        // NoSuchContainerException thrown: container does not exist
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
                // (b) Create container as needed
                try {
                        $contObj = $this->createContainer( $fullCont );
+                       // Make container public to end-users...
                        if ( $this->swiftAnonUser != '' ) {
-                               // Make container public to end-users...
                                $status->merge( $this->setContainerAccess(
                                        $contObj,
                                        array( $this->auth->username, $this->swiftAnonUser ), // read
                                        array( $this->auth->username ) // write
                                ) );
                        }
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+                       if ( $this->swiftUseCDN ) { // Rackspace style CDN
+                               $contObj->make_public( $this->swiftCDNExpiry );
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
@@ -372,29 +552,31 @@ class SwiftFileBackend extends FileBackendStore {
        protected function doSecureInternal( $fullCont, $dir, array $params ) {
                $status = Status::newGood();
 
-               if ( $this->swiftAnonUser != '' ) {
-                       // Restrict container from end-users...
-                       try {
-                               // doPrepareInternal() should have been called,
-                               // so the Swift container should already exist...
-                               $contObj = $this->getContainer( $fullCont ); // normally a cache hit
-                               // NoSuchContainerException not thrown: container must exist
-                               if ( !isset( $contObj->mw_wasSecured ) ) {
-                                       $status->merge( $this->setContainerAccess(
-                                               $contObj,
-                                               array( $this->auth->username ), // read
-                                               array( $this->auth->username ) // write
-                                       ) );
-                                       // @TODO: when php-cloudfiles supports container
-                                       // metadata, we can make use of that to avoid RTTs
-                                       $contObj->mw_wasSecured = true; // avoid useless RTTs
-                               }
-                       } catch ( InvalidResponseException $e ) {
-                               $status->fatal( 'backend-fail-connect', $this->name );
-                       } catch ( Exception $e ) { // some other exception?
-                               $status->fatal( 'backend-fail-internal', $this->name );
-                               $this->logException( $e, __METHOD__, $params );
+               // Restrict container from end-users...
+               try {
+                       // doPrepareInternal() should have been called,
+                       // so the Swift container should already exist...
+                       $contObj = $this->getContainer( $fullCont ); // normally a cache hit
+                       // NoSuchContainerException not thrown: container must exist
+
+                       // Make container private to end-users...
+                       if ( $this->swiftAnonUser != '' && !isset( $contObj->mw_wasSecured ) ) {
+                               $status->merge( $this->setContainerAccess(
+                                       $contObj,
+                                       array( $this->auth->username ), // read
+                                       array( $this->auth->username ) // write
+                               ) );
+                               // @TODO: when php-cloudfiles supports container
+                               // metadata, we can make use of that to avoid RTTs
+                               $contObj->mw_wasSecured = true; // avoid useless RTTs
                        }
+                       if ( $this->swiftUseCDN && $contObj->is_public() ) { // Rackspace style CDN
+                               $contObj->make_private();
+                       }
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
@@ -417,12 +599,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $contObj = $this->getContainer( $fullCont, true );
                } catch ( NoSuchContainerException $e ) {
                        return $status; // ok, nothing to do
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-internal', $this->name );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
@@ -432,12 +610,10 @@ class SwiftFileBackend extends FileBackendStore {
                                $this->deleteContainer( $fullCont );
                        } catch ( NoSuchContainerException $e ) {
                                return $status; // race?
-                       } catch ( InvalidResponseException $e ) {
-                               $status->fatal( 'backend-fail-connect', $this->name );
-                               return $status;
-                       } catch ( Exception $e ) { // some other exception?
-                               $status->fatal( 'backend-fail-internal', $this->name );
-                               $this->logException( $e, __METHOD__, $params );
+                       } catch ( NonEmptyContainerException $e ) {
+                               return $status; // race? consistency delay?
+                       } catch ( CloudFilesException $e ) { // some other exception?
+                               $this->handleException( $e, $status, __METHOD__, $params );
                                return $status;
                        }
                }
@@ -463,16 +639,14 @@ class SwiftFileBackend extends FileBackendStore {
                        $stat = array(
                                // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW
                                'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ),
-                               'size'  => $srcObj->content_length,
+                               'size'  => (int)$srcObj->content_length,
                                'sha1'  => $srcObj->metadata['Sha1base36']
                        );
                } catch ( NoSuchContainerException $e ) {
                } catch ( NoSuchObjectException $e ) {
-               } catch ( InvalidResponseException $e ) {
-                       $stat = null;
-               } catch ( Exception $e ) { // some other exception?
+               } catch ( CloudFilesException $e ) { // some other exception?
                        $stat = null;
-                       $this->logException( $e, __METHOD__, $params );
+                       $this->handleException( $e, null, __METHOD__, $params );
                }
 
                return $stat;
@@ -480,7 +654,7 @@ class SwiftFileBackend extends FileBackendStore {
 
        /**
         * Fill in any missing object metadata and save it to Swift
-        * 
+        *
         * @param $obj CF_Object
         * @param $path string Storage path to object
         * @return bool Success
@@ -493,7 +667,8 @@ class SwiftFileBackend extends FileBackendStore {
                $status = Status::newGood();
                $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
-                       $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1 ) );
+                       # Do not stat the file in getLocalCopy() to avoid infinite loops
+                       $tmpFile = $this->getLocalCopy( array( 'src' => $path, 'latest' => 1, 'nostat' => 1 ) );
                        if ( $tmpFile ) {
                                $hash = $tmpFile->getSha1Base36();
                                if ( $hash !== false ) {
@@ -524,48 +699,169 @@ class SwiftFileBackend extends FileBackendStore {
                $data = false;
                try {
                        $sContObj = $this->getContainer( $srcCont );
-                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD request
+                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
                        $data = $obj->read( $this->headersFromParams( $params ) );
                } catch ( NoSuchContainerException $e ) {
-               } catch ( InvalidResponseException $e ) {
-               } catch ( Exception $e ) { // some other exception?
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, $params );
                }
 
                return $data;
        }
 
+       /**
+        * @see FileBackendStore::doDirectoryExists()
+        * @return bool|null
+        */
+       protected function doDirectoryExists( $fullCont, $dir, array $params ) {
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       return ( count( $container->list_objects( 1, null, $prefix ) ) > 0 );
+               } catch ( NoSuchContainerException $e ) {
+                       return false;
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               return null; // error
+       }
+
+       /**
+        * @see FileBackendStore::getDirectoryListInternal()
+        * @return SwiftFileBackendDirList
+        */
+       public function getDirectoryListInternal( $fullCont, $dir, array $params ) {
+               return new SwiftFileBackendDirList( $this, $fullCont, $dir, $params );
+       }
+
        /**
         * @see FileBackendStore::getFileListInternal()
         * @return SwiftFileBackendFileList
         */
        public function getFileListInternal( $fullCont, $dir, array $params ) {
-               return new SwiftFileBackendFileList( $this, $fullCont, $dir );
+               return new SwiftFileBackendFileList( $this, $fullCont, $dir, $params );
        }
 
        /**
         * Do not call this function outside of SwiftFileBackendFileList
-        * 
+        *
         * @param $fullCont string Resolved container name
         * @param $dir string Resolved storage directory with no trailing slash
-        * @param $after string Storage path of file to list items after
+        * @param $after string|null Storage path of file to list items after
         * @param $limit integer Max number of items to list
-        * @return Array
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of dirs directly under $dir
+        */
+       public function getDirListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
+               $dirs = array();
+               if ( $after === INF ) {
+                       return $dirs; // nothing more
+               }
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               try {
+                       $container = $this->getContainer( $fullCont );
+                       $prefix = ( $dir == '' ) ? null : "{$dir}/";
+                       // Non-recursive: only list dirs right under $dir
+                       if ( !empty( $params['topOnly'] ) ) {
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) { // files and dirs
+                                       if ( substr( $object, -1 ) === '/' ) {
+                                               $dirs[] = $object; // directories end in '/'
+                                       }
+                               }
+                       // Recursive: list all dirs under $dir and its subdirs
+                       } else {
+                               // Get directory from last item of prior page
+                               $lastDir = $this->getParentDir( $after ); // must be first page
+                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               foreach ( $objects as $object ) { // files
+                                       $objectDir = $this->getParentDir( $object ); // directory of object
+                                       if ( $objectDir !== false ) { // file has a parent dir
+                                               // Swift stores paths in UTF-8, using binary sorting.
+                                               // See function "create_container_table" in common/db.py.
+                                               // If a directory is not "greater" than the last one,
+                                               // then it was already listed by the calling iterator.
+                                               if ( $objectDir > $lastDir ) {
+                                                       $pDir = $objectDir;
+                                                       do { // add dir and all its parent dirs
+                                                               $dirs[] = "{$pDir}/";
+                                                               $pDir = $this->getParentDir( $pDir );
+                                                       } while ( $pDir !== false // sanity
+                                                               && $pDir > $lastDir // not done already
+                                                               && strlen( $pDir ) > strlen( $dir ) // within $dir
+                                                       );
+                                               }
+                                               $lastDir = $objectDir;
+                                       }
+                               }
+                       }
+                       if ( count( $objects ) < $limit ) {
+                               $after = INF; // avoid a second RTT
+                       } else {
+                               $after = end( $objects ); // update last item
+                       }
+               } catch ( NoSuchContainerException $e ) {
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
+               }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               return $dirs;
+       }
+
+       protected function getParentDir( $path ) {
+               return ( strpos( $path, '/' ) !== false ) ? dirname( $path ) : false;
+       }
+
+       /**
+        * Do not call this function outside of SwiftFileBackendFileList
+        *
+        * @param $fullCont string Resolved container name
+        * @param $dir string Resolved storage directory with no trailing slash
+        * @param $after string|null Storage path of file to list items after
+        * @param $limit integer Max number of items to list
+        * @param $params Array Includes flag for 'topOnly'
+        * @return Array List of relative paths of files under $dir
         */
-       public function getFileListPageInternal( $fullCont, $dir, $after, $limit ) {
+       public function getFileListPageInternal( $fullCont, $dir, &$after, $limit, array $params ) {
                $files = array();
+               if ( $after === INF ) {
+                       return $files; // nothing more
+               }
+               wfProfileIn( __METHOD__ . '-' . $this->name );
 
                try {
                        $container = $this->getContainer( $fullCont );
                        $prefix = ( $dir == '' ) ? null : "{$dir}/";
-                       $files = $container->list_objects( $limit, $after, $prefix );
+                       // Non-recursive: only list files right under $dir
+                       if ( !empty( $params['topOnly'] ) ) { // files and dirs
+                               $objects = $container->list_objects( $limit, $after, $prefix, null, '/' );
+                               foreach ( $objects as $object ) {
+                                       if ( substr( $object, -1 ) !== '/' ) {
+                                               $files[] = $object; // directories end in '/'
+                                       }
+                               }
+                       // Recursive: list all files under $dir and its subdirs
+                       } else { // files
+                               $objects = $container->list_objects( $limit, $after, $prefix );
+                               $files = $objects;
+                       }
+                       if ( count( $objects ) < $limit ) {
+                               $after = INF; // avoid a second RTT
+                       } else {
+                               $after = end( $objects ); // update last item
+                       }
                } catch ( NoSuchContainerException $e ) {
-               } catch ( NoSuchObjectException $e ) {
-               } catch ( InvalidResponseException $e ) {
-               } catch ( Exception $e ) { // some other exception?
-                       $this->logException( $e, __METHOD__, array( 'cont' => $fullCont, 'dir' => $dir ) );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__,
+                               array( 'cont' => $fullCont, 'dir' => $dir ) );
                }
 
+               wfProfileOut( __METHOD__ . '-' . $this->name );
                return $files;
        }
 
@@ -573,7 +869,7 @@ class SwiftFileBackend extends FileBackendStore {
         * @see FileBackendStore::doGetFileSha1base36()
         * @return bool
         */
-       public function doGetFileSha1base36( array $params ) {
+       protected function doGetFileSha1base36( array $params ) {
                $stat = $this->getFileStat( $params );
                if ( $stat ) {
                        return $stat['sha1'];
@@ -599,24 +895,17 @@ class SwiftFileBackend extends FileBackendStore {
                } catch ( NoSuchContainerException $e ) {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
                        return $status;
-               } catch ( InvalidResponseException $e ) {
-                       $status->fatal( 'backend-fail-connect', $this->name );
-                       return $status;
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                        return $status;
                }
 
                try {
                        $output = fopen( 'php://output', 'wb' );
-                       $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD request
+                       $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
                        $obj->stream( $output, $this->headersFromParams( $params ) );
-               } catch ( InvalidResponseException $e ) { // 404? connection problem?
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-               } catch ( Exception $e ) { // some other exception?
-                       $status->fatal( 'backend-fail-stream', $params['src'] );
-                       $this->logException( $e, __METHOD__, $params );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
                }
 
                return $status;
@@ -632,7 +921,8 @@ class SwiftFileBackend extends FileBackendStore {
                        return null;
                }
 
-               if ( !$this->fileExists( $params ) ) {
+               # Check the recursion guard to avoid loops when filling metadata
+               if ( empty( $params['nostat'] ) && !$this->fileExists( $params ) ) {
                        return null;
                }
 
@@ -655,23 +945,29 @@ class SwiftFileBackend extends FileBackendStore {
                        }
                } catch ( NoSuchContainerException $e ) {
                        $tmpFile = null;
-               } catch ( InvalidResponseException $e ) {
-                       $tmpFile = null;
-               } catch ( Exception $e ) { // some other exception?
+               } catch ( CloudFilesException $e ) { // some other exception?
                        $tmpFile = null;
-                       $this->logException( $e, __METHOD__, $params );
+                       $this->handleException( $e, null, __METHOD__, $params );
                }
 
                return $tmpFile;
        }
 
+       /**
+        * @see FileBackendStore::directoriesAreVirtual()
+        * @return bool
+        */
+       protected function directoriesAreVirtual() {
+               return true;
+       }
+
        /**
         * Get headers to send to Swift when reading a file based
-        * on a FileBackend params array, e.g. that of getLocalCopy(). 
+        * on a FileBackend params array, e.g. that of getLocalCopy().
         * $params is currently only checked for a 'latest' flag.
-        * 
+        *
         * @param $params Array
-        * @return Array 
+        * @return Array
         */
        protected function headersFromParams( array $params ) {
                $hdrs = array();
@@ -681,6 +977,36 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
+       /**
+        * @see FileBackendStore::doExecuteOpHandlesInternal()
+        * @return Array List of corresponding Status objects
+        */
+       protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
+               $statuses = array();
+
+               $cfOps = array(); // list of CF_Async_Op objects
+               foreach ( $fileOpHandles as $index => $fileOpHandle ) {
+                       $cfOps[$index] = $fileOpHandle->cfOp;
+               }
+               $batch = new CF_Async_Op_Batch( $cfOps );
+
+               $cfOps = $batch->execute();
+               foreach ( $cfOps as $index => $cfOp ) {
+                       $status = Status::newGood();
+                       try { // catch exceptions; update status
+                               $function = '_getResponse' . $fileOpHandles[$index]->call;
+                               $this->$function( $cfOp, $status, $fileOpHandles[$index]->params );
+                               $this->purgeCDNCache( $fileOpHandles[$index]->affectedObjects );
+                       } catch ( CloudFilesException $e ) { // some other exception?
+                               $this->handleException( $e, $status,
+                                       __CLASS__ . ":$function", $fileOpHandles[$index]->params );
+                       }
+                       $statuses[$index] = $status;
+               }
+
+               return $statuses;
+       }
+
        /**
         * Set read/write permissions for a Swift container
         *
@@ -705,15 +1031,37 @@ class SwiftFileBackend extends FileBackendStore {
                return $req->execute(); // should return 204
        }
 
+       /**
+        * Purge the CDN cache of affected objects if CDN caching is enabled.
+        * This is for Rackspace/Akamai CDNs.
+        *
+        * @param $objects Array List of CF_Object items
+        * @return void
+        */
+       public function purgeCDNCache( array $objects ) {
+               if ( $this->swiftUseCDN && $this->swiftCDNPurgable ) {
+                       foreach ( $objects as $object ) {
+                               try {
+                                       $object->purge_from_cdn();
+                               } catch ( CDNNotEnabledException $e ) {
+                                       // CDN not enabled; nothing to see here
+                               } catch ( CloudFilesException $e ) {
+                                       $this->handleException( $e, null, __METHOD__,
+                                               array( 'cont' => $object->container->name, 'obj' => $object->name ) );
+                               }
+                       }
+               }
+       }
+
        /**
         * Get a connection to the Swift proxy
         *
         * @return CF_Connection|bool False on failure
-        * @throws InvalidResponseException
+        * @throws CloudFilesException
         */
        protected function getConnection() {
-               if ( $this->conn === false ) {
-                       throw new InvalidResponseException; // failed last attempt
+               if ( $this->connException instanceof Exception ) {
+                       throw $this->connException; // failed last attempt
                }
                // Session keys expire after a while, so we renew them periodically
                if ( $this->conn && ( time() - $this->connStarted ) > $this->authTTL ) {
@@ -721,21 +1069,18 @@ class SwiftFileBackend extends FileBackendStore {
                        $this->conn = null;
                }
                // Authenticate with proxy and get a session key...
-               if ( $this->conn === null ) {
+               if ( !$this->conn ) {
+                       $this->connStarted = 0;
                        $this->connContainers = array();
                        try {
                                $this->auth->authenticate();
                                $this->conn = new CF_Connection( $this->auth );
                                $this->connStarted = time();
-                       } catch ( AuthenticationException $e ) {
-                               $this->conn = false; // don't keep re-trying
-                       } catch ( InvalidResponseException $e ) {
-                               $this->conn = false; // don't keep re-trying
+                       } catch ( CloudFilesException $e ) {
+                               $this->connException = $e; // don't keep re-trying
+                               throw $e; // throw it back
                        }
                }
-               if ( !$this->conn ) {
-                       throw new InvalidResponseException; // auth/connection problem
-               }
                return $this->conn;
        }
 
@@ -751,23 +1096,30 @@ class SwiftFileBackend extends FileBackendStore {
         * Use $reCache if the file count or byte count is needed.
         *
         * @param $container string Container name
-        * @param $reCache bool Refresh the process cache
+        * @param $bypassCache bool Bypass all caches and load from Swift
         * @return CF_Container
+        * @throws CloudFilesException
         */
-       protected function getContainer( $container, $reCache = false ) {
+       protected function getContainer( $container, $bypassCache = false ) {
                $conn = $this->getConnection(); // Swift proxy connection
-               if ( $reCache ) {
-                       unset( $this->connContainers[$container] ); // purge cache
+               if ( $bypassCache ) { // purge cache
+                       unset( $this->connContainers[$container] );
+               } elseif ( !isset( $this->connContainers[$container] ) ) {
+                       $this->primeContainerCache( array( $container ) ); // check persistent cache
                }
                if ( !isset( $this->connContainers[$container] ) ) {
                        $contObj = $conn->get_container( $container );
                        // NoSuchContainerException not thrown: container must exist
                        if ( count( $this->connContainers ) >= $this->maxContCacheSize ) { // trim cache?
                                reset( $this->connContainers );
-                               $key = key( $this->connContainers );
-                               unset( $this->connContainers[$key] );
+                               unset( $this->connContainers[key( $this->connContainers )] );
                        }
                        $this->connContainers[$container] = $contObj; // cache it
+                       if ( !$bypassCache ) {
+                               $this->setContainerCache( $container, // update persistent cache
+                                       array( 'bytes' => $contObj->bytes_used, 'count' => $contObj->object_count )
+                               );
+                       }
                }
                return $this->connContainers[$container];
        }
@@ -777,6 +1129,7 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * @param $container string Container name
         * @return CF_Container
+        * @throws CloudFilesException
         */
        protected function createContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
@@ -790,49 +1143,99 @@ class SwiftFileBackend extends FileBackendStore {
         *
         * @param $container string Container name
         * @return void
+        * @throws CloudFilesException
         */
        protected function deleteContainer( $container ) {
                $conn = $this->getConnection(); // Swift proxy connection
-               $conn->delete_container( $container );
                unset( $this->connContainers[$container] ); // purge cache
+               $conn->delete_container( $container );
        }
 
        /**
-        * Log an unexpected exception for this backend
-        * 
+        * @see FileBackendStore::doPrimeContainerCache()
+        * @return void
+        */
+       protected function doPrimeContainerCache( array $containerInfo ) {
+               try {
+                       $conn = $this->getConnection(); // Swift proxy connection
+                       foreach ( $containerInfo as $container => $info ) {
+                               $this->connContainers[$container] = new CF_Container(
+                                       $conn->cfs_auth,
+                                       $conn->cfs_http,
+                                       $container,
+                                       $info['count'],
+                                       $info['bytes']
+                               );
+                       }
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, null, __METHOD__, array() );
+               }
+       }
+
+       /**
+        * Log an unexpected exception for this backend.
+        * This also sets the Status object to have a fatal error.
+        *
         * @param $e Exception
+        * @param $status Status|null
         * @param $func string
         * @param $params Array
         * @return void
         */
-       protected function logException( Exception $e, $func, array $params ) {
+       protected function handleException( Exception $e, $status, $func, array $params ) {
+               if ( $status instanceof Status ) {
+                       if ( $e instanceof AuthenticationException ) {
+                               $status->fatal( 'backend-fail-connect', $this->name );
+                       } else {
+                               $status->fatal( 'backend-fail-internal', $this->name );
+                       }
+               }
+               if ( $e->getMessage() ) {
+                       trigger_error( "$func: " . $e->getMessage(), E_USER_WARNING );
+               }
                wfDebugLog( 'SwiftBackend',
                        get_class( $e ) . " in '{$func}' (given '" . FormatJson::encode( $params ) . "')" .
-                       ( $e instanceof InvalidResponseException
-                               ? ": {$e->getMessage()}"
-                               : ""
-                       )
+                       ( $e->getMessage() ? ": {$e->getMessage()}" : "" )
                );
        }
 }
 
 /**
- * SwiftFileBackend helper class to page through object listings.
+ * @see FileBackendStoreOpHandle
+ */
+class SwiftFileOpHandle extends FileBackendStoreOpHandle {
+       /** @var CF_Async_Op */
+       public $cfOp;
+       /** @var Array */
+       public $affectedObjects = array();
+
+       public function __construct( $backend, array $params, $call, CF_Async_Op $cfOp ) {
+               $this->backend = $backend;
+               $this->params = $params;
+               $this->call = $call;
+               $this->cfOp = $cfOp;
+       }
+}
+
+/**
+ * SwiftFileBackend helper class to page through listings.
  * Swift also has a listing limit of 10,000 objects for sanity.
  * Do not use this class from places outside SwiftFileBackend.
  *
  * @ingroup FileBackend
  */
-class SwiftFileBackendFileList implements Iterator {
+abstract class SwiftFileBackendList implements Iterator {
        /** @var Array */
        protected $bufferIter = array();
        protected $bufferAfter = null; // string; list items *after* this path
        protected $pos = 0; // integer
+       /** @var Array */
+       protected $params = array();
 
        /** @var SwiftFileBackend */
-       protected $backend; 
-       protected $container; //
-       protected $dir; // string storage directory
+       protected $backend;
+       protected $container; // string; container name
+       protected $dir; // string; storage directory
        protected $suffixStart; // integer
 
        const PAGE_SIZE = 5000; // file listing buffer size
@@ -841,8 +1244,9 @@ class SwiftFileBackendFileList implements Iterator {
         * @param $backend SwiftFileBackend
         * @param $fullCont string Resolved container name
         * @param $dir string Resolved directory relative to container
+        * @param $params Array
         */
-       public function __construct( SwiftFileBackend $backend, $fullCont, $dir ) {
+       public function __construct( SwiftFileBackend $backend, $fullCont, $dir, array $params ) {
                $this->backend = $backend;
                $this->container = $fullCont;
                $this->dir = $dir;
@@ -854,14 +1258,7 @@ class SwiftFileBackendFileList implements Iterator {
                } else { // dir within container
                        $this->suffixStart = strlen( $this->dir ) + 1; // size of "path/to/dir/"
                }
-       }
-
-       /**
-        * @see Iterator::current()
-        * @return string|bool String or false
-        */
-       public function current() {
-               return substr( current( $this->bufferIter ), $this->suffixStart );
+               $this->params = $params;
        }
 
        /**
@@ -883,10 +1280,9 @@ class SwiftFileBackendFileList implements Iterator {
                // Check if there are no files left in this page and
                // advance to the next page if this page was not empty.
                if ( !$this->valid() && count( $this->bufferIter ) ) {
-                       $this->bufferAfter = end( $this->bufferIter );
-                       $this->bufferIter = $this->backend->getFileListPageInternal(
-                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
-                       );
+                       $this->bufferIter = $this->pageFromList(
+                               $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+                       ); // updates $this->bufferAfter
                }
        }
 
@@ -897,9 +1293,9 @@ class SwiftFileBackendFileList implements Iterator {
        public function rewind() {
                $this->pos = 0;
                $this->bufferAfter = null;
-               $this->bufferIter = $this->backend->getFileListPageInternal(
-                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE
-               );
+               $this->bufferIter = $this->pageFromList(
+                       $this->container, $this->dir, $this->bufferAfter, self::PAGE_SIZE, $this->params
+               ); // updates $this->bufferAfter
        }
 
        /**
@@ -907,6 +1303,64 @@ class SwiftFileBackendFileList implements Iterator {
         * @return bool
         */
        public function valid() {
-               return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+               if ( $this->bufferIter === null ) {
+                       return false; // some failure?
+               } else {
+                       return ( current( $this->bufferIter ) !== false ); // no paths can have this value
+               }
+       }
+
+       /**
+        * Get the given list portion (page)
+        *
+        * @param $container string Resolved container name
+        * @param $dir string Resolved path relative to container
+        * @param $after string|null
+        * @param $limit integer
+        * @param $params Array
+        * @return Traversable|Array|null Returns null on failure
+        */
+       abstract protected function pageFromList( $container, $dir, &$after, $limit, array $params );
+}
+
+/**
+ * Iterator for listing directories
+ */
+class SwiftFileBackendDirList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart, -1 );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getDirListPageInternal( $container, $dir, $after, $limit, $params );
+       }
+}
+
+/**
+ * Iterator for listing regular files
+ */
+class SwiftFileBackendFileList extends SwiftFileBackendList {
+       /**
+        * @see Iterator::current()
+        * @return string|bool String (relative path) or false
+        */
+       public function current() {
+               return substr( current( $this->bufferIter ), $this->suffixStart );
+       }
+
+       /**
+        * @see SwiftFileBackendList::pageFromList()
+        * @return Array|null
+        */
+       protected function pageFromList( $container, $dir, &$after, $limit, array $params ) {
+               return $this->backend->getFileListPageInternal( $container, $dir, $after, $limit, $params );
        }
 }
index 7843d6c..ddc640a 100644 (file)
@@ -1,12 +1,29 @@
 <?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
  */
 
 /**
  * This class is used to hold the location and do limited manipulation
- * of files stored temporarily (usually this will be $wgTmpDirectory)
+ * of files stored temporarily (this will be whatever wfTempDir() returns)
  *
  * @ingroup FileBackend
  */
index 1eb9eca..0a09894 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
@@ -27,16 +44,18 @@ class DBFileJournal extends FileJournal {
 
        /**
         * @see FileJournal::logChangeBatch()
-        * @return Status 
+        * @return Status
         */
        protected function doLogChangeBatch( array $entries, $batchId ) {
                $status = Status::newGood();
 
-               $dbw = $this->getMasterDB();
-               if ( !$dbw ) {
+               try {
+                       $dbw = $this->getMasterDB();
+               } catch ( DBError $e ) {
                        $status->fatal( 'filejournal-fail-dbconnect', $this->backend );
                        return $status;
                }
+
                $now = wfTimestamp( TS_UNIX );
 
                $data = array();
@@ -64,9 +83,39 @@ class DBFileJournal extends FileJournal {
                return $status;
        }
 
+       /**
+        * @see FileJournal::doGetChangeEntries()
+        * @return Array
+        * @throws DBError
+        */
+       protected function doGetChangeEntries( $start, $limit ) {
+               $dbw = $this->getMasterDB();
+
+               $res = $dbw->select( 'filejournal', '*',
+                       array(
+                               'fj_backend' => $this->backend,
+                               'fj_id >= ' . $dbw->addQuotes( (int)$start ) ), // $start may be 0
+                       __METHOD__,
+                       array_merge( array( 'ORDER BY' => 'fj_id ASC' ),
+                               $limit ? array( 'LIMIT' => $limit ) : array() )
+               );
+
+               $entries = array();
+               foreach ( $res as $row ) {
+                       $item = array();
+                       foreach ( (array)$row as $key => $value ) {
+                               $item[substr( $key, 3 )] = $value; // "fj_op" => "op"
+                       }
+                       $entries[] = $item;
+               }
+
+               return $entries;
+       }
+
        /**
         * @see FileJournal::purgeOldLogs()
         * @return Status
+        * @throws DBError
         */
        protected function doPurgeOldLogs() {
                $status = Status::newGood();
@@ -75,38 +124,26 @@ class DBFileJournal extends FileJournal {
                }
 
                $dbw = $this->getMasterDB();
-               if ( !$dbw ) {
-                       $status->fatal( 'filejournal-fail-dbconnect', $this->backend );
-                       return $status;
-               }
                $dbCutoff = $dbw->timestamp( time() - 86400 * $this->ttlDays );
 
-               try {
-                       $dbw->begin();
-                       $dbw->delete( 'filejournal',
-                               array( 'fj_timestamp < ' . $dbw->addQuotes( $dbCutoff ) ),
-                               __METHOD__
-                       );
-                       $dbw->commit();
-               } catch ( DBError $e ) {
-                       $status->fatal( 'filejournal-fail-dbquery', $this->backend );
-                       return $status;
-               }
+               $dbw->begin();
+               $dbw->delete( 'filejournal',
+                       array( 'fj_timestamp < ' . $dbw->addQuotes( $dbCutoff ) ),
+                       __METHOD__
+               );
+               $dbw->commit();
 
                return $status;
        }
 
        /**
         * Get a master connection to the logging DB
-        * 
-        * @return DatabaseBase|null 
+        *
+        * @return DatabaseBase
+        * @throws DBError
         */
        protected function getMasterDB() {
-               try {
-                       $lb = wfGetLBFactory()->newMainLB();
-                       return $lb->getConnection( DB_MASTER, array(), $this->wiki );
-               } catch ( DBConnectionError $e ) {
-                       return null;
-               }
+               $lb = wfGetLBFactory()->newMainLB();
+               return $lb->getConnection( DB_MASTER, array(), $this->wiki );
        }
 }
index f60b7f9..234788b 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
@@ -35,9 +52,10 @@ abstract class FileJournal {
 
        /**
         * Create an appropriate FileJournal object from config
-        * 
+        *
         * @param $config Array
         * @param $backend string A registered file backend name
+        * @throws MWException
         * @return FileJournal
         */
        final public static function factory( array $config, $backend ) {
@@ -92,10 +110,47 @@ abstract class FileJournal {
         */
        abstract protected function doLogChangeBatch( array $entries, $batchId );
 
+       /**
+        * Get an array of file change log entries.
+        * A starting change ID and/or limit can be specified.
+        *
+        * The result as a list of associative arrays, each having:
+        *     id         : unique, monotonic, ID for this change
+        *     batch_uuid : UUID for an operation batch
+        *     backend    : the backend name
+        *     op         : primitive operation (create,update,delete)
+        *     path       : affected storage path
+        *     path_sha1  : base 36 sha1 of the affected storage path
+        *     timestamp  : TS_MW timestamp of the batch change
+
+        * Also, $next is updated to the ID of the next entry.
+        *
+        * @param $start integer Starting change ID or null
+        * @param $limit integer Maximum number of items to return
+        * @param &$next string
+        * @return Array
+        */
+       final public function getChangeEntries( $start = null, $limit = 0, &$next = null ) {
+               $entries = $this->doGetChangeEntries( $start, $limit ? $limit + 1 : 0 );
+               if ( $limit && count( $entries ) > $limit ) {
+                       $last = array_pop( $entries ); // remove the extra entry
+                       $next = $last['id']; // update for next call
+               } else {
+                       $next = null; // end of list
+               }
+               return $entries;
+       }
+
+       /**
+        * @see FileJournal::getChangeEntries()
+        * @return Array
+        */
+       abstract protected function doGetChangeEntries( $start, $limit );
+
        /**
         * Purge any old log entries
-        * 
-        * @return Status 
+        *
+        * @return Status
         */
        final public function purgeOldLogs() {
                return $this->doPurgeOldLogs();
@@ -115,12 +170,22 @@ abstract class FileJournal {
 class NullFileJournal extends FileJournal {
        /**
         * @see FileJournal::logChangeBatch()
-        * @return Status 
+        * @param $entries array
+        * @param $batchId string
+        * @return Status
         */
        protected function doLogChangeBatch( array $entries, $batchId ) {
                return Status::newGood();
        }
 
+       /**
+        * @see FileJournal::doGetChangeEntries()
+        * @return Array
+        */
+       protected function doGetChangeEntries( $start, $limit ) {
+               return array();
+       }
+
        /**
         * @see FileJournal::purgeOldLogs()
         * @return Status
index dcba1eb..c2a5085 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.
@@ -92,6 +113,8 @@ class DBLockManager extends LockManager {
 
        /**
         * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doLock( array $paths, $type ) {
@@ -143,6 +166,8 @@ class DBLockManager extends LockManager {
 
        /**
         * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doUnlock( array $paths, $type ) {
@@ -417,11 +442,21 @@ class MySqlLockManager extends DBLockManager {
                self::LOCK_EX => self::LOCK_EX
        );
 
+       /**
+        * @param $lockDb string
+        * @param $db DatabaseBase
+        */
        protected function initConnection( $lockDb, DatabaseBase $db ) {
                # Let this transaction see lock rows from other transactions
                $db->query( "SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" );
        }
 
+       /**
+        * @param $lockDb string
+        * @param $paths array
+        * @param $type int
+        * @return bool
+        */
        protected function doLockingQuery( $lockDb, array $paths, $type ) {
                $db = $this->getConnection( $lockDb );
                if ( !$db ) {
index d35a1ae..53f3e9f 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
         *
@@ -41,6 +62,8 @@ class FSLockManager extends LockManager {
 
        /**
         * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doLock( array $paths, $type ) {
@@ -63,6 +86,8 @@ class FSLockManager extends LockManager {
 
        /**
         * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doUnlock( array $paths, $type ) {
@@ -80,7 +105,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 +143,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,11 +163,22 @@ 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] );
                                }
                        }
+                       if ( !count( $this->locksHeld[$path] ) ) {
+                               unset( $this->locksHeld[$path] ); // no locks on this path
+                       }
                        // Unlock handles to release locks and delete
                        // any lock files that end up with no locks on them...
                        if ( wfIsWindows() ) {
@@ -151,7 +187,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 ) );
@@ -161,31 +197,35 @@ class FSLockManager extends LockManager {
                return $status;
        }
 
+       /**
+        * @param $path string
+        * @param $handlesToClose array
+        * @return Status
+        */
        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;
        }
 
+       /**
+        * @param $path string
+        * @return Status
+        */
        private function pruneKeyLockFiles( $path ) {
                $status = Status::newGood();
-               if ( !count( $this->locksHeld[$path] ) ) {
-                       wfSuppressWarnings();
+               if ( !isset( $this->locksHeld[$path] ) ) {
                        # 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] );
                }
                return $status;
@@ -201,11 +241,15 @@ class FSLockManager extends LockManager {
                return "{$this->lockDir}/{$hash}.lock";
        }
 
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
        function __destruct() {
-               // Make sure remaining locks get cleared for sanity
-               foreach ( $this->locksHeld as $path => $locks ) {
-                       $this->doSingleUnlock( $path, self::LOCK_EX );
-                       $this->doSingleUnlock( $path, self::LOCK_SH );
+               while ( count( $this->locksHeld ) ) {
+                       foreach ( $this->locksHeld as $path => $locks ) {
+                               $this->doSingleUnlock( $path, self::LOCK_EX );
+                               $this->doSingleUnlock( $path, self::LOCK_SH );
+                       }
                }
        }
 }
index 742c9d0..024e11b 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.
@@ -15,7 +36,7 @@
  * @ingroup LockManager
  * @since 1.19
  */
-class LSLockManager extends LockManager {
+class LSLockManager extends QuorumLockManager {
        /** @var Array Mapping of lock types to the type actually used */
        protected $lockTypeMap = array(
                self::LOCK_SH => self::LOCK_SH,
@@ -25,8 +46,6 @@ class LSLockManager extends LockManager {
 
        /** @var Array Map of server names to server config */
        protected $lockServers; // (server name => server config array)
-       /** @var Array Map of bucket indexes to peer server lists */
-       protected $srvsByBucket; // (bucket index => (lsrv1, lsrv2, ...))
 
        /** @var Array Map Server connections (server name => resource) */
        protected $conns = array();
@@ -36,7 +55,7 @@ class LSLockManager extends LockManager {
 
        /**
         * Construct a new instance from configuration.
-        * 
+        *
         * $config paramaters include:
         *     'lockServers'  : Associative array of server names to configuration.
         *                      Configuration is an associative array that includes:
@@ -47,7 +66,7 @@ class LSLockManager extends LockManager {
         *                      each having an odd-numbered list of server names (peers) as values.
         *     'connTimeout'  : Lock server connection attempt timeout. [optional]
         *
-        * @param Array $config 
+        * @param Array $config
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
@@ -63,119 +82,74 @@ class LSLockManager extends LockManager {
                        $this->connTimeout = 3; // use some sane amount
                }
 
-               $this->session = '';
-               for ( $i = 0; $i < 5; $i++ ) {
-                       $this->session .= mt_rand( 0, 2147483647 );
-               }
-               $this->session = wfBaseConvert( sha1( $this->session ), 16, 36, 31 );
+               $this->session = wfRandomString( 31 );
        }
 
        /**
-        * @see LockManager::doLock()
+        * @see QuorumLockManager::getLocksOnServer()
         * @return Status
         */
-       protected function doLock( array $paths, $type ) {
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
-               $pathsToLock = array();
-               // Get locks that need to be acquired (buckets => locks)...
-               foreach ( $paths as $path ) {
-                       if ( isset( $this->locksHeld[$path][$type] ) ) {
-                               ++$this->locksHeld[$path][$type];
-                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
-                               $this->locksHeld[$path][$type] = 1;
-                       } else {
-                               $bucket = $this->getBucketFromKey( $path );
-                               $pathsToLock[$bucket][] = $path;
-                       }
-               }
+               // Send out the command and get the response...
+               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
+               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+               $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
 
-               $lockedPaths = array(); // files locked in this attempt
-               // Attempt to acquire these locks...
-               foreach ( $pathsToLock as $bucket => $paths ) {
-                       // Try to acquire the locks for this bucket
-                       $res = $this->doLockingRequestAll( $bucket, $paths, $type );
-                       if ( $res === 'cantacquire' ) {
-                               // Resources already locked by another process.
-                               // Abort and unlock everything we just locked.
-                               foreach ( $paths as $path ) {
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       } elseif ( $res !== true ) {
-                               // Couldn't contact any servers for this bucket.
-                               // Abort and unlock everything we just locked.
-                               foreach ( $paths as $path ) {
-                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
-                               }
-                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
-                               return $status;
-                       }
-                       // Record these locks as active
+               if ( $response !== 'ACQUIRED' ) {
                        foreach ( $paths as $path ) {
-                               $this->locksHeld[$path][$type] = 1; // locked
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
                        }
-                       // Keep track of what locks were made in this attempt
-                       $lockedPaths = array_merge( $lockedPaths, $paths );
                }
 
                return $status;
        }
 
        /**
-        * @see LockManager::doUnlock()
+        * @see QuorumLockManager::freeLocksOnServer()
         * @return Status
         */
-       protected function doUnlock( array $paths, $type ) {
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
                $status = Status::newGood();
 
-               foreach ( $paths as $path ) {
-                       if ( !isset( $this->locksHeld[$path] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } elseif ( !isset( $this->locksHeld[$path][$type] ) ) {
-                               $status->warning( 'lockmanager-notlocked', $path );
-                       } else {
-                               --$this->locksHeld[$path][$type];
-                               if ( $this->locksHeld[$path][$type] <= 0 ) {
-                                       unset( $this->locksHeld[$path][$type] );
-                               }
-                               if ( !count( $this->locksHeld[$path] ) ) {
-                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
-                               }
-                       }
-               }
+               // Send out the command and get the response...
+               $type = ( $type == self::LOCK_SH ) ? 'SH' : 'EX';
+               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
+               $response = $this->sendCommand( $lockSrv, 'RELEASE', $type, $keys );
 
-               // Reference count the locks held and release locks when zero
-               if ( !count( $this->locksHeld ) ) {
-                       $status->merge( $this->releaseLocks() );
+               if ( $response !== 'RELEASED' ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
                }
 
                return $status;
        }
 
        /**
-        * Get a connection to a lock server and acquire locks on $paths
-        *
-        * @param $lockSrv string
-        * @param $paths Array
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool Resources able to be locked
+        * @see QuorumLockManager::releaseAllLocks()
+        * @return Status
         */
-       protected function doLockingRequest( $lockSrv, array $paths, $type ) {
-               if ( $type == self::LOCK_SH ) { // reader locks
-                       $type = 'SH';
-               } elseif ( $type == self::LOCK_EX ) { // writer locks
-                       $type = 'EX';
-               } else {
-                       return true; // ok...
+       protected function releaseAllLocks() {
+               $status = Status::newGood();
+
+               foreach ( $this->conns as $lockSrv => $conn ) {
+                       $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
+                       if ( $response !== 'RELEASED_ALL' ) {
+                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+                       }
                }
 
-               // Send out the command and get the response...
-               $keys = array_unique( array_map( 'LockManager::sha1Base36', $paths ) );
-               $response = $this->sendCommand( $lockSrv, 'ACQUIRE', $type, $keys );
+               return $status;
+       }
 
-               return ( $response === 'ACQUIRED' );
+       /**
+        * @see QuorumLockManager::isServerUp()
+        * @return bool
+        */
+       protected function isServerUp( $lockSrv ) {
+               return (bool)$this->getConnection( $lockSrv );
        }
 
        /**
@@ -208,39 +182,6 @@ class LSLockManager extends LockManager {
                return trim( $response );
        }
 
-       /**
-        * Attempt to acquire locks with the peers for a bucket
-        *
-        * @param $bucket integer
-        * @param $paths Array List of resource keys to lock
-        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
-        * @return bool|string One of (true, 'cantacquire', 'srverrors')
-        */
-       protected function doLockingRequestAll( $bucket, array $paths, $type ) {
-               $yesVotes = 0; // locks made on trustable servers
-               $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
-               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
-               // Get votes for each peer, in order, until we have enough...
-               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
-                       // Attempt to acquire the lock on this peer
-                       if ( !$this->doLockingRequest( $lockSrv, $paths, $type ) ) {
-                               return 'cantacquire'; // vetoed; resource locked
-                       }
-                       ++$yesVotes; // success for this peer
-                       if ( $yesVotes >= $quorum ) {
-                               return true; // lock obtained
-                       }
-                       --$votesLeft;
-                       $votesNeeded = $quorum - $yesVotes;
-                       if ( $votesNeeded > $votesLeft ) {
-                               // In "trust cache" mode we don't have to meet the quorum
-                               break; // short-circuit
-                       }
-               }
-               // At this point, we must not have meet the quorum
-               return 'srverrors'; // not enough votes to ensure correctness
-       }
-
        /**
         * Get (or reuse) a connection to a lock server
         *
@@ -265,39 +206,11 @@ class LSLockManager extends LockManager {
                return $this->conns[$lockSrv];
        }
 
-       /**
-        * Release all locks that this session is holding
-        *
-        * @return Status
-        */
-       protected function releaseLocks() {
-               $status = Status::newGood();
-               foreach ( $this->conns as $lockSrv => $conn ) {
-                       $response = $this->sendCommand( $lockSrv, 'RELEASE_ALL', '', array() );
-                       if ( $response !== 'RELEASED_ALL' ) {
-                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
-                       }
-               }
-               return $status;
-       }
-
-       /**
-        * Get the bucket for resource path.
-        * This should avoid throwing any exceptions.
-        *
-        * @param $path string
-        * @return integer
-        */
-       protected function getBucketFromKey( $path ) {
-               $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
-               return intval( base_convert( $prefix, 16, 10 ) ) % count( $this->srvsByBucket );
-       }
-
        /**
         * Make sure remaining locks get cleared for sanity
         */
        function __destruct() {
-               $this->releaseLocks();
+               $this->releaseAllLocks();
                foreach ( $this->conns as $conn ) {
                        fclose( $conn );
                }
index 506d850..07853f8 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
@@ -50,10 +67,10 @@ abstract class LockManager {
 
        /**
         * Lock the resources at the given abstract paths
-        * 
+        *
         * @param $paths Array List of resource names
         * @param $type integer LockManager::LOCK_* constant
-        * @return Status 
+        * @return Status
         */
        final public function lock( array $paths, $type = self::LOCK_EX ) {
                wfProfileIn( __METHOD__ );
@@ -64,10 +81,10 @@ abstract class LockManager {
 
        /**
         * Unlock the resources at the given abstract paths
-        * 
+        *
         * @param $paths Array List of storage paths
         * @param $type integer LockManager::LOCK_* constant
-        * @return Status 
+        * @return Status
         */
        final public function unlock( array $paths, $type = self::LOCK_EX ) {
                wfProfileIn( __METHOD__ );
@@ -78,7 +95,7 @@ abstract class LockManager {
 
        /**
         * Get the base 36 SHA-1 of a string, padded to 31 digits
-        * 
+        *
         * @param $path string
         * @return string
         */
@@ -88,7 +105,7 @@ abstract class LockManager {
 
        /**
         * Lock resources with the given keys and lock type
-        * 
+        *
         * @param $paths Array List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return string
@@ -97,7 +114,7 @@ abstract class LockManager {
 
        /**
         * Unlock resources with the given keys and lock type
-        * 
+        *
         * @param $paths Array List of storage paths
         * @param $type integer LockManager::LOCK_* constant
         * @return string
@@ -106,7 +123,7 @@ abstract class LockManager {
 }
 
 /**
- * Self releasing locks
+ * Self-releasing locks
  *
  * LockManager helper class to handle scoped locks, which
  * release when an object is destroyed or goes out of scope.
@@ -139,13 +156,11 @@ class ScopedLock {
                $this->type = $type;
        }
 
-       protected function __clone() {}
-
        /**
         * Get a ScopedLock object representing a lock on resource paths.
         * Any locks are released once this object goes out of scope.
         * The status object is updated with any errors or warnings.
-        * 
+        *
         * @param $manager LockManager
         * @param $paths Array List of storage paths
         * @param $type integer LockManager::LOCK_* constant
@@ -173,6 +188,216 @@ class ScopedLock {
        }
 }
 
+/**
+ * Version of LockManager that uses a quorum from peer servers for locks.
+ * The resource space can also be sharded into separate peer groups.
+ *
+ * @ingroup LockManager
+ * @since 1.20
+ */
+abstract class QuorumLockManager extends LockManager {
+       /** @var Array Map of bucket indexes to peer server lists */
+       protected $srvsByBucket = array(); // (bucket index => (lsrv1, lsrv2, ...))
+
+       /**
+        * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       final protected function doLock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               $pathsToLock = array(); // (bucket => paths)
+               // Get locks that need to be acquired (buckets => locks)...
+               foreach ( $paths as $path ) {
+                       if ( isset( $this->locksHeld[$path][$type] ) ) {
+                               ++$this->locksHeld[$path][$type];
+                       } elseif ( isset( $this->locksHeld[$path][self::LOCK_EX] ) ) {
+                               $this->locksHeld[$path][$type] = 1;
+                       } else {
+                               $bucket = $this->getBucketFromKey( $path );
+                               $pathsToLock[$bucket][] = $path;
+                       }
+               }
+
+               $lockedPaths = array(); // files locked in this attempt
+               // Attempt to acquire these locks...
+               foreach ( $pathsToLock as $bucket => $paths ) {
+                       // Try to acquire the locks for this bucket
+                       $status->merge( $this->doLockingRequestBucket( $bucket, $paths, $type ) );
+                       if ( !$status->isOK() ) {
+                               $status->merge( $this->doUnlock( $lockedPaths, $type ) );
+                               return $status;
+                       }
+                       // Record these locks as active
+                       foreach ( $paths as $path ) {
+                               $this->locksHeld[$path][$type] = 1; // locked
+                       }
+                       // Keep track of what locks were made in this attempt
+                       $lockedPaths = array_merge( $lockedPaths, $paths );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
+        * @return Status
+        */
+       final protected function doUnlock( array $paths, $type ) {
+               $status = Status::newGood();
+
+               $pathsToUnlock = array();
+               foreach ( $paths as $path ) {
+                       if ( !isset( $this->locksHeld[$path][$type] ) ) {
+                               $status->warning( 'lockmanager-notlocked', $path );
+                       } else {
+                               --$this->locksHeld[$path][$type];
+                               // Reference count the locks held and release locks when zero
+                               if ( $this->locksHeld[$path][$type] <= 0 ) {
+                                       unset( $this->locksHeld[$path][$type] );
+                                       $bucket = $this->getBucketFromKey( $path );
+                                       $pathsToUnlock[$bucket][] = $path;
+                               }
+                               if ( !count( $this->locksHeld[$path] ) ) {
+                                       unset( $this->locksHeld[$path] ); // no SH or EX locks left for key
+                               }
+                       }
+               }
+
+               // Remove these specific locks if possible, or at least release
+               // all locks once this process is currently not holding any locks.
+               foreach ( $pathsToUnlock as $bucket => $paths ) {
+                       $status->merge( $this->doUnlockingRequestBucket( $bucket, $paths, $type ) );
+               }
+               if ( !count( $this->locksHeld ) ) {
+                       $status->merge( $this->releaseAllLocks() );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Attempt to acquire locks with the peers for a bucket.
+        * This is all or nothing; if any key is locked then this totally fails.
+        *
+        * @param $bucket integer
+        * @param $paths Array List of resource keys to lock
+        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @return Status
+        */
+       final protected function doLockingRequestBucket( $bucket, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $yesVotes = 0; // locks made on trustable servers
+               $votesLeft = count( $this->srvsByBucket[$bucket] ); // remaining peers
+               $quorum = floor( $votesLeft/2 + 1 ); // simple majority
+               // Get votes for each peer, in order, until we have enough...
+               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+                       if ( !$this->isServerUp( $lockSrv ) ) {
+                               --$votesLeft;
+                               $status->warning( 'lockmanager-fail-svr-acquire', $lockSrv );
+                               continue; // server down?
+                       }
+                       // Attempt to acquire the lock on this peer
+                       $status->merge( $this->getLocksOnServer( $lockSrv, $paths, $type ) );
+                       if ( !$status->isOK() ) {
+                               return $status; // vetoed; resource locked
+                       }
+                       ++$yesVotes; // success for this peer
+                       if ( $yesVotes >= $quorum ) {
+                               return $status; // lock obtained
+                       }
+                       --$votesLeft;
+                       $votesNeeded = $quorum - $yesVotes;
+                       if ( $votesNeeded > $votesLeft ) {
+                               break; // short-circuit
+                       }
+               }
+               // At this point, we must not have met the quorum
+               $status->setResult( false );
+
+               return $status;
+       }
+
+       /**
+        * Attempt to release locks with the peers for a bucket
+        *
+        * @param $bucket integer
+        * @param $paths Array List of resource keys to lock
+        * @param $type integer LockManager::LOCK_EX or LockManager::LOCK_SH
+        * @return Status
+        */
+       final protected function doUnlockingRequestBucket( $bucket, array $paths, $type ) {
+               $status = Status::newGood();
+
+               foreach ( $this->srvsByBucket[$bucket] as $lockSrv ) {
+                       if ( !$this->isServerUp( $lockSrv ) ) {
+                               $status->fatal( 'lockmanager-fail-svr-release', $lockSrv );
+                       // Attempt to release the lock on this peer
+                       } else {
+                               $status->merge( $this->freeLocksOnServer( $lockSrv, $paths, $type ) );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Get the bucket for resource path.
+        * This should avoid throwing any exceptions.
+        *
+        * @param $path string
+        * @return integer
+        */
+       protected function getBucketFromKey( $path ) {
+               $prefix = substr( sha1( $path ), 0, 2 ); // first 2 hex chars (8 bits)
+               return (int)base_convert( $prefix, 16, 10 ) % count( $this->srvsByBucket );
+       }
+
+       /**
+        * Check if a lock server is up
+        *
+        * @param $lockSrv string
+        * @return bool
+        */
+       abstract protected function isServerUp( $lockSrv );
+
+       /**
+        * Get a connection to a lock server and acquire locks on $paths
+        *
+        * @param $lockSrv string
+        * @param $paths array
+        * @param $type integer
+        * @return Status
+        */
+       abstract protected function getLocksOnServer( $lockSrv, array $paths, $type );
+
+       /**
+        * Get a connection to a lock server and release locks on $paths.
+        *
+        * Subclasses must effectively implement this or releaseAllLocks().
+        *
+        * @param $lockSrv string
+        * @param $paths array
+        * @param $type integer
+        * @return Status
+        */
+       abstract protected function freeLocksOnServer( $lockSrv, array $paths, $type );
+
+       /**
+        * Release all locks that this session is holding.
+        *
+        * Subclasses must effectively implement this or freeLocksOnServer().
+        *
+        * @return Status
+        */
+       abstract protected function releaseAllLocks();
+}
+
 /**
  * Simple version of LockManager that does nothing
  * @since 1.19
@@ -180,6 +405,8 @@ class ScopedLock {
 class NullLockManager extends LockManager {
        /**
         * @see LockManager::doLock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doLock( array $paths, $type ) {
@@ -188,6 +415,8 @@ class NullLockManager extends LockManager {
 
        /**
         * @see LockManager::doUnlock()
+        * @param $paths array
+        * @param $type int
         * @return Status
         */
        protected function doUnlock( array $paths, $type ) {
index 5e53366..8c8c940 100644 (file)
@@ -1,13 +1,34 @@
 <?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
- * 
+ *
  * @ingroup LockManager
  * @author Aaron Schulz
  * @since 1.19
  */
 class LockManagerGroup {
-
        /**
         * @var LockManagerGroup
         */
@@ -17,7 +38,6 @@ class LockManagerGroup {
        protected $managers = array();
 
        protected function __construct() {}
-       protected function __clone() {}
 
        /**
         * @return LockManagerGroup
@@ -40,7 +60,7 @@ class LockManagerGroup {
 
        /**
         * Register lock managers from the global variables
-        * 
+        *
         * @return void
         */
        protected function initFromGlobals() {
@@ -94,4 +114,30 @@ class LockManagerGroup {
                }
                return $this->managers[$name]['instance'];
        }
+
+       /**
+        * Get the default lock manager configured for the site.
+        * Returns NullLockManager if no lock manager could be found.
+        *
+        * @return LockManager
+        */
+       public function getDefault() {
+               return isset( $this->managers['default'] )
+                       ? $this->get( 'default' )
+                       : new NullLockManager( array() );
+       }
+
+       /**
+        * Get the default lock manager configured for the site
+        * or at least some other effective configured lock manager.
+        * Throws an exception if no lock manager could be found.
+        *
+        * @return LockManager
+        * @throws MWException
+        */
+       public function getAny() {
+               return isset( $this->managers['default'] )
+                       ? $this->get( 'default' )
+                       : $this->get( 'fsLockManager' );
+       }
 }
diff --git a/includes/filerepo/backend/lockmanager/MemcLockManager.php b/includes/filerepo/backend/lockmanager/MemcLockManager.php
new file mode 100644 (file)
index 0000000..add1f2c
--- /dev/null
@@ -0,0 +1,306 @@
+<?php
+/**
+ * Version of LockManager based on using memcached 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 memcached servers.
+ *
+ * Version of LockManager based on using memcached servers.
+ * This is meant for multi-wiki systems that may share files.
+ * All locks are non-blocking, which avoids deadlocks.
+ *
+ * All lock requests for a resource, identified by a hash string, will map
+ * to one bucket. Each bucket maps to one or several peer servers, each running memcached.
+ * A majority of peers must agree for a lock to be acquired.
+ *
+ * @ingroup LockManager
+ * @since 1.20
+ */
+class MemcLockManager extends QuorumLockManager {
+       /** @var Array Mapping of lock types to the type actually used */
+       protected $lockTypeMap = array(
+               self::LOCK_SH => self::LOCK_SH,
+               self::LOCK_UW => self::LOCK_SH,
+               self::LOCK_EX => self::LOCK_EX
+       );
+
+       /** @var Array Map server names to MemcachedBagOStuff objects */
+       protected $bagOStuffs = array();
+       /** @var Array */
+       protected $serversUp = array(); // (server name => bool)
+
+       protected $lockExpiry; // integer; maximum time locks can be held
+       protected $session = ''; // string; random SHA-1 UUID
+       protected $wikiId = ''; // string
+
+       /**
+        * Construct a new instance from configuration.
+        *
+        * $config paramaters include:
+        *     'lockServers'  : Associative array of server names to <IP>:<port> strings.
+        *     'srvsByBucket' : Array of 1-16 consecutive integer keys, starting from 0,
+        *                      each having an odd-numbered list of server names (peers) as values.
+        *     'memcConfig'   : Configuration array for ObjectCache::newFromParams. [optional]
+        *                      If set, this must use one of the memcached classes.
+        *     'wikiId'       : Wiki ID string that all resources are relative to. [optional]
+        *
+        * @param Array $config
+        */
+       public function __construct( array $config ) {
+               parent::__construct( $config );
+
+               // Sanitize srvsByBucket config to prevent PHP errors
+               $this->srvsByBucket = array_filter( $config['srvsByBucket'], 'is_array' );
+               $this->srvsByBucket = array_values( $this->srvsByBucket ); // consecutive
+
+               $memcConfig = isset( $config['memcConfig'] )
+                       ? $config['memcConfig']
+                       : array( 'class' => 'MemcachedPhpBagOStuff' );
+
+               foreach ( $config['lockServers'] as $name => $address ) {
+                       $params = array( 'servers' => array( $address ) ) + $memcConfig;
+                       $cache = ObjectCache::newFromParams( $params );
+                       if ( $cache instanceof MemcachedBagOStuff ) {
+                               $this->bagOStuffs[$name] = $cache;
+                       } else {
+                               throw new MWException(
+                                       'Only MemcachedBagOStuff classes are supported by MemcLockManager.' );
+                       }
+               }
+
+               $this->wikiId = isset( $config['wikiId'] ) ? $config['wikiId'] : wfWikiID();
+
+               $met = ini_get( 'max_execution_time' ); // this is 0 in CLI mode
+               $this->lockExpiry = $met ? 2*(int)$met : 2*3600;
+
+               $this->session = wfRandomString( 31 );
+       }
+
+       /**
+        * @see QuorumLockManager::getLocksOnServer()
+        * @return Status
+        */
+       protected function getLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $memc = $this->getCache( $lockSrv );
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               // Lock all of the active lock record keys...
+               if ( !$this->acquireMutexes( $memc, $keys ) ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                       }
+                       return;
+               }
+
+               // Fetch all the existing lock records...
+               $lockRecords = $memc->getMulti( $keys );
+
+               $now = time();
+               // Check if the requested locks conflict with existing ones...
+               foreach ( $paths as $path ) {
+                       $locksKey = $this->recordKeyForPath( $path );
+                       $locksHeld = isset( $lockRecords[$locksKey] )
+                               ? $lockRecords[$locksKey]
+                               : array( self::LOCK_SH => array(), self::LOCK_EX => array() ); // init
+                       foreach ( $locksHeld[self::LOCK_EX] as $session => $expiry ) {
+                               if ( $expiry < $now ) { // stale?
+                                       unset( $locksHeld[self::LOCK_EX][$session] );
+                               } elseif ( $session !== $this->session ) {
+                                       $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                               }
+                       }
+                       if ( $type === self::LOCK_EX ) {
+                               foreach ( $locksHeld[self::LOCK_SH] as $session => $expiry ) {
+                                       if ( $expiry < $now ) { // stale?
+                                               unset( $locksHeld[self::LOCK_SH][$session] );
+                                       } elseif ( $session !== $this->session ) {
+                                               $status->fatal( 'lockmanager-fail-acquirelock', $path );
+                                       }
+                               }
+                       }
+                       if ( $status->isOK() ) {
+                               // Register the session in the lock record array
+                               $locksHeld[$type][$this->session] = $now + $this->lockExpiry;
+                               // We will update this record if none of the other locks conflict
+                               $lockRecords[$locksKey] = $locksHeld;
+                       }
+               }
+
+               // If there were no lock conflicts, update all the lock records...
+               if ( $status->isOK() ) {
+                       foreach ( $lockRecords as $locksKey => $locksHeld ) {
+                               $memc->set( $locksKey, $locksHeld );
+                               wfDebug( __METHOD__ . ": acquired lock on key $locksKey.\n" );
+                       }
+               }
+
+               // Unlock all of the active lock record keys...
+               $this->releaseMutexes( $memc, $keys );
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::freeLocksOnServer()
+        * @return Status
+        */
+       protected function freeLocksOnServer( $lockSrv, array $paths, $type ) {
+               $status = Status::newGood();
+
+               $memc = $this->getCache( $lockSrv );
+               $keys = array_map( array( $this, 'recordKeyForPath' ), $paths ); // lock records
+
+               // Lock all of the active lock record keys...
+               if ( !$this->acquireMutexes( $memc, $keys ) ) {
+                       foreach ( $paths as $path ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       return;
+               }
+
+               // Fetch all the existing lock records...
+               $lockRecords = $memc->getMulti( $keys );
+
+               // Remove the requested locks from all records...
+               foreach ( $paths as $path ) {
+                       $locksKey = $this->recordKeyForPath( $path ); // lock record
+                       if ( !isset( $lockRecords[$locksKey] ) ) {
+                               continue; // nothing to do
+                       }
+                       $locksHeld = $lockRecords[$locksKey];
+                       if ( is_array( $locksHeld ) && isset( $locksHeld[$type] ) ) {
+                               unset( $locksHeld[$type][$this->session] );
+                               $ok = $memc->set( $locksKey, $locksHeld );
+                       } else {
+                               $ok = true;
+                       }
+                       if ( !$ok ) {
+                               $status->fatal( 'lockmanager-fail-releaselock', $path );
+                       }
+                       wfDebug( __METHOD__ . ": released lock on key $locksKey.\n" );
+               }
+
+               // Unlock all of the active lock record keys...
+               $this->releaseMutexes( $memc, $keys );
+
+               return $status;
+       }
+
+       /**
+        * @see QuorumLockManager::releaseAllLocks()
+        * @return Status
+        */
+       protected function releaseAllLocks() {
+               return Status::newGood(); // not supported
+       }
+
+       /**
+        * @see QuorumLockManager::isServerUp()
+        * @return bool
+        */
+       protected function isServerUp( $lockSrv ) {
+               return (bool)$this->getCache( $lockSrv );
+       }
+
+       /**
+        * Get the MemcachedBagOStuff object for a $lockSrv
+        *
+        * @param $lockSrv string Server name
+        * @return MemcachedBagOStuff|null
+        */
+       protected function getCache( $lockSrv ) {
+               $memc = null;
+               if ( isset( $this->bagOStuffs[$lockSrv] ) ) {
+                       $memc = $this->bagOStuffs[$lockSrv];
+                       if ( !isset( $this->serversUp[$lockSrv] ) ) {
+                               $this->serversUp[$lockSrv] = $memc->set( 'MemcLockManager:ping', 1, 1 );
+                               if ( !$this->serversUp[$lockSrv] ) {
+                                       trigger_error( __METHOD__ . ": Could not contact $lockSrv.", E_USER_WARNING );
+                               }
+                       }
+                       if ( !$this->serversUp[$lockSrv] ) {
+                               return null; // server appears to be down
+                       }
+               }
+               return $memc;
+       }
+
+       /**
+        * @param $path string
+        * @return string
+        */
+       protected function recordKeyForPath( $path ) {
+               $hash = LockManager::sha1Base36( $path );
+               list( $db, $prefix ) = wfSplitWikiID( $this->wikiId );
+               return wfForeignMemcKey( $db, $prefix, __CLASS__, 'locks', $hash );
+       }
+
+       /**
+        * @param $memc MemcachedBagOStuff
+        * @param $keys Array List of keys to acquire
+        * @return bool
+        */
+       protected function acquireMutexes( MemcachedBagOStuff $memc, array $keys ) {
+               $lockedKeys = array();
+
+               $start = microtime( true );
+               do {
+                       foreach ( array_diff( $keys, $lockedKeys ) as $key ) {
+                               if ( $memc->add( "$key:mutex", 1, 180 ) ) { // lock record
+                                       $lockedKeys[] = $key;
+                               }
+                       }
+               } while ( count( $lockedKeys ) < count( $keys ) && ( microtime( true ) - $start ) <= 6 );
+
+               if ( count( $lockedKeys ) != count( $keys ) ) {
+                       $this->releaseMutexes( $lockedKeys ); // failed; release what was locked
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * @param $memc MemcachedBagOStuff
+        * @param $keys Array List of acquired keys
+        * @return void
+        */
+       protected function releaseMutexes( MemcachedBagOStuff $memc, array $keys ) {
+               foreach ( $keys as $key ) {
+                       $memc->delete( "$key:mutex" );
+               }
+       }
+
+       /**
+        * Make sure remaining locks get cleared for sanity
+        */
+       function __destruct() {
+               while ( count( $this->locksHeld ) ) {
+                       foreach ( $this->locksHeld as $path => $locks ) {
+                               $this->doUnlock( array( $path ), self::LOCK_EX );
+                               $this->doUnlock( array( $path ), self::LOCK_SH );
+                       }
+               }
+       }
+}
index 9b0844b..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
@@ -143,7 +158,7 @@ class ArchivedFile {
                                array( 'ORDER BY' => 'fa_timestamp DESC' ) );
                        if ( $res == false || $dbr->numRows( $res ) == 0 ) {
                        // this revision does not exist?
-                               return;
+                               return null;
                        }
                        $ret = $dbr->resultObject( $res );
                        $row = $ret->fetchObject();
index ce69a03..065679a 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
  */
@@ -48,6 +63,11 @@ abstract class File {
 
        const DELETE_SOURCE = 1;
 
+       // Audience options for File::getDescription()
+       const FOR_PUBLIC = 1;
+       const FOR_THIS_USER = 2;
+       const RAW = 3;
+
        /**
         * Some member variables can be lazy-initialised using __get(). The
         * initialisation function for these variables is always a function named
@@ -94,6 +114,8 @@ abstract class File {
         */
        protected $url, $extension, $name, $path, $hashPath, $pageCount, $transformScript;
 
+       protected $redirectTitle;
+
        /**
         * @var bool
         */
@@ -128,6 +150,7 @@ abstract class File {
         *
         * @param $title Title|string
         * @param $exception string|bool Use 'exception' to throw an error on bad titles
+        * @throws MWException
         * @return Title|null
         */
        static function normalizeTitle( $title, $exception = false ) {
@@ -842,6 +865,13 @@ abstract class File {
                                }
                        }
 
+                       // If the backend is ready-only, don't keep generating thumbnails
+                       // only to return transformation errors, just return the error now.
+                       if ( $this->repo->getReadOnlyReason() !== false ) {
+                               $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
+                               break;
+                       }
+
                        // Create a temp FS file with the same extension and the thumbnail
                        $thumbExt = FileBackend::extensionFromPath( $thumbPath );
                        $tmpFile = TempFSFile::factory( 'transform_', $thumbExt );
@@ -864,19 +894,15 @@ abstract class File {
                                        $thumb = $this->handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $params );
                                }
                        } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
-                               $backend = $this->repo->getBackend();
-                               // Copy the thumbnail from the file system into storage. This avoids using
-                               // FileRepo::store(); getThumbPath() uses a different zone in some subclasses.
-                               $backend->prepare( array( 'dir' => dirname( $thumbPath ) ) );
-                               $status = $backend->store(
-                                       array( 'src' => $tmpThumbPath, 'dst' => $thumbPath, 'overwrite' => 1 ),
-                                       array( 'force' => 1, 'nonLocking' => 1, 'allowStale' => 1 )
-                               );
+                               // Copy the thumbnail from the file system into storage...
+                               $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath );
                                if ( $status->isOK() ) {
                                        $thumb->setStoragePath( $thumbPath );
                                } else {
                                        $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
                                }
+                               // Give extensions a chance to do something with this thumbnail...
+                               wfRunHooks( 'FileTransformed', array( $this, $thumb, $tmpThumbPath, $thumbPath ) );
                        }
 
                        // Purge. Useful in the event of Core -> Squid connection failure or squid
@@ -999,7 +1025,7 @@ abstract class File {
         *
         * @return array
         */
-       function getHistory($limit = null, $start = null, $end = null, $inc=true) {
+       function getHistory( $limit = null, $start = null, $end = null, $inc=true ) {
                return array();
        }
 
@@ -1544,12 +1570,18 @@ abstract class File {
        }
 
        /**
-        * Get discription of file revision
+        * Get description of file revision
         * STUB
         *
+        * @param $audience Integer: one of:
+        *      File::FOR_PUBLIC       to be displayed to all users
+        *      File::FOR_THIS_USER    to be displayed to the given user
+        *      File::RAW              get the description regardless of permissions
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
         * @return string
         */
-       function getDescription() {
+       function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) {
                return null;
        }
 
index 16828fa..5648261 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
  */
@@ -39,9 +54,9 @@ class ForeignAPIFile extends File {
         */
        static function newFromTitle( Title $title, $repo ) {
                $data = $repo->fetchImageQuery( array(
-                       'titles' => 'File:' . $title->getDBKey(),
-                       'iiprop' => self::getProps(),
-                       'prop'   => 'imageinfo',
+                       'titles'            => 'File:' . $title->getDBKey(),
+                       'iiprop'            => self::getProps(),
+                       'prop'              => 'imageinfo',
                        'iimetadataversion' => MediaHandler::getMetadataVersion()
                ) );
 
@@ -75,14 +90,26 @@ class ForeignAPIFile extends File {
        }
 
        // Dummy functions...
+
+       /**
+        * @return bool
+        */
        public function exists() {
                return $this->mExists;
        }
 
+       /**
+        * @return bool
+        */
        public function getPath() {
                return false;
        }
 
+       /**
+        * @param Array $params
+        * @param int $flags
+        * @return bool|MediaTransformOutput
+        */
        function transform( $params, $flags = 0 ) {
                if( !$this->canRender() ) {
                        // show icon
@@ -102,6 +129,11 @@ class ForeignAPIFile extends File {
        }
 
        // Info we can get from API...
+
+       /**
+        * @param $page int
+        * @return int|number
+        */
        public function getWidth( $page = 1 ) {
                return isset( $this->mInfo['width'] ) ? intval( $this->mInfo['width'] ) : 0;
        }
@@ -114,6 +146,9 @@ class ForeignAPIFile extends File {
                return isset( $this->mInfo['height'] ) ? intval( $this->mInfo['height'] ) : 0;
        }
 
+       /**
+        * @return bool|null|string
+        */
        public function getMetadata() {
                if ( isset( $this->mInfo['metadata'] ) ) {
                        return serialize( self::parseMetadata( $this->mInfo['metadata'] ) );
@@ -121,6 +156,10 @@ class ForeignAPIFile extends File {
                return null;
        }
 
+       /**
+        * @param $metadata array
+        * @return array
+        */
        public static function parseMetadata( $metadata ) {
                if( !is_array( $metadata ) ) {
                        return $metadata;
@@ -132,28 +171,47 @@ class ForeignAPIFile extends File {
                return $ret;
        }
 
+       /**
+        * @return bool|int|null
+        */
        public function getSize() {
                return isset( $this->mInfo['size'] ) ? intval( $this->mInfo['size'] ) : null;
        }
 
+       /**
+        * @return null|string
+        */
        public function getUrl() {
                return isset( $this->mInfo['url'] ) ? strval( $this->mInfo['url'] ) : null;
        }
 
+       /**
+        * @param string $method
+        * @return int|null|string
+        */
        public function getUser( $method='text' ) {
                return isset( $this->mInfo['user'] ) ? strval( $this->mInfo['user'] ) : null;
        }
 
-       public function getDescription() {
+       /**
+        * @return null|string
+        */
+       public function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) {
                return isset( $this->mInfo['comment'] ) ? strval( $this->mInfo['comment'] ) : null;
        }
 
+       /**
+        * @return null|String
+        */
        function getSha1() {
                return isset( $this->mInfo['sha1'] )
                        ? wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
                        : null;
        }
 
+       /**
+        * @return bool|Mixed|string
+        */
        function getTimestamp() {
                return wfTimestamp( TS_MW,
                        isset( $this->mInfo['timestamp'] )
@@ -162,6 +220,9 @@ class ForeignAPIFile extends File {
                );
        }
 
+       /**
+        * @return string
+        */
        function getMimeType() {
                if( !isset( $this->mInfo['mime'] ) ) {
                        $magic = MimeMagic::singleton();
@@ -170,12 +231,18 @@ class ForeignAPIFile extends File {
                return $this->mInfo['mime'];
        }
 
-       /// @todo FIXME: May guess wrong on file types that can be eg audio or video
+       /**
+        * @todo FIXME: May guess wrong on file types that can be eg audio or video
+        * @return int|string
+        */
        function getMediaType() {
                $magic = MimeMagic::singleton();
                return $magic->getMediaType( null, $this->getMimeType() );
        }
 
+       /**
+        * @return bool|string
+        */
        function getDescriptionUrl() {
                return isset( $this->mInfo['descriptionurl'] )
                        ? $this->mInfo['descriptionurl']
@@ -184,6 +251,7 @@ class ForeignAPIFile extends File {
 
        /**
         * Only useful if we're locally caching thumbs anyway...
+        * @param $suffix string
         * @return null|string
         */
        function getThumbPath( $suffix = '' ) {
@@ -198,6 +266,9 @@ class ForeignAPIFile extends File {
                }
        }
 
+       /**
+        * @return array
+        */
        function getThumbnails() {
                $dir = $this->getThumbPath( $this->getName() );
                $iter = $this->repo->getBackend()->getFileList( array( 'dir' => $dir ) );
@@ -227,6 +298,9 @@ class ForeignAPIFile extends File {
                $wgMemc->delete( $key );
        }
 
+       /**
+        * @param $options array
+        */
        function purgeThumbnails( $options = array() ) {
                global $wgMemc;
 
@@ -247,8 +321,8 @@ class ForeignAPIFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->quickCleanDir( $dir );
        }
 }
index 191a712..91f6cb6 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
@@ -39,23 +54,52 @@ class ForeignDBFile extends LocalFile {
                return $file;
        }
 
+       /**
+        * @param $srcPath String
+        * @param $flags int
+        * @throws MWException
+        */
        function publish( $srcPath, $flags = 0 ) {
                $this->readOnlyError();
        }
 
+       /**
+        * @param $oldver
+        * @param $desc string
+        * @param $license string
+        * @param $copyStatus string
+        * @param $source string
+        * @param $watch bool
+        * @param $timestamp bool|string
+        * @throws MWException
+        */
        function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
                $watch = false, $timestamp = false ) {
                $this->readOnlyError();
        }
 
+       /**
+        * @param $versions array
+        * @param $unsuppress bool
+        * @throws MWException
+        */
        function restore( $versions = array(), $unsuppress = false ) {
                $this->readOnlyError();
        }
 
+       /**
+        * @param $reason string
+        * @param $suppress bool
+        * @throws MWException
+        */
        function delete( $reason, $suppress = false ) {
                $this->readOnlyError();
        }
 
+       /**
+        * @param $target Title
+        * @throws MWException
+        */
        function move( $target ) {
                $this->readOnlyError();
        }
index 04d7a47..67768c4 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
@@ -248,6 +263,10 @@ class LocalFile extends File {
                $this->setProps( $props );
        }
 
+       /**
+        * @param $prefix string
+        * @return array
+        */
        function getCacheFields( $prefix = 'img_' ) {
                static $fields = array( 'size', 'width', 'height', 'bits', 'media_type',
                        'major_mime', 'minor_mime', 'metadata', 'timestamp', 'sha1', 'user', 'user_text', 'description' );
@@ -296,6 +315,9 @@ class LocalFile extends File {
        /**
         * Decode a row from the database (either object or array) to an array
         * with timestamps and MIME types decoded, and the field prefix removed.
+        * @param $row
+        * @param $prefix string
+        * @throws MWException
         * @return array
         */
        function decodeRow( $row, $prefix = 'img_' ) {
@@ -418,6 +440,7 @@ class LocalFile extends File {
 
                $dbw->update( 'image',
                        array(
+                               'img_size'       => $this->size, // sanity
                                'img_width'      => $this->width,
                                'img_height'     => $this->height,
                                'img_bits'       => $this->bits,
@@ -473,6 +496,9 @@ class LocalFile extends File {
        /** getPath inherited */
        /** isVisible inhereted */
 
+       /**
+        * @return bool
+        */
        function isMissing() {
                if ( $this->missing === null ) {
                        list( $fileExists ) = $this->repo->fileExists( $this->getVirtualUrl() );
@@ -484,8 +510,8 @@ class LocalFile extends File {
        /**
         * Return the width of the image
         *
-        * Returns false on error
-        * @return bool
+        * @param $page int
+        * @return bool|int Returns false on error
         */
        public function getWidth( $page = 1 ) {
                $this->load();
@@ -505,8 +531,8 @@ class LocalFile extends File {
        /**
         * Return the height of the image
         *
-        * Returns false on error
-        * @return bool
+        * @param $page int
+        * @return bool|int Returns false on error
         */
        public function getHeight( $page = 1 ) {
                $this->load();
@@ -527,6 +553,7 @@ class LocalFile extends File {
         * Returns ID or name of user who uploaded the file
         *
         * @param $type string 'text' or 'id'
+        * @return int|string
         */
        function getUser( $type = 'text' ) {
                $this->load();
@@ -547,6 +574,9 @@ class LocalFile extends File {
                return $this->metadata;
        }
 
+       /**
+        * @return int
+        */
        function getBitDepth() {
                $this->load();
                return $this->bits;
@@ -554,6 +584,7 @@ class LocalFile extends File {
 
        /**
         * Return the size of the image file, in bytes
+        * @return int
         */
        public function getSize() {
                $this->load();
@@ -562,6 +593,7 @@ class LocalFile extends File {
 
        /**
         * Returns the mime type of the file.
+        * @return string
         */
        function getMimeType() {
                $this->load();
@@ -571,6 +603,7 @@ class LocalFile extends File {
        /**
         * Return the type of the media in the file.
         * Use the value returned by this function with the MEDIATYPE_xxx constants.
+        * @return string
         */
        function getMediaType() {
                $this->load();
@@ -600,6 +633,9 @@ class LocalFile extends File {
 
        /**
         * Fix thumbnail files from 1.4 or before, with extreme prejudice
+        * @TODO: do we still care about this? Perhaps a maintenance script
+        *        can be made instead. Enabling this code results in a serious
+        *        RTT regression for wikis without 404 handling.
         */
        function migrateThumbFile( $thumbName ) {
                $thumbDir = $this->getThumbPath();
@@ -622,10 +658,12 @@ class LocalFile extends File {
                }
                */
 
+               /*
                if ( $this->repo->fileExists( $thumbDir ) ) {
                        // Delete file where directory should be
                        $this->repo->cleanupBatch( array( $thumbDir ) );
                }
+               */
        }
 
        /** getHandler inherited */
@@ -638,8 +676,6 @@ class LocalFile extends File {
         * @return array first element is the base dir, then files in that base dir.
         */
        function getThumbnails( $archiveName = false ) {
-               $this->load();
-
                if ( $archiveName ) {
                        $dir = $this->getArchiveThumbPath( $archiveName );
                } else {
@@ -704,6 +740,8 @@ class LocalFile extends File {
         */
        function purgeOldThumbnails( $archiveName ) {
                global $wgUseSquid;
+               wfProfileIn( __METHOD__ );
+
                // Get a list of old thumbnails and URLs
                $files = $this->getThumbnails( $archiveName );
                $dir = array_shift( $files );
@@ -720,6 +758,8 @@ class LocalFile extends File {
                        }
                        SquidUpdate::purge( $urls );
                }
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -727,6 +767,7 @@ class LocalFile extends File {
         */
        function purgeThumbnails( $options = array() ) {
                global $wgUseSquid;
+               wfProfileIn( __METHOD__ );
 
                // Delete thumbnails
                $files = $this->getThumbnails();
@@ -753,6 +794,8 @@ class LocalFile extends File {
                        }
                        SquidUpdate::purge( $urls );
                }
+
+               wfProfileOut( __METHOD__ );
        }
 
        /**
@@ -777,14 +820,21 @@ class LocalFile extends File {
                }
 
                # Delete the thumbnails
-               $this->repo->cleanupBatch( $purgeList, FileRepo::SKIP_LOCKING );
+               $this->repo->quickPurgeBatch( $purgeList );
                # Clear out the thumbnail directory if empty
-               $this->repo->getBackend()->clean( array( 'dir' => $dir ) );
+               $this->repo->quickCleanDir( $dir );
        }
 
        /** purgeDescription inherited */
        /** purgeEverything inherited */
 
+       /**
+        * @param $limit null
+        * @param $start null
+        * @param $end null
+        * @param $inc bool
+        * @return array
+        */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
                $dbr = $this->repo->getSlaveDB();
                $tables = array( 'oldimage' );
@@ -903,12 +953,12 @@ class LocalFile extends File {
         * @param $comment String: upload description
         * @param $pageText String: text to use for the new description page,
         *                  if a new description page is created
-        * @param $flags Integer: flags for publish()
-        * @param $props Array: File properties, if known. This can be used to reduce the
+        * @param $flags Integer|bool: flags for publish()
+        * @param $props Array|bool: File properties, if known. This can be used to reduce the
         *               upload time when uploading virtual URLs for which the file info
         *               is already known
-        * @param $timestamp String: timestamp for img_timestamp, or false to use the current time
-        * @param $user Mixed: User object or null to use $wgUser
+        * @param $timestamp String|bool: timestamp for img_timestamp, or false to use the current time
+        * @param $user User|null: User object or null to use $wgUser
         *
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
@@ -942,6 +992,13 @@ class LocalFile extends File {
 
        /**
         * Record a file upload in the upload log and the image table
+        * @param $oldver
+        * @param $desc string
+        * @param $license string
+        * @param $copyStatus string
+        * @param $source string
+        * @param $watch bool
+        * @param $timestamp string|bool
         * @return bool
         */
        function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
@@ -962,11 +1019,19 @@ class LocalFile extends File {
 
        /**
         * Record a file upload in the upload log and the image table
+        * @param $oldver
+        * @param $comment string
+        * @param $pageText string
+        * @param $props bool|array
+        * @param $timestamp bool|string
+        * @param $user null|User
         * @return bool
         */
        function recordUpload2(
                $oldver, $comment, $pageText, $props = false, $timestamp = false, $user = null
        ) {
+               wfProfileIn( __METHOD__ );
+
                if ( is_null( $user ) ) {
                        global $wgUser;
                        $user = $wgUser;
@@ -976,7 +1041,9 @@ class LocalFile extends File {
                $dbw->begin( __METHOD__ );
 
                if ( !$props ) {
+                       wfProfileIn( __METHOD__ . '-getProps' );
                        $props = $this->repo->getFileProps( $this->getVirtualUrl() );
+                       wfProfileOut( __METHOD__ . -'getProps' );
                }
 
                if ( $timestamp === false ) {
@@ -989,15 +1056,10 @@ class LocalFile extends File {
                $props['timestamp'] = wfTimestamp( TS_MW, $timestamp ); // DB -> TS_MW
                $this->setProps( $props );
 
-               # Delete thumbnails
-               $this->purgeThumbnails();
-
-               # The file is already on its final location, remove it from the squid cache
-               SquidUpdate::purge( array( $this->getURL() ) );
-
                # Fail now if the file isn't there
                if ( !$this->fileExists ) {
                        wfDebug( __METHOD__ . ": File " . $this->getRel() . " went missing!\n" );
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -1026,7 +1088,6 @@ class LocalFile extends File {
                        __METHOD__,
                        'IGNORE'
                );
-
                if ( $dbw->affectedRows() == 0 ) {
                        # (bug 34993) Note: $oldver can be empty here, if the previous
                        # version of the file was broken. Allow registration of the new
@@ -1079,16 +1140,8 @@ class LocalFile extends File {
                                __METHOD__
                        );
                } else {
-                       # This is a new file
-                       # Update the image count
-                       $dbw->begin( __METHOD__ );
-                       $dbw->update(
-                               'site_stats',
-                               array( 'ss_images = ss_images+1' ),
-                               '*',
-                               __METHOD__
-                       );
-                       $dbw->commit( __METHOD__ );
+                       # This is a new file, so update the image count
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
                }
 
                $descTitle = $this->getTitle();
@@ -1100,6 +1153,7 @@ class LocalFile extends File {
                $action = $reupload ? 'overwrite' : 'upload';
                $log->addEntry( $action, $descTitle, $comment, array(), $user );
 
+               wfProfileIn( __METHOD__ . '-edit' );
                if ( $descTitle->exists() ) {
                        # Create a null revision
                        $latest = $descTitle->getLatestRevID();
@@ -1124,6 +1178,7 @@ class LocalFile extends File {
                        # Squid and file cache for the description page are purged by doEdit.
                        $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
                }
+               wfProfileOut( __METHOD__ . '-edit' );
 
                # Commit the transaction now, in case something goes wrong later
                # The most important thing is that files don't get lost, especially archives
@@ -1135,8 +1190,20 @@ class LocalFile extends File {
                # which in fact doesn't really exist (bug 24978)
                $this->saveToCache();
 
+               if ( $reupload ) {
+                       # Delete old thumbnails
+                       wfProfileIn( __METHOD__ . '-purge' );
+                       $this->purgeThumbnails();
+                       wfProfileOut( __METHOD__ . '-purge' );
+
+                       # Remove the old file from the squid cache
+                       SquidUpdate::purge( array( $this->getURL() ) );
+               }
+
                # Hooks, hooks, the magic of hooks...
+               wfProfileIn( __METHOD__ . '-hooks' );
                wfRunHooks( 'FileUpload', array( $this, $reupload, $descTitle->exists() ) );
+               wfProfileOut( __METHOD__ . '-hooks' );
 
                # Invalidate cache for all pages using this file
                $update = new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' );
@@ -1150,6 +1217,7 @@ class LocalFile extends File {
                        $update->doUpdate();
                }
 
+               wfProfileOut( __METHOD__ );
                return true;
        }
 
@@ -1231,19 +1299,21 @@ class LocalFile extends File {
                }
 
                wfDebugLog( 'imagemove', "Got request to move {$this->name} to " . $target->getText() );
-               $this->lock(); // begin
-
                $batch = new LocalFileMoveBatch( $this, $target );
-               $batch->addCurrent();
-               $batch->addOlds();
 
+               $this->lock(); // begin
+               $batch->addCurrent();
+               $archiveNames = $batch->addOlds();
                $status = $batch->execute();
+               $this->unlock(); // done
+
                wfDebugLog( 'imagemove', "Finished moving {$this->name}" );
 
                $this->purgeEverything();
-               $this->unlock(); // done
-
-               if ( $status->isOk() ) {
+               foreach ( $archiveNames as $archiveName ) {
+                       $this->purgeOldThumbnails( $archiveName );
+               }
+               if ( $status->isOK() ) {
                        // Now switch the object
                        $this->title = $target;
                        // Force regeneration of the name and hashpath
@@ -1273,30 +1343,23 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
                $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
-               $batch->addCurrent();
 
+               $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 = $batch->addOlds();
                $status = $batch->execute();
+               $this->unlock(); // done
 
                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();
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => -1 ) ) );
                }
 
-               $this->unlock(); // done
+               $this->purgeEverything();
+               foreach ( $archiveNames as $archiveName ) {
+                       $this->purgeOldThumbnails( $archiveName );
+               }
 
                return $status;
        }
@@ -1320,15 +1383,14 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
-               $this->lock(); // begin
-
                $batch = new LocalFileDeleteBatch( $this, $reason, $suppress );
+
+               $this->lock(); // begin
                $batch->addOld( $archiveName );
-               $this->purgeOldThumbnails( $archiveName );
                $status = $batch->execute();
-
                $this->unlock(); // done
 
+               $this->purgeOldThumbnails( $archiveName );
                if ( $status->isOK() ) {
                        $this->purgeDescription();
                        $this->purgeHistory();
@@ -1353,25 +1415,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;
@@ -1398,7 +1456,7 @@ class LocalFile extends File {
         */
        function getDescriptionText() {
                global $wgParser;
-               $revision = Revision::newFromTitle( $this->title );
+               $revision = Revision::newFromTitle( $this->title, false, Revision::AVOID_MASTER );
                if ( !$revision ) return false;
                $text = $revision->getText();
                if ( !$text ) return false;
@@ -1406,16 +1464,33 @@ class LocalFile extends File {
                return $pout->getText();
        }
 
-       function getDescription() {
+       /**
+        * @return string
+        */
+       function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) {
                $this->load();
-               return $this->description;
+               if ( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_COMMENT ) ) {
+                       return '';
+               } elseif ( $audience == self::FOR_THIS_USER
+                       && !$this->userCan( self::DELETED_COMMENT, $user ) )
+               {
+                       return '';
+               } else {
+                       return $this->description;
+               }
        }
 
+       /**
+        * @return bool|string
+        */
        function getTimestamp() {
                $this->load();
                return $this->timestamp;
        }
 
+       /**
+        * @return string
+        */
        function getSha1() {
                $this->load();
                // Initialise now if necessary
@@ -1438,6 +1513,9 @@ class LocalFile extends File {
                return $this->sha1;
        }
 
+       /**
+        * @return bool
+        */
        function isCacheable() {
                $this->load();
                return strlen( $this->metadata ) <= self::CACHE_FIELD_MAX_LEN; // avoid OOMs
@@ -1508,6 +1586,11 @@ class LocalFileDeleteBatch {
        var $reason, $srcRels = array(), $archiveUrls = array(), $deletionBatch, $suppress;
        var $status;
 
+       /**
+        * @param $file File
+        * @param $reason string
+        * @param $suppress bool
+        */
        function __construct( File $file, $reason = '', $suppress = false ) {
                $this->file = $file;
                $this->reason = $reason;
@@ -1519,11 +1602,39 @@ class LocalFileDeleteBatch {
                $this->srcRels['.'] = $this->file->getRel();
        }
 
+       /**
+        * @param $oldName string
+        */
        function addOld( $oldName ) {
                $this->srcRels[$oldName] = $this->file->getArchiveRel( $oldName );
                $this->archiveUrls[] = $this->file->getArchiveUrl( $oldName );
        }
 
+       /**
+        * Add the old versions of the image to the batch
+        * @return Array List of archive names from old versions
+        */
+       function addOlds() {
+               $archiveNames = array();
+
+               $dbw = $this->file->repo->getMasterDB();
+               $result = $dbw->select( 'oldimage',
+                       array( 'oi_archive_name' ),
+                       array( 'oi_name' => $this->file->getName() ),
+                       __METHOD__
+               );
+
+               foreach ( $result as $row ) {
+                       $this->addOld( $row->oi_archive_name );
+                       $archiveNames[] = $row->oi_archive_name;
+               }
+
+               return $archiveNames;
+       }
+
+       /**
+        * @return array
+        */
        function getOldRels() {
                if ( !isset( $this->srcRels['.'] ) ) {
                        $oldRels =& $this->srcRels;
@@ -1537,6 +1648,9 @@ class LocalFileDeleteBatch {
                return array( $oldRels, $deleteCurrent );
        }
 
+       /**
+        * @return array
+        */
        protected function getHashes() {
                $hashes = array();
                list( $oldRels, $deleteCurrent ) = $this->getOldRels();
@@ -1700,7 +1814,6 @@ class LocalFileDeleteBatch {
         * @return FileRepoStatus
         */
        function execute() {
-               global $wgUseSquid;
                wfProfileIn( __METHOD__ );
 
                $this->file->lock();
@@ -1765,17 +1878,6 @@ class LocalFileDeleteBatch {
                        return $this->status;
                }
 
-               // Purge squid
-               if ( $wgUseSquid ) {
-                       $urls = array();
-
-                       foreach ( $this->srcRels as $srcRel ) {
-                               $urlRel = str_replace( '%2F', '/', rawurlencode( $srcRel ) );
-                               $urls[] = $this->file->repo->getZoneUrl( 'public' ) . '/' . $urlRel;
-                       }
-                       SquidUpdate::purge( $urls );
-               }
-
                // Delete image/oldimage rows
                $this->doDBDeletes();
 
@@ -1788,6 +1890,7 @@ class LocalFileDeleteBatch {
 
        /**
         * Removes non-existent files from a deletion batch.
+        * @param $batch array
         * @return array
         */
        function removeNonexistentFiles( $batch ) {
@@ -1824,6 +1927,10 @@ class LocalFileRestoreBatch {
 
        var $cleanupBatch, $ids, $all, $unsuppress = false;
 
+       /**
+        * @param $file File
+        * @param $unsuppress bool
+        */
        function __construct( File $file, $unsuppress = false ) {
                $this->file = $file;
                $this->cleanupBatch = $this->ids = array();
@@ -2062,9 +2169,7 @@ class LocalFileRestoreBatch {
                        if ( !$exists ) {
                                wfDebug( __METHOD__ . " restored {$status->successCount} items, creating a new current\n" );
 
-                               // Update site_stats
-                               $site_stats = $dbw->tableName( 'site_stats' );
-                               $dbw->query( "UPDATE $site_stats SET ss_images=ss_images+1", __METHOD__ );
+                               DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
 
                                $this->file->purgeEverything();
                        } else {
@@ -2081,12 +2186,14 @@ class LocalFileRestoreBatch {
 
        /**
         * Removes non-existent files from a store batch.
+        * @param $triplets array
         * @return array
         */
        function removeNonexistentFiles( $triplets ) {
                $files = $filteredTriplets = array();
-               foreach ( $triplets as $file )
+               foreach ( $triplets as $file ) {
                        $files[$file[0]] = $file[0];
+               }
 
                $result = $this->file->repo->fileExistsBatch( $files );
 
@@ -2101,6 +2208,7 @@ class LocalFileRestoreBatch {
 
        /**
         * Removes non-existent files from a cleanup batch.
+        * @param $batch array
         * @return array
         */
        function removeNonexistentFromCleanup( $batch ) {
@@ -2171,7 +2279,7 @@ class LocalFileRestoreBatch {
 class LocalFileMoveBatch {
 
        /**
-        * @var File
+        * @var LocalFile
         */
        var $file;
 
@@ -2180,8 +2288,17 @@ class LocalFileMoveBatch {
         */
        var $target;
 
-       var $cur, $olds, $oldCount, $archive, $db;
+       var $cur, $olds, $oldCount, $archive;
+
+       /**
+        * @var DatabaseBase
+        */
+       var $db;
 
+       /**
+        * @param File $file
+        * @param Title $target
+        */
        function __construct( File $file, Title $target ) {
                $this->file = $file;
                $this->target = $target;
@@ -2191,7 +2308,7 @@ class LocalFileMoveBatch {
                $this->newName = $this->file->repo->getNameFromTitle( $this->target );
                $this->oldRel = $this->oldHash . $this->oldName;
                $this->newRel = $this->newHash . $this->newName;
-               $this->db = $file->repo->getMasterDb();
+               $this->db = $file->getRepo()->getMasterDb();
        }
 
        /**
@@ -2203,11 +2320,13 @@ class LocalFileMoveBatch {
 
        /**
         * Add the old versions of the image to the batch
+        * @return Array List of archive names from old versions
         */
        function addOlds() {
                $archiveBase = 'archive';
                $this->olds = array();
                $this->oldCount = 0;
+               $archiveNames = array();
 
                $result = $this->db->select( 'oldimage',
                        array( 'oi_archive_name', 'oi_deleted' ),
@@ -2216,6 +2335,7 @@ class LocalFileMoveBatch {
                );
 
                foreach ( $result as $row ) {
+                       $archiveNames[] = $row->oi_archive_name;
                        $oldName = $row->oi_archive_name;
                        $bits = explode( '!', $oldName, 2 );
 
@@ -2243,6 +2363,8 @@ class LocalFileMoveBatch {
                                "{$archiveBase}/{$this->newHash}{$timestamp}!{$this->newName}"
                        );
                }
+
+               return $archiveNames;
        }
 
        /**
@@ -2252,31 +2374,38 @@ class LocalFileMoveBatch {
        function execute() {
                $repo = $this->file->repo;
                $status = $repo->newGood();
-               $triplets = $this->getMoveTriplets();
 
+               $triplets = $this->getMoveTriplets();
                $triplets = $this->removeNonexistentFiles( $triplets );
 
-               // Copy the files into their new location
-               $statusMove = $repo->storeBatch( $triplets );
+               $this->file->lock(); // begin
+               // Rename the file versions metadata in the DB.
+               // This implicitly locks the destination file, which avoids race conditions.
+               // If we moved the files from A -> C before DB updates, another process could
+               // move files from B -> C at this point, causing storeBatch() to fail and thus
+               // cleanupTarget() to trigger. It would delete the C files and cause data loss.
+               $statusDb = $this->doDBUpdates();
+               if ( !$statusDb->isGood() ) {
+                       $this->file->unlockAndRollback();
+                       $statusDb->ok = false;
+                       return $statusDb;
+               }
+               wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
+
+               // Copy the files into their new location.
+               // If a prior process fataled copying or cleaning up files we tolerate any
+               // of the existing files if they are identical to the ones being stored.
+               $statusMove = $repo->storeBatch( $triplets, FileRepo::OVERWRITE_SAME );
                wfDebugLog( 'imagemove', "Moved files for {$this->file->getName()}: {$statusMove->successCount} successes, {$statusMove->failCount} failures" );
                if ( !$statusMove->isGood() ) {
-                       wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
+                       // Delete any files copied over (while the destination is still locked)
                        $this->cleanupTarget( $triplets );
+                       $this->file->unlockAndRollback(); // unlocks the destination
+                       wfDebugLog( 'imagemove', "Error in moving files: " . $statusMove->getWikiText() );
                        $statusMove->ok = false;
                        return $statusMove;
                }
-
-               $this->db->begin( __METHOD__ );
-               $statusDb = $this->doDBUpdates();
-               wfDebugLog( 'imagemove', "Renamed {$this->file->getName()} in database: {$statusDb->successCount} successes, {$statusDb->failCount} failures" );
-               if ( !$statusDb->isGood() ) {
-                       $this->db->rollback( __METHOD__ );
-                       // 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 );
@@ -2319,7 +2448,8 @@ class LocalFileMoveBatch {
                        'oldimage',
                        array(
                                'oi_name' => $this->newName,
-                               'oi_archive_name = ' . $dbw->strreplace( 'oi_archive_name', $dbw->addQuotes( $this->oldName ), $dbw->addQuotes( $this->newName ) ),
+                               'oi_archive_name = ' . $dbw->strreplace( 'oi_archive_name',
+                                       $dbw->addQuotes( $this->oldName ), $dbw->addQuotes( $this->newName ) ),
                        ),
                        array( 'oi_name' => $this->oldName ),
                        __METHOD__
@@ -2328,7 +2458,10 @@ class LocalFileMoveBatch {
                $affected = $dbw->affectedRows();
                $total = $this->oldCount;
                $status->successCount += $affected;
-               $status->failCount += $total - $affected;
+               // Bug 34934: $total is based on files that actually exist.
+               // There may be more DB rows than such files, in which case $affected
+               // can be greater than $total. We use max() to avoid negatives here.
+               $status->failCount += max( 0, $total - $affected );
                if ( $status->failCount ) {
                        $status->error( 'imageinvalidfilename' );
                }
@@ -2356,6 +2489,7 @@ class LocalFileMoveBatch {
 
        /**
         * Removes non-existent files from move batch.
+        * @param $triplets array
         * @return array
         */
        function removeNonexistentFiles( $triplets ) {
@@ -2387,6 +2521,7 @@ class LocalFileMoveBatch {
                // Create dest pairs from the triplets
                $pairs = array();
                foreach ( $triplets as $triplet ) {
+                       // $triplet: (old source virtual URL, dst zone, dest rel)
                        $pairs[] = array( $triplet[1], $triplet[2] );
                }
 
index cec70d6..40d7dca 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
@@ -17,6 +32,13 @@ class OldLocalFile extends LocalFile {
        const CACHE_VERSION = 1;
        const MAX_CACHE_ROWS = 20;
 
+       /**
+        * @param $title Title
+        * @param $repo FileRepo
+        * @param $time null
+        * @return OldLocalFile
+        * @throws MWException
+        */
        static function newFromTitle( $title, $repo, $time = null ) {
                # The null default value is only here to avoid an E_STRICT
                if ( $time === null ) {
@@ -25,10 +47,21 @@ class OldLocalFile extends LocalFile {
                return new self( $title, $repo, $time, null );
        }
 
+       /**
+        * @param $title Title
+        * @param $repo FileRepo
+        * @param $archiveName
+        * @return OldLocalFile
+        */
        static function newFromArchiveName( $title, $repo, $archiveName ) {
                return new self( $title, $repo, null, $archiveName );
        }
 
+       /**
+        * @param $row
+        * @param $repo FileRepo
+        * @return OldLocalFile
+        */
        static function newFromRow( $row, $repo ) {
                $title = Title::makeTitle( NS_FILE, $row->oi_name );
                $file = new self( $title, $repo, null, $row->oi_archive_name );
@@ -61,7 +94,7 @@ class OldLocalFile extends LocalFile {
                        return false;
                }
        }
-       
+
        /**
         * Fields in the oldimage table
         * @return array
@@ -92,6 +125,7 @@ class OldLocalFile extends LocalFile {
         * @param $repo FileRepo
         * @param $time String: timestamp or null to load by archive name
         * @param $archiveName String: archive name or null to load by timestamp
+        * @throws MWException
         */
        function __construct( $title, $repo, $time, $archiveName ) {
                parent::__construct( $title, $repo );
@@ -102,10 +136,16 @@ class OldLocalFile extends LocalFile {
                }
        }
 
+       /**
+        * @return bool
+        */
        function getCacheKey() {
                return false;
        }
 
+       /**
+        * @return String
+        */
        function getArchiveName() {
                if ( !isset( $this->archive_name ) ) {
                        $this->load();
@@ -113,10 +153,16 @@ class OldLocalFile extends LocalFile {
                return $this->archive_name;
        }
 
+       /**
+        * @return bool
+        */
        function isOld() {
                return true;
        }
 
+       /**
+        * @return bool
+        */
        function isVisible() {
                return $this->exists() && !$this->isDeleted(File::DELETED_FILE);
        }
@@ -141,6 +187,10 @@ class OldLocalFile extends LocalFile {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * @param $prefix string
+        * @return array
+        */
        function getCacheFields( $prefix = 'img_' ) {
                $fields = parent::getCacheFields( $prefix );
                $fields[] = $prefix . 'archive_name';
@@ -148,10 +198,16 @@ class OldLocalFile extends LocalFile {
                return $fields;
        }
 
+       /**
+        * @return string
+        */
        function getRel() {
                return 'archive/' . $this->getHashPath() . $this->getArchiveName();
        }
 
+       /**
+        * @return string
+        */
        function getUrlRel() {
                return 'archive/' . $this->getHashPath() . rawurlencode( $this->getArchiveName() );
        }
@@ -173,14 +229,15 @@ class OldLocalFile extends LocalFile {
                wfDebug(__METHOD__.': upgrading '.$this->archive_name." to the current schema\n");
                $dbw->update( 'oldimage',
                        array(
-                               'oi_width' => $this->width,
-                               'oi_height' => $this->height,
-                               'oi_bits' => $this->bits,
+                               'oi_size'       => $this->size, // sanity
+                               'oi_width'      => $this->width,
+                               'oi_height'     => $this->height,
+                               'oi_bits'       => $this->bits,
                                'oi_media_type' => $this->media_type,
                                'oi_major_mime' => $major,
                                'oi_minor_mime' => $minor,
-                               'oi_metadata' => $this->metadata,
-                               'oi_sha1' => $this->sha1,
+                               'oi_metadata'   => $this->metadata,
+                               'oi_sha1'       => $this->sha1,
                        ), array(
                                'oi_name' => $this->getName(),
                                'oi_archive_name' => $this->archive_name ),
@@ -220,40 +277,45 @@ class OldLocalFile extends LocalFile {
                $this->load();
                return Revision::userCanBitfield( $this->deleted, $field, $user );
        }
-       
+
        /**
         * Upload a file directly into archive. Generally for Special:Import.
-        * 
+        *
         * @param $srcPath string File system path of the source file
-        * @param $archiveName string Full archive name of the file, in the form 
-        *      $timestamp!$filename, where $filename must match $this->getName()
+        * @param $archiveName string Full archive name of the file, in the form
+        *     $timestamp!$filename, where $filename must match $this->getName()
         *
+        * @param $timestamp string
+        * @param $comment string
+        * @param $user
+        * @param $flags int
         * @return FileRepoStatus
         */
        function uploadOld( $srcPath, $archiveName, $timestamp, $comment, $user, $flags = 0 ) {
                $this->lock();
-               
+
                $dstRel = 'archive/' . $this->getHashPath() . $archiveName;
                $status = $this->publishTo( $srcPath, $dstRel,
                        $flags & File::DELETE_SOURCE ? FileRepo::DELETE_SOURCE : 0
                );
-               
+
                if ( $status->isGood() ) {
                        if ( !$this->recordOldUpload( $srcPath, $archiveName, $timestamp, $comment, $user ) ) {
                                $status->fatal( 'filenotfound', $srcPath );
                        }
                }
-               
+
                $this->unlock();
-               
+
                return $status;
        }
-       
+
        /**
         * Record a file upload in the oldimage table, without adding log entries.
-        * 
+        *
         * @param $srcPath string File system path to the source file
         * @param $archiveName string The archive name of the file
+        * @param $timestamp string
         * @param $comment string Upload comment
         * @param $user User User who did this upload
         * @return bool
index 7c5eab0..8d4a3f8 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
@@ -19,7 +34,7 @@
  * @ingroup FileAbstraction
  */
 class UnregisteredLocalFile extends File {
-       var $title, $path, $mime, $dims;
+       var $title, $path, $mime, $dims, $metadata;
 
        /**
         * @var MediaHandler
@@ -47,12 +62,12 @@ class UnregisteredLocalFile extends File {
        /**
         * Create an UnregisteredLocalFile based on a path or a (title,repo) pair.
         * A FileRepo object is not required here, unlike most other File classes.
-        * 
+        *
         * @throws MWException
         * @param $title Title|bool
-        * @param $repo FileRepo
-        * @param $path string
-        * @param $mime string
+        * @param $repo FileRepo|bool
+        * @param $path string|bool
+        * @param $mime string|bool
         */
        function __construct( $title = false, $repo = false, $path = false, $mime = false ) {
                if ( !( $title && $repo ) && !$path ) {
@@ -79,6 +94,10 @@ class UnregisteredLocalFile extends File {
                $this->dims = array();
        }
 
+       /**
+        * @param $page int
+        * @return bool
+        */
        private function cachePageDimensions( $page = 1 ) {
                if ( !isset( $this->dims[$page] ) ) {
                        if ( !$this->getHandler() ) {
@@ -89,16 +108,27 @@ class UnregisteredLocalFile extends File {
                return $this->dims[$page];
        }
 
+       /**
+        * @param $page int
+        * @return number
+        */
        function getWidth( $page = 1 ) {
                $dim = $this->cachePageDimensions( $page );
                return $dim['width'];
        }
 
+       /**
+        * @param $page int
+        * @return number
+        */
        function getHeight( $page = 1 ) {
                $dim = $this->cachePageDimensions( $page );
                return $dim['height'];
        }
 
+       /**
+        * @return bool|string
+        */
        function getMimeType() {
                if ( !isset( $this->mime ) ) {
                        $magic = MimeMagic::singleton();
@@ -107,6 +137,10 @@ class UnregisteredLocalFile extends File {
                return $this->mime;
        }
 
+       /**
+        * @param $filename String
+        * @return Array|bool
+        */
        function getImageSize( $filename ) {
                if ( !$this->getHandler() ) {
                        return false;
@@ -114,6 +148,9 @@ class UnregisteredLocalFile extends File {
                return $this->handler->getImageSize( $this, $this->getLocalRefPath() );
        }
 
+       /**
+        * @return bool
+        */
        function getMetadata() {
                if ( !isset( $this->metadata ) ) {
                        if ( !$this->getHandler() ) {
@@ -125,6 +162,9 @@ class UnregisteredLocalFile extends File {
                return $this->metadata;
        }
 
+       /**
+        * @return bool|string
+        */
        function getURL() {
                if ( $this->repo ) {
                        return $this->repo->getZoneUrl( 'public' ) . '/' .
@@ -134,6 +174,9 @@ class UnregisteredLocalFile extends File {
                }
        }
 
+       /**
+        * @return bool|int
+        */
        function getSize() {
                $this->assertRepoDefined();
                $props = $this->repo->getFileProps( $this->path );
index f9afbb2..752e214 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
  */
@@ -117,7 +132,7 @@ class CliInstaller extends Installer {
         * @param $path String Full path to write LocalSettings.php to
         */
        public function writeConfigurationFile( $path ) {
-               $ls = new LocalSettingsGenerator( $this );
+               $ls = InstallerOverrides::getLocalSettingsGenerator( $this );
                $ls->writeFile( "$path/LocalSettings.php" );
        }
 
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 fee4b2a..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
  */
@@ -230,6 +245,7 @@ abstract class DatabaseUpdater {
         * @since 1.20
         *
         * @param $tableName string
+        * @return bool
         */
        public function tableExists( $tableName ) {
                return ( $this->db->tableExists( $tableName, __METHOD__ ) );
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 f9892c4..ac5b271 100644 (file)
@@ -835,7 +835,6 @@ Dit is waarskynlik te laag.
 Die installasie mag moontlik faal!",
        'config-xcache' => '[Http://trac.lighttpd.net/xcache/ XCache] is geïnstalleer',
        'config-apc' => '[Http://www.php.net/apc APC] is geïnstalleer',
-       'config-eaccel' => '[Http://eaccelerator.sourceforge.net/ eAccelerator] is geïnstalleer',
        'config-wincache' => '[Http://www.iis.net/download/WinCacheForPhp WinCache] is geïnstalleer',
        'config-diff3-bad' => 'GNU diff3 nie gevind nie.',
        'config-db-type' => 'Databasistipe:',
@@ -1110,7 +1109,7 @@ $messages['as'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Asturian (Asturianu) */
+/** Asturian (asturianu) */
 $messages['ast'] = array(
        'mainpagetext' => "'''MediaWiki instalóse correchamente.'''",
        'mainpagedocfooter' => "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuariu] pa saber cómo usar esti software wiki.
@@ -1127,7 +1126,7 @@ $messages['avk'] = array(
        'mainpagetext' => "'''MediaWiki inkeyen talpeyot.'''",
 );
 
-/** Azerbaijani (Azərbaycanca)
+/** Azerbaijani (azərbaycanca)
  * @author Cekli829
  * @author Vago
  * @author Wertuose
@@ -1211,7 +1210,7 @@ $messages['bcl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Belarusian (Ð\91еларуская) */
+/** Belarusian (беларуская) */
 $messages['be'] = array(
        'mainpagetext' => "'''MediaWiki паспяхова ўсталяваная.'''",
        'mainpagedocfooter' => 'Гл. [//meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.
@@ -1774,7 +1773,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]',
 );
 
-/** Bulgarian (Ð\91ългарски)
+/** Bulgarian (български)
  * @author DCLXVI
  */
 $messages['bg'] = array(
@@ -2424,7 +2423,7 @@ $messages['bn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]',
 );
 
-/** Bishnupria Manipuri (à¦\87মার à¦ à¦¾à¦°/বিষà§\8dণà§\81পà§\8dরিয়া à¦®à¦£à¦¿à¦ªà§\81রà§\80) */
+/** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী) */
 $messages['bpy'] = array(
        'mainpagetext' => "'''মিডিয়াউইকি হবাবালা ইয়া ইন্সটল ইল.'''",
        'mainpagedocfooter' => 'উইকি সফটৱ্যার এহান আতানির বারে দরকার ইলে [//meta.wikimedia.org/wiki/Help:Contents আতাকুরার গাইড]হানর পাঙলাক নেগা।
@@ -2436,7 +2435,7 @@ $messages['bpy'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়া উইকির ফঙপার বারে মেইলর তালিকাহান]',
 );
 
-/** Breton (Brezhoneg)
+/** Breton (brezhoneg)
  * @author Fohanno
  * @author Fulup
  * @author Gwendal
@@ -2826,7 +2825,7 @@ Gwiriit hag-eñ e c'hall an implijer « $1 » skrivañ er brastres « $2 ».",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Bosnian (Bosanski)
+/** Bosnian (bosanski)
  * @author CERminator
  */
 $messages['bs'] = array(
@@ -2882,7 +2881,6 @@ Ako se sami kompajlirali PHP, podesite ga sa omogućenim klijentom baze podataka
 Ako ste instalirali PHP iz Debian ili Ubuntu paketa, možda morate instalirati i modul php5-mysql.',
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] je instaliran',
        'config-apc' => '[http://www.php.net/apc APC] je instaliran',
-       'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] je instaliran',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je instaliran',
        'config-diff3-bad' => 'GNU diff3 nije pronađen.',
        'config-db-type' => 'Vrsta baze podataka:',
@@ -2912,7 +2910,7 @@ Ovo '''nije preporučeno''' osim ako nemate problema s vašom wiki.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista E-Mail adresa MediaWiki]',
 );
 
-/** Catalan (Català) */
+/** Catalan (català) */
 $messages['ca'] = array(
        'mainpagetext' => "'''El programari del MediaWiki s'ha instaŀlat correctament.'''",
        'mainpagedocfooter' => "Consulteu la [//meta.wikimedia.org/wiki/Help:Contents Guia d'Usuari] per a més informació sobre com utilitzar-lo.
@@ -2949,7 +2947,7 @@ $messages['ceb'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce  Mailing list sa mga release sa MediaWiki]',
 );
 
-/** Sorani (کوردی)
+/** Sorani Kurdish (کوردی)
  * @author Asoxor
  */
 $messages['ckb'] = array(
@@ -2998,7 +2996,7 @@ $messages['crh-cyrl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].",
 );
 
-/** Czech (Ä\8cesky)
+/** Czech (Ä\8desky)
  * @author Danny B.
  * @author Mormegil
  */
@@ -3562,19 +3560,21 @@ $messages['cv'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki çĕнĕ верси тухнине пĕлтерекен рассылка].',
 );
 
-/** Welsh (Cymraeg) */
+/** Welsh (Cymraeg)
+ * @author Xxglennxx
+ */
 $messages['cy'] = array(
        'mainpagetext' => "'''Wedi llwyddo gosod meddalwedd MediaWiki yma'''",
        'mainpagedocfooter' => 'Ceir cymorth (yn Saesneg) ar ddefnyddio meddalwedd wici yn y [//meta.wikimedia.org/wiki/Help:Contents Canllaw Defnyddwyr] ar wefan Wikimedia.
 
 ==Cychwyn arni==
 
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr gosodiadau wrth gyflunio]
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]
 * [//www.mediawiki.org/wiki/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]',
 );
 
-/** Danish (Dansk)
+/** Danish (dansk)
  * @author Peter Alberti
  */
 $messages['da'] = array(
@@ -3735,7 +3735,7 @@ Miniaturansichten von Bildern sind daher nicht möglich.',
 Der Installationsvorgang wurde daher abgebrochen.",
        'config-no-cli-uri' => "'''Warnung''': Es wurde kein Pfad zum Skipt (--scriptpath) angegeben. Daher wird der Standardpfad genutzt: <code>$1</code>.",
        'config-using-server' => 'Der Servername „<nowiki>$1</nowiki>“ wird verwendet.',
-       'config-using-uri' => 'Verwende Server-URL „<nowiki>$1$2</nowiki>“.',
+       'config-using-uri' => 'Die Server-URL „<nowiki>$1$2</nowiki>“ wird verwendet.',
        'config-uploads-not-safe' => "'''Warnung:''' Das Standardverzeichnis für hochgeladene Dateien <code>$1</code> ist für die willkürliche Ausführung von Skripten anfällig.
 Obwohl MediaWiki die hochgeladenen Dateien auf Sicherheitsrisiken überprüft, wird dennoch dringend empfohlen diese [//www.mediawiki.org/wiki/Manual:Security#Upload_security Sicherheitslücke] zu schließen, bevor das Hochladen von Dateien aktiviert wird.",
        'config-no-cli-uploads-check' => "'''Warnung''': Das Standardverzeichnis für hochgeladene Dateien (<code>$1</code>) wird, während der Installation über die Kommandozeile, nicht auf Sicherheitsanfälligkeiten hinsichtlich willkürlicher Skriptausführungen geprüft.",
@@ -4148,8 +4148,11 @@ $messages['de-formal'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
 );
 
-/** Zazaki (Zazaki) */
+/** Zazaki (Zazaki)
+ * @author Mirzali
+ */
 $messages['diq'] = array(
+       'config-page-name' => 'Name',
        'mainpagetext' => "'''MediaWiki vıst ra ser, vıraziya.'''",
        'mainpagedocfooter' => 'Seba gurenayış u eyarkerdışê Wiki-Softwarey [//meta.wikimedia.org/wiki/Help:Contents İdarê karberi] de mıracaet ke.
 
@@ -4216,7 +4219,7 @@ $messages['eo'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki dissendolisto pri anoncoj] (angla)",
 );
 
-/** Spanish (Español)
+/** Spanish (español)
  * @author Armando-Martin
  * @author Crazymadlover
  * @author Danke7
@@ -4278,7 +4281,7 @@ Verifica tu php.ini y comprueba que <code>session.save_path</code> está estable
        'config-help-restart' => '¿Deseas borrar todos los datos que has ingresado hasta ahora y reiniciar el proceso de instalación desde el principio?',
        'config-restart' => 'Sí, reiniciarlo',
        'config-welcome' => '=== Comprobación del entorno ===
-Se realiza comprobacioens básicas para ver si el entorno es adecuado para la instalación de MediaWiki.
+Se realiza comprobaciones básicas para ver si el entorno es adecuado para la instalación de MediaWiki.
 Deberás suministrar los resultados de tales comprobaciones si necesitas ayuda durante la instalación.',
        'config-copyright' => "=== Derechos de autor y Términos de uso ===
 
@@ -4766,14 +4769,14 @@ Cuando lo haya hecho, usted puede '''[$2  entrar en su wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
 );
 
-/** Estonian (Eesti) */
+/** Estonian (eesti) */
 $messages['et'] = array(
        'mainpagetext' => "'''MediaWiki tarkvara on edukalt paigaldatud.'''",
        'mainpagedocfooter' => 'Juhiste saamiseks kasutamise ning konfigureerimise kohta vaata palun inglisekeelset [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentatsiooni liidese kohaldamisest]
 ning [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide kasutusjuhendit].',
 );
 
-/** Basque (Euskara)
+/** Basque (euskara)
  * @author An13sa
  */
 $messages['eu'] = array(
@@ -4806,7 +4809,6 @@ $messages['eu'] = array(
        'config-env-php' => 'PHP $1 instalatuta dago.',
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] instalatuta dago',
        'config-apc' => '[http://www.php.net/apc APC] instalatuta dago',
-       'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] instalatuta dago',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalatuta dago',
        'config-diff3-bad' => 'GNU diff3 ez da aurkitu.',
        'config-db-type' => 'Datu-base mota:',
@@ -4855,7 +4857,7 @@ $messages['eu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
 );
 
-/** Extremaduran (Estremeñu) */
+/** Extremaduran (estremeñu) */
 $messages['ext'] = array(
        'mainpagetext' => "'''MeyaGüiqui s'á istalau satihatoriamenti.'''",
        'mainpagedocfooter' => "Consurta la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pa sabel mas al tentu el huncionamientu el software güiqui.
@@ -4917,7 +4919,7 @@ $messages['fa'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست پست الکترونیکی نسخه‌های مدیاویکی]',
 );
 
-/** Finnish (Suomi)
+/** Finnish (suomi)
  * @author Centerlink
  * @author Crt
  * @author Nike
@@ -5099,12 +5101,12 @@ Tarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvitta
 Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön).",
 );
 
-/** Faroese (Føroyskt) */
+/** Faroese (føroyskt) */
 $messages['fo'] = array(
        'mainpagetext' => "'''Innlegging av Wiki-ritbúnaði væleydnað.'''",
 );
 
-/** French (Français)
+/** French (français)
  * @author Aadri
  * @author Crochet.david
  * @author Gomoko
@@ -5114,6 +5116,7 @@ $messages['fo'] = array(
  * @author Jean-Frédéric
  * @author McDutchie
  * @author Peter17
+ * @author Reedy
  * @author Sherbrooke
  * @author Urhixidur
  * @author Verdy p
@@ -5185,26 +5188,26 @@ Ce programme est distribué dans l’espoir qu’il sera utile, mais '''sans auc
 Voir la Licence Publique Générale GNU pour plus de détails.
 
 Vous devriez avoir reçu <doclink href=Copying>une copie de la Licence Publique Générale GNU</doclink> avec ce programme ; dans le cas contraire, écrivez à la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ou [http://www.gnu.org/copyleft/gpl.html lisez-le en ligne].",
-       'config-sidebar' => '* [//www.mediawiki.org MediaWiki Accueil]
+       'config-sidebar' => '* [//www.mediawiki.org Accueil MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents Guide de l’utilisateur]
 * [//www.mediawiki.org/wiki/Manual:Contents Guide de l’administrateur]
 * [//www.mediawiki.org/wiki/Manual:FAQ FAQ]
 ----
 * <doclink href=Readme>Lisez-moi</doclink>
-* <doclink href=ReleaseNotes>Notes de pblication</doclink>
+* <doclink href=ReleaseNotes>Notes de publication</doclink>
 * <doclink href=Copying>Copie</doclink>
 * <doclink href=UpgradeDoc>Mise à jour</doclink>',
        'config-env-good' => 'L’environnement a été vérifié.
 Vous pouvez installer MediaWiki.',
        'config-env-bad' => 'L’environnement a été vérifié.
-vous ne pouvez pas installer MediaWiki.',
+Vous ne pouvez pas installer MediaWiki.',
        'config-env-php' => 'PHP $1 est installé.',
        'config-env-php-toolow' => 'PHP $1 est installé.
 Cependant, MediaWiki requiert PHP $2 ou plus haut.',
        'config-unicode-using-utf8' => 'Utilisation de utf8_normalize.so par Brion Vibber pour la normalisation Unicode.',
        'config-unicode-using-intl' => "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
        'config-unicode-pure-php-warning' => "'''Attention''': L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.
-Si vous utilisez un site web très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
+Si votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
        'config-unicode-update-warning' => "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].
 Vous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si l'usage d'Unicode vous semble important.",
        'config-no-db' => "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote pour PHP. Ces types de bases de données sont reconnus : $1.
@@ -5260,8 +5263,8 @@ La miniaturisation d'images sera désactivé.",
        'config-no-uri' => "'''Erreur :''' Impossible de déterminer l'URI du script actuel.
 Installation avortée.",
        'config-no-cli-uri' => "'''Attention''': Aucun --scriptpath n'a été spécifié; <code>$1</code> sera utilisé par défaut",
-       'config-using-server' => 'En utilisant le nom du serveur "<nowiki>$1</nowiki>".',
-       'config-using-uri' => 'Utilise l\'URL du serveur "<nowiki>$1$2</nowiki>".',
+       'config-using-server' => 'Utilisation du nom de serveur "<nowiki>$1</nowiki>".',
+       'config-using-uri' => 'Utilisation de l\'URL de serveur "<nowiki>$1$2</nowiki>".',
        'config-uploads-not-safe' => "'''Attention:''' Votre répertoire par défaut pour les téléchargements, <code>$1</code>, est vulnérable, car il peut exécuter n'importe quel script.
 Bien que MediaWiki vérifie tous les fichiers téléchargés, il est fortement recommandé de [//www.mediawiki.org/wiki/Manual:Security#Upload_security fermer cette vulnérabilité de sécurité] (texte en anglais) avant d'activer les téléchargements.",
        'config-no-cli-uploads-check' => "'''Attention:''' Votre répertoire par défaut pour les imports(<code>$1</code>) n'est pas contrôlé concernant la vulnérabilité d'exécution de scripts arbitraires lors de l'installation CLI.",
@@ -5375,7 +5378,7 @@ Vérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous
        'config-invalid-schema' => 'Schéma invalide pour MediaWiki « $1 ».
 Utilisez seulement des lettres latines (a-z, A-Z), des chiffres (0-9) et des caractères de soulignement (_).',
        'config-db-sys-create-oracle' => "L'installateur ne reconnaît que les compte SYSDBA lors de la création d'un nouveau compte.",
-       'config-db-sys-user-exists-oracle' => 'Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau comtpe.',
+       'config-db-sys-user-exists-oracle' => 'Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau compte.',
        'config-postgres-old' => 'PostgreSQL $1 ou version ultérieure est requis, vous avez $2.',
        'config-sqlite-name-help' => "Choisir un nom qui identifie votre wiki.
 Ne pas utiliser des espaces ou des traits d'union.
@@ -5436,7 +5439,7 @@ Le compte que vous spécifiez ici doit déjà exister.",
  * il supporte à peine la simultanéité en raison de verrouillage de table
  * il est plus sujet à la corruption que les autres moteurs
  * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit
-Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une une mise à niveau.",
+Si votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
        'config-mysql-engine-help' => "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].
 
 '''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
@@ -5490,7 +5493,7 @@ Vous pouvez passer la configuration restante et installer immédiatement le wiki
        'config-optional-skip' => 'J’en ai assez, installer simplement le wiki.',
        'config-profile' => 'Profil des droits d’utilisateurs :',
        'config-profile-wiki' => 'Wiki traditionnel',
-       'config-profile-no-anon' => 'Création de comte requise',
+       'config-profile-no-anon' => 'Création de compte requise',
        'config-profile-fishbowl' => 'Éditeurs autorisés seulement',
        'config-profile-private' => 'Wiki privé',
        'config-profile-help' => "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible le modifier.
@@ -5527,7 +5530,7 @@ C'est une licence valide, mais elle est difficile à comprendre. De plus, elle p
        'config-enable-email' => 'Activer les courriels sortants',
        'config-enable-email-help' => 'Si vous souhaitez utiliser le courriel, vous devez [http://www.php.net/manual/en/mail.configuration.php configurer des paramètres PHP] (texte en anglais).
 Si vous ne voulez pas du service de courriel, vous pouvez le désactiver ici.',
-       'config-email-user' => 'Activer les courriels de utilisateur à utilisateur',
+       'config-email-user' => "Activer les courriers électroniques d'utilisateur à utilisateur",
        'config-email-user-help' => "Permet à tous les utilisateurs d'envoyer des courriels à d'autres utilisateurs si cela est activé dans leurs préférences.",
        'config-email-usertalk' => 'Activer la notification des pages de discussion des utilisateurs',
        'config-email-usertalk-help' => 'Permet aux utilisateurs de recevoir une notification en cas de modification de leurs pages de discussion, si cela est activé dans leurs préférences.',
@@ -5599,7 +5602,7 @@ Si vous voulez apporter des modifications, appuyez sur Retour.",
        'config-install-pg-schema-failed' => "Échec lors de la création des tables.
 Assurez-vous que l'utilisateur « $1 » peut écrire selon le schéma « $2 ».",
        'config-install-pg-commit' => 'Validation des modifications',
-       'config-install-pg-plpgsql' => 'Vérification du language PL/pgSQL',
+       'config-install-pg-plpgsql' => 'Vérification du langage PL/pgSQL',
        'config-pg-no-plpgsql' => 'Vous devez installer le langage PL/pgSQL dans la base de données $1',
        'config-pg-no-create-privs' => "Le compte que vous avez spécifié pour l'installation n'a pas suffisamment de privilèges pour créer un compte.",
        'config-pg-not-in-role' => "Le compte que vous avez spécifié pour l'utilisateur web existe déjà !
@@ -5654,7 +5657,7 @@ Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]',
 );
 
-/** Cajun French (Français cadien) */
+/** Cajun French (français cadien) */
 $messages['frc'] = array(
        'mainpagetext' => "'''Vous avez bien installé MediaWiki.'''",
        'mainpagedocfooter' => 'Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.
@@ -5666,7 +5669,7 @@ $messages['frc'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]',
 );
 
-/** Franco-Provençal (Arpetan)
+/** Franco-Provençal (arpetan)
  * @author ChrisPtDe
  */
 $messages['frp'] = array(
@@ -5840,7 +5843,7 @@ $messages['frr'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
 );
 
-/** Friulian (Furlan) */
+/** Friulian (furlan) */
 $messages['fur'] = array(
        'mainpagetext' => "'''MediaWiki e je stade instalade cun sucès.'''",
 );
@@ -5876,7 +5879,7 @@ $messages['gag'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Simplified Gan script (‪赣语(简体)‬) */
+/** Simplified Gan script (‪赣语(简体)‬) */
 $messages['gan-hans'] = array(
        'mainpagetext' => "'''安装正MediaWiki喽。'''",
        'mainpagedocfooter' => '参看[//meta.wikimedia.org/wiki/Help:Contents 用户指南]里头会话到啷用wiki软件
@@ -5888,7 +5891,7 @@ $messages['gan-hans'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]',
 );
 
-/** Traditional Gan script (‪贛語(繁體)‬) */
+/** Traditional Gan script (‪贛語(繁體)‬) */
 $messages['gan-hant'] = array(
        'mainpagetext' => "'''安裝正MediaWiki嘍。'''",
        'mainpagedocfooter' => '參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件
@@ -7078,7 +7081,7 @@ chmod a+w $3</pre></div>',
        'config-cache-options' => 'הגדרות למטמון עצמים (object caching):',
        'config-cache-help' => 'מטמון עצמים משמש לשיפור המהירות של מדיה־ויקי על־ידי שמירה של נתונים שהשימוש בהם נפוץ במטמון.
 לאתרים בינוניים וגדולים כדאי מאוד להפעיל את זה, וגם אתרים קטנים ייהנו מזה.',
-       'config-cache-none' => 'ללא מטמון (שום יכולת אינה מוסרת, אבל הביצועים באתרים גדולים ייפגעו)',
+       'config-cache-none' => 'ללא מטמון (שום יכולת אינה מוּסרת, אבל הביצועים באתרים גדולים ייפגעו)',
        'config-cache-accel' => 'מטמון עצמים (object caching) של PHP&rlm; (APC&rlm;, XCache או WinCache)',
        'config-cache-memcached' => 'להשתמש ב־Memcached (דורש התקנות והגדרות נוספות)',
        'config-memcached-servers' => 'שרתי Memcached:',
@@ -7136,7 +7139,7 @@ chmod a+w $3</pre></div>',
        'config-install-sysop' => 'יצירת חשבון מפעיל',
        'config-install-subscribe-fail' => 'הרישום ל־mediawiki-announce לא הצליח: $1',
        'config-install-subscribe-notpossible' => 'cURL אינה מותקנת ו־allow_url_fopen אינה זמינה.',
-       'config-install-mainpage' => '×\99צ×\99רת ×\93×£ ×¨×\90ש×\99 ×¢×\9d ×ª×\95×\9b×\9f ×\9cפ×\99 ×\91ררת ×\9e×\97×\93×\9c.',
+       'config-install-mainpage' => '×\99צ×\99רת ×\93×£ ×¨×\90ש×\99 ×¢×\9d ×ª×\95×\9b×\9f ×\94ת×\97×\9cת×\99.',
        'config-install-extension-tables' => 'יצירת טבלאות להרחבות מופעלות',
        'config-install-mainpage-failed' => 'לא הצליחה הכנסת דף ראשי: $1.',
        'config-install-done' => "'''מזל טוב!'''
@@ -7203,7 +7206,7 @@ $messages['hil'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]",
 );
 
-/** Croatian (Hrvatski) */
+/** Croatian (hrvatski) */
 $messages['hr'] = array(
        'mainpagetext' => "'''Softver MediaWiki je uspješno instaliran.'''",
        'mainpagedocfooter' => 'Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi sučelja]
@@ -7561,7 +7564,7 @@ $messages['ht'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis diskisyon ki parèt sou MediaWiki]',
 );
 
-/** Hungarian (Magyar)
+/** Hungarian (magyar)
  * @author Dani
  * @author Glanthor Reviol
  */
@@ -8096,7 +8099,7 @@ $messages['hy'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Interlingua (Interlingua)
+/** Interlingua (interlingua)
  * @author McDutchie
  */
 $messages['ia'] = array(
@@ -9201,7 +9204,7 @@ $messages['io'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]",
 );
 
-/** Icelandic (Ã\8dslenska) */
+/** Icelandic (íslenska) */
 $messages['is'] = array(
        'mainpagetext' => "'''Uppsetning á MediaWiki heppnaðist.'''",
        'mainpagedocfooter' => 'Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.
@@ -9213,7 +9216,7 @@ $messages['is'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]',
 );
 
-/** Italian (Italiano)
+/** Italian (italiano)
  * @author Beta16
  * @author Karika
  */
@@ -9279,7 +9282,6 @@ Non è possibile installare MediaWiki.",
 Tuttavia, MediaWiki richiede PHP $2 o superiore.',
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] è installato',
        'config-apc' => '[http://www.php.net/apc APC] è installato',
-       'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] è installato',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] è installato',
        'config-diff3-bad' => 'GNU diff3 non trovato.',
        'config-db-type' => 'Tipo di database:',
@@ -9314,7 +9316,7 @@ Specificare un nome utente diverso.',
        'config-license-cc-0' => 'Creative Commons Zero (pubblico dominio)',
        'config-license-gfdl' => 'GNU Free Documentation License 1.3 o versioni successive',
        'config-license-pd' => 'Pubblico dominio',
-       'config-email-settings' => 'Impostazioni e-mail',
+       'config-email-settings' => 'Impostazioni email',
        'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
        'config-install-stats' => 'Inizializzazione delle statistiche',
        'config-install-keys' => 'Generazione delle chiavi segrete',
@@ -9341,6 +9343,7 @@ I seguenti collegamenti sono in lingua inglese:
  * @author Mizusumashi
  * @author Ninomy
  * @author Ohgi
+ * @author Shirayuki
  * @author Whym
  * @author Yanajin66
  * @author 青子守歌
@@ -9671,7 +9674,7 @@ chmod a+w $3</pre>',
        'config-admin-password-blank' => '管理者アカウントのパスワードを入力してください。',
        'config-admin-password-same' => 'ユーザ名と同じパスワードは使えません。',
        'config-admin-password-mismatch' => '入力された二つのパスワードが一致しません。',
-       'config-admin-email' => 'Eメールアドレス:',
+       'config-admin-email' => 'メールアドレス:',
        'config-admin-email-help' => '電子メールアドレスを入力してください。他のユーザーからの電子メールの受け取りと、パスワードのリセット、ウォッチリストに登録したページの更新通知に用いられます。',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
        'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
@@ -9836,7 +9839,7 @@ $messages['jam'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Jutish (Jysk)
+/** Jutish (jysk)
  * @author Huslåke
  */
 $messages['jut'] = array(
@@ -9988,11 +9991,22 @@ $messages['kn'] = array(
 
 /** Korean (한국어)
  * @author Kwj2772
+ * @author 아라
  */
 $messages['ko'] = array(
-       'config-desc' => '미ë\94\94ì\96´ì\9c\84í\82¤ ì\9d¸ì\8a¤í\86¨ë\9f¬',
-       'config-title' => '미디어위키 $1 설치',
+       'config-desc' => 'MediaWiki ì\84¤ì¹\98 ë§\88ë²\95ì\82¬',
+       'config-title' => 'MediaWiki $1 설치',
        'config-information' => '정보',
+       'config-localsettings-upgrade' => '<code>LocalSettings.php</code> 파일이 감지되었습니다.
+이 설치를 업그레이드하려면 아래 상자에 <code>$wgUpgradeKey</code>의 값을 입력해주세요.
+LocalSettings.php에 찾으세요.',
+       'config-localsettings-cli-upgrade' => 'LocalSettings.php 파일이 감지되었습니다. 이 설치를 업그레이드하려면 update.php를 대신 실행하세요',
+       'config-localsettings-key' => '업그레이드 키:',
+       'config-localsettings-badkey' => '제공한 키가 잘못되었습니다.',
+       'config-upgrade-key-missing' => 'MediaWiki의 기존 설치가 감지되었습니다.
+이 설치를 업그레이드하려면 LocalSettings.php의 아래에 다음 줄을 넣으세요:
+
+$1',
        'config-wiki-language' => '위키 언어:',
        'config-back' => '← 뒤로',
        'config-continue' => '계속 →',
@@ -10001,39 +10015,137 @@ $messages['ko'] = array(
        'config-page-name' => '이름',
        'config-page-install' => '설치',
        'config-page-complete' => '완료!',
-       'config-help-restart' => '당신이 입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
+       'config-help-restart' => '당신이 입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
        'config-restart' => '예, 다시 시작합니다.',
        'config-welcome' => '=== 사용 환경 검사 ===
 이 환경이 미디어위키 설치에 적합할 지 기본 검사를 실행합니다.
 설치 중 도움이 필요하다면 이 검사 결과를 함께 제공해주셔야 합니다.',
-       'config-env-php' => 'PHP $1가 설치되었습니다.',
-       'config-env-php-toolow' => 'PHP $1가 설치되었습니다.
+       'config-copyright' => "=== 저작권 및 사용 약관 ===
+
+$1
+
+이 프로그램은 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 프로그램을 재배포하거나 수정할 수 있습니다.
+
+이 프로그램이 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''.
+자세한 내용은 GNU 일반 공중 사용 허가서를 참고하십시오.
+
+당신은 이 프로그램을 통해 <doclink href=Copying>GNU 일반 공중 사용 허가서 전문</doclink>을 받았습니다; 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [http://www.gnu.org/copyleft/gpl.html 온라인으로 읽어보시기] 바랍니다.",
+       'config-env-good' => '환경이 확인되었습니다.
+MediaWiki를 설치할 수 있습니다.',
+       'config-env-bad' => '환경이 확인되었습니다.
+MediaWiki를 설치할 수 없습니다.',
+       'config-env-php' => 'PHP $1(이)가 설치되었습니다.',
+       'config-env-php-toolow' => 'PHP $1(이)가 설치되었습니다.
 하지만 미디어위키는 PHP $2 이상이 필요합니다.',
+       'config-ctype' => "'''심각''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]에 대해 지원하여 컴파일해야 합니다.",
+       'config-apc' => '[http://www.php.net/apc APC]가 설치되었습니다',
+       'config-diff3-bad' => 'GNU diff3를 찾을 수 없습니다.',
+       'config-imagemagick' => 'ImageMagick를 찾았습니다: <code>$1</code>.
+올리기를 활성화할 경우 그림 섬네일이 활성화될 것입니다.',
+       'config-gd' => '내장된 GD 그래픽 라이브러리를 찾았습니다.
+올리기를 활성화할 경우 그림 섬네일이 활성화될 것입니다.',
+       'config-brokenlibxml' => '시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 MediaWiki나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.
+PHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요 ([//bugs.php.net/bug.php?id=45996 PHP에 제기한 버그]).
+설치가 중단되었습니다.',
        'config-db-type' => '데이터베이스 종류:',
        'config-db-host' => '데이터베이스 호스트:',
+       'config-db-host-help' => '데이터베이스 서버가 다른 서버에 있을 경우 여기에 호스트 이름이나 IP 주소를 입력하세요.
+
+웹 호스팅을 공유하여 사용하는 경우 호스팅 공급자는 당신에게 이들 설명서의 올바른 호스트 이름을 표기해야 합니다.
+
+윈도 서버에 설치하고 MySQL을 사용할 경우 "localhost"는 서버 이름으로 작동하지 않을 수 있습니다. 그렇지 않으면 로컬 IP 주소로 "127.0.0.1"를 시도하세요.
+
+PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력란을 비워두세요.',
+       'config-db-host-oracle' => '데이터베이스 TNS:',
+       'config-db-host-oracle-help' => '유효한 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 로컬 연결 이름]을 입력하세요. tnsnames.ora 파일이 이 설치에 보여야 합니다.<br />10g 이후의 클라이언트 라이브러리를 사용하는 경우 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 쉬운 연결] 네이밍 메소드도 사용할 수 있습니다.',
+       'config-db-wiki-settings' => '이 위키 식별',
        'config-db-name' => '데이터베이스 이름:',
+       'config-db-name-help' => '위키를 식별하기 위한 이름을 선택하세요.
+이는 공백이 없어야 합니다.
+
+웹 호스팅을 공유해 사용하는 경우 호스팅 제공 업체도 당신에게 제어판을 통해 데이터베이스를 사용하거나 만들 수 있도록 특정 데이터베이스 이름을 제공합니다.',
+       'config-db-name-oracle' => '데이터베이스 스케마:',
+       'config-db-account-oracle-warn' => '데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:
+
+설치 과정의 일부로 데이터베이스 계정을 만들려면 설치를 위해 데이터베이스 계정으로 SYSDBA 역할을 가진 계정을 제공하고 웹 액세스 계정에 대해 원하는 자격 증명을 지정하세요, 그렇지 않으면 수동으로 웹 액세스 계정을 만들 수 있으며 (필요한 경우 권한 스키마 개체를 만들어야 합니다) 또는 다른 계정 두 개를 만들고 권한을 가진 하나의 웹 액세스를 위한 제한된 하나를 제공할 수 있습니다.
+
+필요한 권한을 가진 계정을 만드는 스크립트는 이 설치의 "maintenance/oracle/" 디렉토리에서 찾을 수 있습니다. 제한된 계정을 사용하면 기본 계정으로 모든 관리 기능을 비활성화할 것을 염두해 두십시오.',
+       'config-db-install-account' => '설치를 위한 사용자 계정',
        'config-db-username' => '데이터베이스 사용자 이름:',
        'config-db-password' => '데이터베이스 비밀번호:',
+       'config-db-password-empty' => '새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.
+비밀번호 없이 사용자를 만들 수도 있지만 이는 안전하지 않습니다.',
+       'config-db-install-username' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.
+이는 MediaWiki 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.',
+       'config-db-install-password' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요. 이는 MediaWiki 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.',
+       'config-db-install-help' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.',
+       'config-db-account-lock' => '정상적으로 작동하는 동안 같은 사용자 이름과 비밀번호를 사용함',
+       'config-db-wiki-account' => '정상적인 작동을 위한 사용자 계정',
+       'config-db-wiki-help' => '정상적인 위키 작업 동안 데이터베이스에 연결하는 데 사용할 사용자 이름과 비밀 번호를 입력하세요.
+계정이 존재하지 않고 설치 계정에 충분한 권한이 있는 경우 이 사용자 계정은 위키를 작동하는 데 필요한 최소 권한으로 만들어집니다.',
        'config-db-prefix' => '데이터베이스 테이블 접두어:',
+       'config-db-prefix-help' => '여러 위키 사이 또는 MediaWiki와 다른 웹 응용 프로그램 사이에서 하나의 데이터베이스를 공유해야 하는 경우, 충돌을 피하기 위해 모든 테이블 이름에 접두어를 추가하도록 선택할 수 있습니다.
+공백을 사용하지 마세요.
+
+이 필드는 일반적으로 비어있습니다.',
+       'config-db-charset' => '데이터베이스 문자 집합',
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 바이너리',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-charset-mysql4' => 'MySQL 4.0 UTF-8 하위 호환성',
+       'config-charset-help' => "'''경고:''' MySQL 4.1에서 '''UTF-8 하위 호환성'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스에 백업한다면 이는 모든 ASCII가 아닌 문자를 파괴하고 손상한 백업을 되돌릴 수 없습니다!
+
+'''바이너리 모드'''에서는 MediaWiki는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
+이는 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
+'''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 어떤 문자열인지를 알 것이며, 표현하고 적절하게 그것을 변환할 수 있지만
+[//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 공간] 상의 문자를 저장하지 못하게 될 수 있습니다.",
+       'config-db-port' => '데이터베이스 포트:',
+       'config-db-schema' => 'MediaWiki에 대한 스케마:',
+       'config-db-schema-help' => '이 스케마는 보통 괜찮습니다.
+필요로 알고 있을 경우에만 이를 바꿉니다.',
        'config-header-mysql' => 'MySQL 설정',
        'config-header-postgres' => 'PostgreSQL 설정',
        'config-header-sqlite' => 'SQLite 설정',
+       'config-header-oracle' => '오라클 설정',
+       'config-header-ibm_db2' => 'IBM DB2 설정',
+       'config-connection-error' => '$1.
+
+호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.',
+       'config-db-sys-create-oracle' => '설치 마법사는 새 계정을 만들기 위한 SYSDBA 계정만을 지원합니다.',
+       'config-db-sys-user-exists-oracle' => '"$1" 사용자 계정이 이미 존재합니다. SYSDBA는 새 계정을 만드는 데에만 사용할 수 있습니다!',
        'config-sqlite-readonly' => '파일 <code>$1</code>은 쓰기가 불가능합니다.',
+       'config-can-upgrade' => "이 데이터베이스에 MediaWiki 테이블이 있습니다.
+MediaWiki $1(으)로 업그레이드하려면 '''계속'''을 클릭하세요.",
+       'config-db-web-account' => '웹 액세스를 위한 데이터베이스 계정',
+       'config-db-web-help' => '위키의 일반적인 작업 중에 데이터베이스 서버에 연결하는 데 사용할 웹 서버에 대한 계정 이름과 비밀번호를 선택합니다.',
+       'config-db-web-account-same' => '설치를 위해 같은 계정을 사용',
+       'config-db-web-create' => '이 계정이 아직 존재하지 않을 경우 계정을 만들기',
+       'config-db-web-no-create-privs' => '설치를 위해 지정한 계정은 계정을 만들 수 있는 충분한 권한이 없습니다.
+여기서 지정한 계정은 이미 존재해야 합니다.',
        'config-mysql-utf8' => 'UTF-8',
+       'config-ibm_db2-low-db-pagesize' => "당신의 DB2 데이터베이스가 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
        'config-site-name' => '위키의 이름:',
        'config-site-name-help' => '이것이 브라우저 제목 표시줄과 다른 여러 곳에 나타날 것입니다.',
        'config-site-name-blank' => '사이트 이름을 입력하세요.',
        'config-project-namespace' => '프로젝트 이름공간:',
        'config-ns-generic' => '프로젝트',
        'config-admin-box' => '관리자 계정',
+       'config-admin-name' => '사용자 이름:',
        'config-admin-password' => '비밀번호:',
        'config-admin-password-confirm' => '비밀번호 확인:',
-       'config-admin-password-blank' => '관리자 계정의 비밀번호를 입력하십시오.',
-       'config-admin-password-same' => '비밀번호는 계정 이름과 같아서는 안 됩니다.',
-       'config-admin-password-mismatch' => '당신이 입력한 비밀번호 두 개가 일치하지 않습니다.',
+       'config-admin-help' => '"홍길동"과 같이 여기에 원하는 사용자 이름을 입력합니다.
+이는 위키에 로그인하는 데 사용되는 이름입니다.',
+       'config-admin-name-blank' => '관리자의 사용자 이름을 입력하세요.',
+       'config-admin-name-invalid' => '특정 "<nowiki>$1</nowiki>" 사용자 이름이 잘못되었습니다.
+다른 사용자 이름을 지정하세요.',
+       'config-admin-password-blank' => '관리자 계정의 비밀번호를 입력하세요.',
+       'config-admin-password-same' => '비밀번호는 사용자 이름과 같아서는 안 됩니다.',
+       'config-admin-password-mismatch' => '입력한 비밀번호 두 개가 일치하지 않습니다.',
        'config-admin-email' => '이메일 주소:',
+       'config-admin-email-help' => '위키의 다른 사용자로부터 이메일을 전달받거나 비밀번호를 재설정하고 주시문서 목록에 대한 변경 알림을 받기 위해 여기에 이메일 주소를 입력하세요. 이 필드를 비워 둘 수 있습니다.',
+       'config-admin-error-user' => '"<nowiki>$1</nowiki>" 이름의 관리자를 만드는 중 내부 오류가 발생했습니다.',
+       'config-admin-error-password' => '"<nowiki>$1</nowiki>" 관리자의 비밀번호를 설정하는 중 내부 오류가 발생했습니다: <pre>$2</pre>',
+       'config-admin-error-bademail' => '이메일 주소를 잘못 입력하였습니다.',
+       'config-almost-done' => '거의 다 됐습니다! 이제 남은 설정을 생략하고 지금 위키를 설치할 수 있습니다.',
        'config-optional-skip' => '지겨워요, 그냥 위키를 설치할래요.',
        'config-profile-wiki' => '평범한 위키',
        'config-profile-no-anon' => '계정 생성 필요',
@@ -10048,21 +10160,82 @@ $messages['ko'] = array(
        'config-license-pd' => '퍼블릭 도메인',
        'config-license-cc-choose' => '다른 크리에이티브 커먼즈 라이선스 선택',
        'config-email-settings' => '이메일 설정',
+       'config-enable-email' => '발신 이메일 허용',
+       'config-enable-email-help' => '이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 구성해야 합니다.
+이메일 기능을 사용하지 않으려면 이를 비활성화할 수 있습니다.',
+       'config-email-user' => '사용자와 사용자 간 이메일 허용',
+       'config-email-user-help' => '환경 설정에서 활성화한 경우 모든 사용자가 이메일을 서로 보내도록 허용합니다.',
+       'config-email-usertalk' => '사용자 토론 문서 알림 허용',
+       'config-email-usertalk-help' => '환경 설정에서 활성화한 경우 사용자는 사용자 토론 문서의 변경 알림을 받도록 허용합니다.',
+       'config-email-watchlist' => '주시문서 목록 알림 허용',
+       'config-email-watchlist-help' => '환경 설정에서 활성화한 경우 사용자가 주시한 문서에 대한 알림을 받도록 허용합니다.',
+       'config-email-auth' => '이메일 인증 허용',
+       'config-email-auth-help' => "이 설정이 활성화되어 있으면 사용자는 이메일 주소를 설정하거나 변경할 때마다 그들에게 보낸 링크를 사용하여 확인해야 합니다.
+인증된 이메일 주소만 다른 사용자로부터의 이메일이나 변경 알림 이메일을 받을 수 있습니다.
+이메일 기능의 남용 가능성이 있기 때문에 이 옵션을 설정하는 것은 공용 위키에서 '''권장'''합니다.",
+       'config-email-sender' => '반송 이메일 주소',
+       'config-email-sender-help' => '발신한 이메일에 대한 반송 주소로 사용할 이메일 주소를 입력합니다.
+이는 반송할 때 보내는 주소입니다.
+대부분의 메일 서버는 적어도 도메인 이름 부분은 유효합니다.',
        'config-logo' => '로고 URL:',
        'config-logo-help' => '미디어위키 기본 스킨은 사이드바 메뉴 위에 135×160픽셀의 로고를 포함하고 있습니다.
 적당한 크기로 이미지를 올리고 URL을 여기 적어주세요.
 
 로고 사용을 원치 않으면 이 상자를 비워 두십시오.',
+       'config-cc-error' => '크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.
+수동으로 라이선스 이름을 입력하세요.',
+       'config-cc-again' => '다시 선택...',
+       'config-cc-not-chosen' => '원하는 크리에이티브 커먼즈 라이선스를 선택하고 "진행"을 클릭하세요.',
+       'config-advanced-settings' => '고급 설정',
+       'config-cache-options' => '개체 캐싱을 위한 설정:',
+       'config-cache-help' => '개체 캐싱은 자주 사용하는 데이터를 캐싱하여 MediaWiki의 속도를 개선하는 데 사용합니다.
+큰 사이트의 규모에는 이를 많이 사용하도록 권장하고 있으며, 소규모 사이트들도 물론 이익을 볼 수 있습니다.',
+       'config-cache-none' => '캐시하지 않음 (기능적으로는 삭제되지 않지만 큰 위키 사이트에 속도에 영향을 받을 수 있습니다)',
+       'config-cache-accel' => 'PHP 개체 캐싱 (APC, XCache 또는 WinCache)',
+       'config-cache-memcached' => 'Memcached 사용 (추가적인 설정 및 구성이 필요합니다)',
        'config-extensions' => '확장 기능',
        'config-extensions-help' => '위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.
 
 이들은 추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.',
+       'config-install-alreadydone' => "'''경고:''' 당신은 이미 MediaWiki를 설치하였고 다시 설치하려고 합니다.
+다음 페이지에서 진행하세요.",
+       'config-install-begin' => '"{{int:config-continue}}"을 누르면 MediaWiki의 설치를 시작합니다.
+그래도 변경하는 것을 원한다면 뒤로를 누릅니다.',
+       'config-install-extensions' => '확장 기능을 포함하는 중',
+       'config-install-database' => '데이터베이스 설정 중',
+       'config-install-pg-commit' => '커밋 바꾸기',
+       'config-install-pg-plpgsql' => 'PL/pgSQL 언어에 대해 확인 중',
        'config-install-user' => '데이터베이스 사용자 생성 중',
        'config-install-tables' => '테이블을 생성하는 중',
        'config-install-tables-exist' => "'''경고''': 미디어위키 테이블이 이미 있는 것 같습니다.
 테이블 생성을 생략합니다.",
        'config-install-tables-failed' => "'''오류''': 다음 오류와 함께 테이블 생성에 실패했습니다: $1",
        'config-install-interwiki' => '기본 인터위키 표를 채우는 중',
+       'config-install-interwiki-list' => '<code>interwiki.list</code> 파일을 읽을 수 없습니다.',
+       'config-install-interwiki-exists' => "'''경고''': 인터위키 표가 이미 항목을 갖고 있는 것 같습니다.
+기본 목록으로 넘어갑니다.",
+       'config-install-keys' => '보안 키를 만드는 중',
+       'config-insecure-keys' => "'''경고:''' 설치 중에 생성한 {{PLURAL:$2|보안 키}} ($1)를 설치하는 동안 완전히 안전하지 {{PLURAL:$2|않습니다}}. 직접 변경을 고려하세요.",
+       'config-install-mainpage' => '기본 콘텐트로 대문을 만드는 중',
+       'config-install-extension-tables' => '활성화된 확장 기능을 위한 표를 만드는 중',
+       'config-install-mainpage-failed' => '대문을 삽입할 수 없습니다: $1',
+       'config-install-done' => "'''축하합니다!'''
+성공적으로 MediaWIki를 설치했습니다.
+
+설치 마법사가 <code>LocalSettings.php</code> 파일을 만들었습니다.
+이는 모든 구성이 포함되어 있습니다.
+
+이를 다운로드하여 위키 설치의 거점에 넣어야 합니다 (index.php와 같은 디렉토리). 다운로드가 자동으로 시작됩니다.
+
+다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:
+
+$3
+
+'''참고''': 지금 이렇게 하지 않으면 이 구성 파일을 다운로드하지 않고 설치를 종료할 경우 만들어진 구성 파일은 나중에 사용할 수 없습니다.
+
+완료되었으면 '''[$2 당신은 위키에 들어갈 수 있습니다]'''.",
+       'config-download-localsettings' => 'LocalSettings.php 다운로드',
+       'config-help' => '도움말',
        'config-nofile' => '파일 "$1"을 찾을 수 없습니다. 이미 삭제되었나요?',
        'mainpagetext' => "'''미디어위키가 성공적으로 설치되었습니다.'''",
        'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 프로그램에 대한 정보를 얻을 수 있습니다.
@@ -10090,6 +10263,7 @@ $messages['krc'] = array(
 /** Colognian (Ripoarisch)
  * @author Mormegil
  * @author Purodha
+ * @author Reedy
  */
 $messages['ksh'] = array(
        'config-desc' => 'Et Projramm för Mediwiki opzesäze.',
@@ -10246,7 +10420,7 @@ Heh jeihd et nit wigger.',
        'config-using531' => 'MediaWiki läuf nit met PHP $1 zosamme wääje enem [//bugs.php.net/bug.php?id=50394 Fähler em Zosammehang met Parrameetere för <code lang="en">__call()</code>].
 Jangk op de Version 5.3.2 vum <i lang="en">PHP</i> ov dohnoh, udder op de Version 5.3.0 udder dovöör, öm dat Problem ze ömjonn.
 Heh jeiht et nit wigger.',
-       'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en"ResouceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
+       'config-suhosin-max-value-length' => '<i lang="en">Suhosin</i> es enschtalleet. Dröm kann ene <code lang="en">GET</code>-Parrameeter nit övver {{PLURAL:$1|ei Byte|$q Bytes|noll Byte}} lang wääde. En MediaWiki singe <i lang="en">ResourceLoader</i> kütt doh zwa drömeröm, ävver dat brems. Wann müjelesch, doht <code lang="en">suhosin.get.max_value_length</code> en dä Dattei <code lang="en">php.ini</code> op 1024 Bytes udder drövver enschtälle. un dann moß <code lang="en">$wgResourceLoaderMaxQueryLength</code> en dä Dattei <code lang="en">LocalSettings.php</code> op däsälve Wäät jesaz wääde.',
        'config-db-type' => 'De Zoot Daatebangk:',
        'config-db-host' => 'Dä Name vun däm Rääschner met dä Daatebangk:',
        'config-db-host-help' => 'Wann Dinge ẞööver för de Daatebangk ob enem andere Rääschner es, donn heh dämm singe Name udder dämm sing <i lang="en">IP</i>-Addräß enjävve.
@@ -10926,7 +11100,7 @@ $messages['lo'] = array(
        'mainpagetext' => "'''ຕິດຕັ້ງມີເດຍວິກິນີ້ສຳເລັດແລ້ວ.'''",
 );
 
-/** Lithuanian (Lietuvių) */
+/** Lithuanian (lietuvių) */
 $messages['lt'] = array(
        'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
        'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -10938,7 +11112,7 @@ $messages['lt'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]',
 );
 
-/** Latvian (Latviešu)
+/** Latvian (latviešu)
  * @author GreenZeb
  */
 $messages['lv'] = array(
@@ -11092,7 +11266,7 @@ $messages['min'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
 );
 
-/** Macedonian (Ð\9cакедонски)
+/** Macedonian (македонски)
  * @author Bjankuloski06
  */
 $messages['mk'] = array(
@@ -11492,7 +11666,7 @@ chmod a+w $3</pre>',
        'config-license-cc-by-sa' => 'Creative Commons НаведиИзвор СподелиПодИстиУслови',
        'config-license-cc-by' => 'Криејтив комонс НаведиИзвор',
        'config-license-cc-by-nc-sa' => 'Creative Commons НаведиИзвор-Некомерцијално-СподелиПодИстиУслови',
-       'config-license-cc-0' => 'Ð\9aÑ\80иеÑ\98Ñ\82ив ÐºÐ¾Ð¼Ð¾Ð½Ñ\81 Ð\9dÑ\83ла (Ñ\98авен Ð´Ð¾Ð¼ÐµÐ½)',
+       'config-license-cc-0' => 'Ð\9aÑ\80иеÑ\98Ñ\82ив ÐºÐ¾Ð¼Ð¾Ð½Ñ\81 Ð\9dÑ\83ла (Ñ\98авна Ñ\81опÑ\81Ñ\82веноÑ\81Ñ\82)',
        'config-license-gfdl' => 'ГНУ-ова лиценца за слободна документација 1.3 или понова',
        'config-license-pd' => 'Јавна сопственост',
        'config-license-cc-choose' => 'Одберете друга Creative Commons лиценца по ваш избор',
@@ -11599,7 +11773,7 @@ chmod a+w $3</pre>',
        'config-install-tables-exist' => "'''Предупредување''': Изгледа дека табелите за МедијаВики веќе постојат.
 Го прескокнувам создавањето.",
        'config-install-tables-failed' => "'''Грешка''': Создавањето на табелата не успеа поради следнава грешка: $1",
-       'config-install-interwiki' => 'Ги пополнувам основно-зададените интервики-табели',
+       'config-install-interwiki' => 'Ги пополнувам основно зададените меѓувики-табели',
        'config-install-interwiki-list' => 'Не можев да ја пронајдам податотеката <code>interwiki.list</code>.',
        'config-install-interwiki-exists' => "'''Предупредување''': Табелата со интервикија веќе содржи ставки.
 Го прескокнувам основно-зададениот список.",
@@ -11795,7 +11969,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce മീഡിയവിക്കി പ്രകാശന മെയിലിങ് ലിസ്റ്റ്]',
 );
 
-/** Mongolian (Ð\9cонгол)
+/** Mongolian (монгол)
  * @author Chinneeb
  */
 $messages['mn'] = array(
@@ -11952,9 +12126,8 @@ $messages['nan'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
 );
 
-/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
+/** Norwegian Bokmål (‪norsk (bokmål)‬)
  * @author Event
- * @author Jon Harald Søby
  * @author Nghtwlkr
  */
 $messages['nb'] = array(
@@ -12049,6 +12222,7 @@ Følgende databasetyper er støttet: $1
 Om du er på delt vertsskap, spør din vertsleverandør om å installere en passende databasedriver.
 Om du kompilerte PHP selv, rekonfigirer den med en aktivert databaseklient, for eksempel ved å bruke <code>./configure --with-mysql</code>.
 Om du installerte PHP fra en Debian- eller Ubuntu-pakke må du også installere modulen php5-mysql.',
+       'config-outdated-sqlite' => "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.",
        'config-no-fts3' => "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig på dette bakstykket.",
        'config-register-globals' => "'''Advarsel: PHPs <code>[http://php.net/register_globals register_globals]</code>-alternativ er aktivert.'''
 '''Deaktiver det om du kan.'''
@@ -12078,6 +12252,7 @@ MediaWiki krever UTF-8-støtte for å fungere riktig.",
        'config-memory-bad' => "'''Advarsel:''' PHPs <code>memory_limit</code> er $1.
 Dette er sannsynligvis for lavt.
 Installasjonen kan mislykkes!",
+       'config-ctype' => "'''Fatal feil''': PHP må kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] er innstallert',
        'config-apc' => '[http://www.php.net/apc APC] er innstallert',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
@@ -12109,11 +12284,13 @@ Installasjonen avbrutt.',
        'config-suhosin-max-value-length' => 'Suhosin er installert og begrenser GET-parameterlengder til $1 bytes. MediaWiki\'s ResourceLoader-komponent klarer å komme rundt denne begrensningen, med med redusert ytelse. På mulig bør du sette suhosin.get.max_value_length til minst 1024 i php.ini, og sette $wgResourceLoaderMaxQueryLength til samme verdi i LocalSettings.php.',
        'config-db-type' => 'Databasetype:',
        'config-db-host' => 'Databasevert:',
-       'config-db-host-help' => 'Hvis databasetjeneren er på en annen tjener, skriv inn vertsnavnet eller IP-adressen her.
+       'config-db-host-help' => 'Hvis databasen kjører på en annen tjenermaskin, skriv inn vertsnavnet eller IP-adressen her.
+
+Hvis du bruker et webhotell, vil du kunne be om aktuelt vertsnavn fra din leverandør.
 
-Hvis du bruker en delt nettvert bør verten din oppgi det korrekte vertsnavnet i deres dokumentasjon.
+Hvis du installerer på en Windowstjener og bruker MySQL, kan det hende at «localhost» ikke brukes som tjenernavn. Hvis så er tilfelle, prøv «127.0.0.1» som lokal IP-adresse.
 
-Hvis du installerer på en Windowstjener og bruker MySQL kan det hende at «localhost» ikke virker som tjenernavnet. Hvis ikke, prøv «127.0.0.1» for den lokale IP-adressen.',
+Hvis du bruker PostgreSQL, la dette feltet være blankt slik at koplingen gjøres via en "Unix socket".',
        'config-db-host-oracle' => 'Database TNS:',
        'config-db-host-oracle-help' => 'Skriv inn et gyldig [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; en tnsnames.ora-fil må være synlig for installasjonsprosessen.<br />Hvis du bruker klientbibliotek 10g eller nyere kan du også bruke navngivingsmetoden [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
        'config-db-wiki-settings' => 'Identifiser denne wikien',
@@ -12123,6 +12300,11 @@ Det bør ikke inneholde mellomrom.
 
 Hvis du bruker en delt nettvert vil verten din enten gi deg et spesifikt databasenavn å bruke, eller la deg opprette databaser via kontrollpanelet.',
        'config-db-name-oracle' => 'Databaseskjema:',
+       'config-db-account-oracle-warn' => 'Det finnes tre mulig fremgangsmåter for å installere Oracle som database:
+
+Hvis du ønsker å opprette en databasekonto som del av installasjonsprosessen, oppgi da en konto med SYSDBA-rolle som databasekonto for installasjonen og angi påkrevd autentiseringsinformasjon for web-aksesskontoen. Ellers kan du enten opprette web-aksesskontoen manuelt eller kun oppgi den kontoen (hvis den har påkrevede tillatelser for å opprette skjemeobjektene) , alternativt oppgi to ulike kontoer, en med opprettelsesprivilegier (create) og en begrenset konto for web-aksess.
+
+Skript for å opprette en konto med påkrevde privilegier finnes i "maintenance/oracle/"-folderen av denne installasjonen. Husk at det å bruke en begrenset konto vil blokkere all vedlikeholdsfunksjonalitet med standard konto.',
        'config-db-install-account' => 'Brukerkonto for installasjon',
        'config-db-username' => 'Databasebrukernavn:',
        'config-db-password' => 'Databasepassord:',
@@ -12157,6 +12339,7 @@ men det vil ikke la deg lagre tegn over «[//en.wikipedia.org/wiki/Mapping_of_Un
        'config-db-schema' => 'Skjema for MediaWiki',
        'config-db-schema-help' => 'Dette skjemaet er som regel riktig.
 Bare endre det hvis du vet at du trenger det.',
+       'config-pg-test-error' => "Får ikke kontakt med database '''$1''': $2",
        'config-sqlite-dir' => 'SQLite datamappe:',
        'config-sqlite-dir-help' => "SQLite lagrer alle data i en enkelt fil.
 
@@ -12333,7 +12516,9 @@ En '''{{int:config-profile-private}}''' tillater kun godkjente brukere å se sid
 
 Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter installasjon, se det [//www.mediawiki.org/wiki/Manual:User_rights relevante manualavsnittet].",
        'config-license' => 'Opphavsrett og lisens:',
+       'config-license-none' => 'Ingen lisensbunntekst',
        'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
+       'config-license-cc-by' => 'Creative Commons Attribution',
        'config-license-cc-by-nc-sa' => 'Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår',
        'config-license-cc-0' => 'Creative Commons Zero',
        'config-license-pd' => 'Offentlig rom',
@@ -12390,7 +12575,9 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
        'config-install-user-grant-failed' => 'Å gi tillatelse til brukeren «$1» mislyktes: $2',
        'config-install-tables' => 'Oppretter tabeller',
        'config-install-mainpage-failed' => 'Kunne ikke sette inn hovedside: $1',
+       'config-download-localsettings' => 'Last ned LocalSettings.php',
        'config-help' => 'hjelp',
+       'config-nofile' => 'Filen "$1" ble ikke funnet. Kan den være blitt slettet?',
        'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
        'mainpagedocfooter' => 'Se [//meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for informasjon om hvordan du bruker wiki-programvaren.
 
@@ -12995,7 +13182,7 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]',
 );
 
-/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
+/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
  * @author Harald Khan
  * @author Nghtwlkr
  */
@@ -13011,7 +13198,6 @@ Dette er sannsynlegvis for lågt.
 Installasjonen kan mislukkast!",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] er innstallert',
        'config-apc' => '[http://www.php.net/apc APC] er innstallert',
-       'config-eaccel' => '[http://eaccelerator.sourceforge.net/ eAccelerator] er innstallert',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] er installert',
        'config-db-name' => 'Databasenamn:',
        'config-db-username' => 'Databasebrukarnamn:',
@@ -13046,7 +13232,12 @@ Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postliste med informasjon om nye MediaWiki-versjonar]',
 );
 
-/** Occitan (Occitan) */
+/** Norwegian (bokmål)‬ (‪norsk (bokmål)‬) */
+$messages['no'] = array(
+       'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
+);
+
+/** Occitan (occitan) */
 $messages['oc'] = array(
        'mainpagetext' => "'''MediaWiki es estat installat amb succès.'''",
        'mainpagedocfooter' => "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial.
@@ -13117,7 +13308,8 @@ $messages['pdc'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Eposchde-Lischt fer neie MediaWiki-Versione]",
 );
 
-/** Polish (Polski)
+/** Polish (polski)
+ * @author Beau
  * @author BeginaFelicysym
  * @author Holek
  * @author Saper
@@ -13292,7 +13484,7 @@ Nie może ona zawierać spacji.
 
 Jeśli korzystasz ze współdzielonego hostingu, dostawca usługi hostingowej może wymagać użycia konkretnej nazwy bazy danych lub pozwalać na tworzenie baz danych za pośrednictwem panelu użytkownika.',
        'config-db-name-oracle' => 'Nazwa schematu bazy danych:',
-       'config-db-account-oracle-warn' => 'Bazę danych Oracle można przygotować do pracy z MediaWIki na trzy sposoby:
+       'config-db-account-oracle-warn' => 'Bazę danych Oracle można przygotować do pracy z MediaWiki na trzy sposoby:
 
 Możesz utworzyć konto użytkownika bazy danych podczas instalacji MediaWiki. Wówczas należy podać nazwę i hasło użytkownika z rolą SYSDBA w celu użycia go przez instalator do utworzenia nowe konta użytkownika, z którego korzystać będzie MediaWiki.
 
@@ -14158,7 +14350,7 @@ $messages['ps'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce د مېډياويکي د برېښليکونو لړليک]',
 );
 
-/** Portuguese (Português)
+/** Portuguese (português)
  * @author Crazymadlover
  * @author Hamilton Abreu
  * @author Mormegil
@@ -14704,7 +14896,7 @@ Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]',
 );
 
-/** Brazilian Portuguese (Português do Brasil)
+/** Brazilian Portuguese (português do Brasil)
  * @author Giro720
  * @author Gustavo
  * @author Marcionunes
@@ -14815,7 +15007,7 @@ $messages['rgn'] = array(
        'mainpagetext' => "'''L'instalaziòn d'MediaWiki l'è andêda ben'''",
 );
 
-/** Romansh (Rumantsch)
+/** Romansh (rumantsch)
  * @author Gion-andri
  */
 $messages['rm'] = array(
@@ -14828,7 +15020,7 @@ $messages['rm'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Glista da mail da MediaWiki cun annunzias da novas versiuns]",
 );
 
-/** Romanian (Română)
+/** Romanian (română)
  * @author Minisarm
  * @author Stelistcristi
  */
@@ -14868,7 +15060,7 @@ $messages['ro'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]',
 );
 
-/** Tarandíne (Tarandíne)
+/** tarandíne (tarandíne)
  * @author Joetaras
  */
 $messages['roa-tara'] = array(
@@ -14882,7 +15074,7 @@ $messages['roa-tara'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste d'a poste de MediaWiki]",
 );
 
-/** Russian (Русский)
+/** Russian (русский)
  * @author Adata80
  * @author DCamer
  * @author Eleferen
@@ -15449,14 +15641,14 @@ $messages['rue'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розосыланя повідомлїнь про новы верзії MediaWiki]',
 );
 
-/** Sanskrit (संस्कृत)
+/** Sanskrit (संस्कृतम्)
  * @author Hemant wikikosh1
  */
 $messages['sa'] = array(
        'mainpagetext' => 'मीडियाविकि तु सफलतया अन्तःस्थापितमस्ति',
 );
 
-/** Sakha (Саха тыла) */
+/** Sakha (саха тыла) */
 $messages['sah'] = array(
        'mainpagetext' => "'''«MediaWiki» сөпкө туруорулунна.'''",
        'mainpagedocfooter' => 'Биики программатын туһунан [//meta.wikimedia.org/wiki/Help:Contents справочникка] көрүөххүн сөп.
@@ -15468,14 +15660,14 @@ $messages['sah'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki релизтарын почтовай испииһэгэ]',
 );
 
-/** Sardinian (Sardu)
+/** Sardinian (sardu)
  * @author Andria
  */
 $messages['sc'] = array(
        'mainpagetext' => "'''MediaWiki est stadu installadu in modu currègidu.'''",
 );
 
-/** Sicilian (Sicilianu) */
+/** Sicilian (sicilianu) */
 $messages['scn'] = array(
        'mainpagetext' => "'''Nstallazzioni di MediaWiki cumplitata currettamenti.'''",
        'mainpagedocfooter' => "Pi favuri taliari [//meta.wikimedia.org/wiki/Help:Contents Guida utenti] pi aiutu supra l'usu e la cunfigurazzioni di stu software wiki.
@@ -15516,7 +15708,7 @@ $messages['sei'] = array(
        'mainpagetext' => "'''MediaWiki coccebj installöx successua zo mii.'''",
 );
 
-/** Serbo-Croatian (Srpskohrvatski)
+/** Serbo-Croatian (srpskohrvatski / српскохрватски)
  * @author OC Ripper
  */
 $messages['sh'] = array(
@@ -15542,18 +15734,20 @@ $messages['shi'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Umuɣ n imsgdaln f imbḍitn n MidyaWiki]',
 );
 
-/** Sinhala (සිංහල) */
+/** Sinhala (සිංහල)
+ * @author Singhalawap
+ */
 $messages['si'] = array(
-       'mainpagetext' => "'''මà·\8fධà·\8aâ\80\8dයවිකි සාර්ථක ලෙස ස්ථාපනය කරන ලදි.'''",
+       'mainpagetext' => "'''මà·\93ඩà·\92යà·\8fවිකි සාර්ථක ලෙස ස්ථාපනය කරන ලදි.'''",
        'mainpagedocfooter' => 'විකි මෘදුකාංග භාවිතා කිරීම පිළිබඳ තොරතුරු සඳහා  [//meta.wikimedia.org/wiki/Help:Contents පරිශීලකයන් සඳහා නියමුව] හදාරන්න.
 
 == ඇරඹුම ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings à·\80à·\92නà·\8aâ\80\8dයà·\8fà·\83 à¶´à¶»à·\92à·\83à·\8aථà·\92තà·\93නà·\8a à¶½à·\90යà·\92à·\83à·\8aතà·\94à·\80]
-* [//www.mediawiki.org/wiki/Manual:FAQ à¶¸à·\8fධà·\8aâ\80\8dයà·\80à·\92à¶\9aà·\92 à¶±à·\92තර-à¶\85සන-පැන]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à¶¸à·\8fධà·\8aâ\80\8dයවිකි නිකුතුව තැපැල් ලැයිස්තුව]',
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings à·\80à·\92නà·\8aâ\80\8dයà·\8fà·\83 à·\83à·\90à¶\9aà·\83à·\94මà·\8a]
+* [//www.mediawiki.org/wiki/Manual:FAQ à¶¸à·\93ඩà·\92යà·\8fà·\80à·\92à¶\9aà·\92 à¶±à·\92තà·\92-à·\80à·\92මසන-පැන]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à¶¸à·\93ඩà·\92යà·\8fවිකි නිකුතුව තැපැල් ලැයිස්තුව]',
 );
 
-/** Slovak (Slovenčina) */
+/** Slovak (slovenčina) */
 $messages['sk'] = array(
        'mainpagetext' => "'''Softvér MediaWiki bol úspešne nainštalovaný.'''",
        'mainpagedocfooter' => 'Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].
@@ -15565,7 +15759,7 @@ $messages['sk'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list nových verzií MediaWiki]',
 );
 
-/** Slovenian (Slovenščina)
+/** Slovenian (slovenščina)
  * @author Dbc334
  */
 $messages['sl'] = array(
@@ -15806,7 +16000,7 @@ $messages['so'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Albanian (Shqip) */
+/** Albanian (shqip) */
 $messages['sq'] = array(
        'mainpagetext' => "'''MediaWiki software u instalua me sukses.'''",
        'mainpagedocfooter' => 'Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].
@@ -15817,7 +16011,7 @@ $messages['sq'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]',
 );
 
-/** Serbian (Cyrillic script) (‪Српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
  * @author Rancher
  */
 $messages['sr-ec'] = array(
@@ -15836,7 +16030,7 @@ $messages['sr-ec'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]',
 );
 
-/** Serbian (Latin script) (‪Srpski (latinica)‬) */
+/** Serbian (Latin script) (‪srpski (latinica)‬) */
 $messages['sr-el'] = array(
        'config-continue' => 'Nastavi →',
        'config-page-language' => 'Jezik',
@@ -15884,7 +16078,7 @@ $messages['su'] = array(
        'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.",
 );
 
-/** Swedish (Svenska)
+/** Swedish (svenska)
  * @author Skalman
  * @author WikiPhoenix
  */
@@ -16105,7 +16299,7 @@ $messages['te'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce మీడియావికీ సాఫ్టువేరు కొత్త వెర్షను విడుదలల గురించి తెలిపే మెయిలింగు లిస్టు]',
 );
 
-/** Tetum (Tetun)
+/** Tetum (tetun)
  * @author MF-Warburg
  */
 $messages['tet'] = array(
@@ -16113,7 +16307,7 @@ $messages['tet'] = array(
        'config-page-name' => 'Naran',
 );
 
-/** Tajik (Cyrillic script) (Тоҷикӣ) */
+/** Tajik (Cyrillic script) (тоҷикӣ) */
 $messages['tg-cyrl'] = array(
        'mainpagetext' => "'''Нармафзори МедиаВики бо муваффақият насб шуд.'''",
        'mainpagedocfooter' => 'Аз [//meta.wikimedia.org/wiki/Help:Contents Роҳнамои Корбарон] барои истифодаи нармафзори вики кӯмак бигиред.
@@ -16469,7 +16663,7 @@ $messages['tr'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]',
 );
 
-/** Tatar (Cyrillic script) (Татарча)
+/** Tatar (Cyrillic script) (татарча)
  * @author KhayR
  */
 $messages['tt-cyrl'] = array(
@@ -16482,7 +16676,7 @@ $messages['tt-cyrl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу].",
 );
 
-/** Tatar (Latin script) (Tatarça)
+/** Tatar (Latin script) (tatarça)
  * @author Don Alessandro
  */
 $messages['tt-latn'] = array(
@@ -16515,7 +16709,7 @@ $messages['ug-arab'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki تارقاتقان ئېلخەت تىزىملىكى]',
 );
 
-/** Ukrainian (Українська)
+/** Ukrainian (українська)
  * @author Ahonc
  * @author Alex Khimich
  * @author Diemon.ukr
@@ -16623,7 +16817,7 @@ $messages['ur'] = array(
        'mainpagetext' => "'''میڈیاوکی کو کامیابی سے چالو کردیا گیا ہے۔.'''",
 );
 
-/** Uzbek (O'zbek) */
+/** Uzbek (Oʻzbek) */
 $messages['uz'] = array(
        'mainpagetext' => "'''MediaWiki muvaffaqiyatli o'rnatildi.'''",
        'mainpagedocfooter' => "Wiki dasturini ishlatish haqida ma'lumot olish uchun  [//meta.wikimedia.org/wiki/Help:Contents Foydalanuvchi qo'llanmasi] sahifasiga murojaat qiling.
@@ -16635,7 +16829,7 @@ $messages['uz'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki yangi versiyasi chiqqanda xabar berish ro'yxati]",
 );
 
-/** Vèneto (Vèneto)
+/** vèneto (vèneto)
  * @author Vajotwo
  */
 $messages['vec'] = array(
@@ -16651,7 +16845,7 @@ I seguenti cołegamenti i xé en łengua inglese:
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]",
 );
 
-/** Veps (Vepsan kel')
+/** Veps (Vepsän kel’)
  * @author Игорь Бродский
  */
 $messages['vep'] = array(
@@ -16698,7 +16892,7 @@ $messages['vro'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-postilist, minka andas teedäq MediaWiki vahtsist kujõst].',
 );
 
-/** Walloon (Walon) */
+/** Walloon (walon) */
 $messages['wa'] = array(
        'mainpagetext' => "'''Li programe Wiki a stî astalé a l' idêye.'''",
 );
@@ -16807,7 +17001,7 @@ $messages['zea'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]",
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (‪中文(简体)‬)
  * @author Hydra
  * @author Hzy980512
  * @author PhiLiP
@@ -17248,7 +17442,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (‪中文(繁體)‬)
  * @author Hzy980512
  * @author Mark85296341
  */
@@ -17676,7 +17870,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]',
 );
 
-/** Chinese (Hong Kong) (‪中文(香港)‬)
+/** Chinese (Hong Kong) (‪中文(香港)‬)
  * @author Mark85296341
  */
 $messages['zh-hk'] = array(
@@ -17688,7 +17882,7 @@ $messages['zh-hk'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]',
 );
 
-/** Chinese (Taiwan) (‪中文(台灣)‬) */
+/** Chinese (Taiwan) (‪中文(台灣)‬) */
 $messages['zh-tw'] = array(
        'mainpagedocfooter' => '請參閱 [//meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以獲得使用此 wiki 軟體的訊息!
 
index b380787..12a84a1 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
@@ -1592,6 +1607,8 @@ abstract class Installer {
 
                // Don't access the database
                $GLOBALS['wgUseDatabaseMessages'] = false;
+               // Don't cache langconv tables
+               $GLOBALS['wgLanguageConverterCacheType'] = CACHE_NONE;
                // Debug-friendly
                $GLOBALS['wgShowExceptionDetails'] = true;
                // Don't break forms
index 89154e5..bbc6b64 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
  */
  */
 class LocalSettingsGenerator {
 
-       private $extensions = array();
-       private $values = array();
-       private $groupPermissions = array();
-       private $dbSettings = '';
-       private $safeMode = false;
+       protected $extensions = array();
+       protected $values = array();
+       protected $groupPermissions = array();
+       protected $dbSettings = '';
+       protected $safeMode = false;
 
        /**
         * @var Installer
         */
-       private $installer;
+       protected $installer;
 
        /**
         * Constructor.
@@ -151,7 +166,7 @@ class LocalSettingsGenerator {
        /**
         * @return String
         */
-       private function buildMemcachedServerList() {
+       protected function buildMemcachedServerList() {
                $servers = $this->values['_MemCachedServers'];
 
                if( !$servers ) {
@@ -172,7 +187,7 @@ class LocalSettingsGenerator {
        /**
         * @return String
         */
-       private function getDefaultText() {
+       protected function getDefaultText() {
                if( !$this->values['wgImageMagickConvertCommand'] ) {
                        $this->values['wgImageMagickConvertCommand'] = '/usr/bin/convert';
                        $magic = '#';
@@ -244,7 +259,8 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 {$metaNamespace}
 ## The URL base path to the directory containing the wiki;
 ## defaults for all runtime URL paths are based off of this.
-## For more information on customizing the URLs please see:
+## For more information on customizing the URLs
+## (like /w/index.php/Page_title to /wiki/Page_title) please see:
 ## http://www.mediawiki.org/wiki/Manual:Short_URL
 \$wgScriptPath       = \"{$this->values['wgScriptPath']}\";
 \$wgScriptExtension  = \"{$this->values['wgScriptExtension']}\";
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 0d27c5a..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')" ),
@@ -185,9 +201,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'changeNullableField', 'oldimage', 'oi_timestamp',  'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_major_mime', 'NULL' ),
                        array( 'changeNullableField', 'oldimage', 'oi_minor_mime', 'NULL' ),
-                       array( 'setDefault', 'image', 'img_metadata', '\'\x\'::bytea'),
                        array( 'changeNullableField', 'image', 'img_metadata', 'NOT NULL'),
-                       array( 'setDefault', 'filearchive', 'fa_metadata', '\'\x\'::bytea'),
                        array( 'changeNullableField', 'filearchive', 'fa_metadata', 'NOT NULL'),
                        array( 'changeNullableField', 'recentchanges', 'rc_cur_id', 'NULL' ),
 
@@ -196,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)' ),
@@ -292,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..4f31195 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
  */
@@ -146,7 +161,7 @@ class WebInstaller extends Installer {
                                'Content-Disposition: attachment; filename="LocalSettings.php"'
                        );
 
-                       $ls = new LocalSettingsGenerator( $this );
+                       $ls = InstallerOverrides::getLocalSettingsGenerator( $this );
                        $rightsProfile = $this->rightsProfiles[$this->getVar( '_RightsProfile' )];
                        foreach( $rightsProfile as $group => $rightsArr ) {
                                $ls->setGroupRights( $group, $rightsArr );
index fdc1746..aabc1f3 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
  */
@@ -101,9 +116,15 @@ class WebInstallerOutput {
                // by '../skins/$skinName/images/', where $skinName is what appears
                // before the last '/' in each of the strings.
                $cssFileNames = array(
-                       "common/shared.css",
-                       "vector/screen.css",
-                       "common/config.css",
+
+                       // Basically the "skins.vector" ResourceLoader module styles
+                       'common/commonElements.css',
+                       'common/commonContent.css',
+                       'common/commonInterface.css',
+                       'vector/screen.css',
+
+                       // mw-config specific
+                       'common/config.css',
                );
 
                $css = '';
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..eacf9a8 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
  */
 
 /**
@@ -42,7 +58,7 @@ class Interwiki {
         * Fetch an Interwiki object
         *
         * @param $prefix String: interwiki prefix to use
-        * @return Interwiki Object, or null if not valid
+        * @return Interwiki|null|bool
         */
        static public function fetch( $prefix ) {
                global $wgContLang;
@@ -165,7 +181,7 @@ class Interwiki {
 
                $db = wfGetDB( DB_SLAVE );
 
-               $row = $db->fetchRow( $db->select( 'interwiki', '*', array( 'iw_prefix' => $prefix ),
+               $row = $db->fetchRow( $db->select( 'interwiki', self::selectFields(), array( 'iw_prefix' => $prefix ),
                        __METHOD__ ) );
                $iw = Interwiki::loadFromArray( $row );
                if ( $iw ) {
@@ -289,7 +305,7 @@ class Interwiki {
                }
 
                $res = $db->select( 'interwiki',
-                       array( 'iw_prefix', 'iw_url', 'iw_api', 'iw_wikiid', 'iw_local', 'iw_trans' ),
+                       self::selectFields(),
                        $where, __METHOD__, array( 'ORDER BY' => 'iw_prefix' )
                );
                $retval = array();
@@ -390,4 +406,20 @@ class Interwiki {
                $msg = wfMessage( 'interwiki-desc-' . $this->mPrefix )->inContentLanguage();
                return !$msg->exists() ? '' : $msg;
        }
+
+       /**
+        * Return the list of interwiki fields that should be selected to create
+        * a new interwiki object.
+        * @return array
+        */
+       public static function selectFields() {
+               return array(
+                       'iw_prefix',
+                       'iw_url',
+                       'iw_api',
+                       'iw_wikiid',
+                       'iw_local',
+                       'iw_trans'
+               );
+       }
 }
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
  */
diff --git a/includes/job/Job.php b/includes/job/Job.php
new file mode 100644 (file)
index 0000000..7b7ec0c
--- /dev/null
@@ -0,0 +1,447 @@
+<?php
+/**
+ * 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
+ */
+
+/**
+ * Class to both describe a background job and handle jobs.
+ *
+ * @ingroup JobQueue
+ */
+abstract class Job {
+
+       /**
+        * @var Title
+        */
+       var $title;
+
+       var $command,
+               $params,
+               $id,
+               $removeDuplicates,
+               $error;
+
+       /*-------------------------------------------------------------------------
+        * Abstract functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * Run the job
+        * @return boolean success
+        */
+       abstract function run();
+
+       /*-------------------------------------------------------------------------
+        * Static functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * Pop a job of a certain type.  This tries less hard than pop() to
+        * actually find a job; it may be adversely affected by concurrent job
+        * runners.
+        *
+        * @param $type string
+        *
+        * @return Job
+        */
+       static function pop_type( $type ) {
+               wfProfilein( __METHOD__ );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->begin( __METHOD__ );
+
+               $row = $dbw->selectRow(
+                       'job',
+                       '*',
+                       array( 'job_cmd' => $type ),
+                       __METHOD__,
+                       array( 'LIMIT' => 1, 'FOR UPDATE' )
+               );
+
+               if ( $row === false ) {
+                       $dbw->commit( __METHOD__ );
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               /* Ensure we "own" this row */
+               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+               $affected = $dbw->affectedRows();
+               $dbw->commit( __METHOD__ );
+
+               if ( $affected == 0 ) {
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               wfIncrStats( 'job-pop' );
+               $namespace = $row->job_namespace;
+               $dbkey = $row->job_title;
+               $title = Title::makeTitleSafe( $namespace, $dbkey );
+               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
+                       $row->job_id );
+
+               $job->removeDuplicates();
+
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * Pop a job off the front of the queue
+        *
+        * @param $offset Integer: Number of jobs to skip
+        * @return Job or false if there's no jobs
+        */
+       static function pop( $offset = 0 ) {
+               wfProfileIn( __METHOD__ );
+
+               $dbr = wfGetDB( DB_SLAVE );
+
+               /* Get a job from the slave, start with an offset,
+                       scan full set afterwards, avoid hitting purged rows
+
+                       NB: If random fetch previously was used, offset
+                               will always be ahead of few entries
+               */
+
+               $conditions = self::defaultQueueConditions();
+
+               $offset = intval( $offset );
+               $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
+
+               $row = $dbr->selectRow( 'job', '*',
+                       array_merge( $conditions, array( "job_id >= $offset" ) ),
+                       __METHOD__,
+                       $options
+               );
+
+               // Refetching without offset is needed as some of job IDs could have had delayed commits
+               // and have lower IDs than jobs already executed, blame concurrency :)
+               //
+               if ( $row === false ) {
+                       if ( $offset != 0 ) {
+                               $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
+                       }
+
+                       if ( $row === false ) {
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // Try to delete it from the master
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+               $affected = $dbw->affectedRows();
+               $dbw->commit( __METHOD__ );
+
+               if ( !$affected ) {
+                       // Failed, someone else beat us to it
+                       // Try getting a random row
+                       $row = $dbw->selectRow( 'job', array( 'MIN(job_id) as minjob',
+                               'MAX(job_id) as maxjob' ), '1=1', __METHOD__ );
+                       if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
+                               // No jobs to get
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       // Get the random row
+                       $row = $dbw->selectRow( 'job', '*',
+                               'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
+                       if ( $row === false ) {
+                               // Random job gone before we got the chance to select it
+                               // Give up
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+                       // Delete the random row
+                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+                       $affected = $dbw->affectedRows();
+                       $dbw->commit( __METHOD__ );
+
+                       if ( !$affected ) {
+                               // Random job gone before we exclusively deleted it
+                               // Give up
+                               wfProfileOut( __METHOD__ );
+                               return false;
+                       }
+               }
+
+               // If execution got to here, there's a row in $row that has been deleted from the database
+               // by this thread. Hence the concurrent pop was successful.
+               wfIncrStats( 'job-pop' );
+               $namespace = $row->job_namespace;
+               $dbkey = $row->job_title;
+               $title = Title::makeTitleSafe( $namespace, $dbkey );
+
+               if ( is_null( $title ) ) {
+                       wfProfileOut( __METHOD__ );
+                       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
+               $job->removeDuplicates();
+
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * Create the appropriate object to handle a specific job
+        *
+        * @param $command String: Job command
+        * @param $title Title: Associated title
+        * @param $params Array: Job parameters
+        * @param $id Int: Job identifier
+        * @return Job
+        */
+       static function factory( $command, Title $title, $params = false, $id = 0 ) {
+               global $wgJobClasses;
+               if( isset( $wgJobClasses[$command] ) ) {
+                       $class = $wgJobClasses[$command];
+                       return new $class( $title, $params, $id );
+               }
+               throw new MWException( "Invalid job command `{$command}`" );
+       }
+
+       /**
+        * @param $params
+        * @return string
+        */
+       static function makeBlob( $params ) {
+               if ( $params !== false ) {
+                       return serialize( $params );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param $blob
+        * @return bool|mixed
+        */
+       static function extractBlob( $blob ) {
+               if ( (string)$blob !== '' ) {
+                       return unserialize( $blob );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Batch-insert a group of jobs into the queue.
+        * This will be wrapped in a transaction with a forced commit.
+        *
+        * This may add duplicate at insert time, but they will be
+        * removed later on, when the first one is popped.
+        *
+        * @param $jobs array of Job objects
+        */
+       static function batchInsert( $jobs ) {
+               if ( !count( $jobs ) ) {
+                       return;
+               }
+               $dbw = wfGetDB( DB_MASTER );
+               $rows = array();
+
+               /**
+                * @var $job Job
+                */
+               foreach ( $jobs as $job ) {
+                       $rows[] = $job->insertFields();
+                       if ( count( $rows ) >= 50 ) {
+                               # Do a small transaction to avoid slave lag
+                               $dbw->begin( __METHOD__ );
+                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                               $dbw->commit( __METHOD__ );
+                               $rows = array();
+                       }
+               }
+               if ( $rows ) { // last chunk
+                       $dbw->begin( __METHOD__ );
+                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                       $dbw->commit( __METHOD__ );
+               }
+               wfIncrStats( 'job-insert', count( $jobs ) );
+       }
+
+       /**
+        * Insert a group of jobs into the queue.
+        *
+        * Same as batchInsert() but does not commit and can thus
+        * be rolled-back as part of a larger transaction. However,
+        * large batches of jobs can cause slave lag.
+        *
+        * @param $jobs array of Job objects
+        */
+       static function safeBatchInsert( $jobs ) {
+               if ( !count( $jobs ) ) {
+                       return;
+               }
+               $dbw = wfGetDB( DB_MASTER );
+               $rows = array();
+               foreach ( $jobs as $job ) {
+                       $rows[] = $job->insertFields();
+                       if ( count( $rows ) >= 500 ) {
+                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+                               $rows = array();
+                       }
+               }
+               if ( $rows ) { // last chunk
+                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
+               }
+               wfIncrStats( 'job-insert', count( $jobs ) );
+       }
+
+
+       /**
+        * SQL conditions to apply on most JobQueue queries
+        *
+        * Whenever we exclude jobs types from the default queue, we want to make
+        * sure that queries to the job queue actually ignore them.
+        *
+        * @return array SQL conditions suitable for Database:: methods
+        */
+       static function defaultQueueConditions( ) {
+               global $wgJobTypesExcludedFromDefaultQueue;
+               $conditions = array();
+               if ( count( $wgJobTypesExcludedFromDefaultQueue ) > 0 ) {
+                       $dbr = wfGetDB( DB_SLAVE );
+                       foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
+                               $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
+                       }
+               }
+               return $conditions;
+       }
+
+       /*-------------------------------------------------------------------------
+        * Non-static functions
+        *------------------------------------------------------------------------*/
+
+       /**
+        * @param $command
+        * @param $title
+        * @param $params array
+        * @param int $id
+        */
+       function __construct( $command, $title, $params = false, $id = 0 ) {
+               $this->command = $command;
+               $this->title = $title;
+               $this->params = $params;
+               $this->id = $id;
+
+               // A bit of premature generalisation
+               // Oh well, the whole class is premature generalisation really
+               $this->removeDuplicates = true;
+       }
+
+       /**
+        * Insert a single job into the queue.
+        * @return bool true on success
+        */
+       function insert() {
+               $fields = $this->insertFields();
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               if ( $this->removeDuplicates ) {
+                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
+                       if ( $dbw->numRows( $res ) ) {
+                               return true;
+                       }
+               }
+               wfIncrStats( 'job-insert' );
+               return $dbw->insert( 'job', $fields, __METHOD__ );
+       }
+
+       /**
+        * @return array
+        */
+       protected function insertFields() {
+               $dbw = wfGetDB( DB_MASTER );
+               return array(
+                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_cmd' => $this->command,
+                       'job_namespace' => $this->title->getNamespace(),
+                       'job_title' => $this->title->getDBkey(),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_params' => Job::makeBlob( $this->params )
+               );
+       }
+
+       /**
+        * Remove jobs in the job queue which are duplicates of this job.
+        * This is deadlock-prone and so starts its own transaction.
+        */
+       function removeDuplicates() {
+               if ( !$this->removeDuplicates ) {
+                       return;
+               }
+
+               $fields = $this->insertFields();
+               unset( $fields['job_id'] );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+               $dbw->delete( 'job', $fields, __METHOD__ );
+               $affected = $dbw->affectedRows();
+               $dbw->commit( __METHOD__ );
+               if ( $affected ) {
+                       wfIncrStats( 'job-dup-delete', $affected );
+               }
+       }
+
+       /**
+        * @return string
+        */
+       function toString() {
+               $paramString = '';
+               if ( $this->params ) {
+                       foreach ( $this->params as $key => $value ) {
+                               if ( $paramString != '' ) {
+                                       $paramString .= ' ';
+                               }
+                               $paramString .= "$key=$value";
+                       }
+               }
+
+               if ( is_object( $this->title ) ) {
+                       $s = "{$this->command} " . $this->title->getPrefixedDBkey();
+                       if ( $paramString !== '' ) {
+                               $s .= ' ' . $paramString;
+                       }
+                       return $s;
+               } else {
+                       return "{$this->command} $paramString";
+               }
+       }
+
+       protected function setLastError( $error ) {
+               $this->error = $error;
+       }
+
+       function getLastError() {
+               return $this->error;
+       }
+}
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
deleted file mode 100644 (file)
index ac70dcb..0000000
+++ /dev/null
@@ -1,413 +0,0 @@
-<?php
-/**
- * Job queue base code
- *
- * @file
- * @defgroup JobQueue JobQueue
- */
-
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( "This file is part of MediaWiki, it is not a valid entry point\n" );
-}
-
-/**
- * Class to both describe a background job and handle jobs.
- *
- * @ingroup JobQueue
- */
-abstract class Job {
-
-       /**
-        * @var Title
-        */
-       var $title;
-
-       var $command,
-               $params,
-               $id,
-               $removeDuplicates,
-               $error;
-
-       /*-------------------------------------------------------------------------
-        * Abstract functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * Run the job
-        * @return boolean success
-        */
-       abstract function run();
-
-       /*-------------------------------------------------------------------------
-        * Static functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * Pop a job of a certain type.  This tries less hard than pop() to
-        * actually find a job; it may be adversely affected by concurrent job
-        * runners.
-        *
-        * @param $type string
-        *
-        * @return Job
-        */
-       static function pop_type( $type ) {
-               wfProfilein( __METHOD__ );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $dbw->begin( __METHOD__ );
-
-               $row = $dbw->selectRow(
-                       'job',
-                       '*',
-                       array( 'job_cmd' => $type ),
-                       __METHOD__,
-                       array( 'LIMIT' => 1, 'FOR UPDATE' )
-               );
-
-               if ( $row === false ) {
-                       $dbw->commit( __METHOD__ );
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               /* Ensure we "own" this row */
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( $affected == 0 ) {
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-               $job = Job::factory( $row->job_cmd, $title, Job::extractBlob( $row->job_params ),
-                       $row->job_id );
-
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
-       /**
-        * Pop a job off the front of the queue
-        *
-        * @param $offset Integer: Number of jobs to skip
-        * @return Job or false if there's no jobs
-        */
-       static function pop( $offset = 0 ) {
-               global $wgJobTypesExcludedFromDefaultQueue;
-               wfProfileIn( __METHOD__ );
-
-               $dbr = wfGetDB( DB_SLAVE );
-
-               /* Get a job from the slave, start with an offset,
-                       scan full set afterwards, avoid hitting purged rows
-
-                       NB: If random fetch previously was used, offset
-                               will always be ahead of few entries
-               */
-               $conditions = array();
-               if ( count( $wgJobTypesExcludedFromDefaultQueue ) != 0 ) {
-                       foreach ( $wgJobTypesExcludedFromDefaultQueue as $cmdType ) {
-                               $conditions[] = "job_cmd != " . $dbr->addQuotes( $cmdType );
-                       }
-               }
-               $offset = intval( $offset );
-               $options = array( 'ORDER BY' => 'job_id', 'USE INDEX' => 'PRIMARY' );
-
-               $row = $dbr->selectRow( 'job', '*',
-                       array_merge( $conditions, array( "job_id >= $offset" ) ),
-                       __METHOD__,
-                       $options
-               );
-
-               // Refetching without offset is needed as some of job IDs could have had delayed commits
-               // and have lower IDs than jobs already executed, blame concurrency :)
-               //
-               if ( $row === false ) {
-                       if ( $offset != 0 ) {
-                               $row = $dbr->selectRow( 'job', '*', $conditions, __METHOD__, $options );
-                       }
-
-                       if ( $row === false ) {
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // Try to delete it from the master
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-
-               if ( !$affected ) {
-                       // Failed, someone else beat us to it
-                       // Try getting a random row
-                       $row = $dbw->selectRow( 'job', array( 'MIN(job_id) as minjob',
-                               'MAX(job_id) as maxjob' ), '1=1', __METHOD__ );
-                       if ( $row === false || is_null( $row->minjob ) || is_null( $row->maxjob ) ) {
-                               // No jobs to get
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Get the random row
-                       $row = $dbw->selectRow( 'job', '*',
-                               'job_id >= ' . mt_rand( $row->minjob, $row->maxjob ), __METHOD__ );
-                       if ( $row === false ) {
-                               // Random job gone before we got the chance to select it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-                       // Delete the random row
-                       $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
-                       $affected = $dbw->affectedRows();
-                       $dbw->commit( __METHOD__ );
-
-                       if ( !$affected ) {
-                               // Random job gone before we exclusively deleted it
-                               // Give up
-                               wfProfileOut( __METHOD__ );
-                               return false;
-                       }
-               }
-
-               // If execution got to here, there's a row in $row that has been deleted from the database
-               // by this thread. Hence the concurrent pop was successful.
-               wfIncrStats( 'job-pop' );
-               $namespace = $row->job_namespace;
-               $dbkey = $row->job_title;
-               $title = Title::makeTitleSafe( $namespace, $dbkey );
-               $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
-               $job->removeDuplicates();
-
-               wfProfileOut( __METHOD__ );
-               return $job;
-       }
-
-       /**
-        * Create the appropriate object to handle a specific job
-        *
-        * @param $command String: Job command
-        * @param $title Title: Associated title
-        * @param $params Array: Job parameters
-        * @param $id Int: Job identifier
-        * @return Job
-        */
-       static function factory( $command, $title, $params = false, $id = 0 ) {
-               global $wgJobClasses;
-               if( isset( $wgJobClasses[$command] ) ) {
-                       $class = $wgJobClasses[$command];
-                       return new $class( $title, $params, $id );
-               }
-               throw new MWException( "Invalid job command `{$command}`" );
-       }
-
-       /**
-        * @param $params
-        * @return string
-        */
-       static function makeBlob( $params ) {
-               if ( $params !== false ) {
-                       return serialize( $params );
-               } else {
-                       return '';
-               }
-       }
-
-       /**
-        * @param $blob
-        * @return bool|mixed
-        */
-       static function extractBlob( $blob ) {
-               if ( (string)$blob !== '' ) {
-                       return unserialize( $blob );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Batch-insert a group of jobs into the queue.
-        * This will be wrapped in a transaction with a forced commit.
-        *
-        * This may add duplicate at insert time, but they will be
-        * removed later on, when the first one is popped.
-        *
-        * @param $jobs array of Job objects
-        */
-       static function batchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-
-               /**
-                * @var $job Job
-                */
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 50 ) {
-                               # Do a small transaction to avoid slave lag
-                               $dbw->begin( __METHOD__ );
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $dbw->commit( __METHOD__ );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->begin( __METHOD__ );
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                       $dbw->commit( __METHOD__ );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
-       }
-
-       /**
-        * Insert a group of jobs into the queue.
-        *
-        * Same as batchInsert() but does not commit and can thus
-        * be rolled-back as part of a larger transaction. However,
-        * large batches of jobs can cause slave lag.
-        *
-        * @param $jobs array of Job objects
-        */
-       static function safeBatchInsert( $jobs ) {
-               if ( !count( $jobs ) ) {
-                       return;
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $rows = array();
-               foreach ( $jobs as $job ) {
-                       $rows[] = $job->insertFields();
-                       if ( count( $rows ) >= 500 ) {
-                               $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-                               $rows = array();
-                       }
-               }
-               if ( $rows ) { // last chunk
-                       $dbw->insert( 'job', $rows, __METHOD__, 'IGNORE' );
-               }
-               wfIncrStats( 'job-insert', count( $jobs ) );
-       }
-
-       /*-------------------------------------------------------------------------
-        * Non-static functions
-        *------------------------------------------------------------------------*/
-
-       /**
-        * @param $command
-        * @param $title
-        * @param $params array
-        * @param int $id
-        */
-       function __construct( $command, $title, $params = false, $id = 0 ) {
-               $this->command = $command;
-               $this->title = $title;
-               $this->params = $params;
-               $this->id = $id;
-
-               // A bit of premature generalisation
-               // Oh well, the whole class is premature generalisation really
-               $this->removeDuplicates = true;
-       }
-
-       /**
-        * Insert a single job into the queue.
-        * @return bool true on success
-        */
-       function insert() {
-               $fields = $this->insertFields();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( $this->removeDuplicates ) {
-                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
-                       if ( $dbw->numRows( $res ) ) {
-                               return true;
-                       }
-               }
-               wfIncrStats( 'job-insert' );
-               return $dbw->insert( 'job', $fields, __METHOD__ );
-       }
-
-       /**
-        * @return array
-        */
-       protected function insertFields() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
-                       'job_cmd' => $this->command,
-                       'job_namespace' => $this->title->getNamespace(),
-                       'job_title' => $this->title->getDBkey(),
-                       'job_timestamp' => $dbw->timestamp(),
-                       'job_params' => Job::makeBlob( $this->params )
-               );
-       }
-
-       /**
-        * Remove jobs in the job queue which are duplicates of this job.
-        * This is deadlock-prone and so starts its own transaction.
-        */
-       function removeDuplicates() {
-               if ( !$this->removeDuplicates ) {
-                       return;
-               }
-
-               $fields = $this->insertFields();
-               unset( $fields['job_id'] );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-               $dbw->delete( 'job', $fields, __METHOD__ );
-               $affected = $dbw->affectedRows();
-               $dbw->commit( __METHOD__ );
-               if ( $affected ) {
-                       wfIncrStats( 'job-dup-delete', $affected );
-               }
-       }
-
-       /**
-        * @return string
-        */
-       function toString() {
-               $paramString = '';
-               if ( $this->params ) {
-                       foreach ( $this->params as $key => $value ) {
-                               if ( $paramString != '' ) {
-                                       $paramString .= ' ';
-                               }
-                               $paramString .= "$key=$value";
-                       }
-               }
-
-               if ( is_object( $this->title ) ) {
-                       $s = "{$this->command} " . $this->title->getPrefixedDBkey();
-                       if ( $paramString !== '' ) {
-                               $s .= ' ' . $paramString;
-                       }
-                       return $s;
-               } else {
-                       return "{$this->command} $paramString";
-               }
-       }
-
-       protected function setLastError( $error ) {
-               $this->error = $error;
-       }
-
-       function getLastError() {
-               return $this->error;
-       }
-}
index 1aa206f..7ccf00d 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
  */
@@ -46,8 +61,10 @@ class RefreshLinksJob extends Job {
                $parserOutput = $wgParser->parse( $revision->getText(), $this->title, $options, true, true, $revision->getId() );
                wfProfileOut( __METHOD__.'-parse' );
                wfProfileIn( __METHOD__.'-update' );
-               $update = new LinksUpdate( $this->title, $parserOutput, false );
-               $update->doUpdate();
+
+               $updates = $parserOutput->getSecondaryDataUpdates( $this->title, false );
+               DataUpdate::runUpdates( $updates );
+
                wfProfileOut( __METHOD__.'-update' );
                wfProfileOut( __METHOD__ );
                return true;
@@ -118,8 +135,10 @@ class RefreshLinksJob2 extends Job {
                        $parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
                        wfProfileOut( __METHOD__.'-parse' );
                        wfProfileIn( __METHOD__.'-update' );
-                       $update = new LinksUpdate( $title, $parserOutput, false );
-                       $update->doUpdate();
+
+                       $updates = $parserOutput->getSecondaryDataUpdates( $title, false );
+                       DataUpdate::runUpdates( $updates );
+
                        wfProfileOut( __METHOD__.'-update' );
                        wfWaitForSlaves();
                }
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..cae3f12 100644 (file)
@@ -1,14 +1,25 @@
 <?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
  */
 
-if ( !defined( 'MEDIAWIKI' ) ) {
-       die( 1 );
-}
-
 require_once dirname( __FILE__ ) . '/Services_JSON.php';
 
 /**
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..fc75cdc 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 */
@@ -150,6 +152,13 @@ class CSSMin {
                                $offset = $match[0][1] + strlen( $match[0][0] ) + $lengthIncrease;
                                continue;
                        }
+
+                       // Guard against double slashes, because "some/remote/../foo.png"
+                       // resolves to "some/remote/foo.png" on (some?) clients (bug 27052).
+                       if ( substr( $remote, -1 ) == '/' ) {
+                               $remote = substr( $remote, 0, -1 );
+                       }
+
                        // Shortcuts
                        $embed = $match['embed'][0];
                        $pre = $match['pre'][0];
@@ -157,10 +166,9 @@ class CSSMin {
                        $query = $match['query'][0];
                        $url = "{$remote}/{$match['file'][0]}";
                        $file = "{$local}/{$match['file'][0]}";
-                       // bug 27052 - Guard against double slashes, because foo//../bar
-                       // apparently resolves to foo/bar on (some?) clients
-                       $url = preg_replace( '#([^:])//+#', '\1/', $url );
+
                        $replacement = false;
+
                        if ( $local !== false && file_exists( $file ) ) {
                                // Add version parameter as a time-stamp in ISO 8601 format,
                                // using Z for the timezone, meaning GMT
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..ff5fc8a 100644 (file)
  * @file
  */
 
-class LogEventsList {
+class LogEventsList extends ContextSource {
        const NO_ACTION_LINK = 1;
        const NO_EXTRA_USER_LINKS = 2;
+       const USE_REVDEL_CHECKBOXES = 4;
 
-       /**
-        * @var Skin
-        */
-       private $skin;
-
-       /**
-        * @var OutputPage
-        */
-       private $out;
        public $flags;
 
        /**
@@ -48,13 +40,38 @@ class LogEventsList {
         */
        protected $mDefaultQuery;
 
-       public function __construct( $skin, $out, $flags = 0 ) {
-               $this->skin = $skin;
-               $this->out = $out;
+       /**
+        * Constructor.
+        * The first two parameters used to be $skin and $out, but now only a context
+        * is needed, that's why there's a second unused parameter.
+        *
+        * @param $context IContextSource Context to use; formerly it was Skin object.
+        * @param $unused void Unused; used to be an OutputPage object.
+        * @param $flags int flags; can be a combinaison of self::NO_ACTION_LINK,
+        *        self::NO_EXTRA_USER_LINKS or self::USE_REVDEL_CHECKBOXES.
+        */
+       public function __construct( $context, $unused = null, $flags = 0 ) {
+               if ( $context instanceof IContextSource ) {
+                       $this->setContext( $context );
+               } else {
+                       // Old parameters, $context should be a Skin object
+                       $this->setContext( $context->getContext() );
+               }
+
                $this->flags = $flags;
                $this->preCacheMessages();
        }
 
+       /**
+        * Deprecated alias for getTitle(); do not use.
+        *
+        * @deprecated in 1.20; use getTitle() instead.
+        * @return Title object
+        */
+       public function getDisplayTitle() {
+               return $this->getTitle();
+       }
+
        /**
         * As we use the same small set of messages in various methods and that
         * they are called often, we call them once and save them in $this->message
@@ -66,7 +83,7 @@ class LogEventsList {
                                'revertmove', 'undeletelink', 'undeleteviewlink', 'revdel-restore', 'hist', 'diff',
                                'pipe-separator', 'revdel-restore-deleted', 'revdel-restore-visible' );
                        foreach( $messages as $msg ) {
-                               $this->message[$msg] = wfMsgExt( $msg, array( 'escapenoentities' ) );
+                               $this->message[$msg] = $this->msg( $msg )->escaped();
                        }
                }
        }
@@ -80,12 +97,13 @@ class LogEventsList {
                wfDeprecated( __METHOD__, '1.19' );
                // If only one log type is used, then show a special message...
                $headerType = (count($type) == 1) ? $type[0] : '';
+               $out = $this->getOutput();
                if( LogPage::isLogType( $headerType ) ) {
                        $page = new LogPage( $headerType );
-                       $this->out->setPageTitle( $page->getName()->text() );
-                       $this->out->addHTML( $page->getDescription()->parseAsBlock() );
+                       $out->setPageTitle( $page->getName()->text() );
+                       $out->addHTML( $page->getDescription()->parseAsBlock() );
                } else {
-                       $this->out->addHTML( wfMsgExt('alllogstext',array('parseinline')) );
+                       $out->addHTML( $this->msg( 'alllogstext' )->parse() );
                }
        }
 
@@ -105,16 +123,14 @@ class LogEventsList {
                $month = '', $filter = null, $tagFilter='' ) {
                global $wgScript, $wgMiserMode;
 
-               $action = $wgScript;
                $title = SpecialPage::getTitleFor( 'Log' );
-               $special = $title->getPrefixedDBkey();
 
                // For B/C, we take strings, but make sure they are converted...
                $types = ($types === '') ? array() : (array)$types;
 
                $tagSelector = ChangeTags::buildTagFilterSelector( $tagFilter );
 
-               $html = Html::hidden( 'title', $special );
+               $html = Html::hidden( 'title', $title->getPrefixedDBkey() );
 
                // Basic selectors
                $html .= $this->getTypeMenu( $types ) . "\n";
@@ -141,15 +157,15 @@ class LogEventsList {
                }
 
                // Submit button
-               $html .= Xml::submitButton( wfMsg( 'allpagessubmit' ) );
+               $html .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
 
                // Fieldset
-               $html = Xml::fieldset( wfMsg( 'log' ), $html );
+               $html = Xml::fieldset( $this->msg( 'log' )->text(), $html );
 
                // Form wrapping
-               $html = Xml::tags( 'form', array( 'action' => $action, 'method' => 'get' ), $html );
+               $html = Xml::tags( 'form', array( 'action' => $wgScript, 'method' => 'get' ), $html );
 
-               $this->out->addHTML( $html );
+               $this->getOutput()->addHTML( $html );
        }
 
        /**
@@ -157,9 +173,8 @@ class LogEventsList {
         * @return String: Formatted HTML
         */
        private function getFilterLinks( $filter ) {
-               global $wgLang;
                // show/hide links
-               $messages = array( wfMsgHtml( 'show' ), wfMsgHtml( 'hide' ) );
+               $messages = array( $this->msg( 'show' )->escaped(), $this->msg( 'hide' )->escaped() );
                // Option value -> message mapping
                $links = array();
                $hiddens = ''; // keep track for "go" button
@@ -172,26 +187,23 @@ class LogEventsList {
                        $hideVal = 1 - intval($val);
                        $query[$queryKey] = $hideVal;
 
-                       $link = Linker::link(
+                       $link = Linker::linkKnown(
                                $this->getDisplayTitle(),
                                $messages[$hideVal],
                                array(),
-                               $query,
-                               array( 'known', 'noclasses' )
+                               $query
                        );
 
-                       $links[$type] = wfMsgHtml( "log-show-hide-{$type}", $link );
+                       $links[$type] = $this->msg( "log-show-hide-{$type}" )->rawParams( $link )->escaped();
                        $hiddens .= Html::hidden( "hide_{$type}_log", $val ) . "\n";
                }
                // Build links
-               return '<small>'.$wgLang->pipeList( $links ) . '</small>' . $hiddens;
+               return '<small>'.$this->getLanguage()->pipeList( $links ) . '</small>' . $hiddens;
        }
 
        private function getDefaultQuery() {
-               global $wgRequest;
-
                if ( !isset( $this->mDefaultQuery ) ) {
-                       $this->mDefaultQuery = $wgRequest->getQueryValues();
+                       $this->mDefaultQuery = $this->getRequest()->getQueryValues();
                        unset( $this->mDefaultQuery['title'] );
                        unset( $this->mDefaultQuery['dir'] );
                        unset( $this->mDefaultQuery['offset'] );
@@ -203,20 +215,6 @@ class LogEventsList {
                return $this->mDefaultQuery;
        }
 
-       /**
-        * Get the Title object of the page the links should point to.
-        * This is NOT the Title of the page the entries should be restricted to.
-        *
-        * @return Title object
-        */
-       public function getDisplayTitle() {
-               return $this->out->getTitle();
-       }
-
-       public function getContext() {
-               return $this->out->getContext();
-       }
-
        /**
         * @param $queryTypes Array
         * @return String: Formatted HTML
@@ -234,14 +232,12 @@ class LogEventsList {
         * @since 1.19
         */
        public function getTypeSelector() {
-               global $wgUser;
-
                $typesByName = array(); // Temporary array
                // First pass to load the log names
                foreach(  LogPage::validTypes() as $type ) {
                        $page = new LogPage( $type );
                        $restriction = $page->getRestriction();
-                       if ( $wgUser->isAllowed( $restriction ) ) {
+                       if ( $this->getUser()->isAllowed( $restriction ) ) {
                                $typesByName[$type] = $page->getName()->text();
                        }
                }
@@ -268,7 +264,7 @@ class LogEventsList {
         */
        private function getUserInput( $user ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::inputLabel( wfMsg( 'specialloguserlabel' ), 'user', 'mw-log-user', 15, $user ) .
+                       Xml::inputLabel( $this->msg( 'specialloguserlabel' )->text(), 'user', 'mw-log-user', 15, $user ) .
                        '</span>';
        }
 
@@ -278,7 +274,7 @@ class LogEventsList {
         */
        private function getTitleInput( $title ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::inputLabel( wfMsg( 'speciallogtitlelabel' ), 'page', 'mw-log-page', 20, $title ) .
+                       Xml::inputLabel( $this->msg( 'speciallogtitlelabel' )->text(), 'page', 'mw-log-page', 20, $title ) .
                        '</span>';
        }
 
@@ -288,7 +284,7 @@ class LogEventsList {
         */
        private function getTitlePattern( $pattern ) {
                return '<span style="white-space: nowrap">' .
-                       Xml::checkLabel( wfMsg( 'log-title-wildcard' ), 'pattern', 'pattern', $pattern ) .
+                       Xml::checkLabel( $this->msg( 'log-title-wildcard' )->text(), 'pattern', 'pattern', $pattern ) .
                        '</span>';
        }
 
@@ -297,14 +293,13 @@ class LogEventsList {
         * @return string
         */
        private function getExtraInputs( $types ) {
-               global $wgRequest;
-               $offender = $wgRequest->getVal('offender');
+               $offender = $this->getRequest()->getVal( 'offender' );
                $user = User::newFromName( $offender, false );
                if( !$user || ($user->getId() == 0 && !IP::isIPAddress($offender) ) ) {
                        $offender = ''; // Blank field if invalid
                }
                if( count($types) == 1 && $types[0] == 'suppress' ) {
-                       return Xml::inputLabel( wfMsg('revdelete-offender'), 'offender',
+                       return Xml::inputLabel( $this->msg( 'revdelete-offender' )->text(), 'offender',
                                'mw-log-offender', 20, $offender );
                }
                return '';
@@ -331,6 +326,7 @@ class LogEventsList {
        public function logLine( $row ) {
                $entry = DatabaseLogEntry::newFromRow( $row );
                $formatter = LogFormatter::newFromEntry( $entry );
+               $formatter->setContext( $this->getContext() );
                $formatter->setShowUserToolLinks( !( $this->flags & self::NO_EXTRA_USER_LINKS ) );
 
                $action = $formatter->getActionText();
@@ -358,9 +354,8 @@ class LogEventsList {
        }
 
        private function logTimestamp( LogEntry $entry ) {
-               global $wgLang;
-               $time = $wgLang->timeanddate( wfTimestamp( TS_MW, $entry->getTimestamp() ), true );
-               return htmlspecialchars( $time );
+               return htmlspecialchars( $this->getLanguage()->userTimeAndDate(
+                       $entry->getTimestamp(), $this->getUser() ) );
        }
 
        /**
@@ -373,7 +368,6 @@ class LogEventsList {
         * @return String
         */
        private function logActionLinks( $row, $title, $paramArray, &$comment ) {
-               global $wgUser;
                if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the action
                        || self::isDeleted( $row, LogPage::DELETED_ACTION ) ) // action is hidden
                {
@@ -383,53 +377,45 @@ class LogEventsList {
                if( self::typeAction( $row, 'move', 'move', 'move' ) && !empty( $paramArray[0] ) ) {
                        $destTitle = Title::newFromText( $paramArray[0] );
                        if( $destTitle ) {
-                               $revert = Linker::link(
+                               $revert = Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Movepage' ),
                                        $this->message['revertmove'],
                                        array(),
                                        array(
                                                'wpOldTitle' => $destTitle->getPrefixedDBkey(),
                                                'wpNewTitle' => $title->getPrefixedDBkey(),
-                                               'wpReason'   => wfMsgForContent( 'revertmove' ),
+                                               'wpReason'   => $this->msg( 'revertmove' )->inContentLanguage()->text(),
                                                'wpMovetalk' => 0
-                                       ),
-                                       array( 'known', 'noclasses' )
+                                       )
                                );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                               $revert = $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                        }
                // Show undelete link
                } elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'delete', 'deletedhistory' ) ) {
-                       if( !$wgUser->isAllowed( 'undelete' ) ) {
+                       if( !$this->getUser()->isAllowed( 'undelete' ) ) {
                                $viewdeleted = $this->message['undeleteviewlink'];
                        } else {
                                $viewdeleted = $this->message['undeletelink'];
                        }
-                       $revert = Linker::link(
+                       $revert = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'Undelete' ),
                                $viewdeleted,
                                array(),
-                               array( 'target' => $title->getPrefixedDBkey() ),
-                               array( 'known', 'noclasses' )
+                               array( 'target' => $title->getPrefixedDBkey() )
                         );
-                       $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                       $revert = $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                // Show unblock/change block link
                } elseif( self::typeAction( $row, array( 'block', 'suppress' ), array( 'block', 'reblock' ), 'block' ) ) {
-                       $revert = Linker::link(
+                       $revert = Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Unblock', $row->log_title ),
-                                       $this->message['unblocklink'],
-                                       array(),
-                                       array(),
-                                       'known'
+                                       $this->message['unblocklink']
                                ) .
                                $this->message['pipe-separator'] .
-                               Linker::link(
+                               Linker::linkKnown(
                                        SpecialPage::getTitleFor( 'Block', $row->log_title ),
-                                       $this->message['change-blocklink'],
-                                       array(),
-                                       array(),
-                                       'known'
+                                       $this->message['change-blocklink']
                                );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                               $revert = $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                // Show change protection link
                } elseif( self::typeAction( $row, 'protect', array( 'modify', 'protect', 'unprotect' ) ) ) {
                        $revert .= Linker::link( $title,
@@ -440,7 +426,7 @@ class LogEventsList {
                                                'offset' => $row->log_timestamp
                                        )
                                );
-                       if( $wgUser->isAllowed( 'protect' ) ) {
+                       if( $this->getUser()->isAllowed( 'protect' ) ) {
                                $revert .= $this->message['pipe-separator'] .
                                        Linker::link( $title,
                                                $this->message['protect_change'],
@@ -448,10 +434,10 @@ class LogEventsList {
                                                array( 'action' => 'protect' ),
                                                'known' );
                        }
-                       $revert = ' ' . wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                       $revert = ' ' . $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                // Show unmerge link
                } elseif( self::typeAction( $row, 'merge', 'merge', 'mergehistory' ) ) {
-                       $revert = Linker::link(
+                       $revert = Linker::linkKnown(
                                SpecialPage::getTitleFor( 'MergeHistory' ),
                                $this->message['revertmerge'],
                                array(),
@@ -459,10 +445,9 @@ class LogEventsList {
                                        'target' => $paramArray[0],
                                        'dest' => $title->getPrefixedDBkey(),
                                        'mergepoint' => $paramArray[1]
-                               ),
-                               array( 'known', 'noclasses' )
+                               )
                        );
-                       $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                       $revert = $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                // If an edit was hidden from a page give a review link to the history
                } elseif( self::typeAction( $row, array( 'delete', 'suppress' ), 'revision', 'deletedhistory' ) ) {
                        $revert = RevisionDeleter::getLogLinks( $title, $paramArray,
@@ -474,7 +459,7 @@ class LogEventsList {
                                // $paramArray[1] is a CSV of the IDs
                                $query = $paramArray[0];
                                // Link to each hidden object ID, $paramArray[1] is the url param
-                               $revert = Linker::link(
+                               $revert = Linker::linkKnown(
                                        $revdel,
                                        $this->message['revdel-restore'],
                                        array(),
@@ -482,10 +467,9 @@ class LogEventsList {
                                                'target' => $title->getPrefixedText(),
                                                'type' => 'logging',
                                                'ids' => $query
-                                       ),
-                                       array( 'known', 'noclasses' )
+                                       )
                                );
-                               $revert = wfMessage( 'parentheses' )->rawParams( $revert )->escaped();
+                               $revert = $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
                        }
                // Do nothing. The implementation is handled by the hook modifiying the passed-by-ref parameters.
                } else {
@@ -503,28 +487,33 @@ class LogEventsList {
         * @return string
         */
        private function getShowHideLinks( $row ) {
-               global $wgUser;
-               if( ( $this->flags & self::NO_ACTION_LINK ) // we don't want to see the links
+               if( ( $this->flags == self::NO_ACTION_LINK ) // we don't want to see the links
                        || $row->log_type == 'suppress' ) { // no one can hide items from the suppress log
                        return '';
                }
                $del = '';
-               // Don't show useless link to people who cannot hide revisions
-               if( $wgUser->isAllowed( 'deletedhistory' ) ) {
-                       if( $row->log_deleted || $wgUser->isAllowed( 'deleterevision' ) ) {
-                               $canHide = $wgUser->isAllowed( 'deleterevision' );
-                               // If event was hidden from sysops
-                               if( !self::userCan( $row, LogPage::DELETED_RESTRICTED ) ) {
-                                       $del = Linker::revDeleteLinkDisabled( $canHide );
+               $user = $this->getUser();
+               // Don't show useless checkbox to people who cannot hide revisions
+               if( $user->isAllowed( 'deletedhistory' ) ) {
+                       if( $row->log_deleted || $user->isAllowed( 'deleterevision' ) ) {
+                               $canHide = $user->isAllowed( 'deleterevision' );
+                               if ( $this->flags & self::USE_REVDEL_CHECKBOXES ) { // Show checkboxes instead of links.
+                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
+                                               $del = Xml::check( 'deleterevisions', false, array( 'disabled' => 'disabled' ) );
+                                       } else {
+                                               $del = Xml::check( 'showhiderevisions', false, array( 'name' => 'ids[' . $row->log_id . ']' ) );
+                                       }
                                } 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 );
+                                       if ( !self::userCan( $row, LogPage::DELETED_RESTRICTED, $user ) ) { // If event was hidden from sysops
+                                               $del = Linker::revDeleteLinkDisabled( $canHide );
+                                       } else {
+                                               $query = array(
+                                                       'target' => SpecialPage::getTitleFor( 'Log', $row->log_type )->getPrefixedDBkey(),
+                                                       'type'   => 'logging',
+                                                       'ids'    => $row->log_id,
+                                               );
+                                               $del = Linker::revDeleteLink( $query, self::isDeleted( $row, LogPage::DELETED_RESTRICTED ), $canHide );
+                                       }
                                }
                        }
                }
@@ -615,8 +604,8 @@ class LogEventsList {
         *   if set to true (default), "No matching items in log" is displayed if loglist is empty
         * - msgKey Array If you want a nice box with a message, set this to the key of the message.
         *   First element is the message key, additional optional elements are parameters for the key
-        *   that are processed with wfMsgExt and option 'parse'
-        * - offset Set to overwrite offset parameter in $wgRequest
+        *   that are processed with wfMessage
+        * - offset Set to overwrite offset parameter in WebRequest
         *   set to '' to unset offset
         * - wrap String Wrap the message in html (usually something like "<div ...>$1</div>").
         * - flags Integer display flags (NO_ACTION_LINK,NO_EXTRA_USER_LINKS)
@@ -654,9 +643,9 @@ class LogEventsList {
                }
 
                # Insert list of top 50 (or top $lim) items
-               $loglist = new LogEventsList( $context->getSkin(), $context->getOutput(), $flags );
+               $loglist = new LogEventsList( $context, null, $flags );
                $pager = new LogPager( $loglist, $types, $user, $page, '', $conds );
-               if ( isset( $param['offset'] ) ) { # Tell pager to ignore $wgRequest offset
+               if ( isset( $param['offset'] ) ) { # Tell pager to ignore WebRequest offset
                        $pager->setOffset( $param['offset'] );
                }
                if( $lim > 0 ) $pager->mLimit = $lim;
@@ -667,11 +656,11 @@ class LogEventsList {
                                $s = '<div class="mw-warning-with-logexcerpt">';
 
                                if ( count( $msgKey ) == 1 ) {
-                                       $s .= wfMsgExt( $msgKey[0], array( 'parse' ) );
+                                       $s .= $context->msg( $msgKey[0] )->parseAsBlock();
                                } else { // Process additional arguments
                                        $args = $msgKey;
                                        array_shift( $args );
-                                       $s .= wfMsgExt( $msgKey[0], array( 'parse' ), $args );
+                                       $s .= $context->msg( $msgKey[0], $args )->parseAsBlock();
                                }
                        }
                        $s .= $loglist->beginLogEventsList() .
@@ -680,7 +669,7 @@ class LogEventsList {
                } else {
                        if ( $showIfEmpty ) {
                                $s = Html::rawElement( 'div', array( 'class' => 'mw-warning-logempty' ),
-                                       wfMsgExt( 'logempty', array( 'parseinline' ) ) );
+                                       $context->msg( 'logempty' )->parse() );
                        }
                }
                if( $pager->getNumRows() > $pager->mLimit ) { # Show "Full log" link
@@ -699,7 +688,7 @@ class LogEventsList {
                                $urlParam['type'] = $types[0];
                        $s .= Linker::link(
                                SpecialPage::getTitleFor( 'Log' ),
-                               wfMsgHtml( 'log-fulllog' ),
+                               $context->msg( 'log-fulllog' )->escaped(),
                                array(),
                                $urlParam
                        );
index e463c45..1ba6a3b 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
@@ -712,4 +727,12 @@ class NewUsersLogFormatter extends LogFormatter {
                }
                return parent::getComment();
        }
+
+       public function getPreloadTitles() {
+               if ( $this->entry->getSubtype() === 'create2' ) {
+                       //add the user talk to LinkBatch for the userLink
+                       return array( Title::makeTitle( NS_USER_TALK, $this->entry->getTarget()->getText() ) );
+               }
+               return array();
+       }
 }
index 88f3484..3891f34 100644 (file)
@@ -68,7 +68,7 @@ class LogPage {
        }
 
        /**
-        * @return bool|int|null
+        * @return int log_id of the inserted log entry
         */
        protected function saveContent() {
                global $wgLogRestrictions;
@@ -105,7 +105,7 @@ class LogPage {
                } elseif( $this->sendToUDP ) {
                        # Don't send private logs to UDP
                        if( isset( $wgLogRestrictions[$this->type] ) && $wgLogRestrictions[$this->type] != '*' ) {
-                               return true;
+                               return $newId;
                        }
 
                        # Notify external application via UDP.
@@ -438,8 +438,7 @@ class LogPage {
         * @param $params Array: parameters passed later to wfMsg.* functions
         * @param $doer User object: the user doing the action
         *
-        * @return bool|int|null
-        * @TODO: make this use LogEntry::saveContent()
+        * @return int log_id of the inserted log entry
         */
        public function addEntry( $action, $target, $comment, $params = array(), $doer = null ) {
                global $wgContLang;
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.
diff --git a/includes/mobile/DeviceDetection.php b/includes/mobile/DeviceDetection.php
new file mode 100644 (file)
index 0000000..bca6985
--- /dev/null
@@ -0,0 +1,459 @@
+<?php
+/**
+ * Mobile device detection code
+ *
+ * Copyright © 2011 Patrick Reilly
+ * http://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Base for classes describing devices and their capabilities
+ * @since 1.20
+ */
+interface IDeviceProperties {
+       /**
+        * @return string: 'html' or 'wml'
+        */
+       function format();
+
+       /**
+        * @return bool
+        */
+       function supportsJavaScript();
+
+       /**
+        * @return bool
+        */
+       function supportsJQuery();
+
+       /**
+        * @return bool
+        */
+       function disableZoom();
+}
+
+/**
+ * @since 1.20
+ */
+interface IDeviceDetector {
+       /**
+        * @param $userAgent
+        * @param string $acceptHeader
+        * @return IDeviceProperties
+        */
+       function detectDeviceProperties( $userAgent, $acceptHeader = '' );
+
+       /**
+        * @param $deviceName
+        * @return IDeviceProperties
+        */
+       function getDeviceProperties( $deviceName );
+
+       /**
+        * @param $userAgent string
+        * @param $acceptHeader string
+        * @return string
+        */
+       function detectDeviceName( $userAgent, $acceptHeader = '' );
+}
+
+/**
+ * MediaWiki's default IDeviceProperties implementation
+ */
+final class DeviceProperties implements IDeviceProperties {
+       private $device;
+
+       public function __construct( array $deviceCapabilities ) {
+               $this->device = $deviceCapabilities;
+       }
+
+       /**
+        * @return string
+        */
+       function format() {
+               return $this->device['view_format'];
+       }
+
+       /**
+        * @return bool
+        */
+       function supportsJavaScript() {
+               return $this->device['supports_javascript'];
+       }
+
+       /**
+        * @return bool
+        */
+       function supportsJQuery() {
+               return $this->device['supports_jquery'];
+       }
+
+       /**
+        * @return bool
+        */
+       function disableZoom() {
+               return $this->device['disable_zoom'];
+       }
+}
+
+/**
+ * Provides abstraction for a device.
+ * A device can select which format a request should receive and
+ * may be extended to provide access to particular device functionality.
+ * @since 1.20
+ */
+class DeviceDetection implements IDeviceDetector {
+
+       private static $formats = array (
+                       'html' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'default',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'capable' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'default',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => true,
+                       ),
+                       'webkit' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'webkit',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => false,
+                       ),
+                       'ie' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'default',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => false,
+                       ),
+                       'android' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'android',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => false,
+                       ),
+                       'iphone' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'iphone',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => false,
+                       ),
+                       'iphone2' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'iphone2',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => true,
+                       ),
+                       'native_iphone' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'default',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => false,
+                       ),
+                       'palm_pre' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'palm_pre',
+                               'supports_javascript' => true,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'kindle' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'kindle',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'kindle2' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'kindle',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'blackberry' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'blackberry',
+                               'supports_javascript' => true,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'blackberry-lt5' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'blackberry',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'netfront' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'simple',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'wap2' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'simple',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'psp' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'psp',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'ps3' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'simple',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'wii' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'wii',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => true,
+                       ),
+                       'operamini' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'operamini',
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'operamobile' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'operamobile',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => true,
+                       ),
+                       'nokia' => array (
+                               'view_format' => 'html',
+                               'css_file_name' => 'nokia',
+                               'supports_javascript' => true,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+                       'wml' => array (
+                               'view_format' => 'wml',
+                               'css_file_name' => null,
+                               'supports_javascript' => false,
+                               'supports_jquery' => false,
+                               'disable_zoom' => true,
+                       ),
+               );
+
+       /**
+        * Returns an instance of detection class, overridable by extensions
+        * @return IDeviceDetector
+        */
+       public static function factory() {
+               global $wgDeviceDetectionClass;
+
+               static $instance = null;
+               if ( !$instance ) {
+                       $instance = new $wgDeviceDetectionClass();
+               }
+               return $instance;
+       }
+
+       /**
+        * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
+        * @param $userAgent
+        * @param string $acceptHeader
+        * @return array
+        */
+       public function detectDevice( $userAgent, $acceptHeader = '' ) {
+               $formatName = $this->detectFormatName( $userAgent, $acceptHeader );
+               return $this->getDevice( $formatName );
+       }
+
+       /**
+        * @param $userAgent
+        * @param string $acceptHeader
+        * @return IDeviceProperties
+        */
+       public function detectDeviceProperties( $userAgent, $acceptHeader = '' ) {
+               $deviceName = $this->detectDeviceName( $userAgent, $acceptHeader );
+               return $this->getDeviceProperties( $deviceName );
+       }
+
+       /**
+        * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
+        * @param $formatName
+        * @return array
+        */
+       public function getDevice( $formatName ) {
+               return ( isset( self::$formats[$formatName] ) ) ? self::$formats[$formatName] : array();
+       }
+
+       /**
+        * @param $deviceName
+        * @return IDeviceProperties
+        */
+       public function getDeviceProperties( $deviceName ) {
+               if ( isset( self::$formats[$deviceName] ) ) {
+                       return new DeviceProperties( self::$formats[$deviceName] );
+               } else {
+                       return new DeviceProperties( array(
+                               'view_format' => 'html',
+                               'css_file_name' => 'default',
+                               'supports_javascript' => true,
+                               'supports_jquery' => true,
+                               'disable_zoom' => true,
+                       ) );
+               }
+       }
+
+       /**
+        * @deprecated: Renamed to detectDeviceName()
+        * @param $userAgent string
+        * @param $acceptHeader string
+        * @return string
+        */
+       public function detectFormatName( $userAgent, $acceptHeader = '' ) {
+               return $this->detectDeviceName( $userAgent, $acceptHeader );
+       }
+
+       /**
+        * @param $userAgent string
+        * @param $acceptHeader string
+        * @return string
+        */
+       public function detectDeviceName( $userAgent, $acceptHeader = '' ) {
+               wfProfileIn( __METHOD__ );
+
+               $deviceName = '';
+               if ( preg_match( '/Android/', $userAgent ) ) {
+                       $deviceName = 'android';
+                       if ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
+                               $deviceName = 'operamini';
+                       }
+               } else if ( preg_match( '/MSIE 9.0/', $userAgent ) ||
+                               preg_match( '/MSIE 8.0/', $userAgent ) ) {
+                       $deviceName = 'ie';
+               } else if( preg_match( '/MSIE/', $userAgent ) ) {
+                       $deviceName = 'html';
+               } else if ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
+                       $deviceName = 'operamobile';
+               } elseif ( preg_match( '/iPad.* Safari/', $userAgent ) ) {
+                       $deviceName = 'iphone';
+               } elseif ( preg_match( '/iPhone.* Safari/', $userAgent ) ) {
+                       if ( strpos( $userAgent, 'iPhone OS 2' ) !== false ) {
+                               $deviceName = 'iphone2';
+                       } else {
+                               $deviceName = 'iphone';
+                       }
+               } elseif ( preg_match( '/iPhone/', $userAgent ) ) {
+                       if ( strpos( $userAgent, 'Opera' ) !== false ) {
+                               $deviceName = 'operamini';
+                       } else {
+                               $deviceName = 'native_iphone';
+                       }
+               } elseif ( preg_match( '/WebKit/', $userAgent ) ) {
+                       if ( preg_match( '/Series60/', $userAgent ) ) {
+                               $deviceName = 'nokia';
+                       } elseif ( preg_match( '/webOS/', $userAgent ) ) {
+                               $deviceName = 'palm_pre';
+                       } else {
+                               $deviceName = 'webkit';
+                       }
+               } elseif ( preg_match( '/Opera/', $userAgent ) ) {
+                       if ( strpos( $userAgent, 'Nintendo Wii' ) !== false ) {
+                               $deviceName = 'wii';
+                       } elseif ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
+                               $deviceName = 'operamini';
+                       } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
+                               $deviceName = 'iphone';
+                       } else {
+                               $deviceName = 'webkit';
+                       }
+               } elseif ( preg_match( '/Kindle\/1.0/', $userAgent ) ) {
+                       $deviceName = 'kindle';
+               } elseif ( preg_match( '/Kindle\/2.0/', $userAgent ) ) {
+                       $deviceName = 'kindle2';
+               } elseif ( preg_match( '/Firefox/', $userAgent ) ) {
+                       $deviceName = 'capable';
+               } elseif ( preg_match( '/NetFront/', $userAgent ) ) {
+                       $deviceName = 'netfront';
+               } elseif ( preg_match( '/SEMC-Browser/', $userAgent ) ) {
+                       $deviceName = 'wap2';
+               } elseif ( preg_match( '/Series60/', $userAgent ) ) {
+                       $deviceName = 'wap2';
+               } elseif ( preg_match( '/PlayStation Portable/', $userAgent ) ) {
+                       $deviceName = 'psp';
+               } elseif ( preg_match( '/PLAYSTATION 3/', $userAgent ) ) {
+                       $deviceName = 'ps3';
+               } elseif ( preg_match( '/SAMSUNG/', $userAgent ) ) {
+                       $deviceName = 'capable';
+               } elseif ( preg_match( '/BlackBerry/', $userAgent ) ) {
+                       if( preg_match( '/BlackBerry[^\/]*\/[1-4]\./', $userAgent ) ) {
+                               $deviceName = 'blackberry-lt5';
+                       } else {
+                               $deviceName = 'blackberry';
+                       }
+               }
+
+               if ( $deviceName === '' ) {
+                       if ( strpos( $acceptHeader, 'application/vnd.wap.xhtml+xml' ) !== false ) {
+                               // Should be wap2
+                               $deviceName = 'html';
+                       } elseif ( strpos( $acceptHeader, 'vnd.wap.wml' ) !== false ) {
+                               $deviceName = 'wml';
+                       } else {
+                               $deviceName = 'html';
+                       }
+               }
+               wfProfileOut( __METHOD__ );
+               return $deviceName;
+       }
+
+       /**
+        * @return array: List of all device-specific stylesheets
+        */
+       public function getCssFiles() {
+               $files = array();
+
+               foreach ( self::$formats as $dev ) {
+                       if ( isset( $dev['css_file_name'] ) ) {
+                               $files[] = $dev['css_file_name'];
+                       }
+               }
+               return array_unique( $files );
+       }
+}
index 6c4d8b7..5142a41 100644 (file)
@@ -6,6 +6,21 @@
  * since this file will not be executed during request startup for a compiled
  * MediaWiki.
  *
+ * 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 UtfNormal
  */
index f478fa9..691bfaa 100644 (file)
@@ -1,7 +1,22 @@
 #!/usr/bin/php
 <?php
 /**
- * Other tests for the unicode normalization module
+ * Other tests for the unicode normalization module.
+ *
+ * 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 UtfNormal
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 a4545ef..e6ba042 100644 (file)
@@ -56,8 +56,7 @@ abstract class BagOStuff {
        /**
         * Get an item with the given key. Returns false if it does not exist.
         * @param $key string
-        *
-        * @return bool|Object
+        * @return mixed Returns false on failure
         */
        abstract public function get( $key );
 
@@ -66,6 +65,7 @@ abstract class BagOStuff {
         * @param $key string
         * @param $value mixed
         * @param $exptime int Either an interval in seconds or a unix timestamp for expiry
+        * @return bool success
         */
        abstract public function set( $key, $value, $exptime = 0 );
 
@@ -73,19 +73,33 @@ abstract class BagOStuff {
         * Delete an item.
         * @param $key string
         * @param $time int Amount of time to delay the operation (mostly memcached-specific)
+        * @return bool True if the item was deleted or not found, false on failure
         */
        abstract public function delete( $key, $time = 0 );
 
+       /**
+        * @param $key string
+        * @param $timeout integer
+        * @return bool success
+        */
        public function lock( $key, $timeout = 0 ) {
                /* stub */
                return true;
        }
 
+       /**
+        * @param $key string
+        * @return bool success
+        */
        public function unlock( $key ) {
                /* stub */
                return true;
        }
 
+       /**
+        * @todo: what is this?
+        * @return Array
+        */
        public function keys() {
                /* stub */
                return array();
@@ -107,24 +121,52 @@ abstract class BagOStuff {
 
        /* *** Emulated functions *** */
 
-       public function add( $key, $value, $exptime = 0 ) {
-               if ( !$this->get( $key ) ) {
-                       $this->set( $key, $value, $exptime );
+       /**
+        * Get an associative array containing the item for each of the keys that have items.
+        * @param $keys Array List of strings
+        * @return Array
+        */
+       public function getMulti( array $keys ) {
+               $res = array();
+               foreach ( $keys as $key ) {
+                       $val = $this->get( $key );
+                       if ( $val !== false ) {
+                               $res[$key] = $val;
+                       }
+               }
+               return $res;
+       }
 
-                       return true;
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @param $exptime integer
+        * @return bool success
+        */
+       public function add( $key, $value, $exptime = 0 ) {
+               if ( $this->get( $key ) === false ) {
+                       return $this->set( $key, $value, $exptime );
                }
+               return false; // key already set
        }
 
+       /**
+        * @param $key string
+        * @param $value mixed
+        * @return bool success
+        */
        public function replace( $key, $value, $exptime = 0 ) {
                if ( $this->get( $key ) !== false ) {
-                       $this->set( $key, $value, $exptime );
+                       return $this->set( $key, $value, $exptime );
                }
+               return false; // key not already set
        }
 
        /**
         * @param $key String: Key to increase
         * @param $value Integer: Value to add to $key (Default 1)
         * @return null if lock is not possible else $key value increased by $value
+        * @return success
         */
        public function incr( $key, $value = 1 ) {
                if ( !$this->lock( $key ) ) {
@@ -142,10 +184,18 @@ abstract class BagOStuff {
                return $n;
        }
 
+       /**
+        * @param $key String
+        * @param $value Integer
+        * @return bool success
+        */
        public function decr( $key, $value = 1 ) {
                return $this->incr( $key, - $value );
        }
 
+       /**
+        * @param $text string
+        */
        public function debug( $text ) {
                if ( $this->debugMode ) {
                        $class = get_class( $this );
@@ -155,6 +205,7 @@ abstract class BagOStuff {
 
        /**
         * Convert an optionally relative time to an absolute time
+        * @param $exptime integer
         * @return int
         */
        protected function convertExpiry( $exptime ) {
@@ -165,5 +216,3 @@ abstract class BagOStuff {
                }
        }
 }
-
-
index ade8c0a..63ad4de 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.
@@ -7,7 +28,7 @@
  * for systems that don't have it.
  *
  * On construction you can pass array( 'dir' => '/some/path' ); as a parameter
- * to override the default DBA files directory (wgTmpDirectory).
+ * to override the default DBA files directory (wfTempDir()).
  *
  * @ingroup Cache
  */
@@ -18,8 +39,7 @@ class DBABagOStuff extends BagOStuff {
                global $wgDBAhandler;
 
                if ( !isset( $params['dir'] ) ) {
-                       global $wgTmpDirectory;
-                       $params['dir'] = $wgTmpDirectory;
+                       $params['dir'] = wfTempDir();
                }
 
                $this->mFile = $params['dir']."/mw-cache-" . wfWikiID();
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
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
new file mode 100644 (file)
index 0000000..1312866
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+/**
+ * Base class for memcached 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 Cache
+ */
+
+/**
+ * Base class for memcached clients.
+ *
+ * @ingroup Cache
+ */
+class MemcachedBagOStuff extends BagOStuff {
+       protected $client;
+
+       /**
+        * Fill in the defaults for any parameters missing from $params, using the
+        * backwards-compatible global variables
+        */
+       protected function applyDefaultParams( $params ) {
+               if ( !isset( $params['servers'] ) ) {
+                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
+               }
+               if ( !isset( $params['debug'] ) ) {
+                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
+               }
+               if ( !isset( $params['persistent'] ) ) {
+                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
+               }
+               if  ( !isset( $params['compress_threshold'] ) ) {
+                       $params['compress_threshold'] = 1500;
+               }
+               if ( !isset( $params['timeout'] ) ) {
+                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
+               }
+               if ( !isset( $params['connect_timeout'] ) ) {
+                       $params['connect_timeout'] = 0.1;
+               }
+               return $params;
+       }
+
+       /**
+        * @param $key string
+        * @return Mixed
+        */
+       public function get( $key ) {
+               return $this->client->get( $this->encodeKey( $key ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $value
+        * @param $exptime int
+        * @return bool
+        */
+       public function set( $key, $value, $exptime = 0 ) {
+               return $this->client->set( $this->encodeKey( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
+       public function delete( $key, $time = 0 ) {
+               return $this->client->delete( $this->encodeKey( $key ), $time );
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @return Mixed
+        */
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->client->add( $this->encodeKey( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @param $exptime
+        * @return Mixed
+        */
+       public function replace( $key, $value, $exptime = 0 ) {
+               return $this->client->replace( $this->encodeKey( $key ), $value, 
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       /**
+        * Get the underlying client object. This is provided for debugging
+        * purposes.
+        */
+       public function getClient() {
+               return $this->client;
+       }
+
+       /**
+        * Encode a key for use on the wire inside the memcached protocol.
+        *
+        * We encode spaces and line breaks to avoid protocol errors. We encode
+        * the other control characters for compatibility with libmemcached
+        * verify_key. We leave other punctuation alone, to maximise backwards
+        * compatibility.
+        * @return string
+        */
+       public function encodeKey( $key ) {
+               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/',
+                       array( $this, 'encodeKeyCallback' ), $key );
+       }
+
+       protected function encodeKeyCallback( $m ) {
+               return rawurlencode( $m[0] );
+       }
+
+       /**
+        * TTLs higher than 30 days will be detected as absolute TTLs
+        * (UNIX timestamps), and will result in the cache entry being
+        * discarded immediately because the expiry is in the past.
+        * Clamp expiries >30d at 30d, unless they're >=1e9 in which
+        * case they are likely to really be absolute (1e9 = 2011-09-09)
+        */
+       function fixExpiry( $expiry ) {
+               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
+                       $expiry = 2592000;
+               }
+               return $expiry;
+       }
+
+       /**
+        * Decode a key encoded with encodeKey(). This is provided as a convenience
+        * function for debugging.
+        *
+        * @param $key string
+        *
+        * @return string
+        */
+       public function decodeKey( $key ) {
+               return urldecode( $key );
+       }
+
+       /**
+        * Send a debug message to the log
+        */
+       protected function debugLog( $text ) {
+               global $wgDebugLogGroups;
+               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
+                       # Prefix message since it will end up in main debug log file
+                       $text = "memcached: $text";
+               }
+               if ( substr( $text, -1 ) !== "\n" ) {
+                       $text .= "\n";
+               }
+               wfDebugLog( 'memcached', $text );
+       }
+}
+
index 4f49f7d..9602ffe 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Memcached client for PHP.
+ *
  * +---------------------------------------------------------------------------+
  * | memcached client, PHP                                                     |
  * +---------------------------------------------------------------------------+
@@ -338,9 +340,10 @@ class MWMemcached {
                        $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
                }
 
-               if ( $res == "DELETED" ) {
+               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
                        return true;
                }
+
                return false;
        }
 
@@ -829,7 +832,7 @@ class MWMemcached {
         * @access private
         */
        function _hashfunc( $key ) {
-               # Hash function must on [0,0x7ffffff]
+               # Hash function must be in [0,0x7ffffff]
                # We take the first 31 bits of the MD5 hash, which unlike the hash
                # function used in a previous version of this client, works
                return hexdec( substr( md5( $key ), 0, 8 ) ) & 0x7fffffff;
@@ -976,15 +979,6 @@ class MWMemcached {
                        $this->stats[$cmd] = 1;
                }
 
-               // TTLs higher than 30 days will be detected as absolute TTLs
-               // (UNIX timestamps), and will result in the cache entry being
-               // discarded immediately because the expiry is in the past.
-               // Clamp expiries >30d at 30d, unless they're >=1e9 in which
-               // case they are likely to really be absolute (1e9 = 2011-09-09)
-               if ( $exp > 2592000 && $exp < 1000000000 ) {
-                       $exp = 2592000;
-               }
-
                $flags = 0;
 
                if ( !is_scalar( $val ) ) {
@@ -1139,7 +1133,13 @@ class MWMemcached {
 // }}}
 
 class MemCachedClientforWiki extends MWMemcached {
+
        function _debugprint( $text ) {
-               wfDebug( "memcached: $text" );
+               global $wgDebugLogGroups;
+               if( !isset( $wgDebugLogGroups['memcached'] ) ) {
+                       # Prefix message since it will end up in main debug log file
+                       $text = "memcached: $text";
+               }
+               wfDebugLog( 'memcached', $text );
        }
 }
diff --git a/includes/objectcache/MemcachedPeclBagOStuff.php b/includes/objectcache/MemcachedPeclBagOStuff.php
new file mode 100644 (file)
index 0000000..65d736a
--- /dev/null
@@ -0,0 +1,235 @@
+<?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 PECL memcached client
+ *
+ * @ingroup Cache
+ */
+class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
+
+       /**
+        * Constructor
+        *
+        * Available parameters are:
+        *   - servers:             The list of IP:port combinations holding the memcached servers.
+        *   - persistent:          Whether to use a persistent connection
+        *   - compress_threshold:  The minimum size an object must be before it is compressed
+        *   - timeout:             The read timeout in microseconds
+        *   - connect_timeout:     The connect timeout in seconds
+        *   - serializer:          May be either "php" or "igbinary". Igbinary produces more compact
+        *                          values, but serialization is much slower unless the php.ini option
+        *                          igbinary.compact_strings is off.
+        */
+       function __construct( $params ) {
+               $params = $this->applyDefaultParams( $params );
+
+               if ( $params['persistent'] ) {
+                       // The pool ID must be unique to the server/option combination.
+                       // The Memcached object is essentially shared for each pool ID.
+                       // We can only resuse a pool ID if we keep the config consistent.
+                       $this->client = new Memcached( md5( serialize( $params ) ) );
+                       if ( count( $this->client->getServerList() ) ) {
+                               wfDebug( __METHOD__ . ": persistent Memcached object already loaded.\n" );
+                               return; // already initialized; don't add duplicate servers
+                       }
+               } else {
+                       $this->client = new Memcached;
+               }
+
+               if ( !isset( $params['serializer'] ) ) {
+                       $params['serializer'] = 'php';
+               }
+
+               // The compression threshold is an undocumented php.ini option for some
+               // reason. There's probably not much harm in setting it globally, for
+               // compatibility with the settings for the PHP client.
+               ini_set( 'memcached.compression_threshold', $params['compress_threshold'] );
+
+               // Set timeouts
+               $this->client->setOption( Memcached::OPT_CONNECT_TIMEOUT, $params['connect_timeout'] * 1000 );
+               $this->client->setOption( Memcached::OPT_SEND_TIMEOUT, $params['timeout'] );
+               $this->client->setOption( Memcached::OPT_RECV_TIMEOUT, $params['timeout'] );
+               $this->client->setOption( Memcached::OPT_POLL_TIMEOUT, $params['timeout'] / 1000 );
+
+               // Set libketama mode since it's recommended by the documentation and
+               // is as good as any. There's no way to configure libmemcached to use
+               // hashes identical to the ones currently in use by the PHP client, and
+               // even implementing one of the libmemcached hashes in pure PHP for
+               // forwards compatibility would require MWMemcached::get_sock() to be
+               // rewritten.
+               $this->client->setOption( Memcached::OPT_LIBKETAMA_COMPATIBLE, true );
+
+               // Set the serializer
+               switch ( $params['serializer'] ) {
+                       case 'php':
+                               $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_PHP );
+                               break;
+                       case 'igbinary':
+                               if ( !Memcached::HAVE_IGBINARY ) {
+                                       throw new MWException( __CLASS__.': the igbinary extension is not available ' .
+                                               'but igbinary serialization was requested.' );
+                               }
+                               $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
+                               break;
+                       default:
+                               throw new MWException( __CLASS__.': invalid value for serializer parameter' );
+               }
+               $servers = array();
+               foreach ( $params['servers'] as $host ) {
+                       $servers[] = IP::splitHostAndPort( $host ); // (ip, port)
+               }
+               $this->client->addServers( $servers );
+       }
+
+       /**
+        * @param $key string
+        * @return Mixed
+        */
+       public function get( $key ) {
+               $this->debugLog( "get($key)" );
+               return $this->checkResult( $key, parent::get( $key ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $value
+        * @param $exptime int
+        * @return bool
+        */
+       public function set( $key, $value, $exptime = 0 ) {
+               $this->debugLog( "set($key)" );
+               return $this->checkResult( $key, parent::set( $key, $value, $exptime ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $time int
+        * @return bool
+        */
+       public function delete( $key, $time = 0 ) {
+               $this->debugLog( "delete($key)" );
+               $result = parent::delete( $key, $time );
+               if ( $result === false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
+                       // "Not found" is counted as success in our interface
+                       return true;
+               } else {
+                       return $this->checkResult( $key, $result );
+               }
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @return Mixed
+        */
+       public function add( $key, $value, $exptime = 0 ) {
+               $this->debugLog( "add($key)" );
+               return $this->checkResult( $key, parent::add( $key, $value, $exptime ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @param $exptime
+        * @return Mixed
+        */
+       public function replace( $key, $value, $exptime = 0 ) {
+               $this->debugLog( "replace($key)" );
+               return $this->checkResult( $key, parent::replace( $key, $value, $exptime ) );
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @return Mixed
+        */
+       public function incr( $key, $value = 1 ) {
+               $this->debugLog( "incr($key)" );
+               $result = $this->client->increment( $key, $value );
+               return $this->checkResult( $key, $result );
+       }
+
+       /**
+        * @param $key string
+        * @param $value int
+        * @return Mixed
+        */
+       public function decr( $key, $value = 1 ) {
+               $this->debugLog( "decr($key)" );
+               $result = $this->client->decrement( $key, $value );
+               return $this->checkResult( $key, $result );
+       }
+
+       /**
+        * Check the return value from a client method call and take any necessary
+        * action. Returns the value that the wrapper function should return. At
+        * present, the return value is always the same as the return value from
+        * the client, but some day we might find a case where it should be
+        * different.
+        *
+        * @param $key The key used by the caller, or false if there wasn't one.
+        * @param $result The return value
+        */
+       protected function checkResult( $key, $result ) {
+               if ( $result !== false ) {
+                       return $result;
+               }
+               switch ( $this->client->getResultCode() ) {
+                       case Memcached::RES_SUCCESS:
+                               break;
+                       case Memcached::RES_DATA_EXISTS:
+                       case Memcached::RES_NOTSTORED:
+                       case Memcached::RES_NOTFOUND:
+                               $this->debugLog( "result: " . $this->client->getResultMessage() );
+                               break;
+                       default:
+                               $msg = $this->client->getResultMessage();
+                               if ( $key !== false ) {
+                                       $server = $this->client->getServerByKey( $key );
+                                       $serverName = "{$server['host']}:{$server['port']}";
+                                       $msg = "Memcached error for key \"$key\" on server \"$serverName\": $msg";
+                               } else {
+                                       $msg = "Memcached error: $msg";
+                               }
+                               wfDebugLog( 'memcached-serious', $msg );
+               }
+               return $result;
+       }
+
+       /**
+        * @param $keys Array
+        * @return Array
+        */
+       public function getMulti( array $keys ) {
+               $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
+               $callback = array( $this, 'encodeKey' );
+               $result = $this->client->getMulti( array_map( $callback, $keys ) );
+               return $this->checkResult( false, $result );
+       }
+
+       /* NOTE: there is no cas() method here because it is currently not supported
+        * by the BagOStuff interface and other BagOStuff subclasses, such as
+        * SqlBagOStuff.
+        */
+}
index 021dfb7..c562134 100644 (file)
@@ -1,14 +1,32 @@
 <?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 {
-
-       /**
-        * @var MemCachedClientforWiki
-        */
-       protected $client;
+class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
 
        /**
         * Constructor.
@@ -24,24 +42,7 @@ class MemcachedPhpBagOStuff extends BagOStuff {
         * @param $params array
         */
        function __construct( $params ) {
-               if ( !isset( $params['servers'] ) ) {
-                       $params['servers'] = $GLOBALS['wgMemCachedServers'];
-               }
-               if ( !isset( $params['debug'] ) ) {
-                       $params['debug'] = $GLOBALS['wgMemCachedDebug'];
-               }
-               if ( !isset( $params['persistent'] ) ) {
-                       $params['persistent'] = $GLOBALS['wgMemCachedPersistent'];
-               }
-               if  ( !isset( $params['compress_threshold'] ) ) {
-                       $params['compress_threshold'] = 1500;
-               }
-               if ( !isset( $params['timeout'] ) ) {
-                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
-               }
-               if ( !isset( $params['connect_timeout'] ) ) {
-                       $params['connect_timeout'] = 0.1;
-               }
+               $params = $this->applyDefaultParams( $params );
 
                $this->client = new MemCachedClientforWiki( $params );
                $this->client->set_servers( $params['servers'] );
@@ -56,30 +57,12 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        }
 
        /**
-        * @param $key string
-        * @return Mixed
-        */
-       public function get( $key ) {
-               return $this->client->get( $this->encodeKey( $key ) );
-       }
-
-       /**
-        * @param $key string
-        * @param $value
-        * @param $exptime int
-        * @return bool
-        */
-       public function set( $key, $value, $exptime = 0 ) {
-               return $this->client->set( $this->encodeKey( $key ), $value, $exptime );
-       }
-
-       /**
-        * @param $key string
-        * @param $time int
-        * @return bool
+        * @param $keys Array
+        * @return Array
         */
-       public function delete( $key, $time = 0 ) {
-               return $this->client->delete( $this->encodeKey( $key ), $time );
+       public function getMulti( array $keys ) {
+               $callback = array( $this, 'encodeKey' );
+               return $this->client->get_multi( array_map( $callback, $keys ) );
        }
 
        /**
@@ -98,26 +81,7 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        public function unlock( $key ) {
                return $this->client->unlock( $this->encodeKey( $key ) );
        }
-
-       /**
-        * @param $key string
-        * @param $value int
-        * @return Mixed
-        */
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->client->add( $this->encodeKey( $key ), $value, $exptime );
-       }
-
-       /**
-        * @param $key string
-        * @param $value int
-        * @param $exptime
-        * @return Mixed
-        */
-       public function replace( $key, $value, $exptime = 0 ) {
-               return $this->client->replace( $this->encodeKey( $key ), $value, $exptime );
-       }
-
+       
        /**
         * @param $key string
         * @param $value int
@@ -135,45 +99,5 @@ class MemcachedPhpBagOStuff extends BagOStuff {
        public function decr( $key, $value = 1 ) {
                return $this->client->decr( $this->encodeKey( $key ), $value );
        }
-
-       /**
-        * Get the underlying client object. This is provided for debugging 
-        * purposes.
-        *
-        * @return MemCachedClientforWiki
-        */
-       public function getClient() {
-               return $this->client;
-       }
-
-       /**
-        * Encode a key for use on the wire inside the memcached protocol.
-        *
-        * We encode spaces and line breaks to avoid protocol errors. We encode 
-        * the other control characters for compatibility with libmemcached 
-        * verify_key. We leave other punctuation alone, to maximise backwards
-        * compatibility.
-        * @return string
-        */
-       public function encodeKey( $key ) {
-               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/', 
-                       array( $this, 'encodeKeyCallback' ), $key );
-       }
-
-       protected function encodeKeyCallback( $m ) {
-               return rawurlencode( $m[0] );
-       }
-
-       /**
-        * Decode a key encoded with encodeKey(). This is provided as a convenience 
-        * function for debugging.
-        *
-        * @param $key string
-        *
-        * @return string
-        */
-       public function decodeKey( $key ) {
-               return urldecode( $key );
-       }
 }
 
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..2e00e16 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();
 
@@ -111,8 +132,10 @@ class ObjectCache {
 
        /**
         * Factory function that creates a memcached client object.
-        * The idea of this is that it might eventually detect and automatically
-        * support the PECL extension, assuming someone can get it to compile.
+        *
+        * This always uses the PHP client, since the PECL client has a different 
+        * hashing scheme and a different interpretation of the flags bitfield, so 
+        * switching between the two clients randomly would be disasterous.
         *
         * @param $params array
         *
index 4dfa574..209975b 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
@@ -66,25 +87,34 @@ class SqlBagOStuff extends BagOStuff {
         * @return DatabaseBase
         */
        protected function getDB() {
+               global $wgDebugDBTransactions;
                if ( !isset( $this->db ) ) {
                        # If server connection info was given, use that
                        if ( $this->serverInfo ) {
+                               if ( $wgDebugDBTransactions ) {
+                                       wfDebug( sprintf( "Using provided serverInfo for SqlBagOStuff\n" ) );
+                               }
                                $this->lb = new LoadBalancer( array(
                                        'servers' => array( $this->serverInfo ) ) );
                                $this->db = $this->lb->getConnection( DB_MASTER );
                                $this->db->clearFlag( DBO_TRX );
                        } else {
-                               # We must keep a separate connection to MySQL in order to avoid deadlocks
-                               # However, SQLite has an opposite behaviour.
-                               # @todo Investigate behaviour for other databases
-                               if ( wfGetDB( DB_MASTER )->getType() == 'sqlite' ) {
-                                       $this->db = wfGetDB( DB_MASTER );
-                               } else {
+                               /*
+                                * We must keep a separate connection to MySQL in order to avoid deadlocks
+                                * However, SQLite has an opposite behaviour. And PostgreSQL needs to know
+                                * if we are in transaction or no
+                                */
+                               if ( wfGetDB( DB_MASTER )->getType() == 'mysql' ) {
                                        $this->lb = wfGetLBFactory()->newMainLB();
                                        $this->db = $this->lb->getConnection( DB_MASTER );
                                        $this->db->clearFlag( DBO_TRX );
+                               } else {
+                                       $this->db = wfGetDB( DB_MASTER );
                                }
                        }
+                       if ( $wgDebugDBTransactions ) {
+                               wfDebug( sprintf( "Connection %s will be used for SqlBagOStuff\n", $this->db ) );
+                       }
                }
 
                return $this->db;
@@ -118,40 +148,64 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        public function get( $key ) {
-               # expire old entries if any
-               $this->garbageCollect();
-               $db = $this->getDB();
-               $tableName = $this->getTableByKey( $key );
-               $row = $db->selectRow( $tableName, array( 'value', 'exptime' ),
-                       array( 'keyname' => $key ), __METHOD__ );
+               $values = $this->getMulti( array( $key ) );
+               return $values[$key];
+       }
 
-               if ( !$row ) {
-                       $this->debug( 'get: no matching rows' );
-                       return false;
+       public function getMulti( array $keys ) {
+               $values = array(); // array of (key => value)
+
+               $keysByTableName = array();
+               foreach ( $keys as $key ) {
+                       $tableName = $this->getTableByKey( $key );
+                       if ( !isset( $keysByTableName[$tableName] ) ) {
+                               $keysByTableName[$tableName] = array();
+                       }
+                       $keysByTableName[$tableName][] = $key;
                }
 
-               $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+               $db = $this->getDB();
+               $this->garbageCollect(); // expire old entries if any
 
-               if ( $this->isExpired( $row->exptime ) ) {
-                       $this->debug( "get: key has expired, deleting" );
-                       try {
-                               $db->begin( __METHOD__ );
-                               # Put the expiry time in the WHERE condition to avoid deleting a
-                               # newly-inserted value
-                               $db->delete( $tableName,
-                                       array(
-                                               'keyname' => $key,
-                                               'exptime' => $row->exptime
-                                       ), __METHOD__ );
-                               $db->commit( __METHOD__ );
-                       } catch ( DBQueryError $e ) {
-                               $this->handleWriteError( $e );
+               $dataRows = array();
+               foreach ( $keysByTableName as $tableName => $tableKeys ) {
+                       $res = $db->select( $tableName,
+                               array( 'keyname', 'value', 'exptime' ),
+                               array( 'keyname' => $tableKeys ),
+                               __METHOD__ );
+                       foreach ( $res as $row ) {
+                               $dataRows[$row->keyname] = $row;
                        }
+               }
 
-                       return false;
+               foreach ( $keys as $key ) {
+                       if ( isset( $dataRows[$key] ) ) { // HIT?
+                               $row = $dataRows[$key];
+                               $this->debug( "get: retrieved data; expiry time is " . $row->exptime );
+                               if ( $this->isExpired( $row->exptime ) ) { // MISS
+                                       $this->debug( "get: key has expired, deleting" );
+                                       try {
+                                               $db->begin( __METHOD__ );
+                                               # Put the expiry time in the WHERE condition to avoid deleting a
+                                               # newly-inserted value
+                                               $db->delete( $this->getTableByKey( $key ),
+                                                       array( 'keyname' => $key, 'exptime' => $row->exptime ),
+                                                       __METHOD__ );
+                                               $db->commit( __METHOD__ );
+                                       } catch ( DBQueryError $e ) {
+                                               $this->handleWriteError( $e );
+                                       }
+                                       $values[$key] = false;
+                               } else { // HIT
+                                       $values[$key] = $this->unserialize( $db->decodeBlob( $row->value ) );
+                               }
+                       } else { // MISS
+                               $values[$key] = false;
+                               $this->debug( 'get: no matching rows' );
+                       }
                }
 
-               return $this->unserialize( $db->decodeBlob( $row->value ) );
+               return $values;
        }
 
        public function set( $key, $value, $exptime = 0 ) {
@@ -328,7 +382,7 @@ class SqlBagOStuff extends BagOStuff {
                                        if ( $maxExpTime !== false ) {
                                                $conds[] = 'exptime > ' . $db->addQuotes( $maxExpTime );
                                        }
-                                       $rows = $db->select( 
+                                       $rows = $db->select(
                                                $this->getTableByShard( $i ),
                                                array( 'keyname', 'exptime' ),
                                                $conds,
@@ -352,7 +406,7 @@ class SqlBagOStuff extends BagOStuff {
                                        $db->begin( __METHOD__ );
                                        $db->delete(
                                                $this->getTableByShard( $i ),
-                                               array( 
+                                               array(
                                                        'exptime >= ' . $db->addQuotes( $minExpTime ),
                                                        'exptime < ' . $db->addQuotes( $dbTimestamp ),
                                                        'keyname' => $keys
@@ -364,12 +418,12 @@ class SqlBagOStuff extends BagOStuff {
                                                if ( intval( $totalSeconds ) === 0 ) {
                                                        $percent = 0;
                                                } else {
-                                                       $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp ) 
+                                                       $remainingSeconds = wfTimestamp( TS_UNIX, $timestamp )
                                                                - wfTimestamp( TS_UNIX, $maxExpTime );
                                                        if ( $remainingSeconds > $totalSeconds ) {
                                                                $totalSeconds = $remainingSeconds;
                                                        }
-                                                       $percent = ( $i + $remainingSeconds / $totalSeconds ) 
+                                                       $percent = ( $i + $remainingSeconds / $totalSeconds )
                                                                / $this->shards * 100;
                                                }
                                                call_user_func( $progressCallback, $percent );
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 8954031..7bd2aab 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
@@ -188,7 +205,7 @@ class Parser {
        public function __construct( $conf = array() ) {
                $this->mConf = $conf;
                $this->mUrlProtocols = wfUrlProtocols();
-               $this->mExtLinkBracketedRegex = '/\[((' . wfUrlProtocols() . ')'.
+               $this->mExtLinkBracketedRegex = '/\[((' . $this->mUrlProtocols . ')'.
                        self::EXT_LINK_URL_CLASS.'+)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
@@ -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() );
@@ -1814,7 +1836,7 @@ class Parser {
                        # Don't allow internal links to pages containing
                        # PROTO: where PROTO is a valid URL protocol; these
                        # should be external links.
-                       if ( preg_match( '/^(?:' . wfUrlProtocols() . ')/', $m[1] ) ) {
+                       if ( preg_match( '/^(?:' . $this->mUrlProtocols . ')/', $m[1] ) ) {
                                $s .= $prefix . '[[' . $line ;
                                wfProfileOut( __METHOD__."-misc" );
                                continue;
@@ -2051,7 +2073,7 @@ class Parser {
         * @return String: less-or-more HTML with NOPARSE bits
         */
        function armorLinks( $text ) {
-               return preg_replace( '/\b(' . wfUrlProtocols() . ')/',
+               return preg_replace( '/\b(' . $this->mUrlProtocols . ')/',
                        "{$this->mUniqPrefix}NOPARSE$1", $text );
        }
 
@@ -2698,6 +2720,18 @@ class Parser {
                                $subjPage = $this->mTitle->getSubjectPage();
                                $value = wfEscapeWikiText( $subjPage->getPrefixedUrl() );
                                break;
+                       case 'pageid': // requested in bug 23427
+                               $pageid = $this->getTitle()->getArticleId();
+                               if( $pageid == 0 ) {
+                                       # 0 means the page doesn't exist in the database,
+                                       # which means the user is previewing a new page.
+                                       # The vary-revision flag must be set, because the magic word
+                                       # will have a different value once the page is saved.
+                                       $this->mOutput->setFlag( 'vary-revision' );
+                                       wfDebug( __METHOD__ . ": {{PAGEID}} used in a new page, setting vary-revision...\n" );
+                               }
+                               $value = $pageid ? $pageid : null;
+                               break;
                        case 'revisionid':
                                # Let the edit saving system know we should parse the page
                                # *after* a revision ID has been assigned.
@@ -2837,7 +2871,8 @@ class Parser {
                                $value = $pageLang->formatNum( SiteStats::edits() );
                                break;
                        case 'numberofviews':
-                               $value = $pageLang->formatNum( SiteStats::views() );
+                               global $wgDisableCounters;
+                               $value = !$wgDisableCounters ? $pageLang->formatNum( SiteStats::views() ) : '';
                                break;
                        case 'currenttimestamp':
                                $value = wfTimestamp( TS_MW, $ts );
@@ -3054,7 +3089,7 @@ class Parser {
         * @private
         */
        function braceSubstitution( $piece, $frame ) {
-               global $wgNonincludableNamespaces, $wgContLang;
+               global $wgContLang;
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__.'-setup' );
 
@@ -3249,8 +3284,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 +3322,7 @@ class Parser {
                                                $isHTML = true;
                                                $this->disableCache();
                                        }
-                               } elseif ( $wgNonincludableNamespaces && in_array( $title->getNamespace(), $wgNonincludableNamespaces ) ) {
+                               } elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) {
                                        $found = false; # access denied
                                        wfDebug( __METHOD__.": template inclusion denied for " . $title->getPrefixedDBkey() );
                                } else {
@@ -3365,10 +3403,8 @@ class Parser {
                }
 
                # Replace raw HTML by a placeholder
-               # Add a blank line preceding, to prevent it from mucking up
-               # immediately preceding headings
                if ( $isHTML ) {
-                       $text = "\n\n" . $this->insertStripItem( $text );
+                       $text = $this->insertStripItem( $text );
                } elseif ( $nowiki && ( $this->ot['html'] || $this->ot['pre'] ) ) {
                        # Escape nowiki-style return values
                        $text = wfEscapeWikiText( $text );
@@ -3811,12 +3847,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();
        }
 
        /**
@@ -4151,7 +4183,7 @@ class Parser {
                        # Don't number the heading if it is the only one (looks silly)
                        if ( count( $matches[3] ) > 1 && $this->mOptions->getNumberHeadings() ) {
                                # the two are different if the line contains a link
-                               $headline = $numbering . ' ' . $headline;
+                               $headline = Html::element( 'span', array( 'class' => 'mw-headline-number' ), $numbering ) . ' ' . $headline;
                        }
 
                        # Create the anchor for linking from the TOC to the section
@@ -4377,13 +4409,12 @@ 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)|]]
                $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";           # [[ns:page(context)|]]
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)($tc+|)\\|]]/"; # [[ns:page (context), context|]]
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]]
                $p2 = "/\[\[\\|($tc+)]]/";                                      # [[|page]]
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
@@ -4854,30 +4885,41 @@ class Parser {
 
                        $label = '';
                        $alt = '';
+                       $link = '';
                        if ( isset( $matches[3] ) ) {
                                // look for an |alt= definition while trying not to break existing
                                // captions with multiple pipes (|) in it, until a more sensible grammar
                                // is defined for images in galleries
 
                                $matches[3] = $this->recursiveTagParse( trim( $matches[3] ) );
-                               $altmatches = StringUtils::explode('|', $matches[3]);
+                               $parameterMatches = StringUtils::explode('|', $matches[3]);
                                $magicWordAlt = MagicWord::get( 'img_alt' );
+                               $magicWordLink = MagicWord::get( 'img_link' );
 
-                               foreach ( $altmatches as $altmatch ) {
-                                       $match = $magicWordAlt->matchVariableStartToEnd( $altmatch );
-                                       if ( $match ) {
+                               foreach ( $parameterMatches as $parameterMatch ) {
+                                       if ( $match = $magicWordAlt->matchVariableStartToEnd( $parameterMatch ) ) {
                                                $alt = $this->stripAltText( $match, false );
                                        }
+                                       elseif( $match = $magicWordLink->matchVariableStartToEnd( $parameterMatch ) ){
+                                               $link = strip_tags($this->replaceLinkHoldersText($match));
+                                               $chars = self::EXT_LINK_URL_CLASS;
+                                               $prots = $this->mUrlProtocols;
+                                               //check to see if link matches an absolute url, if not then it must be a wiki link.
+                                               if(!preg_match( "/^($prots)$chars+$/u", $link)){
+                                                       $localLinkTitle = Title::newFromText($link);
+                                                       $link = $localLinkTitle->getLocalURL();
+                                               }
+                                       }
                                        else {
                                                // concatenate all other pipes
-                                               $label .= '|' . $altmatch;
+                                               $label .= '|' . $parameterMatch;
                                        }
                                }
                                // remove the first pipe
                                $label = substr( $label, 1 );
                        }
 
-                       $ig->add( $title, $label, $alt );
+                       $ig->add( $title, $label, $alt ,$link);
                }
                return $ig->toHTML();
        }
@@ -5562,7 +5604,7 @@ class Parser {
                # @todo FIXME: Not tolerant to blank link text
                # I.E. [http://www.mediawiki.org] will render as [1] or something depending
                # on how many empty links there are on the page - need to figure that out.
-               $text = preg_replace( '/\[(?:' . wfUrlProtocols() . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
+               $text = preg_replace( '/\[(?:' . $this->mUrlProtocols . ')([^ ]+?) ([^[]+)\]/', '$2', $text );
 
                # Parse wikitext quotes (italics & bold)
                $text = $this->doQuotes( $text );
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..d929f1a 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.
@@ -141,8 +155,9 @@ class ParserOutput extends CacheTime {
                $mProperties = array(),       # Name/value pairs to be cached in the DB
                $mTOCHTML = '',               # HTML of the TOC
                $mTimestamp;                  # Timestamp of the revision
-       private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
-       private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
+               private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
+               private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
+               private $mSecondaryDataUpdates = array(); # List of instances of SecondaryDataObject(), used to cause some information extracted from the page in a custom place.
 
        const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
@@ -449,4 +464,40 @@ class ParserOutput extends CacheTime {
         function recordOption( $option ) {
                 $this->mAccessedOptions[$option] = true;
         }
+
+       /**
+        * Adds an update job to the output. Any update jobs added to the output will eventually bexecuted in order to
+        * store any secondary information extracted from the page's content.
+        *
+        * @param StorageUpdate $update
+        */
+       public function addSecondaryDataUpdate( DataUpdate $update ) {
+               $this->mSecondaryDataUpdates[] = $update;
+       }
+
+       /**
+        * Returns any DataUpdate jobs to be executed in order to store secondary information
+        * extracted from the page's content, including a LinksUpdate object for all links stored in
+        * this ParserOutput object.
+        *
+        * @param $title Title of the page we're updating. If not given, a title object will be created based on $this->getTitleText()
+        * @param $recursive Boolean: queue jobs for recursive updates?
+        *
+        * @return Array. An array of instances of DataUpdate
+        */
+       public function getSecondaryDataUpdates( Title $title = null, $recursive = true ) {
+               if ( !$title ) {
+                       $title = Title::newFromText( $this->getTitleText() );
+               }
+
+               $linksUpdate = new LinksUpdate( $title, $this, $recursive );
+
+               if ( !$this->mSecondaryDataUpdates ) {
+                       return array( $linksUpdate );
+               } else {
+                       $updates = array_merge( $this->mSecondaryDataUpdates, array( $linksUpdate ) );
+               }
+
+               return $updates;
+        }
 }
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..19bcbf2 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
  */
 
 /**
@@ -62,15 +78,19 @@ interface PPFrame {
 
        const RECOVER_ORIG = 27; // = 1|2|8|16 no constant expression support in PHP yet
 
+       /** This constant exists when $indexOffset is supported in newChild() */
+       const SUPPORTS_INDEX_OFFSET = 1;
+
        /**
         * Create a child frame
         *
         * @param $args array
         * @param $title Title
+        * @param $indexOffset A number subtracted from the index attributes of the arguments
         *
         * @return PPFrame
         */
-       function newChild( $args = false, $title = false );
+       function newChild( $args = false, $title = false, $indexOffset = 0 );
 
        /**
         * Expand a document tree node
index f129f73..f991df2 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
  */
@@ -41,7 +56,7 @@ class Preprocessor_DOM implements Preprocessor {
        }
 
        /**
-        * @param $args
+        * @param $args array
         * @return PPCustomFrame_DOM
         */
        function newCustomFrame( $args ) {
@@ -911,7 +926,7 @@ class PPFrame_DOM implements PPFrame {
         *
         * @return PPTemplateFrame_DOM
         */
-       function newChild( $args = false, $title = false ) {
+       function newChild( $args = false, $title = false, $indexOffset = 0 ) {
                $namedArgs = array();
                $numberedArgs = array();
                if ( $title === false ) {
@@ -923,6 +938,9 @@ class PPFrame_DOM implements PPFrame {
                                $args = $args->node;
                        }
                        foreach ( $args as $arg ) {
+                               if ( $arg instanceof PPNode ) {
+                                       $arg = $arg->node;
+                               }
                                if ( !$xpath ) {
                                        $xpath = new DOMXPath( $arg->ownerDocument );
                                }
@@ -932,6 +950,7 @@ class PPFrame_DOM implements PPFrame {
                                if ( $nameNodes->item( 0 )->hasAttributes() ) {
                                        // Numbered parameter
                                        $index = $nameNodes->item( 0 )->attributes->getNamedItem( 'index' )->textContent;
+                                       $index = $index - $indexOffset;
                                        $numberedArgs[$index] = $value->item( 0 );
                                        unset( $namedArgs[$index] );
                                } else {
@@ -958,14 +977,25 @@ class PPFrame_DOM implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                               $this->parser->mPPNodeCount,
+                               $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
 
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                               $expansionDepth,
+                               $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        return '<span class="error">Expansion depth limit exceeded</span>';
                }
                wfProfileIn( __METHOD__ );
                ++$expansionDepth;
+               if ( $expansionDepth > $this->parser->mHighestExpansionDepth ) {
+                       $this->parser->mHighestExpansionDepth = $expansionDepth;
+               }
 
                if ( $root instanceof PPNode_DOM ) {
                        $root = $root->node;
@@ -1523,6 +1553,10 @@ class PPCustomFrame_DOM extends PPFrame_DOM {
                }
                return $this->args[$index];
        }
+
+       function getArguments() {
+               return $this->args;
+       }
 }
 
 /**
index 28283c7..f455a1d 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
  */
@@ -32,7 +47,7 @@ class Preprocessor_Hash implements Preprocessor {
        }
 
        /**
-        * @param $args
+        * @param $args array
         * @return PPCustomFrame_Hash
         */
        function newCustomFrame( $args ) {
@@ -873,7 +888,7 @@ class PPFrame_Hash implements PPFrame {
         *
         * @return PPTemplateFrame_Hash
         */
-       function newChild( $args = false, $title = false ) {
+       function newChild( $args = false, $title = false, $indexOffset = 0 ) {
                $namedArgs = array();
                $numberedArgs = array();
                if ( $title === false ) {
@@ -889,8 +904,9 @@ class PPFrame_Hash implements PPFrame {
                                $bits = $arg->splitArg();
                                if ( $bits['index'] !== '' ) {
                                        // Numbered parameter
-                                       $numberedArgs[$bits['index']] = $bits['value'];
-                                       unset( $namedArgs[$bits['index']] );
+                                       $index = $bits['index'] - $indexOffset;
+                                       $numberedArgs[$index] = $bits['value'];
+                                       unset( $namedArgs[$index] );
                                } else {
                                        // Named parameter
                                        $name = trim( $this->expand( $bits['name'], PPFrame::STRIP_COMMENTS ) );
@@ -915,12 +931,23 @@ class PPFrame_Hash implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                                       $this->parser->mPPNodeCount,
+                                       $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                                       $expansionDepth,
+                                       $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        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 );
@@ -1470,6 +1497,10 @@ class PPCustomFrame_Hash extends PPFrame_Hash {
                }
                return $this->args[$index];
        }
+
+       function getArguments() {
+               return $this->args;
+       }
 }
 
 /**
index aedcac2..d7b0716 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
  */
@@ -18,6 +33,9 @@ class Preprocessor_HipHop implements Preprocessor {
 
        const CACHE_VERSION = 1;
 
+       /**
+        * @param $parser Parser
+        */
        function __construct( $parser ) {
                $this->parser = $parser;
        }
@@ -30,7 +48,7 @@ class Preprocessor_HipHop implements Preprocessor {
        }
 
        /**
-        * @param $args
+        * @param $args array
         * @return PPCustomFrame_HipHop
         */
        function newCustomFrame( array $args ) {
@@ -88,6 +106,7 @@ class Preprocessor_HipHop implements Preprocessor {
         * cache may be implemented at a later date which takes further advantage of these strict
         * dependency requirements.
         *
+        * @throws MWException
         * @return PPNode_HipHop_Tree
         */
        function preprocessToObj( string $text, int $flags = 0 ) {
@@ -815,16 +834,23 @@ class PPDStack_HipHop {
  * @ingroup Parser
  */
 class PPDStackElement_HipHop {
-       var $open,                      // Opening character (\n for heading)
-               $close,             // Matching closing character
+       var $open,              // Opening character (\n for heading)
+               $close,             // Matching closing character
                $count,             // Number of opening characters found (number of "=" for heading)
                $parts,             // Array of PPDPart objects describing pipe-separated parts.
                $lineStart;         // True if the open char appeared at the start of the input line. Not set for headings.
 
+       /**
+        * @param $obj PPDStackElement_HipHop
+        * @return PPDStackElement_HipHop
+        */
        static function cast( PPDStackElement_HipHop $obj ) {
                return $obj;
        }
 
+       /**
+        * @param $data array
+        */
        function __construct( $data = array() ) {
                $this->parts = array( new PPDPart_HipHop );
 
@@ -833,14 +859,23 @@ class PPDStackElement_HipHop {
                }
        }
 
+       /**
+        * @return PPDAccum_HipHop
+        */
        function getAccum() {
                return PPDAccum_HipHop::cast( $this->parts[count($this->parts) - 1]->out );
        }
 
+       /**
+        * @param $s string
+        */
        function addPart( $s = '' ) {
                $this->parts[] = new PPDPart_HipHop( $s );
        }
 
+       /**
+        * @return PPDPart_HipHop
+        */
        function getCurrentPart() {
                return PPDPart_HipHop::cast( $this->parts[count($this->parts) - 1] );
        }
@@ -861,6 +896,7 @@ class PPDStackElement_HipHop {
        /**
         * Get the accumulator that would result if the close is not found.
         *
+        * @param $openingCount bool
         * @return PPDAccum_HipHop
         */
        function breakSyntax( $openingCount = false ) {
@@ -1026,9 +1062,10 @@ class PPFrame_HipHop implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
-        * @param $args PPNode_HipHop_Array|array
-        * @param $title Title|false
+        * @param $args PPNode_HipHop_Array|array|bool
+        * @param $title Title|bool
         *
+        * @throws MWException
         * @return PPTemplateFrame_HipHop
         */
        function newChild( $args = false, $title = false ) {
@@ -1073,12 +1110,23 @@ class PPFrame_HipHop implements PPFrame {
                }
 
                if ( ++$this->parser->mPPNodeCount > $this->parser->mOptions->getMaxPPNodeCount() ) {
+                       $this->parser->limitationWarn( 'node-count-exceeded',
+                                       $this->parser->mPPNodeCount,
+                                       $this->parser->mOptions->getMaxPPNodeCount()
+                       );
                        return '<span class="error">Node-count limit exceeded</span>';
                }
                if ( $expansionDepth > $this->parser->mOptions->getMaxPPExpandDepth() ) {
+                       $this->parser->limitationWarn( 'expansion-depth-exceeded',
+                                       $expansionDepth,
+                                       $this->parser->mOptions->getMaxPPExpandDepth()
+                       );
                        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 );
@@ -1267,6 +1315,7 @@ class PPFrame_HipHop implements PPFrame {
        /**
         * Implode with no flags specified
         * This previously called implodeWithFlags but has now been inlined to reduce stack depth
+        * @param $sep
         * @return string
         */
        function implode( $sep /*, ... */ ) {
@@ -1297,6 +1346,7 @@ class PPFrame_HipHop implements PPFrame {
         * Makes an object that, when expand()ed, will be the same as one obtained
         * with implode()
         *
+        * @param $sep
         * @return PPNode_HipHop_Array
         */
        function virtualImplode( $sep /*, ... */ ) {
@@ -1326,6 +1376,9 @@ class PPFrame_HipHop implements PPFrame {
        /**
         * Virtual implode with brackets
         *
+        * @param $start
+        * @param $sep
+        * @param $end
         * @return PPNode_HipHop_Array
         */
        function virtualBracketedImplode( $start, $sep, $end /*, ... */ ) {
@@ -1446,11 +1499,11 @@ class PPTemplateFrame_HipHop extends PPFrame_HipHop {
        var $numberedExpansionCache, $namedExpansionCache;
 
        /**
-        * @param $preprocessor
-        * @param $parent
+        * @param $preprocessor Preprocessor_HipHop
+        * @param $parent bool
         * @param $numberedArgs array
         * @param $namedArgs array
-        * @param $title Title
+        * @param $title Title|bool
         */
        function __construct( $preprocessor, $parent = false, $numberedArgs = array(), $namedArgs = array(), $title = false ) {
                parent::__construct( $preprocessor );
@@ -1697,6 +1750,10 @@ class PPNode_HipHop_Tree implements PPNode {
                return $this->nextSibling;
        }
 
+       /**
+        * @param $name string
+        * @return array
+        */
        function getChildrenOfType( $name ) {
                $children = array();
                for ( $child = $this->firstChild; $child; $child = $child->nextSibling ) {
@@ -1735,6 +1792,7 @@ class PPNode_HipHop_Tree implements PPNode {
         *    index         String index
         *    value         PPNode value
         *
+        * @throws MWException
         * @return array
         */
        function splitArg() {
@@ -1768,6 +1826,7 @@ class PPNode_HipHop_Tree implements PPNode {
         * Split an <ext> node into an associative array containing name, attr, inner and close
         * All values in the resulting array are PPNodes. Inner and close are optional.
         *
+        * @throws MWException
         * @return array
         */
        function splitExt() {
@@ -1795,6 +1854,7 @@ class PPNode_HipHop_Tree implements PPNode {
        /**
         * Split an <h> node
         *
+        * @throws MWException
         * @return array
         */
        function splitHeading() {
index 7ad80fa..b08aa14 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.
@@ -10,6 +31,10 @@ class StripState {
        protected $regex;
 
        protected $tempType, $tempMergePrefix;
+       protected $circularRefGuard;
+       protected $recursionLevel = 0;
+
+       const UNSTRIP_RECURSION_LIMIT = 20;
 
        /**
         * @param $prefix string
@@ -21,6 +46,7 @@ class StripState {
                        'general' => array()
                );
                $this->regex = "/{$this->prefix}([^\x7f]+)" . Parser::MARKER_SUFFIX . '/';
+               $this->circularRefGuard = array();
        }
 
        /**
@@ -92,12 +118,10 @@ class StripState {
                }
 
                wfProfileIn( __METHOD__ );
+               $oldType = $this->tempType;
                $this->tempType = $type;
-               do {
-                       $oldText = $text;
-                       $text = preg_replace_callback( $this->regex, array( $this, 'unstripCallback' ), $text );
-               } while ( $text !== $oldText );
-               $this->tempType = null;
+               $text = preg_replace_callback( $this->regex, array( $this, 'unstripCallback' ), $text );
+               $this->tempType = $oldType;
                wfProfileOut( __METHOD__ );
                return $text;
        }
@@ -107,8 +131,22 @@ class StripState {
         * @return array
         */
        protected function unstripCallback( $m ) {
-               if ( isset( $this->data[$this->tempType][$m[1]] ) ) {
-                       return $this->data[$this->tempType][$m[1]];
+               $marker = $m[1];
+               if ( isset( $this->data[$this->tempType][$marker] ) ) {
+                       if ( isset( $this->circularRefGuard[$marker] ) ) {
+                               return '<span class="error">' . wfMsgForContent( 'parser-unstrip-loop-warning' ) . '</span>';
+                       }
+                       if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
+                               return '<span class="error">' . 
+                                       wfMsgForContent( 'parser-unstrip-recursion-limit', self::UNSTRIP_RECURSION_LIMIT ) . 
+                                       '</span>';
+                       }
+                       $this->circularRefGuard[$marker] = true;
+                       $this->recursionLevel++;
+                       $ret = $this->unstripType( $this->tempType, $this->data[$this->tempType][$marker] );
+                       $this->recursionLevel--;
+                       unset( $this->circularRefGuard[$marker] );
+                       return $ret;
                } else {
                        return $m[0];
                }
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 f884063..62be39e 100644 (file)
@@ -1,12 +1,31 @@
 <?php
 /**
- * @defgroup Profiler Profiler
+ * Base class and functions for profiling.
+ *
+ * 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 Profiler
  * This file is only included if profiling is enabled
  */
 
+/**
+ * @defgroup Profiler Profiler
+ */
+
 /**
  * Begin profiling of a function
  * @param $functionname String: name of the function we will profile
@@ -95,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;
        }
@@ -460,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.
@@ -530,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 1091495..d1d1c5d 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Base class for simple profiling.
+ *
+ * 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 Profiler
  */
@@ -15,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 3621a41..3e7d6fa 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler showing output in page source.
+ *
+ * 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 Profiler
  */
index 7602f06..822e9fe 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler showing execution trace.
+ *
+ * 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 Profiler
  */
@@ -44,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 ae607aa..a95ccb0 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Profiler sending messages over UDP.
+ *
+ * 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 Profiler
  */
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerSimple {
+       public function isPersistent() {
+               return true;
+       }
+
        public function logData() {
                global $wgUDPProfilerHost, $wgUDPProfilerPort;
 
index 1a0933c..c0eb0fb 100644 (file)
@@ -1,13 +1,38 @@
 <?php
 /**
- * Stub profiling functions
+ * Stub profiling 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 Profiler
  */
+
+/**
+ * Stub profiler that does nothing
+ *
+ * @ingroup Profiler
+ */
 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 7a036b8..93dac7b 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
@@ -239,9 +241,9 @@ class ResourceLoader {
                                );
                        }
 
-                       // Check $name for illegal characters
-                       if ( preg_match( '/[|,!]/', $name ) ) {
-                               throw new MWException( "ResourceLoader module name '$name' is invalid. Names may not contain pipes (|), commas (,) or exclamation marks (!)" );
+                       // Check $name for validity
+                       if ( !self::isValidModuleName( $name ) ) {
+                               throw new MWException( "ResourceLoader module name '$name' is invalid, see ResourceLoader::isValidModuleName()" );
                        }
 
                        // Attach module
@@ -500,10 +502,6 @@ class ResourceLoader {
                        $response = $this->makeComment( $warnings ) . $response;
                }
 
-               // Remove the output buffer and output the response
-               ob_end_clean();
-               echo $response;
-
                // Save response to file cache unless there are errors
                if ( isset( $fileCache ) && !$errors && !$missing ) {
                        // Cache single modules...and other requests if there are enough hits
@@ -516,6 +514,10 @@ class ResourceLoader {
                        }
                }
 
+               // Remove the output buffer and output the response
+               ob_end_clean();
+               echo $response;
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -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
         */
@@ -683,6 +685,7 @@ class ResourceLoader {
                }
 
                // Generate output
+               $isRaw = false;
                foreach ( $modules as $name => $module ) {
                        /**
                         * @var $module ResourceLoaderModule
@@ -710,12 +713,27 @@ class ResourceLoader {
                                // Styles
                                $styles = array();
                                if ( $context->shouldIncludeStyles() ) {
-                                       // If we are in debug mode, we'll want to return an array of URLs
-                                       // See comment near shouldIncludeScripts() for more details
-                                       if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
-                                               $styles = $module->getStyleURLsForDebug( $context );
-                                       } else {
-                                               $styles = $module->getStyles( $context );
+                                       // Don't create empty stylesheets like array( '' => '' ) for modules
+                                       // that don't *have* any stylesheets (bug 38024).
+                                       $stylePairs = $module->getStyles( $context );
+                                       if ( count ( $stylePairs ) ) {
+                                               // If we are in debug mode without &only= set, we'll want to return an array of URLs
+                                               // See comment near shouldIncludeScripts() for more details
+                                               if ( $context->getDebug() && !$context->getOnly() && $module->supportsURLLoading() ) {
+                                                       $styles = $module->getStyleURLsForDebug( $context );
+                                               } else {
+                                                       // Minify CSS before embedding in mw.loader.implement call
+                                                       // (unless in debug mode)
+                                                       if ( !$context->getDebug() ) {
+                                                               foreach ( $stylePairs as $media => $style ) {
+                                                                       if ( is_string( $style ) ) {
+                                                                               $stylePairs[$media] = $this->filter( 'minify-css', $style );
+                                                                       }
+                                                               }
+                                                       }
+                                                       // Combine styles into @media groups as one big string
+                                                       $styles = array( '' => self::makeCombinedStyles( $stylePairs ) );
+                                               }
                                        }
                                }
 
@@ -734,23 +752,18 @@ class ResourceLoader {
                                                }
                                                break;
                                        case 'styles':
-                                               $out .= self::makeCombinedStyles( $styles );
+                                               $out .= $styles['']; // Code above has set $styles['']
                                                break;
                                        case 'messages':
                                                $out .= self::makeMessageSetScript( new XmlJsCode( $messagesBlob ) );
                                                break;
                                        default:
-                                               // Minify CSS before embedding in mw.loader.implement call
-                                               // (unless in debug mode)
-                                               if ( !$context->getDebug() ) {
-                                                       foreach ( $styles as $media => $style ) {
-                                                               if ( is_string( $style ) ) {
-                                                                       $styles[$media] = $this->filter( 'minify-css', $style );
-                                                               }
-                                                       }
-                                               }
-                                               $out .= self::makeLoaderImplementScript( $name, $scripts, $styles,
-                                                       new XmlJsCode( $messagesBlob ) );
+                                               $out .= self::makeLoaderImplementScript(
+                                                       $name,
+                                                       $scripts,
+                                                       $styles,
+                                                       new XmlJsCode( $messagesBlob )
+                                               );
                                                break;
                                }
                        } catch ( Exception $e ) {
@@ -761,15 +774,14 @@ class ResourceLoader {
                                $missing[] = $name;
                                unset( $modules[$name] );
                        }
+                       $isRaw |= $module->isRaw();
                        wfProfileOut( __METHOD__ . '-' . $name );
                }
 
                // Update module states
-               if ( $context->shouldIncludeScripts() ) {
+               if ( $context->shouldIncludeScripts() && !$context->getRaw() && !$isRaw ) {
                        // Set the state of modules loaded as only scripts to ready
-                       if ( count( $modules ) && $context->getOnly() === 'scripts'
-                               && !isset( $modules['startup'] ) )
-                       {
+                       if ( count( $modules ) && $context->getOnly() === 'scripts' ) {
                                $out .= self::makeLoaderStateScript(
                                        array_fill_keys( array_keys( $modules ), 'ready' ) );
                        }
@@ -1097,4 +1109,17 @@ class ResourceLoader {
                ksort( $query );
                return $query;
        }
+
+       /**
+        * Check a module name for validity.
+        *
+        * Module names may not contain pipes (|), commas (,) or exclamation marks (!) and can be
+        * at most 255 bytes.
+        *
+        * @param $moduleName string Module name to check
+        * @return bool Whether $moduleName is a valid module name
+        */
+       public static function isValidModuleName( $moduleName ) {
+               return !preg_match( '/[|,!]/', $moduleName ) && strlen( $moduleName ) <= 255;
+       }
 }
index dd69bb0..0e96c6c 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
@@ -39,6 +41,7 @@ class ResourceLoaderContext {
        protected $only;
        protected $version;
        protected $hash;
+       protected $raw;
 
        /* Methods */
 
@@ -62,6 +65,7 @@ class ResourceLoaderContext {
                $this->debug     = $request->getFuzzyBool( 'debug', $wgResourceLoaderDebug );
                $this->only      = $request->getVal( 'only' );
                $this->version   = $request->getVal( 'version' );
+               $this->raw       = $request->getFuzzyBool( 'raw' );
 
                $skinnames = Skin::getSkinNames();
                // If no skin is specified, or we don't recognize the skin, use the default skin
@@ -157,7 +161,7 @@ class ResourceLoaderContext {
                        $this->direction = $this->request->getVal( 'dir' );
                        if ( !$this->direction ) {
                                # directionality based on user language (see bug 6100)
-                               $this->direction = Language::factory( $this->language )->getDir();
+                               $this->direction = Language::factory( $this->getLanguage() )->getDir();
                        }
                }
                return $this->direction;
@@ -198,6 +202,13 @@ class ResourceLoaderContext {
                return $this->version;
        }
 
+       /**
+        * @return bool
+        */
+       public function getRaw() {
+               return $this->raw;
+       }
+
        /**
         * @return bool
         */
index 3d657e1..f0892ec 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
@@ -109,6 +111,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected $position = 'bottom';
        /** Boolean: Link to raw files in debug mode */
        protected $debugRaw = true;
+       /** Boolean: Whether mw.loader.state() call should be omitted */
+       protected $raw = false;
        /**
         * Array: Cache for mtime
         * @par Usage:
@@ -238,6 +242,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                                // Single booleans
                                case 'debugRaw':
+                               case 'raw':
                                        $this->{$member} = (bool) $option;
                                        break;
                        }
@@ -365,6 +370,13 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->dependencies;
        }
 
+       /**
+        * @return bool
+        */
+       public function isRaw() {
+               return $this->raw;
+       }
+
        /**
         * Get the last modified timestamp of this module.
         *
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..a36aaec 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
  */
 class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
 
+       protected $language;
        /**
         * Get the grammer forms for the site content language.
         *
         * @return array
         */
        protected function getSiteLangGrammarForms() {
-               global $wgContLang;
-               return $wgContLang->getGrammarForms();
+               return $this->language->getGrammarForms();
+       }
+
+       /**
+        * Get the digit transform table for the content language
+        * Seperator transform table also required here to convert
+        * the . and , sign to appropriate forms in content language.
+        *
+        * @return array
+        */
+       protected function getDigitTransformTable() {
+               $digitTransformTable = $this->language->digitTransformTable();
+               $separatorTransformTable = $this->language->separatorTransformTable();
+               if ( $digitTransformTable ) {
+                       array_merge( $digitTransformTable, (array)$separatorTransformTable );
+               } else {
+                       return $separatorTransformTable;
+               }
+               return $digitTransformTable;
+       }
+
+       /**
+        * Get all the dynamic data for the content language to an array
+        *
+        * @return array
+        */
+       protected function getData() {
+               return array( 'grammarForms' => $this->getSiteLangGrammarForms(),
+                               'digitTransformTable' => $this->getDigitTransformTable()
+                       );
        }
 
        /**
         * @param $context ResourceLoaderContext
-        * @return string Javascript code
+        * @return string: Javascript code
         */
        public function getScript( ResourceLoaderContext $context ) {
-               global $wgContLang;
-
+               $this->language = Language::factory( $context ->getLanguage() );
                return Xml::encodeJsCall( 'mw.language.setData', array(
-                       $wgContLang->getCode(),
-                       array( 'grammarForms' => $this->getSiteLangGrammarForms() )
+                       $this->language->getCode(),
+                       $this->getData()
                ) );
        }
 
@@ -53,20 +83,22 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return array|int|Mixed
         */
        public function getModifiedTime( ResourceLoaderContext $context ) {
+               $this->language = Language::factory( $context ->getLanguage() );
                $cache = wfGetCache( CACHE_ANYTHING );
                $key = wfMemcKey( 'resourceloader', 'langdatamodule', 'changeinfo' );
 
-               $forms = $this->getSiteLangGrammarForms();
-               $hash = md5( serialize( $forms ) );
+               $data = $this->getData();
+               $hash = md5( serialize( $data ) );
 
                $result = $cache->get( $key );
-               if ( is_array( $result ) ) {
-                       if ( $result['hash'] === $hash ) {
-                               return $result['timestamp'];
-                       }
+               if ( is_array( $result ) && $result['hash'] === $hash ) {
+                       return $result['timestamp'];
                }
                $timestamp = wfTimestamp();
-               $cache->set( $key, array( 'hash' => $hash, 'timestamp' => $timestamp ) );
+               $cache->set( $key, array(
+                       'hash' => $hash,
+                       'timestamp' => $timestamp,
+               ) );
                return $timestamp;
        }
 
@@ -74,6 +106,6 @@ class ResourceLoaderLanguageDataModule extends ResourceLoaderModule {
         * @return array
         */
        public function getDependencies() {
-               return array( 'mediawiki.language' );
+               return array( 'mediawiki.language.init' );
        }
 }
index 1a232ec..035ff09 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
@@ -244,6 +246,17 @@ abstract class ResourceLoaderModule {
                return 'bottom';
        }
 
+       /**
+        * Whether this module's JS expects to work without the client-side ResourceLoader module.
+        * Returning true from this function will prevent mw.loader.state() call from being
+        * appended to the bottom of the script.
+        *
+        * @return bool
+        */
+       public function isRaw() {
+               return false;
+       }
+
        /**
         * Get the loader JS for this module, if set.
         *
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 5dbce43..467a1ac 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
@@ -80,7 +82,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgDefaultDateFormat' => $wgContLang->getDefaultDateFormat(),
                        'wgMonthNames' => $wgContLang->getMonthNamesArray(),
                        'wgMonthNamesShort' => $wgContLang->getMonthAbbreviationsArray(),
-                       'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null,
+                       'wgMainPageTitle' => $mainPage->getPrefixedText(),
                        'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(),
                        'wgNamespaceIds' => $namespaceIds,
                        'wgSiteName' => $wgSitename,
@@ -125,12 +127,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
+                       $deps = $module->getDependencies();
+                       $group = $module->getGroup();
+                       $source = $module->getSource();
                        // Support module loader scripts
                        $loader = $module->getLoaderScript();
                        if ( $loader !== false ) {
-                               $deps = $module->getDependencies();
-                               $group = $module->getGroup();
-                               $source = $module->getSource();
                                $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
                                $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
@@ -143,26 +145,23 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
                                // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
                                // mw.loader.register()
-                               if ( !count( $module->getDependencies() && $module->getGroup() === null && $module->getSource() === 'local' ) ) {
+                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
                                        $registrations[] = array( $name, $mtime );
                                }
                                // Modules with dependencies but no group or foreign source pass three arguments
                                // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $module->getGroup() === null && $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies() );
+                               elseif ( $group === null && $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps );
                                }
                                // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
                                // to mw.loader.register()
-                               elseif ( $module->getSource() === 'local' ) {
-                                       $registrations[] = array(
-                                               $name, $mtime,  $module->getDependencies(), $module->getGroup() );
+                               elseif ( $source === 'local' ) {
+                                       $registrations[] = array( $name, $mtime, $deps, $group );
                                }
                                // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
                                // to mw.loader.register()
                                else {
-                                       $registrations[] = array(
-                                               $name, $mtime, $module->getDependencies(), $module->getGroup(), $module->getSource() );
+                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
                                }
                        }
                }
@@ -174,6 +173,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
        /* Methods */
 
+       /**
+        * @return bool
+        */
+       public function isRaw() {
+               return true;
+       }
+
        /**
         * @param $context ResourceLoaderContext
         * @return string
@@ -185,19 +191,20 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                if ( $context->getOnly() === 'scripts' ) {
 
                        // The core modules:
-                       $modules = array( 'jquery', 'mediawiki' );
-                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$modules ) );
+                       $moduleNames = array( 'jquery', 'mediawiki' );
+                       wfRunHooks( 'ResourceLoaderGetStartupModules', array( &$moduleNames ) );
 
                        // Get the latest version
+                       $loader = $context->getResourceLoader();
                        $version = 0;
-                       foreach ( $modules as $moduleName ) {
+                       foreach ( $moduleNames as $moduleName ) {
                                $version = max( $version,
-                                       $context->getResourceLoader()->getModule( $moduleName )->getModifiedTime( $context )
+                                       $loader->getModule( $moduleName )->getModifiedTime( $context )
                                );
                        }
                        // Build load query for StartupModules
                        $query = array(
-                               'modules' => ResourceLoader::makePackedModulesString( $modules ),
+                               'modules' => ResourceLoader::makePackedModulesString( $moduleNames ),
                                'only' => 'scripts',
                                'lang' => $context->getLanguage(),
                                'skin' => $context->getSkin(),
@@ -210,6 +217,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        // Startup function
                        $configuration = $this->getConfig( $context );
                        $registrations = self::getModuleRegistrations( $context );
+                       $registrations = str_replace( "\n", "\n\t", trim( $registrations ) ); // fix indentation
                        $out .= "var startUp = function() {\n" .
                                "\tmw.config = new " . Xml::encodeJsCall( 'mw.Map', array( $wgLegacyJavaScriptGlobals ) ) . "\n" .
                                "\t$registrations\n" .
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..1316f42 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
@@ -34,7 +36,7 @@ class ResourceLoaderUserGroupsModule extends ResourceLoaderWikiModule {
                global $wgUser;
 
                $userName = $context->getUser();
-               if ( !$userName ) {
+               if ( $userName === null ) {
                        return array();
                }
 
index 9fa9bce..177302c 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
@@ -35,7 +37,7 @@ class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
        protected function getPages( ResourceLoaderContext $context ) {
                $username = $context->getUser();
 
-               if ( !$username ) {
+               if ( $username === null ) {
                        return array();
                }
 
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 91a51f8..f35e774 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
@@ -20,8 +22,6 @@
  * @author Roan Kattouw
  */
 
-defined( 'MEDIAWIKI' ) || die( 1 );
-
 /**
  * Abstraction for resource loader modules which pull from wiki pages
  *
@@ -70,8 +70,10 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         */
        protected function getContent( $title ) {
                if ( $title->getNamespace() === NS_MEDIAWIKI ) {
-                       $message = wfMessage( $title->getDBkey() )->inContentLanguage();
-                       return $message->exists() ? $message->plain() : '';
+                       // The first "true" is to use the database, the second is to use the content langue
+                       // and the last one is to specify the message key already contains the language in it ("/de", etc.)
+                       $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
+                       return $text === false ? '' : $text;
                }
                if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
                        return null;
index 9ca98e5..6ceadff 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Base implementations for deletable items.
+ *
+ * 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 RevisionDelete
+ */
+
 /**
  * List for revision table items
  *
@@ -194,11 +216,13 @@ class RevDel_RevisionItem extends RevDel_Item {
         * @return string
         */
        protected function getRevisionLink() {
-               $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $date;
                }
-               return Linker::link(
+               return Linker::linkKnown(
                        $this->list->title,
                        $date,
                        array(),
@@ -216,35 +240,32 @@ class RevDel_RevisionItem extends RevDel_Item {
         */
        protected function getDiffLink() {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return wfMsgHtml('diff');
+                       return $this->list->msg( 'diff' )->escaped();
                } else {
                        return
-                               Linker::link(
+                               Linker::linkKnown(
                                        $this->list->title,
-                                       wfMsgHtml('diff'),
+                                       $this->list->msg( 'diff' )->escaped(),
                                        array(),
                                        array(
                                                'diff' => $this->revision->getId(),
                                                'oldid' => 'prev',
                                                'unhide' => 1
-                                       ),
-                                       array(
-                                               'known',
-                                               'noclasses'
                                        )
                                );
                }
        }
 
        public function getHTML() {
-               $difflink = $this->getDiffLink();
+               $difflink = $this->list->msg( 'parentheses' )
+                       ->rawParams( $this->getDiffLink() )->escaped();
                $revlink = $this->getRevisionLink();
                $userlink = Linker::revUserLink( $this->revision );
                $comment = Linker::revComment( $this->revision );
                if ( $this->isDeleted() ) {
                        $revlink = "<span class=\"history-deleted\">$revlink</span>";
                }
-               return "<li>($difflink) $revlink $userlink $comment</li>";
+               return "<li>$difflink $revlink $userlink $comment</li>";
        }
 }
 
@@ -341,29 +362,39 @@ class RevDel_ArchiveItem extends RevDel_RevisionItem {
        }
 
        protected function getRevisionLink() {
-               $undelete = SpecialPage::getTitleFor( 'Undelete' );
-               $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->revision->getTimestamp(), $this->list->getUser() ) );
+
                if ( $this->isDeleted() && !$this->canViewContent() ) {
                        return $date;
                }
-               return Linker::link( $undelete, $date, array(),
+
+               return Linker::link(
+                       SpecialPage::getTitleFor( 'Undelete' ),
+                       $date,
+                       array(),
                        array(
                                'target' => $this->list->title->getPrefixedText(),
                                'timestamp' => $this->revision->getTimestamp()
-                       ) );
+                       )
+               );
        }
 
        protected function getDiffLink() {
                if ( $this->isDeleted() && !$this->canViewContent() ) {
-                       return wfMsgHtml( 'diff' );
+                       return $this->list->msg( 'diff' )->escaped();
                }
-               $undelete = SpecialPage::getTitleFor( 'Undelete' );
-               return Linker::link( $undelete, wfMsgHtml('diff'), array(),
+
+               return Linker::link(
+                       SpecialPage::getTitleFor( 'Undelete' ),
+                       $this->list->msg( 'diff' )->escaped(),
+                       array(),
                        array(
                                'target' => $this->list->title->getPrefixedText(),
                                'diff' => 'prev',
                                'timestamp' => $this->revision->getTimestamp()
-                       ) );
+                       )
+               );
        }
 }
 
@@ -574,29 +605,31 @@ class RevDel_FileItem extends RevDel_Item {
         * @return string
         */
        protected function getLink() {
-               $date = $this->list->getLanguage()->timeanddate( $this->file->getTimestamp(), true  );
-               if ( $this->isDeleted() ) {
-                       # Hidden files...
-                       if ( !$this->canViewContent() ) {
-                               $link = $date;
-                       } else {
-                               $revdelete = SpecialPage::getTitleFor( 'Revisiondelete' );
-                               $link = Linker::link(
-                                       $revdelete,
-                                       $date, array(),
-                                       array(
-                                               'target' => $this->list->title->getPrefixedText(),
-                                               'file'   => $this->file->getArchiveName(),
-                                               'token'  => $this->list->getUser()->getEditToken(
-                                                       $this->file->getArchiveName() )
-                                       )
-                               );
-                       }
-                       return '<span class="history-deleted">' . $link . '</span>';
-               } else {
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() ) );
+
+               if ( !$this->isDeleted() ) {
                        # Regular files...
-                       return Xml::element( 'a', array( 'href' => $this->file->getUrl() ), $date );
+                       return Html::rawElement( 'a', array( 'href' => $this->file->getUrl() ), $date );
                }
+
+               # Hidden files...
+               if ( !$this->canViewContent() ) {
+                       $link = $date;
+               } else {
+                       $link = Linker::link(
+                               SpecialPage::getTitleFor( 'Revisiondelete' ),
+                               $date,
+                               array(),
+                               array(
+                                       'target' => $this->list->title->getPrefixedText(),
+                                       'file'   => $this->file->getArchiveName(),
+                                       'token'  => $this->list->getUser()->getEditToken(
+                                               $this->file->getArchiveName() )
+                               )
+                       );
+               }
+               return '<span class="history-deleted">' . $link . '</span>';
        }
        /**
         * Generate a user tool link cluster if the current user is allowed to view it
@@ -607,7 +640,7 @@ class RevDel_FileItem extends RevDel_Item {
                        $link = Linker::userLink( $this->file->user, $this->file->user_text ) .
                                Linker::userToolLinks( $this->file->user, $this->file->user_text );
                } else {
-                       $link = wfMsgHtml( 'rev-deleted-user' );
+                       $link = $this->list->msg( 'rev-deleted-user' )->escaped();
                }
                if( $this->file->isDeleted( Revision::DELETED_USER ) ) {
                        return '<span class="history-deleted">' . $link . '</span>';
@@ -625,7 +658,7 @@ class RevDel_FileItem extends RevDel_Item {
                if( $this->file->userCan( File::DELETED_COMMENT, $this->list->getUser() ) ) {
                        $block = Linker::commentBlock( $this->file->description );
                } else {
-                       $block = ' ' . wfMsgHtml( 'rev-deleted-comment' );
+                       $block = ' ' . $this->list->msg( 'rev-deleted-comment' )->escaped();
                }
                if( $this->file->isDeleted( File::DELETED_COMMENT ) ) {
                        return "<span class=\"history-deleted\">$block</span>";
@@ -635,14 +668,9 @@ class RevDel_FileItem extends RevDel_Item {
 
        public function getHTML() {
                $data =
-                       wfMsg(
-                               'widthheight',
-                               $this->list->getLanguage()->formatNum( $this->file->getWidth() ),
-                               $this->list->getLanguage()->formatNum( $this->file->getHeight() )
-                       ) .
-                       ' (' .
-                       wfMsgExt( 'nbytes', 'parsemag', $this->list->getLanguage()->formatNum( $this->file->getSize() ) ) .
-                       ')';
+                       $this->list->msg( 'widthheight' )->numParams(
+                               $this->file->getWidth(), $this->file->getHeight() )->text() .
+                       ' (' . $this->list->msg( 'nbytes' )->numParams( $this->file->getSize() )->text() . ')';
 
                return '<li>' . $this->getLink() . ' ' . $this->getUserTools() . ' ' .
                        $data . ' ' . $this->getComment(). '</li>';
@@ -725,13 +753,15 @@ class RevDel_ArchivedFileItem extends RevDel_FileItem {
        }
 
        protected function getLink() {
-               $date = $this->list->getLanguage()->timeanddate( $this->file->getTimestamp(), true  );
-               $undelete = SpecialPage::getTitleFor( 'Undelete' );
-               $key = $this->file->getKey();
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->file->getTimestamp(), $this->list->getUser() ) );
+
                # Hidden files...
                if( !$this->canViewContent() ) {
                        $link = $date;
                } else {
+                       $undelete = SpecialPage::getTitleFor( 'Undelete' );
+                       $key = $this->file->getKey();
                        $link = Linker::link( $undelete, $date, array(),
                                array(
                                        'target' => $this->list->title->getPrefixedText(),
@@ -850,18 +880,21 @@ class RevDel_LogItem extends RevDel_Item {
        }
 
        public function getHTML() {
-               $date = htmlspecialchars( $this->list->getLanguage()->timeanddate( $this->row->log_timestamp ) );
+               $date = htmlspecialchars( $this->list->getLanguage()->userTimeAndDate(
+                       $this->row->log_timestamp, $this->list->getUser() ) );
                $title = Title::makeTitle( $this->row->log_namespace, $this->row->log_title );
                $formatter = LogFormatter::newFromRow( $this->row );
+               $formatter->setContext( $this->list->getContext() );
                $formatter->setAudience( LogFormatter::FOR_THIS_USER );
 
                // Log link for this page
                $loglink = Linker::link(
                        SpecialPage::getTitleFor( 'Log' ),
-                       wfMsgHtml( 'log' ),
+                       $this->list->msg( 'log' )->escaped(),
                        array(),
                        array( 'page' => $title->getPrefixedText() )
                );
+               $loglink = $this->list->msg( 'parentheses' )->rawParams( $loglink )->escaped();
                // User links and action text
                $action = $formatter->getActionText();
                // Comment
@@ -870,6 +903,6 @@ class RevDel_LogItem extends RevDel_Item {
                        $comment = '<span class="history-deleted">' . $comment . '</span>';
                }
 
-               return "<li>($loglink) $date $action $comment</li>";
+               return "<li>$loglink $date $action $comment</li>";
        }
 }
index e109e65..4f58099 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Interface definition for deletable items.
+ *
+ * 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 RevisionDelete
+ */
 
 /**
  * Abstract base class for a list of deletable items. The list class
index 0e965c8..c02e9c7 100644 (file)
@@ -1,9 +1,6 @@
 <?php
 /**
- * Backend functions for suppressing and unsuppressing all references to a given user,
- * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
- * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
- * or at least schema abstraction.
+ * Backend functions for suppressing and unsuppressing all references to a given user.
  *
  * 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
  * @file
  * @ingroup RevisionDelete
  */
+
+/**
+ * Backend functions for suppressing and unsuppressing all references to a given user,
+ * used when blocking with HideUser enabled.  This was spun out of SpecialBlockip.php
+ * in 1.18; at some point it needs to be rewritten to either use RevisionDelete abstraction,
+ * or at least schema abstraction.
+ *
+ * @ingroup RevisionDelete
+ */
 class RevisionDeleteUser {
 
        /**
index 8f85ae3..95d372c 100644 (file)
@@ -2,7 +2,23 @@
 /**
  * Revision/log/file deletion 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 RevisionDelete
  */
 
 /**
index 0348ed1..a8e0437 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Basic search 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 Search
  */
@@ -741,7 +756,8 @@ class SearchResult {
        protected function initFromTitle( $title ) {
                $this->mTitle = $title;
                if ( !is_null( $this->mTitle ) ) {
-                       $this->mRevision = Revision::newFromTitle( $this->mTitle );
+                       $this->mRevision = Revision::newFromTitle(
+                               $this->mTitle, false, Revision::AVOID_MASTER );
                        if ( $this->mTitle->getNamespace() === NS_FILE )
                                $this->mImage = wfFindFile( $this->mTitle );
                }
index a162d2b..40dd36c 100644 (file)
@@ -4,6 +4,21 @@
  *
  * See deferred.txt
  *
+ * 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 Search
  */
index 8f4a943..06a4694 100644 (file)
@@ -106,7 +106,7 @@ class ActiveUsersPager extends UsersPager {
                                'MAX(ipb_user) AS blocked'
                        ),
                        'options' => array(
-                               'GROUP BY' => 'rc_user_text, user_id',
+                               'GROUP BY' => array( 'rc_user_text', 'user_id' ),
                                'USE INDEX' => array( 'recentchanges' => 'rc_user_text' )
                        ),
                        'join_conds' => array(
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..3c43ed1 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
@@ -338,6 +338,8 @@ class SpecialBlock extends FormSpecialPage {
         * @return string
         */
        protected function postText(){
+               $links = array();
+
                # Link to the user's contributions, if applicable
                if( $this->target instanceof User ){
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
@@ -349,7 +351,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 +906,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 bc07d58..87ba0cb 100644 (file)
@@ -143,7 +143,7 @@ class SpecialBookSources extends SpecialPage {
                $page = $this->msg( 'booksources' )->inContentLanguage()->text();
                $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
                if( is_object( $title ) && $title->exists() ) {
-                       $rev = Revision::newFromTitle( $title );
+                       $rev = Revision::newFromTitle( $title, false, Revision::AVOID_MASTER );
                        $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
                        return true;
                }
index b8dbe9e..d624430 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @ingroup SpecialPage
  */
-class BrokenRedirectsPage extends PageQueryPage {
+class BrokenRedirectsPage extends QueryPage {
 
        function __construct( $name = 'BrokenRedirects' ) {
                parent::__construct( $name );
diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php
new file mode 100644 (file)
index 0000000..32eb2e7
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * Abstract special page class with scaffolding for caching HTML and other values
+ * in a single blob.
+ *
+ * Before using any of the caching functionality, call startCache.
+ * After the last call to either getCachedValue or addCachedHTML, call saveCache.
+ *
+ * To get a cached value or compute it, use getCachedValue like this:
+ * $this->getCachedValue( $callback );
+ *
+ * To add HTML that should be cached, use addCachedHTML like this:
+ * $this->addCachedHTML( $callback );
+ *
+ * The callback function is only called when needed, so do all your expensive
+ * computations here. This function should returns the HTML to be cached.
+ * It should not add anything to the PageOutput object!
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @since 1.20
+ */
+abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
+
+       /**
+        * CacheHelper object to which we forward the non-SpecialPage specific caching work.
+        * Initialized in startCache.
+        *
+        * @since 1.20
+        * @var CacheHelper
+        */
+       protected $cacheHelper;
+
+       /**
+        * If the cache is enabled or not.
+        *
+        * @since 1.20
+        * @var boolean
+        */
+       protected $cacheEnabled = true;
+
+       /**
+        * Sets if the cache should be enabled or not.
+        *
+        * @since 1.20
+        * @param boolean $cacheEnabled
+        */
+       public function setCacheEnabled( $cacheEnabled ) {
+               $this->cacheHelper->setCacheEnabled( $cacheEnabled );
+       }
+
+       /**
+        * Initializes the caching.
+        * Should be called before the first time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        *
+        * @param integer|null $cacheExpiry Sets the cache expiry, either ttl in seconds or unix timestamp.
+        * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not.
+        */
+       public function startCache( $cacheExpiry = null, $cacheEnabled = null ) {
+               $this->cacheHelper = new CacheHelper();
+
+               $this->cacheHelper->setCacheEnabled( $this->cacheEnabled );
+               $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) );
+
+               $keyArgs = $this->getCacheKey();
+
+               if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) {
+                       unset( $keyArgs['action'] );
+               }
+
+               $this->cacheHelper->setCacheKey( $keyArgs );
+
+               if ( $this->getRequest()->getText( 'action' ) === 'purge' ) {
+                       $this->cacheHelper->rebuildOnDemand();
+               }
+
+               $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled );
+       }
+
+       /**
+        * Get a cached value if available or compute it if not and then cache it if possible.
+        * The provided $computeFunction is only called when the computation needs to happen
+        * and should return a result value. $args are arguments that will be passed to the
+        * compute function when called.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array|mixed $args
+        * @param string|null $key
+        *
+        * @return mixed
+        */
+       public function getCachedValue( $computeFunction, $args = array(), $key = null ) {
+               return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key );
+       }
+
+       /**
+        * Add some HTML to be cached.
+        * This is done by providing a callback function that should
+        * return the HTML to be added. It will only be called if the
+        * item is not in the cache yet or when the cache has been invalidated.
+        *
+        * @since 1.20
+        *
+        * @param {function} $computeFunction
+        * @param array $args
+        * @param string|null $key
+        */
+       public function addCachedHTML( $computeFunction, $args = array(), $key = null ) {
+               $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) );
+       }
+
+       /**
+        * Saves the HTML to the cache in case it got recomputed.
+        * Should be called after the last time anything is added via addCachedHTML.
+        *
+        * @since 1.20
+        */
+       public function saveCache() {
+               $this->cacheHelper->saveCache();
+       }
+
+       /**
+        * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.
+        *
+        * @since 1.20
+        *
+        * @param integer $cacheExpiry
+        */
+       public function setExpiry( $cacheExpiry ) {
+               $this->cacheHelper->setExpiry( $cacheExpiry );
+       }
+
+       /**
+        * Returns the variables used to constructed the cache key in an array.
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       protected function getCacheKey() {
+               return array(
+                       $this->mName,
+                       $this->getLanguage()->getCode()
+               );
+       }
+
+       /**
+        * Gets called after the cache got initialized.
+        *
+        * @since 1.20
+        *
+        * @param boolean $hasCached
+        */
+       public function onCacheInitialized( $hasCached ) {
+               if ( $hasCached ) {
+                       $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) );
+               }
+       }
+
+}
index 338cd70..6d2831c 100644 (file)
@@ -59,16 +59,12 @@ class SpecialCategories extends SpecialPage {
  * @ingroup SpecialPage Pager
  */
 class CategoryPager extends AlphabeticPager {
-       private $conds = array( 'cat_pages > 0' );
-
        function __construct( IContextSource $context, $from ) {
                parent::__construct( $context );
                $from = str_replace( ' ', '_', $from );
                if( $from !== '' ) {
                        $from = Title::capitalize( $from, NS_CATEGORY );
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $this->conds[] = 'cat_title >= ' . $dbr->addQuotes( $from );
-                       $this->setOffset( '' );
+                       $this->mOffset = $from;
                }
        }
 
@@ -76,7 +72,7 @@ class CategoryPager extends AlphabeticPager {
                return array(
                        'tables' => array( 'category' ),
                        'fields' => array( 'cat_title','cat_pages' ),
-                       'conds' => $this->conds,
+                       'conds' => array( 'cat_pages > 0' ),
                        'options' => array( 'USE INDEX' => 'cat_title' ),
                );
        }
index bd5a443..a1c6fd2 100644 (file)
@@ -201,7 +201,7 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
                if ( !$status->isGood() ) {
                        $this->getOutput()->addHTML(
                                '<p class="error">' .
-                               $this->getOutput()->parseInline( $status->getWikiText( $info ) ) .
+                               $this->getOutput()->parseInline( $status->getWikiText( 'mailerror' ) ) .
                                '</p>' );
                        return false;
                }
index f6482ef..b30605b 100644 (file)
@@ -63,10 +63,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
 
                if( $request->wasPosted() && $user->matchEditToken( $request->getVal( 'token' ) ) ) {
                        try {
-                               if ( isset( $_SESSION['wsDomain'] ) ) {
-                                       $this->mDomain = $_SESSION['wsDomain'];
-                               }
-                               $wgAuth->setDomain( $this->mDomain );
+                               $this->mDomain = $wgAuth->getDomain();
                                if( !$wgAuth->allowPasswordChange() ) {
                                        $this->error( $this->msg( 'resetpass_forbidden' )->text() );
                                        return;
@@ -136,6 +133,15 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        $oldpassMsg = 'oldpassword';
                        $submitMsg = 'resetpass-submit-loggedin';
                }
+               $extraFields = array();
+               wfRunHooks( 'ChangePasswordForm', array( &$extraFields ) );
+               $prettyFields = array(
+                                       array( 'wpName', 'username', 'text', $this->mUserName ),
+                                       array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
+                                       array( 'wpNewPassword', 'newpassword', 'password', null ),
+                                       array( 'wpRetype', 'retypenew', 'password', null ),
+                               );
+               $prettyFields = array_merge( $prettyFields, $extraFields );
                $this->getOutput()->addHTML(
                        Xml::fieldset( $this->msg( 'resetpass_header' )->text() ) .
                        Xml::openElement( 'form',
@@ -149,12 +155,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                        Html::hidden( 'returnto', $this->getRequest()->getVal( 'returnto' ) ) . "\n" .
                        $this->msg( 'resetpass_text' )->parseAsBlock() . "\n" .
                        Xml::openElement( 'table', array( 'id' => 'mw-resetpass-table' ) ) . "\n" .
-                       $this->pretty( array(
-                               array( 'wpName', 'username', 'text', $this->mUserName ),
-                               array( 'wpPassword', $oldpassMsg, 'password', $this->mOldpass ),
-                               array( 'wpNewPassword', 'newpassword', 'password', null ),
-                               array( 'wpRetype', 'retypenew', 'password', null ),
-                       ) ) . "\n" .
+                       $this->pretty( $prettyFields ) . "\n" .
                        $rememberMe .
                        "<tr>\n" .
                                "<td></td>\n" .
index e84118b..9465037 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';
                }
@@ -232,7 +235,9 @@ class SpecialContributions extends SpecialPage {
                        $links = $this->getLanguage()->pipeList( $tools );
 
                        // Show a note if the user is blocked and display the last block log entry.
-                       if ( $userObj->isBlocked() ) {
+                       // Do not expose the autoblocks, since that may lead to a leak of accounts' IPs,
+                       // and also this will display a totally irrelevant log entry as a current block.
+                       if ( $userObj->isBlocked() && $userObj->getBlock()->getType() != Block::TYPE_AUTO ) {
                                $out = $this->getOutput(); // showLogExtract() wants first parameter by reference
                                LogEventsList::showLogExtract(
                                        $out,
@@ -436,7 +441,7 @@ class SpecialContributions extends SpecialPage {
                                'target',
                                $this->opts['target'],
                                'text',
-                               array( 'size' => '20', 'required' => '', 'class' => 'mw-input' ) +
+                               array( 'size' => '40', 'required' => '', 'class' => 'mw-input' ) +
                                        ( $this->opts['target'] ? array() : array( 'autofocus' )
                                )
                        ) . ' '
@@ -654,7 +659,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        } else {
                                $condition['rev_user_text'] = $this->target;
                                $index = 'usertext_timestamp';
-                       } 
+                       }
                }
                if ( $this->deletedOnly ) {
                        $condition[] = "rev_deleted != '0'";
@@ -701,7 +706,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $revIds[] = $row->rev_parent_id;
                        }
                }
-               $this->mParentLens = $this->getParentLengths( $revIds );
+               $this->mParentLens = Revision::getParentLengths( $this->getDatabase(), $revIds );
                $this->mResult->rewind(); // reset
 
                # Do a link batch query
@@ -719,28 +724,6 @@ class ContribsPager extends ReverseChronologicalPager {
                $this->mResult->seek( 0 );
        }
 
-       /**
-        * Do a batched query to get the parent revision lengths
-        * @param $revIds array
-        * @return array
-        */
-       private function getParentLengths( array $revIds ) {
-               $revLens = array();
-               if ( !$revIds ) {
-                       return $revLens; // empty
-               }
-               wfProfileIn( __METHOD__ );
-               $res = $this->getDatabase()->select( 'revision',
-                       array( 'rev_id', 'rev_len' ),
-                       array( 'rev_id' => $revIds ),
-                       __METHOD__ );
-               foreach ( $res as $row ) {
-                       $revLens[$row->rev_id] = $row->rev_len;
-               }
-               wfProfileOut( __METHOD__ );
-               return $revLens;
-       }
-
        /**
         * @return string
         */
index 8f780b5..a5ab3e6 100644 (file)
@@ -26,7 +26,7 @@
  *
  * @ingroup SpecialPage
  */
-class DisambiguationsPage extends PageQueryPage {
+class DisambiguationsPage extends QueryPage {
 
        function __construct( $name = 'Disambiguations' ) {
                parent::__construct( $name );
index a6df66f..51cb08a 100644 (file)
@@ -27,7 +27,7 @@
  *
  * @ingroup SpecialPage
  */
-class DoubleRedirectsPage extends PageQueryPage {
+class DoubleRedirectsPage extends QueryPage {
 
        function __construct( $name = 'DoubleRedirects' ) {
                parent::__construct( $name );
index fa48317..67f6d68 100644 (file)
@@ -3,10 +3,34 @@
  * @defgroup Watchlist Users watchlist handling
  */
 
+/**
+ * Implements Special:EditWatchlist
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @ingroup Watchlist
+ */
+
 /**
  * Provides the UI through which users can perform editing
  * operations on their watchlist
  *
+ * @ingroup SpecialPage
  * @ingroup Watchlist
  * @author Rob Church <robchur@gmail.com>
  */
@@ -217,8 +241,9 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                $dbr = wfGetDB( DB_MASTER );
                $res = $dbr->select(
                        'watchlist',
-                       '*',
                        array(
+                               'wl_namespace', 'wl_title'
+                       ), array(
                                'wl_user' => $this->getUser()->getId(),
                        ),
                        __METHOD__
@@ -253,7 +278,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                        array( 'wl_namespace',  'wl_title' ),
                        array( 'wl_user' => $this->getUser()->getId() ),
                        __METHOD__,
-                       array( 'ORDER BY' => 'wl_namespace, wl_title' )
+                       array( 'ORDER BY' => array( 'wl_namespace', 'wl_title' ) )
                );
 
                $lb = new LinkBatch();
@@ -297,16 +322,20 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * Attempts to clean up broken items
         */
        private function cleanupWatchlist() {
+               if( !count( $this->badItems ) ) {
+                       return; //nothing to do
+               }
                $dbw = wfGetDB( DB_MASTER );
+               $user = $this->getUser();
                foreach ( $this->badItems as $row ) {
                        list( $title, $namespace, $dbKey ) = $row;
-                       wfDebug( "User {$this->getUser()} has broken watchlist item ns($namespace):$dbKey, "
+                       wfDebug( "User {$user->getName()} has broken watchlist item ns($namespace):$dbKey, "
                                . ( $title ? 'cleaning up' : 'deleting' ) . ".\n"
                        );
 
                        $dbw->delete( 'watchlist',
                                array(
-                                       'wl_user' => $this->getUser()->getId(),
+                                       'wl_user' => $user->getId(),
                                        'wl_namespace' => $namespace,
                                        'wl_title' => $dbKey,
                                ),
@@ -315,7 +344,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
 
                        // Can't just do an UPDATE instead of DELETE/INSERT due to unique index
                        if ( $title ) {
-                               $this->getUser()->addWatch( $title );
+                               $user->addWatch( $title );
                        }
                }
        }
@@ -446,7 +475,7 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
                                $title = Title::makeTitleSafe( $namespace, $dbkey );
                                if ( $this->checkTitle( $title, $namespace, $dbkey ) ) {
                                        $text = $this->buildRemoveLine( $title );
-                                       $fields['TitlesNs'.$namespace]['options'][$text] = $title->getEscapedText();
+                                       $fields['TitlesNs'.$namespace]['options'][$text] = htmlspecialchars( $title->getPrefixedText() );
                                        $count++;
                                }
                        }
index 314da72..2ab02cb 100644 (file)
@@ -61,7 +61,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        ),
                        'Subject' => array(
                                'type' => 'text',
-                               'default' => wfMsgExt( 'defemailsubject', array( 'content', 'parsemag' ), $this->getUser()->getName() ),
+                               'default' => $this->msg( 'defemailsubject',
+                                       $this->getUser()->getName() )->inContentLanguage()->text(),
                                'label-message' => 'emailsubject',
                                'maxlength' => 200,
                                'size' => 60,
@@ -124,11 +125,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $this->mTargetObj = $ret;
 
                $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
-               $form->addPreText( wfMsgExt( 'emailpagetext', 'parseinline' ) );
-               $form->setSubmitText( wfMsg( 'emailsend' ) );
+               $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+               $form->setSubmitTextMsg( 'emailsend' );
                $form->setTitle( $this->getTitle() );
-               $form->setSubmitCallback( array( __CLASS__, 'submit' ) );
-               $form->setWrapperLegend( wfMsgExt( 'email-legend', 'parsemag' ) );
+               $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
+               $form->setWrapperLegendMsg( 'email-legend' );
                $form->loadData();
 
                if( !wfRunHooks( 'EmailUserForm', array( &$form ) ) ) {
@@ -224,14 +225,26 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $string = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'id' => 'askusername' ) ) .
                        Html::hidden( 'title', $this->getTitle()->getPrefixedText() ) .
                        Xml::openElement( 'fieldset' ) .
-                       Html::rawElement( 'legend', null, wfMessage( 'emailtarget' )->parse() ) .
-                       Xml::inputLabel( wfMessage( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
-                       Xml::submitButton( wfMessage( 'emailusernamesubmit' )->text() ) .
+                       Html::rawElement( 'legend', null, $this->msg( 'emailtarget' )->parse() ) .
+                       Xml::inputLabel( $this->msg( 'emailusername' )->text(), 'target', 'emailusertarget', 30, $name ) . ' ' .
+                       Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' ) . "\n";
                return $string;
        }
 
+       /**
+        * Submit callback for an HTMLForm object, will simply call submit().
+        *
+        * @since 1.20
+        * @param $data array
+        * @param $form HTMLForm object
+        * @return Status|string|bool
+        */
+       public static function uiSubmit( array $data, HTMLForm $form ) {
+               return self::submit( $data, $form->getContext() );
+       }
+
        /**
         * Really send a mail. Permissions should have been checked using
         * getPermissionsError(). It is probably also a good
@@ -240,25 +253,22 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @return Mixed: Status object, or potentially a String on error
         * or maybe even true on success if anything uses the EmailUser hook.
         */
-       public static function submit( $data ) {
-               global $wgUser, $wgUserEmailUseReplyTo;
+       public static function submit( array $data, IContextSource $context ) {
+               global $wgUserEmailUseReplyTo;
 
                $target = self::getTarget( $data['Target'] );
                if( !$target instanceof User ) {
-                       return wfMsgExt( $target . 'text', 'parse' );
+                       return $context->msg( $target . 'text' )->parseAsBlock();
                }
                $to = new MailAddress( $target );
-               $from = new MailAddress( $wgUser );
+               $from = new MailAddress( $context->getUser() );
                $subject = $data['Subject'];
                $text = $data['Text'];
 
                // Add a standard footer and trim up trailing newlines
                $text = rtrim( $text ) . "\n\n-- \n";
-               $text .= wfMsgExt(
-                       'emailuserfooter',
-                       array( 'content', 'parsemag' ),
-                       array( $from->name, $to->name )
-               );
+               $text .= $context->msg( 'emailuserfooter',
+                       $from->name, $to->name )->inContentLanguage()->text();
 
                $error = '';
                if( !wfRunHooks( 'EmailUser', array( &$to, &$from, &$subject, &$text, &$error ) ) ) {
@@ -302,11 +312,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        // unless they are emailing themselves, in which case one
                        // copy of the message is sufficient.
                        if ( $data['CCMe'] && $to != $from ) {
-                               $cc_subject = wfMsg(
-                                       'emailccsubject',
-                                       $target->getName(),
-                                       $subject
-                               );
+                               $cc_subject = $context->msg( 'emailccsubject' )->rawParams(
+                                       $target->getName(), $subject )->text();
                                wfRunHooks( 'EmailUserCC', array( &$from, &$from, &$cc_subject, &$text ) );
                                $ccStatus = UserMailer::send( $from, $from, $cc_subject, $text );
                                $status->merge( $ccStatus );
index df7e7af..5610cc2 100644 (file)
@@ -56,7 +56,7 @@ class FewestrevisionsPage extends QueryPage {
                        // useful to remove this. People _do_ create pages
                        // and never revise them, they aren't necessarily
                        // redirects.
-                       'GROUP BY' => 'page_namespace, page_title, page_is_redirect' )
+                       'GROUP BY' => array( 'page_namespace', 'page_title', 'page_is_redirect' ) )
                );
        }
 
@@ -75,7 +75,8 @@ class FewestrevisionsPage extends QueryPage {
 
                $nt = Title::makeTitleSafe( $result->namespace, $result->title );
                if( !$nt ) {
-                       return '<!-- bad title -->';
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
                }
 
                $text = htmlspecialchars( $wgContLang->convert( $nt->getPrefixedText() ) );
index f7e81ee..c217ecc 100644 (file)
@@ -1,7 +1,24 @@
 <?php
 /**
- * @ingroup SpecialPage
+ * Implements Special:JavaScriptTest
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
+ * @ingroup SpecialPage
  */
 
 /**
index fd48cb0..ddab164 100644 (file)
@@ -156,9 +156,8 @@ class ImageListPager extends TablePager {
                        if( $dbr->implicitGroupby() ) {
                                $options = array( 'GROUP BY' => 'img_name' );
                        } else {
-                               $columnlist = implode( ',',
-                                       preg_grep( '/^img/', array_keys( $this->getFieldNames() ) ) );
-                               $options = array( 'GROUP BY' => "img_user, $columnlist" );
+                               $columnlist = preg_grep( '/^img/', array_keys( $this->getFieldNames() ) );
+                               $options = array( 'GROUP BY' => array_merge( array( 'img_user' ), $columnlist ) );
                        }
                        $join_conds = array( 'oldimage' => array( 'LEFT JOIN', 'oi_name = img_name' ) );
                }
@@ -198,7 +197,7 @@ class ImageListPager extends TablePager {
                                $thumb = $file->transform( array( 'width' => 180, 'height' => 360 ) );
                                return $thumb->toHtml( array( 'desc-link' => true ) );
                        case 'img_timestamp':
-                               return htmlspecialchars( $this->getLanguage()->timeanddate( $value, true ) );
+                               return htmlspecialchars( $this->getLanguage()->userTimeAndDate( $value, $this->getUser() ) );
                        case 'img_name':
                                static $imgfile = null;
                                if ( $imgfile === null ) $imgfile = $this->msg( 'imgfile' )->text();
@@ -211,7 +210,8 @@ class ImageListPager extends TablePager {
                                                array( 'href' => wfLocalFile( $filePage )->getURL() ),
                                                $imgfile
                                        );
-                                       return "$link ($download)";
+                                       $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
+                                       return "$link $download";
                                } else {
                                        return htmlspecialchars( $value );
                                }
index ca8f3db..1f95c22 100644 (file)
@@ -183,7 +183,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-removegroup-all' )->escaped();
                } elseif( is_array( $remove ) && count( $remove ) ) {
                        $remove = array_values( array_unique( $remove ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-removegroup',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $remove ) ),
                                count( $remove )
                        )->parse();
@@ -192,7 +192,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-addgroup-self-all' )->escaped();
                } elseif( is_array( $addSelf ) && count( $addSelf ) ) {
                        $addSelf = array_values( array_unique( $addSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-addgroup-self', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-addgroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $addSelf ) ),
                                count( $addSelf )
                        )->parse();
@@ -201,7 +201,7 @@ class SpecialListGroupRights extends SpecialPage {
                        $r[] = $this->msg( 'listgrouprights-removegroup-self-all' )->parse();
                } elseif( is_array( $removeSelf ) && count( $removeSelf ) ) {
                        $removeSelf = array_values( array_unique( $removeSelf ) );
-                       $r[] = $this->msg( 'listgrouprights-removegroup-self', array( 'parseinline' ),
+                       $r[] = $this->msg( 'listgrouprights-removegroup-self',
                                $lang->listToText( array_map( array( 'User', 'makeGroupLinkWiki' ), $removeSelf ) ),
                                count( $removeSelf )
                        )->parse();
index c145351..d71ac6e 100644 (file)
@@ -87,13 +87,11 @@ class SpecialLockdb extends FormSpecialPage {
                }
                fwrite( $fp, $data['Reason'] );
                $timestamp = wfTimestampNow();
-               fwrite( $fp, "\n<p>" . wfMsgExt(
-                       'lockedbyandtime',
-                       array( 'content', 'parsemag' ),
+               fwrite( $fp, "\n<p>" . $this->msg( 'lockedbyandtime',
                        $this->getUser()->getName(),
-                       $wgContLang->date( $timestamp ),
-                       $wgContLang->time( $timestamp )
-               ) . "</p>\n" );
+                       $wgContLang->date( $timestamp, false, false ),
+                       $wgContLang->time( $timestamp, false, false )
+               )->inContentLanguage()->text() . "</p>\n" );
                fclose( $fp );
 
                return Status::newGood();
index 64190df..2c96e83 100644 (file)
@@ -131,7 +131,7 @@ class SpecialLog extends SpecialPage {
 
        private function show( FormOptions $opts, array $extraConds ) {
                # Create a LogPager item to get the results and a LogEventsList item to format them...
-               $loglist = new LogEventsList( $this->getSkin(), $this->getOutput(), 0 );
+               $loglist = new LogEventsList( $this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES );
                $pager = new LogPager( $loglist, $opts->getValue( 'type' ), $opts->getValue( 'user' ),
                        $opts->getValue( 'page' ), $opts->getValue( 'pattern' ), $extraConds, $opts->getValue( 'year' ),
                        $opts->getValue( 'month' ), $opts->getValue( 'tagfilter' ) );
@@ -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( 'showhideselectedlogentries' )->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 b193a1c..46a35c4 100644 (file)
@@ -96,6 +96,7 @@ class MIMEsearchPage extends QueryPage {
                );
 
                $download = Linker::makeMediaLinkObj( $nt, $this->msg( 'download' )->escaped() );
+               $download = $this->msg( 'parentheses' )->rawParams( $download )->escaped();
                $lang = $this->getLanguage();
                $bytes = htmlspecialchars( $lang->formatSize( $result->img_size ) );
                $dimensions = $this->msg( 'widthheight' )->numParams( $result->img_width,
@@ -103,7 +104,7 @@ class MIMEsearchPage extends QueryPage {
                $user = Linker::link( Title::makeTitle( NS_USER, $result->img_user_text ), htmlspecialchars( $result->img_user_text ) );
                $time = htmlspecialchars( $lang->userTimeAndDate( $result->img_timestamp, $this->getUser() ) );
 
-               return "($download) $plink . . $dimensions . . $bytes . . $user . . $time";
+               return "$download $plink . . $dimensions . . $bytes . . $user . . $time";
        }
 
        /**
index f43b8f7..b5fb0dd 100644 (file)
@@ -90,7 +90,8 @@ class SpecialMergeHistory extends SpecialPage {
                $this->outputHeader();
 
                if( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) {
-                       return $this->merge();
+                       $this->merge();
+                       return;
                }
 
                if ( !$this->mSubmitted ) {
@@ -251,9 +252,11 @@ class SpecialMergeHistory extends SpecialPage {
                $ts = wfTimestamp( TS_MW, $row->rev_timestamp );
                $checkBox = Xml::radio( 'mergepoint', $ts, false );
 
+               $user = $this->getUser();
+
                $pageLink = Linker::linkKnown(
                        $rev->getTitle(),
-                       htmlspecialchars( $this->getLanguage()->timeanddate( $ts ) ),
+                       htmlspecialchars( $this->getLanguage()->userTimeAndDate( $ts, $user ) ),
                        array(),
                        array( 'oldid' => $rev->getId() )
                );
@@ -262,7 +265,7 @@ class SpecialMergeHistory extends SpecialPage {
                }
 
                # Last link
-               if( !$rev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
+               if( !$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
                        $last = $this->message['last'];
                } elseif( isset( $this->prevId[$row->rev_id] ) ) {
                        $last = Linker::linkKnown(
@@ -284,7 +287,8 @@ class SpecialMergeHistory extends SpecialPage {
                }
                $comment = Linker::revComment( $rev );
 
-               return "<li>$checkBox ($last) $pageLink . . $userLink $stxt $comment</li>";
+               return Html::rawElement( 'li', array(),
+                       $this->msg( 'mergehistory-revisionrow' )->rawParams( $checkBox, $last, $pageLink, $userLink, $stxt, $comment )->escaped() );
        }
 
        function merge() {
index 98b7367..6de4840 100644 (file)
@@ -46,12 +46,32 @@ class MostcategoriesPage extends QueryPage {
                                        'COUNT(*) AS value' ),
                        'conds' => array ( 'page_namespace' => MWNamespace::getContentNamespaces() ),
                        'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-                               'GROUP BY' => 'page_namespace, page_title' ),
+                               'GROUP BY' => array( 'page_namespace', 'page_title' ) ),
                        'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
                                        'page_id = cl_from' ) )
                );
        }
 
+       /**
+        * @param $db DatabaseBase
+        * @param $res
+        */
+       function preprocessResults( $db, $res ) {
+               # There's no point doing a batch check if we aren't caching results;
+               # the page must exist for it to have been pulled out of the table
+               if ( !$this->isCached() || !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch();
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               $res->seek( 0 );
+       }
+
        /**
         * @param $skin Skin
         * @param $result
@@ -59,9 +79,19 @@ class MostcategoriesPage extends QueryPage {
         */
        function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
+               if ( !$title ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
+
+               if ( $this->isCached() ) {
+                       $link = Linker::link( $title );
+               } else {
+                       $link = Linker::linkKnown( $title );
+               }
 
                $count = $this->msg( 'ncategories' )->numParams( $result->value )->escaped();
-               $link = Linker::link( $title );
+
                return $this->getLanguage()->specialList( $link, $count );
        }
 }
index a16f087..3c3ab36 100644 (file)
@@ -47,8 +47,8 @@ class MostlinkedPage extends QueryPage {
                                        'COUNT(*) AS value',
                                        'page_namespace' ),
                        'options' => array ( 'HAVING' => 'COUNT(*) > 1',
-                               'GROUP BY' => 'pl_namespace, pl_title, '.
-                                               'page_namespace' ),
+                               'GROUP BY' => array( 'pl_namespace', 'pl_title',
+                                               'page_namespace' ) ),
                        'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
                                        array ( 'page_namespace = pl_namespace',
                                                'page_title = pl_title' ) ) )
@@ -62,12 +62,12 @@ class MostlinkedPage extends QueryPage {
         * @param $res
         */
        function preprocessResults( $db, $res ) {
-               if( $db->numRows( $res ) > 0 ) {
+               if ( $res->numRows() > 0 ) {
                        $linkBatch = new LinkBatch();
                        foreach ( $res as $row ) {
                                $linkBatch->add( $row->namespace, $row->title );
                        }
-                       $db->dataSeek( $res, 0 );
+                       $res->seek( 0 );
                        $linkBatch->execute();
                }
        }
@@ -94,7 +94,8 @@ class MostlinkedPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $title = Title::makeTitleSafe( $result->namespace, $result->title );
                if ( !$title ) {
-                       return '<!-- ' . htmlspecialchars( "Invalid title: [[$title]]" ) . ' -->';
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
                }
                $link = Linker::link( $title );
                $wlh = $this->makeWlhLink( $title,
index 72dc15b..370ba68 100644 (file)
@@ -68,7 +68,7 @@ class MostlinkedTemplatesPage extends QueryPage {
                                        'tl_title AS title',
                                        'COUNT(*) AS value' ),
                        'conds' => array ( 'tl_namespace' => NS_TEMPLATE ),
-                       'options' => array( 'GROUP BY' => 'tl_namespace, tl_title' )
+                       'options' => array( 'GROUP BY' => array( 'tl_namespace', 'tl_title' ) )
                );
        }
 
index 6b817d2..a512ee6 100644 (file)
@@ -246,6 +246,14 @@ class MovePageForm extends UnlistedSpecialPage {
                // Byte limit (not string length limit) for wpReason and wpNewTitleMain
                // is enforced in the mediawiki.special.movePage module
 
+               $immovableNamespaces = array();
+
+               foreach ( array_keys( $this->getLanguage()->getNamespaces() ) as $nsId ) {
+                       if ( !MWNamespace::isMovable( $nsId ) ) {
+                               $immovableNamespaces[] = $nsId;
+                       }
+               }
+
                $out->addHTML(
                         Xml::openElement( 'form', array( 'method' => 'post', 'action' => $this->getTitle()->getLocalURL( 'action=submit' ), 'id' => 'movepage' ) ) .
                         Xml::openElement( 'fieldset' ) .
@@ -265,7 +273,10 @@ class MovePageForm extends UnlistedSpecialPage {
                                "</td>
                                <td class='mw-input'>" .
                                        Html::namespaceSelector(
-                                               array( 'selected' => $newTitle->getNamespace() ),
+                                               array(
+                                                       'selected' => $newTitle->getNamespace(),
+                                                       'exclude' => $immovableNamespaces
+                                               ),
                                                array( 'name' => 'wpNewTitleNs', 'id' => 'wpNewTitleNs' )
                                        ) .
                                        Xml::input( 'wpNewTitleMain', 60, $wgContLang->recodeForEdit( $newTitle->getText() ), array(
index 1bcbac7..1798e8f 100644 (file)
@@ -294,6 +294,8 @@ class SpecialNewpages extends IncludableSpecialPage {
         * @return String
         */
        public function formatRow( $result ) {
+               $title = Title::newFromRow( $result );
+
                # Revision deletion works on revisions, so we should cast one
                $row = array(
                                          'comment' => $result->rc_comment,
@@ -302,13 +304,13 @@ class SpecialNewpages extends IncludableSpecialPage {
                                          'user' => $result->rc_user,
                                        );
                $rev = new Revision( $row );
+               $rev->setTitle( $title );
 
                $classes = array();
 
                $lang = $this->getLanguage();
                $dm = $lang->getDirMark();
 
-               $title = Title::newFromRow( $result );
                $spanTime = Html::element( 'span', array( 'class' => 'mw-newpages-time' ),
                        $lang->userTimeAndDate( $result->rc_timestamp, $this->getUser() )
                );
@@ -343,7 +345,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $this->msg( 'parentheses' )->rawParams( $histLink )->escaped() );
 
                $length = Html::element( 'span', array( 'class' => 'mw-newpages-length' ),
-                               '[' . $this->msg( 'nbytes' )->numParams( $result->length )->text() . ']'
+                       $this->msg( 'brackets' )->params( $this->msg( 'nbytes' )->numParams( $result->length )->text() )
                );
 
                $ulink = Linker::revUserTools( $rev );
@@ -432,7 +434,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 f140546..51520c8 100644 (file)
@@ -154,7 +154,7 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $method = 'email';
                        $res = wfGetDB( DB_SLAVE )->select(
                                'user',
-                               '*',
+                               User::selectFields(),
                                array( 'user_email' => $data['Email'] ),
                                __METHOD__
                        );
index 803f03e..9f84804 100644 (file)
@@ -56,7 +56,13 @@ class PopularPagesPage extends QueryPage {
         */
        function formatResult( $skin, $result ) {
                global $wgContLang;
-               $title = Title::makeTitle( $result->namespace, $result->title );
+
+               $title = Title::makeTitleSafe( $result->namespace, $result->title );
+               if( !$title ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
+
                $link = Linker::linkKnown(
                        $title,
                        htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
index 730969d..c37bb1d 100644 (file)
@@ -196,7 +196,8 @@ class SpecialPrefixindex extends SpecialAllpages {
                                                $link = ($s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
                                                        Linker::linkKnown(
                                                                $t,
-                                                               htmlspecialchars( $t->getText() )
+                                                               htmlspecialchars( $t->getText() ),
+                                                               $s->page_is_redirect ? array( 'class' => 'mw-redirect' ) : array()
                                                        ) .
                                                        ($s->page_is_redirect ? '</div>' : '' );
                                        } else {
index 0b6239b..307088e 100644 (file)
@@ -85,7 +85,7 @@ class RandomPage extends SpecialPage {
                $nsNames = array();
                foreach( $this->namespaces as $n ) {
                        if( $n === NS_MAIN ) {
-                               $nsNames[] = wfMsgNoTrans( 'blanknamespace' );
+                               $nsNames[] = $this->msg( 'blanknamespace' )->plain();
                        } else {
                                $nsNames[] = $wgContLang->getNsText( $n );
                        }
index c05aaad..bb384d4 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 );
@@ -633,14 +633,18 @@ class SpecialRecentChanges extends IncludableSpecialPage {
         */
        function setTopText( FormOptions $opts ) {
                global $wgContLang;
-               $this->getOutput()->addWikiText(
-                       Html::rawElement( 'p',
-                               array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
-                               "\n" . wfMsgForContentNoTrans( 'recentchangestext' ) . "\n"
-                       ), 
-                       /* $lineStart */ false,
-                       /* $interface */ false
-               );
+
+               $message = $this->msg( 'recentchangestext' )->inContentLanguage();
+               if ( !$message->isDisabled() ) {
+                       $this->getOutput()->addWikiText(
+                               Html::rawElement( 'p',
+                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                                       "\n" . $message->plain() . "\n"
+                               ),
+                               /* $lineStart */ false,
+                               /* $interface */ false
+                       );
+               }
        }
 
        /**
@@ -663,16 +667,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 +688,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 +792,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 +816,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 +843,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 +851,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..83c7235 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" .
@@ -417,10 +420,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        $out .= Xml::closeElement( 'form' ) . "\n";
                        // Show link to edit the dropdown reasons
                        if( $this->getUser()->isAllowed( 'editinterface' ) ) {
-                               $title = Title::makeTitle( NS_MEDIAWIKI, 'revdelete-reason-dropdown' );
+                               $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 3fa8687..3344436 100644 (file)
@@ -174,7 +174,8 @@ class SpecialSearch extends SpecialPage {
                $t = Title::newFromText( $term );
                # If the string cannot be used to create a title
                if( is_null( $t ) ) {
-                       return $this->showResults( $term );
+                       $this->showResults( $term );
+                       return;
                }
                # If there's an exact or very near match, jump right there.
                $t = SearchEngine::getNearMatch( $term );
@@ -201,7 +202,7 @@ class SpecialSearch extends SpecialPage {
                                return;
                        }
                }
-               return $this->showResults( $term );
+               $this->showResults( $term );
        }
 
        /**
@@ -232,13 +233,13 @@ class SpecialSearch extends SpecialPage {
                        } else {
                                $out->addHTML(
                                        Xml::openElement( 'fieldset' ) .
-                                       Xml::element( 'legend', null, wfMsg( 'search-external' ) ) .
-                                       Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), wfMsg( 'searchdisabled' ) ) .
-                                       wfMsg( 'googlesearch',
+                                       Xml::element( 'legend', null, $this->msg( 'search-external' )->text() ) .
+                                       Xml::element( 'p', array( 'class' => 'mw-searchdisabled' ), $this->msg( 'searchdisabled' )->text() ) .
+                                       $this->msg( 'googlesearch' )->rawParams(
                                                htmlspecialchars( $term ),
-                                               htmlspecialchars( 'UTF-8' ),
-                                               htmlspecialchars( wfMsg( 'searchbutton' ) )
-                                       ) .
+                                               'UTF-8',
+                                               $this->msg( 'searchbutton' )->escaped()
+                                       )->text() .
                                        Xml::closeElement( 'fieldset' )
                                );
                        }
@@ -285,7 +286,7 @@ class SpecialSearch extends SpecialPage {
                                $stParams
                        );
 
-                       $this->didYouMeanHtml = '<div class="searchdidyoumean">'.wfMsg('search-suggest',$suggestLink).'</div>';
+                       $this->didYouMeanHtml = '<div class="searchdidyoumean">' . $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() . '</div>';
                }
                // start rendering the page
                $out->addHtml(
@@ -583,13 +584,8 @@ class SpecialSearch extends SpecialPage {
                                $redirectText = null;
 
                        $redirect = "<span class='searchalttitle'>" .
-                               wfMsg(
-                                       'search-redirect',
-                                       Linker::linkKnown(
-                                               $redirectTitle,
-                                               $redirectText
-                                       )
-                               ) .
+                               $this->msg( 'search-redirect' )->rawParams(
+                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
                                "</span>";
                }
 
@@ -600,12 +596,8 @@ class SpecialSearch extends SpecialPage {
                                $sectionText = null;
 
                        $section = "<span class='searchalttitle'>" .
-                               wfMsg(
-                                       'search-section', Linker::linkKnown(
-                                               $sectionTitle,
-                                               $sectionText
-                                       )
-                               ) .
+                               $this->msg( 'search-section' )->rawParams(
+                                       Linker::linkKnown( $sectionTitle, $sectionText ) )->text() .
                                "</span>";
                }
 
@@ -620,7 +612,7 @@ class SpecialSearch extends SpecialPage {
                        $score = '';
                } else {
                        $percent = sprintf( '%2.1f', $result->getScore() * 100 );
-                       $score = wfMsg( 'search-result-score', $lang->formatNum( $percent ) )
+                       $score = $this->msg( 'search-result-score' )->numParams( $percent )->text()
                                . ' - ';
                }
 
@@ -628,25 +620,17 @@ class SpecialSearch extends SpecialPage {
                $byteSize = $result->getByteSize();
                $wordCount = $result->getWordCount();
                $timestamp = $result->getTimestamp();
-               $size = wfMsgExt(
-                       'search-result-size',
-                       array( 'parsemag', 'escape' ),
-                       $lang->formatSize( $byteSize ),
-                       $lang->formatNum( $wordCount )
-               );
+               $size = $this->msg( 'search-result-size', $lang->formatSize( $byteSize ) )
+                       ->numParams( $wordCount )->escaped();
 
                if( $t->getNamespace() == NS_CATEGORY ) {
                        $cat = Category::newFromTitle( $t );
-                       $size = wfMsgExt(
-                               'search-result-category-size',
-                               array( 'parsemag', 'escape' ),
-                               $lang->formatNum( $cat->getPageCount() ),
-                               $lang->formatNum( $cat->getSubcatCount() ),
-                               $lang->formatNum( $cat->getFileCount() )
-                       );
+                       $size = $this->msg( 'search-result-category-size' )
+                               ->numParams( $cat->getPageCount(), $cat->getSubcatCount(), $cat->getFileCount() )
+                               ->escaped();
                }
 
-               $date = $lang->timeanddate( $timestamp );
+               $date = $lang->userTimeAndDate( $timestamp, $this->getUser() );
 
                // link to related articles if supported
                $related = '';
@@ -655,14 +639,15 @@ class SpecialSearch extends SpecialPage {
                        $stParams = array_merge(
                                $this->powerSearchOptions(),
                                array(
-                                       'search' => wfMsgForContent( 'searchrelated' ) . ':' . $t->getPrefixedText(),
-                                       'fulltext' => wfMsg( 'search' )
+                                       'search' => $this->msg( 'searchrelated' )->inContentLanguage()->text() .
+                                               ':' . $t->getPrefixedText(),
+                                       'fulltext' => $this->msg( 'search' )->text()
                                )
                        );
 
                        $related = ' -- ' . Linker::linkKnown(
                                $st,
-                               wfMsg('search-relatedarticle'),
+                               $this->msg( 'search-relatedarticle' )->text(),
                                array(),
                                $stParams
                        );
@@ -674,7 +659,7 @@ class SpecialSearch extends SpecialPage {
                        if( $img ) {
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
                                if( $thumb ) {
-                                       $desc = wfMsg( 'parentheses', $img->getShortDesc() );
+                                       $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
                                        wfProfileOut( __METHOD__ );
                                        // Float doesn't seem to interact well with the bullets.
                                        // Table messes up vertical alignment of the bullets.
@@ -718,12 +703,12 @@ class SpecialSearch extends SpecialPage {
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
 
                $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>".
-                       wfMsg('search-interwiki-caption')."</div>\n";
+                       $this->msg( 'search-interwiki-caption' )->text()  . "</div>\n";
                $out .= "<ul class='mw-search-iwresults'>\n";
 
                // work out custom project captions
                $customCaptions = array();
-               $customLines = explode("\n",wfMsg('search-interwiki-custom')); // format per line <iwprefix>:<caption>
+               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() ); // format per line <iwprefix>:<caption>
                foreach($customLines as $line) {
                        $parts = explode(":",$line,2);
                        if(count($parts) == 2) // validate line
@@ -786,13 +771,8 @@ class SpecialSearch extends SpecialPage {
                                $redirectText = null;
 
                        $redirect = "<span class='searchalttitle'>" .
-                               wfMsg(
-                                       'search-redirect',
-                                       Linker::linkKnown(
-                                               $redirectTitle,
-                                               $redirectText
-                                       )
-                               ) .
+                               $this->msg( 'search-redirect' )->rawParams(
+                                       Linker::linkKnown( $redirectTitle, $redirectText ) )->text() .
                                "</span>";
                }
 
@@ -806,13 +786,13 @@ class SpecialSearch extends SpecialPage {
                                // default is to show the hostname of the other wiki which might suck
                                // if there are many wikis on one hostname
                                $parsed = wfParseUrl( $t->getFullURL() );
-                               $caption = wfMsg('search-interwiki-default', $parsed['host']);
+                               $caption = $this->msg( 'search-interwiki-default', $parsed['host'] )->text();
                        }
                        // "more results" link (special page stuff could be localized, but we might not know target lang)
                        $searchTitle = Title::newFromText($t->getInterwiki().":Special:Search");
                        $searchLink = Linker::linkKnown(
                                $searchTitle,
-                               wfMsg('search-interwiki-more'),
+                               $this->msg( 'search-interwiki-more' )->text(),
                                array(),
                                array(
                                        'search' => $query,
@@ -865,7 +845,7 @@ class SpecialSearch extends SpecialPage {
                        }
                        $name = str_replace( '_', ' ', $name );
                        if( $name == '' ) {
-                               $name = wfMsg( 'blanknamespace' );
+                               $name = $this->msg( 'blanknamespace' )->text();
                        }
                        $rows[$subject] .=
                                Xml::openElement(
@@ -901,7 +881,7 @@ class SpecialSearch extends SpecialPage {
                // Show redirects check only if backend supports it
                if( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
                        $showSections['redirects'] =
-                               Xml::checkLabel( wfMsg( 'powersearch-redir' ), 'redirs', 'redirs', $this->searchRedirects );
+                               Xml::checkLabel( $this->msg( 'powersearch-redir' )->text(), 'redirs', 'redirs', $this->searchRedirects );
                }
 
                wfRunHooks( 'SpecialSearchPowerBox', array( &$showSections, $term, $opts ) );
@@ -917,29 +897,9 @@ class SpecialSearch extends SpecialPage {
                                'fieldset',
                                array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
                        ) .
-                       Xml::element( 'legend', null, wfMsg('powersearch-legend') ) .
-                       Xml::tags( 'h4', null, wfMsgExt( 'powersearch-ns', array( 'parseinline' ) ) ) .
-                       Xml::tags(
-                               'div',
-                               array( 'id' => 'mw-search-togglebox' ),
-                               Xml::label( wfMsg( 'powersearch-togglelabel' ), 'mw-search-togglelabel' ) .
-                                       Xml::element(
-                                               'input',
-                                               array(
-                                                       'type'=>'button',
-                                                       'id' => 'mw-search-toggleall',
-                                                       'value' => wfMsg( 'powersearch-toggleall' )
-                                               )
-                                       ) .
-                                       Xml::element(
-                                               'input',
-                                               array(
-                                                       'type'=>'button',
-                                                       'id' => 'mw-search-togglenone',
-                                                       'value' => wfMsg( 'powersearch-togglenone' )
-                                               )
-                                       )
-                       ) .
+                       Xml::element( 'legend', null, $this->msg('powersearch-legend' )->text() ) .
+                       Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
+                       Html::element( 'div', array( 'id' => 'mw-search-togglebox' ) ) .
                        Xml::element( 'div', array( 'class' => 'divider' ), '', false ) .
                        implode( Xml::element( 'div', array( 'class' => 'divider' ), '', false ), $showSections ) .
                        $hidden .
@@ -1034,8 +994,8 @@ class SpecialSearch extends SpecialPage {
                                $this->makeSearchLink(
                                        $bareterm,
                                        array(),
-                                       wfMsg( $profile['message'] ),
-                                       wfMsg( $profile['tooltip'], $tooltipParam ),
+                                       $this->msg( $profile['message'] )->text(),
+                                       $this->msg( $profile['tooltip'], $tooltipParam )->text(),
                                        $profile['parameters']
                                )
                        );
@@ -1046,24 +1006,19 @@ class SpecialSearch extends SpecialPage {
                // Results-info
                if ( $resultsShown > 0 ) {
                        if ( $totalNum > 0 ){
-                               $top = wfMsgExt( 'showingresultsheader', array( 'parseinline' ),
-                                       $lang->formatNum( $this->offset + 1 ),
-                                       $lang->formatNum( $this->offset + $resultsShown ),
-                                       $lang->formatNum( $totalNum ),
-                                       wfEscapeWikiText( $term ),
-                                       $lang->formatNum( $resultsShown )
-                               );
+                               $top = $this->msg( 'showingresultsheader' )
+                                       ->numParams( $this->offset + 1, $this->offset + $resultsShown, $totalNum )
+                                       ->params( wfEscapeWikiText( $term ) )
+                                       ->numParams( $resultsShown )
+                                       ->parse();
                        } elseif ( $resultsShown >= $this->limit ) {
-                               $top = wfMsgExt( 'showingresults', array( 'parseinline' ),
-                                       $lang->formatNum( $this->limit ),
-                                       $lang->formatNum( $this->offset + 1 )
-                               );
+                               $top = $this->msg( 'showingresults' )
+                                       ->numParams( $this->limit, $this->offset + 1 )
+                                       ->parse();
                        } else {
-                               $top =  wfMsgExt( 'showingresultsnum', array( 'parseinline' ),
-                                       $lang->formatNum( $this->limit ),
-                                       $lang->formatNum( $this->offset + 1 ),
-                                       $lang->formatNum( $resultsShown )
-                               );
+                               $top = $this->msg( 'showingresultsnum' )
+                                       ->numParams( $this->limit, $this->offset + 1, $resultsShown )
+                                       ->parse();
                        }
                        $out .= Xml::tags( 'div', array( 'class' => 'results-info' ),
                                Xml::tags( 'ul', null, Xml::tags( 'li', null, $top ) )
@@ -1090,7 +1045,7 @@ class SpecialSearch extends SpecialPage {
                        'autofocus'
                ) ) . "\n";
                $out .= Html::hidden( 'fulltext', 'Search' ) . "\n";
-               $out .= Xml::submitButton( wfMsg( 'searchbutton' ) ) . "\n";
+               $out .= Xml::submitButton( $this->msg( 'searchbutton' )->text() ) . "\n";
                return $out . $this->didYouMeanHtml;
        }
 
@@ -1114,7 +1069,7 @@ class SpecialSearch extends SpecialPage {
                $stParams = array_merge(
                        array(
                                'search' => $term,
-                               'fulltext' => wfMsg( 'search' )
+                               'fulltext' => $this->msg( 'search' )->text()
                        ),
                        $opt
                );
@@ -1152,7 +1107,7 @@ class SpecialSearch extends SpecialPage {
         */
        protected function startsWithAll( $term ) {
 
-               $allkeyword = wfMsgForContent('searchall');
+               $allkeyword = $this->msg( 'searchall' )->inContentLanguage()->text();
 
                $p = explode( ':', $term );
                if( count( $p ) > 1 ) {
index 8622b92..ee04574 100644 (file)
@@ -43,7 +43,8 @@ class ShortPagesPage extends QueryPage {
                        'fields' => array ( 'page_namespace AS namespace',
                                        'page_title AS title',
                                        'page_len AS value' ),
-                       'conds' => array ( 'page_namespace' => NS_MAIN,
+                       'conds' => array ( 'page_namespace' =>
+                                       MWNamespace::getContentNamespaces(),
                                        'page_is_redirect' => 0 ),
                        'options' => array ( 'USE INDEX' => 'page_redirect_namespace_len' )
                );
@@ -81,7 +82,11 @@ class ShortPagesPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $dm = $this->getLanguage()->getDirMark();
 
-               $title = Title::makeTitle( $result->namespace, $result->title );
+               $title = Title::makeTitleSafe( $result->namespace, $result->title );
+               if ( !$title ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
 
                $hlink = Linker::linkKnown(
                        $title,
index da8f786..46881ec 100644 (file)
@@ -118,9 +118,9 @@ class SpecialStatistics extends SpecialPage {
                if( $descMsg ) {
                        $msg = $this->msg( $descMsg, $descMsgParam );
                        if ( $msg->exists() ) {
-                               $descriptionText = $msg->parse();
+                               $descriptionText = $this->msg( 'parentheses' )->rawParams( $msg->parse() )->escaped();
                                $text .= "<br />" . Xml::element( 'small', array( 'class' => 'mw-statistic-desc'),
-                                       " ($descriptionText)" );
+                                       " $descriptionText" );
                        }
                }
                return Html::rawElement( 'tr', $trExtraParams,
index 0837fc3..df720a1 100644 (file)
@@ -21,9 +21,6 @@
  * @ingroup SpecialPage
  */
 
-if (!defined('MEDIAWIKI'))
-       die;
-
 /**
  * A special page that lists tags for edits
  *
@@ -44,10 +41,10 @@ class SpecialTags extends SpecialPage {
                $out->wrapWikiMsg( "<div class='mw-tags-intro'>\n$1\n</div>", 'tags-intro' );
 
                // Write the headers
-               $html = Xml::tags( 'tr', null, Xml::tags( 'th', null, wfMsgExt( 'tags-tag', 'parseinline' ) ) .
-                               Xml::tags( 'th', null, wfMsgExt( 'tags-display-header', 'parseinline' ) ) .
-                               Xml::tags( 'th', null, wfMsgExt( 'tags-description-header', 'parseinline' ) ) .
-                               Xml::tags( 'th', null, wfMsgExt( 'tags-hitcount-header', 'parseinline' ) )
+               $html = Xml::tags( 'tr', null, Xml::tags( 'th', null, $this->msg( 'tags-tag' )->parse() ) .
+                               Xml::tags( 'th', null, $this->msg( 'tags-display-header' )->parse() ) .
+                               Xml::tags( 'th', null, $this->msg( 'tags-description-header' )->parse() ) .
+                               Xml::tags( 'th', null, $this->msg( 'tags-hitcount-header' )->parse() )
                        );
                $dbr = wfGetDB( DB_SLAVE );
                $res = $dbr->select( 'change_tag', array( 'ct_tag', 'count(*) AS hitcount' ),
@@ -76,18 +73,18 @@ class SpecialTags extends SpecialPage {
 
                $disp = ChangeTags::tagDescription( $tag );
                $disp .= ' ';
-               $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), wfMsgHtml( 'tags-edit' ) );
+               $editLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag" ), $this->msg( 'tags-edit' )->escaped() );
                $disp .= $this->msg( 'parentheses' )->rawParams( $editLink )->escaped();
                $newRow .= Xml::tags( 'td', null, $disp );
 
-               $msg = wfMessage( "tag-$tag-description" );
+               $msg = $this->msg( "tag-$tag-description" );
                $desc = !$msg->exists() ? '' : $msg->parse();
                $desc .= ' ';
-               $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), wfMsgHtml( 'tags-edit' ) );
+               $editDescLink = Linker::link( Title::makeTitle( NS_MEDIAWIKI, "Tag-$tag-description" ), $this->msg( 'tags-edit' )->escaped() );
                $desc .= $this->msg( 'parentheses' )->rawParams( $editDescLink )->escaped();
                $newRow .= Xml::tags( 'td', null, $desc );
 
-               $hitcount = wfMsgExt( 'tags-hitcount', array( 'parsemag' ), $this->getLanguage()->formatNum( $hitcount ) );
+               $hitcount = $this->msg( 'tags-hitcount' )->numParams( $hitcount )->escaped();
                $hitcount = Linker::link( SpecialPage::getTitleFor( 'Recentchanges' ), $hitcount, array(), array( 'tagfilter' => $tag ) );
                $newRow .= Xml::tags( 'td', null, $hitcount );
 
index 4ad31a0..fb2005b 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 /**
+ * Implements Special:Unblock
+ *
  * 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
@@ -58,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..79c051a 100644 (file)
@@ -97,8 +97,8 @@ class PageArchive {
                                $condition,
                                __METHOD__,
                                array(
-                                       'GROUP BY' => 'ar_namespace,ar_title',
-                                       'ORDER BY' => 'ar_namespace,ar_title',
+                                       'GROUP BY' => array( 'ar_namespace', 'ar_title' ),
+                                       'ORDER BY' => array( 'ar_namespace', 'ar_title' ),
                                        'LIMIT' => 100,
                                )
                        )
@@ -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 );
@@ -1166,7 +1166,7 @@ class SpecialUndelete extends SpecialPage {
        private function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
                $rev = Revision::newFromArchiveRow( $row,
                        array( 'page' => $this->mTargetObj->getArticleID() ) );
-               $stxt = '';
+               $revTextSize = '';
                $ts = wfTimestamp( TS_MW, $row->ar_timestamp );
                // Build checkboxen...
                if( $this->mAllowed ) {
@@ -1215,13 +1215,15 @@ class SpecialUndelete extends SpecialPage {
                // Revision text size
                $size = $row->ar_len;
                if( !is_null( $size ) ) {
-                       $stxt = Linker::formatRevisionSize( $size );
+                       $revTextSize = Linker::formatRevisionSize( $size );
                }
                // Edit summary
                $comment = Linker::revComment( $rev );
                // Revision delete links
                $revdlink = Linker::getRevDeleteLink( $user, $rev, $this->mTargetObj );
-               return "<li>$checkBox $revdlink ($last) $pageLink . . $userLink $stxt $comment</li>";
+
+               $revisionRow = $this->msg( 'undelete-revisionrow' )->rawParams( $checkBox, $revdlink, $last, $pageLink , $userLink, $revTextSize, $comment )->escaped();
+               return "<li>$revisionRow</li>";
        }
 
        private function formatFileRow( $row ) {
index c4f99f8..4bd0232 100644 (file)
@@ -68,13 +68,15 @@ class UnwatchedpagesPage extends QueryPage {
        function formatResult( $skin, $result ) {
                global $wgContLang;
 
-               $nt = Title::makeTitle( $result->namespace, $result->title );
+               $nt = Title::makeTitleSafe( $result->namespace, $result->title );
+               if ( !$nt ) {
+                       return Html::element( 'span', array( 'class' => 'mw-invalidtitle' ),
+                               Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) );
+               }
+
                $text = $wgContLang->convert( $nt->getPrefixedText() );
 
-               $plink = Linker::linkKnown(
-                       $nt,
-                       htmlspecialchars( $text )
-               );
+               $plink = Linker::linkKnown( $nt, htmlspecialchars( $text ) );
                $token = WatchAction::getWatchToken( $nt, $this->getUser() );
                $wlink = Linker::linkKnown(
                        $nt,
index 1fa14ff..6052d09 100644 (file)
@@ -1,7 +1,28 @@
 <?php
 /**
- * Implements Special:UploadStash
+ * Implements Special:UploadStash.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ * @ingroup Upload
+ */
+
+/**
  * Web access for files temporarily stored by UploadStash.
  *
  * For example -- files that were uploaded with the UploadWizard extension are stored temporarily
  *
  * Since this is based on the user's session, in effect this creates a private temporary file area.
  * However, the URLs for the files cannot be shared.
- *
- * @file
- * @ingroup SpecialPage
- * @ingroup Upload
  */
-
 class SpecialUploadStash extends UnlistedSpecialPage {
        // UploadStash
        private $stash;
index 3837e27..7d91096 100644 (file)
@@ -125,11 +125,7 @@ class LoginForm extends SpecialPage {
                }
 
                if( !$wgAuth->validDomain( $this->mDomain ) ) {
-                       if ( isset( $_SESSION['wsDomain'] ) ) {
-                               $this->mDomain = $_SESSION['wsDomain'];
-                       } else {
-                               $this->mDomain = 'invaliddomain';
-                       }
+                       $this->mDomain = $wgAuth->getDomain();
                }
                $wgAuth->setDomain( $this->mDomain );
 
@@ -1261,6 +1257,10 @@ class LoginForm extends SpecialPage {
         * @return string
         */
        function makeLanguageSelectorLink( $text, $lang ) {
+               if( $this->getLanguage()->getCode() == $lang ) {
+                       // no link for currently used language
+                       return htmlspecialchars( $text );
+               }
                $attr = array( 'uselang' => $lang );
                if( $this->mType == 'signup' ) {
                        $attr['type'] = 'signup';
index d747448..ab2bf0a 100644 (file)
@@ -39,7 +39,7 @@ class SpecialUserlogout extends UnlistedSpecialPage {
                 */
                if ( isset( $_SERVER['REQUEST_URI'] ) && strpos( $_SERVER['REQUEST_URI'], '&amp;' ) !== false ) {
                        wfDebug( "Special:Userlogout request {$_SERVER['REQUEST_URI']} looks suspicious, denying.\n" );
-                       throw new HttpError( 400, wfMessage( 'suspicious-userlogout' ), wfMessage( 'loginerror' ) );
+                       throw new HttpError( 400, $this->msg( 'suspicious-userlogout' ), $this->msg( 'loginerror' ) );
                }
 
                $this->setHeaders();
index 3947f3a..8c244c4 100644 (file)
@@ -423,12 +423,12 @@ class UserrightsPage extends SpecialPage {
                $grouplist = '';
                $count = count( $list );
                if( $count > 0 ) {
-                       $grouplist = $this->msg( 'userrights-groupsmember', $count )->parse();
+                       $grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
                        $grouplist = '<p>' . $grouplist  . ' ' . $this->getLanguage()->listToText( $list ) . "</p>\n";
                }
                $count = count( $autolist );
                if( $count > 0 ) {
-                       $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count )->parse();
+                       $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
                        $grouplist .= '<p>' . $autogrouplistintro  . ' ' . $this->getLanguage()->listToText( $autolist ) . "</p>\n";
                }
 
index d0e7ed9..5a71ccb 100644 (file)
@@ -58,6 +58,7 @@ class SpecialVersion extends SpecialPage {
                $text =
                        $this->getMediaWikiCredits() .
                        $this->softwareInformation() .
+                       $this->getEntryPointInfo() .
                        $this->getExtensionCredits();
                if ( $wgSpecialVersionShowHooks ) {
                        $text .= $this->getWgHooks();
@@ -166,7 +167,8 @@ class SpecialVersion extends SpecialPage {
                        $version = $wgVersion;
                } elseif ( $gitInfo ) {
                        $shortSha1 = substr( $gitInfo, 0, 7 );
-                       $version = "$wgVersion ($shortSha1)";
+                       $shortSha1 = wfMessage( 'parentheses' )->params( $shortSha1 )->escaped();
+                       $version = "$wgVersion $shortSha1";
                } elseif ( $flags === 'nodb' ) {
                        $version = "$wgVersion (r{$svnInfo['checkout-rev']})";
                } else {
@@ -614,8 +616,8 @@ class SpecialVersion extends SpecialPage {
                        $list = $list[0];
                }
                if( is_object( $list ) ) {
-                       $class = get_class( $list );
-                       return "($class)";
+                       $class = wfMessage( 'parentheses' )->params( get_class( $list ) )->escaped();
+                       return $class;
                } elseif ( !is_array( $list ) ) {
                        return $list;
                } else {
@@ -624,7 +626,7 @@ class SpecialVersion extends SpecialPage {
                        } else {
                                $class = $list[0];
                        }
-                       return "($class, {$list[1]})";
+                       return wfMessage( 'parentheses' )->params( "$class, {$list[1]}" )->escaped();
                }
        }
 
@@ -739,6 +741,41 @@ class SpecialVersion extends SpecialPage {
                return $repo->getHeadSHA1();
        }
 
+       /**
+        * Get the list of entry points and their URLs
+        * @return string Wikitext
+        */
+       public function getEntryPointInfo() {
+               global $wgArticlePath, $wgScriptPath;
+               $entryPoints = array(
+                       'version-entrypoints-articlepath' => $wgArticlePath,
+                       'version-entrypoints-scriptpath' => $wgScriptPath,
+                       'version-entrypoints-index-php' => wfScript( 'index' ),
+                       'version-entrypoints-api-php' => wfScript( 'api' ),
+                       'version-entrypoints-load-php' => wfScript( 'load' ),
+               );
+
+               $out = Html::element( 'h2', array( 'id' => 'mw-version-entrypoints' ), wfMsg( 'version-entrypoints' ) ) .
+                       Html::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'mw-version-entrypoints-table' ) ) .
+                       Html::openElement( 'tr' ) .
+                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-entrypoint' )->text() ) .
+                       Html::element( 'th', array(), wfMessage( 'version-entrypoints-header-url' )->text() ) .
+                       Html::closeElement( 'tr' );
+
+               foreach ( $entryPoints as $message => $value ) {
+                       $url = wfExpandUrl( $value, PROTO_RELATIVE );
+                       $out .= Html::openElement( 'tr' ) .
+                               // ->text() looks like it should be ->parse(), but this function
+                               // returns wikitext, not HTML, boo
+                               Html::rawElement( 'td', array(), wfMessage( $message )->text() ) .
+                               Html::rawElement( 'td', array(), Html::rawElement( 'code', array(), "[$url $value]" ) ) .
+                               Html::closeElement( 'tr' );
+               }
+
+               $out .= Html::closeElement( 'table' );
+               return $out;
+       }
+
        function showEasterEgg() {
                $rx = $rp = $xe = '';
                $alpha = array("", "kbQW", "\$\n()");
index 25b93b1..2475189 100644 (file)
@@ -39,7 +39,7 @@ class WantedFilesPage extends WantedQueryPage {
                # Specifically setting to use "Wanted Files" (NS_MAIN) as title, so as to get what
                # category would be used on main namespace pages, for those tricky wikipedia
                # admins who like to do {{#ifeq:{{NAMESPACE}}|foo|bar|....}}.
-               $catMessage = wfMessage( 'broken-file-category' )
+               $catMessage = $this->msg( 'broken-file-category' )
                        ->title( Title::newFromText( "Wanted Files", NS_MAIN ) )
                        ->inContentLanguage();
                
index 4624b35..9f5d52d 100644 (file)
@@ -72,7 +72,7 @@ class WantedPagesPage extends WantedQueryPage {
                        ),
                        'options' => array(
                                'HAVING' => "COUNT(*) > $count",
-                               'GROUP BY' => 'pl_namespace, pl_title'
+                               'GROUP BY' => array( 'pl_namespace', 'pl_title' )
                        ),
                        'join_conds' => array(
                                'pg1' => array(
index ab9d604..2b4364b 100644 (file)
@@ -46,7 +46,7 @@ class WantedTemplatesPage extends WantedQueryPage {
                        'conds' => array ( 'page_title IS NULL',
                                        'tl_namespace' => NS_TEMPLATE ),
                        'options' => array (
-                               'GROUP BY' => 'tl_namespace, tl_title' ),
+                               'GROUP BY' => array( 'tl_namespace', 'tl_title' ) ),
                        'join_conds' => array ( 'page' => array ( 'LEFT JOIN',
                                        array ( 'page_namespace = tl_namespace',
                                                'page_title = tl_title' ) ) )
index 0c5f11c..a81eb5b 100644 (file)
@@ -91,14 +91,6 @@ class SpecialWatchlist extends SpecialPage {
                        return;
                }
 
-               if( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
-                       $request->wasPosted() )
-               {
-                       $user->clearAllNotifications();
-                       $output->redirect( $this->getTitle()->getFullUrl() );
-                       return;
-               }
-
                $nitems = $this->countItems();
                if ( $nitems == 0 ) {
                        $output->addWikiMsg( 'nowatchlist' );
@@ -116,6 +108,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 +141,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 ? '!=' : '=';
+                       $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 );
+                               $nameSpaceClause =
+                                       "rc_namespace $eq_op $nameSpace " .
+                                       $bool_op .
+                                       " rc_namespace $eq_op $associatedNS";
                        }
                } else {
                        $nameSpace = '';
@@ -162,6 +162,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 */
@@ -181,6 +182,14 @@ class SpecialWatchlist extends SpecialPage {
                        wfAppendToArrayIfNotDefault( $name, $values[$name], $defaults, $nondefaults );
                }
 
+               if( ( $wgEnotifWatchlist || $wgShowUpdatedMarker ) && $request->getVal( 'reset' ) &&
+                       $request->wasPosted() )
+               {
+                       $user->clearAllNotifications();
+                       $output->redirect( $this->getTitle()->getFullUrl( $nondefaults ) );
+                       return;
+               }
+
                $dbr = wfGetDB( DB_SLAVE, 'watchlist' );
 
                # Possible where conditions
@@ -254,15 +263,25 @@ class SpecialWatchlist extends SpecialPage {
                                                'id' => 'mw-watchlist-resetbutton' ) ) .
                                        $this->msg( 'wlheader-showupdated' )->parse() . ' ' .
                                        Xml::submitButton( $this->msg( 'enotif_reset' )->text(), array( 'name' => 'dummy' ) ) .
-                                       Html::hidden( 'reset', 'all' ) .
-                                       Xml::closeElement( 'form' );
+                                       Html::hidden( 'reset', 'all' );
+                                       foreach ( $nondefaults as $key => $value ) {
+                                               $form .= Html::hidden( $key, $value );
+                                       }
+                                       $form .= Xml::closeElement( 'form' );
                }
                $form .= '<hr />';
 
                $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 +357,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..8eb2781 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Base class for the backend of file upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
 /**
  * @defgroup Upload
  */
@@ -211,14 +233,17 @@ abstract class UploadBase {
         * @return stringthe real path if it was a virtual URL
         */
        function getRealPath( $srcPath ) {
+               wfProfileIn( __METHOD__ );
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        // @TODO: just make uploads work with storage paths
                        // UploadFromStash loads files via virtuals URLs
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        $tmpFile->bind( $this ); // keep alive with $thumb
+                       wfProfileOut( __METHOD__ );
                        return $tmpFile->getPath();
                }
+               wfProfileOut( __METHOD__ );
                return $srcPath;
        }
 
@@ -227,10 +252,13 @@ abstract class UploadBase {
         * @return mixed self::OK or else an array with error information
         */
        public function verifyUpload() {
+               wfProfileIn( __METHOD__ );
+
                /**
                 * If there was no filename or a zero size given, give up quick.
                 */
                if( $this->isEmptyFile() ) {
+                       wfProfileOut( __METHOD__ );
                        return array( 'status' => self::EMPTY_FILE );
                }
 
@@ -239,6 +267,7 @@ abstract class UploadBase {
                 */
                $maxSize = self::getMaxUploadSize( $this->getSourceType() );
                if( $this->mFileSize > $maxSize ) {
+                       wfProfileOut( __METHOD__ );
                        return array(
                                'status' => self::FILE_TOO_LARGE,
                                'max' => $maxSize,
@@ -252,6 +281,7 @@ abstract class UploadBase {
                 */
                $verification = $this->verifyFile();
                if( $verification !== true ) {
+                       wfProfileOut( __METHOD__ );
                        return array(
                                'status' => self::VERIFICATION_ERROR,
                                'details' => $verification
@@ -263,15 +293,19 @@ abstract class UploadBase {
                 */
                $result = $this->validateName();
                if( $result !== true ) {
+                       wfProfileOut( __METHOD__ );
                        return $result;
                }
 
                $error = '';
                if( !wfRunHooks( 'UploadVerification',
-                               array( $this->mDestName, $this->mTempPath, &$error ) ) ) {
+                       array( $this->mDestName, $this->mTempPath, &$error ) ) )
+               {
+                       wfProfileOut( __METHOD__ );
                        return array( 'status' => self::HOOK_ABORTED, 'error' => $error );
                }
 
+               wfProfileOut( __METHOD__ );
                return array( 'status' => self::OK );
        }
 
@@ -309,15 +343,18 @@ abstract class UploadBase {
         */
        protected function verifyMimeType( $mime ) {
                global $wgVerifyMimeType;
+               wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
                        wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n");
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
+                               wfProfileOut( __METHOD__ );
                                return array( 'filetype-badmime', $mime );
                        }
 
                        # XXX: Missing extension will be caught by validateName() via getTitle()
                        if ( $this->mFinalExtension != '' && !$this->verifyExtension( $mime, $this->mFinalExtension ) ) {
+                               wfProfileOut( __METHOD__ );
                                return array( 'filetype-mime-mismatch', $this->mFinalExtension, $mime );
                        }
 
@@ -331,11 +368,13 @@ abstract class UploadBase {
                        $ieTypes = $magic->getIEMimeTypes( $this->mTempPath, $chunk, $extMime );
                        foreach ( $ieTypes as $ieType ) {
                                if ( $this->checkFileExtension( $ieType, $wgMimeTypeBlacklist ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        return array( 'filetype-bad-ie-mime', $ieType );
                                }
                        }
                }
 
+               wfProfileOut( __METHOD__ );
                return true;
        }
 
@@ -346,6 +385,8 @@ abstract class UploadBase {
         */
        protected function verifyFile() {
                global $wgAllowJavaUploads, $wgDisableUploadScriptChecks;
+               wfProfileIn( __METHOD__ );
+
                # get the title, even though we are doing nothing with it, because
                # we need to populate mFinalExtension
                $this->getTitle();
@@ -356,16 +397,19 @@ abstract class UploadBase {
                $mime = $this->mFileProps[ 'file-mime' ];
                $status = $this->verifyMimeType( $mime );
                if ( $status !== true ) {
+                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
                # check for htmlish code and javascript
                if ( !$wgDisableUploadScriptChecks ) {
                        if( self::detectScript( $this->mTempPath, $mime, $this->mFinalExtension ) ) {
+                               wfProfileOut( __METHOD__ );
                                return array( 'uploadscripted' );
                        }
                        if( $this->mFinalExtension == 'svg' || $mime == 'image/svg+xml' ) {
                                if( $this->detectScriptInSvg( $this->mTempPath ) ) {
+                                       wfProfileOut( __METHOD__ );
                                        return array( 'uploadscripted' );
                                }
                        }
@@ -381,10 +425,12 @@ abstract class UploadBase {
                                $errors = $zipStatus->getErrorsArray();
                                $error = reset( $errors );
                                if ( $error[0] !== 'zip-wrong-format' ) {
+                                       wfProfileOut( __METHOD__ );
                                        return $error;
                                }
                        }
                        if ( $this->mJavaDetected ) {
+                               wfProfileOut( __METHOD__ );
                                return array( 'uploadjava' );
                        }
                }
@@ -392,6 +438,7 @@ abstract class UploadBase {
                # Scan the uploaded file for viruses
                $virus = $this->detectVirus( $this->mTempPath );
                if ( $virus ) {
+                       wfProfileOut( __METHOD__ );
                        return array( 'uploadvirus', $virus );
                }
 
@@ -400,16 +447,19 @@ abstract class UploadBase {
                        $handlerStatus = $handler->verifyUpload( $this->mTempPath );
                        if ( !$handlerStatus->isOK() ) {
                                $errors = $handlerStatus->getErrorsArray();
+                               wfProfileOut( __METHOD__ );
                                return reset( $errors );
                        }
                }
 
                wfRunHooks( 'UploadVerifyFile', array( $this, $mime, &$status ) );
                if ( $status !== true ) {
+                       wfProfileOut( __METHOD__ );
                        return $status;
                }
 
                wfDebug( __METHOD__ . ": all clear; passing.\n" );
+               wfProfileOut( __METHOD__ );
                return true;
        }
 
@@ -495,6 +545,7 @@ abstract class UploadBase {
         */
        public function checkWarnings() {
                global $wgLang;
+               wfProfileIn( __METHOD__ );
 
                $warnings = array();
 
@@ -555,6 +606,7 @@ abstract class UploadBase {
                        $warnings['duplicate-archive'] = $archivedImage->getName();
                }
 
+               wfProfileOut( __METHOD__ );
                return $warnings;
        }
 
@@ -567,6 +619,8 @@ abstract class UploadBase {
         * @return Status indicating the whether the upload succeeded.
         */
        public function performUpload( $comment, $pageText, $watch, $user ) {
+               wfProfileIn( __METHOD__ );
+
                $status = $this->getLocalFile()->upload(
                        $this->mTempPath,
                        $comment,
@@ -581,10 +635,10 @@ abstract class UploadBase {
                        if ( $watch ) {
                                $user->addWatch( $this->getLocalFile()->getTitle() );
                        }
-
                        wfRunHooks( 'UploadComplete', array( &$this ) );
                }
 
+               wfProfileOut( __METHOD__ );
                return $status;
        }
 
@@ -727,9 +781,13 @@ abstract class UploadBase {
         */
        public function stashFile() {
                // was stashSessionFile
+               wfProfileIn( __METHOD__ );
+
                $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
                $file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
                $this->mLocalFile = $file;
+
+               wfProfileOut( __METHOD__ );
                return $file;
        }
 
@@ -855,6 +913,7 @@ abstract class UploadBase {
         */
        public static function detectScript( $file, $mime, $extension ) {
                global $wgAllowTitlesInSVG;
+               wfProfileIn( __METHOD__ );
 
                # ugly hack: for text files, always look at the entire file.
                # For binary field, just check the first K.
@@ -870,6 +929,7 @@ abstract class UploadBase {
                $chunk = strtolower( $chunk );
 
                if( !$chunk ) {
+                       wfProfileOut( __METHOD__ );
                        return false;
                }
 
@@ -893,6 +953,7 @@ abstract class UploadBase {
 
                # check for HTML doctype
                if ( preg_match( "/<!DOCTYPE *X?HTML/i", $chunk ) ) {
+                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
@@ -929,6 +990,7 @@ abstract class UploadBase {
                foreach( $tags as $tag ) {
                        if( false !== strpos( $chunk, $tag ) ) {
                                wfDebug( __METHOD__ . ": found something that may make it be mistaken for html: $tag\n" );
+                               wfProfileOut( __METHOD__ );
                                return true;
                        }
                }
@@ -943,22 +1005,26 @@ abstract class UploadBase {
                # look for script-types
                if( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found script types\n" );
+                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
                # look for html-style script-urls
                if( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found html-style script urls\n" );
+                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
                # look for css-style script-urls
                if( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) ) {
                        wfDebug( __METHOD__ . ": found css-style script urls\n" );
+                       wfProfileOut( __METHOD__ );
                        return true;
                }
 
                wfDebug( __METHOD__ . ": no scripts found\n" );
+               wfProfileOut( __METHOD__ );
                return false;
        }
 
@@ -972,24 +1038,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 ) {
@@ -1010,9 +1152,11 @@ abstract class UploadBase {
         */
        public static function detectVirus( $file ) {
                global $wgAntivirus, $wgAntivirusSetup, $wgAntivirusRequired, $wgOut;
+               wfProfileIn( __METHOD__ );
 
                if ( !$wgAntivirus ) {
                        wfDebug( __METHOD__ . ": virus scanner disabled\n" );
+                       wfProfileOut( __METHOD__ );
                        return null;
                }
 
@@ -1020,6 +1164,7 @@ abstract class UploadBase {
                        wfDebug( __METHOD__ . ": unknown virus scanner: $wgAntivirus\n" );
                        $wgOut->wrapWikiMsg( "<div class=\"error\">\n$1\n</div>",
                                array( 'virus-badscanner', $wgAntivirus ) );
+                       wfProfileOut( __METHOD__ );
                        return wfMsg( 'virus-unknownscanner' ) . " $wgAntivirus";
                }
 
@@ -1062,17 +1207,21 @@ abstract class UploadBase {
                        wfDebug( __METHOD__ . ": failed to scan $file (code $exitCode).\n" );
 
                        if ( $wgAntivirusRequired ) {
+                               wfProfileOut( __METHOD__ );
                                return wfMsg( 'virus-scanfailed', array( $exitCode ) );
                        } else {
+                               wfProfileOut( __METHOD__ );
                                return null;
                        }
                } elseif ( $mappedCode === AV_SCAN_ABORTED ) {
                        # scan failed because filetype is unknown (probably imune)
                        wfDebug( __METHOD__ . ": unsupported file type $file (code $exitCode).\n" );
+                       wfProfileOut( __METHOD__ );
                        return null;
                } elseif ( $mappedCode === AV_NO_VIRUS ) {
                        # no virus found
                        wfDebug( __METHOD__ . ": file passed virus scan.\n" );
+                       wfProfileOut( __METHOD__ );
                        return false;
                } else {
                        $output = trim( $output );
@@ -1089,6 +1238,7 @@ abstract class UploadBase {
                        }
 
                        wfDebug( __METHOD__ . ": FOUND VIRUS! scanner feedback: $output \n" );
+                       wfProfileOut( __METHOD__ );
                        return $output;
                }
        }
index 11780e4..e50c6da 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Backend for uploading files from chunks.
+ *
+ * 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 Upload
+ */
+
 /**
  * Implements uploading from chunks
  *
index 234fde8..fae9974 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Backend for regular file upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Upload
+ */
+
 /**
  * Implements regular file uploads
  *
index 8805c50..d5cce14 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Backend for uploading files from previously stored 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 Upload
+ */
+
 /**
  * Implements uploading from previously stored file.
  *
@@ -99,7 +121,7 @@ class UploadFromStash extends UploadBase {
                // chooses one of wpDestFile, wpUploadFile, filename in that order.
                $desiredDestName = $request->getText( 'wpDestFile', $request->getText( 'wpUploadFile', $request->getText( 'filename' ) ) );
 
-               return $this->initialize( $fileKey, $desiredDestName );
+               $this->initialize( $fileKey, $desiredDestName );
        }
 
        /**
index 0ae8a22..c7e482e 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Backend for uploading files from a HTTP resource.
+ *
+ * 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 Upload
+ */
+
 /**
  * Implements uploading from a HTTP resource.
  *
@@ -93,7 +115,7 @@ class UploadFromUrl extends UploadBase {
                if ( !$desiredDestName ) {
                        $desiredDestName = $request->getText( 'wpUploadFileURL' );
                }
-               return $this->initialize(
+               $this->initialize(
                        $desiredDestName,
                        trim( $request->getVal( 'wpUploadFileURL' ) ),
                        false
index e347408..12531c2 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Temporary storage for uploaded 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 Upload
+ */
+
 /**
  * UploadStash is intended to accomplish a few things:
  *   - enable applications to temporarily stash files without publishing them to the wiki.
diff --git a/includes/zhtable/.gitignore b/includes/zhtable/.gitignore
new file mode 100644 (file)
index 0000000..c4cf2eb
--- /dev/null
@@ -0,0 +1,3 @@
+*.zip
+*.tar.gz
+*.tgz
old mode 100644 (file)
new mode 100755 (executable)
index 305422b..2bb53ab
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # @author Philip
 import tarfile as tf
@@ -39,7 +39,7 @@ LIBTABE_VER = '0.2.3'
 
 def download( url, dest ):
     if os.path.isfile( dest ):
-        print( 'File %s up to date.' % dest )
+        print( 'File %s is up to date.' % dest )
         return
     global islinux
     if islinux:
@@ -372,13 +372,13 @@ $zh2Hant = array(\n'''
         +  PHPArray( toSG ) \
         +  '\n);'
     
-    f = open( 'ZhConversion.php', 'wb', encoding = 'utf8' )
+    f = open( os.path.join( '..', 'ZhConversion.php' ), 'wb', encoding = 'utf8' )
     print ('Writing ZhConversion.php ... ')
     f.write( php )
     f.close()
     
-    #Remove temp files
-    print ('Deleting temp files ... ')
+    # Remove temporary files
+    print ('Deleting temporary files ... ')
     os.remove('EZ-Big.txt.in')
     os.remove('phrase_lib.txt')
     os.remove('tsi.src')
index ee3bc69..922b7de 100644 (file)
 藍澱
 皆可作澱
 澱山
+海淀山後
 澱澱
 掛鈎
 薴悴
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 a738b06..2c3dc07 100644 (file)
@@ -1 +1,24 @@
-<?php require './index.php';
+<?php
+/**
+ * Version of index.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './index.php';
index 463ea19..b531f2a 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Internationalisation code
+ * Internationalisation 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
  * @ingroup Language
@@ -139,6 +154,22 @@ class Language {
                'hijri-calendar-m10', 'hijri-calendar-m11', 'hijri-calendar-m12'
        );
 
+       /**
+        * @since 1.20
+        * @var array
+        */
+       static public $durationIntervals = array(
+               'millennia' => 31557600000,
+               'centuries' => 3155760000,
+               'decades' => 315576000,
+               'years' => 31557600, // 86400 * 365.25
+               'weeks' => 604800,
+               'days' => 86400,
+               'hours' => 3600,
+               'minutes' => 60,
+               'seconds' => 1,
+       );
+
        /**
         * Get a cached language object for a given language code
         * @param $code String
@@ -225,10 +256,22 @@ class Language {
         *
         * @param $code string
         *
+        * @throws MWException
         * @since 1.18
         * @return bool
         */
        public static function isValidBuiltInCode( $code ) {
+
+               if( !is_string($code) ) {
+                       $type = gettype( $code );
+                       if( $type === 'object' ) {
+                               $addmsg = " of class " . get_class( $code );
+                       } else {
+                               $addmsg = '';
+                       }
+                       throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
+               }
+
                return preg_match( '/^[a-z0-9-]+$/i', $code );
        }
 
@@ -257,10 +300,6 @@ class Language {
                }
 
                if ( !defined( 'MW_COMPILED' ) ) {
-                       // Preload base classes to work around APC/PHP5 bug
-                       if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
-                               include_once( "$IP/languages/classes/$class.deps.php" );
-                       }
                        if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
                                include_once( "$IP/languages/classes/$class.php" );
                        }
@@ -684,9 +723,9 @@ class Language {
         *              Use null for autonyms (native names)
         * @param $include string:
         *              'all' all available languages
-        *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames
+        *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
         *              'mwfile' only if the language is in 'mw' *and* has a message file
-        * @return array|bool: language code => language name, false if $include is wrong
+        * @return array: language code => language name
         * @since 1.20
         */
        public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
@@ -707,9 +746,8 @@ class Language {
                $mwNames = $wgExtraLanguageNames + $coreLanguageNames;
                foreach ( $mwNames as $mwCode => $mwName ) {
                        # - Prefer own MediaWiki native name when not using the hook
-                       #       TODO: prefer it always to make it consistent, but casing is different in CLDR
                        # - For other names just add if not added through the hook
-                       if ( ( $mwCode === $inLanguage && !$inLanguage ) || !isset( $names[$mwCode] ) ) {
+                       if ( $mwCode === $inLanguage || !isset( $names[$mwCode] ) ) {
                                $names[$mwCode] = $mwName;
                        }
                }
@@ -724,9 +762,7 @@ class Language {
                        $returnMw[$coreCode] = $names[$coreCode];
                }
 
-               if( $include === 'mw' ) {
-                       return $returnMw;
-               } elseif( $include === 'mwfile' ) {
+               if( $include === 'mwfile' ) {
                        $namesMwFile = array();
                        # We do this using a foreach over the codes instead of a directory
                        # loop so that messages files in extensions will work correctly.
@@ -737,7 +773,8 @@ class Language {
                        }
                        return $namesMwFile;
                }
-               return false;
+               # 'mw' option; default if it's not one of the other two options (all/mwfile)
+               return $returnMw;
        }
 
        /**
@@ -1908,6 +1945,63 @@ class Language {
                return $this->sprintfDate( $df, $ts );
        }
 
+       /**
+        * Takes a number of seconds and turns it into a text using values such as hours and minutes.
+        *
+        * @since 1.20
+        *
+        * @param integer $seconds The amount of seconds.
+        * @param array $chosenIntervals The intervals to enable.
+        *
+        * @return string
+        */
+       public function formatDuration( $seconds, array $chosenIntervals = array() ) {
+               $intervals = $this->getDurationIntervals( $seconds, $chosenIntervals );
+
+               $segments = array();
+
+               foreach ( $intervals as $intervalName => $intervalValue ) {
+                       $message = new Message( 'duration-' . $intervalName, array( $intervalValue ) );
+                       $segments[] = $message->inLanguage( $this )->escaped();
+               }
+
+               return $this->listToText( $segments );
+       }
+
+       /**
+        * Takes a number of seconds and returns an array with a set of corresponding intervals.
+        * For example 65 will be turned into array( minutes => 1, seconds => 5 ).
+        *
+        * @since 1.20
+        *
+        * @param integer $seconds The amount of seconds.
+        * @param array $chosenIntervals The intervals to enable.
+        *
+        * @return array
+        */
+       public function getDurationIntervals( $seconds, array $chosenIntervals = array() ) {
+               if ( empty( $chosenIntervals ) ) {
+                       $chosenIntervals = array( 'millennia', 'centuries', 'decades', 'years', 'days', 'hours', 'minutes', 'seconds' );
+               }
+
+               $intervals = array_intersect_key( self::$durationIntervals, array_flip( $chosenIntervals ) );
+               $sortedNames = array_keys( $intervals );
+               $smallestInterval = array_pop( $sortedNames );
+
+               $segments = array();
+
+               foreach ( $intervals as $name => $length ) {
+                       $value = floor( $seconds / $length );
+
+                       if ( $value > 0 || ( $name == $smallestInterval && empty( $segments ) ) ) {
+                               $seconds -= $value * $length;
+                               $segments[$name] = $value;
+                       }
+               }
+
+               return $segments;
+       }
+
        /**
         * Internal helper function for userDate(), userTime() and userTimeAndDate()
         *
@@ -2313,8 +2407,12 @@ class Language {
                        return $s;
                }
 
-               $isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+               if ( function_exists( 'mb_check_encoding' ) ) {
+                       $isutf8 = mb_check_encoding( $s, 'UTF-8' );
+               } else {
+                       $isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+                                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+               }
                if ( $isutf8 ) {
                        return $s;
                }
@@ -2635,12 +2733,26 @@ class Language {
        }
 
        /**
-        * An arrow, depending on the language direction
+        * An arrow, depending on the language direction.
         *
+        * @param $direction String: the direction of the arrow: forwards (default), backwards, left, right, up, down.
         * @return string
         */
-       function getArrow() {
-               return $this->isRTL() ? '←' : '→';
+       function getArrow( $direction = 'forwards' ) {
+               switch ( $direction ) {
+               case 'forwards':
+                       return $this->isRTL() ? '←' : '→';
+               case 'backwards':
+                       return $this->isRTL() ? '→' : '←';
+               case 'left':
+                       return '←';
+               case 'right':
+                       return '→';
+               case 'up':
+                       return '↑';
+               case 'down':
+                       return '↓';
+               }
        }
 
        /**
@@ -3576,6 +3688,9 @@ class Language {
        /**
         * Get the RFC 3066 code for this language object
         *
+        * NOTE: The return value of this function is NOT HTML-safe and must be escaped with
+        * htmlspecialchars() or similar
+        *
         * @return string
         */
        public function getCode() {
@@ -3585,6 +3700,10 @@ class Language {
        /**
         * Get the code in Bcp47 format which we can use
         * inside of html lang="" tags.
+        *
+        * NOTE: The return value of this function is NOT HTML-safe and must be escaped with
+        * htmlspecialchars() or similar.
+        *
         * @since 1.19
         * @return string
         */
@@ -3997,7 +4116,7 @@ class Language {
         * @param $title Title object to link
         * @param $offset Integer offset parameter
         * @param $limit Integer limit parameter
-        * @param $query String optional URL query parameter string
+        * @param $query array|String optional URL query parameter string
         * @param $atend Bool optional param for specified if this is the last page
         * @return String
         */
index 1f69cbf..9bea07d 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Language names.
+ *
+ * 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 Language
+ */
+
 /**
   * These determine things like interwikis, language selectors, and so on.
   * Safe to change without running scripts on the respective sites.
        'aln' => 'Gegë',       # Gheg Albanian
        'als' => 'Alemannisch', # Alemannic -- not a valid code, for compatibility. See gsw.
        'am' => 'አማርኛ', # Amharic
-       'an' => 'Aragonés',    # Aragonese
+       'an' => 'aragonés',    # Aragonese
        'ang' => 'Ænglisc',    # Old English (Bug 23283)
        'anp' => 'अङ्गिका',       # Angika
        'ar' => 'العربية',       # Arabic
        'arc' => 'ܐܪܡܝܐ',  # Aramaic
-       'arn' => 'Mapudungun',  # Mapuche, Mapudungu, Araucanian (Araucano)
+       'arn' => 'mapudungun',  # Mapuche, Mapudungu, Araucanian (Araucano)
        'ary' => 'Maġribi',    # Moroccan Spoken Arabic
        'arz' => 'مصرى',    # Egyptian Spoken Arabic
        'as' => 'অসমীয়া',   # Assamese
-       'ast' => 'Asturianu',   # Asturian
+       'ast' => 'asturianu',   # Asturian
        'av' => 'Авар',     # Avar
        'avk' => 'Kotava', # Kotava
        'ay' => 'Aymar aru',    # Aymara
-       'az' => 'Azərbaycanca',        # Azerbaijani
+       'az' => 'azərbaycanca',        # Azerbaijani
        'ba' => 'Башҡортса',   # Bashkir
        'bar' => 'Boarisch',    # Bavarian (Austro-Bavarian and South Tyrolean)
        'bat-smg' => 'Žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
        'bcc' => 'بلوچی مکرانی', # Southern Balochi
        'bcl' => 'Bikol Central', # Bikol: Central Bicolano language
-       'be' => 'Ð\91еларуская', #  Belarusian normative
-       'be-tarask' => "\xE2\x80\xAAÐ\91еларуская (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
-       'be-x-old' => "\xE2\x80\xAAÐ\91еларуская (тарашкевіца)\xE2\x80\xAC",  # Belarusian in Taraskievica orthography; compat link
-       'bg' => 'Ð\91ългарски',   # Bulgarian
+       'be' => 'беларуская', #  Belarusian normative
+       'be-tarask' => "\xE2\x80\xAAбеларуская (тарашкевіца)\xE2\x80\xAC", # Belarusian in Taraskievica orthography
+       'be-x-old' => "\xE2\x80\xAAбеларуская (тарашкевіца)\xE2\x80\xAC",  # Belarusian in Taraskievica orthography; compat link
+       'bg' => 'български',   # Bulgarian
        'bh' => 'भोजपुरी',        # Bihari macro language. Falls back to Bhojpuri (bho). The name actually says "Bhojpuri".
        'bho' => 'भोजपुरी',       # Bhojpuri
        'bi' => 'Bislama',              # Bislama
        'bjn' => 'Bahasa Banjar',       # Banjarese
-       'bm' => 'Bamanankan',   # Bambara
+       'bm' => 'bamanankan',   # Bambara
        'bn' => 'বাংলা',      # Bengali
        'bo' => 'བོད་ཡིག',        # Tibetan
-       'bpy' => 'à¦\87মার à¦ à¦¾à¦°/বিষà§\8dণà§\81পà§\8dরিয়া à¦®à¦£à¦¿à¦ªà§\81রà§\80',        # Bishnupriya Manipuri
+       'bpy' => 'বিষà§\8dণà§\81পà§\8dরিয়া à¦®à¦£à¦¿à¦ªà§\81রà§\80',       # Bishnupriya Manipuri
        'bqi' => 'بختياري',      # Bakthiari
-       'br' => 'Brezhoneg',    # Breton
+       'br' => 'brezhoneg',    # Breton
        'brh' => 'Bráhuí',    # Brahui
-       'bs' => 'Bosanski',             # Bosnian
+       'bs' => 'bosanski',             # Bosnian
        'bug' => 'ᨅᨔ ᨕᨘᨁᨗ', # Buginese
        'bxr' => 'Буряад',        # Buryat (Russia)
-       'ca' => 'Català',      # Catalan
+       'ca' => 'català',      # Catalan
        'cbk-zam' => 'Chavacano de Zamboanga',  # Zamboanga Chavacano
        'cdo' => 'Mìng-dĕ̤ng-ngṳ̄',       # Min Dong
        'ce' => 'Нохчийн',       # Chechen
        'chr' => 'ᏣᎳᎩ', # Cherokee
        'chy' => 'Tsetsêhestâhese',   # Cheyenne
        'ckb' => 'کوردی',  # Sorani. The name actually says "Kurdi" (Kurdish).
-       'co' => 'Corsu',                # Corsican
+       'co' => 'corsu',                # Corsican
        'cps' => 'Capiceño', # Capiznon
        'cr' => 'Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ',                # Cree
        'crh' => 'Qırımtatarca',   # Crimean Tatar (multiple scripts - defaults to Latin)
        'crh-latn' => "\xE2\x80\xAAQırımtatarca (Latin)\xE2\x80\xAC",       # Crimean Tatar (Latin)
        'crh-cyrl' => "\xE2\x80\xAAКъырымтатарджа (Кирилл)\xE2\x80\xAC",       # Crimean Tatar (Cyrillic)
-       'cs' => 'Ä\8cesky',       # Czech
-       'csb' => 'Kaszëbsczi', # Cassubian
-       'cu' => 'Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ',      # Old Church Slavonic (ancient language)
+       'cs' => 'Ä\8desky',       # Czech
+       'csb' => 'kaszëbsczi', # Cassubian
+       'cu' => 'словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ',      # Old Church Slavonic (ancient language)
        'cv' => 'Чӑвашла',       # Chuvash
        'cy' => 'Cymraeg',              # Welsh
-       'da' => 'Dansk',                # Danish
+       'da' => 'dansk',                # Danish
        'de' => 'Deutsch',              # German ("Du")
        'de-at' => 'Österreichisches Deutsch',         # Austrian German
        'de-ch' => 'Schweizer Hochdeutsch',             # Swiss Standard German
        'de-formal' => "\xE2\x80\xAADeutsch (Sie-Form)\xE2\x80\xAC",            # German - formal address ("Sie")
        'diq' => 'Zazaki',              # Zazaki
-       'dsb' => 'Dolnoserbski', # Lower Sorbian
+       'dsb' => 'dolnoserbski', # Lower Sorbian
        'dtp' => 'Dusun Bundu-liwan', # Central Dusun
        'dv' => 'ދިވެހިބަސް',         # Dhivehi
        'dz' => 'ཇོང་ཁ',              # Dzongkha (Bhutan)
-       'ee' => 'Eʋegbe',      # Éwé
+       'ee' => 'eʋegbe',      # Éwé
        'el' => 'Ελληνικά',     # Greek
-       'eml' => 'Emiliàn e rumagnòl',        # Emiliano-Romagnolo / Sammarinese
+       'eml' => 'emiliàn e rumagnòl',        # Emiliano-Romagnolo / Sammarinese
        'en' => 'English',              # English
        'en-ca' => 'Canadian English',  # Canadian English
        'en-gb' => 'British English',   # British English
        'eo' => 'Esperanto',    # Esperanto
-       'es' => 'Español',     # Spanish
-       'et' => 'Eesti',                # Estonian
-       'eu' => 'Euskara',              # Basque
-       'ext' => 'Estremeñu', # Extremaduran
+       'es' => 'español',     # Spanish
+       'et' => 'eesti',                # Estonian
+       'eu' => 'euskara',              # Basque
+       'ext' => 'estremeñu', # Extremaduran
        'fa' => 'فارسی',   # Persian
        'ff' => 'Fulfulde',             # Fulfulde, Maasina
-       'fi' => 'Suomi',                # Finnish
+       'fi' => 'suomi',                # Finnish
+       'fit' => 'meänkieli', # Tornedalen Finnish
        'fiu-vro' => 'Võro',    # Võro (deprecated code, 'vro' in ISO 639-3 since 2009-01-16)
        'fj' => 'Na Vosa Vakaviti',     # Fijian
-       'fo' => 'Føroyskt',    # Faroese
-       'fr' => 'Français',    # French
-       'frc' => 'Français cadien', # Cajun French
-       'frp' => 'Arpetan',     # Franco-Provençal/Arpitan
+       'fo' => 'føroyskt',    # Faroese
+       'fr' => 'français',    # French
+       'frc' => 'français cadien', # Cajun French
+       'frp' => 'arpetan',     # Franco-Provençal/Arpitan
        'frr' => 'Nordfriisk',  # North Frisian
-       'fur' => 'Furlan',              # Friulian
+       'fur' => 'furlan',              # Friulian
        'fy' => 'Frysk',                # Frisian
        'ga' => 'Gaeilge',              # Irish
        'gag' => 'Gagauz',              # Gagauz
        'gan' => '贛語',              # Gan (multiple scripts - defaults to Traditional)
-       'gan-hans' => "\xE2\x80\xAA赣语(简体)\xE2\x80\xAC", # Gan (Simplified Han)
-       'gan-hant' => "\xE2\x80\xAA贛語(繁體)\xE2\x80\xAC", # Gan (Traditional Han)
+       'gan-hans' => "\xE2\x80\xAA赣语(简体)\xE2\x80\xAC",     # Gan (Simplified Han)
+       'gan-hant' => "\xE2\x80\xAA贛語(繁體)\xE2\x80\xAC",     # Gan (Traditional Han)
        'gd' => 'Gàidhlig',    # Scots Gaelic
-       'gl' => 'Galego',               # Galician
+       'gl' => 'galego',               # Galician
        'glk' => 'گیلکی',  # Gilaki
        'gn' => 'Avañe\'ẽ',  # Guaraní, Paraguayan
        'got' => '𐌲𐌿𐍄𐌹𐍃𐌺',    # Gothic
        'hif-latn' => 'Fiji Hindi',     # Fiji Hindi (latin)
        'hil' => 'Ilonggo',     # Hiligaynon
        'ho' => 'Hiri Motu',    # Hiri Motu
-       'hr' => 'Hrvatski',             # Croatian
-       'hsb' => 'Hornjoserbsce',       # Upper Sorbian
+       'hr' => 'hrvatski',             # Croatian
+       'hsb' => 'hornjoserbsce',       # Upper Sorbian
        'ht'  => 'Kreyòl ayisyen',             # Haitian Creole French
-       'hu' => 'Magyar',               # Hungarian
+       'hu' => 'magyar',               # Hungarian
        'hy' => 'Հայերեն',       # Armenian
        'hz' => 'Otsiherero',   # Herero
-       'ia' => 'Interlingua',  # Interlingua (IALA)
+       'ia' => 'interlingua',  # Interlingua (IALA)
        'id' => 'Bahasa Indonesia',     # Indonesian
        'ie' => 'Interlingue',  # Interlingue (Occidental)
        'ig' => 'Igbo',                 # Igbo
        'ii' => 'ꆇꉙ',       # Sichuan Yi
        'ik' => 'Iñupiak',     # Inupiak (Inupiatun, Northwest Alaska / Inupiatun, North Alaskan)
        'ike-cans' => 'ᐃᓄᒃᑎᑐᑦ',     # Inuktitut, Eastern Canadian/Eastern Canadian "Eskimo"/"Eastern Arctic Eskimo"/Inuit (Unified Canadian Aboriginal Syllabics)
-       'ike-latn' => 'Inuktitut',      # Inuktitut, Eastern Canadian (Latin script)
+       'ike-latn' => 'inuktitut',      # Inuktitut, Eastern Canadian (Latin script)
        'ilo' => 'Ilokano',     # Ilokano
        'inh' => 'ГӀалгӀай',    # Ingush
        'io' => 'Ido',                  # Ido
-       'is' => 'Ã\8dslenska',    # Icelandic
-       'it' => 'Italiano',             # Italian
+       'is' => 'íslenska',    # Icelandic
+       'it' => 'italiano',             # Italian
        'iu' => 'ᐃᓄᒃᑎᑐᑦ/inuktitut', # Inuktitut (macro language - do no localise, see ike/ikt - falls back to ike-cans)
        'ja' => '日本語',    # Japanese
        'jam' => 'Patois',      # Jamaican Creole English
        'jbo' => 'Lojban',              # Lojban
-       'jut' => 'Jysk',        # Jutish / Jutlandic
+       'jut' => 'jysk',        # Jutish / Jutlandic
        'jv' => 'Basa Jawa',    # Javanese
        'ka' => 'ქართული',        # Georgian
        'kaa' => 'Qaraqalpaqsha',       # Karakalpak
        'kk-cn' => "\xE2\x80\xABقازاقشا (جۇنگو)\xE2\x80\xAC",       # Kazakh (China)
        'kk-kz' => "\xE2\x80\xAAҚазақша (Қазақстан)\xE2\x80\xAC",       # Kazakh (Kazakhstan)
        'kk-tr' => "\xE2\x80\xAAQazaqşa (Türkïya)\xE2\x80\xAC",      # Kazakh (Turkey)
-       'kl' => 'Kalaallisut',  # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
+       'kl' => 'kalaallisut',  # Inuktitut, Greenlandic/Greenlandic/Kalaallisut (kal)
        'km' => 'ភាសាខ្មែរ',  # Khmer, Central
        'kn' => 'ಕನ್ನಡ',      # Kannada
        'ko' => '한국어',    # Korean
        'ku-latn' => "\xE2\x80\xAAKurdî (latînî)\xE2\x80\xAC",       # Northern Kurdish (Latin script)
        'ku-arab' => "\xE2\x80\xABكوردي (عەرەبی)\xE2\x80\xAC",       # Northern Kurdish (Arabic script) (falls back to ckb)
        'kv' => 'Коми',     # Komi-Zyrian (Cyrillic is common script but also written in Latin script)
-       'kw' => 'Kernowek',             # Cornish
+       'kw' => 'kernowek',             # Cornish
        'ky' => 'Кыргызча',     # Kirghiz
        'la' => 'Latina',               # Latin
        'lad' => 'Ladino',      # Ladino
        'li' => 'Limburgs',     # Limburgian
        'lij' => 'Ligure',      # Ligurian
        'liv' => 'Līvõ kēļ',        # Livonian
-       'lmo' => 'Lumbaart',    # Lombard
-       'ln' => 'Lingála',             # Lingala
+       'lmo' => 'lumbaart',    # Lombard
+       'ln' => 'lingála',             # Lingala
        'lo' => 'ລາວ',# Laotian
        'loz' => 'Silozi', # Lozi
-       'lt' => 'Lietuvių',    # Lithuanian
-       'ltg' => 'Latgaļu',    # Latgalian
+       'lt' => 'lietuvių',    # Lithuanian
+       'ltg' => 'latgaļu',    # Latgalian
        'lus' => 'Mizo ţawng', # Mizo/Lushai
-       'lv' => 'Latviešu',    # Latvian
+       'lv' => 'latviešu',    # Latvian
        'lzh' => '文言',      # Literary Chinese -- (bug 8217) lzh instead of zh-classical, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=l
        'lzz' => 'Lazuri',      # Laz
        'mai' => 'मैथिली', # Maithili
        'mhr' => 'Олык Марий', # Eastern Mari
        'mi' => 'Māori',       # Maori
        'min' => 'Baso Minangkabau',    # Minangkabau
-       'mk' => 'Ð\9cакедонски', # Macedonian
+       'mk' => 'македонски', # Macedonian
        'ml' => 'മലയാളം',   # Malayalam
-       'mn' => 'Ð\9cонгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
-       'mo' => 'Ð\9cолдовеняскэ',     # Moldovan, deprecated
+       'mn' => 'монгол', # Halh Mongolian (Cyrillic) (ISO 639-3: khk)
+       'mo' => 'молдовеняскэ',     # Moldovan, deprecated
        'mr' => 'मराठी',      # Marathi
        'mrj' => 'Кырык мары', # Hill Mari
        'ms' => 'Bahasa Melayu',        # Malay
        'nah' => 'Nāhuatl',            # Nahuatl, en:Wikipedia writes Nahuatlahtolli, while another form is Náhuatl
        'nan' => 'Bân-lâm-gú', # Min-nan -- (bug 8217) nan instead of zh-min-nan, http://www.sil.org/iso639-3/codes.asp?order=639_3&letter=n
        'nap' => 'Nnapulitano', # Neapolitan
-       'nb' => "\xE2\x80\xAANorsk (bokmål)\xE2\x80\xAC",              # Norwegian (Bokmal)
+       'nb' => "\xE2\x80\xAAnorsk (bokmål)\xE2\x80\xAC",              # Norwegian (Bokmal)
        'nds' => 'Plattdüütsch',      # Low German ''or'' Low Saxon
        'nds-nl' => 'Nedersaksisch',    # Dutch Low Saxon
        'ne' => 'नेपाली',   # Nepali
        'niu' => 'Niuē',       # Niuean
        'nl' => 'Nederlands',   # Dutch
        'nl-informal' => "\xE2\x80\xAANederlands (informeel)\xE2\x80\xAC",      # Dutch (informal address ("je"))
-       'nn' => "\xE2\x80\xAANorsk (nynorsk)\xE2\x80\xAC",      # Norwegian (Nynorsk)
-       'no' => "\xE2\x80\xAANorsk (bokmål)\xE2\x80\xAC",              # Norwegian (falls back to nb).
+       'nn' => "\xE2\x80\xAAnorsk (nynorsk)\xE2\x80\xAC",      # Norwegian (Nynorsk)
+       'no' => "\xE2\x80\xAAnorsk (bokmål)\xE2\x80\xAC",              # Norwegian (falls back to nb).
        'nov' => 'Novial',              # Novial
        'nrm' => 'Nouormand',   # Norman
        'nso' => 'Sesotho sa Leboa',    # Northern Sotho
        'nv' => 'Diné bizaad', # Navajo
        'ny' => 'Chi-Chewa',    # Chichewa
-       'oc' => 'Occitan',              # Occitan
+       'oc' => 'occitan',              # Occitan
        'om' => 'Oromoo',               # Oromo
        'or' => 'ଓଡ଼ିଆ',         # Oriya
        'os' => 'Ирон', # Ossetic -- fixed per bug 29091
        'pfl' => 'Pälzisch',   # Palatinate German
        'pi' => 'पाळि', # Pali
        'pih' => 'Norfuk / Pitkern', # Norfuk/Pitcairn/Norfolk
-       'pl' => 'Polski',               # Polish
+       'pl' => 'polski',               # Polish
        'pms' => 'Piemontèis', # Piedmontese
        'pnb' => 'پنجابی',        # Western Punjabi
        'pnt' => 'Ποντιακά',    # Pontic/Pontic Greek
        'prg' => 'Prūsiskan',  # Prussian
        'ps' => 'پښتو',     # Pashto, Northern/Paktu/Pakhtu/Pakhtoo/Afghan/Pakhto/Pashtu/Pushto/Yusufzai Pashto
-       'pt' => 'Português',   # Portuguese
-       'pt-br' => 'Português do Brasil',      # Brazilian Portuguese
+       'pt' => 'português',   # Portuguese
+       'pt-br' => 'português do Brasil',      # Brazilian Portuguese
        'qu' => 'Runa Simi',    # Southern Quechua
        'qug' => 'Runa shimi',  # Kichwa/Northern Quechua (one of the codes it covers; temporarily used until Kichwa has its own)
        'rgn' => 'Rumagnôl',   # Romagnol
        'rif' => 'Tarifit',     # Tarifit
-       'rm' => 'Rumantsch',    # Raeto-Romance
+       'rm' => 'rumantsch',    # Raeto-Romance
        'rmy' => 'Romani',      # Vlax Romany
        'rn' => 'Kirundi',              # Rundi/Kirundi/Urundi
-       'ro' => 'Română',     # Romanian
+       'ro' => 'română',     # Romanian
        'roa-rup' => 'Armãneashce', # Aromanian (deprecated code, 'rup' exists in ISO 693-3)
-       'roa-tara' => 'Tarandíne',     # Tarantino
-       'ru' => 'Русский',       # Russian
-       'rue' => 'Русиньскый',        # Rusyn
+       'roa-tara' => 'tarandíne',     # Tarantino
+       'ru' => 'русский',       # Russian
+       'rue' => 'русиньскый',        # Rusyn
        'rup' => 'Armãneashce', # Aromanian
        'ruq' => 'Vlăheşte',  # Megleno-Romanian (multiple scripts - defaults to Latin)
        'ruq-cyrl' => 'Влахесте',       # Megleno-Romanian (Cyrillic script)
        'ruq-latn' => 'Vlăheşte',     # Megleno-Romanian (Latin script)
        'rw' => 'Kinyarwanda',  # Kinyarwanda, should possibly be Kinyarwandi
        'sa' => 'संस्कृतम्',  # Sanskrit
-       'sah' => 'Саха тыла', # Sakha
-       'sc' => 'Sardu',                # Sardinian
-       'scn' => 'Sicilianu',   # Sicilian
+       'sah' => 'саха тыла', # Sakha
+       'sat' => 'Santali',     # Santali
+       'sc' => 'sardu',                # Sardinian
+       'scn' => 'sicilianu',   # Sicilian
        'sco' => 'Scots',       # Scots
        'sd' => 'سنڌي',     # Sindhi
        'sdc' => 'Sassaresu',   # Sassarese
-       'se' => 'Sámegiella',  # Northern Sami
+       'se' => 'sámegiella',  # Northern Sami
        'sei' => 'Cmique Itom', # Seri
        'sg' => 'Sängö',              # Sango/Sangho
-       'sgs' => 'Žemaitėška', # Samogitian
-       'sh' => 'Srpskohrvatski / Српскохрватски', # Serbocroatian
+       'sgs' => 'žemaitėška', # Samogitian
+       'sh' => 'srpskohrvatski / српскохрватски', # Serbocroatian
        'shi' => 'Tašlḥiyt/ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (multiple scripts - defaults to Latin)
        'shi-tfng' => 'ⵜⴰⵛⵍⵃⵉⵜ',    # Tachelhit (Tifinagh script)
        'shi-latn' => 'Tašlḥiyt',    # Tachelhit (Latin script)
        'si' => 'සිංහල',      # Sinhalese
        'simple' => 'Simple English',   # Simple English
-       'sk' => 'Slovenčina',  # Slovak
-       'sl' => 'Slovenščina',        # Slovenian
+       'sk' => 'slovenčina',  # Slovak
+       'sl' => 'slovenščina',        # Slovenian
        'sli' => 'Schläsch',   # Lower Selisian
        'sm' => 'Gagana Samoa', # Samoan
        'sma' => 'Åarjelsaemien',      # Southern Sami
        'sn' => 'chiShona',             # Shona
        'so' => 'Soomaaliga',   # Somali
-       'sq' => 'Shqip',                # Albanian
-       'sr' => 'Српски / Srpski',        # Serbian (multiple scripts - defaults to Cyrillic)
-       'sr-ec' => "\xE2\x80\xAAСрпски (ћирилица)\xE2\x80\xAC",   # Serbian Cyrillic ekavian
-       'sr-el' => "\xE2\x80\xAASrpski (latinica)\xE2\x80\xAC", # Serbian Latin ekavian
+       'sq' => 'shqip',                # Albanian
+       'sr' => 'српски / srpski',        # Serbian (multiple scripts - defaults to Cyrillic)
+       'sr-ec' => "\xE2\x80\xAAсрпски (ћирилица)\xE2\x80\xAC",   # Serbian Cyrillic ekavian
+       'sr-el' => "\xE2\x80\xAAsrpski (latinica)\xE2\x80\xAC", # Serbian Latin ekavian
        'srn' => 'Sranantongo',         # Sranan Tongo
        'ss' => 'SiSwati',              # Swati
        'st' => 'Sesotho',              # Southern Sotho
        'stq' => 'Seeltersk',           # Saterland Frisian
        'su' => 'Basa Sunda',   # Sundanese
-       'sv' => 'Svenska',              # Swedish
+       'sv' => 'svenska',              # Swedish
        'sw' => 'Kiswahili',    # Swahili
-       'szl' => 'Å\9alůnski',   # Silesian
+       'szl' => 'Å\9blůnski',   # Silesian
        'ta' => 'தமிழ்',      # Tamil
        'tcy' => 'ತುಳು', # Tulu
        'te' => 'తెలుగు',   # Telugu
-       'tet' => 'Tetun',       # Tetun
-       'tg' => 'Тоҷикӣ', # Tajiki (falls back to tg-cyrl)
-       'tg-cyrl' => 'Тоҷикӣ',    # Tajiki (Cyrllic script) (default)
-       'tg-latn' => 'Tojikī', # Tajiki (Latin script)
+       'tet' => 'tetun',       # Tetun
+       'tg' => 'тоҷикӣ', # Tajiki (falls back to tg-cyrl)
+       'tg-cyrl' => 'тоҷикӣ',    # Tajiki (Cyrllic script) (default)
+       'tg-latn' => 'tojikī', # Tajiki (Latin script)
        'th' => 'ไทย',    # Thai
        'ti' => 'ትግርኛ',         # Tigrinya
        'tk' => 'Türkmençe',  # Turkmen
        'tl' => 'Tagalog',              # Tagalog
-       'tly' => 'Толышә зывон',     # Talysh
+       'tly' => 'толышә зывон',     # Talysh
        'tn' => 'Setswana',             # Setswana
        'to' => 'lea faka-Tonga',               # Tonga (Tonga Islands)
        'tokipona' => 'Toki Pona',      # Toki Pona
        'tpi' => 'Tok Pisin',   # Tok Pisin
        'tr' => 'Türkçe',     # Turkish
        'ts' => 'Xitsonga',             # Tsonga
-       'tt' => 'Татарча/Tatarça',      # Tatar (multiple scripts - defaults to Cyrillic)
-       'tt-cyrl' => 'Татарча',  # Tatar (Cyrillic script) (default)
-       'tt-latn' => 'Tatarça',        # Tatar (Latin script)
+       'tt' => 'татарча/tatarça',      # Tatar (multiple scripts - defaults to Cyrillic)
+       'tt-cyrl' => 'татарча',  # Tatar (Cyrillic script) (default)
+       'tt-latn' => 'tatarça',        # Tatar (Latin script)
        'tum' => 'chiTumbuka',  # Tumbuka
        'tw' => 'Twi',                  # Twi, (FIXME!)
        'ty' => 'Reo Mā`ohi',  # Tahitian
        'ug' => 'ئۇيغۇرچە / Uyghurche', # Uyghur (multiple scripts - defaults to Arabic)
        'ug-arab' => 'ئۇيغۇرچە', # Uyghur (Arabic script) (default)
        'ug-latn' => 'Uyghurche', # Uyghur (Latin script)
-       'uk' => 'Українська', # Ukrainian
+       'uk' => 'українська', # Ukrainian
        'ur' => 'اردو',     # Urdu
-       'uz' => 'Oʻzbek',      # Uzbek
+       'uz' => 'Oʻzbekcha',   # Uzbek
        've' => 'Tshivenda',            # Venda
-       'vec' => 'Vèneto',     # Venetian
+       'vec' => 'vèneto',     # Venetian
        'vep' => 'Vepsän kel’',      # Veps
        'vi' => 'Tiếng Việt',       # Vietnamese
        'vls' => 'West-Vlams', # West Flemish
        'vo' => 'Volapük',     # Volapük
        'vot' => 'Vaďďa',     # Vod/Votian
        'vro' => 'Võro',    # Võro
-       'wa' => 'Walon',                # Walloon
+       'wa' => 'walon',                # Walloon
        'war' => 'Winaray', # Waray-Waray
        'wo' => 'Wolof',                # Wolof
        'wuu' => '吴语',              # Wu Chinese
        'zea' => 'Zeêuws',     # Zeeuws/Zeaws
        'zh' => '中文',                                               # (Zhōng Wén) - Chinese
        'zh-classical' => '文言',                     # Classical Chinese/Literary Chinese -- (see bug 8217)
-       'zh-cn' => "\xE2\x80\xAA中文(中国大陆)\xE2\x80\xAC",      # Chinese (PRC)
-       'zh-hans' => "\xE2\x80\xAA中文(简体)\xE2\x80\xAC",  # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
-       'zh-hant' => "\xE2\x80\xAA中文(繁體)\xE2\x80\xAC",  # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
-       'zh-hk' => "\xE2\x80\xAA中文(香港)\xE2\x80\xAC",    # Chinese (Hong Kong)
+       'zh-cn' => "\xE2\x80\xAA中文(中国大陆)\xE2\x80\xAC",  # Chinese (PRC)
+       'zh-hans' => "\xE2\x80\xAA中文(简体)\xE2\x80\xAC",      # Mandarin Chinese (Simplified Chinese script) (cmn-hans)
+       'zh-hant' => "\xE2\x80\xAA中文(繁體)\xE2\x80\xAC",      # Mandarin Chinese (Traditional Chinese script) (cmn-hant)
+       'zh-hk' => "\xE2\x80\xAA中文(香港)\xE2\x80\xAC",        # Chinese (Hong Kong)
        'zh-min-nan' => 'Bân-lâm-gú',                                # Min-nan -- (see bug 8217)
-       'zh-mo' => "\xE2\x80\xAA中文(澳門)\xE2\x80\xAC",    # Chinese (Macau)
-       'zh-my' => "\xE2\x80\xAA中文(马来西亚)\xE2\x80\xAC",      # Chinese (Malaysia)
-       'zh-sg' => "\xE2\x80\xAA中文(新加坡)\xE2\x80\xAC", # Chinese (Singapore)
-       'zh-tw' => "\xE2\x80\xAA中文(台灣)\xE2\x80\xAC",    # Chinese (Taiwan)
+       'zh-mo' => "\xE2\x80\xAA中文(澳門)\xE2\x80\xAC",        # Chinese (Macau)
+       'zh-my' => "\xE2\x80\xAA中文(马来西亚)\xE2\x80\xAC",  # Chinese (Malaysia)
+       'zh-sg' => "\xE2\x80\xAA中文(新加坡)\xE2\x80\xAC",     # Chinese (Singapore)
+       'zh-tw' => "\xE2\x80\xAA中文(台灣)\xE2\x80\xAC",        # Chinese (Taiwan)
        'zh-yue' => '粵語',                                   # Cantonese -- (see bug 8217)
        'zu' => 'isiZulu'               # Zulu
 );
index 29ae9c1..4c39c26 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Amharic (አማርኛ) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Amharic (አማርኛ)
  *
index 95e7639..cc6b85c 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Arabic (العربية)
+/**
+ * Arabic (العربية) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Arabic (العربية)
+ *
+ * @ingroup Language
  */
 class LanguageAr extends Language {
 
index 947e656..0956dc4 100644 (file)
@@ -1,8 +1,31 @@
 <?php
-/** Azerbaijani (Azərbaycan)
-  *
-  * @ingroup Language
-  */
+/**
+ * Azerbaijani (Azərbaycan) specific 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
+ * @ingroup Language
+ */
+
+/**
+ * Azerbaijani (Azərbaycan)
+ *
+ * @ingroup Language
+ */
 class LanguageAz extends Language {
 
        /**
index 7d881ac..b5b5966 100644 (file)
@@ -1,17 +1,38 @@
 <?php
-/** Belarusian normative (Беларуская мова)
-  *
-  * This is still the version from Be-x-old, only duplicated for consistency of
-  * plural and grammar functions. If there are errors please send a patch.
-  *
-  * @ingroup Language
-  *
-  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-  * @see http://be.wikipedia.org/wiki/Talk:LanguageBe.php
-  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
-  * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
-  */
+/**
+ * Belarusian normative (Беларуская мова) specific 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
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
+ * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
+ * @ingroup Language
+ */
 
+/**
+ * Belarusian normative (Беларуская мова)
+ *
+ * This is still the version from Be-x-old, only duplicated for consistency of
+ * plural and grammar functions. If there are errors please send a patch.
+ *
+ * @ingroup Language
+ * @see http://be.wikipedia.org/wiki/Talk:LanguageBe.php
+ */
 class LanguageBe extends Language {
 
        /**
index 0e07a71..b781d7a 100644 (file)
@@ -1,14 +1,35 @@
 <?php
-/** Belarusian in Taraškievica orthography (Беларуская тарашкевіца)
-  *
-  * @ingroup Language
-  *
-  * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
-  * @see http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
-  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
-  * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
-  */
+/**
+ * Belarusian in Taraškievica orthography (Беларуская тарашкевіца) specific 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
+ * @author Ævar Arnfjörð Bjarmason <avarab@gmail.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License
+ * @license http://www.gnu.org/copyleft/fdl.html GNU Free Documentation License
+ * @ingroup Language
+ */
 
+/**
+ * Belarusian in Taraškievica orthography (Беларуская тарашкевіца)
+ *
+ * @ingroup Language
+ * @see http://be-x-old.wikipedia.org/wiki/Project_talk:LanguageBe_tarask.php
+ */
 class LanguageBe_tarask extends Language {
        /**
         * Plural form transformations
index 9ccb9a8..d735c7a 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Bulgarian (Български) specific 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
+ * @ingroup Language
+ */
 
-/** Bulgarian (Български)
+/**
+ * Bulgarian (Български)
  *
  * @ingroup Language
  */
index 46e4418..0eaf2ff 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Bihari (भोजपुरी) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Bihari (भोजपुरी)
  *
index 7c13037..0929641 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Bosnian (bosanski) specific 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
+ * @ingroup Language
+ */
 
-/** Bosnian (bosanski)
+/**
+ * Bosnian (bosanski)
  *
  * @ingroup Language
  */
index f50a7e7..49c4756 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Czech (čeština [subst.], český [adj.], česky [adv.]) specific 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
+ * @ingroup Language
+ */
 
-/** Czech (čeština [subst.], český [adj.], česky [adv.])
+/**
+ * Czech (čeština [subst.], český [adj.], česky [adv.])
  *
  * @ingroup Language
  */
index af42d2c..bfa95cf 100644 (file)
@@ -1,6 +1,28 @@
 <?php
-
-/** Old Church Slavonic (Ѩзыкъ словѣньскъ)
+/**
+ * Old Church Slavonic (Ѩзыкъ словѣньскъ) specific 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
+ * @ingroup Language
+ */
+/**
+ * Old Church Slavonic (Ѩзыкъ словѣньскъ)
  *
  * @ingroup Language
  */
index 1b0863a..9c28279 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Welsh (Cymraeg)
+/**
+ * Welsh (Cymraeg) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Welsh (Cymraeg)
+ *
+ * @ingroup Language
  */
 class LanguageCy extends Language {
 
index 1fae25c..b8ed7fc 100644 (file)
@@ -1,6 +1,29 @@
 <?php
+/**
+ * Lower Sorbian (Dolnoserbski) specific 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
+ * @author Niklas Laxström
+ * @ingroup Language
+ */
 
-/** Lower Sorbian (Dolnoserbski)
+/**
+ * Lower Sorbian (Dolnoserbski)
  *
  * @ingroup Language
  */
index af058a3..3c16248 100644 (file)
@@ -1,9 +1,31 @@
 <?php
+/**
+ * Esperanto (Esperanto) specific 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
+ * @author Brion Vibber <brion@pobox.com>
+ * @ingroup Language
+ */
 
-/** Esperanto (Esperanto)
+/**
+ * Esperanto (Esperanto)
  *
  * @ingroup Language
- * @author Brion Vibber <brion@pobox.com>
  */
 class LanguageEo extends Language {
        /**
index b469dec..1a9f286 100644 (file)
@@ -1,9 +1,30 @@
 <?php
-
-/** Estonian (Eesti)
+/**
+ * Estonian (Eesti) specific 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
  * @ingroup Language
+ */
+
+/**
+ * Estonian (Eesti)
  *
+ * @ingroup Language
  */
 class LanguageEt extends Language {
        /**
index 7156b65..1865cc5 100644 (file)
@@ -1,10 +1,31 @@
 <?php
-
-/** Finnish (Suomi)
+/**
+ * Finnish (Suomi) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Finnish (Suomi)
+ *
+ * @ingroup Language
  */
 class LanguageFi extends Language {
 
index 3e7c970..edbe1fb 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * French (Français) specific 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
+ * @ingroup Language
+ */
 
-/** French (Français)
+/**
+ * French (Français)
  *
  * @ingroup Language
  */
index 43050e1..cb9fa04 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Irish (Gaeilge) specific 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
+ * @ingroup Language
+ */
 
-/** Irish (Gaeilge)
+/**
+ * Irish (Gaeilge)
  *
  * @ingroup Language
  */
index 99b4c29..4fd41cf 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Gan Chinese specific 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
+ * @ingroup Language
+ */
 
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 require_once( dirname( __FILE__ ) . '/LanguageZh.php' );
index 737cdda..f042b02 100644 (file)
@@ -1,10 +1,32 @@
 <?php
-/** Scots Gaelic (Gàidhlig)
+/**
+ * Scots Gaelic (Gàidhlig) specific code.
  *
- * @ingroup Language
+ * 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 Raimond Spekking
  * @author Niklas Laxström
+ * @ingroup Language
+ */
+
+/**
+ * Scots Gaelic (Gàidhlig)
+ *
+ * @ingroup Language
  */
 class LanguageGd extends Language {
 
index 4defffd..70b80ad 100644 (file)
@@ -1,10 +1,31 @@
 <?php
-
-/** Manx (Gaelg)
+/**
+ * Manx (Gaelg) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Manx (Gaelg)
+ *
+ * @ingroup Language
  */
 class LanguageGv extends Language {
 
index 87483c6..22be1de 100644 (file)
@@ -1,11 +1,31 @@
 <?php
+/**
+ * Hebrew (עברית) specific 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
+ * @author Rotem Liss
+ * @ingroup Language
+ */
 
 /**
  * Hebrew (עברית)
  *
  * @ingroup Language
- *
- * @author Rotem Liss
  */
 class LanguageHe extends Language {
 
index 53a0fc1..6a2302c 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Hindi (हिन्दी) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Hindi (हिन्दी)
  *
index e18c8d3..a0e9a87 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Croatian (hrvatski)
-  *
-  * @ingroup Language
-  */
+/**
+ * Croatian (hrvatski) specific 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
+ * @ingroup Language
+ */
 
+/**
+ * Croatian (hrvatski)
+ *
+ * @ingroup Language
+ */
 class LanguageHr extends Language {
 
        /**
index 1b67aa0..965ea6a 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Upper Sorbian (Hornjoserbsce)
+/**
+ * Upper Sorbian (Hornjoserbsce) specific 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
  * @ingroup Language
  */
 
+/**
+ * Upper Sorbian (Hornjoserbsce)
+ *
+ * @ingroup Language
+ */
 class LanguageHsb extends Language {
 
        /**
index dbb6f5b..1f4d45c 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Hungarian (magyar) specific 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
+ * @ingroup Language
+ */
 
-/** Hungarian localisation for MediaWiki
+/**
+ * Hungarian localisation for MediaWiki
  *
  * @ingroup Language
  */
index c14106c..9c15595 100644 (file)
@@ -1,9 +1,31 @@
 <?php
+/**
+ * Armenian (Հայերեն) specific 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
+ * @author Ruben Vardanyan (Me@RubenVardanyan.com)
+ * @ingroup Language
+ */
 
-/** Armenian (Հայերեն)
+/**
+ * Armenian (Հայերեն)
  *
  * @ingroup Language
- * @author Ruben Vardanyan (Me@RubenVardanyan.com)
  */
 class LanguageHy extends Language {
 
diff --git a/languages/classes/LanguageIu.deps.php b/languages/classes/LanguageIu.deps.php
deleted file mode 100644 (file)
index 3b78d87..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageIu.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://mail.wikipedia.org/pipermail/wikitech-l/2006-January/033660.html
-
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
index 72f6af1..090d626 100644 (file)
@@ -1,24 +1,39 @@
 <?php
 /**
-  * @addtogroup Language
-  */
-
-/*
-* Conversion script between Latin and Syllabics for Inuktitut.
-* - Syllabics -> lowercase Latin
-* - lowercase/uppercase Latin -> Syllabics
-*
-*
-* Based on:
-*   - http://commons.wikimedia.org/wiki/Image:Inuktitut.png
-*   - LanguageSr.php
-*
-* @ingroup Language
-*/
+ * Inuktitut specific 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
+ * @ingroup Language
+ */
+
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 
 /**
+ * Conversion script between Latin and Syllabics for Inuktitut.
+ * - Syllabics -> lowercase Latin
+ * - lowercase/uppercase Latin -> Syllabics
+ *
  *
+ * Based on:
+ *   - http://commons.wikimedia.org/wiki/Image:Inuktitut.png
+ *   - LanguageSr.php
+ *
+ * @ingroup Language
  */
 class IuConverter extends LanguageConverter {
 
index 510a397..9c6314c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Japanese (日本語) specific 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
+ * @ingroup Language
+ */
 
 /**
  * Japanese (日本語)
index 22e8946..a397bc0 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Karakalpak (Qaraqalpaqsha) specific 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
+ * @ingroup Language
+ */
 
-/** Karakalpak (Qaraqalpaqsha)
+/**
+ * Karakalpak (Qaraqalpaqsha)
  *
  * @ingroup Language
  */
diff --git a/languages/classes/LanguageKk.deps.php b/languages/classes/LanguageKk.deps.php
deleted file mode 100644 (file)
index 0a2a8af..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageKk.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageKk_cyrl.php' );
index c2a3d24..7eb0b6c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Kazakh (Қазақша) specific 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
+ * @ingroup Language
+ */
 
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 require_once( dirname( __FILE__ ) . '/LanguageKk_cyrl.php' );
@@ -11,8 +32,8 @@ define( 'KK_L_LC', 'aäbcçdeéfgğhıiïjklmnñoöpqrsştuüvwxyýz' ); # Kazak
 define( 'H_HAMZA', 'ٴ' ); # U+0674 ARABIC LETTER HIGH HAMZA
 // define( 'ZWNJ', '‌' ); # U+200C ZERO WIDTH NON-JOINER
 
-/** Kazakh (Қазақша)
- * converter routines
+/**
+ * Kazakh (Қазақша) converter routines
  *
  * @ingroup Language
  */
index 30f74e6..081a20f 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Kazakh (Қазақша)
+/**
+ * Kazakh (Қазақша) specific 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
  * @ingroup Language
  */
 
+/**
+ * Kazakh (Қазақша)
+ *
+ * @ingroup Language
+ */
 class LanguageKk_cyrl extends Language {
 
        # Convert from the nominative form of a noun to some other case
index 105e6ed..71d67a7 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Khmer (ភាសាខ្មែរ)
+/**
+ * Kazakh (Қазақша) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Khmer (ភាសាខ្មែរ)
+ *
+ * @ingroup Language
  */
 class LanguageKm extends Language {
 
index dc37656..074ad13 100644 (file)
@@ -1,10 +1,31 @@
 <?php
-
-/** Ripuarian (Ripoarėsh)
+/**
+ * Ripuarian (Ripoarėsh) specific code.
  *
- * @ingroup Language
+ * 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 Purodha Blissenbach
+ * @ingroup Language
+ */
+
+/**
+ * Ripuarian (Ripoarėsh)
+ *
+ * @ingroup Language
  */
 class LanguageKsh extends Language {
        static $familygender = array(
diff --git a/languages/classes/LanguageKu.deps.php b/languages/classes/LanguageKu.deps.php
deleted file mode 100644 (file)
index a187b77..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageKu.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
-require_once( dirname( __FILE__ ) . '/LanguageKu_ku.php' );
index 81bf6ee..18c8564 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Kurdish specific 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
+ * @ingroup Language
+ */
+
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 require_once( dirname( __FILE__ ) . '/LanguageKu_ku.php' );
 
index e433292..2381de5 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Kurdish specific 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
+ * @ingroup Language
+ */
 
-/** Kurdish
+/**
+ * Kurdish
  *
  * @ingroup Language
  */
index 657ac6e..ba0f140 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Latin (lingua Latina) specific 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
+ * @ingroup Language
+ */
 
-/** Latin (lingua Latina)
+/**
+ * Latin (lingua Latina)
  *
  * @ingroup Language
  */
index b96cf61..d7329d5 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Lingala (Lingála) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Lingala (Lingála)
  *
index af38b6a..ac4ebda 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Lithuanian (Lietuvių) specific 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
+ * @ingroup Language
+ */
 
-/** Lithuanian (Lietuvių)
+/**
+ * Lithuanian (Lietuvių)
  *
  * @ingroup Language
  */
index 8a78303..e76f6f9 100644 (file)
@@ -1,13 +1,33 @@
 <?php
-
-/** Latvian (Latviešu)
+/**
+ * Latvian (Latviešu) specific code.
  *
- * @ingroup Language
+ * 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.
  *
- * @author Niklas Laxström
+ * 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
  * @copyright Copyright © 2006, Niklas Laxström
  * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @ingroup Language
+ */
+
+/**
+ * Latvian (Latviešu)
+ *
+ * @ingroup Language
  */
 class LanguageLv extends Language {
        /**
index 111dda3..ace0a4c 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Malagasy (Malagasy) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Malagasy (Malagasy)
  *
index 4e3b576..968fe26 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Macedonian (Македонски) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Macedonian (Македонски)
  *
index aeca362..ec3ea54 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Malayalam (മലയാളം) specific 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
+ * @ingroup Language
+ */
 
 /**
  * Malayalam (മലയാളം)
index 2fa48e9..bf8a10d 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Moldavian (Молдовеняскэ) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Moldavian (Молдовеняскэ)
  *
index 5cf40ce..68bd7ca 100644 (file)
@@ -1,12 +1,32 @@
 <?php
-
-/** Maltese (Malti)
+/**
+ * Maltese (Malti) specific code.
  *
- * @ingroup Language
+ * 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 Language
  */
 
+/**
+ * Maltese (Malti)
+ *
+ * @ingroup Language
+ */
 class LanguageMt extends Language {
 
        /**
@@ -25,4 +45,4 @@ class LanguageMt extends Language {
                else $index = 3;
                return $forms[$index];
        }
-}
\ No newline at end of file
+}
index b12e458..1d117dd 100644 (file)
@@ -1,10 +1,31 @@
 <?php
-
-/** Burmese (Myanmasa)
+/**
+ * Burmese (Myanmasa) specific code.
  *
- * @ingroup Language
+ * 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, 2008
+ * @ingroup Language
+ */
+
+/**
+ * Burmese (Myanmasa)
+ *
+ * @ingroup Language
  */
 class LanguageMy extends Language {
 
@@ -19,4 +40,4 @@ class LanguageMy extends Language {
                 */
                return $_;
        }
-}
\ No newline at end of file
+}
index 4026332..0c08675 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Northern Sotho (Sesotho sa Leboa) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Northern Sotho (Sesotho sa Leboa)
  *
index f3b5d8a..a808840 100644 (file)
@@ -1,8 +1,29 @@
 <?php
-
-/** Ossetian (Ирон)
+/**
+ * Ossetian (Ирон) specific 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
  * @author Soslan Khubulov
+ * @ingroup Language
+ */
+
+/**
+ * Ossetian (Ирон)
  *
  * @ingroup Language
  */
index b64ee98..68bf020 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Polish (polski) specific 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
+ * @ingroup Language
+ */
 
-/** Polish (polski)
+/**
+ * Polish (polski)
  *
  * @ingroup Language
  */
index 6798b24..8e2115c 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Dummy language that return the message names.
+ *
+ * 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 Language
+ */
+
 /**
  * For all translated messages, this returns the name of the message bracketed.
  * This does not affect untranslated messages.
index ce3e515..0db2ec0 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Romanian (Română) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Romanian (Română)
  *
index b5371d2..6407e15 100644 (file)
@@ -1,11 +1,33 @@
 <?php
+/**
+ * Russian (русский язык) specific 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
+ * @ingroup Language
+ */
 
-/** Russian (русский язык)
-  *
-  * You can contact Alexander Sigachov (alexander.sigachov at Googgle Mail)
-  *
-  * @ingroup Language
-  */
+/**
+ * Russian (русский язык)
+ *
+ * You can contact Alexander Sigachov (alexander.sigachov at Googgle Mail)
+ *
+ * @ingroup Language
+ */
 class LanguageRu extends Language {
 
        /**
index a66957f..25b61c3 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Northern Sami (Sámegiella) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Northern Sami (Sámegiella)
  *
index d47863d..0c74e45 100644 (file)
@@ -1,9 +1,31 @@
 <?php
-/** Samogitian (Žemaitėška)
+/**
+ * Samogitian (Žemaitėška) specific code.
  *
- * @ingroup Language
+ * 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 Language
+ */
+
+/**
+ * Samogitian (Žemaitėška)
+ *
+ * @ingroup Language
  */
 class LanguageSgs extends Language {
 
index 139ad0b..1fcddfc 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Serbo-Croatian (Srpskohrvatski / Српскохрватски) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Serbo-Croatian (Srpskohrvatski / Српскохрватски)
  *
diff --git a/languages/classes/LanguageShi.deps.php b/languages/classes/LanguageShi.deps.php
deleted file mode 100644 (file)
index 3b78d87..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageIu.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://mail.wikipedia.org/pipermail/wikitech-l/2006-January/033660.html
-
-require_once( dirname(__FILE__).'/../LanguageConverter.php' );
index 08a06d6..ab34440 100644 (file)
@@ -1,24 +1,39 @@
 <?php
 /**
-  * @addtogroup Language
-  */
-
-/*
-* Conversion script between Latin and Tifinagh for Tachelhit.
-* - Tifinagh -> lowercase Latin
-* - lowercase/uppercase Latin -> Tifinagh
-*
-*
-* Based on:
-*   - http://en.wikipedia.org/wiki/Shilha_language
-*   - LanguageSr.php
-*
-* @ingroup Language
-*/
+ * Shilha specific 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
+ * @ingroup Language
+ */
+
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 
 /**
+ * Conversion script between Latin and Tifinagh for Tachelhit.
+ * - Tifinagh -> lowercase Latin
+ * - lowercase/uppercase Latin -> Tifinagh
+ *
  *
+ * Based on:
+ *   - http://en.wikipedia.org/wiki/Shilha_language
+ *   - LanguageSr.php
+ *
+ * @ingroup Language
  */
 class ShiConverter extends LanguageConverter {
 
index eac25f4..b1da70e 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Slovak (Slovenčina) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Slovak (Slovenčina)
  *
index 3e2ca90..c075e51 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Slovenian (Slovenščina) specific 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
+ * @ingroup Language
+ */
 
-/** Slovenian (Slovenščina)
+/**
+ * Slovenian (Slovenščina)
  *
  * @ingroup Language
  */
index 72ca98a..1961871 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Southern Sami (Åarjelsaemien) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Southern Sami (Åarjelsaemien)
  *
diff --git a/languages/classes/LanguageSr.deps.php b/languages/classes/LanguageSr.deps.php
deleted file mode 100644 (file)
index a377037..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageSr.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
index 1b04cb7..26d6853 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Serbian (Српски / Srpski) specific 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
+ * @ingroup Language
+ */
 
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 require_once( dirname( __FILE__ ) . '/LanguageSr_ec.php' );
index 572a5f3..352e293 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Serbian (cyrillic script) specific 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
+ * @ingroup Language
+ */
 
 /**
  * Serbian (cyrillic script)
index 3a1f6a6..0e36d6c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Serbian (latin script) specific 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
+ * @ingroup Language
+ */
 
 /**
  * Serbian (latin script)
index f73e2ba..90d5761 100644 (file)
@@ -1,9 +1,31 @@
 <?php
+/**
+ * Tajik (Тоҷикӣ) specific 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
+ * @ingroup Language
+ */
 
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 
 /**
  * Converts Tajiki to latin orthography
+ *
  * @ingroup Language
  */
 class TgConverter extends LanguageConverter {
index 46a776b..27331cc 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Tigrinya (ትግርኛ) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Tigrinya (ትግርኛ)
  *
index f976bed..15bce76 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Tagalog (Tagalog) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Tagalog (Tagalog)
  *
index b6acea4..6a01566 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Turkish (Türkçe) specific 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
+ * @ingroup Language
+ */
+
 
 /**
  * Turkish (Türkçe)
index 8bca11b..6d147c8 100644 (file)
@@ -1,6 +1,29 @@
 <?php
+/**
+ * Tyvan (Тыва дыл) specific 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
+ * @ingroup Language
+ */
 
-/** Tyvan localization (Тыва дыл)
+/**
+ * Tyvan localization (Тыва дыл)
+ *
  * From friends at tyvawiki.org
  *
  * @ingroup Language
index 14e5d27..ce9ed33 100644 (file)
@@ -1,6 +1,28 @@
 <?php
+/**
+ * Ukrainian (українська мова) specific 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
+ * @ingroup Language
+ */
 
-/** Ukrainian (українська мова)
+/**
+ * Ukrainian (українська мова)
  *
  * @ingroup Language
  */
index 4a18663..8a4aca6 100644 (file)
@@ -1,13 +1,34 @@
 <?php
 /**
- * Walloon (Walon)
+ * Walloon (Walon) specific 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
  * @ingroup Language
  */
 
-# NOTE: cweri après "NOTE:" po des racsegnes so des ratournaedjes
-# k' i gn a.
-
+/**
+ * Walloon (Walon)
+ *
+ * NOTE: cweri après "NOTE:" po des racsegnes so des ratournaedjes
+ * k' i gn a.
+ *
+ * @ingroup Language
+ */
 class LanguageWa extends Language {
        /**
         * Use singular form for zero
index 5492529..aef5215 100644 (file)
@@ -1,4 +1,26 @@
 <?php
+/**
+ * Cantonese (粵語) specific 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
+ * @ingroup Language
+ */
+
 /**
  * Cantonese (粵語)
  *
diff --git a/languages/classes/LanguageZh.deps.php b/languages/classes/LanguageZh.deps.php
deleted file mode 100644 (file)
index 41874ff..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// LanguageZh.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-require_once( dirname( __FILE__ ) . '/LanguageZh_hans.php' );
-require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
index d69929d..96eea7c 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Chinese specific 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
+ * @ingroup Language
+ */
 
 require_once( dirname( __FILE__ ) . '/../LanguageConverter.php' );
 require_once( dirname( __FILE__ ) . '/LanguageZh_hans.php' );
index 671a16e..d95c42e 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Simplified Chinese specific 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
+ * @ingroup Language
+ */
 
 /**
  * Simplified Chinese
index 127aa4d..000c8e7 100644 (file)
@@ -182,10 +182,13 @@ $messages = array(
 'tog-enotifminoredits' => "Peu'ek cit surat-e keu lon bak neuandam bacut",
 'tog-enotifrevealaddr' => 'Peuleumah alamat surat-e lon bak neubrithee surat-e',
 'tog-shownumberswatching' => 'Peuleumah jumeulah ureueng kalon',
-'tog-oldsig' => 'Peuleumah tanda jaroe:',
+'tog-oldsig' => 'Tanda jaroe jinoe:',
 'tog-fancysig' => 'Peujeuet tanda jaroe sibagoe naseukah wiki (hana hubong keudroe)',
-'tog-externaleditor' => 'Nguy alat leumiek keu ngon peugot kata luwa',
-'tog-externaldiff' => 'Nguy alat leumiek luwa keu eu bida neuandam',
+'tog-externaleditor' => 'Nguy editor eksternal nyang ka na (keu nyang utoih khong, peureulee neuato kusuih bak kompute droeneuh.
+
+[//www.mediawiki.org/wiki/Manual:External_editors Haba leubeh leungkap.])',
+'tog-externaldiff' => 'Nguy diff eksternal nyang ka na (keu nyang utoih mantong, peureulee neuato kusuih bak kompute droeneuh
+[//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Peuudep hubong keu ngon bantu "langsong u"',
 'tog-uselivepreview' => 'Nguy peuleumah hase langsong (JavaScript) (baci)',
 'tog-forceeditsummary' => 'Peuingat lon meunyo plok neuringkaih neuandam mantong soh',
@@ -200,6 +203,11 @@ $messages = array(
 'underline-always' => 'Sabe',
 'underline-never' => "H'an tom",
 
+# Font style option in Special:Preferences
+'editfont-monospace' => 'Seunurat Monospace',
+'editfont-sansserif' => 'Seunurat Sans-serif',
+'editfont-serif' => 'Seunurat Serif',
+
 # Dates
 'sunday' => 'Aleuhat',
 'monday' => 'Seulanyan',
@@ -259,9 +267,12 @@ $messages = array(
 'category-media-header' => 'Alat lam kawan "$1"',
 'category-empty' => "''Kawan nyoë jinoë hat hana teunuléh atawa media.''",
 'hidden-categories' => '{{PLURAL:$1|Kawan teusom|Kawan teusom}}',
+'hidden-category-category' => 'Kawan teusom',
 'category-subcat-count' => '{{PLURAL:$2|Kawan nyoë  cit na saboh yupkawan nyoë.|Kawan nyoë na {{PLURAL:$1|yupkawan|$1 yupkawan}} nyoë, dari ban dum $2.}}',
 'category-article-count' => '{{PLURAL:$2|Kawan nyoë cit na saboh ôn nyoë.|Kawan nyoë na  {{PLURAL:$1|ôn|$1 ôn }}, dari ban dum $2.}}',
+'category-file-count' => '{{PLURAL:$2|Kawan nyoe cit na beureukaih nyoe sagay.|{{PLURAL:$1|beureukaih|$1 beureukaih}} nyoe na lam kawan nyoe, nibak ban dum $2.}}',
 'listingcontinuesabbrev' => 'samb.',
+'noindex-category' => 'On nyang hana geuindex',
 
 'about' => 'Bhah',
 'article' => 'Teunuléh',
@@ -291,7 +302,7 @@ $messages = array(
 'vector-action-move' => 'Peupinah',
 'vector-action-protect' => 'Peulindông',
 'vector-action-undelete' => 'Bateuë sampôh',
-'vector-action-unprotect' => 'Bateuë peulindông',
+'vector-action-unprotect' => 'Gantoe neulindông',
 'vector-simplesearch-preference' => 'Peuudep mita saran nyang geupeusamporeuna (keu kulet Vector khong)',
 'vector-view-create' => 'Peugöt',
 'vector-view-edit' => 'Andam',
@@ -325,8 +336,8 @@ $messages = array(
 'protect' => 'Peulindông',
 'protect_change' => 'ubah',
 'protectthispage' => 'Peulindong on nyoe',
-'unprotect' => 'Bek peulindong',
-'unprotectthispage' => 'Peuhah neulindông ôn nyoë',
+'unprotect' => 'Gantoe neulindong',
+'unprotectthispage' => 'Gantoe neulindông ôn nyoë',
 'newpage' => 'Ôn barô',
 'talkpage' => 'Peugah haba bhah ôn nyoë',
 'talkpagelinktext' => 'Peugah haba',
@@ -432,6 +443,7 @@ Nan Droeneuh ka teupeugot. Neuato laju [[Special:Preferences|peue nyang neugalak
 'createaccount' => 'Peudapeuta nan barô',
 'gotaccount' => "Ka lheuëh neudapeuta? '''$1'''.",
 'gotaccountlink' => 'Tamong',
+'userlogin-resetlink' => 'Tuwoe-neuh ngon teuneurang tamong Droeneuh?',
 'loginsuccesstitle' => 'Meuhasé tamong',
 'loginsuccess' => "'''Droëneuh  jinoë ka neutamong di {{SITENAME}} sibagoë \"\$1\".'''",
 'nosuchuser' => 'Hana ureuëng nguy ngön nan "$1".
@@ -502,9 +514,12 @@ Alamat IP Droëneuh nakeuh $3, ngön ID neutheun nakeuh $5. Tulông peuseureuta
 'newarticletext' => "Droëneuh   ka neuseutot u ôn nyang goh na. Keu peugöt ôn nyan, neukeutik asoë ôn di  kutak di yup nyoë (ngiëng [[{{MediaWiki:Helppage}}|ôn bantu]] keu beurita leubèh lanjut). Meunyo Droëneuh  hana neusaja ka trôk keunoë, teugon '''back''' nyang na bak layeuë.",
 'noarticletext' => 'Hana naseukah jinoë lam ôn nyoë.
 Ji Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak ôn-ôn la’én, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neu\'andam ôn nyoë]</span>.',
+'noarticletext-nopermission' => 'Hana asoe bak on nyoe jinoe.
+Droeneuh jeuet [[Special:Search/{{PAGENAME}}|neumita keu nan on nyoe]] bak on la\'en,
+atawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neumita log nyang na hubongan]</span>.',
 'updated' => '(Seubarô)',
 'note' => "'''Ceunatat:'''",
-'previewnote' => "'''Beu neuingat meunyo nyoë goh lom neukeubah!'''",
+'previewnote' => "'''Beu neuingat meunyo ôn nyoë goh lom neukeubah!'''",
 'editing' => 'Andam $1',
 'editingsection' => 'Andam $1 (bideuëng)',
 'copyrightwarning' => "Beu neuingat bahwa ban mandum nyang Droëneuh   tuléh keu {{SITENAME}} geukira geupeuteubiët di yup $2 (ngiëng $1 keu leubèh jeulah). Meunyoë Droëneuh h‘an neutém teunuléh Droëneuh  ji’andam ngön jiba ho ho la’én, bèk neupasoë teunuléh Droëneuh  keunoë.<br />Droëneuh  neumeujanji chit meunyoë teunuléh nyoë nakeuh atra neutuléh keudroë, atawa neucok nibak nè nè atra umôm atawa nè bibeuëh la’én.
@@ -516,11 +531,20 @@ Ji Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] ba
 'hiddencategories' => 'Ôn nyoë nakeuh anggèëta nibak {{PLURAL:$1|1 kawan teusom |$1 kawan teusom}}:',
 'nocreatetext' => '{{SITENAME}} ka jikot bak peugöt ôn barô. Ji Droëneuh   jeuët neuriwang teuma ngön neu’andam ôn nyang ka na, atawa [[Special:UserLogin|neutamong atawa neudapeuta]].',
 'permissionserrorstext-withaction' => 'Droëneuh hana hak tamöng keu $2, muroë {{PLURAL:$1|choë|choë}} nyoë:',
-'recreate-moveddeleted-warn' => "'''Ingat: Droëneuh  teungoh neupeugöt ulang saboh ôn nyang ka tom geusampôh. ''',
+'recreate-moveddeleted-warn' => "'''Ingat: Droëneuh neupeugöt ulang saboh ôn nyang ka tom geusampôh. ''',
 
 Neutimang-timang dilèë peuë ék patôt neupeulanjut atra nyang teungoh neu’andam.
 Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
-'moveddeleted-notice' => 'Ôn nyoë ka geusampôh. Meunyo peureulèë, nyoë pat nakeuh log seunampôh ôn nyoë.',
+'moveddeleted-notice' => 'Ôn nyoë ka geusampôh.
+Log seunampôh ngon log peuninah ôn nyoë geupeuseudiya di yup nyoe keu keuneubah.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Ingat:''' Seunipat seunaleuek nyang neunguy rayek that.
+Ladom seunaleuek hana geupeuroh",
+'post-expand-template-inclusion-category' => 'On ngon seunipat seunaleuek nyang leubeh bataih',
+'post-expand-template-argument-warning' => "'''Ingat:''' On nyoe na paleng h'an saboh alasan seunaleuek nyang na sunipat ekspansi nyang raya that.
+Alasan-alasan nyan hana geupeureumeuen.",
+'post-expand-template-argument-category' => 'On ngon alasan seunaleuek nyang hana geupeureumeuen',
 
 # History pages
 'viewpagelogs' => 'Eu log ôn nyoë',
@@ -537,6 +561,7 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 'page_last' => 'keuneulheuëh',
 'histlegend' => "Piléh duwa teuneugön radiô, lheuëh nyan teugön teuneugön ''peubandéng'' keu peubandéng seunalén. Teugön saboh tanggay keu eu seunalén ôn bak tanggay nyan.<br />(skr) = bida ngön seunalén jinoë, (akhé) = bida ngön seunalén sigohlomjih. '''b''' = andam bacut, '''b''' = andam bot, → = andam bideuëng, ← = reuningkah keudroë",
 'history-fieldset-title' => 'Jeulajah riwayat away',
+'history-show-deleted' => 'Nyang geusampoh mantong',
 'histfirst' => 'Paléng trép',
 'histlast' => 'Paléng barô',
 
@@ -546,17 +571,18 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 # Revision deletion
 'rev-delundel' => 'peuleumah/peusom',
 'revdel-restore' => 'Ubah leumah',
+'revdel-restore-deleted' => 'geunantoe nyang ka geusampoh',
+'revdel-restore-visible' => 'geunantoe nyang leumah',
 
 # Merge log
 'revertmerge' => 'Hana jadèh peugabông',
 
 # Diffs
 'history-title' => 'Riwayat geunantoë nibak "$1"',
-'difference' => '(Bida antara geunantoë)',
 'lineno' => 'Baréh $1:',
 'compareselectedversions' => 'Peubandéng curak teupiléh',
 'editundo' => 'peubateuë',
-'diff-multi' => '({{PLURAL:$1|Sa|$1}} geunantoë antara hana geupeuleumah.)',
+'diff-multi' => '({{PLURAL:$1|Saboh|$1}} geunantoë antara nyang geupeugot le {{PLURAL:$2|sidroe|$2}} ureueng nguy hana geupeuleumah)',
 
 # Search results
 'searchresults' => 'Hasé mita',
@@ -568,9 +594,25 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 'notextmatches' => 'Hana naseukah ôn nyang pah',
 'prevn' => '{{PLURAL:$1|$1}} sigohlomjih',
 'nextn' => '{{PLURAL:$1|$1}} lheuëh nyan',
+'prevn-title' => '$1 {{PLURAL:$1|hasé|hasé}} sigohlomjih',
+'nextn-title' => '$1 {{PLURAL:$1|hase|hase}} lheueh nyan',
+'shown-title' => 'Peuleumah $1 {{PLURAL:$1|hasé|hasé}} tiëp halaman',
 'viewprevnext' => 'Eu ($1 {{int:pipe-separator}} $2)($3)',
+'searchmenu-exists' => "'''Na on ngon nan \"[[:\$1]]\" bak wiki nyoe.'''",
+'searchmenu-new' => "'''Peugot on \"[[:\$1]]\" bak wiki nyoe!'''",
 'searchhelp-url' => 'Help:Asoë',
+'searchprofile-articles' => 'On asoe',
+'searchprofile-project' => 'On Beunantu ngon Buet',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Ban dum',
+'searchprofile-advanced' => 'Tingkat lanjut',
+'searchprofile-articles-tooltip' => 'Mita bak $1',
+'searchprofile-project-tooltip' => 'Mita bak $1',
+'searchprofile-images-tooltip' => 'Mita beureukaih',
+'searchprofile-everything-tooltip' => 'Mita ban dum ôn asoë (rôh ôn marit)',
+'searchprofile-advanced-tooltip' => 'Mita bak ruweueng nan meupat-pat',
 'search-result-size' => '$1 ({{PLURAL:$2|1 kata|$2 kata}})',
+'search-result-category-size' => '{{PLURAL:$1|1 anggeeta|$1 anggeeta}} ({{PLURAL:$2|1 aneuk kawan|$2 aneuk kawan}}, {{PLURAL:$3|1 beureukaih|$3 beureukaih}})',
 'search-redirect' => '(peuninah $1)',
 'search-section' => '(bagian $1)',
 'search-suggest' => 'Kadang meukeusud Droëneuh nakeuh: $1',
@@ -579,7 +621,11 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 'search-interwiki-more' => '(lom)',
 'search-mwsuggest-enabled' => 'ngon saran',
 'search-mwsuggest-disabled' => 'hana saran',
+'searchrelated' => 'meusambat',
+'searchall' => 'ban dum',
+'showingresultsheader' => "{{PLURAL:$5|Hase '''$1''' nibak '''$3'''|Hase '''$1 - $2''' nibak '''$3'''}} keu '''$4'''",
 'nonefound' => "'''Ceunatat''': Cit ladôm ruweuëng nyang seucara baku geupeutamöng lam meunita. Ci neupuphôn leunakèë Droëneuh ngön ''all:'' keu mita ban dum asoë (rôh cit ôn peugah haba, tèmplat, ngön nyang la’én (nnl)), atawa neunguy ruweuëng nan nyang neumeuh’eut sibagoë neu’away.",
+'search-nonefound' => 'Hana hase nyang paih lagee atra neulakee',
 'powersearch' => 'Mita lanjut',
 'powersearch-legend' => 'Mita lanjut',
 'powersearch-ns' => 'Mita bak ruweuëng nan:',
@@ -596,6 +642,9 @@ Nyoë pat nakeuh log seunampôh nibak ôn nyoë:",
 'yourrealname' => 'Nan aseuli:',
 'prefs-help-realname' => '* Nan aseuli hana meucéh neupasoë.
 Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë nyang tuléh.',
+'prefs-help-email' => 'Alamat surat-e hana meuceh na, tapi geupeureulee keu peugot ulang lageuem, meunyo droeneuh tuwoe lageuem.',
+'prefs-help-email-others' => "Droeneuh jeuet cit neupileh neupubiyeue ureueng la'en geupeu'et surat keu droeneuh rot surat-e rot seunambat bak on ureueng nguy atawa on marit.
+Surat-e droeneuh h'an geupeugah keu ureueng nyan.",
 
 # Groups
 'group-sysop' => 'Ureuëng urôh',
@@ -613,6 +662,10 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'recentchanges' => 'Neuubah barô',
 'recentchanges-legend' => 'Peuniléh neuubah paléng barô',
 'recentchanges-feed-description' => 'Peutumèë neu’ubah paléng barô lam wiki bak eumpeuën nyoë.',
+'recentchanges-label-newpage' => 'Neuandam nyoe jipeugot on baro',
+'recentchanges-label-minor' => 'Nyoe neuandam ubeut',
+'recentchanges-label-bot' => 'Neuandam nyoe geupubuet le bot',
+'recentchanges-label-unpatrolled' => 'Neuandam nyoe goh lom geukalon',
 'rcnote' => "Di yup nyoë nakeuh {{PLURAL:$1|nakeuh '''1''' neu’ubah paléng barô |nakeuh '''$1''' neu’ubah paléng barô}} lam {{PLURAL:$2|'''1''' uroë|'''$2''' uroë}} nyoë, trôk ‘an $5, $4.",
 'rcnotefrom' => 'Di yup nyoë nakeuh neu’ubah yôh <strong>$2</strong> (geupeuleumah trôh ‘an <strong>$1</strong> neu’ubah).',
 'rclistfrom' => 'Peuleumah neuubah paléng barô yôh $1 kön',
@@ -648,8 +701,12 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'upload' => 'Peutamong',
 'uploadbtn' => 'Peutamong beureukah',
 'uploadlogpage' => 'Log peutamöng',
+'filedesc' => 'Ehtisa',
 'uploadedimage' => 'peutamöng "[[$1]]"',
 
+'license' => 'Jeuneh lisensi:',
+'license-header' => 'Jeuneh lisensi',
+
 # Special:ListFiles
 'listfiles' => 'Dapeuta beureukah',
 
@@ -657,6 +714,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'file-anchor-link' => 'Beureukah',
 'filehist' => 'Riwayat beureukah',
 'filehist-help' => 'Teugon bak tanggay/watèë keu eu beureukah nyoë ‘oh watèë nyan.',
+'filehist-revert' => 'peuriwang',
 'filehist-current' => 'jinoë hat',
 'filehist-datetime' => 'Tanggay/Watèë',
 'filehist-thumb' => 'Beuntuk ubeut',
@@ -665,10 +723,12 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'filehist-dimensions' => 'Dimènsi',
 'filehist-filesize' => 'Rayek beureukah',
 'filehist-comment' => 'Tapeusé',
-'imagelinks' => 'Hubông beureukah',
+'imagelinks' => 'Meuneunguy beureukaih',
 'linkstoimage' => 'Ôn di yup nyoë na {{PLURAL:$1|hubông|$1 hubông}} u beureukah nyoë:',
 'nolinkstoimage' => 'Hana ôn nyang na hubông u beureukah nyoë.',
 'sharedupload' => 'Beureukah nyoë dari $1 ngön kadang geunguy lé buët-buët la’én.',
+'sharedupload-desc-here' => "Beureukaih nyoe nejih nibak $1 ngon kadang geunguy le proyek-proyek la'en.
+Teuneurang bak [$2 on teuneurangjih] geupeuleumah di yup nyoe.",
 'uploadnewversion-linktext' => 'Peulöt seunalén nyang leubèh barô nibak beureukah nyoë.',
 
 # MIME search
@@ -690,6 +750,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'statistics' => 'Keunira',
 
 'disambiguations' => 'Ôn disambiguasi',
+'disambiguationspage' => 'Template:disambig',
 
 'doubleredirects' => 'Peuninah ganda',
 
@@ -724,6 +785,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'deadendpages' => 'Ôn buntu',
 'protectedpages' => 'Ôn nyang geulindông',
 'listusers' => 'Dapeuta ureuëng nguy',
+'usercreated' => '{{GENDER:$3|Geupeugot}} bak $1 poh $2',
 'newpages' => 'Ôn barô',
 'ancientpages' => 'Teunuléh away',
 'move' => 'Peupinah',
@@ -759,6 +821,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 # Special:LinkSearch
 'linksearch' => 'Hubông luwa',
 'linksearch-ok' => 'Mita',
+'linksearch-line' => '$1 meusambat nibak $2',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ureuëng nguy barô',
@@ -772,6 +835,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 # Watchlist
 'watchlist' => 'Dapeuta keunalön lôn',
 'mywatchlist' => 'Keunalön',
+'watchlistfor2' => 'Keu $1 $2',
 'addedwatchtext' => "Ôn \"[[:\$1]]\" ka geupeutamah u [[Special:Watchlist|dapeuta keunalön]] Droëneuh. Neu’ubah-neu’ubah bak masa u keuë bak ôn nyan ngön bak ôn peugah habajih, euntreuk leumah nyoë pat. Ôn nyan euntreuk geupeuleumah ''teubay'' bak [[Special:RecentChanges|dapeuta neu’ubah paléng barô]] mangat leubèh mudah leumah.",
 'removedwatchtext' => 'Ôn "[[:$1]]" ka geusampôh nibak [[Special:Watchlist|dapeuta keunalön]] Droëneuh.',
 'watch' => 'Kalön',
@@ -790,6 +854,7 @@ Meunyo neupasoë, euntreuk nan Droëneuh nyan geupeuleumah mangat jitupeuë soë
 'historywarning' => 'Ingat: Ôn nyang hawa neusampôh na riwayat:',
 'confirmdeletetext' => 'Droëneuh neuk neusampôh ôn atawa beureukah nyoë keu sabé. Meunan cit ban mandum riwayatjih nibak basis data. Neupeupaseuti meunyo Droëneuh cit keubiët meung neusampôh, neutupeuë ban mandum akébatjih, ngön peuë nyang neupeulaku nyoë nakeuh meunurôt [[{{MediaWiki:Policy-url}}|kebijakan{{SITENAME}}]].',
 'actioncomplete' => 'Seuleusoë',
+'actionfailed' => 'Hana meuhase',
 'deletedtext' => '"$1" ka geusampôh. Eu $2 keu log paléng barô bak ôn nyang ka geusampôh.',
 'dellogpage' => 'Log seunampoh',
 'deletecomment' => 'Choë:',
@@ -827,6 +892,7 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 # Undelete
 'undeletebtn' => 'Peuriwang!',
 'undeletelink' => 'eu/peuriwang',
+'undeleteviewlink' => 'eu',
 'undelete-search-submit' => 'Mita',
 
 # Namespace form on various pages
@@ -846,9 +912,12 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'sp-contributions-newbies' => 'Keu ureuëng-ureuëng nyang ban nguy mantöng',
 'sp-contributions-newbies-sub' => 'Keu ureuëng nguy barô',
 'sp-contributions-blocklog' => 'Log peutheun',
-'sp-contributions-talk' => 'Peugah haba',
+'sp-contributions-uploads' => 'peunasoe',
+'sp-contributions-logs' => 'log',
+'sp-contributions-talk' => 'marit',
 'sp-contributions-search' => 'Mita soë nyang tuléh',
 'sp-contributions-username' => 'Alamat IP atawa nan ureuëng nguy:',
+'sp-contributions-toponly' => 'Peuleumah geunantoe nyang baro mantong',
 'sp-contributions-submit' => 'Mita',
 
 # What links here
@@ -859,19 +928,20 @@ Droëneuh jeuët neugantoë tingkat lindông keu ôn nyoë, tapi nyan hana peung
 'nolinkshere' => "Hana ôn nyang teuhubông u '''[[:$1]]'''.",
 'isredirect' => 'ôn peupinah',
 'istemplate' => 'deungön seunaleuëk',
-'isimage' => 'hubông beureukah',
+'isimage' => 'hubông beureukaih',
 'whatlinkshere-prev' => '$1 {{PLURAL:$1|sigohlomjih|sigohlomjih}}',
 'whatlinkshere-next' => '$1 {{PLURAL:$1|lheuëh nyan|lheuëh nyan}}',
 'whatlinkshere-links' => '← hubông',
 'whatlinkshere-hideredirs' => '$1 peuninah',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => '$1 hubông',
+'whatlinkshere-hideimages' => '$1 hubong gamba',
 'whatlinkshere-filters' => 'Saréng',
 
 # Block/unblock
 'blockip' => 'Theun ureuëng nguy',
 'ipboptions' => '2 jeum:2 hours,1 uroë:1 day,3 uroë:3 days,1 minggu:1 week,2 minggu:2 weeks,1 buleuën:1 month,3 buleuën:3 months,6 buleuën:6 months,1 thôn:1 year,sabé:infinite',
-'ipblocklist' => 'Dapeuta neutheun',
+'ipblocklist' => 'Ureuëng nguy teutheun',
 'ipblocklist-submit' => 'Mita',
 'blocklink' => 'theun',
 'unblocklink' => 'peugadöh theun',
@@ -913,6 +983,8 @@ Lam masalah nyoë, meunyo neuhawa, Droëneuh jeuët neupeupinah atawa neupeugab
 
 # Namespace 8 related
 'allmessages' => 'Peusan sistem',
+'allmessagesname' => 'Nan',
+'allmessagesdefault' => 'Naseukah pukok',
 
 # Thumbnails
 'thumbnail-more' => 'Peurayek',
@@ -943,6 +1015,7 @@ Droëneuh cit jeuët neu’eu nèjih.',
 'tooltip-search' => 'Mita lam {{SITENAME}} nyoë',
 'tooltip-search-go' => 'Mita saboh ôn ngon nan nyang peureuséh lagèë nyoë meunyo na',
 'tooltip-search-fulltext' => 'Mita ôn nyang na asoë lagèë nyoë',
+'tooltip-p-logo' => 'Saweuë Ôn Keuë',
 'tooltip-n-mainpage' => 'Jak u Ôn Keuë',
 'tooltip-n-mainpage-description' => 'Saweuë Ôn Keuë',
 'tooltip-n-portal' => 'Bhah buët, peuë nyang jeuët neupeulaku, pat tamita sipeuë hay',
@@ -977,6 +1050,7 @@ Hubông teutap keu revisi ôn nyoë',
 'tooltip-watch' => 'Peutamah ôn nyoë u dapeuta keunalön Droëneuh',
 'tooltip-rollback' => 'Peuriwang neu’andam-neu’andam bak ôn nyoë u nyang tuléh keuneulheuëh lam sigo teugön',
 'tooltip-undo' => 'Peuriwang geunantoë nyoë ngön peuhah plôk neu’andam ngön cara eu dilèë. Choë jeuët geupeutamah bak plôk reuningkah.',
+'tooltip-summary' => 'Pasoe ehtisa paneuk',
 
 # Browsing diffs
 'previousdiff' => '← Bida away',
@@ -1003,7 +1077,8 @@ Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, n
 'metadata-help' => 'Beureukah nyoë na beurita tambahan nyang mungkén geutamah lé kamèra digital atawa peuminday nyang geunguy keu peugöt atawa peudigitalisasi beureukah. Meunyo beureukah nyoë ka geu’ubah, tapeusili nyang na mungkén hana seucara peunoh meurefleksikan beurita nibak gamba nyang ka geu’ubah nyoë.',
 'metadata-expand' => 'Peuleumah tapeusili teunamah',
 'metadata-collapse' => 'Peusom tapeusili teunamah',
-'metadata-fields' => 'Èntri mètadata EXIF nyoë keuneuk geupeuleumah bak ôn beurita gamba meunyo tabel mètadata geupeusom. Èntri la’én seucara baku keuneuk geupeusom.
+'metadata-fields' => "Bideuëng mètadata gamba nyang na lam peusan nyoë keuneuk geupasoë bak tampilan halaman gamba 'oh watèë tabel mètadata geutôp.
+Data nyang la'én eunteuk teupeusom keudroë.
 * make
 * model
 * datetimeoriginal
@@ -1016,7 +1091,7 @@ Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, n
 * imagedescription
 * gpslatitude
 * gpslongitude
-* gpsaltitude',
+* gpsaltitude",
 
 # External editor support
 'edit-externally' => 'Andam beureukah nyoë ngön aplikasi luwa',
@@ -1032,6 +1107,9 @@ Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, n
 'watchlisttools-edit' => 'Peuleumah ngön andam dapeuta kaeunalön',
 'watchlisttools-raw' => 'Andam dapeuta keunalön meuntah',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Ingat:\'\'\' Gunci meuurot pukok "$2" jipeuhiro gunci meuurot pukok "$1" sigohlomjih.',
+
 # Special:Version
 'version' => 'Curak',
 
@@ -1041,4 +1119,16 @@ Hubông-hubông lheuëh nyan bak baréh nyang saban geukira sibagoë keucuali, n
 # Special:SpecialPages
 'specialpages' => 'Ôn kusuih',
 
+# External image whitelist
+'external_image_whitelist' => '#Neupubiyeue bareh nyoe lagee na<pre>
+#Neunguy fragmen-fragmen ekspresi regular (bak bagian antara // mantong) di yup nyoe
+#fragmen-fragmen nyoe eunteuk geupeupaih ngon URL nibak gamba-gamba luwa (nyang geupeuhubong lansong)
+#Fragmen nyang paih eunteuk geupeuleumah sibagoe gamba, seuhjih keu link mantong
+#Bareh nyang geupuphon ngon # eunteuk geupeujeuet keu bareh beunalah
+#Nyoe hana geupubida haraih rayek ngon ubeut
+#Neupeuduek ban dum beunagi ekspresi biasa di yup bareh nyoe. Neupubiyeue bareh nyoe lagee na</pre>',
+
+# Special:Tags
+'tag-filter' => 'Filter [[Special:Tags|tag]]:',
+
 );
index 9ba1447..f3413ab 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Abanima
  * @author Csisc
  */
 
@@ -376,7 +377,7 @@ $1',
 أو [{{fullurl:{{FULLPAGENAME}}|action=edit}} تعديل هذه الصفحة]</span>.',
 'noarticletext-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى,أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} بحث السجلات المتصلة]</span>.',
 'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
-لم تحفظ تغييراتك إلى الآن[[#editform|→ Continue editing]]",
+لم تحفظ تغييراتك إلى الآن",
 'editing' => 'تحرير $1',
 'editingsection' => 'تحرير $1 (قسم)',
 'templatesused' => '{{PLURAL:$1||القالب المستخدم|القالبان المستخدمان|القوالب المستخدمة}} في هذه الصفحة:',
@@ -431,11 +432,10 @@ $1',
 
 # Diffs
 'history-title' => 'تاريخ مراجعة "$1"',
-'difference' => '(الفرق بين المراجعتين)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'editundo' => 'تراجع',
-'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة|مراجعتان متوسطتان غير معروضتان|$1 مراجعات متوسطة غير معروضة|$1 مراجعة متوسطة غير معروضة}} أجراها {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 
 # Search results
 'searchresults' => 'el resultats',
@@ -482,7 +482,7 @@ $1',
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
 'recentchanges' => 'أحدث التغييرات',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
-'recentchangestext' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
+'recentchanges-summary' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-label-newpage' => 'أنشأ هذا التعديل صفحة جديدة',
 'recentchanges-label-minor' => 'هذا تعديل طفيف',
index a7fb244..a9930d0 100644 (file)
@@ -594,6 +594,8 @@ Probeer asseblief weer oor 'n paar minute.",
 'ns-specialprotected' => 'Spesiale bladsye kan nie geredigeer word nie.',
 'titleprotected' => "Hierdie titel is beskerm teen skepping deur [[User:$1|$1]].
 Die rede gegee is ''$2''.",
+'invalidtitle-knownnamespace' => 'Ongeldige titel met naamruimte "$2" en teks "$3"',
+'invalidtitle-unknownnamespace' => 'Ongeldige titel met onbekende naamruimtenummer $1 en teks "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Slegte konfigurasie: onbekende virusskandeerder: ''$1''",
@@ -682,6 +684,7 @@ Om misbruik te voorkom, word slegs een wagwoordwenk per {{PLURAL:$1|uur|$1 ure}}
 'invalidemailaddress' => "Die e-posadres is nie aanvaar nie, aangesien dit 'n ongeldige formaat blyk te hê.
 Voer asseblief 'n geldige e-posadres in, of laat die veld leeg.",
 'cannotchangeemail' => "Die e-posadres vir 'n gebruiker kan nie op hierdie wiki gewysig word nie.",
+'emaildisabled' => 'Hierdie webwerf kan nie e-poste stuur nie.',
 'accountcreated' => 'Rekening geskep',
 'accountcreatedtext' => 'Die rekening vir gebruiker $1 is geskep.',
 'createaccount-title' => 'Rekeningskepping vir {{SITENAME}}',
@@ -876,7 +879,8 @@ Die laaste inskrywing in die blokkeerlogboek word hieronder vertoon:',
 Onthou dat u eie .css- en .js-bladsye met 'n kleinletter begin, byvoorbeeld {{ns:user}}:Naam/vector.css in plaas van {{ns:user}}:Naam/Vector.css.",
 'updated' => '(Gewysig)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is en nog nie gestoor is nie!'''",
+'previewnote' => "'''Onthou dat hierdie slegs 'n voorskou is.'''
+U teks is nog nie gestoor nie!",
 'previewconflict' => 'Hierdie voorskou vertoon die teks in die boonste teksarea soos dit sou lyk indien u die bladsy stoor.',
 'session_fail_preview' => "'''Jammer! Weens verlies aan sessie-inligting is die wysiging nie verwerk nie.
 Probeer asseblief weer. As dit steeds nie werk nie, probeer om [[Special:UserLogout|af te teken]] en dan weer aan te teken.'''",
@@ -890,6 +894,7 @@ Die bewerking is geweier om verminking van die bladsy se teks te voorkom.
 Dit gebeur soms as 'n webgebaseerde instaandiens (proxy) gebruik word wat foute bevat.",
 'edit_form_incomplete' => "'''Dele van die vorm het nie die bediener bereik nie. Kyk of alles reg lyk en probeer weer.'''",
 'editing' => 'Besig om $1 te wysig',
+'creating' => 'Besig om $1 te skep',
 'editingsection' => 'Besig om $1 (onderafdeling) te wysig',
 'editingcomment' => 'Besig om $1 te wysig (nuwe opskrif)',
 'editconflict' => 'Wysigingskonflik: $1',
@@ -953,6 +958,7 @@ Dit lyk of dit verwyder is.',
 'edit-no-change' => 'U wysiging was geignoreer omdat die teks nie verander is nie.',
 'edit-already-exists' => 'Die bladsy is nie geskep nie.
 Dit bestaan alreeds.',
+'defaultmessagetext' => 'Verstekteks',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waarskuwing: Die bladsy gebruik te veel duur ontlederfunksies.
@@ -1146,8 +1152,9 @@ Let op dat die gebruik van navigasieskakels hierdie kolom se waardes sal herstel
 'mergelogpagetext' => "Hieronder is 'n lys van die mees onlangse versmeltings van een bladsy se geskiedenis na 'n ander.",
 
 # Diffs
-'history-title' => 'Weergawegeskiedenis van "$1"',
-'difference' => '(Verskil tussen weergawes)',
+'history-title' => '$1: weergawegeskiedenis',
+'difference-title' => '$1: verskil tussen weergawes',
+'difference-title-multipage' => '$1 en $2: verskil tussen bladsye',
 'difference-multipage' => '(Verskil tussen bladsye)',
 'lineno' => 'Lyn $1:',
 'compareselectedversions' => 'Vergelyk gekose weergawes',
@@ -1244,6 +1251,7 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 'prefs-beta' => 'Beta-funksies',
 'prefs-datetime' => 'Datum en tyd',
 'prefs-labs' => 'Labs-funksies',
+'prefs-user-pages' => 'Gebruikersbladsye',
 'prefs-personal' => 'Gebruikersdata',
 'prefs-rc' => 'Onlangse wysigings',
 'prefs-watchlist' => 'Dophoulys',
@@ -1507,7 +1515,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'nchanges' => '$1 {{PLURAL:$1|wysiging|wysigings}}',
 'recentchanges' => 'Onlangse wysigings',
 'recentchanges-legend' => 'Opsies vir onlangse wysigings',
-'recentchangestext' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
+'recentchanges-summary' => 'Volg die mees onlangse wysigings aan die wiki op die bladsy.',
 'recentchanges-feed-description' => 'Spoor die mees onlangse wysigings op die wiki na in die voer.',
 'recentchanges-label-newpage' => "Met die wysiging is 'n nuwe bladsy geskep",
 'recentchanges-label-minor' => "Hierdie is 'n klein wysiging",
@@ -1537,6 +1545,7 @@ Die inligting is vir ander gebruikers sigbaar.',
 'newsectionsummary' => '/* $1 */ nuwe afdeling',
 'rc-enhanced-expand' => 'Wys details (benodig JavaScript)',
 'rc-enhanced-hide' => 'Steek details weg',
+'rc-old-title' => 'oorspronklik geskep as "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Verwante veranderings',
@@ -1713,7 +1722,7 @@ As daar steeds probleme is, kontak 'n [[Special:ListUsers/sysop|administrateur]]
 'backend-fail-writetemp' => 'Kon nie na tydelike lêer skryf nie.',
 'backend-fail-closetemp' => 'Kon nie tydelike lêer sluit nie.',
 'backend-fail-read' => 'Kon nie lêer $1 lees nie.',
-'backend-fail-create' => 'Kon nie lêer $1 skep nie.',
+'backend-fail-create' => 'Kon nie lêer $1 uitskryf nie.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => "'n Fout het voorgekom met die opening van die lêer vir ZIP toetsing.",
@@ -2033,6 +2042,12 @@ U kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief)
 'allpagesbadtitle' => "Die gespesifiseerde bladsynaam is ongeldig of het 'n intertaal- of interwiki-voorvoegsel.
 Dit is moontlik dat die naam karakters bevat wat nie in titels gebruik mag word nie.",
 'allpages-bad-ns' => '{{SITENAME}} het geen naamspasie "$1" nie.',
+'allpages-hide-redirects' => 'Versteek aansture',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "U kyk na 'n gekasde weergawe ban die bladsy, wat tot $1 oud kan wees.",
+'cachedspecial-viewing-cached-ts' => "U kyk na 'n gekasde weergawe ban die bladsy, wat moontlik nie volledig bygewerk is nie.",
+'cachedspecial-refresh-now' => 'Wys nuutste.',
 
 # Special:Categories
 'categories' => 'Kategorieë',
@@ -2785,7 +2800,7 @@ Die lêer is slegs gedeeltelik opgelaai.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript toetsing',
-'javascripttest-disabled' => 'Die funksie is gedeaktiveer.',
+'javascripttest-disabled' => 'Die funksie is nie op hierdie wiki geaktiveer nie.',
 'javascripttest-title' => 'Voer toetse uit vir $1',
 
 # Tooltip help for the actions
@@ -3588,6 +3603,9 @@ Saam met die program moes u \'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van van
 'version-software' => 'Geïnstalleerde sagteware',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Weergawe',
+'version-entrypoints' => "URL's vir ingange",
+'version-entrypoints-header-entrypoint' => 'Ingang',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Lêerpad',
@@ -3738,10 +3756,12 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 # API errors
 'api-error-badaccess-groups' => 'U word nie toegelaat om lêers te laai op hierdie wiki.',
 'api-error-badtoken' => 'Interne fout: slegte teken.',
+'api-error-copyuploaddisabled' => 'Oplaai via URL is gedeaktiveer op hierdie bediener.',
 'api-error-duplicate-archive-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}} wat al verwyder is.',
 'api-error-duplicate-popup-title' => 'Duplikaat {{PLURAL:$1|lêer|lêers}}',
 'api-error-empty-file' => 'Die lêer wat u probeer oplaai is leeg.',
 'api-error-emptypage' => 'Die skep van leë nuwe bladsye word nie toegelaat nie.',
+'api-error-fetchfileerror' => 'Interne fout: Iets het verkeerd gegaan met die haal van die lêer.',
 'api-error-file-too-large' => 'Die lêer wat u probeer oplaai is te groot.',
 'api-error-filename-tooshort' => 'Die lêernaam is te kort.',
 'api-error-filetype-banned' => 'Hierdie tipe lêer is verban en word nie toegelaat nie.',
@@ -3750,10 +3770,13 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'api-error-http' => "Interne fout: Kan nie 'n verbinding met die bediener maak nie.",
 'api-error-illegal-filename' => 'Die lêernaam word nie toegelaat nie.',
 'api-error-internal-error' => 'Interne fout: daar is iets verkeerd gegaan het met die verwerking van die oplaai van die lêer op die wiki.',
+'api-error-invalid-file-key' => 'Interne fout: die lêer is nie in tydelike berging gevind nie.',
 'api-error-missingparam' => 'Interne fout: ontbrekende parameters op aanvraag.',
 'api-error-missingresult' => 'Interne fout: Kon nie bepaal of die kopie daarin geslaag.',
 'api-error-mustbeloggedin' => 'U moet ingeteken wees om lêers te kan laai.',
+'api-error-mustbeposted' => "Interne fout: Die versoek vereis 'n HTTP POST-metode.",
 'api-error-noimageinfo' => 'Die oplaai daarin geslaag, maar die bediener het ons nie enige inligting oor die lêer.',
+'api-error-nomodule' => "Interne fout: daar is nie 'n uploadmodule ingestel nie.",
 'api-error-ok-but-empty' => 'Interne fout: geen reaksie van die bediener.',
 'api-error-overwrite' => "'N bestaande lêer vervang word nie toegelaat nie.",
 'api-error-stashfailed' => 'Interne fout: Server nie tydelike lêer te stoor.',
@@ -3766,4 +3789,15 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'api-error-uploaddisabled' => 'Oplaai is afgeskakel op hierdie wiki.',
 'api-error-verification-error' => 'Hierdie lêer kan beskadig of het die verkeerde uitbreiding.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekonde|sekondes}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuut|minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|uur|ure}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dae}}',
+'duration-weeks' => '$1 {{PLURAL:$1|week|weke}}',
+'duration-years' => '$1 {{PLURAL:$1|jaar|jare}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekade|dekades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|eeu|eeue}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 76f8a1c..44d6642 100644 (file)
@@ -885,7 +885,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 
 # Diffs
 'history-title' => 'Historiku i redaktimeve për "$1"',
-'difference' => '(Dallimet midis verzioneve)',
 'lineno' => 'Rreshti $1:',
 'compareselectedversions' => 'Krahasoni versionet e zgjedhme',
 'editundo' => 'ktheje',
@@ -1180,7 +1179,7 @@ Mundeni me zgjedhe që të tjerët me ju kontaktue përmjet faqe së diskutimit
 'nchanges' => '$1 {{PLURAL:$1|ndryshim|ndryshime}}',
 'recentchanges' => 'Ndryshimet e fundit',
 'recentchanges-legend' => 'Opcionet e ndryshimeve të reja',
-'recentchangestext' => 'Ndiqni ndryshime së fundmi tek kjo faqe.',
+'recentchanges-summary' => 'Ndiqni ndryshime së fundmi tek kjo faqe.',
 'recentchanges-feed-description' => 'Përcjelli ndryshimet mâ të reja të këtij wiki në këtë feed.',
 'recentchanges-label-newpage' => 'Ky redaktim krijoi një faqe të re',
 'rcnote' => "Mâ poshtë {{PLURAL:$1|âsht '''1''' ndryshim|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|ditën|'''$2''' ditët}} e fundit, prej $5, $4.",
index 5e1147b..2aa5d28 100644 (file)
@@ -75,7 +75,7 @@ $messages = array(
 'tog-enotifminoredits' => 'ለአነስተኛ የገጽ እርማቶችም ኤመልዕክት ይላክልኝ',
 'tog-enotifrevealaddr' => 'ኤመልዕክት አድራሻዬን በማሳወቂያ መልዕክቶች ውስጥ አሳይ',
 'tog-shownumberswatching' => 'የሚከታተሉ ተጠቃሚዎችን ቁጥር አሳይ',
-'tog-oldsig' => ' የቀድሞው ፊርማ ቅደመ እይታ',
+'tog-oldsig' => 'የቀድሞው ፊርማ ቅደመ እይታ',
 'tog-fancysig' => 'ጥሬ ፊርማ (ያለራስገዝ ማያያዣ)',
 'tog-externaleditor' => 'በቀዳሚነት ውጪያዊ አራሚን ተጠቀም',
 'tog-externaldiff' => 'በቀዳሚነት የውጭ ልዩነት-ማሳያን ተጠቀም',
@@ -696,7 +696,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 
 # Diffs
 'history-title' => 'የ«$1» እትሞች ታሪክ',
-'difference' => '(በ2ቱ እትሞቹ ዘንድ ያለው ልዩነት)',
 'lineno' => 'መስመር፡ $1፦',
 'compareselectedversions' => 'የተመረጡትን እትሞች ለማነፃፀር',
 'editundo' => 'ለውጡ ይገለበጥ',
@@ -945,7 +944,7 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'nchanges' => '$1 {{PLURAL:$1|ለውጥ|ለውጦች}}',
 'recentchanges' => 'በቅርብ ጊዜ የተለወጡ',
 'recentchanges-legend' => 'የቅርብ ለውጥ አማራጮች፦',
-'recentchangestext' => 'በዚሁ ገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለውጦች ለመከታተል ይችላሉ።',
+'recentchanges-summary' => 'በዚሁ ገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለውጦች ለመከታተል ይችላሉ።',
 'recentchanges-feed-description' => 'በዚህ ዊኪ ላይ በቅርብ ግዜ የተለወጠውን በዚሁ feed መከታተል ይችላሉ',
 'rcnote' => "ከ$5 $4 እ.ኤ.አ. {{PLURAL:$2|ባለፈው 1 ቀን|ባለፉት '''$2''' ቀኖች}} {{PLURAL:$1|የተደረገው '''1''' ለውጥ እታች ይገኛል|የተደረጉት '''$1''' መጨረሻ ለውጦች እታች ይገኛሉ}}።",
 'rcnotefrom' => "ከ'''$2''' ጀምሮ የተቀየሩት ገጾች (እስከ '''$1''' ድረስ) ክዚህ በታች ይታያሉ።",
index 7c674a1..b359042 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Aragonese (Aragonés)
+/** Aragonese (aragonés)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -43,6 +43,9 @@ $namespaceAliases = array(
        'Espezial' => NS_SPECIAL,
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $magicWords = array(
        'redirect'                => array( '0', '#ENDRECERA', '#REENDRECERA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
        'namespace'               => array( '1', 'ESPACIODENOMBRES', 'ESPACIODENOMBRE', 'NAMESPACE' ),
@@ -1034,7 +1037,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 
 # Diffs
 'history-title' => 'Historial de versions de "$1"',
-'difference' => '(Esferencias entre versions)',
 'difference-multipage' => '(Diferencia entre pachinas)',
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Confrontar as versions trigatas',
@@ -1392,7 +1394,7 @@ Habría de tener menos de $1 {{PLURAL:$1|carácter|carácters}}.',
 'nchanges' => '$1 {{PLURAL:$1|cambeo|cambeos}}',
 'recentchanges' => 'Zaguers cambeos',
 'recentchanges-legend' => 'Opcions sobre a pachina de zaguers cambeos',
-'recentchangestext' => "Siga os cambeos más recients d'a wiki en ista pachina.",
+'recentchanges-summary' => "Siga os cambeos más recients d'a wiki en ista pachina.",
 'recentchanges-feed-description' => "Seguir os cambios más recients d'o wiki en ista fuent de noticias.",
 'recentchanges-label-newpage' => 'Ista edición ha creyau una nueva pachina',
 'recentchanges-label-minor' => 'Ista ye una edición menor',
index 5024511..dab4c9b 100644 (file)
@@ -538,7 +538,6 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 
 # Diffs
 'history-title' => 'Ednīƿunge stǣr for "$1"',
-'difference' => '(Scēadung betwēonan hweorfungum)',
 'lineno' => 'Līne $1:',
 'compareselectedversions' => 'Corena fadunga metan',
 'editundo' => 'undōn',
index 98daa7f..0a34a77 100644 (file)
@@ -15,303 +15,302 @@ $fallback = 'hi';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => ' कड़ी अधोरेखित करना:',
-'tog-justify'                 => 'परिच्छेद समान करॊ',
-'tog-hideminor'               => 'हाल के बदलाव सॆं छोटॊ बदलाव छुपाबॊ',
-'tog-hidepatrolled'           => 'निगरानी मॆं करलॊ गेलॊ संपादनॊ कॆ हाल के बदलावॊ मॆं नै देखाबॊ',
-'tog-newpageshidepatrolled'   => 'निगरानी वाला पन्ना कॆ नया पन्ने वाला सूची मॆं नै देखाबॊ',
-'tog-extendwatchlist'         => 'ध्यान सूची मॆं सब्भे बदलाव दर्शाबॊ, सिर्फ हाले के नै',
-'tog-usenewrc'                => 'हाल मॆं होलॊ वर्धित बदलाव (जावास्क्रीप्ट के जरूरत छै)',
-'tog-numberheadings'          => 'शीर्षक स्वयं-क्रमांकित करॊ',
-'tog-showtoolbar'             => 'एडिट टूलबार दर्शाबॊ (जावास्क्रीप्ट)',
-'tog-editondblclick'          => 'दू-बार क्लीक करी कॆ पन्ना संपादित करॊ (जावास्क्रीप्ट)',
-'tog-editsection'             => '[संपादित करॊ] कड़ी द्वारा विभाग संपादन करै के अनुमती दहॊ',
+'tog-underline' => ' कड़ी अधोरेखित करना:',
+'tog-justify' => 'परिच्छेद समान करॊ',
+'tog-hideminor' => 'हाल के बदलाव सॆं छोटॊ बदलाव छुपाबॊ',
+'tog-hidepatrolled' => 'निगरानी मॆं करलॊ गेलॊ संपादनॊ कॆ हाल के बदलावॊ मॆं नै देखाबॊ',
+'tog-newpageshidepatrolled' => 'निगरानी वाला पन्ना कॆ नया पन्ने वाला सूची मॆं नै देखाबॊ',
+'tog-extendwatchlist' => 'ध्यान सूची मॆं सब्भे बदलाव दर्शाबॊ, सिर्फ हाले के नै',
+'tog-usenewrc' => 'हाल मॆं होलॊ वर्धित बदलाव (जावास्क्रीप्ट के जरूरत छै)',
+'tog-numberheadings' => 'शीर्षक स्वयं-क्रमांकित करॊ',
+'tog-showtoolbar' => 'एडिट टूलबार दर्शाबॊ (जावास्क्रीप्ट)',
+'tog-editondblclick' => 'दू-बार क्लीक करी कॆ पन्ना संपादित करॊ (जावास्क्रीप्ट)',
+'tog-editsection' => '[संपादित करॊ] कड़ी द्वारा विभाग संपादन करै के अनुमती दहॊ',
 'tog-editsectiononrightclick' => 'विभाग शीर्षक पर दायाँ क्लीक करीकॆ संपादन करै के अनुमती दॆ (जावास्क्रीप्ट)',
-'tog-showtoc'                 => 'अनुक्रम दर्शाबॊ (जोन पन्ना पर तीन सॆं ज्यादा विभाग छै)',
-'tog-rememberpassword'        => 'इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)',
-'tog-watchcreations'          => 'हमरॊ तैयार करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
-'tog-watchdefault'            => 'हमरॊ संपादित करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
-'tog-watchmoves'              => 'हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
-'tog-watchdeletion'           => 'हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
-'tog-previewontop'            => 'एडिट बॉक्स के उपर झलक दिखाबॊ',
-'tog-previewonfirst'          => 'पहलॊ सम्पादन पर पूर्वावलोकन देखॊ',
-'tog-nocache'                 => 'ब्राउजर पन्ना केचिंग अक्षम करॊ',
-'tog-enotifwatchlistpages'    => 'हमरॊ ध्यानसूची मॆं दर्ज़ पन्ना बदलला के बाद हमरा इ-मेल करॊ',
-'tog-enotifusertalkpages'     => 'हमरॊ सदस्य वार्ता पृष्ठ पर बदलाव होला सॆं हमरा इ-मेल करॊ',
-'tog-enotifminoredits'        => 'तनी-मनी बदलावॊ लेली भी हमरा इ-मेल भेजॊ',
+'tog-showtoc' => 'अनुक्रम दर्शाबॊ (जोन पन्ना पर तीन सॆं ज्यादा विभाग छै)',
+'tog-rememberpassword' => 'इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)',
+'tog-watchcreations' => 'हमरॊ तैयार करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
+'tog-watchdefault' => 'हमरॊ संपादित करलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
+'tog-watchmoves' => 'हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
+'tog-watchdeletion' => 'हमरॊ हटैलॊ पन्ना हमरॊ ध्यानसूचीमॆं रखियै',
+'tog-previewontop' => 'एडिट बॉक्स के उपर झलक दिखाबॊ',
+'tog-previewonfirst' => 'पहलॊ सम्पादन पर पूर्वावलोकन देखॊ',
+'tog-nocache' => 'ब्राउजर पन्ना केचिंग अक्षम करॊ',
+'tog-enotifwatchlistpages' => 'हमरॊ ध्यानसूची मॆं दर्ज़ पन्ना बदलला के बाद हमरा इ-मेल करॊ',
+'tog-enotifusertalkpages' => 'हमरॊ सदस्य वार्ता पृष्ठ पर बदलाव होला सॆं हमरा इ-मेल करॊ',
+'tog-enotifminoredits' => 'तनी-मनी बदलावॊ लेली भी हमरा इ-मेल भेजॊ',
 
 'underline-never' => 'कहियो नै',
 
 # Dates
-'sunday'        => 'रविवार',
-'monday'        => 'सोमवार',
-'tuesday'       => 'मंगलवार',
-'wednesday'     => 'बुधवार',
-'thursday'      => 'गुरुवार',
-'friday'        => 'शुक्रवार',
-'saturday'      => 'शनिचर',
-'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' => 'शनिचर',
+'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|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}',
+'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणी}}',
+'category_header' => '"$1" श्रेणी में लेख',
+'subcategories' => 'उपविभाग',
+'hidden-categories' => '{{PLURAL:$1|छुपैलॊ श्रेणी|छुपैलॊ श्रेणी सीनी}}',
+'category-subcat-count' => '{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित उपश्रेणी छै|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|उपश्रेणी|$1 उपश्रेणी सीनी}} छै, कुल उपश्रेणी सीनी $2}}',
 'category-article-count' => '{{PLURAL:$2|इ श्रेणी मॆं सिर्फ निम्नलिखित लेख छै.|इ श्रेणी मॆं निम्नलिखित {{PLURAL:$1|लेख छै |$1 लेख सीनी छै.}}, कुल लेख $2 }}',
 'listingcontinuesabbrev' => 'आगे.',
 
-'newwindow'  => '(नया विंडो मॆं खुलै छै)',
-'cancel'     => 'निरस्त',
-'mytalk'     => 'हमरॊ बात',
+'newwindow' => '(नया विंडो मॆं खुलै छै)',
+'cancel' => 'निरस्त',
+'mytalk' => 'हमरॊ बात',
 'navigation' => 'भ्रमण',
 
 # Cologne Blue skin
 'qbfind' => 'खोजॊ',
 
-'errorpagetitle'   => 'त्रुटि',
-'returnto'         => 'लौटॊ $1.',
-'tagline'          => '{{SITENAME}} केरॊ बारे मॆं',
-'help'             => 'सहायता',
-'search'           => 'खोजॊ',
-'searchbutton'     => 'खोज',
-'searcharticle'    => 'जा',
-'history'          => 'पन्ना के इतिहास',
-'history_short'    => 'इतिहास',
+'errorpagetitle' => 'त्रुटि',
+'returnto' => 'लौटॊ $1.',
+'tagline' => '{{SITENAME}} केरॊ बारे मॆं',
+'help' => 'सहायता',
+'search' => 'खोजॊ',
+'searchbutton' => 'खोज',
+'searcharticle' => 'जा',
+'history' => 'पन्ना के इतिहास',
+'history_short' => 'इतिहास',
 'printableversion' => 'छापै योग्य उद्धरण',
-'permalink'        => 'स्थायी कड़ी',
-'edit'             => 'संपादन',
-'create'           => 'सृजन करॊ',
-'editthispage'     => 'ई पन्ना के सम्पादन करॊ',
-'delete'           => 'हटाबॊ',
-'protect'          => 'सुरक्षित करॊ',
-'protect_change'   => 'बदलॊ',
-'newpage'          => 'नया पन्ना',
-'talkpage'         => 'इ पन्ना पर चर्चा करॊ',
+'permalink' => 'स्थायी कड़ी',
+'edit' => 'संपादन',
+'create' => 'सृजन करॊ',
+'editthispage' => 'ई पन्ना के सम्पादन करॊ',
+'delete' => 'हटाबॊ',
+'protect' => 'सुरक्षित करॊ',
+'protect_change' => 'बदलॊ',
+'newpage' => 'नया पन्ना',
+'talkpage' => 'इ पन्ना पर चर्चा करॊ',
 'talkpagelinktext' => 'वार्ता',
-'personaltools'    => 'वैयक्तिक औज़ार',
-'talk'             => 'चर्चा',
-'views'            => 'दर्शाव',
-'toolbox'          => 'साधनपेटी',
-'otherlanguages'   => 'इतर भाषा',
-'redirectedfrom'   => '($1 सॆं भेजनॊ गेलॊ)',
-'redirectpagesub'  => 'पुन: निर्देशित पन्ना',
-'lastmodifiedat'   => '$1 के $2 पर इ पन्ना पर अन्तिम बार परिवर्तन भेलै.',
-'jumpto'           => 'हिन्नॆ जा:',
+'personaltools' => 'वैयक्तिक औज़ार',
+'talk' => 'चर्चा',
+'views' => 'दर्शाव',
+'toolbox' => 'साधनपेटी',
+'otherlanguages' => 'इतर भाषा',
+'redirectedfrom' => '($1 सॆं भेजनॊ गेलॊ)',
+'redirectpagesub' => 'पुन: निर्देशित पन्ना',
+'lastmodifiedat' => '$1 के $2 पर इ पन्ना पर अन्तिम बार परिवर्तन भेलै.',
+'jumpto' => 'हिन्नॆ जा:',
 'jumptonavigation' => 'भ्रमण करॊ',
-'jumptosearch'     => 'खोजै लॆ चलॊ',
+'jumptosearch' => 'खोजै लॆ चलॊ',
 
 # 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}}:सर्वाधिकार',
-'disclaimers'    => 'अस्वीकरण',
+'aboutsite' => '{{SITENAME}} केरॊ बारे मॆं',
+'aboutpage' => 'Project:परिचय',
+'copyright' => 'सामग्री $1 के तहत उपलब्ध छै.',
+'copyrightpage' => '{{ns:project}}:सर्वाधिकार',
+'disclaimers' => 'अस्वीकरण',
 'disclaimerpage' => 'Project:साधारण अस्वीकरण',
-'edithelp'       => 'संपादन मॆं सहायता',
-'edithelppage'   => 'Help:संपादन',
-'helppage'       => 'Help:सहायता',
-'mainpage'       => 'मुख्य पृष्ठ',
-'privacy'        => 'गोपनीयता नीति',
-'privacypage'    => 'Project:गोपनीयता नीति',
+'edithelp' => 'संपादन मॆं सहायता',
+'edithelppage' => 'Help:संपादन',
+'helppage' => 'Help:सहायता',
+'mainpage' => 'मुख्य पृष्ठ',
+'privacy' => 'गोपनीयता नीति',
+'privacypage' => 'Project:गोपनीयता नीति',
 
 'badaccess' => 'अनुमति त्रुटि',
 
-'retrievedfrom'       => '"$1" सॆं लेलॊ गेलॊ',
-'youhavenewmessages'  => 'तोरा लेली छै $1  ($2)',
-'newmessageslink'     => 'नया संदेश',
+'retrievedfrom' => '"$1" सॆं लेलॊ गेलॊ',
+'youhavenewmessages' => 'तोरा लेली छै $1  ($2)',
+'newmessageslink' => 'नया संदेश',
 'newmessagesdifflink' => 'पिछला बदलाव',
-'editsection'         => 'संपादन',
-'editold'             => 'संपादन',
-'editlink'            => 'संपादन',
-'viewsourcelink'      => 'स्रोत देखॊ.',
-'editsectionhint'     => 'विभाग संपादन: $1',
-'toc'                 => 'विषय सूची',
-'showtoc'             => 'देखाबॊ',
-'hidetoc'             => 'छुपाबॊ',
-'site-rss-feed'       => '$1 केरॊ आरएसएस फ़ीड',
-'site-atom-feed'      => '$1 केरॊ अणु फ़ीड',
-'page-rss-feed'       => '$1 केरॊ आरएसएस फ़ीड',
-'page-atom-feed'      => '"$1" अणु फ़ीड',
-'red-link-title'      => '$1 (पृष्ठ मौजूद नै छै)',
+'editsection' => 'संपादन',
+'editold' => 'संपादन',
+'editlink' => 'संपादन',
+'viewsourcelink' => 'स्रोत देखॊ.',
+'editsectionhint' => 'विभाग संपादन: $1',
+'toc' => 'विषय सूची',
+'showtoc' => 'देखाबॊ',
+'hidetoc' => 'छुपाबॊ',
+'site-rss-feed' => '$1 केरॊ आरएसएस फ़ीड',
+'site-atom-feed' => '$1 केरॊ अणु फ़ीड',
+'page-rss-feed' => '$1 केरॊ आरएसएस फ़ीड',
+'page-atom-feed' => '"$1" अणु फ़ीड',
+'red-link-title' => '$1 (पृष्ठ मौजूद नै छै)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'पन्ना',
-'nstab-user'     => 'सदस्य पन्ना',
-'nstab-special'  => 'खास पन्ना',
-'nstab-project'  => 'परियोजना पृष्ठ',
-'nstab-image'    => 'फाईल',
+'nstab-main' => 'पन्ना',
+'nstab-user' => 'सदस्य पन्ना',
+'nstab-special' => 'खास पन्ना',
+'nstab-project' => 'परियोजना पृष्ठ',
+'nstab-image' => 'फाईल',
 'nstab-template' => 'टेम्प्लेट',
 'nstab-category' => 'श्रेणी',
 
 # General errors
-'missing-article'    => 'आँकड़ाकोष मॆं $2 के अंदर कहीं भी "$1" नै मिललै.
+'missing-article' => 'आँकड़ाकोष मॆं $2 के अंदर कहीं भी "$1" नै मिललै.
 
 आमतौर पर मिटैलॊ जाय चुकलॊ पन्ना के इतिहास कड़ी के इस्तेमाल करला पर ऐसनॊ होय छै.
 
 अगर ऐसनॊ नै छै, तॆ शायद आपनॆ तंत्रांश केरॊ त्रुटि खोजी लेनॆ छियॊ.
 कृपया पता समेत [[Special:ListUsers/sysop|administrator]] कॆ ऐकरॊ ब्यौरा दहॊ.',
 'missingarticle-rev' => '(आवृत्ती#: $1)',
-'badtitletext'       => 'आपनॆ द्वारा आग्रहत लेख केरॊ शीर्षक अयोग्य, ख़ाली या गलती सॆं जुडलॊ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा मॆ एक या एक सॆं ज्यादा ऐनहॊ कॅरेक्टर छै जे शीर्षक मॆं इस्तेमाल नै करलॊ जाबॆ सकॆ छै.',
-'viewsource'         => 'स्रोत देखॊ',
+'badtitletext' => 'आपनॆ द्वारा आग्रहत लेख केरॊ शीर्षक अयोग्य, ख़ाली या गलती सॆं जुडलॊ आंतर-भाषिय या आंतर-विकि शीर्षक छेकै . एकरा मॆ एक या एक सॆं ज्यादा ऐनहॊ कॅरेक्टर छै जे शीर्षक मॆं इस्तेमाल नै करलॊ जाबॆ सकॆ छै.',
+'viewsource' => 'स्रोत देखॊ',
 
 # Login and logout pages
-'yourname'                => 'सदस्यनाम:',
-'yourpassword'            => 'कूटशब्द :',
-'remembermypassword'      => 'इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)',
-'login'                   => 'लॉग इन',
+'yourname' => 'सदस्यनाम:',
+'yourpassword' => 'कूटशब्द :',
+'remembermypassword' => 'इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)',
+'login' => 'लॉग इन',
 'nav-login-createaccount' => 'सत्रारंभ / खाता खोलॊ',
-'userlogin'               => 'लॉग इन / खाता बनाबॊ',
-'logout'                  => ' सत्रांत (लॉग आउट)',
-'userlogout'              => 'सत्रांत (लॉग आउट)',
-'nologinlink'             => 'एगो खाता बनाबॊ',
-'mailmypassword'          => 'इमेल द्वारा नया कूटशब्द भेजॊ',
+'userlogin' => 'लॉग इन / खाता बनाबॊ',
+'logout' => ' सत्रांत (लॉग आउट)',
+'userlogout' => 'सत्रांत (लॉग आउट)',
+'nologinlink' => 'एगो खाता बनाबॊ',
+'mailmypassword' => 'इमेल द्वारा नया कूटशब्द भेजॊ',
 
 # Edit page toolbar
-'bold_sample'     => 'मोटा पाठ',
-'bold_tip'        => 'मोटे अक्षर',
-'italic_sample'   => 'तिरछा अक्षर',
-'italic_tip'      => 'तिरछा अक्षर',
-'link_sample'     => 'कड़ी शीर्षक',
-'link_tip'        => 'आंतरिक कड़ी',
-'extlink_sample'  => 'http://www.example.com कड़ी शीर्षक',
-'extlink_tip'     => 'बाहरी कड़ी (उपसर्ग http:// जरूर लगाबॊ)',
+'bold_sample' => 'मोटा पाठ',
+'bold_tip' => 'मोटे अक्षर',
+'italic_sample' => 'तिरछा अक्षर',
+'italic_tip' => 'तिरछा अक्षर',
+'link_sample' => 'कड़ी शीर्षक',
+'link_tip' => 'आंतरिक कड़ी',
+'extlink_sample' => 'http://www.example.com कड़ी शीर्षक',
+'extlink_tip' => 'बाहरी कड़ी (उपसर्ग http:// जरूर लगाबॊ)',
 'headline_sample' => 'शीर्षक',
-'headline_tip'    => 'द्वितीय-स्तर शीर्षक',
-'nowiki_sample'   => 'अप्रारूपित सामग्री यहाँ डालॊ',
-'nowiki_tip'      => 'विकि प्रारूपण नज़रंदाज़ करॊ',
-'image_tip'       => 'संलग्न संचिका',
-'media_tip'       => 'फाईल लिंक',
-'sig_tip'         => 'आपनॆ के हस्ताक्षर व समय',
-'hr_tip'          => 'हॉरिझॉंटल लाईन (कम इस्तेमाल करॊ)',
+'headline_tip' => 'द्वितीय-स्तर शीर्षक',
+'nowiki_sample' => 'अप्रारूपित सामग्री यहाँ डालॊ',
+'nowiki_tip' => 'विकि प्रारूपण नज़रंदाज़ करॊ',
+'image_tip' => 'संलग्न संचिका',
+'media_tip' => 'फाईल लिंक',
+'sig_tip' => 'आपनॆ के हस्ताक्षर व समय',
+'hr_tip' => 'हॉरिझॉंटल लाईन (कम इस्तेमाल करॊ)',
 
 # Edit pages
-'summary'                          => 'सारांश:',
-'subject'                          => 'विषय/शीर्षक',
-'minoredit'                        => 'इ एगॊ छोटा परिवर्तन छेकै',
-'watchthis'                        => 'इ पन्ना ध्यानसूची में डालॊ',
-'savearticle'                      => 'पन्ना सँजोवॊ',
-'preview'                          => 'पूर्वावलोकन',
-'showpreview'                      => 'पूर्वावलोकन देखाबॊ',
-'showdiff'                         => 'बदलाव देखाबॊ',
-'anoneditwarning'                  => "'''सावधान:''' आपनॆ लॉग-इन नै करनॆ छियै. इ पृष्ठ के संपादन इतिहास मॆं आपनॆ के आइ.पी. पता अंकित करलॊ जैतै.",
-'summary-preview'                  => 'सारांश पूर्वावलोकन:',
-'newarticle'                       => '(नया)',
-'newarticletext'                   => 'आपनॆ जे लेख चाहै छियै वू अखनी तलक लिखलॊ नै गेलॊ छै. इ लेख लिखै लेली नीचे टाइप करॊ. सहायता लेली [[{{MediaWiki:Helppage}}|ऐन्जां]] क्लीक करॊ.
+'summary' => 'सारांश:',
+'subject' => 'विषय/शीर्षक',
+'minoredit' => 'इ एगॊ छोटा परिवर्तन छेकै',
+'watchthis' => 'इ पन्ना ध्यानसूची में डालॊ',
+'savearticle' => 'पन्ना सँजोवॊ',
+'preview' => 'पूर्वावलोकन',
+'showpreview' => 'पूर्वावलोकन देखाबॊ',
+'showdiff' => 'बदलाव देखाबॊ',
+'anoneditwarning' => "'''सावधान:''' आपनॆ लॉग-इन नै करनॆ छियै. इ पृष्ठ के संपादन इतिहास मॆं आपनॆ के आइ.पी. पता अंकित करलॊ जैतै.",
+'summary-preview' => 'सारांश पूर्वावलोकन:',
+'newarticle' => '(नया)',
+'newarticletext' => 'आपनॆ जे लेख चाहै छियै वू अखनी तलक लिखलॊ नै गेलॊ छै. इ लेख लिखै लेली नीचे टाइप करॊ. सहायता लेली [[{{MediaWiki:Helppage}}|ऐन्जां]] क्लीक करॊ.
 
 जों आपनॆ यहां पर गलती सॆं आबी गेलॊ छियै तॆ आपनॊ ब्राउज़र कॆ बॅक (back) पर क्लीक करॊ.',
-'noarticletext'                    => '
+'noarticletext' => '
 Hindi (hi)फ़िलहाल इस पन्ने पर कोई सामग्री नहीं है।
 आपनॆ अन्य पन्ना मॆं [[Special:Search/{{PAGENAME}}|इ सामग्री के खोज]] करॆ सकॆ छियै,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} संबंधित चिट्ठा मॆं खोज करॆ सकै छियै],
 या [{{fullurl:{{FULLPAGENAME}}|action=edit}} इ पन्ना कॆ संपादित करॆ सकॆ छियै]</span>.',
-'previewnote'                      => "'''याद रखॊ, इ केवल एगॊ झलक छेकै आरू अभी तलक सुरक्षित  नै करलॊ गेलॊ छै!'''",
-'editing'                          => '$1 केरॊ सम्पादन चली रहलॊ छै.',
-'editingsection'                   => '$1 सम्पादन (अनुभाग)',
-'copyrightwarning'                 => "कृपया ध्यान दहॊ कि {{SITENAME}} कॆ करलॊ गेलॊ सब्भॆ योगदान $2 के शर्तों के तहत होतै (अधिक जानकारी लेली $1 देखॊ)।
+'previewnote' => "'''याद रखॊ, इ केवल एगॊ झलक छेकै आरू अभी तलक सुरक्षित  नै करलॊ गेलॊ छै!'''",
+'editing' => '$1 केरॊ सम्पादन चली रहलॊ छै.',
+'editingsection' => '$1 सम्पादन (अनुभाग)',
+'copyrightwarning' => "कृपया ध्यान दहॊ कि {{SITENAME}} कॆ करलॊ गेलॊ सब्भॆ योगदान $2 के शर्तों के तहत होतै (अधिक जानकारी लेली $1 देखॊ)।
 अगर आप योगदान कॆ लगातार बदलतॆं आरू पुनः वितरित होतॆं नै देखॆ सकॆ छियै तॆ यहाँ योगदान नै करॊ. <br />
 आपनॆ इ भी प्रमाणित करी रहलॊ छियै कि इ आपनॆ खुद लिखनॆ छियै या जनार्पीत या कोनो अन्य मुक्त स्रोत सॆं प्रतिलिपित करलॊ गेलॊ छै. '''सर्वाधिकारयुक्त लेखॊ कॆ, बिना अनुमति के, यहाँ नै डालॊ!'''",
-'templatesused'                    => ' {{PLURAL:$1|Template|Templates}} इ पृष्ठ पर प्रयुक्त साँचा:',
-'templatesusedpreview'             => '{{PLURAL:$1|Template|Templates}} इ झलक मॆ प्रयुक्त साँचा:',
-'template-protected'               => '(सुरक्षित)',
-'template-semiprotected'           => '(अर्ध-सुरक्षीत)',
-'hiddencategories'                 => 'इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलॊ श्रेणी मॆ|$1 छुपैलॊ श्रेणी मॆ}} छै:',
+'templatesused' => ' {{PLURAL:$1|Template|Templates}} इ पृष्ठ पर प्रयुक्त साँचा:',
+'templatesusedpreview' => '{{PLURAL:$1|Template|Templates}} इ झलक मॆ प्रयुक्त साँचा:',
+'template-protected' => '(सुरक्षित)',
+'template-semiprotected' => '(अर्ध-सुरक्षीत)',
+'hiddencategories' => 'इ लेख निम्नलिखित {{PLURAL:$1|1 छुपैलॊ श्रेणी मॆ|$1 छुपैलॊ श्रेणी मॆ}} छै:',
 'permissionserrorstext-withaction' => 'आपनॆकॆ $2 केरॊ अनुमति नै छै, निम्नलिखित {{PLURAL:$1|कारण लेली|कारणॊ लेली}}:',
 
 # History pages
-'viewpagelogs'           => 'इ पन्ना के लॉग देखॊ',
-'currentrev-asof'        => '$1 केरॊ समय के संस्करण',
-'revisionasof'           => '$1 केरॊ संस्करण',
-'previousrevision'       => 'पुरानॊ संशोधन',
-'nextrevision'           => 'नया संशोधन →',
-'currentrevisionlink'    => 'हाल के संशोधन',
-'cur'                    => 'चालू',
-'last'                   => 'पिछला',
-'histlegend'             => 'फर्क चयन: फर्क देखै लेली पुराना अवतरणॊ के आगे देलॊ गेलॊ रेडियो बॉक्सपर क्लीक करॊ तथा एन्टर करॊ अथवा नीचॆं देलॊ बटन पर क्लीक करॊ<br />
+'viewpagelogs' => 'इ पन्ना के लॉग देखॊ',
+'currentrev-asof' => '$1 केरॊ समय के संस्करण',
+'revisionasof' => '$1 केरॊ संस्करण',
+'previousrevision' => 'पुरानॊ संशोधन',
+'nextrevision' => 'नया संशोधन →',
+'currentrevisionlink' => 'हाल के संशोधन',
+'cur' => 'चालू',
+'last' => 'पिछला',
+'histlegend' => 'फर्क चयन: फर्क देखै लेली पुराना अवतरणॊ के आगे देलॊ गेलॊ रेडियो बॉक्सपर क्लीक करॊ तथा एन्टर करॊ अथवा नीचॆं देलॊ बटन पर क्लीक करॊ<br />
 लिजेंड: (चालू) = सद्य अवतरण के बीच मॆ फर्क,
 (आखिरी) = पिछला अवतरण के बीच मॆं फर्क, छो = छोटा बदलाव',
 'history-fieldset-title' => 'इतिहास के विचरण करॊ',
-'histfirst'              => 'बहुत पहिले के',
-'histlast'               => 'एकदम हाल के',
+'histfirst' => 'बहुत पहिले के',
+'histlast' => 'एकदम हाल के',
 
 # Revision deletion
-'rev-delundel'   => 'दिखाबॊ/छुपाबॊ',
+'rev-delundel' => 'दिखाबॊ/छुपाबॊ',
 'revdel-restore' => 'दृश्यता बदलॊ',
 
 # Merge log
 'revertmerge' => 'अलग करॊ',
 
 # Diffs
-'history-title'           => '"$1" के अवतरण इतिहास',
-'difference'              => '(संस्करणॊ मॆ अंतर)',
-'lineno'                  => 'पंक्ति $1:',
+'history-title' => '"$1" के अवतरण इतिहास',
+'lineno' => 'पंक्ति $1:',
 'compareselectedversions' => 'च़यन करलॊ अवतरणों मॆं फर्क देखियै',
-'editundo'                => 'पूर्ववत करॊ',
+'editundo' => 'पूर्ववत करॊ',
 
 # Search results
-'searchresults'             => 'खोज परिणाम',
-'searchresults-title'       => '"$1" लेली खोज परिणाम',
-'searchresulttext'          => '{{SITENAME}} मॆं खोज करै लेली सहायता खातिर [[{{MediaWiki:Helppage}}|{{int:help}}]] देखॊ.',
-'searchsubtitle'            => '\'\'\'[[:$1]]\'\'\' खातिर आपनॆ करलॊ गेलॊ खोज ([[Special:Prefixindex/$1| "$1" सॆं शुरु होय वाला सब पन्ना]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
-'searchsubtitleinvalid'     => "तोरॊ खोज '''$1''' के परिणाम",
-'notitlematches'            => 'पन्ना केरॊ शीर्षक मेल नै खाय छै.',
-'notextmatches'             => 'कोनो पन्ना मॆं इ सामग्री नै मिललै.',
-'prevn'                     => 'पिछला {{PLURAL:$1|$1}}',
-'nextn'                     => 'अगला {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'देख़ॊ ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
-'search-redirect'           => '($1 कॆ अनुप्रेषित)',
-'search-section'            => '(विभाग $1)',
-'search-suggest'            => 'की आपनॆ के मतलब $1 छै ?',
-'search-interwiki-caption'  => 'अन्य प्रकल्प',
-'search-interwiki-default'  => '$1 के रिज़ल्ट:',
-'search-interwiki-more'     => '(आरू)',
-'search-mwsuggest-enabled'  => 'सुझाव सहित',
+'searchresults' => 'खोज परिणाम',
+'searchresults-title' => '"$1" लेली खोज परिणाम',
+'searchresulttext' => '{{SITENAME}} मॆं खोज करै लेली सहायता खातिर [[{{MediaWiki:Helppage}}|{{int:help}}]] देखॊ.',
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\' खातिर आपनॆ करलॊ गेलॊ खोज ([[Special:Prefixindex/$1| "$1" सॆं शुरु होय वाला सब पन्ना]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
+'searchsubtitleinvalid' => "तोरॊ खोज '''$1''' के परिणाम",
+'notitlematches' => 'पन्ना केरॊ शीर्षक मेल नै खाय छै.',
+'notextmatches' => 'कोनो पन्ना मॆं इ सामग्री नै मिललै.',
+'prevn' => 'पिछला {{PLURAL:$1|$1}}',
+'nextn' => 'अगला {{PLURAL:$1|$1}}',
+'viewprevnext' => 'देख़ॊ ($1 {{int:pipe-separator}} $2) ($3)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
+'search-redirect' => '($1 कॆ अनुप्रेषित)',
+'search-section' => '(विभाग $1)',
+'search-suggest' => 'की आपनॆ के मतलब $1 छै ?',
+'search-interwiki-caption' => 'अन्य प्रकल्प',
+'search-interwiki-default' => '$1 के रिज़ल्ट:',
+'search-interwiki-more' => '(आरू)',
+'search-mwsuggest-enabled' => 'सुझाव सहित',
 'search-mwsuggest-disabled' => 'कोनो सुझाव नै',
-'nonefound'                 => "'''सूचना''': मूलतः कुछ ही नामस्थानॊ मॆं खोजलॊ जाय छै. अगर आपने कॆ सब नामस्थानॊ मॆं खोजना छै तॆ खोजशब्दॊ के पहले ''all:'' लगायकॆ खोजै के कोशिश करॊ या फिर कोनो नामस्थान के नाम लिखॊ.",
-'powersearch'               => 'उन्नत खोज',
-'powersearch-legend'        => 'उन्नत खोज',
-'powersearch-ns'            => 'नामस्थानॊ मॆ खोजॊ:',
-'powersearch-redir'         => 'अनुप्रेषितॊ के सूची दर्शाबॊ.',
-'powersearch-field'         => 'लेली खोजॊ',
+'nonefound' => "'''सूचना''': मूलतः कुछ ही नामस्थानॊ मॆं खोजलॊ जाय छै. अगर आपने कॆ सब नामस्थानॊ मॆं खोजना छै तॆ खोजशब्दॊ के पहले ''all:'' लगायकॆ खोजै के कोशिश करॊ या फिर कोनो नामस्थान के नाम लिखॊ.",
+'powersearch' => 'उन्नत खोज',
+'powersearch-legend' => 'उन्नत खोज',
+'powersearch-ns' => 'नामस्थानॊ मॆ खोजॊ:',
+'powersearch-redir' => 'अनुप्रेषितॊ के सूची दर्शाबॊ.',
+'powersearch-field' => 'लेली खोजॊ',
 
 # Preferences page
-'preferences'   => 'वरीयता',
+'preferences' => 'वरीयता',
 'mypreferences' => 'हमरॊ वरीयता',
 
 # Groups
@@ -326,84 +325,84 @@ Hindi (hi)फ़िलहाल इस पन्ने पर कोई सा
 'action-edit' => ' ई पन्ना के सम्पादन करॊ',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
-'recentchanges'                  => 'हाल मॆं होलॊ बदलाव',
-'recentchanges-legend'           => 'हाल केरॊ परिवर्तन संबंधी विकल्प',
+'nchanges' => '$1 {{PLURAL:$1|बदलाव|बदलाव}}',
+'recentchanges' => 'हाल मॆं होलॊ बदलाव',
+'recentchanges-legend' => 'हाल केरॊ परिवर्तन संबंधी विकल्प',
 'recentchanges-feed-description' => 'इ फ़ीड मॆ होय वाला विकि पर हाल मॆ होलॊ बदलाव देखियै.',
-'rcnote'                         => "$5, $4 के पहले के {{PLURAL:$2|'''१''' दिन|'''$2''' दिनों}} मॆं  {{PLURAL:$1|होलॊ '''१''' बदलाव इ प्रकार छै.| होलॊ '''$1''' बदलाव इ प्रकार छै}}",
-'rclistfrom'                     => '$1 सॆं नया बदलाव देखलाबॊ',
-'rcshowhideminor'                => 'छोटॊ बदलाव $1',
-'rcshowhidebots'                 => 'बोट सीनी $1',
-'rcshowhideliu'                  => 'लॉग्ड इन सदस्यॊ के बदलाव $1',
-'rcshowhideanons'                => 'अनामक सदस्यॊ के बदलाव $1',
-'rcshowhidemine'                 => 'हमरॊ बदलाव $1',
-'rclinks'                        => 'पिछला $2 दिना मॆं होलॊ $1 बदलाव देखियै.<br />$3',
-'diff'                           => 'अंतर',
-'hist'                           => 'इतिहास',
-'hide'                           => 'छुपाबॊ',
-'show'                           => 'देखाबॊ',
-'minoreditletter'                => ' छो.',
-'newpageletter'                  => 'न',
-'boteditletter'                  => 'बो',
-'rc-enhanced-expand'             => 'विस्तृत जानकारी देखाबॊ (ऐकरा लेली जावास्क्रिप्ट चाहियॊ)',
-'rc-enhanced-hide'               => 'विस्तृत जानकारी छिपाबॊ',
+'rcnote' => "$5, $4 के पहले के {{PLURAL:$2|'''१''' दिन|'''$2''' दिनों}} मॆं  {{PLURAL:$1|होलॊ '''१''' बदलाव इ प्रकार छै.| होलॊ '''$1''' बदलाव इ प्रकार छै}}",
+'rclistfrom' => '$1 सॆं नया बदलाव देखलाबॊ',
+'rcshowhideminor' => 'छोटॊ बदलाव $1',
+'rcshowhidebots' => 'बोट सीनी $1',
+'rcshowhideliu' => 'लॉग्ड इन सदस्यॊ के बदलाव $1',
+'rcshowhideanons' => 'अनामक सदस्यॊ के बदलाव $1',
+'rcshowhidemine' => 'हमरॊ बदलाव $1',
+'rclinks' => 'पिछला $2 दिना मॆं होलॊ $1 बदलाव देखियै.<br />$3',
+'diff' => 'अंतर',
+'hist' => 'इतिहास',
+'hide' => 'छुपाबॊ',
+'show' => 'देखाबॊ',
+'minoreditletter' => ' छो.',
+'newpageletter' => 'न',
+'boteditletter' => 'बो',
+'rc-enhanced-expand' => 'विस्तृत जानकारी देखाबॊ (ऐकरा लेली जावास्क्रिप्ट चाहियॊ)',
+'rc-enhanced-hide' => 'विस्तृत जानकारी छिपाबॊ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'इ पृष्ठ संबंधी बदलाव',
-'recentchangeslinked-title'   => '"$1" मॆं होलॊ बदलाव',
+'recentchangeslinked' => 'इ पृष्ठ संबंधी बदलाव',
+'recentchangeslinked-title' => '"$1" मॆं होलॊ बदलाव',
 'recentchangeslinked-summary' => "कोनो पन्ना के हवाले कत्तॆ भी पन्ना मौजूद हुऎ सकॆ छै, इ सूची उ पन्ना (या कोनो श्रेणी के सदस्यॊ) मॆं होलॊ हाल के बदलाव देखाबै छै.
 [[Special:Watchlist|आपनॆ के ध्यानसूची]] मॆं मौजूद पन्ना '''मोटा''' अक्षरॊ मॆं दिखतै.",
-'recentchangeslinked-page'    => 'पृष्ठ नाम:',
-'recentchangeslinked-to'      => 'ऐकरॊ बदला मॆं देलॊ पन्ना सीनी सॆं जुडलॊ पन्ना सीनी के बदलाव दिखलाबॊ',
+'recentchangeslinked-page' => 'पृष्ठ नाम:',
+'recentchangeslinked-to' => 'ऐकरॊ बदला मॆं देलॊ पन्ना सीनी सॆं जुडलॊ पन्ना सीनी के बदलाव दिखलाबॊ',
 
 # Upload
-'upload'        => 'फाईल अपलोड',
+'upload' => 'फाईल अपलोड',
 'uploadlogpage' => 'अपलोड सूची',
 'uploadedimage' => '"[[$1]]" कॆ अपलोड करलॊ गेलै',
 
 # File description page
-'filehist'                  => 'फाइल के इतिहास',
-'filehist-help'             => 'संचिका पुरानॊ समय में कैन्हॊ दिखै रहै इ जानै लेली वांछित दिनांक/समय पर चटका लगाबॊ.',
-'filehist-current'          => 'मौजूदा',
-'filehist-datetime'         => 'तारीख/समय',
-'filehist-thumb'            => 'थम्बनेल',
-'filehist-thumbtext'        => '$1 केरॊ समय के संस्करण के अँगूठाकार प्रारूप',
-'filehist-user'             => 'सदस्य',
-'filehist-dimensions'       => 'आयाम',
-'filehist-comment'          => 'टिप्पणी',
-'imagelinks'                => 'फाईल लिंक',
-'linkstoimage'              => 'निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मॆं इ संचिका के हवाले छै:',
-'sharedupload'              => 'ई फाईल $1 सॆ छै आरू संभवतः अन्य परियोजना भी एकरॊ इस्तेमाल करी रहलॊ होतै.',
+'filehist' => 'फाइल के इतिहास',
+'filehist-help' => 'संचिका पुरानॊ समय में कैन्हॊ दिखै रहै इ जानै लेली वांछित दिनांक/समय पर चटका लगाबॊ.',
+'filehist-current' => 'मौजूदा',
+'filehist-datetime' => 'तारीख/समय',
+'filehist-thumb' => 'थम्बनेल',
+'filehist-thumbtext' => '$1 केरॊ समय के संस्करण के अँगूठाकार प्रारूप',
+'filehist-user' => 'सदस्य',
+'filehist-dimensions' => 'आयाम',
+'filehist-comment' => 'टिप्पणी',
+'imagelinks' => 'फाईल लिंक',
+'linkstoimage' => 'निम्नोक्त {{PLURAL:$1|पन्ने|$1 पन्ना सीनी}} मॆं इ संचिका के हवाले छै:',
+'sharedupload' => 'ई फाईल $1 सॆ छै आरू संभवतः अन्य परियोजना भी एकरॊ इस्तेमाल करी रहलॊ होतै.',
 'uploadnewversion-linktext' => 'इ फाईल के नया संस्करण अपलॊड करॊ',
 
 # Statistics
 'statistics' => 'आँकड़ा',
 
 # Miscellaneous special pages
-'nbytes'        => '{{PLURAL:$1|बाइट|बाइट}}',
-'nmembers'      => '{{PLURAL:$1|एगॊ सदस्य|$1 सदस्य}}',
-'prefixindex'   => 'इ उपसर्ग वाल सब्भे पन्ना',
-'newpages'      => 'नया पन्ना',
-'move'          => 'स्थानांतरण',
-'movethispage'  => 'इ पन्ना स्थानांतरित करॊ',
+'nbytes' => '{{PLURAL:$1|बाइट|बाइट}}',
+'nmembers' => '{{PLURAL:$1|एगॊ सदस्य|$1 सदस्य}}',
+'prefixindex' => 'इ उपसर्ग वाल सब्भे पन्ना',
+'newpages' => 'नया पन्ना',
+'move' => 'स्थानांतरण',
+'movethispage' => 'इ पन्ना स्थानांतरित करॊ',
 'pager-newer-n' => '{{PLURAL:$1|नया 1|नया सीनी $1}}',
 'pager-older-n' => '{{PLURAL:$1|पुराना 1|पुरानॊ सीनी $1}}',
 
 # Book sources
-'booksources'               => 'पुस्तक स्रोत',
+'booksources' => 'पुस्तक स्रोत',
 'booksources-search-legend' => 'पुस्तक स्रोत खोजॊ',
-'booksources-go'            => 'जा',
+'booksources-go' => 'जा',
 
 # Special:Log
 'log' => 'लॉग सूची',
 
 # Special:AllPages
-'allpages'       => 'सब्भे पन्ना',
+'allpages' => 'सब्भे पन्ना',
 'alphaindexline' => '$1 सॆ $2 तलक',
-'prevpage'       => 'पिछला पन्ना ($1)',
-'allpagesfrom'   => 'देलॊ गेलॊ अक्षर सॆं आरंभ होयवाला लेख दर्शाबॊ:',
-'allpagesto'     => 'ऐना समाप्त होय वाला पन्ना दिखाबॊ:',
-'allarticles'    => 'सब्भे पन्ना',
+'prevpage' => 'पिछला पन्ना ($1)',
+'allpagesfrom' => 'देलॊ गेलॊ अक्षर सॆं आरंभ होयवाला लेख दर्शाबॊ:',
+'allpagesto' => 'ऐना समाप्त होय वाला पन्ना दिखाबॊ:',
+'allarticles' => 'सब्भे पन्ना',
 'allpagessubmit' => 'चलॊ',
 
 # Special:LinkSearch
@@ -419,169 +418,169 @@ Hindi (hi)फ़िलहाल इस पन्ने पर कोई सा
 'emailuser' => 'इ सदस्य कॆ ई-मेल भेजॊ',
 
 # Watchlist
-'watchlist'         => 'हमरॊ ध्यानसूची',
-'mywatchlist'       => 'हमरॊ ध्यानसूची',
-'addedwatchtext'    => '"[[:$1]]" आपनॆके [[Special:Watchlist|ध्यानसूची]] मॆं "<nowiki>$1</nowiki>" केरॊ समावेश करी देलॊ गेलॊ छै.
+'watchlist' => 'हमरॊ ध्यानसूची',
+'mywatchlist' => 'हमरॊ ध्यानसूची',
+'addedwatchtext' => '"[[:$1]]" आपनॆके [[Special:Watchlist|ध्यानसूची]] मॆं "<nowiki>$1</nowiki>" केरॊ समावेश करी देलॊ गेलॊ छै.
 भविष्य मॆं इ पन्ना तथा इ पन्ने केरॊ वार्ता मॆं होय वाला बदलाव आपनॆकॆ ध्यानसूची मॆं दिखतै तथा [[Special:RecentChanges|हाल मॆं होलॊ बदलावॊ के सूची]] मॆं ई पन्ना बोल्ड दिखतै ताकि  आपनॆ आसानी सॆं एकरॊ ध्यान रखॆ सकियै.
 
 <p>अगर आपनॆकॆ इ पन्ना कॆ अपनॊ ध्यानसूची सॆं निकालना छै तॆ [[Special:RecentChanges|टटका परिवर्तन]] पर क्लिक करॊ.',
-'removedwatchtext'  => '"[[:$1]]" नामक पन्ना कॆ आपनॆ के [[Special:Watchlist|ध्यानसूची]] सॆं हटाय देलॊ गेलॊ छै.',
-'watch'             => 'ध्यान रखॊ',
-'watchthispage'     => 'ई पन्ना ध्यानसूची में डालॊ',
-'unwatch'           => 'ध्यान हटाबॊ',
+'removedwatchtext' => '"[[:$1]]" नामक पन्ना कॆ आपनॆ के [[Special:Watchlist|ध्यानसूची]] सॆं हटाय देलॊ गेलॊ छै.',
+'watch' => 'ध्यान रखॊ',
+'watchthispage' => 'ई पन्ना ध्यानसूची में डालॊ',
+'unwatch' => 'ध्यान हटाबॊ',
 'watchlist-details' => 'वार्ता पन्ना केरॊ अलावा {{PLURAL:$1|$1 पन्ना|$1 पन्ने}} आपने के ध्यानसूची मॆं छै.',
-'wlshowlast'        => 'पिछला $1 घंटा $2 दिन $3 देखॊ',
+'wlshowlast' => 'पिछला $1 घंटा $2 दिन $3 देखॊ',
 'watchlist-options' => 'ध्यानसूची विकल्प',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'ध्यान दय रहलॊ छै...',
+'watching' => 'ध्यान दय रहलॊ छै...',
 'unwatching' => 'ध्यान हटाय रहलॊ छियै...',
 
 # Delete
-'deletepage'             => 'पन्ना हटाबॊ',
-'confirmdeletetext'      => 'आपनॆ एगॊ लेख ओकरॊ सब्भॆ अवतरणॊ के साथ हटाय लॆ चाहै छहॊ.
+'deletepage' => 'पन्ना हटाबॊ',
+'confirmdeletetext' => 'आपनॆ एगॊ लेख ओकरॊ सब्भॆ अवतरणॊ के साथ हटाय लॆ चाहै छहॊ.
 आपनॆ सॆं अनुरोध छै कि आपनॆ जे करी रहलॊ छियै वू मीडिया विकि के [[{{MediaWiki:Policy-url}}|नीतिनुसार]] छै इ बात के पुष्टि करी लॆ तथा क्रिया करला सॆं पहले आपनॊ क्रिया के परिणाम जानी लॆ.',
-'actioncomplete'         => 'कार्य पूर्ण',
-'actionfailed'           => 'क्रिया विफल',
-'deletedtext'            => '"$1" कॆ हटैलॊ गेलॊ छै.
+'actioncomplete' => 'कार्य पूर्ण',
+'actionfailed' => 'क्रिया विफल',
+'deletedtext' => '"$1" कॆ हटैलॊ गेलॊ छै.
 हाल में हटैलॊ गेलॊ लेखॊ के सूची लेली $2 देखॊ.',
-'dellogpage'             => 'हटाबै के सूची',
-'dellogpagetext'         => 'नीचॆ हाल मॆं हटैलॊ गेलॊ पन्ना के सूची छै.',
-'deletionlog'            => 'हटाबै के सूची',
-'reverted'               => 'पुराने अवतरण कॆ पूर्ववत करलॊ गेलै',
-'deletecomment'          => 'कारण:',
-'deleteotherreason'      => 'दोसरॊ/अतिरिक्त कारण:',
-'deletereasonotherlist'  => 'दोसरॊ कारण',
-'deletereason-dropdown'  => '*हटाबै के सामान्य कारण
+'dellogpage' => 'हटाबै के सूची',
+'dellogpagetext' => 'नीचॆ हाल मॆं हटैलॊ गेलॊ पन्ना के सूची छै.',
+'deletionlog' => 'हटाबै के सूची',
+'reverted' => 'पुराने अवतरण कॆ पूर्ववत करलॊ गेलै',
+'deletecomment' => 'कारण:',
+'deleteotherreason' => 'दोसरॊ/अतिरिक्त कारण:',
+'deletereasonotherlist' => 'दोसरॊ कारण',
+'deletereason-dropdown' => '*हटाबै के सामान्य कारण
 ** लेखक के बिनती
 ** कॉपीराईट
 ** वॅन्डॅलिजम',
 'delete-edit-reasonlist' => 'हटाबै के कारण कॆ संपादित करॊ',
-'delete-toobig'          => 'इ पन्ना केरॊ संपादन इतिहास $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} होला के वजह सॆं बहुत बड़ा छै.
+'delete-toobig' => 'इ पन्ना केरॊ संपादन इतिहास $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} होला के वजह सॆं बहुत बड़ा छै.
 {{SITENAME}} के अनपेक्षित रूप सॆं बंद होला सॆं रोकै लेली ऐसनॊ पन्ना कॆ हटाबै के अनुमति नै छै.',
-'delete-warning-toobig'  => 'इस लेख केरॊ संपादन इतिहास काफ़ी लंबा चौड़ा छै, ऐकरॊ $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} छै.
+'delete-warning-toobig' => 'इस लेख केरॊ संपादन इतिहास काफ़ी लंबा चौड़ा छै, ऐकरॊ $1 सॆं अधिक {{PLURAL:$1|संस्करण|संस्करण}} छै.
 एकरा हटैला सॆं {{SITENAME}} के आँकड़ाकोष के गतिविधियॊ मॆं व्यवधान आबॆ सकॆ छै;
 कृपया सोची समझी कॆ आगू बढ़ॊ.',
 
 # Rollback
-'rollback'          => 'संपादन पीछू लॆ जाय',
-'rollback_short'    => 'पूर्ववत करॊ',
-'rollbacklink'      => 'वापस लॆ',
-'rollbackfailed'    => 'पूर्ववत स्थिति निष्फल',
-'cantrollback'      => 'पुराना अवतरण पूर्ववत नै करॆ सकॆ छियै;
+'rollback' => 'संपादन पीछू लॆ जाय',
+'rollback_short' => 'पूर्ववत करॊ',
+'rollbacklink' => 'वापस लॆ',
+'rollbackfailed' => 'पूर्ववत स्थिति निष्फल',
+'cantrollback' => 'पुराना अवतरण पूर्ववत नै करॆ सकॆ छियै;
 इ पन्ना के आखिरी योगदानकर्ता इ लेख के एकमात्र लेखक छेकै.',
-'alreadyrolled'     => '[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा करलॊ गेलॊ  [[:$1]] के पिछला संपादन कॆ वापस पुरानॊ स्थिति पर नै लानलॊ जाबॆ सकॆ छै;
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा करलॊ गेलॊ  [[:$1]] के पिछला संपादन कॆ वापस पुरानॊ स्थिति पर नै लानलॊ जाबॆ सकॆ छै;
 कोय आरू इ बीच या तॆ इ पन्ना कॆ फिर सॆं संपादित करी देनॆ छै या पहले ही पन्ना पुरानॊ स्थिति पर लानलॊ जाय चुकलॊ छै.
 
 इ पन्ना के ताज़ातरीन संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) नॆ करनॆ छै.',
-'editcomment'       => "संपादन टिप्पणी छेलै: \"''\$1''\".",
-'revertpage'        => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) केरॊ संपादनॊ कॆ हटायकॆ [[User:$1|$1]] के आखिरी अवतरण कॆ पूर्ववत करलॊ गेलै.',
+'editcomment' => "संपादन टिप्पणी छेलै: \"''\$1''\".",
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) केरॊ संपादनॊ कॆ हटायकॆ [[User:$1|$1]] के आखिरी अवतरण कॆ पूर्ववत करलॊ गेलै.',
 'revertpage-nouser' => '(प्रयोक्ता नाम हटैलॊ गेलॊ छै) द्वारा करलॊ संपादन कॆ वापस पुरानॊ स्थिति मॆं लाना कॆ ऐकरॊ पहले केरॊ [[User:$1|$1]] द्वारा बनैलॊ संस्करण कॆ फिर सॆं ताज़ा संस्करण बनाबॊ.',
-'rollback-success'  => '$1 केरॊ संपादन हटाबॊ;
+'rollback-success' => '$1 केरॊ संपादन हटाबॊ;
 $2 द्वारा संपादित आखिरी अवतरण कॆ पुनर्स्थापित करलॊ गेलै.',
 
 # Edit tokens
 'sessionfailure-title' => 'निष्फल सत्र',
-'sessionfailure'       => 'ऐसनॊ प्रतीत होय छै कि आपनॆ के लोगिन सत्र के साथ कोनो समस्या छै.
+'sessionfailure' => 'ऐसनॊ प्रतीत होय छै कि आपनॆ के लोगिन सत्र के साथ कोनो समस्या छै.
 सत्र अपहरण सॆं बचाबै लेली सावधानी के तौर पर आपनॆ के इ क्रियाकलाप रद्द करी देलॊ गेलॊ छै.
 कृपया "back" पर वार करॊ आरू पृष्ठ कॆ दुबारा सॆं लोड करॊ, तबॆ दुबारा कोशिश करॊ.',
 
 # Protect
-'protectlogpage'              => 'सुरक्षा सूची',
-'protectedarticle'            => '"[[$1]]" सुरक्षित करलका',
-'modifiedarticleprotection'   => '"[[$1]]" के बदललॊ सुरक्षा-स्तर',
-'protectcomment'              => 'कारण:',
-'protectexpiry'               => 'कालावधि समाप्ति:',
-'protect_expiry_invalid'      => 'समाप्ती समय गलत छै.',
-'protect_expiry_old'          => 'समाप्ती समय पहिनै बीती चुकलॊ छै.',
-'protect-text'                => "'''$1''' पन्ना के सुरक्षा-स्तर आपनॆ यहां देखॆ सकॆ छियै आरू ओकरा बदलॆ भी सकॆ छियै.",
-'protect-locked-access'       => "आपनॆ कॆ इ पन्ना के सुरक्षा-स्तर बदलै के अनुमति नै छै.
+'protectlogpage' => 'सुरक्षा सूची',
+'protectedarticle' => '"[[$1]]" सुरक्षित करलका',
+'modifiedarticleprotection' => '"[[$1]]" के बदललॊ सुरक्षा-स्तर',
+'protectcomment' => 'कारण:',
+'protectexpiry' => 'कालावधि समाप्ति:',
+'protect_expiry_invalid' => 'समाप्ती समय गलत छै.',
+'protect_expiry_old' => 'समाप्ती समय पहिनै बीती चुकलॊ छै.',
+'protect-text' => "'''$1''' पन्ना के सुरक्षा-स्तर आपनॆ यहां देखॆ सकॆ छियै आरू ओकरा बदलॆ भी सकॆ छियै.",
+'protect-locked-access' => "आपनॆ कॆ इ पन्ना के सुरक्षा-स्तर बदलै के अनुमति नै छै.
 '''$1''' केरॊ अखनकॊ सुरक्षा-स्तर:",
-'protect-cascadeon'           => 'ई पन्ना अभी सुरक्षित छै कैन्हेंकि वू {{PLURAL:$1|इ पन्ना के | इ पन्ना के}} सुरक्षा-सीढीपर छै. आपनॆ इ पन्ना के सुरक्षा-स्तर बदलॆ सकॆ छियै, पर एकरा सॆं सुरक्षा-सीढी मॆं बदलाव नै होतै.',
-'protect-default'             => 'सब्भॆ सदस्यॊ कॆ अनुमति दॆ',
-'protect-fallback'            => '"$1" इजाज़त जरूरी छै',
+'protect-cascadeon' => 'ई पन्ना अभी सुरक्षित छै कैन्हेंकि वू {{PLURAL:$1|इ पन्ना के | इ पन्ना के}} सुरक्षा-सीढीपर छै. आपनॆ इ पन्ना के सुरक्षा-स्तर बदलॆ सकॆ छियै, पर एकरा सॆं सुरक्षा-सीढी मॆं बदलाव नै होतै.',
+'protect-default' => 'सब्भॆ सदस्यॊ कॆ अनुमति दॆ',
+'protect-fallback' => '"$1" इजाज़त जरूरी छै',
 'protect-level-autoconfirmed' => 'नयॊ व अपंजीकृत सदस्यॊ कॆ अवरोधित करॊ',
-'protect-level-sysop'         => 'सिर्फ प्रचालक',
-'protect-summary-cascade'     => 'सीढी',
-'protect-expiring'            => 'समाप्ती $1 (UTC)',
-'protect-expiry-indefinite'   => 'बेमियादी',
-'protect-cascade'             => 'इस पन्ना सॆं जुडलॊ पन्ना सुरक्षित करॊ (सुरक्षा-सीढी)',
-'protect-cantedit'            => 'आपनॆ इ पन्ना के सुरक्षा-स्तर बदलॆ नै सकॆ छियै कैन्हेकि आपनॆ कॆ ऐसनॊ करै के अनुमति नै छै.',
-'restriction-type'            => 'इजाज़त:',
-'restriction-level'           => 'सुरक्षा-स्तर',
-'minimum-size'                => 'कम सॆं कम आकार',
-'maximum-size'                => 'जादा सॆं जादा आकार:',
-'pagesize'                    => '(बाईट्स)',
+'protect-level-sysop' => 'सिर्फ प्रचालक',
+'protect-summary-cascade' => 'सीढी',
+'protect-expiring' => 'समाप्ती $1 (UTC)',
+'protect-expiry-indefinite' => 'बेमियादी',
+'protect-cascade' => 'इस पन्ना सॆं जुडलॊ पन्ना सुरक्षित करॊ (सुरक्षा-सीढी)',
+'protect-cantedit' => 'आपनॆ इ पन्ना के सुरक्षा-स्तर बदलॆ नै सकॆ छियै कैन्हेकि आपनॆ कॆ ऐसनॊ करै के अनुमति नै छै.',
+'restriction-type' => 'इजाज़त:',
+'restriction-level' => 'सुरक्षा-स्तर',
+'minimum-size' => 'कम सॆं कम आकार',
+'maximum-size' => 'जादा सॆं जादा आकार:',
+'pagesize' => '(बाईट्स)',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'संपादन',
-'restriction-move'   => 'स्थानांतरण',
+'restriction-edit' => 'संपादन',
+'restriction-move' => 'स्थानांतरण',
 'restriction-create' => 'सृजन करॊ',
 'restriction-upload' => 'अपलोड',
 
 # Restriction levels
-'restriction-level-sysop'         => 'पूर्ण सुरक्षित',
+'restriction-level-sysop' => 'पूर्ण सुरक्षित',
 'restriction-level-autoconfirmed' => 'अर्ध सुरक्षित',
-'restriction-level-all'           => 'कोय्यॊ लेवल(स्तर)',
+'restriction-level-all' => 'कोय्यॊ लेवल(स्तर)',
 
 # Undelete
-'undelete'          => 'हटैलॊ पन्ना वापस लानॊ',
-'undeletepage'      => 'हटैलॊ पन्ना देखॊ आरू पुनर्स्थापित करॊ',
+'undelete' => 'हटैलॊ पन्ना वापस लानॊ',
+'undeletepage' => 'हटैलॊ पन्ना देखॊ आरू पुनर्स्थापित करॊ',
 'undeletepagetitle' => "'''नीचे [[:$1]] केरॊ हटैलॊ गेलॊ अवतरण भी दर्शैलॊ गेलॊ छै.'''",
-'viewdeletedpage'   => 'हटैलॊ पन्ना वापस लानॊ',
-'undeletelink'      => 'देखॊ/पुनर्स्थापित करॊ',
+'viewdeletedpage' => 'हटैलॊ पन्ना वापस लानॊ',
+'undeletelink' => 'देखॊ/पुनर्स्थापित करॊ',
 
 # Namespace form on various pages
-'namespace'      => 'नामस्थान:',
-'invert'         => 'विपरीत प्रवरण',
+'namespace' => 'नामस्थान:',
+'invert' => 'विपरीत प्रवरण',
 'blanknamespace' => '(मुख्य)',
 
 # Contributions
-'contributions'       => 'सदस्य योगदान',
+'contributions' => 'सदस्य योगदान',
 'contributions-title' => '$1 लेली सदस्यॊ के योगदान',
-'mycontris'           => 'हमरॊ योगदान',
-'contribsub2'         => '$1 लेली ($2)',
-'uctop'               => '(उपर)',
-'month'               => 'इ महिना सॆं (आरू पुरानॊ):',
-'year'                => 'इ साल सॆं (आरू पुरानॊ):',
+'mycontris' => 'हमरॊ योगदान',
+'contribsub2' => '$1 लेली ($2)',
+'uctop' => '(उपर)',
+'month' => 'इ महिना सॆं (आरू पुरानॊ):',
+'year' => 'इ साल सॆं (आरू पुरानॊ):',
 
-'sp-contributions-newbies'  => 'सिर्फ नया सदस्यॊ के योगदान दर्शाबॊ',
+'sp-contributions-newbies' => 'सिर्फ नया सदस्यॊ के योगदान दर्शाबॊ',
 'sp-contributions-blocklog' => 'ब्लॉक सूची',
-'sp-contributions-search'   => 'योगदान लेली खोज',
+'sp-contributions-search' => 'योगदान लेली खोज',
 'sp-contributions-username' => 'आईपी एड्रेस या सदस्यनाम:',
-'sp-contributions-submit'   => 'खोज',
+'sp-contributions-submit' => 'खोज',
 
 # What links here
-'whatlinkshere'            => 'एन्जां की जुड़तै',
-'whatlinkshere-title'      => '$1 सॆं जुड़लॊ पन्ना',
-'whatlinkshere-page'       => 'पन्ना:',
-'linkshere'                => "नीचे के सब पन्ना '''[[:$1]]''' सॆं जुड़लॊ:",
-'isredirect'               => 'पुन: निर्दिष्ट पन्ना',
-'istemplate'               => 'मिलाबॊ',
-'isimage'                  => 'तस्वीर लिंक',
-'whatlinkshere-prev'       => '{{PLURAL:$1|पिछला|पिछला सीनी $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|अगला|अगला $1}}',
-'whatlinkshere-links'      => '← लिंक',
+'whatlinkshere' => 'एन्जां की जुड़तै',
+'whatlinkshere-title' => '$1 सॆं जुड़लॊ पन्ना',
+'whatlinkshere-page' => 'पन्ना:',
+'linkshere' => "नीचे के सब पन्ना '''[[:$1]]''' सॆं जुड़लॊ:",
+'isredirect' => 'पुन: निर्दिष्ट पन्ना',
+'istemplate' => 'मिलाबॊ',
+'isimage' => 'तस्वीर लिंक',
+'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछला सीनी $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगला $1}}',
+'whatlinkshere-links' => '← लिंक',
 'whatlinkshere-hideredirs' => '$1 अनुप्रेषितें',
-'whatlinkshere-hidetrans'  => '$1 ट्रान्स्क्ल्युजन्स',
-'whatlinkshere-hidelinks'  => '$1 लिंक',
-'whatlinkshere-filters'    => 'फिल्टर्स',
+'whatlinkshere-hidetrans' => '$1 ट्रान्स्क्ल्युजन्स',
+'whatlinkshere-hidelinks' => '$1 लिंक',
+'whatlinkshere-filters' => 'फिल्टर्स',
 
 # Block/unblock
-'blockip'                  => 'अवरोधित करॊ',
-'ipboptions'               => '२ घंटा:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ता:2 weeks,१ महिना:1 month,३ महिना:3 months,६ महिना:6 months,१ साल:1 year,अनंत:infinite',
-'ipblocklist'              => 'अवरोधित आईपी पता व सदस्यनाम',
-'blocklink'                => 'अवरोधित करॊ',
-'unblocklink'              => 'अवरोध हटाएँ (अनब्लॉक)',
-'change-blocklink'         => 'ब्लॉक बदलॊ',
-'contribslink'             => 'योगदान',
-'blocklogpage'             => 'ब्लॉक सूची',
-'blocklogentry'            => '"[[$1]]" कॆ $2 $3 तलक बदलाव करै सॆं रोकी देलॊ गेलॊ छै.',
-'unblocklogentry'          => '$1 ब्लॉक निकाली देलॊ गेलॊ छै.',
+'blockip' => 'अवरोधित करॊ',
+'ipboptions' => '२ घंटा:2 hours,१ दिन:1 day,३ दिन:3 days,१ हफ्ता:1 week,२ हफ्ता:2 weeks,१ महिना:1 month,३ महिना:3 months,६ महिना:6 months,१ साल:1 year,अनंत:infinite',
+'ipblocklist' => 'अवरोधित आईपी पता व सदस्यनाम',
+'blocklink' => 'अवरोधित करॊ',
+'unblocklink' => 'अवरोध हटाएँ (अनब्लॉक)',
+'change-blocklink' => 'ब्लॉक बदलॊ',
+'contribslink' => 'योगदान',
+'blocklogpage' => 'ब्लॉक सूची',
+'blocklogentry' => '"[[$1]]" कॆ $2 $3 तलक बदलाव करै सॆं रोकी देलॊ गेलॊ छै.',
+'unblocklogentry' => '$1 ब्लॉक निकाली देलॊ गेलॊ छै.',
 'block-log-flags-nocreate' => 'खाता निर्माण पर रोक',
 
 # Move page
-'movepagetext'     => "नीचॆं देलॊ पर्चा पन्ना के नाम बदली देतै, ऐकरॊ सारा इतिहास भी नयॊ नाम सॆं दिखना शुरू होय जैतै.
+'movepagetext' => "नीचॆं देलॊ पर्चा पन्ना के नाम बदली देतै, ऐकरॊ सारा इतिहास भी नयॊ नाम सॆं दिखना शुरू होय जैतै.
 पुराना शीर्षक नया नाम कॆ अनुप्रेषित करी लेतै.
 मूल शीर्षक दन्नॆ जाय वाला अग्रेषणॊ कॆ आपनॆ स्वचालित रूपॊ सॆं बदलॆ सकॆ छियै.
 यदि आपनॆ ऐन्हॊ नै करै छियै तॆ कृपया [[Special:DoubleRedirects|दोहरा]] पुनर्निर्देशण या [[Special:BrokenRedirects|टूटलॊ पुनर्निर्देशन]] लेली ज़रूर जाँच करॊ.
@@ -603,20 +602,20 @@ $2 द्वारा संपादित आखिरी अवतरण क
 * नीचॆं देलॊ गेलॊ चेक बॉक्स आपनॆ निकाली देनॆ छियै.
 
 इ मामला मॆं आपनॆकॆ स्वयं इ पन्ना जोडै लॆ पड़तै.",
-'movearticle'      => 'पन्ना केरॊ स्थानांतरण',
-'newtitle'         => 'नया शीर्षक दन्नॆ:',
-'move-watch'       => 'ध्यान रखॊ स्रोत आरू लक्ष्य फाइल के',
-'movepagebtn'      => 'पन्ना स्थांतरण करॊ',
-'pagemovedsub'     => 'स्थानांतरण सफल रहलै',
-'movepage-moved'   => '\'\'\'"$1" कॆ "$2" पर  स्थानांतरीत करलॊ गेलै\'\'\'',
-'articleexists'    => 'इ नाम के एगॊ पन्ना पहले सॆं मौजूद छै,या फेरू आपनॆ अमान्य नाम चुननॆ छियै. कृपया दोसरॊ नाम चुनॊ.',
-'talkexists'       => "'''पन्ना के नाम बदली देलॊ गेलॊ छै, पर ओकरा सॆं संबंधित वार्ता पृष्ठ नै बदललॊ गेलॊ छै कैन्हेंकि वू पहले सॆं बनलॊ छै.
+'movearticle' => 'पन्ना केरॊ स्थानांतरण',
+'newtitle' => 'नया शीर्षक दन्नॆ:',
+'move-watch' => 'ध्यान रखॊ स्रोत आरू लक्ष्य फाइल के',
+'movepagebtn' => 'पन्ना स्थांतरण करॊ',
+'pagemovedsub' => 'स्थानांतरण सफल रहलै',
+'movepage-moved' => '\'\'\'"$1" कॆ "$2" पर  स्थानांतरीत करलॊ गेलै\'\'\'',
+'articleexists' => 'इ नाम के एगॊ पन्ना पहले सॆं मौजूद छै,या फेरू आपनॆ अमान्य नाम चुननॆ छियै. कृपया दोसरॊ नाम चुनॊ.',
+'talkexists' => "'''पन्ना के नाम बदली देलॊ गेलॊ छै, पर ओकरा सॆं संबंधित वार्ता पृष्ठ नै बदललॊ गेलॊ छै कैन्हेंकि वू पहले सॆं बनलॊ छै.
 कृपया एकरा स्वयं बदली दहॊ'''",
-'movedto'          => ' स्थानांतरीत करलॊ गेलै',
-'movetalk'         => 'संबंधित वार्ता पृष्ठ भी बदलॊ',
-'movelogpage'      => 'स्थानांतरण सूची',
-'movereason'       => 'कारण:',
-'revertmove'       => 'पुरानॊ अवतरण पर लॆ चलॊ (रिवर्ट)',
+'movedto' => ' स्थानांतरीत करलॊ गेलै',
+'movetalk' => 'संबंधित वार्ता पृष्ठ भी बदलॊ',
+'movelogpage' => 'स्थानांतरण सूची',
+'movereason' => 'कारण:',
+'revertmove' => 'पुरानॊ अवतरण पर लॆ चलॊ (रिवर्ट)',
 
 # Export
 'export' => 'पन्ना कॆ निर्यात करॊ',
@@ -625,68 +624,68 @@ $2 द्वारा संपादित आखिरी अवतरण क
 'thumbnail-more' => 'बड़ा करॊ',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'आपनॆ के प्रयोक्ता पन्ना',
-'tooltip-pt-mytalk'               => 'आपनॆ के वार्ता पन्ना',
-'tooltip-pt-preferences'          => 'आपनॆ के वरीयता',
-'tooltip-pt-watchlist'            => 'आपनॆ के ध्यान देलॊ पन्ना के सूची',
-'tooltip-pt-mycontris'            => 'आपनॆ के योगदानॊ के सूची',
-'tooltip-pt-login'                => 'आपनॆ सॆं सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.',
-'tooltip-pt-logout'               => 'सत्रांत',
-'tooltip-ca-talk'                 => 'सामग्री पन्ना केरॊ बारे मॆं वार्तालाप',
-'tooltip-ca-edit'                 => 'आपनॆ इ पन्ना बदलॆ सकै छौ, कृपया बदलाव संजोवै सॆं पहलॆ झलक देखॊ.',
-'tooltip-ca-addsection'           => 'नया विभाग शुरू करॊ',
-'tooltip-ca-viewsource'           => 'इ पन्ना सुरक्षित छै आपनॆ एकरॊ स्रोत देखॆ सकै छियै.',
-'tooltip-ca-history'              => 'इ पन्ना के पिछला संशोधन',
-'tooltip-ca-protect'              => 'इ पन्ना सुरक्षित करॊ',
-'tooltip-ca-delete'               => 'इ पन्ना हटाबॊ',
-'tooltip-ca-move'                 => 'इ पन्ना स्थानांतरित करॊ',
-'tooltip-ca-watch'                => 'इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ',
-'tooltip-ca-unwatch'              => 'इ पन्ना कॆ आपनॊ ध्यानसूची सॆं हटाबॊ.',
-'tooltip-search'                  => '{{SITENAME}} में खोजॊ',
-'tooltip-search-go'               => 'अगर इ शीर्षक के पन्ना छै तॆ ओकरा पॆ चलॊ',
-'tooltip-search-fulltext'         => 'इ वाक्यांश कॆ पन्ना मॆं खोजॊ',
-'tooltip-n-mainpage'              => 'मुखपृष्ठ पॆ जा',
-'tooltip-n-mainpage-description'  => 'मुख्य पन्ना पर पधारॊ',
-'tooltip-n-portal'                => 'प्रकल्प के बारे मेँ, आपनॆ की करॆ सकॆ छियै, मदद कहाँ से लेभॆ',
-'tooltip-n-currentevents'         => 'हाल के घटना के पृष्ठभूमि प्राप्त करॊ.',
-'tooltip-n-recentchanges'         => 'विकि मॆं हाल मॆं होलॊ बदलावॊ के फ़ेहरिस्त',
-'tooltip-n-randompage'            => 'कोनो एक लेख पर जा',
-'tooltip-n-help'                  => 'मदत मिलै केरॊ ठिकानॊ',
-'tooltip-t-whatlinkshere'         => 'यहाँकरॊ हवाला दै वाला सबभॆ विकि पन्ना के सूची',
-'tooltip-t-recentchangeslinked'   => 'इ पन्ना से जुड़लॊ पन्ना पर होलॊ हाल के बदलाव',
-'tooltip-feed-rss'                => 'इ पन्ना के आरएसएस फ़ीड',
-'tooltip-feed-atom'               => 'इ पन्ना के अणु फ़ीड',
-'tooltip-t-contributions'         => 'इ सदस्य के योगदान केरॊ सूची देखियै',
-'tooltip-t-emailuser'             => 'इस सदस्य कॆ इमेल भेजॊ',
-'tooltip-t-upload'                => 'फाईल लादॊ (अपलोड )',
-'tooltip-t-specialpages'          => 'ख़ास पन्ना केरॊ सूची',
-'tooltip-t-print'                 => 'इ पन्ना के छापे लायक संस्करण.',
-'tooltip-t-permalink'             => 'इ पन्ना के संसोधन खातिर स्थायी लिंक',
-'tooltip-ca-nstab-main'           => 'सामग्री पन्ना देखॊ',
-'tooltip-ca-nstab-user'           => 'सदस्य पन्ना देखियै',
-'tooltip-ca-nstab-special'        => 'इ एगॊ खास पन्ना छै, आपनॆ एकरा बदलॆ नो सकै छियै.',
-'tooltip-ca-nstab-project'        => 'प्रोजेक्ट पन्ना देखियै',
-'tooltip-ca-nstab-image'          => 'फाइल के पन्ना देखॊ',
-'tooltip-ca-nstab-template'       => 'टेम्प्लेट देखियें',
-'tooltip-ca-nstab-category'       => 'श्रेणी पन्ना देखॊ',
-'tooltip-minoredit'               => 'ऐकरा छोटा बदलाव के तौर पर दर्ज करॊ',
-'tooltip-save'                    => 'आपनॊ बदलाव कॆ सुरक्षित करॊ',
-'tooltip-preview'                 => 'आपनॊ बदलावॊ के झलक देखॊ, कृपया सँजोला सॆं पहिनै ऐकरॊ इस्तेमाल करॊ !',
-'tooltip-diff'                    => 'इ पाठ्य मॆं आपनॊ द्वारा करलॊ बदलाव देखॊ.',
+'tooltip-pt-userpage' => 'आपनॆ के प्रयोक्ता पन्ना',
+'tooltip-pt-mytalk' => 'आपनॆ के वार्ता पन्ना',
+'tooltip-pt-preferences' => 'आपनॆ के वरीयता',
+'tooltip-pt-watchlist' => 'आपनॆ के ध्यान देलॊ पन्ना के सूची',
+'tooltip-pt-mycontris' => 'आपनॆ के योगदानॊ के सूची',
+'tooltip-pt-login' => 'आपनॆ सॆं सत्रारंभ करै के गुज़ारिश छै; लेकिन इ अनिवार्य नै छै.',
+'tooltip-pt-logout' => 'सत्रांत',
+'tooltip-ca-talk' => 'सामग्री पन्ना केरॊ बारे मॆं वार्तालाप',
+'tooltip-ca-edit' => 'आपनॆ इ पन्ना बदलॆ सकै छौ, कृपया बदलाव संजोवै सॆं पहलॆ झलक देखॊ.',
+'tooltip-ca-addsection' => 'नया विभाग शुरू करॊ',
+'tooltip-ca-viewsource' => 'इ पन्ना सुरक्षित छै आपनॆ एकरॊ स्रोत देखॆ सकै छियै.',
+'tooltip-ca-history' => 'इ पन्ना के पिछला संशोधन',
+'tooltip-ca-protect' => 'इ पन्ना सुरक्षित करॊ',
+'tooltip-ca-delete' => 'इ पन्ना हटाबॊ',
+'tooltip-ca-move' => 'इ पन्ना स्थानांतरित करॊ',
+'tooltip-ca-watch' => 'इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ',
+'tooltip-ca-unwatch' => 'इ पन्ना कॆ आपनॊ ध्यानसूची सॆं हटाबॊ.',
+'tooltip-search' => '{{SITENAME}} में खोजॊ',
+'tooltip-search-go' => 'अगर इ शीर्षक के पन्ना छै तॆ ओकरा पॆ चलॊ',
+'tooltip-search-fulltext' => 'इ वाक्यांश कॆ पन्ना मॆं खोजॊ',
+'tooltip-n-mainpage' => 'मुखपृष्ठ पॆ जा',
+'tooltip-n-mainpage-description' => 'मुख्य पन्ना पर पधारॊ',
+'tooltip-n-portal' => 'प्रकल्प के बारे मेँ, आपनॆ की करॆ सकॆ छियै, मदद कहाँ से लेभॆ',
+'tooltip-n-currentevents' => 'हाल के घटना के पृष्ठभूमि प्राप्त करॊ.',
+'tooltip-n-recentchanges' => 'विकि मॆं हाल मॆं होलॊ बदलावॊ के फ़ेहरिस्त',
+'tooltip-n-randompage' => 'कोनो एक लेख पर जा',
+'tooltip-n-help' => 'मदत मिलै केरॊ ठिकानॊ',
+'tooltip-t-whatlinkshere' => 'यहाँकरॊ हवाला दै वाला सबभॆ विकि पन्ना के सूची',
+'tooltip-t-recentchangeslinked' => 'इ पन्ना से जुड़लॊ पन्ना पर होलॊ हाल के बदलाव',
+'tooltip-feed-rss' => 'इ पन्ना के आरएसएस फ़ीड',
+'tooltip-feed-atom' => 'इ पन्ना के अणु फ़ीड',
+'tooltip-t-contributions' => 'इ सदस्य के योगदान केरॊ सूची देखियै',
+'tooltip-t-emailuser' => 'इस सदस्य कॆ इमेल भेजॊ',
+'tooltip-t-upload' => 'फाईल लादॊ (अपलोड )',
+'tooltip-t-specialpages' => 'ख़ास पन्ना केरॊ सूची',
+'tooltip-t-print' => 'इ पन्ना के छापे लायक संस्करण.',
+'tooltip-t-permalink' => 'इ पन्ना के संसोधन खातिर स्थायी लिंक',
+'tooltip-ca-nstab-main' => 'सामग्री पन्ना देखॊ',
+'tooltip-ca-nstab-user' => 'सदस्य पन्ना देखियै',
+'tooltip-ca-nstab-special' => 'इ एगॊ खास पन्ना छै, आपनॆ एकरा बदलॆ नो सकै छियै.',
+'tooltip-ca-nstab-project' => 'प्रोजेक्ट पन्ना देखियै',
+'tooltip-ca-nstab-image' => 'फाइल के पन्ना देखॊ',
+'tooltip-ca-nstab-template' => 'टेम्प्लेट देखियें',
+'tooltip-ca-nstab-category' => 'श्रेणी पन्ना देखॊ',
+'tooltip-minoredit' => 'ऐकरा छोटा बदलाव के तौर पर दर्ज करॊ',
+'tooltip-save' => 'आपनॊ बदलाव कॆ सुरक्षित करॊ',
+'tooltip-preview' => 'आपनॊ बदलावॊ के झलक देखॊ, कृपया सँजोला सॆं पहिनै ऐकरॊ इस्तेमाल करॊ !',
+'tooltip-diff' => 'इ पाठ्य मॆं आपनॊ द्वारा करलॊ बदलाव देखॊ.',
 'tooltip-compareselectedversions' => 'इ पन्ना के चुनलॊ अवतरणॊ मॆं फर्क देखाबॊ.',
-'tooltip-watch'                   => 'इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ.',
-'tooltip-rollback'                => ' "वापस लॆ चलॊ" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका में ग़ायब करी दै छै.',
-'tooltip-undo'                    => '"पुरानॊ स्थिति पर लानॊ" इ बदलाव कॆ वापस लॆ जाय कॆ संपादन पर्चा कॆ झलक रीति मॆं दिखलाबै छै.
+'tooltip-watch' => 'इ पन्ना कॆ आपनॊ ध्यानसूची मॆं डालॊ.',
+'tooltip-rollback' => ' "वापस लॆ चलॊ" इ पन्ना के पिछला योगदाता के बदलाव एक्के चटका में ग़ायब करी दै छै.',
+'tooltip-undo' => '"पुरानॊ स्थिति पर लानॊ" इ बदलाव कॆ वापस लॆ जाय कॆ संपादन पर्चा कॆ झलक रीति मॆं दिखलाबै छै.
 एकरॊ जरिया सारांश मॆं पुरानॊ स्थिति मॆं लानै के कारण लिखलॊ जाबॆ पारॆ.',
 
 # Browsing diffs
 'previousdiff' => ' पुराना संपादन',
-'nextdiff'     => 'टटका संपादन',
+'nextdiff' => 'टटका संपादन',
 
 # Media information
 'file-info-size' => '$1 × $2 चित्रतत्व, संचिका के आकार: $3, MIME प्रकार: $4',
-'file-nohires'   => 'सॆं ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.',
-'svg-long-desc'  => 'SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईल केरॊ आकार: $3',
+'file-nohires' => 'सॆं ज्यादा रिज़ोल्यूशन उपलब्ध नै छै.',
+'svg-long-desc' => 'SVG फ़ाईल, साधारणत: $1 × $2 पीक्सेल्स, फ़ाईल केरॊ आकार: $3',
 'show-big-image' => 'संपूर्ण रिजोल्यूशन',
 
 # Bad image list
@@ -696,11 +695,11 @@ $2 द्वारा संपादित आखिरी अवतरण क
 कोय भी बाद वाला लिंक ओही पंक्ति पर अईला पर ओकरा अपवाद मानलॊ जैतै, अर्थात वू पन्ना जेकरॊ अंदर इ फाईल जुङलॊ हुऎ सकॆ छै.',
 
 # Metadata
-'metadata'          => 'मेटाडाटा',
-'metadata-help'     => 'इ फ़ाईल मॆ अतिरिक्त जानकारी छै, हुऎ सकॆ छै कि इ फ़ाईल बनाबै मॆं इस्तेमाल करलॊ गेलॊ स्कैनर अथवा कैमरा सॆं इ प्राप्त होलॊ हुऒ. अगर इ फ़ाईल बदली देलॊ गेलॊ छै तॆ ई जानकारी नया फ़ाईल सॆं मेल नै खाबै के आशंका छै.',
-'metadata-expand'   => 'अतिरिक्त जानकारी दिखाबॊ',
+'metadata' => 'मेटाडाटा',
+'metadata-help' => 'इ फ़ाईल मॆ अतिरिक्त जानकारी छै, हुऎ सकॆ छै कि इ फ़ाईल बनाबै मॆं इस्तेमाल करलॊ गेलॊ स्कैनर अथवा कैमरा सॆं इ प्राप्त होलॊ हुऒ. अगर इ फ़ाईल बदली देलॊ गेलॊ छै तॆ ई जानकारी नया फ़ाईल सॆं मेल नै खाबै के आशंका छै.',
+'metadata-expand' => 'अतिरिक्त जानकारी दिखाबॊ',
 'metadata-collapse' => 'विस्तारित जानकारी छुपाबॊ',
-'metadata-fields'   => 'इ सूची मॆं देलॊ गेलॊ जानकारी फ़ाईल केरॊ नीचे मेटाडाटा जानकारी मॆं हमेशा दिखतै.
+'metadata-fields' => 'इ सूची मॆं देलॊ गेलॊ जानकारी फ़ाईल केरॊ नीचे मेटाडाटा जानकारी मॆं हमेशा दिखतै.
 बचलॊ जानकारी हमेशा छुपलॊ रहतै
 * make
 * model
@@ -717,18 +716,18 @@ $2 द्वारा संपादित आखिरी अवतरण क
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'बाहरी प्रणाली केरॊ इस्तेमाल करतें इ फ़ाईल कॆ संपादित करॊ.',
+'edit-externally' => 'बाहरी प्रणाली केरॊ इस्तेमाल करतें इ फ़ाईल कॆ संपादित करॊ.',
 'edit-externally-help' => '(आरू जानकारी लेली[//www.mediawiki.org/wiki/Manual:External_editors जमाव निर्देश] देखॊ)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'सब्भे',
 'namespacesall' => 'सब्भे',
-'monthsall'     => 'सब्भे',
+'monthsall' => 'सब्भे',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'प्रासंगिक बदलाव देखॊ',
 'watchlisttools-edit' => 'ध्यानसूची देखॊ आरू संपादित करॊ.',
-'watchlisttools-raw'  => 'अनिर्मित ध्यानसूची देखॊ एवम्‌ संपादित करॊ',
+'watchlisttools-raw' => 'अनिर्मित ध्यानसूची देखॊ एवम्‌ संपादित करॊ',
 
 # Special:SpecialPages
 'specialpages' => 'खास पन्ना',
index 00a85da..cd3124a 100644 (file)
@@ -18,6 +18,7 @@
  * @author Bassem JARKAS
  * @author Chaos
  * @author Ciphers
+ * @author DRIHEM
  * @author DrFO.Tn
  * @author Elmondo21st
  * @author Elmoro
@@ -41,6 +42,7 @@
  * @author Ouda
  * @author Oxydo
  * @author Rami.Awad
+ * @author Reedy
  * @author Riadismet
  * @author Samer
  * @author Sami Lab
@@ -368,6 +370,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'مسار_ملف' ),
        'Import'                    => array( 'استيراد' ),
        'Invalidateemail'           => array( 'تعطيل_البريد_الإلكتروني' ),
+       'JavaScriptTest'            => array( 'اختبار_جافا_سكريبت' ),
        'BlockList'                 => array( 'قائمة_المنع', 'عرض_المنع', 'قائمة_منع_أيبي' ),
        'LinkSearch'                => array( 'بحث_الوصلات' ),
        'Listadmins'                => array( 'عرض_الإداريين' ),
@@ -462,8 +465,8 @@ $messages = array(
 'tog-hidepatrolled' => 'أخف التعديلات المراجعة في أحدث التغييرات',
 'tog-newpageshidepatrolled' => 'أخف الصفحات المراجعة من قائمة الصفحات الجديدة',
 'tog-extendwatchlist' => 'مدد قائمة المراقبة لعرض كل التغييرات، وليس الأحدث فقط',
-'tog-usenewrc' => 'استخدÙ\85 Ø£Ø­Ø¯Ø« Ø§Ù\84تغÙ\8aÙ\8aرات Ø§Ù\84Ù\85حسÙ\86ة (يتطلب جافاسكربت)',
-'tog-numberheadings' => 'رقم العناوين تلقائيا',
+'tog-usenewrc' => 'جÙ\85Ù\91ع Ø§Ù\84تعدÙ\8aÙ\84ات Ø­Ø³Ø¨ Ø§Ù\84صÙ\81حة Ù\81Ù\8a Ø£Ø­Ø¯Ø« Ø§Ù\84تغÙ\8aÙ\8aرات Ù\88Ù\82ائÙ\85Ø© Ø§Ù\84Ù\85راÙ\82بة (يتطلب جافاسكربت)',
+'tog-numberheadings' => 'رقم العناوين تلقائياً',
 'tog-showtoolbar' => 'أظهر شريط التحرير (يتطلب جافاسكربت)',
 'tog-editondblclick' => 'عدل الصفحات عند الضغط المزدوج (جافاسكربت)',
 'tog-editsection' => 'مكن تعديل الأقسام عن طريق وصلات [عدل]',
@@ -485,8 +488,8 @@ $messages = array(
 'tog-shownumberswatching' => 'اعرض عدد المستخدمين المراقبين',
 'tog-oldsig' => 'التوقيع الحالي:',
 'tog-fancysig' => 'عامل التوقيع كنص ويكي (بدون وصلة أوتوماتيكية)',
-'tog-externaleditor' => 'استخدم محررا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors مزيد من المعلومات.])',
-'tog-externaldiff' => 'استخدم فرقا خارجيا بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([//www.mediawiki.org/wiki/Manual:External_editors للمزيد من المعلومات.])',
+'tog-externaleditor' => 'استخدم محرراً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([[mw:Manual:External_editors|للمزيد من المعلومات]].)',
+'tog-externaldiff' => 'استخدم فرقاً خارجياً بشكل افتراضي (للخبراء فقط، يحتاج إعدادات خاصة على حاسوبك) ([[mw:Manual:External_editors|للمزيد من المعلومات]].)',
 'tog-showjumplinks' => 'مكن وصلات "اذهب إلى" المساعدة',
 'tog-uselivepreview' => 'استخدم الاستعراض السريع (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهني عند إدخال ملخص تعديل فارغ',
@@ -846,6 +849,11 @@ $2',
 'ns-specialprotected' => 'الصفحات الخاصة لا يمكن تعديلها.',
 'titleprotected' => "{{GENDER:$1|حمى|حمت}} [[User:$1|$1]] هذا العنوان من الإنشاء.
 السبب المعطى هو ''$2''.",
+'filereadonlyerror' => 'تعذر تعديل الملف "$1" لأن مستودع الملف "$2" في وضع القراءة فقط. 
+
+المدير الذي قام بغلقه قدم التفسير التالي: "$3".',
+'invalidtitle-knownnamespace' => 'عنوان غير صالح في النطاق «$2» مع نص «$3»',
+'invalidtitle-unknownnamespace' => 'عنوان غير صالح ذو نطاق غير معروف رقم $1 ونص «$2»',
 
 # Virus scanner
 'virus-badscanner' => "ضبط سيء: ماسح فيروسات غير معروف: ''$1''",
@@ -895,8 +903,8 @@ $2',
 'nocookieslogin' => 'يستخدم {{SITENAME}} الكوكيز لتسجيل الدخول.
 الكوكيز معطلة لديك.
 من فضلك فعلها ثم حاول مرة أخرى.',
-'nocookiesfornew' => 'لم يتم إنشاء حساب المستخدم ، ونحن لا يستطيع تأكيد مصدره. 
-تأكد من أن ملفات تعريف الارتباط (كوكيز) مفعلة، ثم أعد تحديث الصفحة وحاول مرة أخرى.',
+'nocookiesfornew' => 'لم يتم إنشاء حساب المستخدم، لأننا لم نستطع تأكيد مصدره. 
+تأكد من أن ملفات تعريف الارتباط (الكوكيز) مفعلة عندك، ثم أعد تحميل الصفحة وحاول مرة أخرى.',
 'noname' => 'لم تحدد اسم مستخدم صحيح.',
 'loginsuccesstitle' => 'تم الدخول بشكل صحيح',
 'loginsuccess' => "'''لقد قمت بتسجيل الدخول ل{{SITENAME}} باسم \"\$1\".'''",
@@ -942,6 +950,7 @@ $2',
 'invalidemailaddress' => 'لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.
 ضع عنوانا مضبوطا أو أفرغ هذا الحقل.',
 'cannotchangeemail' => 'تغيير عنوان البريد الإلكتروني لهذا الحساب غير ممكن على هذا الويكي',
+'emaildisabled' => 'لا يمكن إرسال رسائل البريد الإلكتروني من هذا الموقع.',
 'accountcreated' => 'تم إنشاء الحساب',
 'accountcreatedtext' => 'تم إنشاء الحساب الخاص ب$1.',
 'createaccount-title' => 'إنشاء حساب في {{SITENAME}}',
@@ -980,7 +989,7 @@ $2',
 'resetpass-temp-password' => 'كلمة سر مؤقتة:',
 
 # Special:PasswordReset
-'passwordreset' => 'تÙ\85ت Ø¥Ø¹Ø§Ø¯Ø© Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر',
+'passwordreset' => 'إعادة ضبط كلمة السر',
 'passwordreset-text' => 'أكمل هذا النموذج لتتلقى بريدا إلكترونيا يذكر بتفاصيل حسابك.',
 'passwordreset-legend' => 'إعادة تعيين كلمة السر',
 'passwordreset-disabled' => 'عُطّلت إعادة تعيين كلمة السر على هذه الويكي.',
@@ -1141,8 +1150,9 @@ $2
 تذكر أن ملفات ال.css و ال.js تستخدم حروف صغيرة في العنوان ، كمثال {{ns:user}}:Foo/vector.css و ليس {{ns:user}}:Foo/Vector.css.",
 'updated' => '(محدثة)',
 'note' => "'''ملاحظة:'''",
-'previewnote' => "'''تذكر أن هذه مجرد معاينة للصفحة؛''''
+'previewnote' => "'''تذكر أن هذه مجرد معاينة أولية.'''
 لم تحفظ تغييراتك إلى الآن!",
+'continue-editing' => 'أكمل التحرير',
 'previewconflict' => 'هذا العرض يوضح النص الموجود في صندوق التحرير العلوي والذي سيظهر إذا اخترت الحفظ.',
 'session_fail_preview' => "'''عذرا! لم نتمكن من حفظ التعديلات التي قمت بها نتيجة لضياع بيانات هذه الجلسة.
 من فضلك حاول مرة أخرى.
@@ -1158,6 +1168,7 @@ $2
 هذا يحدث أحيانا عندما تستخدم خدمة بروكسي مجهول معيبة مبنية على الوب.'''",
 'edit_form_incomplete' => "'''بعض أجزاء من نموذج التعديل لم تصل إلى الخادم؛ تأكد من أن تعديلاتك لم تمس وحاول مجددا.'''",
 'editing' => 'تحرير $1',
+'creating' => 'إنشاء «$1»',
 'editingsection' => 'تحرير $1 (قسم)',
 'editingcomment' => 'تعديل $1 (قسم جديد)',
 'editconflict' => 'تضارب في التحرير: $1',
@@ -1181,8 +1192,8 @@ $2
 إذا لم تكن ترغب أن تعدل مشاركاتك بهذا الشكل، لا تضعها هنا.<br />
 أنت تقر أيضا أنك كتبت هذا بنفسك، أو نسخته من مصدر يخضع للملكية العامة، أو مصدر حر آخر (انظر $1 للتفاصيل).
 '''لا تضف أي عمل ذي حقوق محفوظة بدون تصريح!'''",
-'longpageerror' => "'''خطأ: النص الذي أدخلته حجمه $1 كيلوبايت، وهذا أكبر من الحد الأقصى وهو $2 كيلوبايت.
\84ا Ù\8aÙ\85Ù\83Ù\86 Ø­Ù\81ظÙ\87.'''",
+'longpageerror' => "'''خطأ: النص الذي قمت بإدخاله {{PLURAL:$1|واحد كيلوبايت|$1 كيلوبيات}} أطول, وهو أطول من الحد الأقصى {{PLURAL:$2|واحد كيلوبايت|$2 كيلوبايت}}.'''
\88 Ù\8aتعذر Ø­Ù\81ظÙ\87.",
 'readonlywarning' => "'''تحذير: لقد أغلقت قاعدة البيانات للصيانة، لذلك لن تتمكن من حفظ التعديلات التي قمت بها حاليا.
 إذا رغبت بإمكانك أن تنسخ النص الذي تعمل عليه وتحفظه في ملف نصي إلى وقت لاحق.'''
 
@@ -1225,6 +1236,7 @@ $2
 'edit-no-change' => 'تعديلك تم تجاهله، لأنه لم يحدث أي تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هي موجودة بالفعل.',
+'defaultmessagetext' => 'نص الرسالة الافتراضي',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.
@@ -1240,6 +1252,12 @@ $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' => 'الصفحة تجاوزت عمق التوسيع',
+'parser-unstrip-loop-warning' => 'حلقة معراة تم الكشف عنها',
+'parser-unstrip-recursion-limit' => 'تعدى حد العودية Unstrip  ($1)',
 
 # "Undo" feature
 'undo-success' => 'يمكن استرجاع التعديل.
@@ -1420,14 +1438,15 @@ $1",
 'mergelogpagetext' => 'بالأسفل قائمة بأحدث عمليات الدمج لتاريخ صفحة ما إلى أخرى.',
 
 # Diffs
-'history-title' => 'تاريخ مراجعة "$1"',
-'difference' => '(الفرق بين المراجعتين)',
+'history-title' => ' «$1»: تاريخ المراجعة',
+'difference-title' => '«$1»: الفرق بين المراجعتين',
+'difference-title-multipage' => '«$1» و«$2»: الفرق بين الصفحتين',
 'difference-multipage' => '(الفرق بين الصفحتين)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'أظهر/أخف المراجعات المختارة',
 'editundo' => 'تراجع',
-'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة|مراجعتان متوسطتان غير معروضتان|$1 مراجعات متوسطة غير معروضة|$1 مراجعة متوسطة غير معروضة}} أجراها {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
+'diff-multi' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتين أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} {{PLURAL:$2||مستخدم واحد|مستخدمان|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 'diff-multi-manyusers' => '({{PLURAL:$1||مراجعة واحدة متوسطة غير معروضة أجراها|مراجعتان متوسطتان غير معروضتان أجراهما|$1 مراجعات متوسطة غير معروضة أجراها|$1 مراجعة متوسطة غير معروضة أجراها}} أكثر من {{PLURAL:$2||مستخدم واحد|مستخدمين|$2 مستخدمين|$2 مستخدمًا|$2 مستخدم}}.)',
 
 # Search results
@@ -1519,6 +1538,7 @@ $1",
 'prefs-beta' => 'مزايا بيتا',
 'prefs-datetime' => 'وقت وتاريخ',
 'prefs-labs' => 'مزايا مختبرية',
+'prefs-user-pages' => 'صفحات المستخدمين',
 'prefs-personal' => 'ملف المستخدم',
 'prefs-rc' => 'أحدث التغييرات',
 'prefs-watchlist' => 'قائمة المراقبة',
@@ -1590,6 +1610,7 @@ $1",
 'yourrealname' => 'الاسم الحقيقي:',
 'yourlanguage' => 'اللغة:',
 'yourvariant' => 'لهجة المحتوى:',
+'prefs-help-variant' => 'عرض لهجتك المفضلة أو إملاؤها في صفحات المحتوى لهذا الويكي.',
 'yournick' => 'التوقيع:',
 'prefs-help-signature' => 'يجب أن توقع تعليقات صفحات النقاش باستخدام "<nowiki>~~~~</nowiki>" الذي سيحول إلى توقيعك مع طابع زمني.',
 'badsig' => 'توقيع خام غير صحيح؛ تحقق من وسوم HTML.',
@@ -1764,6 +1785,7 @@ $1",
 'action-suppressionlog' => 'رؤية هذا السجل الخاص',
 'action-block' => 'منع هذا المستخدم من التعديل',
 'action-protect' => 'تغيير مستويات الحماية لهذه الصفحة',
+'action-rollback' => 'استرجاع تعديلات آخر مستخدم عدل صفحة معينة سريعا',
 'action-import' => 'استيراد هذه الصفحة من ويكي آخر',
 'action-importupload' => 'استيراد هذه الصفحة من ملف مرفوع',
 'action-patrol' => 'التعليم على تعديلات الآخرين كمراجعة',
@@ -1779,7 +1801,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}',
 'recentchanges' => 'أحدث التغييرات',
 'recentchanges-legend' => 'خيارات أحدث التغييرات',
-'recentchangestext' => 'تابع آخر التغييرات في الويكي من هذه الصفحة.',
+'recentchanges-summary' => 'تابع آخر التغييرات في الويكي من هذه الصفحة.',
 'recentchanges-feed-description' => 'تابع أحدث التغييرات للويكي عبر هذه التلقيمة.',
 'recentchanges-label-newpage' => 'أنشأ هذا التعديل صفحة جديدة',
 'recentchanges-label-minor' => 'هذا تعديل طفيف',
@@ -1805,9 +1827,11 @@ $1",
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|لا مستخدمون يراقبون|مستخدم واحد يراقب|مستخدمان يراقبان|$1 مستخدمين يراقبون|$1 مستخدما يراقب|$1 مستخدم يراقب}}]',
 'rc_categories' => 'حصر لتصنيفات (مفرقة برمز "|")',
 'rc_categories_any' => 'أي',
+'rc-change-size-new' => '$1 {{PLURAL:$1|بايت|بايت}} بعد التغيير',
 'newsectionsummary' => '/* $1 */ قسم جديد',
 'rc-enhanced-expand' => 'عرض التفاصيل (يتطلب جافاسكريبت)',
 'rc-enhanced-hide' => 'أخفِ التفاصيل',
+'rc-old-title' => 'تم إنشاؤها أصلا ك"$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'تغييرات ذات علاقة',
@@ -1888,14 +1912,14 @@ $1",
 'windows-nonascii-filename' => 'هذا ويكي لا يعتمد أسماء الملفات مع الأحرف الخاصة.',
 'fileexists' => "هناك ملف موجود يحمل نفس هذا الاسم الرجاء التأكد من هذا الملف باتباع الوصلة التالية '''<tt>[[:$1]]</tt>''' قبل القيام بتغييره.
 [[$1|thumb]]",
-'filepageexists' => "أنشئت صفحة وصف هذا الملف في '''<tt>[[:$1]]</tt>'''، لكن لا يوجد ملف بهذا الاسم حاليا.
+'filepageexists' => "أنشئت صفحة وصف هذا الملف في '''<tt>[[:$1]]</tt>'''، لكن لا يوجد ملف بهذا الاسم حالياً.
 لن يظهر الملخص الذي تدخله على صفحة الوصف.
-لجعل ملخصك يظهر هناك، ستحتاج إلى تعديله يدويا.
+لجعل ملخصك يظهر هناك، ستحتاج إلى تعديله يدوياً.
 [[$1|thumb]]",
 'fileexists-extension' => "يوجد ملف باسم مشابه: [[$2|thumb]]
 * اسم الملف المراد رفعه: '''<tt>[[:$1]]</tt>'''
 * اسم الملف الموجود: '''<tt>[[:$2]]</tt>'''
-من فضلك اختر اسما مختلفا.",
+من فضلك اختر اسماً مختلفاً.",
 'fileexists-thumbnail-yes' => "يبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''. [[$1|thumb]]
 من فضلك افحص الملف '''<tt>[[:$1]]</tt>'''.
 إن كان هو نفس الملف بالحجم الأصلي فلا داعي لرفع تصغير إضافي.",
@@ -1903,9 +1927,9 @@ $1",
 يبدو أن الملف مصغرا لحجم أعلى ''(تصغير)''.
 إذا كانت لديك الصورة في درجة دقة كاملة قم برفعها، أو قم بتغيير اسم الملف من فضلك.",
 'fileexists-forbidden' => 'هناك ملف موجود بهذا الاسم بالفعل، ولا يمكن إعادة الكتابة عليه.
-لو أنك مازلت تريد رفع ملفك، من فضلك عد واستخدم اسما جديدا. [[File:$1|thumb|center|$1]]',
+لو أنك مازلت تريد رفع ملفك، من فضلك عد واستخدم اسماً جديداً. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'يوجد ملف بنفس الاسم بالفعل في مستودع الملفات المشترك.
-لو كنت مازلت تريد رفع ملفك، من فضلك ارجع واستخدم اسما جديدا.
+لو كنت مازلت تريد رفع ملفك، من فضلك ارجع واستخدم اسماً جديداً.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'هذا الملف مكرر  {{PLURAL:$1|للملف|للملفات}} التالية:',
 'file-deleted-duplicate' => 'ملف مطابق لهذه الملف ([[:$1]]) تم حذفه من قبل. ينبغي أن تتحقق من تاريخ الحذف لهذا الملف قبل المتابعة بإعادة رفعه.',
@@ -1933,8 +1957,8 @@ $1",
 'watchthisupload' => 'راقب هذا الملف',
 'filewasdeleted' => 'تم رفع ثم حذف ملف بهذا الاسم من قبل.
 من الأفضل مراجعة $1 قبل رفعه مرة أخرى.',
-'filename-bad-prefix' => "اسÙ\85 Ø§Ù\84Ù\85Ù\84Ù\81 Ø§Ù\84Ø°Ù\8a ØªØ±Ù\81عÙ\87 Ù\8aبدأ Ø¨'''\"\$1\"'''Ø\8c Ù\88Ù\87Ù\88 Ø§Ø³Ù\85 ØºÙ\8aر Ù\88صÙ\81Ù\8a Ø¹Ø§Ø¯Ø© Ù\8aÙ\88ضع ØªÙ\84Ù\82ائÙ\8aا Ù\85Ù\86 Ø§Ù\84Ù\83اÙ\85Ù\8aرات Ø§Ù\84رÙ\82Ù\85Ù\8aØ©.
-من فضلك اختر اسما أكثر وصفا لملفك.",
+'filename-bad-prefix' => "اسÙ\85 Ø§Ù\84Ù\85Ù\84Ù\81 Ø§Ù\84Ø°Ù\8a ØªØ±Ù\81عÙ\87 Ù\8aبدأ Ø¨'''\"\$1\"'''Ø\8c Ù\88Ù\87Ù\88 Ø§Ø³Ù\85 ØºÙ\8aر Ù\88صÙ\81Ù\8a ØºØ§Ù\84باÙ\8b Ù\85ا ØªØ®ØµØµÙ\87 Ø§Ù\84Ù\83اÙ\85Ù\8aرات Ø§Ù\84رÙ\82Ù\85Ù\8aØ© ØªÙ\84Ù\82ائÙ\8aاÙ\8b.
+من فضلك اختر اسماً يصف ملفك بوضوح أكثر.",
 'filename-prefix-blacklist' => ' #<!-- اترك هذا السطر تماما كما هو --> <pre>
 # الصيغة كالتالي:
 #   * كل شيء من علامة "#" إلى آخر السطر هو تعليق
@@ -1959,7 +1983,7 @@ $1',
 'upload-warning-msg' => 'ثمة مشكلة في مرفوعك من [$2]. يمكنك الرجوع إلى [[Special:Upload/stash/$1|نموذج الرفع]] لتصحيح المشكلة.',
 
 'upload-proto-error' => 'بروتوكول غير صحيح',
-'upload-proto-error-text' => 'الرفع عن بعد يتطلب مسارا يبدأ بـ <code>http://</code> أو <code>ftp://</code>.',
+'upload-proto-error-text' => 'الرفع عن بعد يتطلب مساراً يبدأ بـ <code>http://</code> أو <code>ftp://</code>.',
 'upload-file-error' => 'خطأ داخلي',
 'upload-file-error-text' => 'حدث خطأ داخلي عند محاولة إنشاء ملف مؤقت على الخادوم.
 من فضلك اتصل [[Special:ListUsers/sysop|بإداري]].',
@@ -1970,13 +1994,48 @@ $1',
 'upload-too-many-redirects' => 'احتوى المسار تحويلات كثيرة جدا',
 'upload-unknown-size' => 'حجم غير معروف',
 'upload-http-error' => 'صودف خطأ HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'رفع النسخ غير متاح من هذا الموقع',
 
 # File backend
+'backend-fail-stream' => 'لا يمكن عرض الملف $1.',
+'backend-fail-backup' => 'لا يمكن صنع نسخة أحتياطية للملف $1.',
 'backend-fail-notexists' => 'الملف $1 غير موجود.',
+'backend-fail-hashes' => 'لم يمكن الحصول على هاش الملف من أجل المقارنة',
+'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.',
+'backend-fail-maxsize' => 'تعذر كتابة الملف $1 لأنه أكبر من  {{PLURAL:$2|بايت واحد|$2 بايت}}.',
+'backend-fail-readonly' => 'خلفية التخزين "$1" في وضعية القراءة فقط حاليا. السبب في ذلك هو: "$2"',
+'backend-fail-synced' => 'الملف "$1" في حالة غير متناسقة ضمن خلفية التخزين الداخلية',
+'backend-fail-connect' => 'تعذر ربط الإتصال بخلفية التخزين "$1".',
+'backend-fail-internal' => 'وقع خطأ غير معروف في خلفية التخزين "$1".',
+'backend-fail-contenttype' => 'تعذر تحديد نوع محتوى الملف الذي تريد تخزينه في "$1".',
+'backend-fail-batchsize' => 'أعطت خلفية التخزين دفعة $1 ملف {{PLURAL:$1|عملية|عمليات}}; الحد الأقصى هو $2 {{PLURAL:$2|عملية|عمليات}}.',
+'backend-fail-usable' => 'تعذر كتابة الملف $1 لنقص في التراخيص أو فقدان الدلائل/الحاويات.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'تعذر ربط الإتصال بقاعدة بيانات خلفية التخزين "$1".',
+'filejournal-fail-dbquery' => 'تعذر تحديث قاعدة بيانات خلفية تخزين "$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.',
@@ -1994,16 +2053,17 @@ $1',
 'uploadstash-badtoken' => 'لم ينجح أداء ذلك العمل، ربما لأن وثائق تفويض التحرير الخاصة بك منتهية الصلاحية. حاول مرة أخرى.',
 'uploadstash-errclear' => 'لم تنجح عملية مسح الملفات.',
 'uploadstash-refresh' => 'تحديث قائمة الملفات',
+'invalid-chunk-offset' => 'قطعة أوفست غير صالحة',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'رفض الوصول',
 'img-auth-nopathinfo' => 'PATH_INFO مفقود.
-خادومك ليس مضبوطا لتمرير هذه المعلومات.
-ربما يكون مبني على CGI ولا يمكنه دعم img_auth.
-[https://www.mediawiki.org/wiki/Manual:Image_Authorization راجع تصريح الصور].',
+خادومك ليس مضبوطاً لتمرير هذه المعلومة.
+قد يكون مبنياً على نظام CGI ولا يمكنه دعم img_auth.
+راجع https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'المسار المطلوب غير موجود في مجلد الرفع المضبوط.',
 'img-auth-badtitle' => 'تعذر تشكيل عنوان صالح من "$1".',
-'img-auth-nologinnWL' => 'لست والجا و"$1" ليست في القائمة البيضاء.',
+'img-auth-nologinnWL' => 'لست والجاً و"$1" ليست في القائمة البيضاء.',
 'img-auth-nofile' => 'الملف "$1" غير موجود.',
 'img-auth-isdir' => 'أنت تحاول الوصول إلى الدليل "$1".
 يسمح بوصول الملفات فقط.',
@@ -2086,6 +2146,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' => 'ارفع نسخة جديدة من هذا الملف',
@@ -2126,7 +2190,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'بحث MIME',
-'mimesearch-summary' => 'تمكنك هذه الصفحة من ترشيح الملفات طبقا لنوع MIME الخاص بها.
+'mimesearch-summary' => 'تمكنك هذه الصفحة من ترشيح الملفات وفق نوع MIME الخاص بها.
 المدخل: نوع المحتوى/النوع الفرعي، كمثال <tt>image/jpeg</tt>.',
 'mimetype' => 'نوع الملف:',
 'download' => 'تنزيل',
@@ -2221,6 +2285,8 @@ $1',
 'wantedpages' => 'صفحات مطلوبة',
 'wantedpages-badtitle' => 'عنوان غير صحيح في مجموعة النتائج: $1',
 'wantedfiles' => 'ملفات مطلوبة',
+'wantedfiletext-cat' => 'الملفات التالية مستعملة ولكن لا وجود لها. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة. بالإضافة، أي صفحات تتضمن الملفات الغير موجودة تم سردها في [[:$1]].',
+'wantedfiletext-nocat' => 'الملفات التالية مستعملة ولكن  غير متوفرة. يمكن سرد ملفات من مستودعات خارجية بالرغم من وجودها. سيتم <del>محو</del> أي أيجابيات كاذبة.',
 'wantedtemplates' => 'قوالب مطلوبة',
 'mostlinked' => 'أكثر الصفحات وصلا',
 'mostlinkedcategories' => 'أكثر التصنيفات ارتباطا',
@@ -2229,6 +2295,7 @@ $1',
 'mostimages' => 'أكثر الملفات ارتباطا',
 'mostrevisions' => 'أكثر الصفحات تعديلا',
 'prefixindex' => 'كل الصفحات بالبادئة',
+'prefixindex-namespace' => 'كل الصفحات مع بادئة ($1 مساحة الأسم)',
 'shortpages' => 'صفحات قصيرة',
 'longpages' => 'صفحات طويلة',
 'deadendpages' => 'صفحات نهاية مسدودة',
@@ -2277,16 +2344,17 @@ $1',
 'log' => 'سجلات',
 'all-logs-page' => 'كل السجلات العامة',
 'alllogstext' => 'عرض شامل لكل السجلات المتوفرة في {{SITENAME}}.
-باستطاعتك جعل القائمة أكثر تحديدا وذلك باختيار نوع السجل، اسم المستخدم (حساس لحالة الحروف)، أو الصفحة المتأثرة (أيضا حساس لحالة الحروف).',
+باستطاعتك جعل القائمة أكثر تحديداً، وذلك باختيار نوع السجل واسم المستخدم (حساس لحالة الحروف)، أو الصفحة المتأثرة (أيضاً حساس لحالة الحروف).',
 'logempty' => 'لا توجد مدخلات مطابقة في السجل.',
 'log-title-wildcard' => 'ابحث عن عناوين تبدأ بهذا النص',
+'showhideselectedlogentries' => 'إطهار/إخفاء سجلات الدخول المختارة',
 
 # Special:AllPages
 'allpages' => 'كل الصفحات',
 'alphaindexline' => '$1 إلى $2',
 'nextpage' => 'الصفحة التالية ($1)',
 'prevpage' => 'الصفحة السابقة ($1)',
-'allpagesfrom' => 'اعرض الصفحات بدءا من:',
+'allpagesfrom' => 'اعرض الصفحات بدءاً من:',
 'allpagesto' => 'اعرض الصفحات المنتهية عند:',
 'allarticles' => 'كل الصفحات',
 'allinnamespace' => 'كل الصفحات (في نطاق $1)',
@@ -2296,17 +2364,23 @@ $1',
 'allpagessubmit' => 'اذهب',
 'allpagesprefix' => 'عرض الصفحات التي تبدأ بـ:',
 'allpagesbadtitle' => 'العنوان المقترح للصفحة غير مقبول أو يضم لغات أخرى أو سابقة إنترويكي.
-يمكن أن يتضمن حروفا لا يمكن استعمالها للعناوين.',
+أو ربما فيه أحرف لا يمكن استعمالها في العناوين.',
 '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|التصنيف التالي يحتوي|التصنيفات التالية تحتوي}} على صفحات أو وسائط.
 [[Special:UnusedCategories|التصنيفات غير المستخدمة]] غير معروضة هنا.
£Ù\8aضا Ø§Ù\86ظر [[Special:WantedCategories|التصنيفات المطلوبة]].',
-'categoriesfrom' => 'أظهر التصنيفات بدءا من:',
§Ù\86ظر Ø£Ù\8aضاÙ\8b [[Special:WantedCategories|التصنيفات المطلوبة]].',
+'categoriesfrom' => 'أظهر التصنيفات بدءاً من:',
 'special-categories-sort-count' => 'رتب بالعدد',
-'special-categories-sort-abc' => 'رتب هجائيا',
+'special-categories-sort-abc' => 'رتب هجائياً',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'مساهمات المستخدم المحذوفة',
@@ -2318,25 +2392,26 @@ $1',
 'linksearch-pat' => 'نمط البحث:',
 'linksearch-ns' => 'النطاق:',
 'linksearch-ok' => 'ابحث',
-'linksearch-text' => 'الكروت الخاصة مثل "*.wikipedia.org" يمكن استخدامها.<br />
-البروتوكولات المدعومة: <tt>$1</tt>',
+'linksearch-text' => 'Wildcards مثل "*.wikipedia.org" يمكن استخدامها.
+تحتاج على الأقل إلى نطاق ذو مستوى أعلى، كمثال "*.org".<br />
+البروتوكولات المدعومة: <tt>$1</tt> (لا تقم بإضافة أي من هذه إلى بحثك).',
 'linksearch-line' => '$1 موصولة من $2',
 'linksearch-error' => 'الكروت الخاصة يمكن أن تظهر فقط في بداية اسم المضيف.',
 
 # Special:ListUsers
-'listusersfrom' => 'اعرض المستخدمين بدءا من:',
+'listusersfrom' => 'اعرض المستخدمين بدءاً من:',
 'listusers-submit' => 'اعرض',
 'listusers-noresult' => 'لم يتم إيجاد مستخدم.',
 'listusers-blocked' => '(ممنوع)',
 
 # Special:ActiveUsers
 'activeusers' => 'قائمة المستخدمين النشطين',
-'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعا من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوما ماضيا|ال$1 يوم ماضي}}.',
-'activeusers-count' => '{{PLURAL:$1|لا تعديلات حديثة|تعديل حديث واحد|تعديلان حديثان|$1 تعديلات حديثة|$1 تعديلا حديثا|$1 تعديل حديث}} في {{PLURAL:$3||اليوم الماضي|اليومين الماضيين|$3 أيام ماضية|$3 يوما ماضية|ال$1 يوم ماضي}}',
-'activeusers-from' => 'اعرض المستخدمين بدءا من:',
+'activeusers-intro' => 'هذه قائمة بالمستخدمين الذين مارسوا نوعاً من النشاط خلال {{PLURAL:$1||اليوم الماضي|اليومين الماضيين|ال$1 أيام الماضية|ال$1 يوماً ماضياً|ال$1 يوم ماضي}}.',
+'activeusers-count' => '{{PLURAL:$1|لا تعديلات حديثة|تعديل حديث واحد|تعديلان حديثان|$1 تعديلات حديثة|$1 تعديلاً حديثاً|$1 تعديل حديث}} خلال {{PLURAL:$3||اليوم الماضي|اليومين الماضيين|$3 أيام ماضية|$3 يوماً ماضية|ال$1 يوم ماضي}}',
+'activeusers-from' => 'اعرض المستخدمين بدءاً من:',
 'activeusers-hidebots' => 'أخف البوتات',
 'activeusers-hidesysops' => 'أخف الإداريين',
-'activeusers-noresult' => 'لا مستخدمون تم إيجادهم.',
+'activeusers-noresult' => 'لم يعثر على أي مستخدمين',
 
 # Special:Log/newusers
 'newuserlogpage' => 'سجل إنشاء المستخدمين',
@@ -2367,7 +2442,7 @@ $1',
 'emailuser' => 'إرسال رسالة لهذا المستخدم',
 'emailpage' => 'إرسال رسالة للمستخدم',
 'emailpagetext' => 'يمكنك استخدام الاستمارة بالأسفل لإرسال رسالة بريد إلكتروني إلى هذا المستخدم.
¹Ù\86Ù\88اÙ\86 Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø§Ù\84Ø°Ù\8a Ù\82Ù\85ت Ø£Ù\86ت Ø¨Ø¥Ø¯Ø®Ø§Ù\84Ù\87 Ù\81Ù\8a [[Special:Preferences|تÙ\81ضÙ\8aÙ\84اتÙ\83]]Ø\8c Ø³Ù\8aظÙ\87ر Ù\83عÙ\86Ù\88اÙ\86 Ø§Ù\84Ù\85رسÙ\84 Ù\81Ù\8a Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8aØ\8c Ø­ØªÙ\89 Ù\8aصبح Ø§Ù\84Ù\85تÙ\84Ù\82Ù\8a Ù\82ادرا Ø¹Ù\84Ù\89 الرد عليك مباشرة.',
³Ù\8aظÙ\87ر Ø¹Ù\86Ù\88اÙ\86 Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø§Ù\84Ø°Ù\8a Ø£Ø¯Ø®Ù\84تÙ\87 Ù\81Ù\8a [[Special:Preferences|تÙ\81ضÙ\8aÙ\84اتÙ\83]] Ù\83عÙ\86Ù\88اÙ\86 Ø§Ù\84Ù\85رسÙ\84 Ù\81Ù\8a Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8aØ\8c Ù\83Ù\8a Ù\8aستطÙ\8aع Ø§Ù\84Ù\85تÙ\84Ù\82Ù\8a الرد عليك مباشرة.',
 'usermailererror' => 'جسم البريد أرجع خطأ:',
 'defemailsubject' => 'رسالة {{SITENAME}} من المستخدم "$1"',
 'usermaildisabled' => 'بريد المستخدم الإلكتروني معطل',
@@ -2403,7 +2478,7 @@ $1',
 'nowatchlist' => 'لا توجد مدخلات في قائمة مراقبتك.',
 'watchlistanontext' => 'الرجاء $1 لعرض أو تعديل الصفحات في قائمة مراقبتك.',
 'watchnologin' => 'غير مسجل',
-'watchnologintext' => 'يجب أن تكون [[Special:UserLogin|مسجلا الدخول]] لتعدل قائمة مراقبتك.',
+'watchnologintext' => 'يجب أن تكون [[Special:UserLogin|مسجل الدخول]] لتعدل قائمة مراقبتك.',
 'addwatch' => 'إضافة إلى قائمة المراقبة',
 'addedwatchtext' => "أضيفت الصفحة  \"[[:\$1]]\" إلى [[Special:Watchlist|قائمة مراقبتك]].
 التغييرات القادمة على هذه الصفحة وصفحة نقاشها سيتم وضعها هناك، وسيتم إظهار اسم الصفحة بخط '''غليظ''' في صفحة [[Special:RecentChanges|أحدث التغييرات]] لتسهيل تحديدها واكتشافها.",
@@ -2423,7 +2498,7 @@ $1',
 'watchmethod-list' => 'فحص الصفحات المراقبة للتعديلات الحديثة',
 'watchlistcontains' => 'تحتوي قائمة مراقبتك على {{PLURAL:$1|لا صفحات|صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}}.',
 'iteminvalidname' => "مشكلة في المدخل '$1'، اسم غير صحيح...",
-'wlnote' => "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقا ل$3، $4.",
+'wlnote' => "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقاً ل$3، $4.",
 'wlshowlast' => 'عرض آخر $1 ساعات $2 أيام $3',
 'watchlist-options' => 'خيارات قائمة المراقبة',
 
@@ -2452,18 +2527,18 @@ $1',
 ويكي: $PAGEEDITOR_WIKI
 
 لن يكون هناك إخطارات أخرى في حالة حدوث مزيد من التغييرات إلا إذا قمت بزيارة تلك الصفحة.
-يمكن أيضا تعيين إشارات الإعلام لجميع صفحات شاهد على هيئة الرصد الخاصة بك.
+يمكنك أيضاً إزالة العلامات عن جميع الصفحات في قائمة مراقبتك.
 
-                        {{SITENAME}} إعلام البريد الإلكتروني لموقع
+                       نظام {{SITENAME}} للإعلام بالبريد الإلكتروني
 
 --
\84تغÙ\8aÙ\8aر Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø¥Ø¹Ù\84اÙ\85 البريد الإلكتروني الخاص بك، قم بزيارة
\84تغÙ\8aÙ\8aر Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§Ù\84إعÙ\84اÙ\85 Ø¨البريد الإلكتروني الخاص بك، قم بزيارة
 {{canonicalurl:{{#special:Preferences}}}}
 
-لتغيير إعدادات المراقبة الخاصة بك، قم بزيارة
+لتغيير إعدادات قائمة مراقبتك، قم بزيارة
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-لحذف الصفحة من قائمة المراقبة الخاصة بك، قم بزيارة
+لحذف الصفحة من قائمة مراقبتك، قم بزيارة
 $UNWATCHURL
 
 التغذية المرتدة، والحصول على مساعدة إضافية:
@@ -2478,7 +2553,7 @@ $UNWATCHURL
 'exblank' => 'الصفحة كانت فارغة',
 'delete-confirm' => 'حذف "$1"',
 'delete-legend' => 'حذف',
-'historywarning' => "'''تحذير:''' للصفحة التي توشك على حذفها تاريخ فيه تقريبا {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}:",
+'historywarning' => "'''تحذير:''' الصفحة التي توشك على حذفها لها تاريخ فيه {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}} تقريباً:",
 'confirmdeletetext' => 'أنت على وشك أن تقوم بحذف صفحة بالإضافة إلى كل تاريخها.
 من فضلك التأكد من عزمك على الحذف، وبأنك مدرك للعواقب، وبأنك تقوم بهذا بالتوافق مع [[{{MediaWiki:Policy-url}}|السياسة]].',
 'actioncomplete' => 'انتهاء العملية',
@@ -2537,6 +2612,8 @@ $UNWATCHURL
 'protect-title' => 'ضبط مستوى الحماية ل"$1"',
 'protect-title-notallowed' => 'عرض مستوى الحماية ل "$1"',
 'prot_1movedto2' => 'نُقلت [[$1]] إلى [[$2]]',
+'protect-badnamespace-title' => 'مساحة إسم غير محمية',
+'protect-badnamespace-text' => 'لا يمكن حماية الصفحات الموجودة في مساحة الإسم',
 'protect-legend' => 'تأكيد الحماية',
 'protectcomment' => 'السبب:',
 'protectexpiry' => 'تنتهي في:',
@@ -2634,10 +2711,11 @@ $UNWATCHURL
 'undelete-search-submit' => 'ابحث',
 'undelete-no-results' => 'لم يتم العثور على صفحات مطابقة في أرشيف المحذوفات.',
 'undelete-filename-mismatch' => 'لم يمكن استرجاع مراجعة الملف بتاريخ $1: اسم الملف لا يطابق',
-'undelete-bad-store-key' => 'لم يمكن استرجاع مراجعة الملف بتاريخ $1: الملف كان مفقودا قبل الحذف',
+'undelete-bad-store-key' => 'لم يمكن استرجاع مراجعة الملف بتاريخ $1: الملف كان مفقوداً قبل الحذف',
 'undelete-cleanup-error' => 'خطأ حذف ملف أرشيف غير مستخدم "$1".',
 'undelete-missing-filearchive' => 'غير قادر على استرجاع ملف الأرشيف رقم $1 لأنه ليس في قاعدة البيانات.
 ربما يكون قد تم استرجاعه.',
+'undelete-error' => 'وقع خطأ عند إلغاء حذف الصفحة',
 'undelete-error-short' => 'خطأ استرجاع ملف: $1',
 'undelete-error-long' => 'حدثت أخطاء أثناء استرجاع الملف:
 
@@ -2731,13 +2809,13 @@ $1',
 'ipbotherreason' => 'سبب إضافي/آخر:',
 'ipbhidename' => 'أخف اسم المستخدم من التعديلات والقوائم',
 'ipbwatchuser' => 'راقب صفحتي المستخدم والنقاش لهذا المستخدم',
-'ipb-disableusertalk' => 'امنع هذا المستخدم من تعديل صفحة نقاشه ما دام ممنوعا',
+'ipb-disableusertalk' => 'امنع هذا المستخدم من تعديل صفحة نقاشه ما دام ممنوعاً',
 'ipb-change-block' => 'أعد منع المستخدم بهذه الإعدادات',
 'ipb-confirm' => 'أكّد المنع',
 'badipaddress' => 'عنوان أيبي غير صحيح',
 'blockipsuccesssub' => 'تم المنع بنجاح',
-'blockipsuccesstext' => 'تم منع [[Special:Contributions/$1|$1]].<br />
§Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø£يبي]] لمراجعة حالات المنع.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] تم منعها.<br />
£Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø¢يبي]] لمراجعة حالات المنع.',
 'ipb-blockingself' => 'أنت على وشك منع نفسك! أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-confirmhideuser' => 'أنت على وشك منع مستخدم مع تفعيل خيار "أخف المستخدم". سوف يخفي هذا الخيار اسم المستخدم من جميل القوائم ومدخلات السجلات. أمتأكد من رغبتك في القيام بذلك؟',
 'ipb-edit-dropdown' => 'عدل أسباب المنع',
@@ -2748,7 +2826,7 @@ $1',
 'unblockip' => 'رفع المنع عن المستخدم',
 'unblockiptext' => 'استخدم الاستمارة أدناه لاسترجاع صلاحية الكتابة الخاصة بعنوان أيبي أو مستخدم تم سحبها منه مسبقا.',
 'ipusubmit' => 'ارفع هذا المنع',
-'unblocked' => '[[User:$1|$1]] تم رفع منعه',
+'unblocked' => '[[User:$1|$1]] تم رفع المنع عنه',
 'unblocked-range' => 'تم إلغاء منع $1',
 'unblocked-id' => 'منع $1 تم رفعه',
 'blocklist' => 'المستخدمون الممنوعون',
@@ -2781,8 +2859,8 @@ $1',
 'change-blocklink' => 'تغيير المنع',
 'contribslink' => 'مساهمات',
 'emaillink' => 'أرسل بريدًا إلكترونيًا',
-'autoblocker' => 'تم منعك تلقائيا لأن الأيبي الخاص بك تم استخدامه مؤخرا بواسطة "[[User:$1|$1]]".
-السبب المعطى لمنع $1 هو: "$2"',
+'autoblocker' => 'تم منعك تلقائياً لأن الأيبي الخاص بك تم استخدامه مؤخراً بواسطة «[[User:$1|$1]]».
+السبب المعطى لمنع $1 هو: «$2»',
 'blocklogpage' => 'سجل المنع',
 'blocklog-showlog' => 'سبق منع هذا المستخدم.
 سجل المنع معروض بالأسفل كمرجع:',
@@ -2791,8 +2869,8 @@ $1',
 'blocklogentry' => 'منع "[[$1]]" لفترة زمنية مدتها $2 $3',
 'reblock-logentry' => 'غير إعدادات المنع ل[[$1]] بتاريخ انتهاء $2 $3',
 'blocklogtext' => 'هذا سجل بعمليات المنع ورفع المنع.
-عناوين الأيبي الممنوعة تلقائيا ليست معروضة.
§Ù\86ظر [[Special:BlockList|عÙ\86اÙ\88Ù\8aÙ\86 Ø§Ù\84Ø£Ù\8aبÙ\8a Ø§Ù\84Ù\85Ù\85Ù\86Ù\88عة]] Ù\84رؤÙ\8aØ© Ø¹Ù\85Ù\84Ù\8aات Ø§Ù\84Ù\85Ù\86ع Ø§Ù\84Ù\85Ù\81عÙ\84Ø© Ø­Ø§Ù\84Ù\8aا.',
+عناوين الأيبي الممنوعة تلقائياً غير معروضة.
£Ù\86ظر [[Special:BlockList|Ù\82ائÙ\85Ø© Ù\85Ù\86ع Ø§Ù\84Ø¢Ù\8aبÙ\8a]] Ù\84رؤÙ\8aØ© Ø¹Ù\85Ù\84Ù\8aات Ø§Ù\84Ù\85Ù\86ع Ø§Ù\84Ù\85Ù\81عÙ\84Ø© Ø­Ø§Ù\84Ù\8aاÙ\8b.',
 'unblocklogentry' => 'رفع منع $1',
 'block-log-flags-anononly' => 'المستخدمون المجهولون فقط',
 'block-log-flags-nocreate' => 'إنشاء الحسابات ممنوع',
@@ -2805,17 +2883,17 @@ $1',
 'ipb_expiry_invalid' => 'تاريخ الانتهاء غير صحيح.',
 'ipb_expiry_temp' => 'عمليات منع أسماء المستخدمين المخفية يجب أن تكون دائمة.',
 'ipb_hide_invalid' => 'غير قادر على إخفاء هذا الحساب؛ ربما يكون قد قام بالكثير من التعديلات.',
-'ipb_already_blocked' => '"$1" Ù\85Ù\85Ù\86Ù\88ع Ø¨Ø§Ù\84Ù\81عÙ\84',
-'ipb-needreblock' => '$1 Ù\85Ù\85Ù\86Ù\88ع Ø¨Ø§Ù\84Ù\81عÙ\84. هل تريد تغيير الإعدادات؟',
+'ipb_already_blocked' => '"$1" Ù\85Ù\85Ù\86Ù\88ع Ø­Ø§Ù\84Ù\8aاÙ\8b',
+'ipb-needreblock' => '$1 Ù\85Ù\85Ù\86Ù\88ع Ø­Ø§Ù\84Ù\8aاÙ\8b. هل تريد تغيير الإعدادات؟',
 'ipb-otherblocks-header' => '{{PLURAL:$1||المنع الآخر|المنعان الآخران|المنوعات الأخرى}}',
 'unblock-hideuser' => 'لا يمكنك إلغاء منع هذا المستخدم لأن اسم مستخدمه أُخفي.',
 'ipb_cant_unblock' => 'خطأ: لم يتم إيجاد الممنوع $1.
 ربما تم رفع منعه بالفعل.',
-'ipb_blocked_as_range' => 'خطأ: الأيبي $1 ليس ممنوعا مباشرة ولا يمكن رفع المنع عنه.
-لكنه، على أية حال، ممنوع كجزء من النطاق $2، والذي يمكن رفع المنع عنه.',
+'ipb_blocked_as_range' => 'خطأ: الأيبي $1 ليس ممنوعاً مباشرة ولا يمكن رفع المنع عنه.
+لكنه ممنوع كجزء من النطاق $2، والذي يمكن رفع المنع عنه.',
 'ip_range_invalid' => 'نطاق عناوين الأيبي المدخل غير صحيح.',
 'ip_range_toolarge' => 'لا يسمح بنطاقات المنع الأكبر من /$1',
-'blockme' => 'منعي',
+'blockme' => 'امنعني',
 'proxyblocker' => 'مانع البروكسي',
 'proxyblocker-disabled' => 'هذه الخاصية معطلة.',
 'proxyblockreason' => 'تم منع عنوان الأيبي الخاص بك لكونه بروكسي مفتوح.
@@ -2826,19 +2904,19 @@ $1',
 'sorbs_create_account_reason' => 'عنوان الأيبي الخاص بك موجود كبروكسي مفتوح في DNSBL المستخدم بواسطة {{SITENAME}}.
 لا يمكنك إنشاء حساب.',
 'cant-block-while-blocked' => 'أنت لا يمكنك منع المستخدمين الآخرين بينما أنت ممنوع.',
-'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه مسبقا وإخفائه. بما أنك لا تمتلك صلاحية إخفاء المستخدم ، لا يمكنك مشاهدة المنع أو تعديله.',
+'cant-see-hidden-user' => 'المستخدم الذي تحاول منعه تم منعه سابقاً وإخفاؤه. بما أنك لا تمتلك صلاحية إخفاء المستخدم، لا يمكنك مشاهدة المنع أو تعديله.',
 'ipbblocked' => 'لا يمكنك منع أو رفع منع مستخدمين آخرين لأنك ممنوع',
 'ipbnounblockself' => 'لا يسمح لك برفع المنع عن نفسك',
 
 # Developer tools
 'lockdb' => 'قفل قاعدة البيانات',
 'unlockdb' => 'فتح قاعدة البيانات',
-'lockdbtext' => 'إغلاق قاعدة البيانات سوف يمنع جميع المستخدمين من تحرير الصفحات وتغيير التفضيلات الخاصة بهم وتعديل قائمة المراقبة وغير ذلك من الأمور المتطلبة التعديل على قاعدة البيانات.
-من فضلك تأكد من أن هذا حقا ما ترغب القيام به، ومن أنك سوف تقوم بإزالة الغلق بعد الانتهاء من الصيانة.',
+'lockdbtext' => 'إغلاق قاعدة البيانات سوف يمنع جميع المستخدمين من تحرير الصفحات وتغيير التفضيلات الخاصة بهم وتعديل قائمة المراقبة وغير ذلك من الأمور التي تتطلب تعديل قاعدة البيانات.
+من فضلك تأكد من أن هذا حقاً ما ترغب القيام به، ومن أنك سوف تقوم بإزالة الغلق بعد الانتهاء من الصيانة.',
 'unlockdbtext' => 'فتح قاعدة البيانات سيسترجع قدرة كل المستخدمين على تحرير الصفحات، تغيير تفضيلاتهم، تعديل قوائم المراقبة الخاصة بهم، وأشياء أخرى تحتاج التغيير في قاعدة البيانات.
 من فضلك أكد أن هذا هو ما تريده.',
-'lockconfirm' => 'Ù\86عÙ\85Ø\8c Ø£Ø±Ù\8aد Ù\81عÙ\84ا Ù\82Ù\81Ù\84 Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات.',
-'unlockconfirm' => 'Ù\86عÙ\85Ø\8c Ø£Ø±Ù\8aد Ù\81عÙ\84ا Ù\81تح Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات.',
+'lockconfirm' => 'Ù\86عÙ\85Ø\8c Ø£Ø±Ù\8aد Ù\82Ù\81Ù\84 Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\81عÙ\84اÙ\8b.',
+'unlockconfirm' => 'Ù\86عÙ\85Ø\8c Ø£Ø±Ù\8aد Ù\81تح Ù\82اعدة Ø§Ù\84بÙ\8aاÙ\86ات Ù\81عÙ\84اÙ\8b.',
 'lockbtn' => 'قفل قاعدة البيانات',
 'unlockbtn' => 'رفع غلق قاعدة البيانات',
 'locknoconfirm' => 'لم تقم بتعليم صندوق التأكيد.',
@@ -2848,46 +2926,46 @@ $1',
 تذكر أن [[Special:UnlockDB|تزيل الغلق]] بعد اكتمال أعمال الصيانة.',
 'unlockdbsuccesstext' => 'تم إعادة فتح قاعدة البيانات',
 'lockfilenotwritable' => 'ملف غلق قاعدة البيانات لا يمكن الكتابة عليه.
-لغلق قاعدة البيانات أو إزالة الغلق يجب أن يكون هذا الملف قابلا للكتابة من قبل خادوم الوب.',
+لغلق قاعدة البيانات أو إزالة الغلق يجب أن يكون هذا الملف قابلاً للكتابة من قبل خادوم الويب.',
 'databasenotlocked' => 'قاعدة البيانات ليست مغلقة.',
 'lockedbyandtime' => '(من $1 على $2 في $3 )',
 
 # Move page
 'move-page' => 'نقل $1',
 'move-page-legend' => 'نقل صفحة',
-'movepagetext' => "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها للاسم الجديد.
+'movepagetext' => "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى لاسم الجديد.
 العنوان القديم سيصبح تحويلة للعنوان الجديد.
\8aÙ\85Ù\83Ù\86Ù\83 ØªØ­Ø¯Ù\8aØ« Ø§Ù\84تحÙ\88Ù\8aÙ\84ات Ø§Ù\84تÙ\8a ØªØ´Ù\8aر Ø¥Ù\84Ù\89 Ø§Ù\84عÙ\86Ù\88اÙ\86 Ø§Ù\84أصÙ\84Ù\8a ØªÙ\84Ù\82ائÙ\8aا.
-لو اخترت ألا تفعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].
-أنت مسؤول عن التأكد من أن الوصلات تتصل مع بعضها بشكل مناسب.
\8aÙ\85Ù\83Ù\86Ù\83 Ø£Ù\86 ØªØªØ±Ù\83 Ø§Ù\84تحÙ\88Ù\8aÙ\84ات Ø§Ù\84تÙ\8a ØªØ´Ù\8aر Ø¥Ù\84Ù\89 Ø§Ù\84عÙ\86Ù\88اÙ\86 Ø§Ù\84أصÙ\84Ù\8a Ù\83Ù\85ا Ù\87Ù\8a Ù\84تÙ\82Ù\88Ù\85 Ø§Ù\84بÙ\88تات Ø¨ØªØ­Ø¯Ù\8aØ«Ù\87ا ØªÙ\84Ù\82ائÙ\8aاÙ\8b.
+إذا اخترت أن تقوم بالتحديث يدوياً، فتأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]] وقم بتصحيحها.
+أنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.
 
-لاحظ أنه '''لن يتم''' نقل الصفحة إذا وجدت صفحة بالعنوان الجديد، إلا إذا كانت فارغة، أو تحويلة ولا تاريخ لها.
-هذا يعني أنك يمكنك استرجاع الصفحة لمكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.
+لاحظ أنه '''لن يتم''' نقل الصفحة إذا وجدت صفحة في العنوان الجديد، إلا إذا كانت فارغة أو صفحة تحويل، ولا تاريخ لها.
+هذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك نسخ هذه الصفحة فوق صفحة موجودة.
 
 '''تحذير!'''
-هذا قد يكون تغييرا كارثيا وغير متوقع لصفحة مشهورة؛
-من فضلك تأكد من فهم عواقب هذا قبل المتابعة.",
-'movepagetext-noredirectfixer' => "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها للاسم الجديد.
+هذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛
+من فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
+'movepagetext-noredirectfixer' => "باستخدام  الاستمارة بالأسفل بإمكانك أن تغير اسم الصفحة، وأن تنقل تاريخها إلى الاسم الجديد.
 العنوان القديم سيصبح تحويلة للعنوان الجديد.
-يمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائيا.
+يمكنك تحديث التحويلات التي تشير إلى العنوان الأصلي تلقائياً.
 لو اخترت ألا تفعل، تأكد من عدم وجود تحويلات [[Special:DoubleRedirects|مزدوجة]] أو [[Special:BrokenRedirects|مكسورة]].
-أنت مسؤول عن التأكد من أن الوصلات تتصل مع بعضها بشكل مناسب.
+أنت المسؤول عن التأكد من أن الوصلات تصل إلى الصفحات التي يفترض أن تصل إليها.
 
\84احظ Ø£Ù\86Ù\87 '''Ù\84Ù\86 Ù\8aتÙ\85''' Ù\86Ù\82Ù\84 Ø§Ù\84صÙ\81حة Ø¥Ø°Ø§ Ù\83اÙ\86 Ù\87Ù\86اÙ\83 ØµÙ\81حة Ø¨Ù\86Ù\81س Ø§Ù\84عÙ\86Ù\88اÙ\86 Ø§Ù\84جدÙ\8aدØ\8c Ø¥Ù\84ا Ø¥Ø°Ø§ Ù\83اÙ\86ت Ù\81ارغةØ\8c Ø£Ù\88 ØªØ­Ù\88Ù\8aÙ\84Ø© Ù\88Ù\84ا ØªØ§Ø±Ù\8aØ® Ù\84Ù\87ا.
-هذا يعني أنك يمكنك استرجاع الصفحة لمكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.
+لاحظ أنه '''لن يتم''' نقل الصفحة إذا كان هناك صفحة بنفس العنوان الجديد، إلا إذا كانت فارغة، أو تحويلة لا تاريخ لها.
+هذا يعني أنك تستطيع استرجاع الصفحة إلى مكانها لو قمت بخطأ، وأنك لا يمكنك الكتابة على صفحة موجودة.
 
 '''تحذير!'''
-هذا قد يكون تغييرا كارثيا وغير متوقع لصفحة مشهورة؛
-من فضلك تأكد من فهم عواقب هذا قبل المتابعة",
+هذا قد يكون تغييراً كارثياً وغير متوقع لصفحة مشهورة؛
+من فضلك تأكد أنك تفهم عواقب هذا الفعل قبل أن تستمر.",
 'movepagetalktext' => "صفحة النقاش المرفقة سيتم نقلها كذلك، '''إلا في حالة''':
 * توجد صفحة نقاش غير فارغة تحت العنوان الجديد، أو
 * قمت بإزالة اختيار الصندوق بالأسفل.
 
 وفي هذه الحالات، يجب عليك نقل أو دمج محتويات الصفحة يدويا، إذا رغب في ذلك.",
 'movearticle' => 'انقل الصفحة:',
-'moveuserpage-warning' => "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم <u>لن</u> يعاد تسميته.'''",
+'moveuserpage-warning' => "'''تحذير: أنت على وشك نقل صفحة مستخدم. من فضلك لاحظ أن الصفحة وحدها سوف تنقل وأن المستخدم لن يعاد تسميته.'''",
 'movenologin' => 'غير مسجل',
-'movenologintext' => 'يجب أن تكون مستخدما مسجلا وأن تقوم [[Special:UserLogin|بالدخول]] لكي تنقل صفحة.',
+'movenologintext' => 'يجب أن تكون مستخدماً مسجلاً وأن  [[Special:UserLogin|تسجل دخولك]] لكي تنقل صفحة.',
 'movenotallowed' => 'أنت لا تمتلك الصلاحية لنقل الصفحات.',
 'movenotallowedfile' => 'أنت لا تمتلك الصلاحية لنقل الملفات.',
 'cant-move-user-page' => 'أنت لا تمتلك الصلاحية لنقل صفحات المستخدم الرئيسية.',
@@ -2902,16 +2980,16 @@ $1',
 'articleexists' => 'توجد صفحة بهذا الاسم، أو أن الاسم الذي تم اختياره غير صالح.
 من فضلك اختر اسم آخر.',
 'cantmove-titleprotected' => 'لا يمكنك نقل صفحة إلى هذا الموقع، لأن العنوان الجديد تمت حمايته ضد الإنشاء',
-'talkexists' => "'''الصفحة نفسها تم نقلها بنجاح، ولكن صفحة النقاش لم يمكن نقلها لوجود صفحة مسبقا تحت العنوان الجديد.
-من فضلك ادمجهما يدويا.'''",
+'talkexists' => "'''الصفحة نفسها تم نقلها بنجاح، ولكن صفحة النقاش لم يمكن نقلها لوجود صفحة مسبقاً تحت العنوان الجديد.
+من فضلك ادمجهما يدوياً.'''",
 'movedto' => 'نُقِلت إلى',
 'movetalk' => 'انقل صفحة النقاش المرفقة',
 'move-subpages' => 'انقل الصفحات الفرعية (حتى $1)',
 'move-talk-subpages' => 'انقل الصفحات الفرعية لصفحة النقاش (حتى $1)',
-'movepage-page-exists' => 'الصفحة $1 موجودة بالفعل ولا يمكن الكتابة عليها تلقائيا.',
+'movepage-page-exists' => 'الصفحة $1 موجودة بالفعل ولا يمكن الكتابة عليها تلقائياً.',
 'movepage-page-moved' => 'نُقِلت صفحة $1 إلى $2.',
 'movepage-page-unmoved' => 'لم يمكن نقل صفحة $1 إلى $2.',
-'movepage-max-pages' => 'تم نقل الحد الأقصى وهو {{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} ولن يتم نقل المزيد تلقائيا.',
+'movepage-max-pages' => 'تم نقل الحد الأقصى وهو {{PLURAL:$1||صفحة واحدة|صفحتان|$1 صفحات|$1 صفحة}} ولن يتم نقل المزيد تلقائياً.',
 'movelogpage' => 'سجل النقل',
 'movelogpagetext' => 'بالأسفل قائمة بالصفحات التي تم نقلها.',
 'movesubpage' => '{{PLURAL:$1||الصفحة الفرعية|الصفحتان الفرعيتان|الصفحات الفرعية}}',
@@ -2929,7 +3007,7 @@ $1',
 لا يمكن نقل الصفحة على نفسها.',
 'immobile-source-namespace' => 'غير قادر على نقل الصفحات في النطاق "$1"',
 'immobile-target-namespace' => 'غير قادر على نقل الصفحات إلى النطاق "$1"',
-'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدفا صحيحا لنقل صفحة.',
+'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدفاً صالحاً لنقل صفحة.',
 'immobile-source-page' => 'هذه الصفحة غير قابلة للنقل.',
 'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
 'imagenocrossnamespace' => 'لا يمكن نقل الملف إلى نطاق غير نطاق الملفات',
@@ -2945,19 +3023,21 @@ $1',
 'move-over-sharedrepo' => '== الملف موجود ==
 [[:$1]] موجود في مستودع مشترك. نقل الملف إلى هذا العنوان سوف يلغي الملف المشترك.',
 'file-exists-sharedrepo' => 'اسم الملف الذي اخترته مستخدم من قبل في مستودع مشترك.
-من فضلك اختر اسما آخرا.',
+من فضلك اختر اسماً آخر.',
 
 # Export
 'export' => 'تصدير صفحات',
-'exporttext' => 'يمكنك تصدير النص وتاريخ تعديلات صفحة أو مجموعة صفحات في صيغة XML. هذا يمكن استيراده في ويكي آخر يستعمل ميدياويكي بواسطة الصفحة [[Special:Import|صفحة الاستيراد]].
+'exporttext' => 'يمكنك تصدير النص وتاريخ تعديلات صفحة أو مجموعة صفحات في صيغة XML.
+هذا يمكن استيراده إلى ويكي آخر يستعمل ميدياويكي بواسطة [[Special:Import|صفحة الاستيراد]].
 
\84تصدÙ\8aر ØµÙ\81حاتØ\8c Ø£Ø¯Ø®Ù\84 Ø§Ù\84عÙ\86اÙ\88Ù\8aÙ\86 Ù\81Ù\8a Ø§Ù\84صÙ\86دÙ\88Ù\82 Ø£Ø³Ù\81Ù\84Ù\87Ø\8c Ø¹Ù\86Ù\88اÙ\86 Ù\88احد Ù\81Ù\8a Ù\83Ù\84 Ø³Ø·Ø±Ø\8c Ù\85ع Ø§Ø®ØªÙ\8aار Ù\85ا Ø¥Ø°Ø§ Ù\83Ù\86ت ØªØ±ØºØ¨ Ù\81Ù\8a Ø§Ù\84Ù\86سخة Ø§Ù\84حاÙ\84Ù\8aØ© Ø¨Ø§Ù\84إضاÙ\81Ø© Ø¥Ù\84Ù\89 Ø§Ù\84Ù\86سخ Ø§Ù\84Ù\82دÙ\8aÙ\85Ø© Ù\83اÙ\85Ù\84Ø©Ø\8c Ø£Ù\88 Ù\85ع Ù\85عÙ\84Ù\88Ù\85ات ØªØ§Ø±Ù\8aØ® Ø§Ù\84صÙ\81حة Ø¹Ù\86Ù\87ا، أو فقط النسخة الحالية مع معلومات عن التعديل الأخير.
\84تصدÙ\8aر Ø§Ù\84صÙ\81حاتØ\8c Ø£Ø¯Ø®Ù\84 Ø¹Ù\86اÙ\88Ù\8aÙ\86Ù\87ا Ù\81Ù\8a Ø§Ù\84صÙ\86دÙ\88Ù\82 Ø£Ø³Ù\81Ù\84Ù\87Ø\8c Ø¹Ù\86Ù\88اÙ\86اÙ\8b Ù\88احداÙ\8b Ù\81Ù\8a Ù\83Ù\84 Ø³Ø·Ø±Ø\8c Ù\85ع Ø§Ø®ØªÙ\8aار Ù\85ا Ø¥Ø°Ø§ Ù\83Ù\86ت ØªØ±ØºØ¨ Ø¨ØªØµØ¯Ù\8aر Ø§Ù\84Ù\86سخة Ø§Ù\84حاÙ\84Ù\8aØ© Ù\85ع Ø¬Ù\85Ù\8aع Ø§Ù\84Ù\86سخ Ø§Ù\84Ù\82دÙ\8aÙ\85Ø©Ø\8c Ø£Ù\8a Ù\85ع Ù\83اÙ\85Ù\84 Ù\85عÙ\84Ù\88Ù\85ات ØªØ§Ø±Ù\8aØ® Ø§Ù\84صÙ\81حة، أو فقط النسخة الحالية مع معلومات عن التعديل الأخير.
 
-في الحالة الأخيرة يمكنك أيضا استخدام وصلة، على سبيل المثال [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] للصفحة "[[{{MediaWiki:Mainpage}}]]".',
+في الحالة الأخيرة يمكنك أيضاً استخدام وصلة، على سبيل المثال [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] للصفحة «[[{{MediaWiki:Mainpage}}]]».',
 'exportall' => 'صدّر كل الصفحات',
 'exportcuronly' => 'ضمن المراجعة الحالية فقط، وليس التاريخ الكامل',
 'exportnohistory' => "----
 ملاحظة:''' تصدير التاريخ الكامل للصفحات من خلال هذه الاستمارة تم تعطيله لأسباب تتعلق بالأداء'''",
+'exportlistauthors' => 'أضف قائمة كاملة بالمساهمين لكل صفحة',
 'export-submit' => 'صدر',
 'export-addcattext' => 'أضف صفحات من تصنيف:',
 'export-addcat' => 'أضف',
@@ -2990,6 +3070,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' => 'نوع الصورة غير مدعوم',
@@ -3026,7 +3108,7 @@ $1',
 'importnofile' => 'لم يتم رفع ملف استيراد.',
 'importuploaderrorsize' => 'رفع ملف الاستيراد فشل.
 الملف أكبر من حجم الرفع المسموح.',
-'importuploaderrorpartial' => 'رفع ملف الاستيراد فشل. الملف تم رفعه جزئيا.',
+'importuploaderrorpartial' => 'فشل رفع ملف الاستيراد. لم يتم رفع الملف إلا جزئياً.',
 'importuploaderrortemp' => 'رفع ملف الاستيراد فشل.
 هناك مجلد مؤقت مفقود.',
 'import-parse-failure' => 'فشل تحليل استيراد XML',
@@ -3038,6 +3120,9 @@ $1',
 'import-invalid-interwiki' => 'لم يمكن الاستيراد من الويكي المحدد.',
 'import-error-edit' => 'الصفحة "$1" لم يتم استيرادها لأنه لا يمكن لك تحريرها.',
 'import-error-create' => 'الصفحة "$1" لم يتم استيرادها لأنه لا يمكن لك استحداثها أصلا.',
+'import-error-interwiki' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها محجوز للربط الخارجي (interwiki).',
+'import-error-special' => 'تعذر أستيراد الصفحة "$1" لأنها تنتمي إلى مساحة إسم خاصة تمنع الصفحات.',
+'import-error-invalid' => 'تعذر أستيراد الصفحة "$1" بسبب أن إسمها غير صحيح.',
 
 # Import log
 'importlogpage' => 'سجل الاستيراد',
@@ -3050,6 +3135,13 @@ $1',
 # JavaScriptTest
 'javascripttest' => 'اختبار جافاسكربت',
 'javascripttest-disabled' => 'هذه الخاصية معطلة.',
+'javascripttest-title' => 'تشغيل أختبارات $1',
+'javascripttest-pagetext-noframework' => 'هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.',
+'javascripttest-pagetext-unknownframework' => 'إطار اختبار غير معروف "$1".',
+'javascripttest-pagetext-frameworks' => 'الرجاء اختيار أحد أطر الاختبارات التالية: $1',
+'javascripttest-pagetext-skins' => 'قم باختيار الواجهة لإجراء الإحتبارات بها:',
+'javascripttest-qunit-intro' => 'راجع [$1 وثيقة الإختبار] على mediawiki.org.',
+'javascripttest-qunit-heading' => 'جناح أختبار MediaWiki JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'صفحة المستخدم الخاصة بك',
@@ -3270,9 +3362,9 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1، $2×$3',
-'seconds-abbrev' => '$1ث',
-'minutes-abbrev' => '$1د',
-'hours-abbrev' => '$1س',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
 'seconds' => '{{PLURAL:$1||ثانية واحدة|ثانيتين|$1 ثوانٍ|$1 ثانية}}',
 'minutes' => '{{PLURAL:$1||دقيقة واحدة|دقيقتين|$1 دقائق|$1 دقيقة}}',
 'hours' => '{{PLURAL:$1||ساعة واحدة|ساعتين|$1 ساعات|$1 ساعة}}',
@@ -3292,8 +3384,8 @@ $1',
 إذا كان الملف قد عدل عن حالته الأصلية، فبعض التفاصيل قد لا تعبر عن الملف المعدل.',
 'metadata-expand' => 'أظهر التفاصيل الممتدة',
 'metadata-collapse' => 'أخفِ التفاصيل الممتدة',
-'metadata-fields' => 'Ø­Ù\82Ù\88Ù\84 Ù\85عطÙ\8aات Ø§Ù\84Ù\85Ù\8aتا Ø§Ù\84Ù\85Ù\88جÙ\88دة Ù\81Ù\8a Ù\87Ø°Ù\87 Ø§Ù\84رساÙ\84Ø© Ø³Ù\88Ù\81 ØªØ¹Ø±Ø¶ Ù\81Ù\8a ØµÙ\81حة Ø§Ù\84صÙ\88رة Ø¹Ù\86دÙ\85ا Ù\8aÙ\83Ù\88Ù\86 Ø¬Ø¯Ù\88Ù\84 Ù\85عطÙ\8aات Ø§Ù\84Ù\85Ù\8aتا Ù\85ضغÙ\88طا.
-الحقول الأخرى ستكون مخفية افتراضيا.
+'metadata-fields' => 'ستعرض Ø­Ù\82Ù\88Ù\84 Ù\85عطÙ\8aات Ø§Ù\84Ù\85Ù\8aتا Ø§Ù\84Ù\85Ù\88جÙ\88دة Ù\81Ù\8a Ù\87Ø°Ù\87 Ø§Ù\84رساÙ\84Ø© Ù\81Ù\8a ØµÙ\81حة Ø§Ù\84صÙ\88رة Ø¹Ù\86دÙ\85ا Ù\8aÙ\83Ù\88Ù\86 Ø¬Ø¯Ù\88Ù\84 Ù\85عطÙ\8aات Ø§Ù\84Ù\85Ù\8aتا Ù\85Ø·Ù\88Ù\8aاÙ\8b.
+الحقول الأخرى ستكون مخفية افتراضياً.
 * make
 * model
 * datetimeoriginal
@@ -3311,7 +3403,7 @@ $1',
 # EXIF tags
 'exif-imagewidth' => 'العرض',
 'exif-imagelength' => 'الارتفاع',
-'exif-bitspersample' => 'بت لكل مكون',
+'exif-bitspersample' => 'بت لكل مكونة',
 'exif-compression' => 'نظام الضغط',
 'exif-photometricinterpretation' => 'تركيب البكسل',
 'exif-orientation' => 'التوجيه',
@@ -3328,19 +3420,19 @@ $1',
 'exif-jpeginterchangeformatlength' => 'بايت من بيانات JPEG',
 'exif-whitepoint' => 'ألوان النقطة البيضاء',
 'exif-primarychromaticities' => 'ألوان الأساسيات',
-'exif-ycbcrcoefficients' => 'Ù\85عاÙ\85Ù\84ات Ù\85صÙ\81Ù\88Ù\81Ø© ØªØ­Ù\88Ù\8aÙ\84 Ù\81راغ اللون',
+'exif-ycbcrcoefficients' => 'Ù\85عاÙ\85Ù\84ات Ù\85صÙ\81Ù\88Ù\81Ø© ØªØ­Ù\88Ù\8aÙ\84 Ù\81ضاء اللون',
 'exif-referenceblackwhite' => 'زوج من قيم المرجع السوداء والبيضاء',
 'exif-datetime' => 'تاريخ ووقت تغيير الملف',
 'exif-imagedescription' => 'عنوان الصورة',
 'exif-make' => 'مصنع آلة التصوير',
-'exif-model' => 'نوع آلة التصوير',
+'exif-model' => 'طراز الكاميرا',
 'exif-software' => 'البرمجيات المستخدمة',
 'exif-artist' => 'المؤلف',
 'exif-copyright' => 'مالك الحقوق',
 'exif-exifversion' => 'نسخة Exif',
 'exif-flashpixversion' => 'نسخة فلاش بكس المدعومة',
-'exif-colorspace' => 'Ù\81رÙ\82 Ø§Ù\84Ù\84Ù\88ن',
-'exif-componentsconfiguration' => 'معنى كل مكون',
+'exif-colorspace' => 'Ù\81ضاء Ø§Ù\84Ø£Ù\84Ù\88ان',
+'exif-componentsconfiguration' => 'معنى كل مكونة',
 'exif-compressedbitsperpixel' => 'طور ضغط الصورة',
 'exif-pixelydimension' => 'عرض الصورة',
 'exif-pixelxdimension' => 'ارتفاع الصورة',
@@ -3443,7 +3535,7 @@ $1',
 'exif-credit' => 'الرصيد/المزود',
 'exif-source' => 'المصدر',
 'exif-editstatus' => 'الحالة التحريرية للصورة',
-'exif-urgency' => 'Ø¥Ù\84حاح',
+'exif-urgency' => 'عاجÙ\84',
 'exif-fixtureidentifier' => 'اسم العنصر',
 'exif-locationdest' => 'اسم الموقع مصورا',
 'exif-locationdestcode' => 'رمز الموقع مصورا',
@@ -3482,9 +3574,9 @@ $1',
 'exif-intellectualgenre' => 'نوع العنصر',
 'exif-subjectnewscode' => 'رمز الموضوع',
 'exif-scenecode' => 'رمز مشهد IPTC',
-'exif-event' => 'اسم الحدث مصورا',
-'exif-organisationinimage' => 'اÙ\84Ù\85Ù\86ظÙ\85Ø© Ù\85صورة',
-'exif-personinimage' => 'اÙ\84شخص Ù\85صÙ\88را',
+'exif-event' => 'الحدث في الصورة',
+'exif-organisationinimage' => 'اÙ\84Ù\85Ù\86ظÙ\85Ø© Ù\81Ù\8a Ø§Ù\84صورة',
+'exif-personinimage' => 'اÙ\84شخص Ù\81Ù\8a Ø§Ù\84صÙ\88رة',
 'exif-originalimageheight' => 'ارتفاع الصورة قبل أن تقتطع',
 'exif-originalimagewidth' => 'عرض الصورة قبل أن تقتطع',
 
@@ -3512,15 +3604,15 @@ $1',
 'exif-unknowndate' => 'تاريخ غير معروف',
 
 'exif-orientation-1' => 'عادي',
-'exif-orientation-2' => 'دار عرضيا',
-'exif-orientation-3' => 'دار 180°',
-'exif-orientation-4' => 'دار أفقيا',
-'exif-orientation-5' => 'دار 90° CCW و انزلق رأسيا',
+'exif-orientation-2' => 'مقلوبة أفقياً',
+'exif-orientation-3' => 'مدورة 180°',
+'exif-orientation-4' => 'مقلوبة رأسياً',
+'exif-orientation-5' => 'مدورة 90° عكس عقارب الساعة ومقلوبة رأسياً',
 'exif-orientation-6' => 'مدورة 90° عكس عقارب الساعة',
-'exif-orientation-7' => 'دار 90° CW و انزلق رأسيا',
+'exif-orientation-7' => 'مدورة 90° في اتجاه عقارب الساعة ومقلوبة رأسياً',
 'exif-orientation-8' => 'مدورة 90° في اتجاه عقارب الساعة',
 
-'exif-planarconfiguration-1' => 'صيغة تشنكي',
+'exif-planarconfiguration-1' => 'صيغة مكتنزة',
 'exif-planarconfiguration-2' => 'صيغة مستوية',
 
 'exif-xyresolution-i' => '$1 نقطة لكل بوصة',
@@ -3540,12 +3632,12 @@ $1',
 'exif-exposureprogram-0' => 'غير معرف',
 'exif-exposureprogram-1' => 'يدوي',
 'exif-exposureprogram-2' => 'برنامج عادي',
-'exif-exposureprogram-3' => 'أولوية الغالق',
-'exif-exposureprogram-4' => 'أولوية الإغلاق',
-'exif-exposureprogram-5' => 'برÙ\86اÙ\85ج Ø§Ù\84صÙ\86ع (Ù\8aÙ\85Ù\8aÙ\84 ØªØ¬Ø§Ù\87 عمق الحقل)',
-'exif-exposureprogram-6' => 'برنامج الفعل (يميل تجاه سرعة الغلق)',
-'exif-exposureprogram-7' => 'Ø·Ù\88ر Ø§Ù\84بÙ\88رترÙ\8aÙ\87 (Ù\84صÙ\88ر Ø§Ù\84إغÙ\84اÙ\82 Ù\85ع Ø§Ù\84Ø®Ù\84Ù\81Ù\8aØ© Ø¨Ø¹Ù\8aدا Ø¹Ù\86 Ø§Ù\84بؤرة)',
-'exif-exposureprogram-8' => 'Ø·Ù\88ر Ø§Ù\84أرضÙ\8aØ© (Ù\84صÙ\88ر Ø§Ù\84أرضية مع الخلفية في البؤرة)',
+'exif-exposureprogram-3' => 'أولوية الفتحة',
+'exif-exposureprogram-4' => 'أولوية المغلاق',
+'exif-exposureprogram-5' => 'برÙ\86اÙ\85ج Ø®Ù\84اÙ\82 (تحÙ\8aز Ù\84صاÙ\84Ø­ عمق الحقل)',
+'exif-exposureprogram-6' => 'برنامج الفعل (تحيز لصالح سرعة المغلاق)',
+'exif-exposureprogram-7' => 'أسÙ\84Ù\88ب Ø§Ù\84بÙ\88رترÙ\8aÙ\87 (تصÙ\88Ù\8aر Ù\85Ù\86 Ù\82رÙ\8aب Ù\85ع ØªØºÙ\8aÙ\8aÙ\85 Ø§Ù\84Ø®Ù\84Ù\81Ù\8aة)',
+'exif-exposureprogram-8' => 'أسÙ\84Ù\88ب Ø§Ù\84Ù\85Ù\86ظر Ø§Ù\84طبÙ\8aعÙ\8a (Ù\84صÙ\88ر Ø§Ù\84Ù\85Ù\86اظر Ø§Ù\84طبÙ\8aعية مع الخلفية في البؤرة)',
 
 'exif-subjectdistance-value' => '$1 متر',
 
@@ -3553,7 +3645,7 @@ $1',
 'exif-meteringmode-1' => 'متوسط',
 'exif-meteringmode-2' => 'متوسط موزون بالمركز',
 'exif-meteringmode-3' => 'بقعة',
-'exif-meteringmode-4' => 'Ù\85اÙ\84تÙ\8a Ø³Ø¨Ù\88ت',
+'exif-meteringmode-4' => 'Ù\85تعدد Ø§Ù\84بÙ\82ع',
 'exif-meteringmode-5' => 'نمط',
 'exif-meteringmode-6' => 'جزئي',
 'exif-meteringmode-255' => 'غير ذلك',
@@ -3602,7 +3694,7 @@ $1',
 'exif-sensingmethod-7' => 'مستشعر خطي ثلاثي',
 'exif-sensingmethod-8' => 'مستشعر لون خطي متتابع',
 
-'exif-filesource-3' => 'كاميرا رقمية واقفة',
+'exif-filesource-3' => 'كاميرا رقمية',
 
 'exif-scenetype-1' => 'صورة ملتقطة بشكل مباشر',
 
@@ -3611,14 +3703,14 @@ $1',
 
 'exif-exposuremode-0' => 'تعرض تلقائي',
 'exif-exposuremode-1' => 'تعرض يدوي',
-'exif-exposuremode-2' => 'Ø£Ù\82Ù\88اس تلقائية',
+'exif-exposuremode-2' => 'سÙ\84سÙ\84Ø© تلقائية',
 
 'exif-whitebalance-0' => 'توازن الأبيض تلقائي',
 'exif-whitebalance-1' => 'توازن الأبيض يدوي',
 
 'exif-scenecapturetype-0' => 'قياسي',
-'exif-scenecapturetype-1' => 'Ø£رضية',
-'exif-scenecapturetype-2' => 'بÙ\88رترÙ\8aÙ\87',
+'exif-scenecapturetype-1' => 'عرضية',
+'exif-scenecapturetype-2' => 'Ø·Ù\88Ù\84Ù\8aØ©',
 'exif-scenecapturetype-3' => 'مشهد ليلي',
 
 'exif-gaincontrol-0' => 'لا شيء',
@@ -3632,8 +3724,8 @@ $1',
 'exif-contrast-2' => 'قاسي',
 
 'exif-saturation-0' => 'عادي',
-'exif-saturation-1' => 'تشبع Ù\82Ù\84Ù\8aÙ\84',
-'exif-saturation-2' => 'تشبع Ø¹Ø§Ù\84Ù\8a',
+'exif-saturation-1' => 'إشباع Ù\85Ù\86Ø®Ù\81ض',
+'exif-saturation-2' => 'إشباع Ù\85رتÙ\81ع',
 
 'exif-sharpness-0' => 'عادي',
 'exif-sharpness-1' => 'ناعم',
@@ -3641,8 +3733,8 @@ $1',
 
 'exif-subjectdistancerange-0' => 'غير معروف',
 'exif-subjectdistancerange-1' => 'ماكرو',
-'exif-subjectdistancerange-2' => 'رؤÙ\8aØ© Ù\82رÙ\8aبة',
-'exif-subjectdistancerange-3' => 'رؤÙ\8aØ© Ø¨Ø¹Ù\8aدة',
+'exif-subjectdistancerange-2' => 'صÙ\88رة Ù\85Ù\86 Ù\82رÙ\8aب',
+'exif-subjectdistancerange-3' => 'صÙ\88رة Ù\85Ù\86 Ø¨Ø¹Ù\8aد',
 
 # Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
 'exif-gpslatitude-n' => 'دائرة العرض الشمالية',
@@ -3723,7 +3815,7 @@ $1',
 'exif-urgency-normal' => 'عادي ($1)',
 'exif-urgency-low' => 'منخفض ( $1 )',
 'exif-urgency-high' => 'عالي ( $1 )',
-'exif-urgency-other' => 'الأولوية المعرفة من قبل المستخدم ($1)',
+'exif-urgency-other' => 'الأولوية محددة من قبل المستخدم ($1)',
 
 # External editor support
 'edit-externally' => 'عدل هذا الملف باستخدام تطبيق خارجي',
@@ -3738,18 +3830,18 @@ $1',
 # E-mail address confirmation
 'confirmemail' => 'تأكيد عنوان البريد الإلكتروني',
 'confirmemail_noemail' => 'ليس لديك عنوان بريد إلكتروني صحيح مسجل في [[Special:Preferences|تفضيلاتك]].',
-'confirmemail_text' => '{{SITENAME}} Ù\8aتطÙ\84ب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
-اضغط على زر التفعيل بالأسفل ليتم إرسال رسالة تأكيد لعنوانك.
+'confirmemail_text' => '{{SITENAME}} Ù\8aجب تأكيد عنوانك الإلكتروني قبل استخدام خصائص البريد الإلكتروني.
+اضغط على زر التفعيل بالأسفل ليتم إرسال رسالة تأكيد إلى عنوانك.
 ستتضمن الرسالة رمز تفعيل؛
 اضغط على الوصلة التي تحتوي الرمز لتأكيد أن عنوانك الإلكتروني صحيح.',
-'confirmemail_pending' => 'تÙ\85 Ø¥Ø±Ø³Ø§Ù\84 Ù\83Ù\88د Ø§Ù\84تأÙ\83Ù\8aد Ø¨Ø§Ù\84Ù\81عÙ\84 Ù\85Ù\86 Ù\82بÙ\84 Ø¥Ù\84Ù\89 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a؛
-إذا كان حسابك قد تم عمله حالا، ربما يجب أن تنتظر بضع دقائق قبل طلبك لكود آخر.',
+'confirmemail_pending' => 'تÙ\85 Ø¥Ø±Ø³Ø§Ù\84 Ù\83Ù\88د Ø§Ù\84تأÙ\83Ù\8aد Ø¥Ù\84Ù\89 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ù\85ؤخراÙ\8b؛
+إذا كنت قد أنشأت حسابك للتو، من الأفضل أن تنتظر بضع دقائق قبل أن تطلب كوداً آخر.',
 'confirmemail_send' => 'أرسل كود تأكيد',
 'confirmemail_sent' => 'تم إرسال رسالة التأكيد، شكرا لك.',
-'confirmemail_oncreate' => 'تم إرسال كود تأكيد لعنوان بريدك الإلكتروني.
-لا يشترط أن تستخدم الكود للدخول للموسوعة باسمك، ولكن يجب أن تقوم بإدخاله قبل استخدامك أيا من خواص البريد الإلكتروني المستخدمة هنا في الويكي.',
+'confirmemail_oncreate' => 'تم إرسال كود تأكيد إلى عنوان بريدك الإلكتروني.
+الكود غير مطلوب للدخول إلى الموسوعة باسمك، ولكن يجب إدخاله قبل استخدامك أياً من خواص البريد الإلكتروني المستخدمة هنا في الويكي.',
 'confirmemail_sendfailed' => 'لم يتمكن {{SITENAME}} من إرسال رسالة التأكيد إليك.
\85Ù\86 Ù\81ضÙ\84Ù\83 Ø§Ù\84تÙ\85س Ø¹Ù\86Ù\88اÙ\86 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø¨Ø§Ø­Ø«Ø§ عن حروف غير صحيحة.
\85Ù\86 Ù\81ضÙ\84Ù\83 ØªØ£Ù\83د Ù\85Ù\86 Ø¹Ù\86Ù\88اÙ\86 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø¨Ø­Ø«Ø§Ù\8b عن حروف غير صحيحة.
 
 أرجع خادم البريد: $1',
 'confirmemail_invalid' => 'كود تأكيد غير صحيح.
@@ -3955,7 +4047,7 @@ $5
 'hebrew-calendar-m6-gen' => 'أدار',
 'hebrew-calendar-m6a-gen' => 'أدار الأول',
 'hebrew-calendar-m6b-gen' => 'أدار الثاني',
-'hebrew-calendar-m7-gen' => 'Ù\86Ù\8aزاÙ\86',
+'hebrew-calendar-m7-gen' => 'Ù\86Ù\8aساÙ\86/أبرÙ\8aÙ\84',
 'hebrew-calendar-m8-gen' => 'أيار',
 'hebrew-calendar-m9-gen' => 'سيفان',
 'hebrew-calendar-m10-gen' => 'تموز',
@@ -3964,7 +4056,7 @@ $5
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|نقاش]])',
-'timezone-utc' => 'ت Ø¹ Ù\85',
+'timezone-utc' => 'باÙ\84تÙ\88Ù\82Ù\8aت Ø§Ù\84عاÙ\84Ù\85Ù\8a',
 
 # Core parser functions
 'unknown_extension_tag' => 'وسم امتداد غير معروف "$1"',
@@ -3987,7 +4079,7 @@ $5
 'version-hook-name' => 'اسم الخطاف',
 'version-hook-subscribedby' => 'يستخدم بواسطة',
 'version-version' => '(نسخة $1)',
-'version-svn-revision' => '(&رلم;r$2)',
+'version-svn-revision' => '(r$2)',
 'version-license' => 'الرخصة',
 'version-poweredby-credits' => "تدار هذه الويكي ب'''[//www.mediawiki.org/ ميدياويكي]''', حقوق النشر © 2001-$1 $2.",
 'version-poweredby-others' => 'آخرون',
@@ -3999,6 +4091,9 @@ $5
 'version-software' => 'البرنامج المثبت',
 'version-software-product' => 'المنتج',
 'version-software-version' => 'النسخة',
+'version-entrypoints' => 'نقطة دخول روابط المواقع',
+'version-entrypoints-header-entrypoint' => 'تقطة دخول',
+'version-entrypoints-header-url' => 'المسار',
 
 # Special:FilePath
 'filepath' => 'مسار ملف',
@@ -4125,6 +4220,8 @@ $5
 '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 حساب مستخدم',
 'logentry-newusers-create' => 'أنشأ $1 حساب مستخدم',
 'logentry-newusers-create2' => 'أنشأ $1 حساب المستخدم $3',
@@ -4132,6 +4229,8 @@ $5
 'newuserlog-byemail' => 'كلمة السر تم إرسالها بواسطة البريد الإلكتروني',
 
 # Feedback
+'feedback-bugornote' => 'إن كنت مستعدا لشرح  مشكلة تقنية بالتفصيل، رجاءا [$1 قدم تقريرا بالخلل].
+بخلاف ذلك، يمكنك أستخدام الطريقة الأسهل أسفله، سيتم إضافة تعليقك للصفحة "[$3 $2]"، بالإضافة إلى اسم المستخدم و نوع المتصفح الذي تستخدمه حاليا.',
 'feedback-subject' => 'الموضوع:',
 'feedback-message' => 'الرسالة:',
 'feedback-cancel' => 'ألغِ',
@@ -4154,6 +4253,7 @@ $5
 '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' => 'اسم الملف قصير جدا.',
@@ -4182,4 +4282,15 @@ $5
 'api-error-uploaddisabled' => 'تم تعطيل تحميل على هذا الويكي.',
 'api-error-verification-error' => 'هذا الملف قد يكون معطوباً أو يحتوي على ملحق غير صحيح.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
+'duration-minutes' => '{{PLURAL:$1|أقل من دقيقة|دقيقة واحدة|دقيقتان|$1 دقائق|$1 دقيقة}}',
+'duration-hours' => '({{PLURAL:$1||ساعة واحد|ساعتان|$1 ساعات|$1 ساعة}})',
+'duration-days' => '{{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يومًا|$1 يوم}}',
+'duration-weeks' => '{{PLURAL:$1||أسبوع واحد|أسبوعان|$1 أسابيع|$1 أسبوعًا|$1 أسبوع}}',
+'duration-years' => '{{PLURAL: $1||سنة واحدة|سنتان|$1 سنين|$1 سنة}}',
+'duration-decades' => '{{PLURAL: $1||عقد واحد|عقدان|$1 عقود|$1 عقدًا|$1 عقد}}',
+'duration-centuries' => '{{PLURAL: $1||قرن واحد|قرنان|$1 قرون|$1 قرنًا|$1 قرن}}',
+'duration-millennia' => '{{PLURAL: $1||ألفية واحدة|ألفيتان|$1 ألفيات|$1 ألفية}}',
+
 );
index 14859c6..650f199 100644 (file)
@@ -43,20 +43,28 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'ܡܦܠܚܢ̈ܐ_ܙܪ̄ܝܙܐ' ),
        'Allmessages'               => array( 'ܟܠ_ܐܓܪ̈ܬܐ' ),
        'Allpages'                  => array( 'ܟܠ_ܦܐܬܬ̈ܐ' ),
+       'Badtitle'                  => array( 'ܟܘܢܝܐ_ܠܐ_ܛܒܐ' ),
        'Blankpage'                 => array( 'ܦܐܬܐ_ܣܦܝܩܬܐ' ),
        'Categories'                => array( 'ܣܕܪ̈ܐ' ),
        'Contributions'             => array( 'ܫܘܬܦܘܝܬ̈ܐ' ),
        'CreateAccount'             => array( 'ܒܪܝ_ܚܘܫܒܢܐ' ),
        'DeletedContributions'      => array( 'ܫܘܬܦܘܝܬ̈ܐ_ܫܝܦܬ̈ܐ' ),
        'Filepath'                  => array( 'ܫܒܝܠܐ_ܕܦܐܬܐ' ),
-       'Log'                       => array( 'ܣܓܠ̈ܐ' ),
+       'Log'                       => array( 'ܣܓܠܐ', 'ܣܓܠ̈ܐ' ),
+       'Lonelypages'               => array( 'ܦܐܬܬ̈ܐ_ܝܬܡܬ̈ܐ' ),
        'Longpages'                 => array( 'ܦܐܬܬ̈ܐ_ܐܪ̈ܝܟܬܐ' ),
        'Movepage'                  => array( 'ܫܢܝ_ܦܐܬܐ' ),
        'Mycontributions'           => array( 'ܫܘܬܦܘܝܬ̈ܝ' ),
+       'Mypage'                    => array( 'ܦܐܬܐ_ܕܝܠܝ' ),
+       'Mytalk'                    => array( 'ܡܡܠܠܐ_ܕܝܠܝ' ),
+       'Myuploads'                 => array( 'ܐܣܩܬ̈ܐ_ܕܝܠܝ' ),
+       'Newimages'                 => array( 'ܠܦܦ̈ܐ_ܚܕ̈ܬܐ', 'ܨܘܪ̈ܬܐ_ܚܕ̈ܬܬܐ' ),
        'Newpages'                  => array( 'ܦܐܬܬ̈ܐ_ܚܕ̈ܬܬܐ' ),
-       'Preferences'               => array( 'ܓܒܝܬ̈ܐ' ),
+       'PermanentLink'             => array( 'ܐܣܘܪܐ_ܦܝܘܫܐ' ),
+       'Preferences'               => array( 'ܨܒܝܢܝܘܬ̈ܐ' ),
        'Protectedpages'            => array( 'ܦܐܬܬ̈ܐ_ܢܛܝܪ̈ܬܐ' ),
        'Protectedtitles'           => array( 'ܟܘܢܝ̈ܐ_ܢܛܝܪ̈ܐ' ),
        'Recentchanges'             => array( 'ܫܘܚܠܦ̈ܐ_ܚܕ̈ܬܐ' ),
@@ -64,6 +72,7 @@ $specialPageAliases = array(
        'Shortpages'                => array( 'ܦܐܬܬ̈ܐ_ܟܪ̈ܝܬܐ' ),
        'Specialpages'              => array( 'ܦܐܬܬ̈ܐ_ܕ̈ܝܠܢܝܬܐ' ),
        'Upload'                    => array( 'ܐܣܩ' ),
+       'Version'                   => array( 'ܨܚܚܐ' ),
        'Watchlist'                 => array( 'ܪ̈ܗܝܬܐ' ),
        'Whatlinkshere'             => array( 'ܡܐ_ܐܣܪ_ܠܗܪܟܐ' ),
 );
@@ -97,7 +106,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ܪܫÜ\98Ü¡ Ü£ÜªÜ\9bÜ\90 Ü¬Ü\9aÜ\9dܬ Ü\90Ü£Ü\98ܪÜ\90:',
+'tog-underline' => 'ܪܫܘܡ ܣܪܛܐ ܬܚܝܬ ܐܣܪܐ:',
 'tog-justify' => 'ܫܘܐ ܦܬܓܡ̈ܐ',
 'tog-hideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'tog-editondblclick' => 'ܫܚܠܦ ܦܐܬ̈ܐ ܬܪ ܢܩܪܐ ܙܘܓܢܝܐ (ܣܢܝܩ ܠ JavaScript)',
@@ -199,7 +208,7 @@ $messages = array(
 'qbbrowse' => 'ܡܦܐܬ',
 'qbedit' => 'ܫܚܠܦ',
 'qbpageoptions' => 'ܗܕܐ ܦܐܬܐ',
-'qbmyoptions' => 'Ü\93Ü\92Ü\9dܬÌ\88ܝ',
+'qbmyoptions' => 'ܦÜ\90ܬܬÌ\88Ü\90 Ü\95Ü\9dÜ ܝ',
 'qbspecialpages' => 'ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
 'faq' => 'ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ',
 'faqpage' => 'Project:ܫܘܐܠ̈ܐ ܬܢܝ̈ܐ',
@@ -275,9 +284,9 @@ $messages = array(
 'jumpto' => 'ܫܘܪ ܠ:',
 'jumptonavigation' => 'ܐܠܦܪܘܬܐ',
 'jumptosearch' => 'ܒܨܝܐ',
-'view-pool-error' => 'ܬÜ\98Ü\9dÜ\9aÜ\90Ø\8c Ü\9aÜ\95Ü¡Ì\88Ü\90 Ü\97Ü\98Ü\90 Ü\93Ü\97̈ܝܐ ܗܫܐܝܬ
-Ü£Ü\93Ü\9d Ü¡Ü¦Ü Ü\9aÜ¢Ì\88Ü\90 Ü©Ü«Ü\95Ü\98ܪÜ\90 Ü Ü¡Ü\9bÜ\90 Ü Ü\97Ü¢Ü\90 Ü¦Ü\90ܬܐ
-ܦÜ\9dÜ£Ü\90 Ü¡Ü¢Ü\9f Ü£Ü\9fÜ\9d Ü©Ü Ü\9dÜ  Ü¡Ü¢ Ü©Ü\95Ü¡ Ü\95Ü\93ܪÜ\92ܬ Ü Ü¡Ü\9bÜ\9dÜ\90 Ü Ü\90Ü\97Ü\90 Ü¦Ü\90ܬÜ\90 Ü¬Ü¢Ü\9dÜ¢Ü\98ܬ.
+'view-pool-error' => 'Ü«Ü\98Ü\92Ü©Ü¢Ü\90Ø\8c Ü¬Ü«Ü¡Ü«Ü¬Ì\88Ü\90 Ü\90Ü¢Ü\98Ü¢ Ü Ü\90̈ܝܐ ܗܫܐܝܬ
+Ü£Ü\93Ü\9d Ü¡Ü¦Ü Ü\9aÜ¢Ì\88Ü\90 Ü¢Ü£Ü\9dÜ¢ Ü Ü\9aÜ\99Ü\9dÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü\97Ü\95ܐ
+ܦÜ\9dÜ£Ü\90 Ü¡Ü¢Ü\9f Ü£Ü\9fÜ\9d Ü©Ü Ü\9dÜ  Ü¡Ü¢ Ü©Ü\95Ü¡ Ü\95ܬܢܣÜ\90 Ü Ü¡Ü\9bÜ\9dÜ\90 Ü Ü¦Ü\90ܬÜ\90 Ü\97Ü\95Ü\90 Ü\99Ü\92ܢܬÜ\90 Ü\90Ü\9aܪܬÜ\90.
 
 $1',
 'pool-timeout' => 'ܫܠܡ ܥܕܢܐ ܣܒܪܬܐ ܠܚܠܩܐ',
@@ -325,6 +334,7 @@ $1',
 'restorelink' => '{{PLURAL:$1|ܚܕ ܫܘܚܠܦܐ ܫܝܦܐ|$1 ܫܘܚܠܦ̈ܐ ܫܝܦ̈ܐ}}',
 'site-atom-feed' => '$1 ܛܥܝܡܘܬܐ ܕܐܛܘܡ',
 'page-atom-feed' => '"$1" ܛܥܝܡܘܬܐ ܕܐܛܘܡ',
+'feed-atom' => 'ܐܛܘܡ',
 'red-link-title' => '$1 (ܦܐܬܐ ܗܕܐ ܠܝܬ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
@@ -347,36 +357,39 @@ $1',
 'error' => 'ܦܘܕܐ',
 'databaseerror' => 'ܦܘܕܐ ܒܐܣ ܝܕ̈ܥܬܐ',
 'missingarticle-rev' => '(ܬܢܝܬܐ#: $1)',
-'missingarticle-diff' => '(ܦܪÜ\9dÜ«Ü\98ܬܐ: $1, $2)',
+'missingarticle-diff' => '(ܦÜ\98ܪܫܐ: $1, $2)',
 'internalerror' => 'ܦܘܕܐ ܓܘܝܐ',
 'internalerror_info' => 'ܦܘܕܐ ܓܘܝܐ: $1',
 'badtitle' => 'ܟܘܢܝܐ ܠܐ ܛܒܐ',
+'perfcached' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܕܠܐ ܢܗܘܢ ܚܘ̈ܕܬܐ. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$1|ܚܕ ܦܠܛܐ|$1 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
+'perfcachedts' => 'ܓܠܝܬ̈ܐ ܗܠܝܢ ܐܣܢܝܢ ܐܢܘܢ ܘܚܘܕܬܐ ܐܚܪܝܐ ܗܘܐ ܒ $1. ܡܬܚܐ ܥܠܝܐ ܕ {{PLURAL:$4|ܚܕ ܦܠܛܐ|$4 ܦܠܛ̈ܐ}} ܐܝܬ ܒܐܣܢܐ.',
 'viewsource' => 'ܚܙܝ ܡܒܘܥܐ',
-'actionthrottled' => 'ܠܐ ܘܪܕ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܐܗܐ ܥܒܕܐ',
-'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܠܚܙܝܐ ܘܢܣܚܐ ܠܡܒܘܥ̈ܐ ܕܐܗܐ ܦܐܬܐ:',
-'protectedinterface' => 'ܐܗܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܠܗ ܢܛܪܬܐ ܠܡܘܢܥܐ ܚܪܒܐ.',
-'editinginterface' => "''ܙܘܗܪܐ:''' ܐܢܬ ܥܒܕܬ ܫܚܠܦܬܐ ܒܦܐܬܐ ܡܬܦܠܚܬ ܠܡܘܬܘܪ̈ܐ ܦܐܬܘܬ̈ܐ ܟܬܝܒ̈ܐ ܠܚܘܪܙܐ.
-ܟܠ ܫܘܚܠܦܐ ܒܐܗܐ ܦܐܬܐ ܒܕ ܥܒܕ ܟܪ ܥܠ ܡܚܙܝܬܐ ܦܐܬܐ ܕܡܦܠܚܢܐ ܠܡܦܠܚܢ̈ܐ ܐܚܪ̈ܝܢܐ.
-ܠܬܘܪ̈ܓܡܐ، ܡܦܠܚ ܬܪܡܝܬܐ ܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
+'viewsource-title' => 'ܚܙܝ ܡܒܘܥܐ ܕ $1',
+'actionthrottled' => 'ܠܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗܝ ܠܡܥܒܕ ܝܬܝܪ ܡܢ ܗܢܐ ܥܒܕܐ',
+'viewsourcetext' => 'ܡܨܐ ܐܢܬ ܕܢܚܙܐ ܘܢܣܚܐ ܠܡܒܘ̈ܥܐ ܕܗܕܐ ܦܐܬܐ:',
+'protectedinterface' => 'ܗܕܐ ܦܐܬܐ ܡܘܬܪܐ ܟܬܝܒܬܐ ܕܦܐܬܐ ܠܚܘܪܙܐ, ܘܐܝܬܝܗܝ ܢܛܪܬܐ ܠܡܘܢܥ ܚܘܒܠܐ.',
+'editinginterface' => "'''ܙܘܗܪܐ:''' ܐܢܬ ܫܚܠܦܬ ܦܐܬܐ ܕܡܬܦܠܚܬ ܒܚܙܝܐ ܟܬܝܒܝܐ ܕܚܘܪܙܐ.
+ܟܠ ܫܘܚܠܦܐ ܒܦܐܬܐ ܗܕܐ ܢܗܘܐ ܠܗ ܡܥܒܕܢܘܬܐ ܥܠ ܐܣܟܡܐ ܕܦܐܬܐ ܕܡܦܠܚܢܐ ܕܡܦܠܚܢ̈ܐ ܐܚܪ̈ܢܐ.
+ܠܬܘܪ̈ܓܡܐ، ܐܦܠܚ ܬܪܡܝܬܐ ܕܬܘܪܓܡܐ ܕܡܝܕܝܐܘܝܩܝ [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
 'sqlhidden' => '(ܒܘܬܬܐ SQL ܛܫܝܐ)',
 'namespaceprotected' => "ܠܝܬ ܠܟ ܦܣܣܐ ܠܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܚܩܠܐ ܕ'''$1'''.",
 
 # Login and logout pages
 'logouttext' => "'''ܗܫܐ ܦܠܛܠܟ ܡܢ ܚܘܫܒܢܟ.'''
 
-ܡܨÜ\90 Ü\90ܢܬ Ü\95Ü\90ܬÜ\9aÜ«Ü\9a {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
+ܡܨÜ\90 Ü\90ܢܬ Ü\90ܦܠÜ\9aܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
-ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
+ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
 'welcomecreation' => '== ܒܫܝܢܐ, $1! ==
 ܐܬܒܪܝ ܚܘܫܒܢܟ.
-Ü Ü\90 Ü¢Ü«Ü\90 Ü\90ܢܬ Ü Ü«Ü\9aܠܦܬÜ\90 Ü\95[[Special:Preferences|Ü\93Ü\92Ü\9dܬ̈ܐ ܒ {{SITENAME}}]].',
+Ü Ü\90 Ü¢Ü«Ü\90 Ü\90ܢܬ Ü Ü«Ü\9aܠܦܬÜ\90 Ü\95[[Special:Preferences|ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬ̈ܐ ܒ {{SITENAME}}]].',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
 'remembermypassword' => 'ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})',
 'login' => 'ܥܘܠ',
 'nav-login-createaccount' => 'ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ',
-'loginprompt' => 'Ü\90ܠܨÜ\90 Ü Ü¡Ü¦Ü\90ܬܢÜ\90 Ü\95Ü\9dÜ Ü\9f Ü\95ܣܡÜ\9f Ü Ü©Ü\98Ü©Ü\9dÜ\99 (cookies) Ü Ü¥Ü Ü Ü¬Ü\90 Ü  {{SITENAME}}.',
+'loginprompt' => 'Ü\90ܠܨÜ\90 Ü Ü¡Ü¦Ü\90ܬܢÜ\90 Ü\95Ü\9dÜ Ü\9f Ü\95ܣܡÜ\9f Ü Ü©Ü\98Ü©Ü\9dÜ\99 (cookies) Ü Ü¥Ü Ü Ü¬Ü\90 Ü\92 {{SITENAME}}.',
 'userlogin' => 'ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ',
 'userloginnocreate' => 'ܥܘܠ',
 'logout' => 'ܦܠܘܛ',
@@ -438,10 +451,10 @@ $1',
 
 # Edit pages
 'summary' => 'ܦܣܝܩܬ̈ܐ ܕܫܘܚܠܦܐ:',
-'subject' => 'Ü¡Ü Ü\98Ü\90Ü\90¦ÜªÜ«Ü\93Ü¢ܐ ܪܫܝܐ:',
+'subject' => 'Ü¡Ü Ü\98Ü\90Ü\90¡Ü\98ܢܥܐ ܪܫܝܐ:',
 'minoredit' => 'ܗܢܐ ܗܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'watchthis' => 'ܪܗܝ ܦܐܬܐ ܗܕܐ',
-'savearticle' => 'Ü Ü\92Ü\98Ü\9f Ü\95ܦܐ',
+'savearticle' => 'Ü Ü\92Ü\98Ü\9f Ü¦Ü\90ܬܐ',
 'preview' => 'ܚܝܪܐ ܩܕܡܝܐ',
 'showpreview' => 'ܚܘܝ ܚܝܪܐ ܩܕܡܝܐ',
 'showlivepreview' => 'ܚܝܪܐ ܩܕܡܝܐ ܚܝܐ',
@@ -456,15 +469,22 @@ $1',
 'loginreqlink' => 'ܥܘܠ',
 'accmailtitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܫܕܪܬ',
 'newarticle' => '(ܚܕܬܐ)',
+'newarticletext' => "ܐܬܬ ܒܬܪ ܐܣܪܐ ܕܦܐܬܐ ܕܠܐ ܐܬܬܣܝܡܬ ܥܕܡܫ.
+ܠܣܘܝܡܐ ܕܦܐܬܐ ܗܕܐ, ܫܪܝ ܠܟܬܒܬܐ ܒܣܢܕܘܩܐ ܠܬܚܬ (ܚܙܝ [[{{MediaWiki:Helppage}}|ܦܐܬܐ ܕܥܘܕܪܢܐ]] ܠܐܚܪܢܐ ܝܕ̈ܥܬܐ).
+ܐܢ ܐܬܬ ܠܗܪܟܐ ܦܘܕܐܝܬ, ܕܘܫ ܠܦܪܡܝܬܐ ܕ '''ܠܒܣܬܪ back''' ܒܡܦܐܬܢܐ ܕܝܠܟ.",
 'updated' => '(ܐܬܚܕܬ)',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
-'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''. ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
+'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
+ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
+'continue-editing' => 'ܐܓܡܪ ܠܫܘܚܠܦܐ',
 'editing' => 'ܫܚܠܦܬܐ ܕ $1',
+'creating' => 'ܣܘܝܡܐ ܕ $1',
 'editingsection' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ)',
 'editingcomment' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ ܚܕܬܐ)',
 'yourtext' => 'ܟܬܒܬܐ ܕܝܠܟ',
+'storedversion' => 'ܬܢܝܬ̈ܐ ܐܣܝܢ̈ܐ',
 'editingold' => "'''ܙܘܗܪܐ: ܫܚܠܦ ܐܢܬ ܬܢܝܬܐ ܥܬܝܩܬܐ ܕܦܐܬܐ ܗܕܐ.'''
-ܐܢ ܠܒܟ ܐܢܬ ܦܐܬܐ ܗܕܐ, ܟܠ ܫܘܚܠܦܐ ܕܥܒܕ ܒܬܪ ܟܢ ܐܬܛܠܩܬ.",
+ܐܢ ܠܒܟ ܐܢܬ ܦܐܬܐ ܗܕܐ, ܟܠ ܫܘ̈ܚܠܦܐ ܕܐܬܥܒܕܘ ܒܬܪ ܗܕܐ ܬܢܝܬܐ ܢܬܛܠܩܘܢ.",
 'yourdiff' => 'ܦܪ̈ܝܫܘܝܬܐ',
 'templatesused' => '{{PLURAL:$1|ܩܠܒܐ|ܩܠܒ̈ܐ}} ܒܦܐܬܐ ܗܕܐ:',
 'template-protected' => '(ܢܛܝܪܐ)',
@@ -497,9 +517,9 @@ $1',
 'last' => 'ܩܕܡ',
 'page_first' => 'ܩܕܡܝܐ',
 'page_last' => 'ܐܚܪܝܐ',
-'histlegend' => "Ü\93Ü\92Ü\9dÜ\90 Ü\95ܦܪÜ\9dÜ«Ü\98ܬÜ\90: Ü\93Ü\92Ü\9d Ü£Ü¢Ü\95Ì\88Ü\98Ü©Ü\90 Ü\95ܬܢÜ\9dܬÌ\88Ü\90 Ü Ü¦Ü\98Ü\9aÜ¡Ü\90 Ü\98Ü\95Ü\98Ü« '''Enter''' Ü\90Ü\98 '''ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dܬ ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ'''.<br />
-Ü©Ü Ü\9dÜ\95Ü\90: '''({{int:cur}})''' = Ü¦ÜªÜ\9dÜ«Ü\98ܬܐ ܥܡ ܬܢܝܬܐ ܗܫܝܬܐ,
-'''({{int:last}})''' = Ü¦ÜªÜ\9dÜ«Ü\98ܬܐ ܥܡ ܬܢܝܬܐ ܩܕܝܡܬܐ, '''{{int:minoreditletter}}''' = ܫܘܚܠܦܐ ܙܥܘܪܐ.",
+'histlegend' => "Ü\93Ü\92Ü\9dÜ\90 Ü\95ܦÜ\98ܪܫÜ\90: Ü\93Ü\92Ü\9d Ü£Ü¢Ü\95Ì\88Ü\98Ü©Ü\90 Ü\95ܬܢÜ\9dܬÌ\88Ü\90 Ü Ü¦Ü\98Ü\9aÜ¡Ü\90 Ü\98Ü\95Ü\98Ü« '''Enter''' Ü\90Ü\98 '''ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dÜ¢Ü\9d ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ'''.<br />
+Ü©Ü Ü\9dÜ\95Ü\90: '''({{int:cur}})''' = Ü¦Ü\98ܪܫܐ ܥܡ ܬܢܝܬܐ ܗܫܝܬܐ,
+'''({{int:last}})''' = Ü¦Ü\98ܪܫܐ ܥܡ ܬܢܝܬܐ ܩܕܝܡܬܐ, '''{{int:minoreditletter}}''' = ܫܘܚܠܦܐ ܙܥܘܪܐ.",
 'history-fieldset-title' => 'ܡܦܐܬ ܬܫܥܝܬܐ',
 'history-show-deleted' => 'ܫܝܦܬ̈ܐ ܒܠܚܘܕ',
 'histfirst' => 'ܩܕܝܡ ܟܠ',
@@ -551,18 +571,20 @@ $1',
 'revertmerge' => 'ܒܛܘܠ ܚܒܛܐ',
 
 # Diffs
-'history-title' => 'ܬܫܥܝܬܐ ܕܬܢܝܬܐ ܕ "$1"',
-'difference' => '(ܦܪܝܫܘܬܐ ܒܝܬ ܬܢܝܬ̈ܐ)',
+'history-title' => '"$1": ܬܫܥܝܬܐ ܕܬܢܝܬܐ',
+'difference-title' => '«$1»: ܦܘܪܫܐ ܒܝܢܝ ܬܢܝܬ̈ܐ',
+'difference-title-multipage' => '«$1» ܘ«$2»: ܦܘܪܫܐ ܒܝܢܝ ܬܢܝܬ̈ܐ',
+'difference-multipage' => '(ܦܘܪܫܐ ܒܝܢܝ ܦܐܬܬ̈ܐ)',
 'lineno' => 'ܣܪܛܐ $1:',
-'compareselectedversions' => 'ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dܬ ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
+'compareselectedversions' => 'ܦÜ\9aÜ\98Ü¡ Ü\92Ü\9dÜ¢Ü\9d  ܬܪܝܢ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'showhideselectedversions' => 'ܚܘܝ/ܛܫܝ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'editundo' => 'ܠܐ ܬܥܒܕ',
 'diff-multi' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|$2 ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|One ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ ܝܬܝܪ ܡܢ $2 {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
 
 # Search results
-'searchresults' => 'ܦܠÜ\9bÌ\88Ü\90 Ü\95Ü\92Ü\98ܨÜ\9dÜ\90',
-'searchresults-title' => 'ܦܠÜ\9bÌ\88Ü\90 Ü\95Ü\92Ü\98ܨÜ\9dÜ\90 Ü¥Ü  "$1"',
+'searchresults' => 'ܦܠܛ̈ܐ ܕܒܨܝܐ',
+'searchresults-title' => 'ܦܠܛ̈ܐ ܕܒܨܝܐ ܥܠ "$1"',
 'searchresulttext' => 'ܠܝܬܝܪ ܝܕ̈ܥܬܐ ܥܠ ܒܨܝܐ ܒ {{SITENAME}}, ܚܙܝ [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'ܒܨܐ ܐܢܬ ܥܠ \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|ܟܠ ܦܐܬܬ̈ܐ ܕܫܪܝܢ ܒ"$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ܟܠ ܦܐܬܬ̈ܐ ܕܐܣܪܝܢ ܥܡ "$1"]])',
 'searchsubtitleinvalid' => "ܒܨܐ ܐܢܬ ܥܠ '''$1'''",
@@ -576,7 +598,7 @@ $1',
 'nextn-title' => '$1 {{PLURAL:$1|ܦܠܛܐ ܐܚܪܢܐ|ܦܠܛ̈ܐ ܐܚܪ̈ܢܐ}}',
 'shown-title' => 'ܚܘܝ $1 {{PLURAL:$1|ܦܠܛܐ|ܦܠܛ̈ܐ}} ܠܟܠ ܦܐܬܐ',
 'viewprevnext' => 'ܚܘܝ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\92Ü\98ܨÜ\9dÜ\90',
+'searchmenu-legend' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'searchmenu-exists' => "'''ܐܝܬ ܦܐܬܐ ܒܫܡ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ'''",
 'searchmenu-new' => "'''ܒܪܝ ܦܐܬܐ \"[[:\$1]]\" ܥܠ ܗܢܐ ܘܝܩܝ!'''",
 'searchhelp-url' => 'Help:ܚܒܝܫܬ̈ܐ',
@@ -602,7 +624,7 @@ $1',
 'searchall' => 'ܟܠ',
 'showingresults' => "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|ܦܠܛܐ '''$1''' ܡܢ '''$3'''|ܦܠܛ̈ܐ '''$1 - $2''' ܡܢ '''$3'''}} ܠ'''$4'''",
-'search-nonefound' => 'ܠܝܬ ܦܠܛ̈ܐ ܐܘܝ ܠܗܢܐ ܒܨܝܐ.',
+'search-nonefound' => 'ܠܝܬ ܦܠܛ̈ܐ ܐܘܝܢ̈ܐ ܠܗܢܐ ܒܨܝܐ.',
 'powersearch' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
 'powersearch-legend' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
 'powersearch-ns' => 'ܒܨܝ ܒܚܩܠܬ̈ܐ:',
@@ -611,20 +633,20 @@ $1',
 'powersearch-togglelabel' => 'ܓܒܝ:',
 'powersearch-toggleall' => 'ܟܠ',
 'powersearch-togglenone' => 'ܠܐ ܡܕܡ',
-'search-external' => 'Ü\92Ü\98ܨÜ\9dÜ\90 Ü\92ܪÜ\9dÜ\90',
+'search-external' => 'ܒܨܝܐ ܒܪܝܐ',
 
 # Quickbar
 'qbsettings-none' => 'ܠܐ ܡܕܡ',
 
 # Preferences page
-'preferences' => 'Ü\93Ü\92Ü\9dܬ̈ܐ',
-'mypreferences' => 'Ü\93Ü\92Ü\9dܬ̈ܝ',
+'preferences' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬ̈ܐ',
+'mypreferences' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬ̈ܝ',
 'prefs-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ:',
 'prefsnologin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
 'changepassword' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
 'prefs-skin' => 'ܓܠܕܐ',
 'skin-preview' => 'ܚܝܪܐ ܩܕܡܝܐ',
-'datedefault' => 'Ü Ü\90 Ü\93Ü\92Ü\9dܬܐ',
+'datedefault' => 'Ü Ü\90 Ü¨Ü\92Ü\9dÜ¢Ü\9dÜ\98ܬܐ',
 'prefs-datetime' => 'ܣܝܩܘܡܐ ܘܙܒܢܐ',
 'prefs-personal' => 'ܦܘܓܪܦܐ ܕܡܦܠܚܢܐ',
 'prefs-rc' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
@@ -644,7 +666,7 @@ $1',
 'resultsperpage' => 'ܡܢܝܢܐ ܕܦܠܛ̈ܐ ܒܕܦܐ:',
 'recentchangesdays' => 'ܝܘܡܬ̈ܐ ܠܚܙܝܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ:',
 'recentchangescount' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܠܚܙܝܐ ܪܫܐܝܬ:',
-'savedprefs' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\9dÜ ܟ ܐܬܠܒܟܘ.',
+'savedprefs' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬÌ\88ܟ ܐܬܠܒܟܘ.',
 'timezonelegend' => 'ܙܘܢܐ ܙܒܢܝܐ:',
 'localtime' => 'ܥܕܢܐ ܕܘܟܬܝܐ:',
 'timezoneregion-africa' => 'ܐܦܪܝܩܐ',
@@ -656,7 +678,7 @@ $1',
 'timezoneregion-europe' => 'ܐܘܪܘܦܐ',
 'timezoneregion-indian' => 'ܐܘܩܝܢܘܣ ܗܢܕܘܝܐ',
 'timezoneregion-pacific' => 'ܐܘܩܝܢܘܣ ܫܩܛܝܐ',
-'prefs-searchoptions' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\92Ü\98ܨÜ\9dÜ\90',
+'prefs-searchoptions' => 'ܓܒܝܬ̈ܐ ܕܒܨܝܐ',
 'prefs-namespaces' => 'ܚܩܠܬ̈ܐ',
 'defaultns' => 'ܐܘ ܒܨܝ ܒܚܩܠܬ̈ܐ ܗܢܝܢ',
 'prefs-files' => 'ܠܦܦ̈ܐ',
@@ -685,9 +707,9 @@ $1',
 'prefs-advancedrendering' => 'ܓܒܝܬ̈ܐ ܡܬܩܕ̈ܡܢܐ',
 'prefs-advancedsearchoptions' => 'ܓܒܝܬ̈ܐ ܡܬܩܕ̈ܡܢܐ',
 'prefs-advancedwatchlist' => 'ܓܒܝܬ̈ܐ ܡܬܩܕ̈ܡܢܐ',
-'prefs-displayrc' => 'Ü\9aÜ\98Ü\9d Ü\93Ü\92Ü\9dܬÌ\88ܐ',
-'prefs-displaysearchoptions' => 'Ü\9aÜ\98Ü\9d Ü\93Ü\92Ü\9dܬÌ\88ܐ',
-'prefs-displaywatchlist' => 'Ü\9aÜ\98Ü\9d Ü\93Ü\92Ü\9dܬÌ\88ܐ',
+'prefs-displayrc' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\9aÜ\98Ü\98Ü\9dܐ',
+'prefs-displaysearchoptions' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\9aÜ\98Ü\98Ü\9dܐ',
+'prefs-displaywatchlist' => 'Ü\93Ü\92Ü\9dܬÌ\88Ü\90 Ü\95Ü\9aÜ\98Ü\98Ü\9dܐ',
 'prefs-diffs' => 'ܦܪ̈ܝܫܘܝܬܐ',
 
 # User rights
@@ -730,7 +752,7 @@ $1',
 'right-createaccount' => 'ܒܪܝ ܚܘܫܒܢ̈ܐ ܕܡܦܠܚܢܐ ܚܕܬܐ',
 'right-minoredit' => 'ܫܘܕܥ ܥܠ ܫܘܚܠܦ̈ܐ ܐܝܟ ܙܥܘܪܐ',
 'right-move' => 'ܫܢܝ ܦܐܬܬ̈ܐ',
-'right-move-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¥Ü¡ Ü\95Ì\88ܦܐ ܦܪ̈ܥܝܐ ܕܝܠܗܘܢ',
+'right-move-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¥Ü¡ Ü¦Ü\90ܬܬÌ\88ܐ ܦܪ̈ܥܝܐ ܕܝܠܗܘܢ',
 'right-movefile' => 'ܫܢܝ ܠܦܦ̈ܐ',
 'right-upload' => 'ܐܣܩ ܠܦܦ̈ܐ',
 'right-delete' => 'ܫܘܦ ܦܐܬܬ̈ܐ',
@@ -760,7 +782,7 @@ $1',
 'action-delete' => 'ܫܝܦܬܐ ܕܦܐܬܐ ܗܕܐ',
 'action-deleterevision' => 'ܫܝܦܬܐ ܕܬܢܝܬܐ ܗܕܐ',
 'action-deletedhistory' => 'ܚܙܝܬܐ ܕܬܫܥܝܬܐ ܫܝܦܬܐ ܕܦܐܬܐ ܗܕܐ',
-'action-browsearchive' => 'Ü\92Ü\98ܨÜ\9dÜ\90 Ü¥Ü  Ü¦Ü\90ܬܬÌ\88Ü\90 Ü«Ü\9dܦܬÌ\88Ü\90',
+'action-browsearchive' => 'ܒܨܝܐ ܥܠ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ',
 'action-undelete' => 'ܠܐ ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'action-suppressionlog' => 'ܚܙܝܬܐ ܕܗܢܐ ܣܓܠܐ ܦܪܨܘܦܝܐ',
 'action-block' => 'ܚܪܡܬܐ ܕܡܦܠܚܢܐ ܗܢܐ ܡܢ ܫܚܠܦܬܐ',
@@ -771,9 +793,9 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
 'recentchanges' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
 'recentchanges-legend' => 'ܓܒܝܬ̈ܐ ܕܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ',
-'recentchangestext' => 'ܥܩܒ ܫܘܚܠܦ̈ܐ ܚܕܬ ܡܢ ܟܠ ܕܘܝܩܝ ܒܦܐܬܐ ܗܕܐ.',
-'recentchanges-label-newpage' => 'Ü«Ü\98Ü\9aܠܦÜ\90 Ü\97Ü¢Ü\90 Ü\92ܪÜ\90 ܦܐܬܐ ܚܕܬܐ',
-'recentchanges-label-minor' => 'Ü\97Ü¢Ü\90 Ü\97Ü\98 Ü«Ü\98Ü\9aܠܦÜ\90 Ü\99Ü¥Ü\98ܪÜ\90',
+'recentchanges-summary' => 'ܥܩܒ ܫܘܚܠܦ̈ܐ ܚܕܬ ܡܢ ܟܠ ܕܘܝܩܝ ܒܦܐܬܐ ܗܕܐ.',
+'recentchanges-label-newpage' => 'Ü«Ü\98Ü\9aܠܦÜ\90 Ü\97Ü¢Ü\90 Ü\90ܬܬܣÜ\9dÜ¡ ܦܐܬܐ ܚܕܬܐ',
+'recentchanges-label-minor' => 'ܗܢܘ ܫܘܚܠܦܐ ܙܥܘܪܐ',
 'recentchanges-label-bot' => 'ܒܘܬ (bot) ܥܒܕ ܗܢܐ ܫܘܚܠܦܐ',
 'rclistfrom' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܡܢ $1',
 'rcshowhideminor' => '$1 ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ',
@@ -782,7 +804,7 @@ $1',
 'rcshowhideanons' => '$1 ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ',
 'rcshowhidemine' => '$1 ܫܘܚܠܦ̈ܝ',
 'rclinks' => 'ܚܘܝ $1 ܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ ܒ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ<br />$3',
-'diff' => 'ܦܪÜ\9dÜ«Ü\98ܬܐ',
+'diff' => 'ܦÜ\98ܪܫܐ',
 'hist' => 'ܬܫܥܝܬܐ',
 'hide' => 'ܛܫܝ',
 'show' => 'ܚܘܝ',
@@ -843,6 +865,8 @@ $1',
 'http-read-error' => 'HTTP ܦܘܕܐ ܒܩܪܝܬܐ.',
 'http-curl-error' => 'ܦܘܕܐ ܒܫܟܚܐ ܕURL: $1',
 
+'license' => 'ܦܣܣܐ:',
+'license-header' => 'ܦܣܣܐ',
 'license-nopreview' => '(ܠܝܬ ܚܝܪܐ ܩܕܡܝܐ)',
 'upload_source_file' => ' (ܠܦܦܐ ܥܠ ܚܫܘܒܬܐ ܕܝܠܟ)',
 
@@ -914,8 +938,9 @@ $1',
 'randomredirect-nopages' => 'ܠܝܬ ܨܘܝܒ̈ܐ ܒܚܩܠܐ ܕ"$1".',
 
 # Statistics
+'statistics' => 'ܡܢܝܢܘܬ',
 'statistics-pages' => 'ܦܐܬܬ̈ܐ',
-'statistics-users-active' => 'ܡܦܠÜ\9aÜ¢Ì\88Ü\90 Ü\9fÜ«Ü\9dܪÌ\88ܐ',
+'statistics-users-active' => 'ܡܦܠÜ\9aÜ¢Ì\88Ü\90 Ü\99ܪÌ\84Ü\9dÜ\99ܐ',
 
 'disambiguations' => 'ܦܐܬܬ̈ܐ ܐܣܝܪ̈ܬܐ ܒܦܐܬܬ̈ܐ ܕܬܘܚܡܐ ܐܚܪܢܐ',
 'disambiguationspage' => 'Template:ܬܘܚܡܐ ܐܚܪܢܐ',
@@ -925,10 +950,12 @@ $1',
 ܗܫܐ ܐܝܬܝܗܝ  ܨܘܝܒܐ ܠ [[$2]].',
 
 'brokenredirects' => 'ܨܘܝܒ̈ܐ ܬܒܝܪ̈ܐ',
+'brokenredirectstext' => 'ܨܘ̈ܝܒܐ ܗܠܝܢ ܡܛܝܢ ܠܕ̈ܦܐ ܕܠܝܬܠܗܘܢ ܐܝܬܘܬܐ:',
 'brokenredirects-edit' => 'ܫܚܠܦ',
 'brokenredirects-delete' => 'ܫܘܦ',
 
 'withoutinterwiki' => 'ܦܐܬܬ̈ܐ ܕܠܐ ܐܣܘܪ̈ܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ',
+'withoutinterwiki-summary' => 'ܦܐܬܬ̈ܐ ܗܠܝܢ ܠܐ ܡܛܝܢ ܠܨ̈ܚܚܐ ܕܠܫܢ̈ܐ ܐܚܪ̈ܢܐ.',
 'withoutinterwiki-legend' => 'ܫܪܘܝܐ',
 'withoutinterwiki-submit' => 'ܚܘܝ',
 
@@ -941,6 +968,7 @@ $1',
 'nmembers' => '$1 {{PLURAL:$1|ܗܕܡܐ|ܗܕ̈ܡܐ}}',
 'nrevisions' => '$1 {{PLURAL:$1|ܬܢܝܬܐ|ܬܢܝܬ̈ܐ }}',
 'nviews' => '$1 {{PLURAL:$1|ܚܘܘܝܐ|ܚܘܘܝ̈ܐ}}',
+'specialpage-empty' => 'ܠܝܬ ܦܠܛ̈ܐ ܒܬܫܪܪܐ ܗܢܐ.',
 'lonelypages' => 'ܦܐܬܬ̈ܐ ܝܬܡܬ̈ܐ',
 'uncategorizedpages' => 'ܦܐܬܬ̈ܐ ܠܐ ܣܕܝܪ̈ܬܐ',
 'uncategorizedcategories' => 'ܣܕܪ̈ܐ ܠܐ ܣܕܝܪ̈ܐ',
@@ -1027,7 +1055,7 @@ $1',
 'listusers-blocked' => '(ܚܪܝܡܐ)',
 
 # Special:ActiveUsers
-'activeusers' => 'Ü¡Ü\9fܬÜ\92Ü\98ܬÜ\90 Ü\95Ü\97Ü\95Ì\88Ü¡Ü\90 Ü\9fÜ«Ü\9dܪÌ\88ܐ',
+'activeusers' => 'Ü¡Ü\9fܬÜ\92Ü\98ܬÜ\90 Ü\95Ü\97Ü\95Ì\88Ü¡Ü\90 Ü\99ܪÌ\84Ü\9dÜ\99ܐ',
 'activeusers-count' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ ܚܕܬܐ|ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ}} ܒ {{PLURAL:$3|ܝܘܡܐ ܐܚܪܝܐ|$3 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ}}',
 'activeusers-from' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܐ ܥܡ:',
 'activeusers-hidebots' => 'ܛܫܝ ܒܘܬ̈ܐ (bots)',
@@ -1051,7 +1079,7 @@ $1',
 'listgrouprights-removegroup-self-all' => 'ܠܚܝ ܟܠ ܟܢܘܫܬ̈ܐ ܡܢ ܚܘܫܒܢܗ ܕܝܠܢܝܐ',
 
 # E-mail user
-'mailnologin' => 'Ü Ü\9dܬ Ü¦ÜªÜ«Ü\93Ü¢ܐ',
+'mailnologin' => 'Ü Ü\9dܬ Ü¡Ü\98ܢܥÜ\90 Ü Ü«Ü\98Ü\95ܪܐ',
 'emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
 'emailpage' => 'ܫܕܪ ܐܓܪܬܐ ܒܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ',
 'defemailsubject' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ  ܡܢ ܡܦܠܚܢܐ "$1"',
@@ -1082,7 +1110,7 @@ $1',
 'unwatch' => 'ܠܐ ܪܗܝ',
 'unwatchthispage' => 'ܟܠܝ ܪܗܝܐ',
 'wlshowlast' => 'ܚܘܝ $1 ܫܥܬ̈ܐ $2 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ $3',
-'watchlist-options' => 'Ü\93Ü\92Ü\9dܬ̈ܐ ܕܪ̈ܗܝܬܐ',
+'watchlist-options' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬ̈ܐ ܕܪ̈ܗܝܬܐ',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ܪܗܝܐ...',
@@ -1099,8 +1127,8 @@ $1',
 # Delete
 'deletepage' => 'ܫܘܦ ܦܐܬܐ',
 'confirm' => 'ܚܬܬ',
-'excontent' => "ܚܒܝܫܬ̈ܐ ܗܘܬ: '$1'",
-'excontentauthor' => "ܚܒܝܫܬ̈ܐ ܗܘܬ: '$1' (ܘܫܘܬܦܢܐ ܝܚܝܕܝܐ ܗܘܐ '[[Special:Contributions/$2|$2]]')",
+'excontent' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1'",
+'excontentauthor' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' (ܘܫܘܬܦܢܐ ܝܚܝܕܝܐ ܗܘܐ '[[Special:Contributions/$2|$2]]')",
 'exblank' => 'ܦܐܬܐ ܣܦܝܩܬܐ ܗܘܐ',
 'delete-confirm' => 'ܫܘܦ "$1"',
 'delete-legend' => 'ܫܘܦ',
@@ -1116,6 +1144,7 @@ $1',
 # Rollback
 'rollbacklink' => 'ܐܦܢܝ',
 'editcomment' => "ܦܣܝܩܬ̈ܐ ܕܫܘܚܠܦܐ ܗܘܐ: \"''\$1''\".",
+'revertpage' => 'ܐܗܦܟ ܫܘܚܠܦ̈ܐ ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܐ]]) ܠܬܢܝܬܐ ܐܚܪܝܬܐ ܒܝܕ [[User:$1|$1]]',
 
 # Edit tokens
 'sessionfailure-title' => 'ܡܘܬܒܐ ܠܐ ܢܨܚܬ',
@@ -1132,14 +1161,14 @@ $1',
 'protect-fallback' => 'ܒܥܝ "$1" ܦܣܣܐ',
 'protect-level-autoconfirmed' => 'ܚܪܘܡ ܡܦܠܚܢ̈ܐ ܚܕ̈ܬܐ ܘܠܐ ܥܠܝܠ̈ܐ',
 'protect-level-sysop' => 'ܡܕܒܪ̈ܢܐ ܒܠܚܘܕ',
-'protect-expiring' => 'ܦܪܩ ܒ $1 (UTC)',
-'protect-expiry-indefinite' => 'Ü\95Ü Ü\90 Ü£Ü\9f',
+'protect-expiring' => 'ܬܦܪÜ\98ܩ ܒ $1 (UTC)',
+'protect-expiry-indefinite' => 'ܠܥܠܡ',
 'protect-othertime' => 'ܥܕܢܐ ܐܚܪܬܐ:',
 'protect-othertime-op' => 'ܥܕܢܐ ܐܚܪܬܐ',
 'protect-otherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܢܩܝܦܬܐ:',
 'protect-otherreason-op' => 'ܥܠܬܐ ܐܚܪܬܐ',
 'protect-edit-reasonlist' => 'ܫܚܠܦ ܥܠܬܐ ܕܢܛܪܐ',
-'protect-expiry-options' => '1 Ü«Ü¥Ü¬Ü\90:1 hour,1 Ü\9dÜ\98Ü¡Ü\90:1 day,1 Ü«Ü\92Ü\98Ü¥Ü\90:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\90:2 weeks,1 Ü\9dܪÜ\9aÜ\90:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\90:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\90:6 months,1 Ü«Ü¢Ü¬Ü\90:1 year,Ü\95Ü Ü\90 Ü£Ü\9f:infinite',
+'protect-expiry-options' => '1 Ü«Ü¥Ü¬Ü\90:1 hour,1 Ü\9dÜ\98Ü¡Ü\90:1 day,1 Ü«Ü\92Ü\98Ü¥Ü\90:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\90:2 weeks,1 Ü\9dܪÜ\9aÜ\90:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\90:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\90:6 months,1 Ü«Ü¢Ü¬Ü\90:1 year,ܠܥܠܡ:infinite',
 'restriction-type' => 'ܦܣܣܐ:',
 'minimum-size' => 'ܡܬܚܐ ܬܚܬܝܐ  ܕܥܓܪܐ',
 'maximum-size' => 'ܡܬܚܐ ܥܠܝܐ ܕܥܓܪܐ',
@@ -1158,7 +1187,7 @@ $1',
 
 # Undelete
 'undelete' => 'ܚܙܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ',
-'undeletepage' => 'Ü\9aÜ\99Ü\9d Ü\98Ü\90ܦܢÜ\9d Ü\95Ì\88ܦÜ\90 Ü«Ü\9dܦ̈ܐ',
+'undeletepage' => 'Ü\9aÜ\99Ü\9d Ü\98Ü\90ܦܢÜ\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü«Ü\9dܦܬ̈ܐ',
 'viewdeletedpage' => 'ܚܙܝ ܦܐܬܬ̈ܐ ܫܝܦܬ̈ܐ',
 'undelete-fieldset-title' => 'ܐܦܢܝ ܬܢܝܬ̈ܐ',
 'undelete-revision' => 'ܫܦ ܬܢܝܬܐ ܕ $1 (ܒܣܝܩܘܡ $4, ܒ $5) ܒܝܕ $3:',
@@ -1204,6 +1233,7 @@ $1',
 'sp-contributions-userrights' => 'ܕܘܒܪܐ ܕܙܕ̈ܩܐ ܕܡܦܠܚܢܐ',
 'sp-contributions-search' => 'ܒܨܝ ܫܘܬܦܘܝܬ̈ܐ',
 'sp-contributions-username' => 'ܐܝ ܦܝ (IP) ܐܘ ܫܡܐ ܕܡܦܠܚܢܐ:',
+'sp-contributions-toponly' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܕܗܢܘܢ ܬܢܝܬ̈ܐ ܐܚܪ̈ܝܬܐ ܒܠܚܘܕ',
 'sp-contributions-submit' => 'ܒܨܝ',
 
 # What links here
@@ -1234,7 +1264,7 @@ $1',
 'ipbreasonotherlist' => 'ܥܠܬܐ ܐܚܪܬܐ',
 'ipbsubmit' => 'ܚܪܘܡ ܡܦܠܚܢܐ ܗܢܐ',
 'ipbother' => 'ܥܕܢܐ ܐܚܪܬܐ',
-'ipboptions' => '2 Ü«Ü¥Ü¬Ì\88Ü\90:2 hours,1 Ü\9dÜ\98Ü¡Ü\90:1 day,3 Ü\9dÜ\98ܡܬÌ\88Ü\90:3 days,1 Ü«Ü\92Ü\98Ü¥Ü\90:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\90:2 weeks,1 Ü\9dܪÜ\9aÜ\90:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\90:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\90:6 months,1 Ü«Ü¢Ü¬Ü\90:1 year,Ü\95Ü Ü\90 Ü£Ü\9f:infinite',
+'ipboptions' => '2 Ü«Ü¥Ü¬Ì\88Ü\90:2 hours,1 Ü\9dÜ\98Ü¡Ü\90:1 day,3 Ü\9dÜ\98ܡܬÌ\88Ü\90:3 days,1 Ü«Ü\92Ü\98Ü¥Ü\90:1 week,2 Ü«Ü\92Ü\98Ü¥Ì\88Ü\90:2 weeks,1 Ü\9dܪÜ\9aÜ\90:1 month,3 Ü\9dܪÌ\88Ü\9aÜ\90:3 months,6 Ü\9dܪÌ\88Ü\9aÜ\90:6 months,1 Ü«Ü¢Ü¬Ü\90:1 year,ܠܥܠܡ:infinite',
 'ipbotheroption' => 'ܐܚܪܢܐ',
 'ipbotherreason' => 'ܥܠܬܐ ܐܚܪܬܐ/ܢܩܝܦܬܐ:',
 'ipbhidename' => 'ܛܫܝ ܫܡܐ ܕܡܦܠܚܢܐ ܡܢ ܫܘܚܠܦ̈ܐ ܘܡܟܬܒܘܬ̈ܐ',
@@ -1251,7 +1281,7 @@ $1',
 'ipblocklist-legend' => 'ܐܫܟܚ ܡܦܠܚܢܐ ܡܚܪܡܐ',
 'ipblocklist-submit' => 'ܒܨܝ',
 'ipblocklist-localblock' => 'ܚܪܡܐ ܕܘܟܬܢܝܐ',
-'infiniteblock' => 'Ü\95Ü Ü\90 Ü£Ü\9f',
+'infiniteblock' => 'ܠܥܠܡ',
 'anononlyblock' => 'ܠܐ ܝܕ̈ܝܥܐ ܒܠܚܘܕ',
 'ipblocklist-empty' => 'ܣܓܠܐ ܕܚܪܡܐ ܣܦܝܩܐ.',
 'blocklink' => 'ܚܪܘܡ',
@@ -1281,8 +1311,8 @@ Do you want to change the settings?',
 'movepage-moved' => '\'\'\'"$1" ܐܫܬܢܝܬ ܠ "$2"\'\'\'',
 'movepage-moved-redirect' => 'ܨܘܝܒܐ ܐܬܒܪܝ',
 'movedto' => 'ܐܬܫܢܝ ܠ',
-'move-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¦ÜªÌ\88Ü¥Ü\9dܐ (ܥܕܡܐ ܠ $1)',
-'move-talk-subpages' => 'Ü«Ü¢Ü\9d Ü\95Ì\88ܦÜ\90 Ü¦ÜªÌ\88Ü¥Ü\9dÜ\90 Ü\95Ü\95ܦܐ ܕܕܘܪܫܐ (ܥܕܡܐ ܠ $1)',
+'move-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¦ÜªÌ\88Ü¥Ü\9dܬÌ\88ܐ (ܥܕܡܐ ܠ $1)',
+'move-talk-subpages' => 'Ü«Ü¢Ü\9d Ü¦Ü\90ܬܬÌ\88Ü\90 Ü¦ÜªÌ\88Ü¥Ü\9dܬÌ\88Ü\90 Ü\95ܦÜ\90ܬܐ ܕܕܘܪܫܐ (ܥܕܡܐ ܠ $1)',
 'movelogpage' => 'ܣܓܠܐ ܕܫܘܢܝܐ',
 'movereason' => 'ܥܠܬܐ:',
 'revertmove' => 'ܐܦܢܝ',
@@ -1292,6 +1322,7 @@ Do you want to change the settings?',
 
 # Export
 'export' => 'ܐܦܩ ܦܐܬܬ̈ܐ',
+'exportall' => 'ܐܦܩ ܟܠ ܦܐܬܬ̈ܐ',
 'export-submit' => 'ܐܦܩ',
 'export-addcattext' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܡܢ ܣܕܪܐ:',
 'export-addcat' => 'ܐܘܣܦ',
@@ -1328,6 +1359,30 @@ Do you want to change the settings?',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|ܬܢܝܬܐ |ܬܢܝܬ̈ܐ}}',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ܬܢܝܬܐ |ܬܢܝܬ̈ܐ}} ܡܢ $2',
 
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
+'tooltip-pt-mytalk' => 'ܦܐܬܐ ܕܡܡܠܘܟ',
+'tooltip-pt-preferences' => 'Your preferences',
+'tooltip-pt-login' => 'ܛܒ ܐܢܬ ܕܣܓܠ ܥܠܠܐ، ܐܠܐ ܗܢܐ ܠܘ ܐܠܨܝܐ',
+'tooltip-pt-logout' => 'ܦܠܛܐ',
+'tooltip-ca-talk' => 'ܡܡܠܠܐ ܥܠ ܚܒܝܫܬܐ ܕܦܐܬܐ',
+'tooltip-ca-addsection' => 'ܫܪܝ ܦܣܘܩܐ ܚܕܬܐ',
+'tooltip-ca-viewsource' => 'ܗܢܐ ܦܐܬܐ ܢܛܪܬܐ ܝܠܗ.
+ܐܝܬ ܒܟ ܬܚܙܝ ܡܒܘܥܐ ܕܝܠܗ',
+'tooltip-ca-protect' => 'ܢܛܘܪ ܗܕܐ ܦܐܬܐ',
+'tooltip-ca-delete' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
+'tooltip-search' => 'ܒܨܝ ܒܓܘ {{SITENAME}}',
+'tooltip-p-logo' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
+'tooltip-n-portal' => 'ܚܕܪ ܬܪܡܝܬܐ، ܡܢܐ ܡܫܟܚ ܐܢܬ ܠܥܒܕܐ، ܐܝܟܐ ܬܚܙܝ ܟܠ ܡܐ ܕܣܢܝܩ ܐܢܬ ܠܗ',
+'tooltip-n-recentchanges' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܒܓܘ ܘܝܩܝ.',
+'tooltip-n-randompage' => 'ܦܬܘܟ ܡܓܠܬܐ ܚܘܝܚܬܐ',
+'tooltip-n-help' => 'ܕܘܟܐ ܠܥܘܕܪܢܐ',
+'tooltip-t-contributions' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܬܦ̈ܐ ܕܗܢܐ ܡܦܠܚܢܐ',
+'tooltip-t-emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
+'tooltip-t-specialpages' => 'ܡܟܬܒܢܘܬܐ ܒܟܠ ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
+'tooltip-ca-nstab-user' => 'ܚܘܝ ܦܐܬܐ ܕܡܦܠܚܢܐ',
+'tooltip-save' => 'ܠܒܘܟ ܫܘܚܠܦܟ',
+
 # Attribution
 'anonymous' => '{{PLURAL:$1|ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ|ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ}} ܕ {{SITENAME}}',
 'siteuser' => '{{SITENAME}} ܡܦܠܚܢܐ $1',
@@ -1375,7 +1430,7 @@ $1',
 'exif-filesource' => 'ܡܒܘܥܐ ܕܠܦܦܐ',
 'exif-gpsspeedref' => 'ܚܕܝܘܬܐ ܕܩܠܘܠܘܬܐ',
 'exif-gpstrack' => 'ܨܘܒܐ ܕܫܘܢܝܐ',
-'exif-gpsimgdirectionref' => 'Ü\93Ü\92Ü\9dܬÜ\90 Ü\95ܨÜ\98Ü\92Ü\90 Ü\95Ü«Ü\98Ü¢Ü\9dܐ',
+'exif-gpsimgdirectionref' => 'Ü¡Ü\92Ü\98Ü¥Ü\90 Ü\95ܨÜ\98Ü\92Ü\90 Ü\95ܨÜ\98ܪܬܐ',
 'exif-gpsimgdirection' => 'ܨܘܒܐ ܕܨܘܪܬܐ',
 'exif-languagecode' => 'ܠܫܢܐ',
 
@@ -1457,7 +1512,7 @@ $1',
 'table_pager_prev' => 'ܦܐܬܐ ܩܕܝܡܬܐ',
 'table_pager_first' => 'ܦܐܬܐ ܩܕܡܝܬܐ',
 'table_pager_last' => 'ܦܐܬܐ ܐܚܪܝܬܐ',
-'table_pager_limit_label' => 'ܡܕܡ ܠܟܠ ܕܦܐ:',
+'table_pager_limit_label' => 'ܡܕ̈ܡܐ ܠܟܠ ܦܐܬܐ:',
 'table_pager_limit_submit' => 'ܙܠ',
 'table_pager_empty' => 'ܠܝܬ ܦܠܛ̈ܐ',
 
@@ -1476,6 +1531,7 @@ $1',
 # Watchlist editing tools
 'watchlisttools-view' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ ܕ̈ܡܝܐ',
 'watchlisttools-edit' => 'ܚܙܝ ܘܫܚܠܦ ܪ̈ܗܝܬܐ',
+'watchlisttools-raw' => 'ܫܚܠܦ ܪ̈ܗܝܬܐ ܦܛܝܪ̈ܬܐ',
 
 # Special:Version
 'version' => 'ܨܚܚܐ',
@@ -1516,8 +1572,8 @@ $1',
 'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
 
 # Special:ComparePages
-'compare-page1' => 'Ü\95ܦܐ 1',
-'compare-page2' => 'Ü\95ܦܐ 2',
+'compare-page1' => 'ܦÜ\90ܬܐ 1',
+'compare-page2' => 'ܦÜ\90ܬܐ 2',
 'compare-rev1' => 'ܬܢܝܬܐ 1',
 'compare-rev2' => 'ܬܢܝܬܐ 2',
 'compare-submit' => 'ܦܚܘܡ',
@@ -1528,13 +1584,15 @@ $1',
 'htmlform-selectorother-other' => 'ܐܚܪܢܐ',
 
 # New logging system
-'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-delete-delete' => '$1 ܫܦ ܦܐܬܐ ܕ $3',
+'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-newusers-newusers' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ',
 'logentry-newusers-create2' => '$1 ܒܪܐ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3',
+'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
 'newuserlog-byemail' => 'ܡܠܬܐ ܕܥܠܠܐ ܐܫܬܕܪܬ ܒܝܕ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 
 # Feedback
index baf89de..dd00e1c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Araucanian (Mapudungun)
+/** Araucanian (mapudungun)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -377,7 +377,6 @@ Rulpakünuy feychi kangelkülelu dungu.",
 
 # Diffs
 'history-title' => 'Kuyfi malün "$1" mew',
-'difference' => '(Trürümün epu malün engu)',
 'lineno' => 'Wif $1:',
 'compareselectedversions' => 'Trürümün dullinngelu malün',
 'editundo' => 'wüñoeltun',
@@ -478,7 +477,7 @@ Rulpakünuy feychi kangelkülelu dungu.",
 'nchanges' => '{{PLURAL:$1|kalekünuy|kalekünuy}} $1',
 'recentchanges' => 'Weke kalekünun',
 'recentchanges-legend' => 'Weke kalekünun ñi dullin',
-'recentchangestext' => 'Inayafin doy weke kalekünun tüfa mew.',
+'recentchanges-summary' => 'Inayafin doy weke kalekünun tüfa mew.',
 'recentchanges-feed-description' => 'Inayafin doy weke kalekünun wiki ñi amuldungu mew',
 'recentchanges-label-newpage' => 'Tüfachi wirin dewmakey kiñe we wülngiñ.',
 'recentchanges-label-minor' => 'Tüfachi ta kiñe pichi wirin',
index a9e7150..730ae0d 100644 (file)
@@ -909,7 +909,6 @@ $1",
 
 # Diffs
 'history-title' => 'Ṫ-Ṫariĥ dyal lé-vérsyon dyal "$1"',
-'difference' => '(Ferq mabin lé-vérsyon)',
 'difference-multipage' => '(l-fṛq bin ṣ-ṣfaḫi)',
 'lineno' => 'Ṣter $1:',
 'compareselectedversions' => 'Qaren lé-versyon li meĝzolin',
@@ -1240,7 +1239,7 @@ Laḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫi
 'nchanges' => '{{PLURAL:$1|ṫeġyira weḫda|$1 dyal ṫ-ṫeġyiraṫ}}',
 'recentchanges' => 'Ṫ-Ṫeĝdilaṫ l-leĥĥra',
 'recentchanges-legend' => 'Opsyon dyal ṫ-ṫeġyiraṫ l-leĥĥra',
-'recentchangestext' => 'Ṫebbeĝ ṫ-ṫeĝdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.',
+'recentchanges-summary' => 'Ṫebbeĝ ṫ-ṫeĝdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.',
 'recentchanges-feed-description' => 'Ṫebbeĝ ṫ-ṫeĝdilaṫ l-leĥĥrin dyal had l-wiki fe waḫed l-flu.',
 'recentchanges-label-newpage' => "anch' had tadil sfha jdida",
 'recentchanges-label-minor' => 'Hada ṫeĝdil sġir',
index 5d97327..2a35406 100644 (file)
@@ -166,7 +166,7 @@ $magicWords = array(
        'revisiontimestamp'       => array( '1', 'طابع_وقت_المراجعة', 'REVISIONTIMESTAMP' ),
        'revisionuser'            => array( '1', 'مستخدم_المراجعة', 'REVISIONUSER' ),
        'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'مسار_كامل:', 'عنوان_كامل:', 'FULLURL:' ),
+       'fullurl'                 => array( '0', 'مسار_كامل:', 'FULLURL:' ),
        'fullurle'                => array( '0', 'عنوان_كامل:', 'مسار_كامل:', 'FULLURLE:' ),
        'lcfirst'                 => array( '0', 'عنوان_كبير:', 'LCFIRST:' ),
        'ucfirst'                 => array( '0', 'عنوان_صغير:', 'UCFIRST:' ),
@@ -191,7 +191,7 @@ $magicWords = array(
        'padleft'                 => array( '0', 'باد_يسار', 'PADLEFT' ),
        'padright'                => array( '0', 'باد_يمين', 'PADRIGHT' ),
        'special'                 => array( '0', 'خاص', 'special' ),
-       'defaultsort'             => array( '1', 'ترتيب_قياسى:', 'ترتيب_افتراضى:', 'مفتاح_ترتيب_قياسى:', 'مفتاح_ترتيب_افتراضى:', 'ترتيب_تصنيف_قياسى:', 'ترتيب_تصنيف_افتراضى:', 'ترتيب_قياسي:', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_قياسي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_قياسي:', 'ترتيب_تصنيف_افتراضي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'defaultsort'             => array( '1', 'ترتيب_قياسى:', 'ترتيب_افتراضى:', 'مفتاح_ترتيب_قياسى:', 'مفتاح_ترتيب_افتراضى:', 'ترتيب_تصنيف_قياسى:', 'ترتيب_تصنيف_افتراضى:', 'ترتيب_قياسي:', 'ترتيب_افتراضي:', 'مفتاح_ترتيب_قياسي:', 'مفتاح_ترتيب_افتراضي:', 'ترتيب_تصنيف_قياسي:', 'ترتيب_تصنيف_افتراضي:', 'ترتيب_غيابي:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                => array( '0', 'مسار_الملف:', 'FILEPATH:' ),
        'tag'                     => array( '0', 'وسم', 'tag' ),
        'hiddencat'               => array( '1', '__تصنيف_مخفي__', '__HIDDENCAT__' ),
@@ -329,7 +329,7 @@ $messages = array(
 'tog-enotifminoredits' => 'ابعتلى ايميل للتعديلات الصغيره للصفحات',
 'tog-enotifrevealaddr' => 'بين الايميل بتاعى فى ايميلات الاعلام',
 'tog-shownumberswatching' => 'بين عدد اليوزرز المراقبين',
-'tog-oldsig' => 'برÙ\88Ù\81Ù\87 Ù\84Ù\84اÙ\85ضا Ø§Ù\84حاÙ\84Ù\8aÙ\87',
+'tog-oldsig' => 'اÙ\84اÙ\85ضا Ø¯Ù\84Ù\88Ù\82تÙ\89:',
 'tog-fancysig' => 'امضا خام (من غير لينك أوتوماتيك)',
 'tog-externaleditor' => 'استعمل محرر خارجى افتراضيا',
 'tog-externaldiff' => 'استعمل فرق خارجى افتراضيا',
@@ -458,7 +458,7 @@ $messages = array(
 'vector-action-move' => 'نقل',
 'vector-action-protect' => 'حمايه',
 'vector-action-undelete' => 'الغى المسح',
-'vector-action-unprotect' => 'اÙ\84غÙ\89 الحمايه',
+'vector-action-unprotect' => 'غÙ\8aر الحمايه',
 'vector-view-create' => 'اعمل',
 'vector-view-edit' => 'تعديل',
 'vector-view-history' => 'استعراض التاريخ',
@@ -492,8 +492,8 @@ $messages = array(
 'protect' => 'حمايه',
 'protect_change' => 'غيّر',
 'protectthispage' => 'احمى الصفحه دى',
-'unprotect' => 'اÙ\84غÙ\89 Ø§Ù\84Ø­Ù\85اÙ\8aØ©',
-'unprotectthispage' => 'Ø´Ù\8aÙ\84 حماية الصفحه دى',
+'unprotect' => 'غÙ\8aر Ø§Ù\84Ø­Ù\85اÙ\8aÙ\87',
+'unprotectthispage' => 'غÙ\8aر حماية الصفحه دى',
 'newpage' => 'صفحه جديده',
 'talkpage' => 'ناقش الصفحه دى',
 'talkpagelinktext' => 'مناقشه',
@@ -526,6 +526,9 @@ $messages = array(
 لو سمحت تستنا شويه قبل ما تحاول تستعرض الصفحه دى من تانى.
 
 $1',
+'pool-timeout' => 'انتهاء الانتظار للقفل',
+'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}}',
@@ -707,8 +710,8 @@ $2',
 'createaccountmail' => 'بـ الايميل',
 'createaccountreason' => 'السبب:',
 'badretype' => 'كلمتين السر اللى  كتبتهم مش  زى بعضهم',
-'userexists' => 'اسم اليوزر اللى دخلته بيستعمله يوزر غيرك.
¯Ø®Ù\84 Ø§Ø³Ù\85 تانى.',
+'userexists' => 'اسم اليوزر اللى كتبته بيستعمله يوزر غيرك.
§Ù\83تت Ø§Ø³Ù\85 Ù\8aÙ\88زر تانى.',
 'loginerror' => 'غلط فى الدخول',
 'createaccounterror' => 'مش قادر يعمل الحساب: $1',
 'nocookiesnew' => 'اليوزر خلاص اتفتح له حساب، بس انت لسة ما سجلتش دخولك.
@@ -969,12 +972,12 @@ $2',
 'permissionserrorstext-withaction' => 'أنت ما عندكش الصلاحيات علشان $2، لل{{PLURAL:$1|سبب|أسباب}} ده:',
 'recreate-moveddeleted-warn' => "'''تحذير: انت بتعيد انشاء صفحه اتمسحت قبل كده.'''
 لازم تتأكد من ان الاستمرار فى تحرير الصفحه دى ملائم.
-سجلات الحذف و النقل بتوع الصفحه دى معروضه هنا:",
+سجلات المسح  و النقل بتوع الصفحه دى معروضه هنا:",
 'moveddeleted-notice' => 'الصفحة دى اتمسحت. سجل المسح و سجل النقل بتوع الصفحة معروضين تحت علشان ترجعلهم.',
 'log-fulllog' => 'استعراض السجل بالكامل',
 'edit-hook-aborted' => 'الخطاف ساب التعديل من غير مايدى تفسير.',
-'edit-gone-missing' => 'Ù\84Ù\85 Ù\8aÙ\85Ù\83Ù\86 ØªØ­Ø¯Ù\8aØ« Ø§Ù\84صÙ\81حة.
\8aبدÙ\88 Ø£Ù\86Ù\87 ØªÙ\85 Ø­Ø°Ù\81Ù\87ا.',
+'edit-gone-missing' => 'Ù\85Ø´ Ù\85Ù\85Ù\83Ù\86 ØªØ¹Ø¯Ù\8aÙ\84 Ø§Ù\84صÙ\81Ø­Ù\87.
\8aظÙ\87ر Ø§Ù\86Ù\87ا Ø¥ØªÙ\85سحت.',
 'edit-conflict' => 'تضارب تحريرى.',
 'edit-no-change' => 'تعديلك تم تجاهله، لأن ما حصلش أى تعديل للنص.',
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
@@ -1065,7 +1068,7 @@ $2',
 ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].
 كسيسوب ممكن [$1 تشوف الفرق ده] لو إنت عايز تكمل.",
 'rev-deleted-diff-view' => "واحده من نسخ الفرق ده '''اتمسحت'''.
-كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
+كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل المسح].",
 'rev-suppressed-diff-view' => "واحده من نسخ الفرق ده '''اتخبت'''.
 كسيسوب ممكن تشوف الفرق ده؛ ممكن تكون فيه تفاصيل فى [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل التخبيه].",
 'rev-delundel' => 'عرض/تخبيه',
@@ -1171,12 +1174,13 @@ $1",
 
 # Diffs
 'history-title' => 'تاريخ تعديل "$1"',
-'difference' => '(الفرق بين النسخ)',
+'difference-multipage' => '(الفرق بين الصفحتين)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'قارن بين النسختين المختارتين',
 'showhideselectedversions' => 'عرض/تخبية المراجعات المختاره.',
 'editundo' => 'استرجاع',
 'diff-multi' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
+'diff-multi-manyusers' => '({{PLURAL:$1|نسخه واحده متوسطه|$1 نسخ متوسطه}} by {{PLURAL:$2|يوزر واحد |$2 يوزرات}}  مش معروضه)',
 
 # Search results
 'searchresults' => 'نتايج التدوير',
@@ -1211,6 +1215,7 @@ $1",
 'searchprofile-everything-tooltip' => 'دور فى  كل المحتوى (شامل صفحات النقاش)',
 'searchprofile-advanced-tooltip' => 'دور فى النطاقات المخصصة',
 'search-result-size' => '$1 ({{PLURAL:$2|1 كلمه|$2 كلام}})',
+'search-result-category-size' => '{{PLURAL:$1|لا أعضاء|عضو واحد|عضوين|$1 أعضاء|$1 عضوًا|$1 عضو}} ({{PLURAL:$2|لا تصانيف فرعية|تصنيف فرعى واحد|تصنيفين فرعيين|$2 تصنيفات فرعية|$2 تصنيف فرعى|$2 تصنيف فرعى}} و{{PLURAL:$3|لا ملفات|ملف واحد|ملفين|$3 ملفات|$3 ملف|$3 ملف}})',
 'search-result-score' => 'الارتباط: $1%',
 'search-redirect' => '(تحويله $1)',
 'search-section' => '(جزء $1)',
@@ -1365,6 +1370,10 @@ $1",
 'prefs-displaywatchlist' => 'اختيارات العرض',
 'prefs-diffs' => 'التغيير',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'عنوان الإيميل صح',
+'email-address-validity-invalid' => 'عنوان الإيميل غلط',
+
 # User rights
 'userrights' => 'إدارة الحقوق بتاعة اليوزر',
 'userrights-lookup-user' => 'إدارة مجموعات اليوزر',
@@ -1448,6 +1457,7 @@ $1",
 'right-hideuser' => 'منع اسم يوزر، و خبيه عن الناس',
 'right-ipblock-exempt' => 'إتفادى عمليات منع الأيبي، المنع الأوتوماتيكى ومنع النطاق.',
 'right-proxyunbannable' => 'إتفادى عمليات المنع الأوتوماتيكية للبروكسيهات',
+'right-unblockself' => 'رفع المنع عن نفسهم',
 'right-protect' => 'تغيير مستويات الحماية وتعديل الصفحات المحمية',
 'right-editprotected' => 'تعديل الصفحات المحمية (من غير الحماية المتضمنة)',
 'right-editinterface' => 'تعديل الواجهة بتاعة اليوزر',
@@ -1516,7 +1526,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|تعديل|تعديلين|$1 تعديلات|$1 تعديل|$1 تعديل}}',
 'recentchanges' => 'اخر التعديلات',
 'recentchanges-legend' => 'اختيارات اخر التعديلات',
-'recentchangestext' => 'تابع آخر التغييرات فى الويكى على الصفحة دى.',
+'recentchanges-summary' => 'تابع آخر التغييرات فى الويكى على الصفحة دى.',
 'recentchanges-feed-description' => 'تابع اخر التعديلات للويكى ده عن طريق الفييد ده .',
 'recentchanges-label-newpage' => 'التعديل ده عمل صفحه جديده',
 'recentchanges-label-minor' => 'ده تعديل صغير',
@@ -1601,6 +1611,8 @@ $1",
 'filetype-banned-type' => "'''\".\$1\"''' مش نوع ملف مسموح بيه.
 {{PLURAL:\$3|نوع الملف المسموح بيه هو|أنواع الملفات المسموح بيها هي}} \$2.",
 'filetype-missing' => 'الملف مالوش امتدا(مثلا ".jpg").',
+'file-too-large' => 'الملف كان كبير جدا.',
+'filetype-banned' => 'نوع الملف ده ممنوع.',
 'large-file' => 'ينصح ان الملفات ماتكونش أكبر من $1؛ الملف ده حجمه $2.',
 'largefileserver' => 'حجم الملف ده أكبر من المسموح بيه على السيرڨر ده .',
 'emptyfile' => 'الظاهر ان الملف اللى انت حملته طلع فاضي.
@@ -2145,7 +2157,7 @@ $UNWATCHURL
 'delete-legend' => 'مسح',
 'historywarning' => "'''تحذير:''' الصفحه اللى ها  تمسحها ليها تاريخ فيه تقريبا $1 {{PLURAL:$1|مراجعة|مراجعة}}:",
 'confirmdeletetext' => 'انت على وشك انك تمسح صفحه أو صوره و كل تاريخها.
-من فضلك  اتأكد انك عايز المسح وبأنك فاهم نتايج  العمليه  دى. عمليات الحذف لازم تتم بناء على [[{{MediaWiki:Policy-url}}|القواعد المتفق عليها]].',
+من فضلك  اتأكد انك عايز المسح وبأنك فاهم نتايج  العمليه  دى. عمليات المسح لازم تتم بناء على [[{{MediaWiki:Policy-url}}|القواعد المتفق عليها]].',
 'actioncomplete' => 'العمليه خلصت',
 'actionfailed' => 'الفعل فشل',
 'deletedtext' => '"$1" اتمسحت.
index 7d48725..9caa0b4 100644 (file)
@@ -119,12 +119,12 @@ $messages = array(
 'tog-hidepatrolled' => 'সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব',
 'tog-newpageshidepatrolled' => 'নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব',
 'tog-extendwatchlist' => 'কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক',
-'tog-usenewrc' => 'বৰà§\8dদà§\8dধিত à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¸à¦¾à¦²-সলনি à¦¬à§\8dযবহাৰ à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦¦à§°à¦\95াৰ)',
+'tog-usenewrc' => 'বৰà§\8dদà§\8dধিত à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¸à¦¾à¦²-সলনি à¦¬à§\8dযবহাৰ à¦\95ৰà¦\95 (à¦\9cাভাসà§\8dà¦\95à§\8dৰিপà§\8dà¦\9fৰ à¦ªà§\8dৰয়à§\8bà¦\9cন)',
 'tog-numberheadings' => 'শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক',
 'tog-showtoolbar' => 'সম্পাদনা দণ্ডিকা দেখুৱাওক (জাভাস্ক্ৰিপ্টৰ দৰকাৰ)',
 'tog-editondblclick' => 'একেলগে দুবাৰ টিপা মাৰিলে পৃষ্ঠা সম্পাদনা কৰক (জাভাস্ক্ৰিপ্টৰ দৰকাৰ)',
 'tog-editsection' => '[সম্পাদনা] সংযোগৰ দ্বাৰা অনুচ্ছেদ সম্পাদনা কৰা সক্ৰিয় কৰক',
-'tog-editsectiononrightclick' => 'অনুচ্ছেদৰ শিৰোনামাত সোঁ-বুটাম টিপা মাৰি সম্পাদনা কৰাটো সক্ৰিয় কৰক (জাভাস্ক্ৰিপ্ট)',
+'tog-editsectiononrightclick' => 'অনুচ্ছেদৰ শিৰোনামাত সোঁ-বুটাম টিপা মাৰি সম্পাদনা কৰাটো সক্ৰিয় কৰক (জাভাস্ক্ৰিপ্টৰ প্ৰয়োজন)',
 'tog-showtoc' => 'শিৰোনামাৰ সূচী দেখুৱাওক (যিবোৰ পৃষ্ঠাত তিনিটাতকৈ বেছি শিৰোনামা আছে)',
 'tog-rememberpassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখক (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
 'tog-watchcreations' => 'মই সৃষ্টি সকলো পৃষ্ঠা মোৰ লক্ষ্য-তালিকাত যোগ কৰক',
@@ -156,7 +156,7 @@ $messages = array(
 'tog-ccmeonemails' => 'মই অন্য সদস্যলৈ পঠোৱা ই-মেইলৰ প্ৰতিলিপি এটা মোলৈও পঠাব',
 'tog-diffonly' => 'পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব',
 'tog-showhiddencats' => 'নিহিত শ্ৰেণী সমূহ দেখুৱাওক',
-'tog-norollbackdiff' => 'ৰà§\8bলবà§\87à¦\95à§\8d à¦\95ৰা à¦ªà¦¾à¦\9aত পাৰ্থক্য নেদেখুৱাব',
+'tog-norollbackdiff' => 'পà§\82ৰà§\8dবৱত à¦\95ৰা à¦ªà¦¾à¦\9bত পাৰ্থক্য নেদেখুৱাব',
 
 'underline-always' => 'সদায়',
 'underline-never' => 'কেতিয়াও নহয়',
@@ -170,14 +170,14 @@ $messages = array(
 'editfont-serif' => 'চেৰিফ ফন্ট',
 
 # Dates
-'sunday' => 'দেওবাৰ',
+'sunday' => 'দà§\87à¦\93à¦\81বাৰ',
 'monday' => 'সোমবাৰ',
 'tuesday' => 'মঙ্গলবাৰ',
 'wednesday' => 'বুধবাৰ',
 'thursday' => 'বৃহস্পতিবাৰ',
 'friday' => 'শুক্ৰবাৰ',
 'saturday' => 'শণিবাৰ',
-'sun' => 'দেও',
+'sun' => 'দেও',
 'mon' => 'সোম',
 'tue' => 'মংগল',
 'wed' => 'বুধ',
@@ -208,8 +208,8 @@ $messages = array(
 'october-gen' => 'অক্টোবৰ',
 'november-gen' => 'নৱেম্বৰ',
 'december-gen' => 'ডিচেম্বৰ',
-'jan' => 'জানু:',
-'feb' => 'ফেব্ৰু:',
+'jan' => 'জানুৱাৰী:',
+'feb' => 'ফেব্ৰুৱাৰী:',
 'mar' => 'মাৰ্চ',
 'apr' => 'এপ্ৰিল',
 'may' => 'মে',
@@ -217,18 +217,18 @@ $messages = array(
 'jul' => 'জুলাই',
 'aug' => 'আগষ্ট',
 'sep' => 'ছেপ্টেম্বৰ:',
-'oct' => 'অক্টো:',
-'nov' => 'নৱে:',
-'dec' => 'ডিচে:',
+'oct' => 'অক্টোবৰ:',
+'nov' => 'নৱেম্বৰ:',
+'dec' => 'ডিচেম্বৰ:',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণী}}',
+'pagecategories' => '{{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}}',
 'category_header' => '"$1" শ্ৰেণীৰ পৃষ্ঠাসমূহ',
 'subcategories' => 'উপশ্ৰেণীসমূহ',
 'category-media-header' => '"$1" শ্ৰেণীৰ মিডিয়া',
 'category-empty' => "''এই শ্ৰেণীত বৰ্তমান কোনো পৃষ্ঠা বা মিডিয়া ফাইল নাই ।''",
 'hidden-categories' => '{{PLURAL:$1|নিহিত শ্ৰেণী|নিহিত শ্ৰেণীসমূহ}}',
-'hidden-category-category' => 'অদৃশ্য শ্ৰেণী সমূহ',
+'hidden-category-category' => 'অদৃশ্য শ্ৰেণীসমূহ',
 'category-subcat-count' => '{{PLURAL:$2|এই শ্ৰেণীত নিম্নলিখিত উপশ্ৰেণীসমূহ আছে। মুঠ $2টা উপশ্ৰেণীৰ ভিতৰত এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|এটা উপশ্ৰেণী|$1 টা উপশ্ৰেণী}} আছে।}}',
 'category-subcat-count-limited' => 'এই শ্ৰেণীত নিম্নলিখিত {{PLURAL:$1|টা উপশ্ৰেণী আছে|$1টা উপশ্ৰেণী আছে}}।',
 'category-article-count' => '{{PLURAL:$2|এই শ্ৰেণীটোত কেৱল তলত দিয়া পৃষ্ঠাহে আছে । মুঠ $2 খনৰ ভিতৰত এই শ্ৰেণীটোত তলৰ {{PLURAL:$1|এখন পৃষ্ঠা আছে|$1 খন পৃষ্ঠা আছে}}।}}',
@@ -241,9 +241,9 @@ $messages = array(
 'broken-file-category' => 'অবৈধ ফাইল সংযোগযুক্ত পৃষ্ঠাবোৰ',
 
 'about' => 'বিষয়ে',
-'article' => 'বিষয়বসà§\8dতà§\81 পৃষ্ঠা',
+'article' => 'সমল পৃষ্ঠা',
 'newwindow' => "(নতুন ৱিণ্ড'ত খোল খায়)",
-'cancel' => 'ৰদ à¦\95ৰা à¦¹à¦\93ক',
+'cancel' => 'বাতিল à¦\95ৰক',
 'moredotdotdot' => 'অধিক...',
 'mypage' => 'মোৰ পৃষ্ঠা',
 'mytalk' => 'মোৰ কথা-বতৰা',
@@ -264,7 +264,7 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'বিষয় যোগ',
-'vector-action-delete' => 'মà¦\9aি à¦ªà§\87লাà¦\93ক',
+'vector-action-delete' => 'বিলà§\8bপ à¦\95ৰক',
 'vector-action-move' => 'স্থানান্তৰ কৰক',
 'vector-action-protect' => 'সুৰক্ষিত কৰক',
 'vector-action-undelete' => 'পুনৰুদ্ধাৰ কৰক',
@@ -275,13 +275,13 @@ $messages = array(
 'vector-view-history' => 'ইতিহাস চাওক',
 'vector-view-view' => 'পঢ়ক',
 'vector-view-viewsource' => 'উৎস চাওক',
-'actions' => 'à¦\95াৰà§\8dযà§\8dযসমà§\82হ',
+'actions' => 'কাৰ্যসমূহ',
 'namespaces' => 'নামস্থান',
 'variants' => 'বিকল্পসমূহ',
 
 'errorpagetitle' => 'ভুল',
-'returnto' => '$1 লৈ ঘূৰি যাওক ।',
-'tagline' => '{{SITENAME}} -ৰ পৰা',
+'returnto' => '$1লৈ ঘূৰি যাওক ।',
+'tagline' => '{{SITENAME}}ৰ পৰা',
 'help' => 'সহায়',
 'search' => 'সন্ধান',
 'searchbutton' => 'সন্ধান কৰক',
@@ -305,7 +305,7 @@ $messages = array(
 'protect' => 'সুৰক্ষিত কৰক',
 'protect_change' => 'সলাওক',
 'protectthispage' => 'বৰ্তমান পৃষ্ঠাৰ সংৰক্ষণবিধিৰ পৰিবৰ্তন',
-'unprotect' => 'সà¦\82ৰà¦\95à§\8dষণ সলনি কৰক',
+'unprotect' => 'সà§\81ৰà¦\95à§\8dষা সলনি কৰক',
 'unprotectthispage' => 'এই পৃষ্ঠাৰ সুৰক্ষা সলনি কৰক',
 'newpage' => 'নতুন পৃষ্ঠা',
 'talkpage' => 'এই পৃষ্ঠা সম্পৰ্কে কথা-বতৰা',
@@ -316,20 +316,20 @@ $messages = array(
 'articlepage' => 'সমল পৃষ্ঠা চাওক',
 'talk' => 'আলোচনা',
 'views' => 'দৰ্শন',
-'toolbox' => 'সা-সৰঞ্জাম',
+'toolbox' => 'সা-সৰঞ্জাম',
 'userpage' => 'সদস্য পৃষ্ঠা চাওক',
-'projectpage' => 'প্ৰকল্প পৃষ্ঠা',
-'imagepage' => 'ফাà¦\87ল পৃষ্ঠা চাওক',
+'projectpage' => 'প্ৰকল্প পৃষ্ঠা চাওক',
+'imagepage' => 'নথি পৃষ্ঠা চাওক',
 'mediawikipage' => 'বাৰ্তা পৃষ্ঠা চাওক',
 'templatepage' => 'সাঁচ পৃষ্ঠা চাওক',
 'viewhelppage' => 'সহায় পৃষ্ঠা চাওক',
 'categorypage' => 'শ্ৰেণী পৃষ্ঠা চাওক',
-'viewtalkpage' => 'à¦\95থা-বতৰা চাওক',
-'otherlanguages' => 'আন ভাষাত',
-'redirectedfrom' => '($1 ৰ পৰা পুনঃনিৰ্দেশিত)',
+'viewtalkpage' => 'à¦\86লà§\8bà¦\9aনা চাওক',
+'otherlanguages' => 'à¦\86ন à¦­à¦¾à¦·à¦¾à¦¸à¦®à§\82হত',
+'redirectedfrom' => '($1ৰ পৰা পুনঃনিৰ্দেশিত)',
 'redirectpagesub' => 'পুনঃনিৰ্দেশিত পৃষ্ঠা',
 'lastmodifiedat' => 'এই পৃষ্ঠাখন শেষবাৰৰ কাৰণে $1 তাৰিখে $2 বজাত সলনি কৰা হৈছিল।',
-'viewcount' => 'এই পৃষ্ঠাটো {{PLURAL:$1|এবাৰ|$1}} বাৰ চোৱা হৈছে',
+'viewcount' => 'এই পৃষ্ঠাটো {{PLURAL:$1|এবাৰ|$1 বাৰ}} চোৱা হৈছে',
 'protectedpage' => 'সুৰক্ষিত পৃষ্ঠা',
 'jumpto' => 'গম্যাৰ্থে',
 'jumptonavigation' => 'দিকদৰ্শন',
@@ -339,7 +339,7 @@ $messages = array(
 অনুগ্ৰহ কৰি অলপ পাছত এই পৃষ্ঠা চাবলৈ প্ৰয়াস কৰক ।
 
 $1',
-'pool-timeout' => 'লà¦\95ৰ à¦¬à¦¾à¦¬à§\87 à¦\85পà§\87à¦\95à§\8dষা à¦\95ৰি সময় উকলি গৈছে',
+'pool-timeout' => 'বনà§\8dধ à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\85পà§\87à¦\95à§\8dষা à¦\95ৰাৰ সময় উকলি গৈছে',
 'pool-queuefull' => 'পোল কিউ (pool queue) সমূল',
 'pool-errorunknown' => 'অপৰিচিত ত্ৰুটি',
 
@@ -350,7 +350,7 @@ $1',
 'copyrightpage' => '{{ns:project}}:স্বত্ব',
 'currentevents' => 'সাম্প্ৰতিক ঘটনাৱলী',
 'currentevents-url' => 'Project:শেহতীয়া ঘটনাৱলী',
-'disclaimers' => 'à¦\98à§\8bষণা',
+'disclaimers' => 'দায়লà§\81পà§\8dতি',
 'disclaimerpage' => 'Project:সাধাৰণ দায়লুপ্তি',
 'edithelp' => 'সম্পাদনাৰ বাবে সহায়',
 'edithelppage' => 'Help:সম্পাদনা',
@@ -370,12 +370,12 @@ $1',
 'versionrequired' => 'মিডিয়াৱিকিৰ $1 সংকলন থাকিব লাগিব ।',
 'versionrequiredtext' => 'এই পৃষ্ঠাটো ব্যৱহাৰ কৰিবলৈ মিডিয়াৱিকিৰ $1 সংস্কৰণ থাকিব লাগিব । [[Special:Version|সংস্কৰণ পৃষ্ঠা]] চাওক।',
 
-'ok' => 'à¦\85â\80\99à¦\95ে',
-'retrievedfrom' => '"$1" -ৰ পৰা সংকলিত',
+'ok' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'retrievedfrom' => '"$1"ৰ পৰা সংকলিত',
 'youhavenewmessages' => 'আপোনাৰ কাৰণে $1 আছে। ($2)',
-'newmessageslink' => 'নতà§\81ন à¦¬à¦¾à§°à§\8dতা',
+'newmessageslink' => 'নতà§\81ন à¦¸à¦\82বাদ',
 'newmessagesdifflink' => 'শেহতীয়া সাল-সলনি',
-'youhavenewmessagesmulti' => '$1ত à¦\86পà§\8bনাৰ à¦\95াৰণà§\87 à¦¨à¦¤à§\81ন à¦¬à¦¾à§°à§\8dতা আছে',
+'youhavenewmessagesmulti' => '$1ত à¦\86পà§\8bনাৰ à¦\95াৰণà§\87 à¦¨à¦¤à§\81ন à¦¸à¦\82বাদ আছে',
 'editsection' => 'সম্পাদনা কৰক',
 'editold' => 'সম্পাদনা',
 'viewsourceold' => 'উৎস চাওক',
@@ -394,9 +394,9 @@ $1',
 'feed-invalid' => 'অবৈধ গ্ৰাহক ফিড প্ৰকাৰ',
 'feed-unavailable' => 'চিণ্ডিকেশ্যন ফিড মজুত নাই',
 'site-rss-feed' => '$1 আৰ-এচ-এচ ফীড',
-'site-atom-feed' => '$1 à¦\8fà¦\9fম à¦«à¦¿ড',
+'site-atom-feed' => '$1 à¦\8fà¦\9fম à¦«à§\80ড',
 'page-rss-feed' => '"$1" আৰ-এচ-এচ ফীড',
-'page-atom-feed' => '"$1" à¦\8fà¦\9fম à¦«à¦¿ড',
+'page-atom-feed' => '"$1" à¦\8fà¦\9fম à¦«à§\80ড',
 'red-link-title' => '$1 (পৃষ্ঠাটো নাই)',
 'sort-descending' => 'ক্ৰমহ্ৰস্বমান ভাৱে ক্ৰমবদ্ধ কৰক',
 'sort-ascending' => 'ক্ৰমবৰ্দ্ধমান ভাৱে ক্ৰমবদ্ধ কৰক',
@@ -407,26 +407,26 @@ $1',
 'nstab-media' => 'মিডিয়া পৃষ্ঠা',
 'nstab-special' => 'বিশেষ পৃষ্ঠা',
 'nstab-project' => 'প্ৰকল্প পৃষ্ঠা',
-'nstab-image' => 'à¦\9aিতà§\8dৰ',
-'nstab-mediawiki' => 'বাৰà§\8dতা',
+'nstab-image' => 'নথি',
+'nstab-mediawiki' => 'সà¦\82বাদ',
 'nstab-template' => 'সাঁচ',
 'nstab-help' => 'সাহায্য পৃষ্ঠা',
 'nstab-category' => 'শ্ৰেণী',
 
 # Main script and global functions
 'nosuchaction' => 'এনে কাৰ্য নাই',
-'nosuchactiontext' => "এই ইউআৰএল-এ নিৰ্ধাৰিত কৰা কাৰ্য্য অবৈধ।
+'nosuchactiontext' => "এই ইউআৰএলে নিৰ্ধাৰিত কৰা কাৰ্য অবৈধ।
 আপুনি বোধহয়  ইউআৰএল ভুলকৈ লিখিছে বা এটা ভুল লিঙ্ক অনুকৰণ কৰিছে ।
-হ'বও পাৰে যে {{SITENAME}}-ত ব্যৱহাৰ হোৱা চফ্টৱেৰত ত্ৰুটি আছে ।",
-'nosuchspecialpage' => 'এনেকুৱা কোনো বিশেষ পৃষ্ঠা নাই',
+{{SITENAME}}ত ব্যৱহাৰ হোৱা চফ্টৱেৰত ত্ৰুটি হ'বও পাৰে ।",
+'nosuchspecialpage' => 'এনে ধৰনৰ কোনো বিশেষ পৃষ্ঠা নাই',
 'nospecialpagetext' => '<strong>আপুনি অবৈধ বিশেষ পৃষ্ঠা এটা অনুৰোধ কৰিছে ।</strong>
 
- বৈধ বিশেষ পৃষ্ঠাসমূহৰ তালিকা ইয়াত পাব [[Special:SpecialPages|{{int:specialpages}}]] ।',
+বৈধ বিশেষ পৃষ্ঠাসমূহৰ তালিকা ইয়াত পাব [[Special:SpecialPages|{{int:specialpages}}]] ।',
 
 # General errors
 'error' => 'ভুল',
 'databaseerror' => 'তথ্যকোষৰ ভুল',
-'dberrortext' => 'Database query-ত ভুল আছে।
+'dberrortext' => 'Database query’ত ত্ৰুটি আছে।
 ছফ্টৱেৰত থকা কোনো বাগৰ বাবে এনে হব পাৰে।
 অন্তিমবাৰ চেষ্টা কৰা ডাটাবেচ কুৱেৰীটো আছিল এনেধৰণৰ:
 <blockquote><tt>$1</tt></blockquote>
@@ -448,30 +448,30 @@ $1',
 বিলোপ কৰা কোনো পৃষ্ঠাৰ সংযোগৰ বাবে সাধাৰণতে এনে ঘটে ।
 
 যদি এনে হোৱা নাই তেন্তে আপুনি ছফ্টৱেৰত কিবা সমস্যা পাইছে ।
-অনুগ্ৰহ কৰি এই সম্পৰ্কে ইউ.আৰ.এল. সহ কোনো [[Special:ListUsers/sysop|প্ৰশাসক]] ক জনাওক ।',
+অনুগ্ৰহ কৰি এই সম্পৰ্কে ইউ.আৰ.এল. সহ কোনো [[Special:ListUsers/sysop|প্ৰশাসক]]ক জনাওক ।',
 'missingarticle-rev' => '(সংস্কৰণ#: $1)',
 'missingarticle-diff' => '(তফাৎ: $1, $2)',
 'readonly_lag' => 'তথ্যকোষ স্বয়ংক্ৰিয়ভাৱে বন্ধ হৈছে যাতে দ্বিতীয় শ্ৰেণীৰ তথ্যকোষৰ চাৰ্ভাৰ প্ৰধান তথ্যকোষৰ চাৰ্ভাৰৰ অৱস্থালৈ আহিব পাৰে ।',
 'internalerror' => 'আভ্যন্তৰীণ ক্ৰুটি',
-'internalerror_info' => 'ভিতৰà§\81ৱা ত্ৰুটি: $1',
-'fileappenderrorread' => 'à¦\9cোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
+'internalerror_info' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ ত্ৰুটি: $1',
+'fileappenderrorread' => 'যোৰা দিয়াৰ সময়ত "$1" পাঠ্য কৰা নহ\'ল ।',
 'fileappenderror' => '"$2"ৰ লগত "$1"ৰ সংযোগ কৰা নহ\'ল ।',
-'filecopyerror' => '"$1" ফাইলটো "$2" লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।',
-'filerenameerror' => '"$1" ফাইলৰ নাম সলনি কৰি "$2" কৰিব পৰা নগল ।',
-'filedeleteerror' => '"$1" ফাইলতো বিলোপ কৰিব পৰা নগল।',
-'directorycreateerror' => '"$1" à¦¡à¦¾à¦\87ৰà§\87à¦\95à§\8dà¦\9fৰি সৃষ্টি কৰিব পৰা নগ’ল।',
-'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগল।',
+'filecopyerror' => '"$1" ফাইলটো "$2"লৈ প্ৰতিলিপি কৰিব পৰা নগ’ল।',
+'filerenameerror' => '"$1" ফাইলৰ নাম সলনি কৰি "$2" কৰিব পৰা নগল ।',
+'filedeleteerror' => '"$1" ফাইলতো বিলোপ কৰিব পৰা নগল।',
+'directorycreateerror' => '"$1" à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া সৃষ্টি কৰিব পৰা নগ’ল।',
+'filenotfound' => '"$1" নামৰ ফাইলটো বিচাৰি পোৱা নগল।',
 'fileexistserror' => '"$1" ফাইলটোত লিখিব নোৱাৰি: ফাইলটো আগৰ পৰাই আছে',
 'unexpected' => 'অনাকাংক্ষিত মূল্য: "$1"="$2".',
 'formerror' => 'ভুল: ফৰ্ম খন জমা দিব পৰা নগ’ল',
 'badarticleerror' => 'এই পৃষ্ঠাটোত এই কামটো কৰিব নোৱাৰি ।',
-'cannotdelete' => '"$1" à¦ªà§\83ষà§\8dঠা à¦¬à¦¾ à¦«à¦¾à¦\87ল à¦®à¦\9aা à¦¸à¦®à§\8dভব à¦¨à¦¹à¦¯à¦¼ ।
-সমà§\8dভৱ à¦\86নà§\87 à¦\86à¦\97à§\87à¦\87 à¦®à¦\9aি à¦¥à§\88ছে ।',
+'cannotdelete' => '"$1" à¦ªà§\83ষà§\8dঠা à¦¬à¦¾ à¦¨à¦¥à¦¿à¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦\85সমà§\8dভৱ ।
+সমà§\8dভৱ à¦\86নà§\87 à¦\86à¦\97à§\87à¦\87 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিছে ।',
 'cannotdelete-title' => '"$1" পৃষ্ঠা বিলোপ কৰিব নোৱাৰি',
 'badtitle' => 'অগ্ৰহণীয় শিৰোনামা',
 'badtitletext' => 'আপুনি বিচৰা পৃষ্ঠাটোৰ শিৰোনামা অযোগ্য, খালী বা ভুলকৈ জড়িত আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি শিৰোনামা। ইয়াত এক বা ততোধিক বৰ্ণ আছে যাক শিৰোনামাত ব্যৱহাৰ কৰিব নোৱাৰি।',
-'perfcached' => "তলত দিয়া তথ্যখিনি আগতে জমা কৰি থোৱা (cached) আৰু সাম্প্ৰতিক নহ'ব পাৰে। এই তথ্যখিনিত সৰ্বোচ্চ {{PLURAL:$1|এটা ফলফল|$1টা ফলাফল}} উপলব্ধ।",
-'perfcachedts' => 'তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই cacheত পাব।',
+'perfcached' => "তলত à¦¦à¦¿à¦¯à¦¼à¦¾ à¦¤à¦¥à§\8dযà¦\96িনি à¦\86à¦\97তà§\87 à¦\9cমা à¦\95ৰি à¦¥à§\8bৱা (cached) à¦\86ৰà§\81 à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦¨à¦¹'ব à¦ªà¦¾à§°à§\87। à¦\8fà¦\87 à¦¤à¦¥à§\8dযà¦\96িনিত à¦¸à§°à§\8dবà§\8bà¦\9aà§\8dà¦\9a {{PLURAL:$1|à¦\8fà¦\9fা à¦«à¦²à¦¾à¦«à¦²|$1à¦\9fা à¦«à¦²à¦¾à¦«à¦²}} à¦\89পলবà§\8dধ।",
+'perfcachedts' => 'তলত দিয়া তথ্য খিনি আগতে জমা কৰি থোৱা (cached) আৰু শেষবাৰৰ কাৰণে $1 ত নবীকৰণ কৰা হৈছিল। সৰ্বাধিক {{PLURAL:$4|এটা ফলাফল|$4 টা ফলাফল}} এই কেশ্বত পাব।',
 'querypage-no-updates' => 'এই পৃষ্ঠাটো নৱীকৰণ কৰা ৰোধ কৰা হৈছে। ইয়াৰ তথ্য এতিয়া সতেজ কৰিব নোৱাৰি।',
 'wrong_wfQuery_params' => 'wfQuery() ৰ কাৰণে ভুল মাপদণ্ড দিয়া হৈছে <br />
 কাৰ্য: $1<br />পৃষ্ঠা: $2',
@@ -489,13 +489,17 @@ $1',
 'cascadeprotected' => 'এই পৃষ্ঠাখন সম্পাদনাৰ পৰা সুৰক্ষিত কাৰণ এই {{PLURAL:$1|পৃষ্ঠা, যিখন|পৃষ্ঠা, যিবোৰ}} "প্ৰপাতাকাৰ" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: 
 $2',
 'namespaceprotected' => "আপোনাৰ '''$1''' নামস্থানৰ পৃষ্ঠাসমূহ সম্পাদনা কৰাৰ অধিকাৰ নাই।",
-'customcssprotected' => 'এই পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত চেটিংচ আছে ।',
-'customjsprotected' => 'à¦\8fà¦\87 à¦\9cাভালিপিৰ à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰাৰ à¦\85ধিà¦\95াৰ à¦\86পà§\8bনাৰ à¦¨à¦¾à¦\87, à¦\95াৰণ à¦\87য়াত à¦\86ন à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦\9aà§\87à¦\9fিà¦\82à¦\9a আছে ।',
+'customcssprotected' => 'এই CSS পৃষ্ঠা সম্পাদনা কৰাৰ অধিকাৰ আপোনাৰ নাই, কাৰণ ইয়াত আন সদস্যৰ ব্যক্তিগত পছন্দসমূহত আছে ।',
+'customjsprotected' => 'à¦\8fà¦\87 à¦\9cাভালিপিৰ à¦ªà§\83ষà§\8dঠা à¦¸à¦®à§\8dপাদনা à¦\95ৰাৰ à¦\85ধিà¦\95াৰ à¦\86পà§\8bনাৰ à¦¨à¦¾à¦\87, à¦\95াৰণ à¦\87য়াত à¦\86ন à¦¸à¦¦à¦¸à§\8dযৰ à¦¬à§\8dযà¦\95à§\8dতিà¦\97ত à¦ªà¦\9bনà§\8dদসমà§\82হত আছে ।',
 'ns-specialprotected' => 'বিশেষ পৃষ্ঠা সম্পাদিত কৰিব নোৱাৰি।',
-'titleprotected' => "[[User:$1|$1]] à¦¸à¦¦à¦¸à§\8dযà¦\9cনà§\87 à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bণামাৰ লিখনী লিখা ৰোধ কৰিছে ।
+'titleprotected' => "[[User:$1|$1]] à¦¸à¦¦à¦¸à§\8dযà¦\9cনà§\87 à¦\8fà¦\87 à¦¶à¦¿à§°à§\8bনাণমাৰ লিখনী লিখা ৰোধ কৰিছে ।
 ইয়াৰ কাৰণ হৈছে ''$2'' ।",
 'filereadonlyerror' => '"$1" ফাইলটোক পৰিৱৰ্তন কৰিব পৰা নগ\'ল কাৰণ ফাইল ভঁৰাল "$2" কেৱল পঢ়িব পৰা অৱস্থাত আছে।
-দৰ্শোৱা কাৰণ হৈছে "\'\'$3\'\'"।',
+যিজন প্ৰশাসকে এইটো বন্ধ কৰিছে তেওঁ দৰ্শোৱা কাৰণ হৈছে: \'\'$3\'\'।',
+'invalidtitle-knownnamespace' => 'নামস্থান "$2" আৰু পাঠ্য "$3" থকা অবৈধ শিৰোনাম',
+'invalidtitle-unknownnamespace' => 'অজ্ঞাত নামস্থান সংখ্যা $1 আৰু পাঠ্য "$2" থকা অবৈধ শিৰোনাম',
+'exception-nologin' => 'প্ৰৱেশ কৰা নাই',
+'exception-nologin-text' => 'এই পৃষ্ঠা অথবা কামৰ বাবে আপুনি প্ৰৱেশ কৰা বাধ্যতামূলক',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগাৰেচন: অজ্ঞাত ভাইৰাছ স্কেনাৰ: ''$1''",
@@ -507,9 +511,9 @@ $2',
 
 আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে [[Special:UserLogin|প্ৰৱেশ]] কৰিব পাৰে।
 মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
-'welcomecreation' => '== à¦¸à§\8dবাà¦\97তম, $1! ==
+'welcomecreation' => '== à¦\86দৰিà¦\9bà§\8bà¦\81, $1! ==
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
-[[Special:Preferences|{{SITENAME}}  পচন্দসমূহ]]ত আপোনাৰ পচন্দমতে ব্যক্তিগতকৰণ কৰি লবলৈ নাপাহৰে যেন ।',
+[[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
 'yourpassword' => 'আপোনাৰ গুপ্তশব্দ',
 'yourpasswordagain' => 'গুপ্তশব্দ আকৌ এবাৰ লিখক',
@@ -519,14 +523,14 @@ $2',
 'externaldberror' => 'কোনো প্ৰামাণ্যকৰণ তথ্যকোষৰ ত্ৰুটি ঘটিছে নতুবা আপোনাৰ বৰ্হি-একাউণ্ট নৱীকৰণ কৰাৰ অনুমতি নাই ।',
 'login' => 'প্ৰৱেশ',
 'nav-login-createaccount' => 'প্ৰৱেশ/সদস্যভুক্তি',
-'loginprompt' => '{{SITENAME}}ত à¦ªà§\8dৰৱà§\87শ à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦\95à§\81à¦\95à§\80 à¦¸à¦\95à§\8dৰà§\80য় à¦\95ৰিব à¦²à¦¾à¦\97িব',
+'loginprompt' => '{{SITENAME}}ত à¦ªà§\8dৰৱà§\87শ à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦\95à§\81à¦\95িà¦\9cà§\8d à¦¸à¦\95à§\8dৰিয় à¦¥à¦¾à¦\95িব à¦²à¦¾à¦\97িব।',
 'userlogin' => 'প্ৰৱেশ/সদস্যভুক্তি',
 'userloginnocreate' => 'প্ৰৱেশ',
 'logout' => 'প্ৰস্থান',
 'userlogout' => 'প্ৰস্থান',
 'notloggedin' => 'প্ৰৱেশ কৰা নাই',
-'nologin' => 'আপোনাৰ একাউণ্ট নাই নেকি? $1',
-'nologinlink' => 'নতà§\81ন à¦¸à¦¦à¦¸à§\8dযভà§\81à¦\95à§\8dতি à¦\95ৰক',
+'nologin' => "ৱিকিপিডিয়াত আপোনাৰ একাউণ্ট নাই নেকি? তেনে '''$1'''।",
+'nologinlink' => 'নতà§\81ন à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦\96à§\8bলক',
 'createaccount' => 'সভ্যভুক্ত হবলৈ',
 'gotaccount' => "আপুনি সদস্য হয়নে? '''$1'''",
 'gotaccountlink' => 'প্ৰৱেশ',
@@ -539,9 +543,9 @@ $2',
 'loginerror' => 'প্ৰৱেশ সমস্যা',
 'createaccounterror' => "একাউন্ট সৃষ্টি কৰা নহ'ল: $1",
 'nocookiesnew' => 'আপোনাৰ সদস্যভুক্তি হৈ গৈছে, কিন্তু আপুনি প্ৰৱেশ কৰা নাই।
-{{SITENAME}} ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
+{{SITENAME}}ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
 আপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।
-অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত আপোনাৰ সদস্যনামেৰে প্ৰৱেশ কৰক।',
+অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত আপোনাৰ সদস্য নামেৰে প্ৰৱেশ কৰক।',
 'nocookieslogin' => '{{SITENAME}} ত প্ৰৱেশ কৰিবলৈ কুকি সক্ৰিয় থাকিব লাগিব।
 আপুনি কুকি নিষ্ক্ৰিয় কৰি থৈছে।
 অনুগ্ৰহ কৰি কুকি সক্ৰিয় কৰক, আৰু তাৰ পাছত চেষ্টা কৰক।',
@@ -549,7 +553,7 @@ $2',
 আপোনাৰ কুকি সক্ৰিয় ৰাখক, এই পৃষ্ঠা ৰি-লোড কৰি পুনৰ চেষ্টা কৰক ।',
 'noname' => 'আপুনি বৈধ সদস্যনাম এটা দিয়া নাই।',
 'loginsuccesstitle' => "প্ৰৱেশ অনুমোদিত হ'ল",
-'loginsuccess' => "''' à¦\86পà§\81নি {{SITENAME}}ত \"\$1\" à¦¨à¦¾à¦®à§\87ৰà§\87 à¦ªà§\8dৰবেশ কৰিলে '''",
+'loginsuccess' => "''' à¦\86পà§\81নি {{SITENAME}}ত \"\$1\" à¦¨à¦¾à¦®à§\87ৰà§\87 à¦ªà§\8dৰৱেশ কৰিলে '''",
 'nosuchuser' => '"$1" নামৰ কোনো সদস্য নাই।
 সদস্য নাম আকাৰ সংবেদনশীল।
 আপোনাৰ বানানতো চাওক, বা  [[Special:UserLogin/signup|নতুন সদস্যভুক্তি কৰক]]।',
@@ -563,18 +567,18 @@ $2',
 'password-name-match' => "আপোনাৰ গুপ্তশব্দ আৰু আপোনাৰ সদস্যনাম বেলেগ হ'ব লাগিব",
 'password-login-forbidden' => 'এই সদস্যনাম আৰু গুপ্তশব্দৰ ব্যৱহাৰ নিষিদ্ধ কৰা হৈছে ।',
 'mailmypassword' => 'ই-মেইলত গুপ্তশব্দ পঠিয়াওক',
-'passwordremindertitle' => '{{SITENAME}} ৰ কাৰণে নতুন অস্থায়ী গুপ্তশব্দ',
+'passwordremindertitle' => '{{SITENAME}}ৰ কাৰণে নতুন অস্থায়ী গুপ্তশব্দ',
 'passwordremindertext' => 'কোনোবাই (হয়তো আপুনি, $1 আই-পি ঠিকনাৰ পৰা)
-{{SITENAME}} ত ব্যৱহাৰ কৰিবলৈ নতুন গুপ্তশব্দ বিছাৰিছে ($4) ।
+{{SITENAME}}ত ব্যৱহাৰ কৰিবলৈ নতুন গুপ্তশব্দৰ বাবে অনুৰোধ কৰিছে ($4) ।
 "$2" সদস্যজনৰ কাৰণে এতিয়া নতুন গুপ্তশব্দ হৈছে "$3" ।
 আপুনি এতিয়া প্ৰৱেশ কৰক আৰু গুপ্তশব্দতো সলনি কৰক।
-à¦\86পà§\8bনাৰ à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ {{PLURAL:$5|à¦\8fদিনৰ|$5 à¦¦à¦¿à¦¨à§°}} à¦­à¦¿à¦¤à§°à¦¤ à§°à¦¦ কৰা হ\'ব ।
+à¦\86পà§\8bনাৰ à¦\85সà§\8dথায়à§\80 à¦\97à§\81পà§\8dতশবà§\8dদ {{PLURAL:$5|à¦\8fদিনৰ|$5 à¦¦à¦¿à¦¨à§°}} à¦­à¦¿à¦¤à§°à¦¤ à¦¬à¦¾à¦¤à¦¿à¦² কৰা হ\'ব ।
 
 যদি আপুনি এই অনুৰোধ কৰা নাছিল অথবা যদি আপোনাৰ গুপ্তশব্দতো মনত আছে আৰু তাক সলাব নিবিছাৰে, তেনেহলে আপুনি এই বাৰ্তাতো অৱজ্ঞা কৰিব পাৰে আৰু আপোনাৰ আগৰ গুপ্তশব্দটোকে ব্যৱহাৰ কৰি থাকিব পাৰে।',
 'noemail' => '"$1" সদস্যজনৰ কোনো ই-মেইল ঠিকনা সঞ্চিত কৰা নাই।',
 'noemailcreate' => 'আপুনি এটা সঠিক ই-মেইল ঠিকনা দিব লাগিব',
-'passwordsent' => '"$1" à§° à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95নাত à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\8fà¦\9fা à¦ªà¦ à§\8bৱা à¦¹à§\88à¦\9bà§\87। à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¸à§\87য়া à¦ªà§\8bৱাৰ à¦ªà¦¾à¦\9bত à¦ªà§\81নৰ à¦ªà§\8dৰবেশ কৰক।',
-'blocked-mailpassword' => 'আপোনাৰ IP ঠিকনাৰ পৰা সম্পাদনা কৰা বাৰণ কৰা হৈছে, এনে অৱস্থাত দুৰ্ব্যৱহাৰ ৰোধ কৰিবলৈ গুপ্তশব্দ পুনঃউদ্ধাৰ কৰা সুবিধাতো বাতিল কৰা হৈছে।',
+'passwordsent' => '"$1" à§° à¦\87-মà§\87à¦\87ল à¦ à¦¿à¦\95নাত à¦¨à¦¤à§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\8fà¦\9fা à¦ªà¦ à§\8bৱা à¦¹à§\88à¦\9bà§\87। à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¸à§\87য়া à¦ªà§\8bৱাৰ à¦ªà¦¾à¦\9bত à¦ªà§\81নৰ à¦ªà§\8dৰৱেশ কৰক।',
+'blocked-mailpassword' => 'আপোনাৰ আইপি ঠিকনাৰ পৰা সম্পাদনা কৰা বাৰণ কৰা হৈছে, এনে অৱস্থাত দুৰ্ব্যৱহাৰ ৰোধ কৰিবলৈ গুপ্তশব্দ পুনঃউদ্ধাৰ কৰা সুবিধাতো বাতিল কৰা হৈছে।',
 'eauthentsent' => 'সঞ্চিত ই-মেইল ঠিকনাত নিশ্চিতকৰণ ই-মেইল এখন পঠোৱা হৈছে।
 আৰু অন্যান্য ই-মেইল পঠোৱাৰ আগতে, আপোনাৰ সদস্যতাৰ নিশ্চিত কৰিবলৈ সেই ই-মেইলত দিয়া নিৰ্দেশনা আপুনি অনু্সৰণ কৰিব লাগিব।',
 'throttled-mailpassword' => 'যোৱা {{PLURAL:$1|এঘণ্টাত|$1 ঘণ্টাত}} গুপ্তশব্দ পুনৰুদ্ধাৰ স্মাৰক পঠিওৱা হৈছে ।
@@ -594,28 +598,28 @@ $2',
 'accountcreated' => "একাউণ্ট সৃষ্টি কৰা হ'ল",
 'accountcreatedtext' => "$1ৰ কাৰণে সদস্য একাউণ্ট সৃষ্টি কৰা হ'ল।",
 'createaccount-title' => '{{SITENAME}}ৰ কাৰণে একাউণ্ট সৃষ্টি কৰক।',
-'createaccount-text' => 'আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4) ত "$2" নামৰ কোনোবাই, "$3" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।
+'createaccount-text' => 'আপোনাৰ ই-মেইল ঠিকনাৰ কাৰণে {{SITENAME}} ($4)ত "$2" নামৰ কোনোবাই, "$3" গুপ্তশব্দ দি সদস্যভুক্তি কৰিছে। অনুগ্ৰহ কৰি আপুনি প্ৰৱেশ কৰক আৰু গুপ্তশব্দটো সলনি কৰক।
 
 যদি এইয়া ভুলতে হৈছে, তেনেহলে আপুনি এই বাৰ্তাটো অবজ্ঞা কৰিব পাৰে ।',
-'usernamehasherror' => 'সদসà§\8dযনামত à¦¹à§\87à¦\9aà§\8dâ\80\8c à¦\86à¦\96ৰ থাকিব নোৱাৰে',
+'usernamehasherror' => 'সদসà§\8dযনামত à¦¹à§\87à¦\9aà§\8dâ\80\8c à¦\9aিহà§\8dন থাকিব নোৱাৰে',
 'login-throttled' => 'আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে ।
 অনুগ্ৰহ কৰি কিছু সময় অপেক্ষা কৰি আকৌ প্ৰয়াস কৰক ।',
 'login-abort-generic' => 'আপোনাৰ প্ৰৱেশ অসফল হৈছে- বাতিল কৰা হ’ল',
 'loginlanguagelabel' => 'ভাষা: $1',
-'suspicious-userlogout' => 'à¦\86পà§\8bনাৰ à¦ªà§\8dৰসà§\8dথানৰ à¦\85নà§\81ৰà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¦\95াৰণ à¦¹à¦¯à¦¼à¦¤à§\8b à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰ à¦\85সমà§\8dপà§\82ৰà§\8dণ à¦¨à¦¤à§\81বা à¦ªà§\82বৰà§\8dবতী তথ্য পঠাইছে ।',
+'suspicious-userlogout' => 'à¦\86পà§\8bনাৰ à¦ªà§\8dৰসà§\8dথানৰ à¦\85নà§\81ৰà§\8bধ à¦¬à¦¾à¦¤à¦¿à¦² à¦\95ৰা à¦¹à§\88à¦\9bà§\87 à¦\95াৰণ à¦¹à¦¯à¦¼à¦¤à§\8b à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰ à¦\85সমà§\8dপà§\82ৰà§\8dণ à¦¨à¦¤à§\81বা à¦ªà§\82ৰà§\8dবৱতী তথ্য পঠাইছে ।',
 
 # E-mail sending
-'php-mail-error-unknown' => 'পি.এইছ.পি মেইল() কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
+'php-mail-error-unknown' => 'পি.এইছ.পি মেইল () কাৰ্যত অজ্ঞাত ত্ৰুটি ।',
 'user-mail-no-addy' => 'ই-মেইল ঠিকনা নোহোৱাকৈয়ে ই-মেইল পঠোৱাৰ চেষ্টা কৰা হৈছে ।',
 
 # Change password dialog
 'resetpass' => 'গুপ্তশব্দ সলনি কৰক',
 'resetpass_announce' => 'আপুনি ই-মেইলত পোৱা অস্থায়ী গুপ্তশব্দৰে প্ৰৱেশ কৰিছে।
-পà§\8dৰৱà§\87শ à¦¸à¦®à§\8dপà§\81ৰ্ণ কৰিবলৈ, আপুনি এটা নতুন গুপ্তশব্দ দিব লাগিব:',
+পà§\8dৰৱà§\87শ à¦¸à¦®à§\8dপà§\82ৰ্ণ কৰিবলৈ, আপুনি এটা নতুন গুপ্তশব্দ দিব লাগিব:',
 'resetpass_header' => 'গুপ্তশব্দ সলনি কৰক',
 'oldpassword' => 'পুৰণি গুপ্তশব্দ:',
 'newpassword' => 'নতুন গুপ্তশব্দ:',
-'retypenew' => 'নতà§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\86à¦\95à§\8c à¦\9fাà¦\87প à¦\95ৰক',
+'retypenew' => 'নতà§\81ন à¦\97à§\81পà§\8dতশবà§\8dদ à¦\86à¦\95à§\8c à¦²à¦¿à¦\96ক',
 'resetpass_submit' => 'গুপ্তশব্দ বহাওক আৰু প্ৰৱেশ কৰক',
 'resetpass_success' => 'আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে, এতিয়া আপুনি প্ৰৱেশ কৰি আছে...',
 'resetpass_forbidden' => 'গুপ্তশব্দ সলনি কৰিব নোৱাৰি',
@@ -637,7 +641,7 @@ $2',
 'passwordreset-capture' => 'ফলাফল ই-মেইলখন চাওক ?',
 'passwordreset-capture-help' => "আপুনি এই ঘৰটো চিহ্নিত কৰিলে এই ই-মেইল (আৰু অস্থায়ী গুপ্তশব্দ) আপুনি দেখা পোৱাৰ লগতে সদস্যজনলৈও পঠোৱা হ'ব।",
 'passwordreset-email' => 'ই-মেইল ঠিকনা:',
-'passwordreset-emailtitle' => '{{SITENAME}} ত একাউণ্টৰ সবিশেষ তথ্য আছে ।',
+'passwordreset-emailtitle' => '{{SITENAME}}ত একাউণ্টৰ সবিশেষ তথ্য আছে ।',
 'passwordreset-emailtext-ip' => 'কোনোবাই (IP ঠিকনা $1 ৰ পৰা সম্ভৱত: আপুনিয়েই) {{SITENAME}} ($4) ৰ বাবে আপোনাৰ একাউণ্টৰ সবিশেষ তথ্য বিচাৰিছিল । ই-পত্ৰ ঠিকনাটোৰ লগত এই সদস্যৰ {{PLURAL:$3|একাউণ্ট|একাউণ্টবোৰ}} জড়িত হৈ আছে ।
 
 $2
@@ -658,7 +662,7 @@ $2
 'changeemail' => 'ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-header' => 'একাউণ্টৰ ই-মেইল ঠিকনা সলনি কৰক',
 'changeemail-text' => 'আপোনাৰ ই-মেইল ঠিকনা সলাবলৈ এই প্ৰপত্ৰখন পূৰাওক । এই সালসলনি নিশ্চিত কৰিবলৈ আপোনাৰ গুপ্তশব্দ দিব লাগিব ।',
-'changeemail-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ্ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
+'changeemail-no-info' => 'এই পৃষ্ঠা প্ৰত্যক্ষ্ ভাৱে ঢুকি পাবলৈ আপুনি প্ৰৱেশ কৰিব লাগিব ।',
 'changeemail-oldemail' => 'বৰ্তমানৰ ই-মেইল ঠিকনা:',
 'changeemail-newemail' => 'নতুন ই-মেইল ঠিকনা:',
 'changeemail-none' => '(নাই)',
@@ -671,9 +675,9 @@ $2
 'italic_sample' => 'হেলনীয়া পাঠ্য',
 'italic_tip' => 'বেঁকা পাঠ্য',
 'link_sample' => 'শিৰোনামা সংযোগ',
-'link_tip' => 'ভিতৰà§\81ৱা সংযোগ',
+'link_tip' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ সংযোগ',
 'extlink_sample' => 'http://www.example.com শীৰ্ষক সংযোগ',
-'extlink_tip' => 'বহিà¦\83সংযোগ (http:// উপসৰ্গ মনত ৰাখিব)',
+'extlink_tip' => 'বাহà§\8dযিà¦\95 সংযোগ (http:// উপসৰ্গ মনত ৰাখিব)',
 'headline_sample' => 'শিৰোনামা পাঠ্য',
 'headline_tip' => 'দ্বিতীয় স্তৰৰ শিৰোনামা',
 'nowiki_sample' => 'নসজোৱা পাঠ্য ইয়াত অন্তৰ্ভুক্ত কৰক',
@@ -717,7 +721,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 আপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰিব, আৰু আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।
 আপোনাৰ এতিয়াৰ আই-পি ঠিকনা হল $3, আৰু আপোনাৰ অবৰোধ ক্ৰমিক হৈছে #$5 ।
 এই বিষয়ে হোৱা আলোচনাত ইয়াৰ সবিশেষ সদৰী কৰে যেন।",
-'autoblockedtext' => "আপোনাৰ আই-পি ঠিকনা নিজে নিজে অৱৰোধিত হৈছে, কাৰণ ইয়াক কোনোবাই ব্যৱহাৰ কৰি থাকোতে $1 ৰ দ্বাৰা অৱৰোধ কৰা হৈছে।
+'autoblockedtext' => "আপোনাৰ আই-পি ঠিকনা নিজে নিজে অৱৰোধিত হৈছে, কাৰণ ইয়াক কোনোবাই ব্যৱহাৰ কৰি থাকোতে $1ৰ দ্বাৰা অৱৰোধ কৰা হৈছে।
 ইয়াৰ বাবে দিয়া কাৰণ হৈছে:
 
 :''$2''
@@ -726,11 +730,11 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 * অৱৰোধ সমাপ্তি: $6
 * অৱৰোধ কৰা হৈছে: $7
 
-à¦\86পà§\81নি à¦\8fà¦\87 à¦\85বৰà§\8bধৰ à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95ৰিবলà§\88 $1 à¦¬à¦¾ [[{{MediaWiki:Grouppage-sysop}}|পà§\8dৰবনà§\8dধক]]ৰ লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।
+à¦\86পà§\81নি à¦\8fà¦\87 à¦\85বৰà§\8bধৰ à¦¬à¦¿à¦·à¦¯à¦¼à§\87 à¦\86লà§\8bà¦\9aনা à¦\95ৰিবলà§\88 $1 à¦¬à¦¾ [[{{MediaWiki:Grouppage-sysop}}|পà§\8dৰশাসক]]ৰ লগত সম্পৰ্ক স্থাপন কৰিব পাৰে ।
 
 আপুনি যেতিয়ালৈ [[Special:Preferences|সদস্য পছন্দ]] পৃষ্ঠাত আপোনাৰ ই-মেইল ঠিকনা নিদিয়ে তেতিয়ালৈ ’সদস্যক ই-মেইল পঠাওক’ সুবিধাতো ব্যৱহাৰ কৰিব নোৱাৰে। আপোনাক এয়া কৰিবলৈ ৰোধ কৰা হোৱা নাই ।
-à¦\85পà§\8bনাৰ à¦\8fতিয়াৰ IP à¦ à¦¿à¦\95না à¦¹à§\88à¦\9bà§\87 $3, à¦\85ৰà§\81 à¦\86পà§\8bনাৰ à¦\85বৰোধ ক্ৰমিক হৈছে $5 ।
-এই বিষয়ে হোৱা আলোচনাত ইয়াক ব্যৱহাৰ কৰিবলৈ অনুৰোধ কৰা হল।",
+à¦\86পà§\8bনাৰ à¦\8fতিয়াৰ à¦\86à¦\87 à¦ªà¦¿ à¦ à¦¿à¦\95না à¦¹à§\88à¦\9bà§\87 $3, à¦\86ৰà§\81 à¦\86পà§\8bনাৰ à¦\85ৱৰোধ ক্ৰমিক হৈছে $5 ।
+এই বিষয়ে হোৱা আলোচনাত ইয়াক ব্যৱহাৰ কৰিবলৈ অনুৰোধ কৰা হল।",
 'blockednoreason' => 'কাৰণ দিয়া নাই',
 'whitelistedittext' => 'সম্পাদনা কৰিবলৈ $1 কৰক ।',
 'confirmedittext' => 'সম্পাদনা কৰাৰ আগতে আপুনি আপোনাৰ ই-মেইল ঠিকনাটো প্ৰমানিত কৰিব লাগিব।
@@ -741,8 +745,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'loginreqlink' => 'প্ৰৱেশ',
 'loginreqpagetext' => 'অন্যান্য পৃষ্ঠা চাবলৈ আপুনি $1 কৰিব লাগিব।',
 'accmailtitle' => "গুপ্তশব্দ পঠোৱা হ'ল।",
-'accmailtext' => "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিক ভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2-লৈ পঠোৱা হ'ল । 
-এই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|change password]]'' পৃষ্ঠাখনত গুপ্তশব্দতো সলনি কৰি ল’ব পাৰিব ।",
+'accmailtext' => "[[User talk:$1|$1]]-ৰ কাৰণে যাদৃচ্ছিক ভাৱে উৎপন্ন কৰা গুপ্তশব্দ $2লৈ পঠোৱা হ'ল । 
+এই নতুন একাউন্টত প্ৰৱেশ কৰি ''[[Special:ChangePassword|গুপ্তশব্দ সলনি কৰক]]'' পৃষ্ঠাখনত গুপ্তশব্দতো সলনি কৰি ল’ব পাৰিব ।",
 'newarticle' => '(নতুন)',
 'newarticletext' => "আপুনি বিচৰা প্ৰবন্ধটো বিচাৰি পোৱা নগ'ল।
 
@@ -771,7 +775,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 * '''Google Chrome:''' ''Ctrl-Shift-R'' টিপক (এপল মেকৰ বাবে ''⌘-Shift-R'' )
 * '''Internet Explorer:''' ''Ctrl'' ধৰি ৰাখি ''Refresh'' ক্লিক কৰক, অথবা ''Ctrl-F5'' টিপক
 * '''Konqueror: ''' ''Reload'' ক্লিক কৰক বা ''F5'' টিপক
-* '''Opera:''' ''Tools→Preferences'' ত গৈ Cache মচি পেলাওক",
+* '''Opera:''' ''Tools→Preferences'' ত গৈ কেচ্‌ মচি পেলাওক",
 'usercssyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন CSS পৰীক্ষা কৰক ।",
 'userjsyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন জাভালিপি পৰীক্ষা কৰক ।",
 'usercsspreview' => "'''মনত ৰাখিব আপুনি কেৱল আপোনাৰ ব্যৱহাৰকাৰী CSS  প্ৰাকদৰ্শন কৰিছে ।''' 
@@ -785,14 +789,16 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'userinvalidcssjstitle' => "'''সতৰ্কবাণী:'''  \"\$1\" নামৰ কোনো আৱৰণ নাই। Custom .css আৰু .js পৃষ্ঠাই সৰুফলাৰ শিৰোনামা ব্যৱহাৰ কৰে, যেনে-  {{ns:user}}:Foo/Vector.css ৰ সলনি {{ns:user}}:Foo/vector.css।",
 'updated' => "(আপডেট কৰা হ'ল)",
 'note' => "'''টোকা:'''",
-'previewnote' => "'''এয়া প্ৰাকদৰ্শনহে মাথোন। পৰিৱৰ্তনসমূহ এতিয়ও সংৰক্ষণ কৰা হোৱা নাই!'''",
+'previewnote' => "'''মনত ৰাখিব এয়া মাথোন প্ৰাক্‌দৰ্শনহে।'''
+আপোনাৰ সালসলনিসমূহ এতিয়াও সংৰক্ষণ কৰা হোৱা নাই!",
+'continue-editing' => 'সম্পাদনা জাৰী ৰাখক',
 'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
 'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
 তথাপি যদি নহয় [[Special:UserLogout|প্ৰস্থান]] কৰি আকৌ প্ৰৱেশ কৰক ।",
 'session_fail_preview_html' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 
-''যিহেতু {{SITENAME}}-ত নগ্ন এইচ-টি-এম-এল (raw HTML) সক্ৰিয় কৰা আছে, জাভাস্ক্ৰিপ্ট (Javasccript) আক্ৰমণৰ বিৰুদ্ধে সতৰ্কতাৰ খাতিৰত খচৰা আঁৰ কৰা হৈছে ।''
+''যিহেতু {{SITENAME}}ত নগ্ন এইচ-টি-এম-এল (raw HTML) সক্ৰিয় কৰা আছে, জাভাস্ক্ৰিপ্ট আক্ৰমণৰ বিৰুদ্ধে সতৰ্কতাৰ স্বাৰ্থত খচৰা আঁৰ কৰা হৈছে ।''
 
 '''এইয়া যদি এটা বৈধ সম্পাদনা আছিল, তেনে আকৌ চেষ্টা কৰক ।'''
 তথাপি যদি নহয় [[Special:UserLogout|প্ৰস্থান]] কৰি আকৌ প্ৰৱেশ কৰক ।",
@@ -801,9 +807,9 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 কোনো আসোঁৱাহপূৰ্ণ ৱেব-ভিত্তিক বেনামী প্ৰক্সী সেৱা ব্যৱহাৰ কৰিলে এনে হ’ব পাৰে ।",
 'edit_form_incomplete' => "'''এই সম্পাদনাৰ কিছু অংশ চাৰ্ভাৰলৈ নগ’ল; আপোনাৰ সম্পাদনা ঠিকে আছেনে পৰীক্ষা কৰি পুনৰ চেষ্টা কৰক ।'''",
 'editing' => '$1 সম্পাদনা',
-'creating' => 'সৃষ্টি কৰি থকা হৈছে $1',
-'editingsection' => '$1 (বিভাà¦\97) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦¥à¦\95া à¦¹à§\88ছে',
-'editingcomment' => '$1 (নতà§\81ন à¦¬à¦¿à¦­à¦¾à¦\97) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦¥à¦\95া à¦¹à§\88ছে',
+'creating' => '$1 পৃষ্ঠাখন আপুনি সৃষ্টি কৰি আছে',
+'editingsection' => '$1 (à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦\86ছে',
+'editingcomment' => '$1 (নতà§\81ন à¦\85নà§\81à¦\9aà§\8dà¦\9bà§\87দ) à¦¸à¦®à§\8dপাদনা à¦\95ৰি à¦\86ছে',
 'editconflict' => 'সম্পাদনা দ্বন্দ: $1',
 'explainconflict' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পাছত আন কোনোবাই এই পৃষ্ঠাখন সলনি কৰিলে।
 পাঠ্য-স্থানৰ উপৰ ভাগত এই পৃষ্ঠাৰ প্ৰচলিত পাঠ্য দিয়া হৈছে।
@@ -847,8 +853,8 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'template-semiprotected' => '(অৰ্ধ-সুৰক্ষিত)',
 'hiddencategories' => 'এই পৃষ্ঠা {{PLURAL:$1|১-টা নিহিত শ্ৰেণীৰ|$1-টা নিহিত শ্ৰেণীৰ}} সদস্য:',
 'nocreatetitle' => 'পৃষ্ঠা সৃষ্টি সীমিত',
-'nocreatetext' => '{{SITENAME}} ত নতুন পৃষ্ঠা সৃষ্টিৰ ক্ষমতা সীমাবদ্ধ কৰা হৈছে।
-আপুনি ঘূৰি গৈ বৰ্তমানে থকা পৃষ্ঠা এটা সম্পাদনা কৰিব পাৰে, বা [[Special:UserLogin| নতুন সদস্যভৰ্তি হওক/ প্ৰবেশ কৰক]] ।',
+'nocreatetext' => '{{SITENAME}}ত নতুন পৃষ্ঠা সৃষ্টিৰ ক্ষমতা সীমাবদ্ধ কৰা হৈছে।
+আপুনি ঘূৰি গৈ বৰ্তমানে থকা পৃষ্ঠা এটা সম্পাদনা কৰিব পাৰে, বা [[Special:UserLogin|নতুন সদস্যভৰ্তি হওক/ প্ৰবেশ কৰক]] ।',
 'nocreate-loggedin' => 'নতুন পৃষ্ঠা সৃষ্টি কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
 'sectioneditnotsupported-title' => 'অনুচ্ছেদ সম্পাদনাৰ সমৰ্থন নাই',
 'sectioneditnotsupported-text' => 'এই পৃষ্ঠাত অনুচ্ছেদ সম্পাদনাৰ সমৰ্থন নাই',
@@ -860,7 +866,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 এই পৃষ্ঠাটো সম্পাদনা কৰা উচিত হব নে নহয় আপুনি বিবেচনা কৰি চাওক।
 এই পৃষ্ঠাটো বিলোপ আৰু স্থানান্তৰ কৰাৰ অভিলেখ আপোনাৰ সুবিধাৰ্থে ইয়াত দিয়া হৈছে।",
 'moveddeleted-notice' => "এই পৃষ্ঠা বাতিল কৰা হৈছে ।
-পà§\83ষà§\8dঠাà¦\9fিৰ à¦¬à¦¾à¦¤à¦¿à¦² à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦²'à¦\97 তলত দিয়া হ'ল ।",
+পà§\83ষà§\8dঠাà¦\9fিৰ à¦¬à¦¾à¦¤à¦¿à¦² à¦\86ৰà§\81 à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦\85ভিলà§\87à¦\96 তলত দিয়া হ'ল ।",
 'log-fulllog' => 'সম্পূৰ্ণ অভিলেখ চাওক',
 'edit-hook-aborted' => 'হুকৰ দ্বাৰা সম্পাদনা প্ৰত্যাখ্যান কৰা হৈছে ।
 ইয়াৰ কোনো ব্যাখ্যা নাই ।',
@@ -870,6 +876,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'edit-no-change' => 'আপোনাৰ সম্পাদনা আওকাণ কৰা হৈছে, কাৰণ লেখাত কোনো তফাৎ নাই',
 'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
 পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
+'defaultmessagetext' => 'সাধাৰণ বাৰ্তা পাঠ্য',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতৰ্কবাণী:''' এই পৃষ্ঠাখনত অধিক এক্সপেনচিভ পাৰ্চাৰ ফাংচন কল আছে ।
@@ -885,6 +892,12 @@ $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' => 'পৃষ্ঠাখনৰ বিস্তৃতি গভীৰতা বেছি হৈছে',
+'parser-unstrip-loop-warning' => 'আন্‌ষ্ট্ৰীপ লুপ চিনাক্ত কৰা হৈছে',
+'parser-unstrip-recursion-limit' => 'আন্‌ষ্ট্ৰিপ ৰিকাৰ্ছন সীমা অতিক্ৰম হৈছে ($1)',
 
 # "Undo" feature
 'undo-success' => 'এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।
@@ -895,30 +908,30 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 
 # Account creation failure
 'cantcreateaccounttitle' => "একাউন্ট সৃষ্টি কৰা নহ'ব",
-'cantcreateaccount-text' => "IP ঠিকনা ('''$1''') ৰ পৰা একাউণ্ট সৃষ্টিত [[User:$3|$3]] এ বাধা প্ৰদান কৰিছে ।
+'cantcreateaccount-text' => "আই পি ঠিকনা ('''$1''')ৰ পৰা একাউণ্ট সৃষ্টিত [[User:$3|$3]]’য়ে বাধা প্ৰদান কৰিছে ।
 
-$3 à¦\8f à¦\86à¦\97বঢ়à§\8bৱা à¦\87য়াৰ à¦\95াৰণ à¦¹â\80\99ল ''$2''",
+$3 à¦¯à¦¼à§\87 à¦\86à¦\97বঢ়à§\8bৱা à¦\87য়াৰ à¦\95াৰণ à¦¹à§\88à¦\9bà§\87 ''$2''",
 
 # History pages
 'viewpagelogs' => 'এই পৃষ্ঠাৰ অভিলেখ চাওক ।',
 'nohistory' => 'এই পৃষ্ঠাৰ কোনো সম্পাদনাৰ ইতিহাস নাই।',
-'currentrev' => 'শà§\87হতà§\80য়া à¦­à¦¾à¦·à§\8dয',
+'currentrev' => 'শà§\87হতà§\80য়া à¦¸à¦\82সà§\8dà¦\95ৰণ',
 'currentrev-asof' => '$1 অনুযায়ী বৰ্তমান সংস্কৰণ',
-'revisionasof' => '$1 ৰ সংস্কৰণ',
-'revision-info' => '$1-লৈ $2-এ কৰা সংশোধন',
+'revisionasof' => '$1ৰ সংস্কৰণ',
+'revision-info' => '$1-লৈ $2 কৰা সংশোধন',
 'previousrevision' => '← আগৰ সংশোধন',
 'nextrevision' => 'সদ্যসংশোধিত',
 'currentrevisionlink' => 'শেহতীয়া ভাষ্য',
 'cur' => 'বৰ্তমান',
 'next' => 'পৰৱৰ্তী',
-'last' => 'পà§\82ৰà§\8dববৰ্তী',
+'last' => 'পà§\82ৰà§\8dবৱৰ্তী',
 'page_first' => 'প্ৰথম',
 'page_last' => 'অন্তিম',
 'histlegend' => "পাৰ্থক্য বাছনি: পাৰ্থক্য চাবলৈ সংকলনবোৰৰ সম্মুখত থকা ৰেডিঅ' বুটামবোৰ বাচনী কৰি এণ্টাৰ টিপক অথবা একেবাৰে তলত দিয়া বুটামতো ক্লিক কৰক <br />
 লিজেণ্ড: '''({{int:cur}})''' = বৰ্তমানৰ সংকলনৰ লগত পাৰ্থক্য,
 '''({{int:last}})''' = আগৰ সংকলনৰ লগত পাৰ্থক্য, '''{{int:minoreditletter}}'' = অগুৰুত্বপূৰ্ণ সম্পাদনা।",
 'history-fieldset-title' => 'ইতিহাসত অনুসন্ধান কৰক',
-'history-show-deleted' => 'মাথà§\8bà¦\81 à¦®à¦\9aি à¦ªà§\87লà§\8bৱা',
+'history-show-deleted' => 'মাথà§\8bà¦\81 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা',
 'histfirst' => 'আটাইতকৈ পুৰণি',
 'histlast' => 'শেহতীয়া',
 'historysize' => '({{PLURAL:$1|১ বাইট|$1 বাইট}})',
@@ -935,42 +948,42 @@ $3 এ আগবঢ়োৱা ইয়াৰ কাৰণ হ’ল ''$2''",
 # Revision deletion
 'rev-deleted-comment' => "(সম্পাদনা সাৰাংশ আঁতৰোৱা হ'ল)",
 'rev-deleted-user' => '(সদস্যনাম আঁতৰোৱা হ’ল)',
-'rev-deleted-event' => "(ল'à¦\97 à¦\95াৰà§\8dয্য আঁতৰোৱা হ'ল)",
+'rev-deleted-event' => "(à¦\85ভিলà§\87à¦\96 à¦\95াৰ্য আঁতৰোৱা হ'ল)",
 'rev-deleted-user-contribs' => "[সদস্যনাম বা আই-পি ঠিকনা আঁতৰোৱা হ'ল - সম্পাদনা বৰঙনিসমূহৰ পৰা আঁৰ কৰা হৈছে]",
 'rev-deleted-text-permission' => "পৃষ্ঠাৰ এই সংশোধনটি '''বিলোপ''' কৰা হ'ল ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦²'à¦\97ত]",
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]",
 'rev-deleted-text-unhide' => "পৃষ্ঠাখনৰ এই সংশোধনটো '''বিলোপ''' কৰা হৈছে | 
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97]ত
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
 'rev-suppressed-text-unhide' => "পৃষ্ঠাখনৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত]।
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত]।
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
 'rev-deleted-text-view' => "পৃষ্ঠাৰ এই সংশোধনটো '''বিলোপ''' কৰা হ'ল ।
-à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦²â\80\99à¦\97ত]।",
+à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85বলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]।",
 'rev-suppressed-text-view' => "পৃষ্ঠাৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হ’ল।
-à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত]।",
+à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত]।",
 'rev-deleted-no-diff' => "আপুনি এই পাৰ্থক্য চাব নোৱাৰে কাৰণ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²'à¦\97] à¦¤ ।",
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]।",
 'rev-suppressed-no-diff' => "আপুনি এই পাৰ্থক্য চাব নোৱাৰে কাৰণ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।",
 'rev-deleted-unhide-diff' => "এই পাৰ্থক্যৰ এটা সংস্কৰণ '''বিলোপ''' কৰা হৈছে ।
-বিসà§\8dতাৰিত à¦\95াৰণ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97] à¦¤ পাব ।
+বিসà§\8dতাৰিত à¦\95াৰণ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত] পাব ।
 আপুনি মন কৰিলে [$1 এই পাৰ্থক্য চাওক] ।",
 'rev-suppressed-unhide-diff' => "এই পাৰ্থক্যৰ এটা সংশোধন '''নিবাৰণ''' কৰা হৈছে ।
-সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত] ।
+সবিশà§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত] ।
 আপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে] ।",
 'rev-deleted-diff-view' => "এই পাৰ্থক্যৰ এটা সংশোধন '''বিলোপ''' কৰা হ'ল ।
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97ত]",
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96ত]",
 'rev-suppressed-diff-view' => "এই পাৰ্থক্যৰ এটা সংশোধন '''নিবাৰণ''' কৰা হ’ল ।
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97ত] ।",
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà¦¾à§°à§\8dথà¦\95à§\8dয à¦\9aাব à¦ªà¦¾à§°à§\87; à¦¸à¦¬à¦¿à¦¶à§\87ষ à¦ªà¦¾à¦¬ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦\85ভিলà§\87à¦\96ত] ।",
 'rev-delundel' => 'দেখুৱাওক/নেদেখুৱাব',
 'rev-showdeleted' => 'দেখুৱাওক',
-'revisiondelete' => 'সংকলন বিলোপন কৰক / পুণৰ্স্থাপিত কৰক',
+'revisiondelete' => 'সংকলন বিলোপ কৰক / পুণৰ স্থাপন কৰক',
 'revdelete-nooldid-title' => 'লক্ষ্য সংশোধন যুক্তিসংগত নহয়',
 'revdelete-nooldid-text' => 'কামটো কৰাৰ বাবে আপুনি লক্ষ্য সংশোধন নিৰ্বাচন কৰা নাই, নিৰ্বাচিত সংশোধন নাই, অথবা আপুনি বৰ্তমানৰ সংশোধন লুকুৱাব বিচাৰিছে ।',
-'revdelete-nologtype-title' => 'à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 প্ৰকাৰ দিয়া হোৱা নাই',
-'revdelete-nologtype-text' => 'à¦\8fà¦\87 à¦\95ামà¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\86পà§\81নি à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 প্ৰকাৰ নিৰ্বাচন কৰা নাই ।',
-'revdelete-nologid-title' => 'à¦\85যà§\81à¦\95à§\8dতিসà¦\82à¦\97ত à¦²â\80\99à¦\97 ভৰ্তি',
-'revdelete-nologid-text' => 'à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\95à§\8bনà§\8b à¦²â\80\99à¦\97 à¦­à§°à§\8dতি à¦¨à¦¿à§°à§\8dবাà¦\9aন à¦\95ৰা à¦¨à¦¾à¦\87 à¦\85থবা à¦¨à¦¿à§°à§\8dবাà¦\9aিত à¦²â\80\99à¦\97 ভৰ্তিটো নাই ।',
+'revdelete-nologtype-title' => 'à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96 প্ৰকাৰ দিয়া হোৱা নাই',
+'revdelete-nologtype-text' => 'à¦\8fà¦\87 à¦\95ামà¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\86পà§\81নি à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96  প্ৰকাৰ নিৰ্বাচন কৰা নাই ।',
+'revdelete-nologid-title' => 'à¦\85যà§\81à¦\95à§\8dতিসà¦\82à¦\97ত à¦\85ভিলà§\87à¦\96 ভৰ্তি',
+'revdelete-nologid-text' => 'à¦\86পà§\81নি à¦\8fà¦\87à¦\9fà§\8b à¦\95ৰাৰ à¦¬à¦¾à¦¬à§\87 à¦\95à§\8bনà§\8b à¦\85ভিলà§\87à¦\96 à¦­à§°à§\8dতি à¦¨à¦¿à§°à§\8dবাà¦\9aন à¦\95ৰা à¦¨à¦¾à¦\87 à¦\85থবা à¦¨à¦¿à§°à§\8dবাà¦\9aিত à¦\85ভিলà§\87à¦\96 ভৰ্তিটো নাই ।',
 'revdelete-no-file' => 'নিৰ্ধাৰিত ফাইলটি নাই ।',
 'revdelete-show-file-confirm' => 'আপুনি "<nowiki>$1</nowiki>"  ফাইলৰ বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ পৰা $3 সময়ত চাব বিচাৰিছে নেকি?',
 'revdelete-show-file-submit' => 'হয়',
@@ -986,7 +999,7 @@ $3 এ আগবঢ়োৱা ইয়াৰ কাৰণ হ’ল ''$2''",
 'revdelete-legend' => 'দৃষ্টিপাত সীমাবদ্ধ কৰক',
 'revdelete-hide-text' => 'সংশোধিত পাঠ গোপন কৰক',
 'revdelete-hide-image' => 'ফাইলৰ বিষয়বস্তু গোপন কৰক',
-'revdelete-hide-name' => 'কাৰ্য্য আৰু লক্ষ্য গোপন কৰক',
+'revdelete-hide-name' => 'কাৰ্য আৰু লক্ষ্য গোপন কৰক',
 'revdelete-hide-comment' => 'সম্পাদনা মন্তব্য আতৰাই থওক',
 'revdelete-hide-user' => 'সম্পাদকৰ সদস্যনাম/আই-পি ঠিকনা গোপন কৰক',
 'revdelete-hide-restricted' => 'প্ৰশাসকবৃন্দৰ লগতে আনৰ পৰাও তথ্য ৰোধ কৰক',
@@ -1007,7 +1020,7 @@ $1",
 'revdel-restore-deleted' => 'বাতিল কৰা সংশোধনসমূহ',
 'revdel-restore-visible' => 'দৃশ্যমান সংশোধনসমূহ',
 'pagehist' => 'পৃষ্ঠা ইতিহাস',
-'deletedhist' => 'মà¦\9aি à¦ªà§\87লà§\8bৱা ইতিহাস',
+'deletedhist' => 'বিলà§\8bপ à¦\95ৰাৰ ইতিহাস',
 'revdelete-hide-current' => ' $2, $1 তাৰিখৰ এই আইটেমটো গোপন কৰাত সমস্যা হৈছে: এইটো বৰ্তমানৰ সংশোধনী ।
 এইটোক গোপন কৰিব পৰা নাযাব ।',
 'revdelete-show-no-access' => '$2, $1 তাৰিখৰ এই আইটেমটো দেখুওৱাত সমস্যা হৈছে: এই আইটেমটো "সীমাবদ্ধ" হিছাপে চিহ্নিত ।
@@ -1030,8 +1043,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' => 'পৃষ্ঠাৰ ইতিহাসবোৰ মিলাই দিয়ক',
@@ -1065,15 +1078,16 @@ $1",
 'mergelogpagetext' => 'এখন পৃষ্ঠাৰ ইতিহাস আন এখনৰ লগত কৰা একত্ৰীকৰণৰ সকলোতকৈ শেহতীয়া তালিকা তলত দিয়া হ’ল ।',
 
 # Diffs
-'history-title' => '"$1" ৰ সাল-সলনিৰ ইতিহাস',
-'difference' => 'বিভিন্ন সংস্কৰণৰ প্ৰভেদ',
+'history-title' => '"$1" ৰ সংশোধনৰ ইতিহাস',
+'difference-title' => '"$1"ৰ বিভিন্ন সংশোধনসমূহৰ মাজৰ পাৰ্থক্য',
+'difference-title-multipage' => '"$1" আৰু "$2" পৃষ্ঠাৰ মাজৰ পাৰ্থক্যসমূহ',
 'difference-multipage' => '(পৃষ্ঠাসমূহৰ মাজত তফাৎ)',
 'lineno' => '$1 নং শাৰীঃ',
 'compareselectedversions' => 'নিৰ্বাচিত কৰা সংকলন সমূহৰ মাজত পাৰ্থক্য চাওক',
 'showhideselectedversions' => 'নিৰ্বাচিত সংশোধনসমূহ দেখুৱাওক/আঁৰ কৰক',
 'editundo' => 'পূৰ্ববত কৰক',
 'diff-multi' => '({{PLURAL:$2|এজন সদস্যৰ|$2জন সদস্যৰ}} দ্বাৰা {{PLURAL:$1|এটা মধ্যৱৰ্তী সংশোধন|$1-টা মধ্যৱৰ্তী সংশোধন}} দেখোৱা হোৱা নাই)',
-'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 à¦¸à¦¦à¦¸à§\8dযৰ à¦¦à§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন|$1-à¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন}} à¦¦à§\87à¦\96à§\8bৱা হোৱা নাই)',
+'diff-multi-manyusers' => '({{PLURAL:$2|à¦\8fà¦\9cনতà¦\95à§\88|$2-à¦\9cনতà¦\95à§\88}} à¦\85ধিà¦\95 à¦¸à¦¦à¦¸à§\8dযৰ à¦¦à§\8dবাৰা {{PLURAL:$1|à¦\8fà¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন|$1-à¦\9fা à¦®à¦§à§\8dযৱৰà§\8dতà§\80 à¦¸à¦\82শà§\8bধন}} à¦¦à§\87à¦\96à§\81à¦\93ৱা হোৱা নাই)',
 
 # Search results
 'searchresults' => 'অনুসন্ধানৰ ফলাফল',
@@ -1164,6 +1178,7 @@ $1",
 'prefs-beta' => 'বিটা বৈশিষ্টসমূহ',
 'prefs-datetime' => 'তাৰিখ আৰু সময়',
 'prefs-labs' => 'পৰীক্ষাগাৰ বৈশিষ্টসমূহ',
+'prefs-user-pages' => 'সদস্য পৃষ্ঠাসমূহ',
 'prefs-personal' => 'সদস্যৰ বিৱৰণ',
 'prefs-rc' => 'শেহতীয়া সাল-সলনি',
 'prefs-watchlist' => 'লক্ষ্য তালিকা',
@@ -1426,7 +1441,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|সাল-সলনি|সাল-সলনি}}',
 'recentchanges' => 'শেহতীয়া সাল-সলনি',
 'recentchanges-legend' => 'সাম্প্ৰতিক সালসলনিৰ পছন্দসমূহ',
-'recentchangestext' => 'ৱিকিত হোৱা শেহতীয়া সাল-সলনি এই পৃষ্ঠাত অনুসৰণ কৰক।',
+'recentchanges-summary' => 'ৱিকিত হোৱা শেহতীয়া সাল-সলনি এই পৃষ্ঠাত অনুসৰণ কৰক।',
 'recentchanges-feed-description' => 'ৱিকিত হোৱা শেহতীয়া সাল-সলনি এই ফীডত অনুসৰণ কৰক।',
 'recentchanges-label-newpage' => 'এই সম্পাদনাই এখন নতুন পৃষ্ঠা তৈয়াৰ কৰিছে',
 'recentchanges-label-minor' => 'এইটো অগুৰুত্বপূৰ্ণ সম্পাদনা',
@@ -1479,7 +1494,7 @@ $1",
 'upload_directory_missing' => 'আপলোড ডিৰেক্টৰি ($1)  বিচাৰি পোৱা নগ’ল আৰু ৱেবচাৰ্ভাৰৰ দ্বাৰা তৈয়াৰ কৰিব পৰা নগ’ল ।',
 'upload_directory_read_only' => 'আপল’ড ডিৰেক্টৰি ($1) ৱেবচাৰ্ভাৰৰ দ্বাৰা লিখনযোগ্য নহয় ।',
 'uploaderror' => 'আপল’ডত সমস্যা হৈছে',
-'upload-recreate-warning' => "'''সতৰà§\8dà¦\95বাণà§\80: à¦\8fà¦\87 à¦¨à¦¾à¦®à§° à¦\8fà¦\9fা à¦«à¦¾à¦\87ল à¦¬à¦¿à¦²à§\8bপ à¦¬à¦¾ à¦¸à§\8dথানানà§\8dতত কৰা হৈছে । '''
+'upload-recreate-warning' => "'''সতৰà§\8dà¦\95বাণà§\80: à¦\8fà¦\87 à¦¨à¦¾à¦®à§° à¦\8fà¦\9fা à¦«à¦¾à¦\87ল à¦¬à¦¿à¦²à§\8bপ à¦¬à¦¾ à¦¸à§\8dথানানà§\8dতৰ কৰা হৈছে । '''
 
 এই পৃষ্ঠাৰ অৱলুপ্তি ল’গ আৰু স্থানান্তৰ ল’গ আপোনাৰ সুবিধাৰ্থে তলত দিয়া হ’ল:",
 'uploadtext' => "ফাইল আপল’ড কৰাৰ বাবে তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰক ।
@@ -1586,17 +1601,17 @@ $1",
 'upload-description' => 'ফাইলৰ বৰ্ণনা',
 'upload-options' => "আপল'ড বিকল্পসমূহ",
 'watchthisupload' => 'এই ফাইল লক্ষ্য কৰক',
-'filewasdeleted' => 'এই নামৰ এটা ফাইল পূৰ্বতে আপলড কৰি বিলোপ কৰা হৈছে ।
-ইয়াক পুনৰ আপলড কৰাৰ আগেয়ে আপুনি $1 পৰীক্ষা কৰা উচিত ।',
+'filewasdeleted' => 'এই নামৰ এটা ফাইল পূৰ্বতে আপলড কৰি বিলোপ কৰা হৈছে ।
+ইয়াক পুনৰ আপলড কৰাৰ আগেয়ে আপুনি $1 পৰীক্ষা কৰা উচিত ।',
 'filename-bad-prefix' => "আপুনি আপলোড কৰা ফাইলৰ নামটো '''\"\$1\"''' দি আৰম্ভ হৈছে, যিটো ডিজিটেল কেমেৰাই স্বয়ংক্ৰিয়ভাৱে দিয়ে আৰু সি ব্যাখ্যামূলক নহয় ।
 অনুগ্ৰহ কৰি আপোনাৰ ফাইলটোৰ বাবে এটা ব্যাখ্যামূলক নাম বাছি লওক ।",
 'upload-success-subj' => "আপলোড সফল হ'ল",
-'upload-success-msg' => '[$2] à§° à¦ªà§°à¦¾ à¦\86পà§\8bনাৰ à¦\86পলà§\8bড à¦¸à¦«à¦² à¦¹à§\88à¦\9bà§\87 à¥¤ à¦\8fà¦\87à¦\9fà§\8b à¦\87য়াত à¦\89পলবà§\8dদà§\8dধ: [[:{{ns:file}}:$1]]',
+'upload-success-msg' => '[$2] ৰ পৰা আপোনাৰ আপলোড সফল হৈছে । এইটো ইয়াত উপলদ্ধ: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'আপল’ডত সমস্যা হৈছে',
 'upload-failure-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে:
 
 $1',
-'upload-warning-subj' => 'আপলড সতৰ্কীকৰণ',
+'upload-warning-subj' => 'আপলড সতৰ্কীকৰণ',
 'upload-warning-msg' => '[$2] ৰ পৰা আপুনি কৰা আপল’ডত এটা সমস্যাই দেখা দিছে । আপুনি ইয়াক সমাধান কৰিবৰ বাবে [[Special:Upload/stash/$1|আপল’ড প্ৰপত্ৰ]] লৈ ঘূৰি যাব পাৰে ।',
 
 'upload-proto-error' => 'ভুল প্ৰ’ট’ক’ল',
@@ -1629,14 +1644,15 @@ URL টোৰ বৈধতা বিচাৰ কৰি পুনৰ চেষ
 'backend-fail-writetemp' => "অস্থায়ী ফাইলত লিখিব পৰা নগ'ল।",
 'backend-fail-closetemp' => "অস্থায়ী ফাইল বন্ধ কৰিব পৰা নগ'ল।",
 'backend-fail-read' => "$1 ফাইলটো পঢ়িব পৰা নগ'ল",
-'backend-fail-create' => "$1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল",
-'backend-fail-maxsize' => "$1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল কিয়নো ইয়াৰ আকাৰ {{PLURAL:$2|$2 বাইটতকৈ|$2 বাইটতকৈ}} বেছি।",
+'backend-fail-create' => "$1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল",
+'backend-fail-maxsize' => "$1 ফাইলটো সৃষ্টি কৰিব পৰা নগ'ল কিয়নো ইয়াৰ আকাৰ {{PLURAL:$2|এক বাইটতকৈ|$2 বাইটতকৈ}} বেছি।",
 'backend-fail-readonly' => 'ষ্ট\'ৰেজ বেক্‌এণ্ড "$1"ক কেৱল পঢ়িব পৰা যায়। ইয়াৰ কাৰণ হ\'ল: "$2"',
 'backend-fail-synced' => '"$1" ফাইলটো আভ্যন্তৰীণ ষ্ট\'ৰেজ বেক্‌এণ্ডৰ লগত অসঙ্গত অৱস্থাত আছে',
 'backend-fail-connect' => '"$1" ষ্ট\'ৰেজ বেক্‌এণ্ডৰ লগত সম্পৰ্ক স্থাপন কৰিব পৰা নগ\'ল।',
 'backend-fail-internal' => 'ষ্ট\'ৰেজ বেক্‌এণ্ড "$1"ত এক অজ্ঞাত ত্ৰুটী ঘটিছে।',
 'backend-fail-contenttype' => '"$1"ত সাঁচি থ\'বলৈ ফাইলটোৰ সমল প্ৰকাৰ স্থিৰ কৰিব পৰা নগ\'ল।',
 'backend-fail-batchsize' => "$1টা ফাইল {{PLURAL:$1|কাৰ্যৰ|কাৰ্যৰ}} ষ্ট'ৰেজ বেকএ'ণ্ড দিয়া হৈছে; সীমা হৈছে $2টা {{PLURAL:$2|কাৰ্য|কাৰ্য}}।",
+'backend-fail-usable' => "অপৰ্যাপ্ত অনুমতি বা হেৰোৱা নিৰ্দেশিকা/সমলৰ বাবে $1 ফাইলটো লিখিব পৰা নগ'ল।",
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'ষ্ট\'ৰেজ বেকএ\'ণ্ড "$1"ৰ বাবে জাৰ্ণাল তথ্যকোষৰ লগত সংযোগ স্থাপন নহ\'ল।',
@@ -1839,7 +1855,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'statistics-articles' => 'বিষয়বস্তুৰ পৃষ্ঠা',
 'statistics-pages' => 'পৃষ্ঠাসমূহ',
 'statistics-pages-desc' => 'কথা-বতৰা পৃষ্ঠা, পুন:নিৰ্দেশিত পৃষ্ঠা আদি সহ এই ৱিকিৰ সকলো পৃষ্ঠা',
-'statistics-files' => 'আপলড কৰা ফাইলসমূহ',
+'statistics-files' => 'আপলড কৰা ফাইলসমূহ',
 'statistics-edits' => '{{SITENAME}} স্থাপন কৰাৰেপৰা পৃষ্ঠা সম্পাদনাসমূহ',
 'statistics-edits-average' => 'প্ৰতি পৃষ্ঠাৰ গড় সম্পাদনা',
 'statistics-views-total' => 'সৰ্বমুঠ প্ৰদৰ্শন',
@@ -1851,7 +1867,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'statistics-mostpopular' => 'সৰ্বোচ্চ দৰ্শন কৰা পৃষ্ঠাসমূহ',
 
 'disambiguations' => 'দ্ব্যৰ্থতা-দূৰীকৰণ পৃষ্ঠাসমূহলৈ সংযোগ থকা পৃষ্ঠাসমূহ',
-'disambiguationspage' => 'Template:দ্ব্যৰ্থতা-দূৰীকৰণ',
+'disambiguationspage' => 'সাঁচ:দ্ব্যৰ্থতা-দূৰীকৰণ',
 'disambiguations-text' => "তলৰ পৃষ্ঠাখনসমূহত '''দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা'''ৰ লগত সংযোগ আছে ।
 ইয়ে উপযুক্ত পৃষ্ঠাৰ লগত সংযোগ কৰিব পাৰে ।
 [[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হ’ব ।",
@@ -1932,7 +1948,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'newpages-username' => 'সদস্যনাম:',
 'ancientpages' => 'আটাইতকৈ পুৰণি পৃষ্ঠাসমূহ',
 'move' => 'স্থানান্তৰ কৰক',
-'movethispage' => 'এই পৃষ্ঠাটো স্থানান্তৰিত কৰক',
+'movethispage' => 'এই পৃষ্ঠাটো স্থানান্তৰ কৰক',
 'unusedimagestext' => 'তলৰ ফাইলসমূহ আছে কিন্তু কোনো পৃষ্ঠাৰ অন্তৰ্গত নহয় ।
 অনুগ্ৰহ কৰি মন কৰিব যে প্ৰত্যক্ষ URL থকা কোনো পৃষ্ঠা আন ৱেবচাইটৰ লগত সংযোগ হৈ থাকিব পাৰে, সেয়ে সক্ৰিয়ভাৱে ব্যৱহাৰ হৈ থকা সত্ত্বেও ইয়াত তালিকাভুক্ত হ’ব পাৰে ।',
 'unusedcategoriestext' => 'তলৰ শ্ৰেণী পৃষ্ঠাসমূহৰ অস্তিত্ব আছে, কিন্তু আন কোনো পৃষ্ঠা বা শ্ৰেণীৰদ্বাৰা ব্যৱহৃত নহয় ।',
@@ -1961,6 +1977,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 আপুনি ল’গৰ প্ৰকাৰ, সদস্যৰ নাম বা পৃষ্ঠাখনৰ নাম নিৰ্বাচন কৰি প্ৰদৰ্শনটোৰ আকাৰ সৰু কৰিব পাৰে ।',
 'logempty' => 'কোনো মিল থকা আইটেম লগত নাই ।',
 'log-title-wildcard' => 'এই পাঠেৰে আৰম্ভ হোৱা শিৰোনামাসমূহ অনুসন্ধান কৰক',
+'showhideselectedlogentries' => "নিৰ্বাচিত ল'গ ভুক্তি দেখুৱাওক/লুকুৱাওক",
 
 # Special:AllPages
 'allpages' => 'সকলোবোৰ পৃষ্ঠা',
@@ -1977,9 +1994,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'allpagessubmit' => 'যাওক',
 'allpagesprefix' => 'এই উপশব্দৰে আৰম্ভ হোৱা পৃষ্ঠা দেখুৱাওক:',
 'allpagesbadtitle' => 'আপুনি দিয়া পৃষ্ঠাটোৰ শিৰোণামা অবৈধ বা তাত এটা আন্তৰ্ভাষিক বা আন্তৰ্ৱিকি উপসৰ্গ আছে । ইয়াত এক বা ততোধিক বৰ্ণ থাকিব পাৰে যাক শিৰোণামাত ব্যৱহাৰ কৰিব নোৱাৰি ।',
-'allpages-bad-ns' => '{{SITENAME}} ত কোনো "$1" নামস্থান নাই ।',
+'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|বিষয়শ্ৰেণীত|বিষয়শ্ৰেণীসমূহত}}  পৃষ্ঠা বা মিডিয়া ফাইল আছে ।
@@ -1995,7 +2017,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'sp-deletedcontributions-contribs' => 'বৰঙণিসমূহ',
 
 # Special:LinkSearch
-'linksearch' => 'বহিà¦\83সংযোগ অনুসন্ধান',
+'linksearch' => 'বাহà§\8dযিà¦\95 সংযোগ অনুসন্ধান',
 'linksearch-pat' => 'অনুসন্ধান আৰ্হি:',
 'linksearch-ns' => 'নামস্থান:',
 'linksearch-ok' => 'অনুসন্ধান',
@@ -2008,7 +2030,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 # Special:ListUsers
 'listusersfrom' => 'ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:',
 'listusers-submit' => 'দেখুৱাওক',
-'listusers-noresult' => 'ব্যৱহাৰকাৰী বিচাৰি পোৱা নগল',
+'listusers-noresult' => 'ব্যৱহাৰকাৰী বিচাৰি পোৱা নগল',
 'listusers-blocked' => '(বাৰণ কৰা)',
 
 # Special:ActiveUsers
@@ -2082,7 +2104,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'watchlist' => 'মোৰ লক্ষ্য-তালিকা',
 'mywatchlist' => 'মোৰ লক্ষ্য-তালিকা',
 'watchlistfor2' => '$1 ৰ কাৰণে($2)',
-'nowatchlist' => 'à¦\86পà§\8bনাৰ à¦¨à¦¿à§°à§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95াত à¦\95à§\8bনà§\8b à¦\86à¦\87à¦\9fà§\87ম নাই ।',
+'nowatchlist' => 'à¦\86পà§\8bনাৰ à¦¨à¦¿à§°à§\80à¦\95à§\8dষণ à¦¤à¦¾à¦²à¦¿à¦\95াত à¦\8fà¦\95à§\8b নাই ।',
 'watchlistanontext' => 'আপোনাৰ লক্ষ্য তালিকাত থকা বস্তুবোৰ চাবলৈ বা সম্পাদনা কৰিবলৈ অনুগ্ৰহ কৰি $1 কৰক।',
 'watchnologin' => 'প্ৰৱেশ কৰা নাই',
 'watchnologintext' => 'নিৰীক্ষণ তালিকা পৰিৱৰ্তন কৰিবলৈ আপুনি আগতে [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।',
@@ -2140,7 +2162,7 @@ $NEWPAGE
 আপুনি এই পৃষ্ঠাখন নোচোৱালৈকে আন সালসলনিৰ কোনো জাননী দিয়া নহ’ব ।
 আপুনি আপোনাৰ লক্ষ্য-তালিকাৰ পৃষ্ঠাবোৰৰ জাননী ফ্লেগ পূৰ্বৰ অৱস্থালৈও ঘূৰাই নিব পাৰে ।
 
-আপোনাৰ {{SITENAME}} জাননী ব্যৱস্থা
+আপোনাৰ {{SITENAME}} জাননী ব্যৱস্থা
 
 --
 আপোনাৰ ই-মেইল জাননী ছেটিং সলনি কৰিবলৈ এইখন চাওক
@@ -2305,14 +2327,14 @@ $UNWATCHURL
 'undeleteviewlink' => 'দেখুৱাওক',
 'undeletereset' => 'পূৰ্বৰ অৱস্থালৈ লৈ যাওক',
 'undeleteinvert' => 'নিৰ্বাচন ওলোটা কৰক',
-'undeletecomment' => ' কাৰণ:',
+'undeletecomment' => 'কাৰণ:',
 'undeletedrevisions' => '{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পুনৰুদ্ধাৰ কৰা হৈছে',
-'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১টা ফাইল|$2 টা ফাইল}} পুনৰুদ্ধাৰ কৰা হ’ল',
-'undeletedfiles' => '{{PLURAL:$1|১à¦\9fা à¦«à¦¾à¦\87ল|$1 à¦\9fা à¦«à¦¾à¦\87ল}} পুনৰুদ্ধাৰ কৰা হ’ল',
+'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১ খন নথি|$2 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল',
+'undeletedfiles' => '{{PLURAL:$1|১à¦\96ন à¦¨à¦¥à¦¿|$1 à¦\96ন à¦¨à¦¥à¦¿}} পুনৰুদ্ধাৰ কৰা হ’ল',
 'cannotundelete' => 'অৱলুপ্তি বিফল হৈছে;
 আন কোনোবাই আগতেই ইয়াক বিলোপ কৰিছে ।',
 'undeletedpage' => "'''$1ক পুনৰুদ্ধাৰ কৰা হৈছে'''
-à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¶à§\87হতà§\80য়া à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\81নৰà§\81দà§\8dধাৰৰ à¦¬à¦¾à¦¬à§\87 [[Special:Log/delete|à¦\85ৱলà§\81পà§\8dতি à¦²â\80\99à¦\97]] চাওক ।",
+à¦\85নà§\81à¦\97à§\8dৰহ à¦\95ৰি à¦¶à§\87হতà§\80য়া à¦\85ৱলà§\81পà§\8dতি à¦\86ৰà§\81 à¦ªà§\81নৰà§\81দà§\8dধাৰৰ à¦¬à¦¾à¦¬à§\87 [[Special:Log/delete|à¦\85ৱলà§\81পà§\8dতি à¦\85ভিলà§\87à¦\96]] চাওক ।",
 'undelete-header' => 'শেহতীয়াকৈ বিলোপ কৰা পৃষ্ঠাসমূহৰ বাবে [[Special:Log/delete|অৱলুপ্তি ল’গ]] চাওক ।',
 'undelete-search-title' => 'বিলোপ কৰা পৃষ্ঠা অনুসন্ধান কৰক',
 'undelete-search-box' => 'বিলোপ কৰা পৃষ্ঠা অনুসন্ধান কৰক',
@@ -2320,8 +2342,8 @@ $UNWATCHURL
 'undelete-search-submit' => 'সন্ধান',
 'undelete-no-results' => 'অৱলুপ্তি আৰ্কাইভত কোনো মিল থকা পৃষ্ঠা পোৱা নগ’ল ।',
 'undelete-filename-mismatch' => '$1 সময়-মোহৰ থকা ফাইল সংশোধনটো বিলোপ কৰিব পৰা নাযাব: ফাইলৰ নাম মিলা নাই',
-'undelete-bad-store-key' => '$1 à¦¸à¦®à¦¯à¦¼à¦\9aিহà§\8dনৰ à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦«à¦¾à¦\87ল à¦¸à¦\82শà§\8bধনà§\80 à¦\98à§\82ৰাà¦\87 à¦\86নিব à¦¨à§\8bৱাৰি: à¦¬à¦¿à¦²à§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87à¦\87 à¦«à¦¾à¦\87লà¦\9fà§\8b নাছিল ।',
-'undelete-cleanup-error' => 'à¦\85বà§\8dযৱহà§\83ত à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦«à¦¾à¦\87ল "$1" বিলোপ কৰাত সমস্যা হৈছে ।',
+'undelete-bad-store-key' => '$1 à¦¸à¦®à¦¯à¦¼à¦\9aিহà§\8dনৰ à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা à¦¨à¦¥à¦¿ à¦¸à¦\82শà§\8bধনà§\80 à¦\98à§\82ৰাà¦\87 à¦\86নিব à¦¨à§\8bৱাৰি: à¦¬à¦¿à¦²à§\8bপ à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87à¦\87 à¦¨à¦¥à¦¿à¦\96ন নাছিল ।',
+'undelete-cleanup-error' => 'à¦\85বà§\8dযৱহà§\83ত à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¨à¦¥à¦¿ "$1" বিলোপ কৰাত সমস্যা হৈছে ।',
 'undelete-missing-filearchive' => 'ফাইল আৰ্কাইভ ID $1 পুনৰুদ্ধাৰ কৰিব পৰা নগ’ল কাৰণ এইটো তথ্যভঁৰালত নাই ।
 এইটো সম্ভৱত: আগতেই পুনৰুদ্ধাৰ কৰা হৈছে ।',
 'undelete-error' => 'পৃষ্ঠা অবিলোপনত ত্ৰুটি হৈছে',
@@ -2329,7 +2351,7 @@ $UNWATCHURL
 'undelete-error-long' => 'ফাইলটোৰ অৱলুপ্তি বাতিল কৰাত কিছু ত্ৰুটি হৈছে:
 
 $1',
-'undelete-show-file-confirm' => 'à¦\86পà§\81নি "<nowiki>$1</nowiki>"  à¦«à¦¾à¦\87লৰ বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ $3 সময়ত চাব বিচাৰিছে নেকি ?',
+'undelete-show-file-confirm' => 'à¦\86পà§\81নি "<nowiki>$1</nowiki>"  à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰা কৰা সংশোধন $2 তাৰিখৰ $3 সময়ত চাব বিচাৰিছে নেকি ?',
 'undelete-show-file-submit' => 'হয়',
 
 # Namespace form on various pages
@@ -2342,9 +2364,9 @@ $1',
 
 # Contributions
 'contributions' => 'সদস্যৰ বৰঙণিসমূহ',
-'contributions-title' => '$1-ৰ বৰঙণিসমূহ',
+'contributions-title' => '$1ৰ বৰঙণিসমূহ',
 'mycontris' => 'মোৰ বৰঙণিসমূহ',
-'contribsub2' => '$1 ৰ কাৰণে($2)',
+'contribsub2' => '$1 ৰ কাৰণে ($2)',
 'nocontribs' => 'এই গুণসমূহৰ লগত মিল থকা কোনো সালসলনি পোৱা নগ’ল ।',
 'uctop' => '(ওপৰত)',
 'month' => 'এই মাহৰ পৰা (আৰু আগৰ):',
@@ -2360,9 +2382,9 @@ $1',
 'sp-contributions-talk' => 'আলোচনা',
 'sp-contributions-userrights' => 'সদস্যৰ অধিকাৰ ব্যৱস্থাপনা',
 'sp-contributions-blocked-notice' => 'এই সদস্যজনক সদ্যহতে বাৰণ কৰা হৈছে ।
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦²â\80\99à¦\97 ভৰ্তি তলত দিয়া হ’ল:',
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦\85ভিলà§\87à¦\96 ভৰ্তি তলত দিয়া হ’ল:',
 'sp-contributions-blocked-notice-anon' => 'এই আই.পি. ঠিকনা সদ্যহতে বাৰণ কৰা হৈছে ।
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦²â\80\99à¦\97 ভৰ্তি তলত দিয়া হ’ল:',
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰà§\8dথà§\87 à¦¶à§\87হতà§\80য়া à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦\85ভিলà§\87à¦\96 ভৰ্তি তলত দিয়া হ’ল:',
 'sp-contributions-search' => 'বৰঙণিসমূহৰ কাৰণে অনুসন্ধান কৰক',
 'sp-contributions-username' => 'আই.পি. ঠিকনা অথবা ব্যৱহাৰকৰ্তাৰ নাম:',
 'sp-contributions-toponly' => 'কেৱল সাম্প্ৰতিক সংস্কৰণৰ অন্তৰ্গত সম্পাদনাসমূহ দেখুৱাওক',
@@ -2370,19 +2392,19 @@ $1',
 
 # What links here
 'whatlinkshere' => 'এই পৃষ্ঠা ব্যৱহাৰ কৰিছে...',
-'whatlinkshere-title' => '"$1"-লৈ সংযোগ কৰা পৃষ্ঠাসমূহ',
+'whatlinkshere-title' => '"$1"লৈ সংযোজিত পৃষ্ঠাসমূহ',
 'whatlinkshere-page' => 'পৃষ্ঠা:',
 'linkshere' => "এই পৃষ্ঠাটো '''[[:$1]]''' ৰ লগত সংযোজিত:",
 'nolinkshere' => "'''[[:$1]]''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
-'nolinkshere-ns' => 'নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা [[:$1]]-লৈ সংযোগ নাই ।',
+'nolinkshere-ns' => 'নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা [[:$1]]লৈ সংযোগ নাই ।',
 'isredirect' => 'পুনঃনিৰ্দেশনা পৃষ্ঠা',
 'istemplate' => 'অন্তৰ্ভুক্ত কৰক',
-'isimage' => 'ফাà¦\87ল সংযোগ',
+'isimage' => 'নথিৰ সংযোগ',
 'whatlinkshere-prev' => '{{PLURAL:$1|পিছৰ|পিছৰ $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|আগৰ|আগৰ $1}}',
 'whatlinkshere-links' => '← সংযোগকেইটা',
 'whatlinkshere-hideredirs' => '$1 পুননিৰ্দেশনাসমূহ',
-'whatlinkshere-hidetrans' => '$1 ট্ৰেন্সক্লুস্বন-সমূহ',
+'whatlinkshere-hidetrans' => '$1 ট্ৰেন্সক্লুস্বনসমূহ',
 'whatlinkshere-hidelinks' => '$1 টা সংযোগ',
 'whatlinkshere-hideimages' => '$1 চিত্ৰ সংযোগসমূহ',
 'whatlinkshere-filters' => 'ছেকনী',
@@ -2410,12 +2432,12 @@ $1',
 ** একাধিক একাউণ্টৰ অপব্যৱহাৰ
 ** অগ্ৰহণযোগ্য সদস্যনাম',
 'ipb-hardblock' => 'এই আই.পি. ঠিকনাৰ পৰা প্ৰৱেশ কৰা সদস্যসকলক সম্পাদনা কৰাৰ পৰা ৰোধ কৰক',
-'ipbcreateaccount' => 'একাউণ্ট সৃষ্টি ৰোধ কৰক',
+'ipbcreateaccount' => 'à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\85বৰà§\8bধ à¦\95ৰà¦\95',
 'ipbemailban' => 'ই-মেইল পঠোৱাৰ পৰা সদস্যক বাৰণ কৰক',
 'ipbenableautoblock' => 'এই সদস্যজনে শেহতীয়াকৈ ব্যৱহাৰ কৰা আৰু ভৱিষ্যতে সম্পাদনাৰ বাবে ব্যৱহাৰ কৰা আই.পি. ঠিকনা স্বয়ংক্ৰিয়ভাৱে বাৰণ কৰক',
 'ipbsubmit' => 'এই সদস্যক বাৰণ কৰক',
 'ipbother' => 'অন্য সময়:',
-'ipboptions' => '২ à¦\98ণà§\8dà¦\9fা:2 hours,১ à¦¦à¦¿à¦¨:1 day,৩ à¦¦à¦¿à¦¨:3 days,১ à¦¸à¦ªà§\8dতাহ:1 week,২ à¦¸à¦ªà§\8dতাহ:2 weeks,১ à¦®à¦¾à¦¹:1 month,৩ à¦®à¦¾à¦¹:3 months,৬ à¦®à¦¾à¦¹:6 months,১ à¦¬à¦\9bৰ:1 year,à¦\85নিৰà§\8dদিস্ট কাল:infinite',
+'ipboptions' => '২ à¦\98ণà§\8dà¦\9fা:2 hours,১ à¦¦à¦¿à¦¨:1 day,৩ à¦¦à¦¿à¦¨:3 days,১ à¦¸à¦ªà§\8dতাহ:1 week,২ à¦¸à¦ªà§\8dতাহ:2 weeks,১ à¦®à¦¾à¦¹:1 month,৩ à¦®à¦¾à¦¹:3 months,৬ à¦®à¦¾à¦¹:6 months,১ à¦¬à¦\9bৰ:1 year,à¦\85নিৰà§\8dদিষ্ট কাল:infinite',
 'ipbotheroption' => 'অন্যান্য',
 'ipbotherreason' => 'অন্য/অতিৰিক্ত কাৰণ:',
 'ipbhidename' => 'সম্পাদনা আৰু তালিকা সমূহৰ পৰা সদস্যনাম আঁৰ দিয়ক',
@@ -2425,19 +2447,19 @@ $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' => 'প্ৰতিবন্ধকৰ কাৰণসমূহ সম্পাদনা কৰক',
-'ipb-unblock-addr' => '$1-পৰা বাৰণ উঠাই লওক',
+'ipb-unblock-addr' => '$1ৰ পৰা বাৰণ উঠাই লওক',
 'ipb-unblock' => 'সদস্যনাম বা আই.পি. ঠিকনাৰ ওপৰত থকা প্ৰতিবন্ধক আঁতৰ কৰক',
 'ipb-blocklist' => 'বৰ্তমানৰ প্ৰতিবন্ধক চাওক',
-'ipb-blocklist-contribs' => '$1-ৰ বৰঙণিসমূহ',
+'ipb-blocklist-contribs' => '$1ৰ বৰঙণিসমূহ',
 'unblockip' => 'সদস্যৰ প্ৰতিবন্ধক উঠাই লওক',
 'unblockiptext' => 'তলৰ প্ৰপত্ৰখন ব্যৱহাৰ কৰি পূৰ্বে প্ৰতিবন্ধক থকা কোনো আই.পি. ঠিকনা বা সদস্যৰ লিখাৰ অধিকাৰ পুনঃপ্ৰতিষ্ঠা কৰক ।',
 'ipusubmit' => 'এই বাৰণ উঠাই লওক',
-'unblocked' => '[[User:$1|$1]] ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
+'unblocked' => '[[User:$1|$1]]ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
 'unblocked-range' => '$1ৰ প্ৰতিবন্ধক আঁতৰ কৰা হৈছে',
 'unblocked-id' => '$1 প্ৰতিবন্ধকটো আঁতৰ কৰা হৈছে',
 'blocklist' => 'বাৰণ কৰা সদস্য',
@@ -2474,14 +2496,14 @@ $1',
 $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'blocklogpage' => 'বাৰণ সূচী',
 'blocklog-showlog' => 'এই সদস্যজনক পূৰ্বতে অৱৰোধ কৰা হৈছিল ।
-তথà§\8dযসà§\82তà§\8dৰ à¦¹à¦¿à¦\9bাপà§\87 à¦¤à¦²à¦¤ à¦\85ৱৰà§\8bধ à¦²â\80\99à¦\97 দিয়া হ’ল:',
+পà§\8dৰমাণ à¦¸à§\8dবৰà§\82পà§\87 à¦¤à¦²à¦¤ à¦\85ৱৰà§\8bধৰ à¦\85ভিলà§\87à¦\96 দিয়া হ’ল:',
 'blocklog-showsuppresslog' => 'এই সদস্যজনক পূৰ্বতে অৱৰোধ আৰু গোপন কৰা হৈছিল ।
-তথà§\8dযসà§\82তà§\8dৰ à¦¹à¦¿à¦\9bাপà§\87 à¦¨à¦¿à¦¬à¦¾à§°à¦£ à¦²â\80\99à¦\97 তলত দিয়া হ’ল ।',
+পà§\8dৰà§\8dমাণ à¦¸à§\8dবৰà§\82পà§\87 à¦¨à¦¿à¦¬à¦¾à§°à¦£à§° à¦\85ভিলà§\87à¦\96 তলত দিয়া হ’ল ।',
 'blocklogentry' => '"[[$1]]" ক $2 $3 লৈ সাল-সলনি কৰাৰ পৰা বাৰণ কৰা হৈছে।',
 'reblock-logentry' => '[[$1]]ৰ প্ৰতিবন্ধক ছেটিং ম্যাদ উকলা সময় $2 $3ৰ সৈতে সলনি কৰা হ’ল ।',
-'blocklogtext' => 'à¦\8fà¦\87 à¦²â\80\99à¦\97à¦\96ন à¦\85ৱৰà§\8bধ à¦\95ৰা à¦\86ৰà§\81 à¦\85ৱৰà§\8bধ à¦\86à¦\81তৰ à¦\95ৰা à¦¸à¦¦à¦¸à§\8dয à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য় 
-স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই 
-সামà§\8dপà§\8dৰতিà¦\95 à¦\95াৰà§\8dযৰত à¦¨à¦¿à¦·à§\87ধ à¦\86ৰà§\81 à¦ªà§\8dৰতিবনà§\8dধà¦\95ৰ à¦¬à¦¾à¦¬à§\87 [[Special:BlockList|à¦\86à¦\87.পি. à¦ªà§\8dৰতিবনà§\8dধà¦\95 à¦¤à¦¾à¦²à¦¿à¦\95া]] à¦\9aাà¦\93à¦\95 ।',
+'blocklogtext' => 'à¦\8fà¦\87 à¦\85ভিলà§\87à¦\96 à¦\85ৱৰà§\8bধ à¦\95ৰা à¦\86ৰà§\81 à¦\85ৱৰà§\8bধ à¦\86à¦\81তৰ à¦\95ৰা à¦¸à¦¦à¦¸à§\8dয à¦¸à¦®à§\8dপৰà§\8dà¦\95à§\80য়
+স্বয়ংক্ৰিয়ভাৱে প্ৰতিবন্ধক পোৱা আই.পি. ঠিকনাবোৰ ইয়াত তালিকাভুক্ত কৰা হোৱা নাই।
+সামà§\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' => 'একাউন্ট সৃষ্টি নিষ্ক্ৰিয় কৰা হৈছে',
@@ -2492,7 +2514,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'block-log-flags-hiddenname' => 'সদস্যনাম গোপন কৰা হ’ল',
 'range_block_disabled' => 'প্ৰশাসকৰ পৰিসীমা প্ৰতিবন্ধক সৃষ্টি কৰিব পৰা ক্ষমতা নিষ্ক্ৰিয় কৰা হৈছে ।',
 'ipb_expiry_invalid' => 'অবৈধ ম্যাদ উকলা সময়',
-'ipb_expiry_temp' => 'গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হ;ব লাগিব ।',
+'ipb_expiry_temp' => 'গুপ্ত সদস্যনাম অৱৰোধ স্থায়ী হব লাগিব ।',
 'ipb_hide_invalid' => 'এই বিষয়বস্তু নিবাৰণ কৰিব পৰা নগ’ল; ইয়াত বহুতো সম্পাদনা আছে ।',
 'ipb_already_blocked' => '"$1"ক ইতিমধ্যে অৱৰোধ কৰা হৈছে',
 'ipb-needreblock' => '$1ক ইতিমধ্যে অৱৰোধ কৰা হৈছে । আপুনি ছেটিং সলাব বিচাৰিছে নেকি ?',
@@ -2509,8 +2531,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'proxyblockreason' => 'আপোনাৰ আই.পি. ঠিকনা অৱৰোধ কৰা হৈছে কাৰণ এইটো এটা মুক্ত প্ৰক্সী ।
 অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সেৱা প্ৰদানকাৰী বা কাৰিকৰী সহায়কৰ্তাৰ লগত যোগাযোগ কৰক আৰু এই গুৰুতৰ সুৰক্ষা সমস্যাৰ বিষয়ে জনাওক ।',
 'proxyblocksuccess' => 'সম্পন্ন কৰা হ’ল ।',
-'sorbsreason' => '{{SITENAME}}à¦\8f ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
-'sorbs_create_account_reason' => '{{SITENAME}}à¦\8f ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
+'sorbsreason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।',
+'sorbs_create_account_reason' => '{{SITENAME}}ত ব্যৱহাৰ কৰা DNSBLত আপোনাৰ আই.পি. ঠিকনা মুক্ত প্ৰক্সী হিছাপে তালিকাভুক্ত হৈ আছে ।
 আপুনি একাউণ্ট সৃষ্টি কৰিব নোৱাৰে',
 'cant-block-while-blocked' => 'নিজেই অৱৰোধিত হৈ থকা অৱস্থাত আপুনি আন সদস্যক অৱৰোধ কৰিব নোৱাৰে ।',
 'cant-see-hidden-user' => 'আপুনি বাৰণ কৰিব বিচৰা সদস্যজনক ইতিমধ্যেই বাৰণ কৰি গোপন কৰা হৈছে ।
@@ -2553,8 +2575,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 ইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাখন আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এখনক আন পৃষ্ঠা এখনেৰে সলনি কৰিব নোৱাৰে।
 
 '''সতৰ্কবাণী !'''
-জনপ্ৰিয় পৃষ্ঠা এখনৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হব পাৰে;
-এই কাৰ্য্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
+জনপ্ৰিয় পৃষ্ঠা এখনৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হব পাৰে;
+এই কাৰ্য পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
 'movepagetext-noredirectfixer' => "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনামা সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামালৈ স্থানান্তৰ কৰা হ'ব।
 পুৰণা শিৰোনামাটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।
 [[Special:DoubleRedirects|দ্বি পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনসমূহ]] পৰীক্ষা কৰিবলৈ নাপাহৰিব।
@@ -2574,32 +2596,32 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'movearticle' => 'পৃষ্ঠা স্থানান্তৰ কৰক:',
 'moveuserpage-warning' => "'''সতৰ্কবাণী:''' আপুনি এখন সদস্যপৃষ্ঠা স্থানান্তৰ কৰিবলৈ বিছাৰিছে । অনুগ্ৰহ কৰি মন কৰক যে কেৱল সদস্যপৃষ্ঠাখনহে স্থানান্তৰ হ’ব আৰু সদস্যজনৰ পুনঃনামাকৰণ নহ’ব ।",
 'movenologin' => 'প্ৰৱেশ কৰা নাই',
-'movenologintext' => 'পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনি ভুক্ত সদস্য হৈ [[Special:UserLogin|পৱেশ]] কৰিব লাগিব ।',
+'movenologintext' => 'পà§\83ষà§\8dঠা à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦­à§\81à¦\95à§\8dত à¦¸à¦¦à¦¸à§\8dয à¦¹à§\88 [[Special:UserLogin|পà§\8dৰৱà§\87শ]] à¦\95ৰিব à¦²à¦¾à¦\97িব à¥¤',
 'movenotallowed' => 'পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
-'movenotallowedfile' => 'ফাà¦\87ল স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
+'movenotallowedfile' => 'নথিà¦\96ন স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।',
 'cant-move-user-page' => 'সদস্য পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনাৰ অনুমতি নাই (উপ-পৃষ্ঠাৰ বাহিৰে)।',
 'cant-move-to-user-page' => 'সদস্যপৃষ্ঠালৈ কোনো পৃষ্ঠা স্থানান্তৰ কৰাৰ অনুমতি আপোনাৰ নাই (কেৱল সদস্য উপপৃষ্ঠাৰ বাহিৰে ) ।',
 'newtitle' => 'নতুন শিৰোনামালৈ:',
 'move-watch' => 'এই পৃষ্ঠাখন লক্ষ্য কৰক',
 'movepagebtn' => 'পৃষ্ঠাখন স্থানান্তৰ কৰক',
-'pagemovedsub' => 'স্থানান্তৰ সফল হল',
-'movepage-moved' => "'''“$1” ক “$2” লৈ স্থানান্তৰ কৰা হৈছে'''",
+'pagemovedsub' => 'স্থানান্তৰ সফল হল',
+'movepage-moved' => "'''“$1”ক “$2”লৈ স্থানান্তৰ কৰা হৈছে'''",
 'movepage-moved-redirect' => 'এটি পুনৰ্নিদেশনা সৃষ্টি কৰা হৈছে',
 'movepage-moved-noredirect' => 'পুনৰ্নিৰ্দেশনা সৃষ্টি কৰা নিবাৰণ কৰা হৈছে ।',
 'articleexists' => 'সেই নামৰ পৃষ্ঠা এটা আগৰ পৰাই আছে, বা সেই নামতো অযোগ্য।
 বেলেগ নাম এটা বাছি লওক।',
 'cantmove-titleprotected' => 'আপুনি ইয়ালৈ কোনো পৃষ্ঠা স্থানান্তৰ কৰিব নোৱাৰে, কাৰণ এই নতুন শিৰোনামা সৃষ্টিৰ পৰা সুৰক্ষিত ।',
-'talkexists' => "'''পà§\83ষà§\8dঠাà¦\96ন à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦\87য়াৰ à¦²à¦\97ত à¦\9cড়িত বাৰ্তা পৃষ্ঠাখন স্থানান্তৰ কৰা নহ'ল, কাৰণ নতুন ঠাইত বাৰ্তা পৃষ্ঠা এখন আগৰ পৰাই আছে।
+'talkexists' => "'''পà§\83ষà§\8dঠাà¦\96ন à¦¸à§\8dথানানà§\8dতৰ à¦\95ৰা à¦¹à§\88à¦\9bà§\87, à¦\95িনà§\8dতà§\81 à¦\87য়াৰ à¦²à¦\97ত à¦\9cৰিত বাৰ্তা পৃষ্ঠাখন স্থানান্তৰ কৰা নহ'ল, কাৰণ নতুন ঠাইত বাৰ্তা পৃষ্ঠা এখন আগৰ পৰাই আছে।
 অনুগ্ৰহ কৰি আপুনি নিজৰ হাতেৰে স্থানান্তৰ কৰক ।'''",
-'movedto' => 'লৈ স্থানান্তৰ কৰা হল',
+'movedto' => 'লৈ স্থানান্তৰ কৰা হল',
 'movetalk' => 'সংলগ্ন বাৰ্তা পৃষ্ঠা স্থানান্তৰ কৰক',
-'move-subpages' => 'উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1-লৈ)',
+'move-subpages' => 'উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1লৈ)',
 'move-talk-subpages' => 'আলোচনা পৃষ্ঠাৰ উপ-পৃষ্ঠাসমূহ স্থানান্তৰ কৰক ($1-লৈ)',
 'movepage-page-exists' => '$1 পৃষ্ঠাখন ইতিমধ্যেই আছে আৰু তাৰ ওপৰত স্বয়ংক্ৰিয়ভাৱে লিখিব নোৱাৰি ।',
-'movepage-page-moved' => "$1 পৃষ্ঠাখন $2-লৈ স্থানান্তৰ কৰা হ'ল ।",
-'movepage-page-unmoved' => '$1 পৃষ্ঠাখন $2-লৈ স্থানান্তৰ কৰা সম্ভৱ নহয়',
+'movepage-page-moved' => "$1 পৃষ্ঠাখন $2লৈ স্থানান্তৰ কৰা হ'ল।",
+'movepage-page-unmoved' => '$1 পৃষ্ঠাখন $2লৈ স্থানান্তৰ কৰা সম্ভৱ নহয়',
 'movepage-max-pages' => 'সৰ্বোচ্চ $1 {{PLURAL:$1|পৃষ্ঠা|পৃষ্ঠা}} স্থানান্তৰ কৰা হৈছে আৰু ইয়াতকৈ অধিক স্বয়ংক্ৰিয়ভাৱে স্থানান্তৰ নহ’ব ।',
-'movelogpage' => 'সà§\8dথানানà§\8dতৰন à¦¸à§\82à¦\9aà§\80',
+'movelogpage' => 'সà§\8dথানানà§\8dতৰন à¦\85ভিলà§\87à¦\96',
 'movelogpagetext' => 'সকলো পৃষ্ঠা স্থানান্তৰৰ এখন তালিকা তলত দিয়া হৈছে ।',
 'movesubpage' => '{{PLURAL:$1|খন উপপৃষ্ঠা|খন উপপৃষ্ঠা}}',
 'movesubpagetext' => 'এই পৃষ্ঠাখনৰ তলত দিয়া {{PLURAL:$1|খন উপপৃষ্ঠা|খন উপপৃষ্ঠা}} আছে ।',
@@ -2626,9 +2648,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'fix-double-redirects' => 'প্ৰাথমিক প্ৰৱন্ধলৈ আঙুলিয়াই দিয়া যিকোনো পুনৰ্নিৰ্দেশ নবীকৰণ কৰক',
 'move-leave-redirect' => 'এটা পুনঃনিৰ্দেশনা এৰি যাওক',
 'protectedpagemovewarning' => "'''সতৰ্কবাণী: এই পৃষ্ঠা সুৰক্ষিত কৰা হৈছে; কেৱল প্ৰশাসকৰৰ মৰ্যদাৰ সদস্যইহে ইয়াক স্থানান্তৰ কৰিব পাৰিব ।'''
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦²'à¦\97 সংৰক্ষণ তলত দিয়া হ’ল:",
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦\85ভিলà§\87à¦\96 সংৰক্ষণ তলত দিয়া হ’ল:",
 'semiprotectedpagemovewarning' => "'''টোকা:''' এই পৃষ্ঠা সুৰক্ষিত কৰা হৈছে; কেৱল পঞ্জীভূত সদস্যইহে ইয়াক স্থানান্তৰ কৰিব পাৰিব ।'''
-à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦²'à¦\97 সংৰক্ষণ তলত দিয়া হ’ল:",
+à¦\86পà§\8bনাৰ à¦¸à§\81বিধাৰ à¦¬à¦¾à¦¬à§\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦¾à¦®à§\8dপà§\8dৰতিà¦\95 à¦\85ভিলà§\87à¦\96 সংৰক্ষণ তলত দিয়া হ’ল:",
 'move-over-sharedrepo' => "== ফাইলৰ অস্বিত্ব আছে ==
 [[:$1]] এক উমৈহতীয়া ভঁৰালত আছে । এই শিৰোনামালৈ ফাইল স্থানান্তৰ কৰিলে উমৈহতীয়া ফাইলটোৰ লগত ওপৰা-ওপৰি হ'ব ।",
 'file-exists-sharedrepo' => 'নিৰ্বাচিত ফাইল নামটো ইতিমধ্যে এটা উমৈহতীয়া ভঁৰালত ব্যৱহৃত ।
@@ -2647,20 +2669,20 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'exportcuronly' => 'কেৱল সাম্প্ৰতিক সংশোধনটোহে অন্তৰ্ভুক্ত কৰক, সম্পূৰ্ণ ইতিহাস নহয় ।',
 'exportnohistory' => "----
 '''টোকা:''' কৰ্মদক্ষতা-সম্পৰ্কীয় কাৰণত এই প্ৰপত্ৰৰ মাধ্যমেৰে কোনো পৃষ্ঠাৰ সম্পূৰ্ণ ইতিহাস ৰপ্তানি কৰাটো নিষ্ক্ৰিয় কৰা হৈছে।",
-'exportlistauthors' => 'পà§\8dৰতà§\8dযà§\87à¦\95 à¦ªà§\83ষà§\8dঠাৰ à¦\85ৱদানà¦\95াৰà§\80ৰ সম্পূৰ্ণ তালিকা অন্তৰ্ভুক্ত কৰক',
+'exportlistauthors' => 'পà§\8dৰতà§\8dযà§\87à¦\95 à¦ªà§\83ষà§\8dঠাৰ à¦¬à§°à¦\99নিদাতাৰ সম্পূৰ্ণ তালিকা অন্তৰ্ভুক্ত কৰক',
 'export-submit' => 'ৰপ্তানি কৰক',
 'export-addcattext' => 'এই শ্ৰেণীকেইটাৰ পৰা পৃষ্ঠা যোগ কৰক:',
 'export-addcat' => 'যোগ কৰক',
 'export-addnstext' => 'এই নামস্থানৰ পৰা পৃষ্ঠা যোগ কৰক',
 'export-addns' => 'যোগ কৰক',
-'export-download' => 'ফাà¦\87ল à¦¹à¦¿à¦\9aাবে সংৰক্ষণ কৰক',
+'export-download' => 'নথি à§°à§\82পে সংৰক্ষণ কৰক',
 'export-templates' => 'সাঁচসমূহ অন্তৰ্ভুক্ত কৰক',
 'export-pagelinks' => 'এই স্তৰলৈকে পৃষ্ঠা সংযোগ অন্তৰ্ভুক্ত কৰক:',
 
 # Namespace 8 related
 'allmessages' => 'ব্যৱস্থাৰ বতৰা',
 'allmessagesname' => 'নাম',
-'allmessagesdefault' => "ডিফ'ল্ট বাৰ্তা পাঠ্য",
+'allmessagesdefault' => 'সাধাৰণ বাৰ্তা পাঠ্য',
 'allmessagescurrent' => 'বৰ্তমানৰ বাৰ্তাৰ পাঠ',
 'allmessagestext' => 'মিডিয়াৱিকি নামস্থানত থকা প্ৰণালী বাৰ্তাসমূহৰ তালিকা ইয়াত দিয়া হৈছে ।
 যদি আপুনি মিডিয়াৱিকিৰ স্থানীয়কৰণত আগ্ৰহী, তেন্তে অনুগ্ৰহ কৰি [//www.mediawiki.org/wiki/Localisation মিডিয়াৱিকি স্থানীয়কৰণ] আৰু [//translatewiki.net translatewiki.net] চাওক ।',
@@ -2683,30 +2705,30 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'thumbnail-temp-create' => 'অস্থায়ী থাম্বনেইল নথিপত্ৰ সৃষ্টি কৰিবলে অক্ষম',
 'thumbnail-dest-create' => 'থাম্বনেইলক গন্তব্যত সাঁচিবলে অক্ষম',
 'thumbnail_invalid_params' => 'অবৈধ ক্ষুদ্ৰাকৃতি পাৰামিটাৰ',
-'thumbnail_dest_directory' => 'à¦\97নà§\8dতবà§\8dয à¦¡à¦¿à§°à§\87à¦\95à§\8dà¦\9fৰà§\80 সৃষ্টি কৰিব পৰা নগ’ল',
+'thumbnail_dest_directory' => 'à¦\97নà§\8dতবà§\8dয à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া সৃষ্টি কৰিব পৰা নগ’ল',
 'thumbnail_image-type' => 'চিত্ৰৰ ধৰণ সমৰ্থিত নহয় ।',
-'thumbnail_gd-library' => 'à¦\85সমà§\8dপà§\82ৰà§\8dণ GD à¦²à¦¾à¦\87বà§\8dৰà§\87ৰà§\80 à¦¸à¦\82ৰà§\82প: à¦¸à¦¨à§\8dধানহিন ফলন $1',
-'thumbnail_image-missing' => 'ফাà¦\87ল সম্ভৱতঃ নাই: $1',
+'thumbnail_gd-library' => 'à¦\85সমà§\8dপà§\82ৰà§\8dণ GD à¦²à¦¾à¦\87বà§\8dৰà§\87ৰà§\80 à¦¸à¦\82ৰà§\82প: à¦¸à¦¨à§\8dধানহà§\80ন ফলন $1',
+'thumbnail_image-missing' => 'নথিà¦\96ন সম্ভৱতঃ নাই: $1',
 
 # Special:Import
 'import' => 'পৃষ্ঠা আমদানি কৰক',
 'importinterwiki' => 'আন্তঃৱিকি আমদানি',
 'import-interwiki-text' => "আমদানি কৰিবলৈ এটা ৱিকি বা পৃষ্ঠাৰ শিৰোনামা নিৰ্বাচন কৰক ।
 সংশোধনৰ তাৰিখ আৰু সম্পাদকৰ নাম সংৰক্ষণ কৰা হ'ব ।
-সà¦\95লà§\8b à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦\86মদানি [[Special:Log/import|à¦\86মদানি à¦²'à¦\97]]ত লিপিবদ্ধ আছে ।",
+সà¦\95লà§\8b à¦\86নà§\8dতà¦\83ৱিà¦\95ি à¦\86মদানি [[Special:Log/import|à¦\86মদানি à¦\85ভিলà§\87à¦\96]]ত লিপিবদ্ধ আছে ।",
 'import-interwiki-source' => 'উৎস ৱিকি/পৃষ্ঠা:',
-'import-interwiki-history' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\95লà§\8b à¦¸à¦\82শà§\8bধনৰ à¦\87তিহাস à¦\95পà§\80 কৰক',
+'import-interwiki-history' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\95লà§\8b à¦¸à¦\82শà§\8bধনৰ à¦\87তিহাস à¦ªà§\8dৰতিলিপি কৰক',
 'import-interwiki-templates' => 'সকলো সাঁচ অন্তৰ্ভুক্ত কৰক',
 'import-interwiki-submit' => 'আমদানি',
 'import-interwiki-namespace' => 'গন্তব্য নামস্থান:',
-'import-upload-filename' => 'ফাà¦\87লনাম:',
+'import-upload-filename' => 'নথিৰ নাম:',
 'import-comment' => 'মন্তব্য:',
 'importtext' => "অনুগ্ৰহ কৰি [[Special:Export|ৰপ্তানি সুবিধা]] ব্যৱহাৰ কৰি উৎস ৱিকিৰ পৰা ফাইলটো ৰপ্তানি কৰক।
 আপোনাৰ কম্পিউটাৰত সাঁচি ৰাখক আৰু ইয়াত আপল'ড কৰক।",
-'importstart' => 'পৃষ্ঠা আমদানি কৰা হৈছে...',
+'importstart' => 'পৃষ্ঠা আমদানি কৰা হৈ হৈছে...',
 'import-revision-count' => '$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
 'importnopages' => 'আমদানি কৰিবলৈ কোনো পৃষ্ঠা নাই ।',
-'imported-log-entries' => "$1 {{PLURAL:$1|à¦\9fা à¦²'à¦\97 à¦­à§°à§\8dতি|à¦\9fা à¦²'à¦\97 ভৰ্তি}} আমদানি কৰা হ'ল ।",
+'imported-log-entries' => "$1 {{PLURAL:$1|à¦\9fা à¦\85ভিলà§\87à¦\96 à¦­à§°à§\8dতি|à¦\9fা à¦\85ভিলà§\87à¦\96 ভৰ্তি}} আমদানি কৰা হ'ল ।",
 'importfailed' => 'আমদানি ব্যৰ্থ হৈছে: <nowiki>$1</nowiki>',
 'importunknownsource' => 'অজ্ঞাত আমদানি উৎসৰ প্ৰকাৰ',
 'importcantopen' => "আমদানি ফাইল খুলিব পৰা নগ'ল",
@@ -2715,12 +2737,12 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'importsuccess' => 'আমদানি সমাপ্ত !',
 'importhistoryconflict' => "পৰস্পৰবিৰোধী ইতিহাস সংশোধনী আছে (এই পৃষ্ঠা আগতেও আমদানি কৰা হ'ব পাৰে)",
 'importnosources' => "কোনো আন্তঃৱিকি আমদানি উৎসৰ সংজ্ঞা দিয়া হোৱা নাই আৰু প্ৰত্যক্ষ ইতিহাস আপল'ড নিষ্ক্ৰিয় কৰা হৈছে ।",
-'importnofile' => "à¦\95à§\8bনà§\8b à¦\86মদানি à¦«à¦¾à¦\87ল আপল'ড কৰা হোৱা নাই ।",
-'importuploaderrorsize' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
-à¦\85নà§\81মà§\8bদিত à¦\86পল'ড à¦«à¦¾à¦\87লতà¦\95à§\88 à¦\8fà¦\87 à¦«à¦¾à¦\87লৰ আকাৰ ডাঙৰ ।",
-'importuploaderrorpartial' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
-ফাà¦\87লà¦\9fà§\8b কেৱল আংশিকভাৱে আপল'ড কৰা হৈছে ।",
-'importuploaderrortemp' => "à¦\86মদানি à¦«à¦¾à¦\87লৰ à¦\86পল'ড à¦¬à§\8dযৰà§\8dথ হৈছে ।
+'importnofile' => "à¦\95à§\8bনà§\8b à¦\86মদানি à¦¨à¦¥à¦¿ আপল'ড কৰা হোৱা নাই ।",
+'importuploaderrorsize' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦\85সফল হৈছে ।
+à¦\85নà§\81মà§\8bদিত à¦\86পল'ড à¦¨à¦¥à¦¿à¦¤à¦\95à§\88 à¦\8fà¦\87 à¦¨à¦¥à¦¿ৰ আকাৰ ডাঙৰ ।",
+'importuploaderrorpartial' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦\85সফল হৈছে ।
+নথিà¦\96ন কেৱল আংশিকভাৱে আপল'ড কৰা হৈছে ।",
+'importuploaderrortemp' => "à¦\86মদানি à¦¨à¦¥à¦¿à§° à¦\86পল'ড à¦¬à¦¿à¦«à¦² হৈছে ।
 এটা অস্থায়ী ফ'ল্ডাৰ হেৰাইছে ।",
 'import-parse-failure' => 'XML আমদানি পাৰ্চ বিফলতা',
 'import-noarticle' => 'আমদানি কৰিবলৈ কোনো পৃষ্ঠা নাই !',
@@ -2737,9 +2759,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'import-error-invalid' => '"$1" পৃষ্ঠাখন আমদানি কৰা নহ\'ল কাৰণ ইয়াৰ নামটো অবৈধ।',
 
 # Import log
-'importlogpage' => "আমদানি ল'গ",
+'importlogpage' => 'আমদানিৰ অভিলেখ',
 'importlogpagetext' => 'আন ৱিকিৰ পৰা সম্পাদনা ইতিহাস সহ প্ৰশাসনীয় পৃষ্ঠা আমদানি ।',
-'import-logentry-upload' => "ফাà¦\87ল আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
+'import-logentry-upload' => "নথি আপল'ডৰ মাধ্যমেৰে [[$1]] আমদানি কৰা হ'ল",
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
 'import-logentry-interwiki' => 'আন্তঃৱিকি-স্থানান্তৰিত $1',
 'import-logentry-interwiki-detail' => '$2ৱে কৰা $1 {{PLURAL:$1|টা সংশোধন|টা সংশোধন}}',
@@ -2763,16 +2785,16 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-pt-preferences' => 'আপোনাৰ পছন্দসমূহ',
 'tooltip-pt-watchlist' => 'আপুনি সালসলনিৰ গতিবিধি লক্ষ্য কৰি থকা পৃষ্ঠাসমূহৰ সুচী',
 'tooltip-pt-mycontris' => 'আপোনাৰ বৰঙণিৰ তালিকা',
-'tooltip-pt-login' => "বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹'লà§\87à¦\93 à¦²à¦\97-à¦\87ন কৰাটো বাঞ্চনীয়",
-'tooltip-pt-anonlogin' => 'বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹â\80\99লà§\87à¦\93 à¦²à¦\97-à¦\87ন কৰাটো বাঞ্চনীয়',
+'tooltip-pt-login' => "বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹'লà§\87à¦\93 à¦ªà§\8dৰৱà§\87শ কৰাটো বাঞ্চনীয়",
+'tooltip-pt-anonlogin' => 'বাধà§\8dযতামà§\82লà¦\95 à¦¨à¦¹â\80\99লà§\87à¦\93 à¦ªà§\8dৰৱà§\87শ কৰাটো বাঞ্চনীয়',
 'tooltip-pt-logout' => 'প্ৰস্থান',
 'tooltip-ca-talk' => 'সংশ্লিষ্ট প্ৰবন্ধ সম্পৰ্কীয় আলোচনা',
 'tooltip-ca-edit' => 'আপুনি এই পৃষ্ঠাটো সালসলনি কৰিব পাৰে, অনুগ্ৰহ কৰি সালসলনি সাচী থোৱাৰ আগতে খচৰা চাই লব',
 'tooltip-ca-addsection' => 'নতুন অনুচ্ছেদ আৰম্ভ কৰক',
-'tooltip-ca-viewsource' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¸à¦\82ৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।',
+'tooltip-ca-viewsource' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¸à§\81ৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।',
 'tooltip-ca-history' => 'এই পৃষ্ঠাৰ যোৱা সংস্কৰণসমূহ',
 'tooltip-ca-protect' => 'এই পৃষ্ঠাখন সুৰক্ষিত কৰক',
-'tooltip-ca-unprotect' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à¦\82ৰà¦\95à§\8dষণ সলনি কৰক',
+'tooltip-ca-unprotect' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¸à§\81ৰà¦\95à§\8dষা সলনি কৰক',
 'tooltip-ca-delete' => 'এই পৃষ্ঠাখন বিলোপ কৰক',
 'tooltip-ca-undelete' => 'বিলোপ কৰাৰ আগেয়ে কৰা পৃষ্ঠাখনৰ সালসলনিসমূহ পুনঃসংস্থাপন কৰক',
 'tooltip-ca-move' => 'এই পৃষ্ঠাখন স্থানান্তৰিত কৰক',
@@ -2791,8 +2813,8 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-n-help' => 'সহায়ৰ বাবে ইয়াত ক্লিক কৰক',
 'tooltip-t-whatlinkshere' => 'ইয়ালৈ সংযোজিত সকলো পৃষ্ঠাৰ সুচী',
 'tooltip-t-recentchangeslinked' => 'সংযুক্ত পৃষ্ঠাসমূহৰ শেহতীয়া সালসলনিসমূহ',
-'tooltip-feed-rss' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\86ৰ-à¦\8fà¦\9a-à¦\8fà¦\9a à¦«à¦¿à¦¡',
-'tooltip-feed-atom' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\8fà¦\9fম à¦«à¦¿à¦¡',
+'tooltip-feed-rss' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\86ৰ-à¦\8fà¦\9a-à¦\8fà¦\9a à¦­à§\81à¦\95à§\8dতি',
+'tooltip-feed-atom' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦¬à¦¾à¦¬à§\87 à¦\8fà¦\9fম à¦­à§\81à¦\95à§\8dতি',
 'tooltip-t-contributions' => 'এই সদস্যজনৰ অৰিহনাসমূহৰ সূচী চাওক',
 'tooltip-t-emailuser' => 'এই সদস্যজনলৈ ই-মেইল পঠাওক',
 'tooltip-t-upload' => "ফাইল আপল'ডৰ বাবে",
@@ -2804,9 +2826,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-ca-nstab-media' => 'মিডিয়া পৃষ্ঠাখন চাওক',
 'tooltip-ca-nstab-special' => 'এইখন এখন বিশেষ পৃষ্ঠা, আপুনি সম্পাদনা কৰিব নোৱাৰে',
 'tooltip-ca-nstab-project' => 'প্ৰকল্প পৃষ্ঠা চাওক',
-'tooltip-ca-nstab-image' => 'ফাà¦\87ল পৃষ্ঠা চাওক',
+'tooltip-ca-nstab-image' => 'নথিৰ পৃষ্ঠা চাওক',
 'tooltip-ca-nstab-mediawiki' => 'প্ৰণালী বাৰ্তা চাওক',
-'tooltip-ca-nstab-template' => 'সাঁচ চাওক',
+'tooltip-ca-nstab-template' => 'সাঁচটো চাওক',
 'tooltip-ca-nstab-help' => 'সহায় পৃষ্ঠা চাওক',
 'tooltip-ca-nstab-category' => 'শ্ৰেণী পৃষ্ঠা চাওক',
 'tooltip-minoredit' => 'ইয়াক অগুৰুত্বপূৰ্ণ সম্পাদনা ৰূপে চিহ্নিত কৰক।',
@@ -2819,7 +2841,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-watchlistedit-raw-submit' => 'লক্ষ্য-তালিকা আপডেট কৰক',
 'tooltip-recreate' => 'বিলোপ কৰা সত্বেও পৃষ্ঠাখন পুনৰ সৃষ্টি কৰক',
 'tooltip-upload' => "আপল'ড আৰম্ভ কৰক",
-'tooltip-rollback' => '"ৰ\'লবà§\87à¦\95"à¦\8f এটা ক্লিকত এই পৃষ্ঠাৰ শেষ অৱদানকাৰীৰ সম্পাদনা বাতিল কৰি ইয়াক পূৰ্বাৱস্থালৈ ঘূৰাই নিব।',
+'tooltip-rollback' => '"পà§\82ৰà§\8dববত" à¦\95ৰিলà§\87 এটা ক্লিকত এই পৃষ্ঠাৰ শেষ অৱদানকাৰীৰ সম্পাদনা বাতিল কৰি ইয়াক পূৰ্বাৱস্থালৈ ঘূৰাই নিব।',
 'tooltip-undo' => '"বাতিল"এ এই সম্পাদনাক পূৰ্বাৱস্থালৈ ঘূৰাই নিব আৰু প্ৰাক্‌দৰ্শনৰ বাবে সম্পাদনাটো খুলিব। ই সম্পাদনা সাৰাংশত কাৰণ এটা লিখিবলৈ সুযোগ দিব।',
 'tooltip-preferences-save' => 'পছন্দসমূহ সাঁচি থওক',
 'tooltip-summary' => 'চমু সাৰাংশ লিখক',
@@ -2832,7 +2854,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'siteuser' => '{{SITENAME}} সদস্য $1',
 'anonuser' => '{{SITENAME}} বেনামী সদস্য $1',
 'lastmodifiedatby' => 'এই পৃষ্ঠাখন শেষবাৰৰ কাৰণে $1 তাৰিখে $2 বজাত $3ৰ দ্বাৰা সলনি কৰা হৈছিল',
-'othercontribs' => '$1 ৰ কাৰ্য্যৰ উপৰত ভিত্তি কৰি',
+'othercontribs' => '$1ৰ কাৰ্যৰ ওপৰত ভিত্তি কৰি',
 'others' => 'অন্যান্য',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|সদস্য|সদস্যসমূহ}} $1',
 'anonusers' => '{{SITENAME}} বেনামী {{PLURAL:$2|সদস্য|সদস্যসকল}} $1',
@@ -2844,9 +2866,10 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'spamprotectiontext' => 'আপুনি সাঁচিব বিচৰা পাঠখিনিক স্পাম ছেকনীৰ দ্বাৰা বাধা প্ৰদান কৰা হৈছে ।
 সম্ভৱতঃ কোনো ব্লেকলিষ্টেড হোৱা বাহ্যিক সংযোগৰ কাৰণে এনে ঘটিছে ।',
 'spamprotectionmatch' => 'নিম্নলিখিত লিখনীৰ বাবে আমাৰ স্পাম পৰিস্ৰাৱক আৰম্ভ হৈছে: $1',
-'spambot_username' => 'মিডিয়াৱিকি স্পাম পৰিষ্কাৰ কাৰ্য্য',
-'spam_reverting' => '$1 -লে সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতি যোৱা',
-'spam_blanking' => 'সকলো পুনৰীক্ষনৰ $1 -লে সংযোগ আছিল, ৰিক্ত কৰা হৈছে',
+'spambot_username' => 'মিডিয়াৱিকি স্পাম পৰিষ্কাৰ কাৰ্য',
+'spam_reverting' => '$1লৈ সংযোগ নথকা সৰ্বশেষ পুনৰীক্ষনলে উভতাই নিয়া হৈছে',
+'spam_blanking' => 'সকলো পুনৰীক্ষনৰ $1লৈ সংযোগ আছিল, ৰিক্ত কৰা হৈছে',
+'spam_deleting' => 'সকলো পুনৰীক্ষণৰ $1লৈ সংযোগ আছিল, বিলোপ কৰা হৈছে',
 
 # Info page
 'pageinfo-title' => '"$1" ৰ তথ্য',
@@ -2870,23 +2893,23 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'rcpatroldisabledtext' => 'শেহতীয়া সালসলনিৰ নিৰীক্ষণ কাৰ্য বৰ্তমান নিষ্ক্ৰিয় হৈ আছে ।',
 'markedaspatrollederror' => 'নিৰীক্ষিত বুলি চিহ্নিত কৰিব নোৱাৰি',
 'markedaspatrollederrortext' => 'নিৰীক্ষণ কৰা বুলি চিহ্নিত কৰিবলৈ আপুনি এটা পুনৰীক্ষণ ধাৰ্য্য কৰিব লাগিব।',
-'markedaspatrollederror-noautopatrol' => 'à¦\86পà§\8bনাà¦\95 à¦¨à¦¿à¦\9cৰ à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦¨à§\80ৰিক্ষিত বুলি চিহ্নিত কৰাৰ অনুমতি নাই।',
+'markedaspatrollederror-noautopatrol' => 'à¦\86পà§\8bনাà¦\95 à¦¨à¦¿à¦\9cৰ à¦ªà§°à¦¿à§±à§°à§\8dতনসমà§\82হ à¦¨à¦¿ৰিক্ষিত বুলি চিহ্নিত কৰাৰ অনুমতি নাই।',
 
 # Patrol log
-'patrol-log-page' => "নিৰীক্ষণ ল'গ",
-'patrol-log-header' => "এইখন নিৰীক্ষিত সংশোধনসমূহৰ ল'গ ।",
-'log-show-hide-patrol' => "নিৰীক্ষণ ল'গ $1",
+'patrol-log-page' => 'নিৰীক্ষণ অভিলেখ',
+'patrol-log-header' => 'এইখন নিৰীক্ষিত সংশোধনসমূহৰ অভিলেখ ।',
+'log-show-hide-patrol' => 'নিৰীক্ষণ অভিলেখ $1',
 
 # Image deletion
 'deletedrevision' => 'পুৰণি সংশোধনী $1 বিলোপ কৰা হ’ল',
-'filedeleteerror-short' => 'ফাà¦\87ল বিলোপ কৰাত ত্ৰুটি: $1',
-'filedeleteerror-long' => 'à¦\8fà¦\87 à¦«à¦¾à¦\87লà¦\9fà§\8b বিলোপ কৰাত সমস্যা হৈছে :
+'filedeleteerror-short' => 'নথি বিলোপ কৰাত ত্ৰুটি: $1',
+'filedeleteerror-long' => 'à¦\8fà¦\87 à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰাত সমস্যা হৈছে :
 
 $1',
-'filedelete-missing' => '"$1" à¦«à¦¾à¦\87লà¦\9fà§\8b বিলোপ কৰিব পৰা নাযাব, কিয়নো ইয়াৰ কোনো অস্তিত্ব নাই ।',
+'filedelete-missing' => '"$1" à¦¨à¦¥à¦¿à¦\96ন বিলোপ কৰিব পৰা নাযাব, কিয়নো ইয়াৰ কোনো অস্তিত্ব নাই ।',
 'filedelete-old-unregistered' => 'নিৰ্ধাৰিত ফাইল সংশোধন "$1" তথ্যকোষত নাই ।',
-'filedelete-current-unregistered' => 'নিৰà§\8dধাৰিত à¦«à¦¾à¦\87ল "$1" তথ্যকোষত নাই ।',
-'filedelete-archive-read-only' => 'à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¡à¦¾à¦\87ৰà§\87à¦\95à¦\9fৰি "$1" ৱেবচাৰ্ভাৰ দ্বাৰা লিখিব নোৱাৰি।',
+'filedelete-current-unregistered' => 'নিৰà§\8dধাৰিত à¦¨à¦¥à¦¿ "$1" তথ্যকোষত নাই ।',
+'filedelete-archive-read-only' => 'à¦\86ৰà§\8dà¦\95াà¦\87ভ à¦¨à¦¿à§°à§\8dদà§\87শিà¦\95া "$1"ত ৱেবচাৰ্ভাৰ দ্বাৰা লিখিব নোৱাৰি।',
 
 # Browsing diffs
 'previousdiff' => 'প্ৰবীণ সম্পাদনা',
@@ -2903,9 +2926,9 @@ $1',
 'file-info-size-pages' => '$1 × $2 পিক্সেলসমূহ, নথিপত্ৰৰ আকাৰ: $3, MIME ধৰণ: $4, $5 {{PLURAL:$5|page|pages}}',
 'file-nohires' => 'ইয়াতকৈ ডাঙৰকৈ দেখুৱাব নোৱাৰি ।',
 'svg-long-desc' => 'SVG ফাইল, সাধাৰণতঃ $1 × $2 পিক্সেল, ফাইল মাত্ৰা: $3',
-'show-big-image' => 'সম্পূৰ্ণ দৃশ্য',
+'show-big-image' => "সম্পূৰ্ণ ৰিজ'লিউশ্যন",
 'show-big-image-preview' => 'এই খচৰাৰ আকাৰ: $1.',
-'show-big-image-other' => 'আন {{PLURAL:$2|ৰিজলিউচন|ৰিজলিউচনসমূহ}}: $1।',
+'show-big-image-other' => "আন {{PLURAL:$2|ৰিজ'লিউশ্যন|ৰিজ'লিউশ্যনসমূহ}}: $1।",
 'show-big-image-size' => '$1 × $2 পিক্সেল',
 'file-info-gif-looped' => 'লুপকৃত',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|ফ্ৰেম|ফ্ৰেম}}',
@@ -2918,7 +2941,7 @@ $1',
 'imagelisttext' => "তলত '''$1''' {{PLURAL:$1|file|files}} সজোঁৱা $2 -ৰ এটা তালিকা দিয়া আছে।",
 'newimages-summary' => "এই বিশেষ পৃষ্ঠাখনত সৰ্বশেষত আপল'ড কৰা ফাইলসমূহ দেখিব ।",
 'newimages-legend' => 'ছেকনী',
-'newimages-label' => 'ফাà¦\87লনাম (বা তাৰ এটা অংশ)',
+'newimages-label' => 'নথিৰ নাম (বা তাৰ এটা অংশ)',
 'showhidebots' => '(বট $1)',
 'noimages' => 'চাবলৈ একো নাই ।',
 'ilsubmit' => 'সন্ধান কৰক',
@@ -2942,7 +2965,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 # Metadata
 'metadata' => 'মেটাডেটা',
 'metadata-help' => 'এই ফাইলত অতিৰিক্ত খবৰ আছে, হয়তো ডিজিটেল কেমেৰা বা স্কেনাৰ ব্যৱহাৰ কৰি সৃষ্টি বা পৰিৱৰ্তন কৰা হৈছে ।
-এই ফাইলটো আচলৰ পৰা পৰিৱৰ্তন  কৰা হৈছে, সেয়েহে পৰিৱৰ্তিত ফাইলটোৰ সৈতে নিমিলিব পাৰে ।',
+এই ফাইলটো আচলৰ পৰা পৰিৱৰ্তন কৰা হৈছে, সেয়েহে পৰিৱৰ্তিত ফাইলটোৰ সৈতে নিমিলিব পাৰে ।',
 'metadata-expand' => 'বহলাই ইয়াৰ বিষয়ে জনাওক',
 'metadata-collapse' => 'বিষয় বৰ্ণনা নেদেখুৱাবলৈ',
 'metadata-fields' => 'এই সূচীত থকা বিষয়বোৰ চিত্ৰৰ পৃষ্ঠাৰ তলত দেখা যাব ।
@@ -2962,28 +2985,28 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 * gpsaltitude',
 
 # EXIF tags
-'exif-imagewidth' => 'বহল',
+'exif-imagewidth' => 'পà§\8dৰসà§\8dথ',
 'exif-imagelength' => 'উচ্চতা',
 'exif-bitspersample' => 'প্ৰতি অংশৰ বিট',
 'exif-compression' => 'সংকোচন আঁচনি',
 'exif-photometricinterpretation' => 'পিক্সেল গঠন',
 'exif-orientation' => 'দিশবিন্যাস',
 'exif-samplesperpixel' => 'উপাদানৰ সংখ্যা',
-'exif-planarconfiguration' => 'ডà§\87à¦\9fা বিন্যাস',
-'exif-ycbcrsubsampling' => 'Y to C -ৰ হাৰৰ উপনমুনা',
+'exif-planarconfiguration' => 'তথà§\8dয বিন্যাস',
+'exif-ycbcrsubsampling' => 'Y to Cৰ হাৰৰ উপনমুনা',
 'exif-ycbcrpositioning' => 'Y আৰু C অৱস্থান',
-'exif-xresolution' => 'আনুভূমিক ৰিজলিউচন',
-'exif-yresolution' => "উলম্ব ৰিজ'লিউচন",
+'exif-xresolution' => "আনুভূমিক ৰিজ'লিউশ্যন",
+'exif-yresolution' => "উলম্বিক ৰিজ'লিউশ্যন",
 'exif-stripoffsets' => 'ছবিৰ ডেটা অৱস্থান',
 'exif-rowsperstrip' => 'প্ৰতি ষ্ট্ৰিপত শাৰীসমূহৰ সংখ্যা',
 'exif-stripbytecounts' => 'প্ৰতি সংকোচিত স্ট্ৰিপ বাইটসমূহ',
-'exif-jpeginterchangeformat' => 'JPEG SOI -লে অফচেট',
+'exif-jpeginterchangeformat' => 'JPEG SOI’লৈ অফচেট',
 'exif-jpeginterchangeformatlength' => 'JPEG তথ্যৰ বাইটসমূহ',
 'exif-whitepoint' => 'বগা বিন্দুৰ বৰ্ণ',
 'exif-primarychromaticities' => 'প্ৰাথমিকতাৰ বৰ্ণসমূহ',
 'exif-ycbcrcoefficients' => 'ৰঙ স্থান পৰিৱৰ্তন সাঁচৰ গুণকসমূহ',
 'exif-referenceblackwhite' => 'কলা আৰু বগা প্ৰসংগ মানসমূহৰ যোৰ',
-'exif-datetime' => 'ফাà¦\87ল সলনিৰ তাৰিখ আৰু সময়',
+'exif-datetime' => 'নথিৰ সলনিৰ তাৰিখ আৰু সময়',
 'exif-imagedescription' => 'চিত্ৰ শিৰোনামা',
 'exif-make' => 'কেমেৰা নিৰ্মাতা',
 'exif-model' => 'কেমেৰা মডেল',
@@ -3010,7 +3033,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-exposureprogram' => 'উন্মুক্ত প্ৰগ্ৰাম',
 'exif-spectralsensitivity' => 'বৰ্ণালীৰ সংবেদ্যতা',
 'exif-isospeedratings' => 'ISO গতিৰ হাৰ',
-'exif-shutterspeedvalue' => 'APEX à¦াটাৰ গতি',
+'exif-shutterspeedvalue' => 'APEX à¦\9aাটাৰ গতি',
 'exif-aperturevalue' => 'APEX বিন্ধা',
 'exif-brightnessvalue' => 'APEX উজ্জ্বলতা',
 'exif-exposurebiasvalue' => 'APEX উন্মুক্ত পক্ষপাত',
@@ -3022,9 +3045,9 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-focallength' => "লেন্‌ছৰ ফ'কেল দৈৰ্ঘ্য",
 'exif-subjectarea' => 'বিষয়বস্তুৰ ক্ষেত্ৰফল',
 'exif-flashenergy' => 'ফ্লেছ শক্তি',
-'exif-focalplanexresolution' => 'X à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cà§\8bলà§\8bà¦\9aন',
-'exif-focalplaneyresolution' => 'Y à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cà§\8bলà§\8bà¦\9aন',
-'exif-focalplaneresolutionunit' => "ফ'কেল তল ৰিজ'লিউচন একক",
+'exif-focalplanexresolution' => 'X à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cলিà¦\89শà§\8dযন',
+'exif-focalplaneyresolution' => 'Y à¦«à§\8bà¦\95াà¦\9a à¦¤à¦²à§° à§°à¦¿à¦\9cলিà¦\89শà§\8dযন',
+'exif-focalplaneresolutionunit' => "ফ'কেল তল ৰিজলিউশ্যন একক",
 'exif-subjectlocation' => 'বিষয়বস্তুৰ স্থান',
 'exif-exposureindex' => 'উন্মুক্ত সূচী',
 'exif-sensingmethod' => 'সংবেদ পদ্ধতি',
@@ -3079,7 +3102,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-worldregioncreated' => "বিশ্বৰ অঞ্চল য'ত ছবিখন তোলা হৈছিল",
 'exif-countrycreated' => 'যি দেশত চিত্ৰখন গ্ৰহণ কৰা হৈছে',
 'exif-countrycodecreated' => "দেশৰ ক'ড য'ত ছবিখন তোলা হৈছিল",
-'exif-provinceorstatecreated' => "পà§\8dৰদà§\87শ à¦\85থবা à§°à¦¾à¦\9cà§\8dয à¦¯'ত à¦\9bবিà¦\9fà§\8b তোলা হৈছিল",
+'exif-provinceorstatecreated' => "পà§\8dৰদà§\87শ à¦\85থবা à§°à¦¾à¦\9cà§\8dয à¦¯'ত à¦\9bবিà¦\96ন তোলা হৈছিল",
 'exif-citycreated' => 'যি চহৰত চিত্ৰখন গ্ৰহণ কৰা হৈছে',
 'exif-sublocationcreated' => "নগৰৰ উপঅৱস্থান য'ত ছবিখন তোলা হৈছিল",
 'exif-worldregiondest' => 'বিশ্বৰ অঞ্চল দেখুওৱা হল',
@@ -3102,7 +3125,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-contact' => 'যোগাযোগৰ তথ্য',
 'exif-writer' => 'লেখক',
 'exif-languagecode' => 'ভাষা',
-'exif-iimversion' => 'IIM à¦¸à¦\82স্কৰণ',
+'exif-iimversion' => 'IIM à¦¸à¦\82ষ্কৰণ',
 'exif-iimcategory' => 'শ্ৰেণী',
 'exif-iimsupplementalcategory' => 'পৰিপূৰ্ণ বিভাগসমূহ',
 'exif-datetimeexpires' => 'পিছত ব্যৱহাৰ নকৰিব',
@@ -3115,33 +3138,33 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-label' => 'লেবেল',
 'exif-datetimemetadata' => 'মেটাডেটাৰ শেষ পৰিৱৰ্তনৰ তাৰিখ',
 'exif-nickname' => 'ছবিৰ খচৰা নাম',
-'exif-rating' => 'ৰà§\87à¦\9fিà¦\82 (out of 5)',
+'exif-rating' => 'মানাà¦\82à¦\95 (৫ৰ à¦­à¦¿à¦¤à§°à¦¤)',
 'exif-rightscertificate' => 'অধিকাৰিত্ব ব্যৱস্থাপনাৰ প্ৰমাণপত্ৰ',
 'exif-copyrighted' => 'স্বত্বাধিকাৰ স্থিতি',
 'exif-copyrightowner' => 'স্বত্বাধিকাৰী',
 'exif-usageterms' => 'ব্যৱহাৰ কৰাৰ চৰ্ত্ত',
-'exif-webstatement' => 'à¦\85নলাà¦\87ন à¦¸à§\8dবতà§\8dবাধিà¦\95াৰ à¦¬à§\8dযà¦\95à§\8dতবà§\8dয',
+'exif-webstatement' => 'অনলাইন স্বত্বাধিকাৰ বক্তব্য',
 'exif-originaldocumentid' => 'মূল ডকুমেণ্টৰ অদ্বিতীয় আই.ডি.',
 'exif-licenseurl' => 'কপিৰাইট অনুজ্ঞাপত্ৰৰ বাবে URL',
 'exif-morepermissionsurl' => 'অতিৰিক্ত অনুজ্ঞাপত্ৰৰ তথ্য',
 'exif-attributionurl' => 'এই কাৰ্যৰ পুনৰ ব্যৱহাৰ কৰিলে অনুগ্ৰহ এই লিংকটো যোগ কৰক',
 'exif-preferredattributionname' => 'এই কাম পুনৰ-ব্যৱহাৰ কৰোতে, অনুগ্ৰহ কৰি কৃতিত্ব দিব',
 'exif-pngfilecomment' => 'পি.এন.জি. ফাইল মন্তব্য',
-'exif-disclaimer' => 'দাবà§\80তà§\8dযাà¦\97',
+'exif-disclaimer' => 'দায়লà§\81পà§\8dতি',
 'exif-contentwarning' => 'বিষয়বস্তু সতৰ্কবাণী',
 'exif-giffilecomment' => 'জি.আই.এফ. ফাইল মন্তব্য',
 'exif-intellectualgenre' => 'আইটেমৰ প্ৰকাৰ',
 'exif-subjectnewscode' => 'বিষয় ক’ড',
 'exif-scenecode' => "IPTC দৃশ্য ক'ড",
 'exif-event' => 'ঘটনা বৰ্ণিত',
-'exif-organisationinimage' => 'সà¦\82à¦\98ঠন বৰ্ণিত',
+'exif-organisationinimage' => 'সà¦\82à¦\97ঠন বৰ্ণিত',
 'exif-personinimage' => 'ব্যক্তি বর্ণিত',
 'exif-originalimageheight' => "ক্ৰ'প কৰাৰ আগত ছবিৰ উচ্চতা",
 'exif-originalimagewidth' => "ক্ৰ'প কৰাৰ আগত ছবিৰ প্ৰস্থতা",
 
 # EXIF attributes
 'exif-compression-1' => 'অসংকুচিত',
-'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ এনক'ডিং",
+'exif-compression-2' => "CCITT দল ৩ ১-পৰিসৰ পৰিৱৰ্তীত Huffman চলন দৈৰ্ঘ্য এনক'ডিং",
 'exif-compression-3' => "CCITT দল ৩ ফেক্স এনক'ডিং",
 'exif-compression-4' => "CCITT দল ৪ ফেক্স এনক'ডিং",
 
@@ -3162,7 +3185,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-planarconfiguration-1' => 'খণ্ড বিন্যাস',
 'exif-planarconfiguration-2' => 'সমতলীয় বিন্যাস',
 
-'exif-colorspace-65535' => 'মানাংকন নহোৱা',
+'exif-colorspace-65535' => 'মানাà¦\82à¦\95ন à¦¨à§\8bহà§\8bৱা',
 
 'exif-componentsconfiguration-0' => 'অস্তিত্ব নাই',
 
@@ -3171,10 +3194,10 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-exposureprogram-2' => 'সাধাৰণ প্ৰ’গ্ৰেম',
 'exif-exposureprogram-3' => 'বিন্ধাৰ প্ৰাথমিকতা',
 'exif-exposureprogram-4' => 'শ্বাটাৰ প্ৰাথমিকতা',
-'exif-exposureprogram-5' => 'সà§\83ষà§\8dà¦\9fিমà§\82লà¦\95 à¦ªà§\8dৰà¦\97à§\8dৰাম (à¦\95à§\8dষà§\87তà§\8dৰৰ à¦\97ভà§\80ৰতাৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতি)',
-'exif-exposureprogram-6' => "à¦\95াৰà§\8dযà§\8dযত à¦ªà§\8dৰ'à¦\97à§\8dৰাম (দà§\8dৰà§\81ত à¦¶à§\8dবাà¦\9fাৰ à¦\97তিৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতি)",
-'exif-exposureprogram-7' => 'পà§\8dৰতিà¦\95à§\83তি à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aৰ à¦¬à¦¾à¦¹à¦¿à§° à¦¥à¦\95াà¦\95à§\87 à¦\95à§\8dলà§\8cà¦\9cà¦\86প à¦«à¦\9fà§\8bসমূহ)',
-'exif-exposureprogram-8' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aত à¦¥à¦\95াà¦\95à§\88 à¦²à§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প à¦«à¦\9fà§\8bসমূহৰ বাবে)',
+'exif-exposureprogram-5' => 'সà§\83ষà§\8dà¦\9fিমà§\82লà¦\95 à¦ªà§\8dৰà¦\97à§\8dৰাম (à¦\95à§\8dষà§\87তà§\8dৰৰ à¦\97ভà§\80ৰতাৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতবিশিষà§\8dà¦\9f)',
+'exif-exposureprogram-6' => "à¦\95াৰà§\8dযà§\8dযত à¦ªà§\8dৰ'à¦\97à§\8dৰাম (দà§\8dৰà§\81ত à¦¶à§\8dবাà¦\9fাৰ à¦\97তিৰ à¦ªà§\8dৰতি à¦ªà¦\95à§\8dষপাতবিশিষà§\8dà¦\9f)",
+'exif-exposureprogram-7' => 'পà§\8dৰতিà¦\95à§\83তি à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aৰ à¦¬à¦¾à¦¹à¦¿à§° à¦¥à¦\95াà¦\95à§\87 à¦\95à§\8dলà¦\9cà¦\86প à¦\9aিতà§\8dৰসমূহ)',
+'exif-exposureprogram-8' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87প à¦\85ৱসà§\8dথা (পà¦\9fভà§\82মি à¦«à¦\95াà¦\9aত à¦¥à¦\95াà¦\95à§\88 à¦²à§\87ণà§\8dডসà§\8dà¦\95à§\87প à¦\9aিতà§\8dৰসমূহৰ বাবে)',
 
 'exif-subjectdistance-value' => '$1 মিটাৰ',
 
@@ -3190,7 +3213,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-lightsource-0' => 'অজ্ঞাত',
 'exif-lightsource-1' => 'দিনৰ পোহৰ',
 'exif-lightsource-2' => 'প্রতিপ্রভ',
-'exif-lightsource-3' => 'à¦\9fাà¦\82ষà§\8dà¦\9fà§\87ন (ভাসà§\8dবৰ পোহৰ)',
+'exif-lightsource-3' => 'à¦\9fাà¦\82ষà§\8dà¦\9fà§\87ন (ভাষà§\8dà¦\95ৰ পোহৰ)',
 'exif-lightsource-4' => 'ফ্লাছ',
 'exif-lightsource-9' => 'ফটফটীয়া বতৰ',
 'exif-lightsource-10' => 'ডাৱৰীয়া বতৰ',
@@ -3229,7 +3252,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 
 'exif-filesource-3' => 'ডিজিটাল স্টিল ক্যামেৰা',
 
-'exif-scenetype-1' => 'à¦\8fà¦\9fা প্ৰত্যক্ষভাৱে তোলা ছবি',
+'exif-scenetype-1' => 'à¦\8fà¦\96ন প্ৰত্যক্ষভাৱে তোলা ছবি',
 
 'exif-customrendered-0' => 'স্বাভাবিক প্রক্রিয়া',
 'exif-customrendered-1' => 'স্বনিৰ্বাচিত প্ৰক্ৰিয়া',
@@ -3242,7 +3265,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-whitebalance-1' => 'হস্তচালিত বগা ভাৰসাম্য',
 
 'exif-scenecapturetype-0' => 'প্ৰামাণিক',
-'exif-scenecapturetype-1' => 'লà§\87ণà§\8dডসà§\8dà¦\95à§\87à¦\87প',
+'exif-scenecapturetype-1' => 'নà§\88সৰà§\8dà¦\97িà¦\95',
 'exif-scenecapturetype-2' => 'প্ৰতিকৃতি',
 'exif-scenecapturetype-3' => 'ৰাতিৰ দৃশ্য',
 
@@ -3266,7 +3289,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 
 'exif-subjectdistancerange-0' => 'অজ্ঞাত',
 'exif-subjectdistancerange-1' => "মেক্ৰ'",
-'exif-subjectdistancerange-2' => 'à¦\89à¦\9aৰৰ দৃষ্টি',
+'exif-subjectdistancerange-2' => 'নিà¦\95à¦\9f দৃষ্টি',
 'exif-subjectdistancerange-3' => 'দূৰ দৃষ্টি',
 
 # Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
@@ -3278,7 +3301,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-gpslongitude-w' => 'পশ্চিম দ্রাঘিমা',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => 'সমà§\81দà§\8dৰপà§\83ষà§\8dঠৰ $1 {{PLURAL:$1|মিà¦\9fাৰ|মিà¦\9fাৰ}} à¦\89পৰত',
+'exif-gpsaltitude-above-sealevel' => 'সমà§\81দà§\8dৰপà§\83ষà§\8dঠৰ $1 {{PLURAL:$1|মিà¦\9fাৰ|মিà¦\9fাৰ}} à¦\93পৰত',
 'exif-gpsaltitude-below-sealevel' => 'সমুদ্ৰপৃষ্ঠৰ $1 {{PLURAL:$1|মিটাৰ|মিটাৰ}} তলত',
 
 'exif-gpsstatus-a' => 'পৰিমাপ চলি আছে',
@@ -3300,7 +3323,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-gpsdop-excellent' => 'অতি উত্তম ($1)',
 'exif-gpsdop-good' => 'ভাল ($1)',
 'exif-gpsdop-moderate' => 'মোটামুটি ($1)',
-'exif-gpsdop-fair' => 'ভাল ($1)',
+'exif-gpsdop-fair' => 'ধà§\81নà§\80য়া ($1)',
 'exif-gpsdop-poor' => 'বেয়া ($1)',
 
 'exif-objectcycle-a' => 'কেৱল পুৱা',
@@ -3314,7 +3337,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'exif-ycbcrpositioning-1' => 'কেন্দ্ৰিত',
 'exif-ycbcrpositioning-2' => 'সমানভাৱে চাইট কৰা',
 
-'exif-dc-contributor' => 'à¦\85ৱদানà¦\95াৰà§\80সমà§\82হ',
+'exif-dc-contributor' => 'বৰà¦\99ণিদাতাসà¦\95ল',
 'exif-dc-coverage' => 'মাধ্যমৰ ব্যৱধানীক অথবা অস্থায়ী অৱকাশ',
 'exif-dc-date' => 'তাৰিখ(সমূহ)',
 'exif-dc-publisher' => 'প্ৰকাশক',
@@ -3371,7 +3394,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 'confirmemail_send' => 'এটা নিশ্চিতকৰণ সংকেত মেইল কৰক',
 'confirmemail_sent' => 'নিশ্চিতকৰণ ই-মেইল পঠোৱা হৈছে ।',
 'confirmemail_oncreate' => 'আপোনাৰ ই-মেইল ঠিকনালৈ এটা নিশ্চিতকৰণ সংকেত পঠোৱা হৈছে ।
-লà¦\97à§\8dâ\80\8c-à¦\87ন কৰিবলৈ এই সংকেতৰ আৱশ্যক নাই, কিন্তু ৱিকিৰ যিকোনো ই-মেইল ভিত্তিক সেৱা সক্ৰিয় কৰিবলৈ ইয়াৰ প্ৰয়োজন হ’ব ।',
+পà§\8dৰৱà§\87শ কৰিবলৈ এই সংকেতৰ আৱশ্যক নাই, কিন্তু ৱিকিৰ যিকোনো ই-মেইল ভিত্তিক সেৱা সক্ৰিয় কৰিবলৈ ইয়াৰ প্ৰয়োজন হ’ব ।',
 'confirmemail_sendfailed' => '{{SITENAME}}এ আপোনালৈ নিশ্চিতকৰণ ই-মেইল পঠাব পৰা নাই ।
 অনুগ্ৰহ কৰি আপোনাৰ ই-মেইল ঠিকনা ভুল বৰ্ণ আছে নেকি পৰীক্ষা কৰক ।
 
@@ -3380,7 +3403,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 সম্ভৱতঃ ইয়াৰ ম্যাদ উকলি গৈছে ।',
 'confirmemail_needlogin' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিতকৰণৰ বাবে $1 কৰক ।',
 'confirmemail_success' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিতকৰণ কৰা হৈছে ।
-আপুনি এতিয়া [[Special:UserLogin|log in]] কৰক আৰু ৱিকি উপভোগ কৰক ।',
+আপুনি এতিয়া [[Special:UserLogin|প্ৰৱেশ]] কৰক আৰু ৱিকি উপভোগ কৰক ।',
 'confirmemail_loggedin' => 'আপোনাৰ ই-মেইল ঠিকনা নিশ্চিত কৰা হৈছে ।',
 'confirmemail_error' => 'আপোনাৰ নিশ্চিতকৰণ সংৰক্ষণ কৰাত কিছু সমস্যা হৈছে ।',
 'confirmemail_subject' => '{{SITENAME}} ই-মেইল ঠিকনা নিশ্চিতকৰণ',
@@ -3388,7 +3411,7 @@ Any subsequent links on the same line are considered to be exceptions, i.e. page
 এটা একাউণ্ট "$2" পঞ্জীয়ন কৰিছে ।
 
 এই একাউণ্ট আপোনাৰ হয়নে নহয় নিশ্চিত কৰাৰ বাবে আৰু {{SITENAME}}ত ই-মেইল বৈশিষ্টসমূহ সক্ৰিয় কৰাৰ বাবে
-à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰত à¦\8fà¦\87 à¦¸à¦\82যà§\8bà¦\97à¦\9fà§\8b à¦\96à§\81লক:
+à¦\86পà§\8bনাৰ à¦¬à§\8dৰাà¦\89à¦\9cাৰত à¦\8fà¦\87 à¦¸à¦\82যà§\8bà¦\97à¦\9fà§\8b à¦\96à§\8bলক:
 
 $3
 
@@ -3438,20 +3461,20 @@ $5
 'deletedwhileediting' => "'''সতৰ্কবাণী''': আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত পৃষ্ঠাখন বিলোপ কৰা হৈছে !",
 'confirmrecreate' => "আপুনি সম্পাদনা আৰম্ভ কৰাৰ পিছত সদস্য [[User:$1|$1]] ([[User talk:$1|আলোচনা]])য়ে পৃষ্ঠাখন বিলোপ কৰিছে, তাৰ কাৰণ:
 : ''$2''
-à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦ªà§\81নৰà§\8dনিৰà§\8dমাণ কৰিব খোজাটো নিশ্চিত কৰক ।",
-'confirmrecreate-noreason' => 'à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤ à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦ªà§\81নৰà§\8dনিৰà§\8dমাণ কৰিব খোজাটো অনুগ্ৰহ কৰি নিশ্চিত কৰক ।',
+à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি কৰিব খোজাটো নিশ্চিত কৰক ।",
+'confirmrecreate-noreason' => 'à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\86ৰমà§\8dভ à¦\95ৰাৰ à¦ªà¦¿à¦\9bত à¦¸à¦¦à¦¸à§\8dয [[User:$1|$1]] ([[User talk:$1|à¦\86লà§\8bà¦\9aনা]])য়à§\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦¬à¦¿à¦²à§\8bপ à¦\95ৰিà¦\9bà§\87 à¥¤ à¦\86পà§\81নি à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86à¦\95à§\8c à¦¸à§\83ষà§\8dà¦\9fি কৰিব খোজাটো অনুগ্ৰহ কৰি নিশ্চিত কৰক ।',
 'recreate' => 'পুনৰ সৃষ্টি কৰক',
 
 # action=purge
-'confirm_purge_button' => "অ'কে",
-'confirm-purge-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87শà§\8dবà§\87 খালী কৰা হওক ?',
-'confirm-purge-bottom' => "à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাà¦\95 à¦¶à§\8bধিত à¦\95ৰিলà§\87 à¦\95à§\87শà§\8dবà§\87 আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
+'confirm_purge_button' => 'ঠিক আছে',
+'confirm-purge-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87à¦\9aà§\8dâ\80\8c খালী কৰা হওক ?',
+'confirm-purge-bottom' => "à¦\8fà¦\96ন à¦ªà§\83ষà§\8dঠাà¦\95 à¦¶à§\8bধিত à¦\95ৰিলà§\87 à¦\95à§\87à¦\9aà§\8dâ\80\8c আতৰি যায় আৰু সকলোতকৈ শেহতীয়া সংশোধন প্ৰদৰ্শিত হ'বলৈ বাধ্য কৰে।",
 
 # action=watch/unwatch
-'confirm-watch-button' => 'à¦\85â\80\99à¦\95ে',
-'confirm-watch-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦¯à§\8bà¦\97 à¦\95ৰা à¦¯à¦¾à¦\93à¦\95 ?',
-'confirm-unwatch-button' => 'à¦\85â\80\99à¦\95ে',
-'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰ কৰা হওক ?',
+'confirm-watch-button' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'confirm-watch-top' => 'à¦\8fà¦\87 à¦ªà§\83ষà§\8dঠাà¦\96ন à¦\86পà§\8bনাৰ à¦²à¦\95à§\8dষà§\8dয-তালিà¦\95াত à¦¯à§\8bà¦\97 à¦\95ৰà¦\95',
+'confirm-unwatch-button' => 'ঠিà¦\95 à¦\86à¦\9bে',
+'confirm-unwatch-top' => 'এই পৃষ্ঠাখন আপোনাৰ লক্ষ্য-তালিকাৰ পৰা আঁতৰাওক',
 
 # Multipage image navigation
 'imgmultipageprev' => '← পূৰ্বৱৰ্তী পৃষ্ঠা',
@@ -3473,37 +3496,37 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => "পৃষ্ঠাখন খালী কৰা হ'ল",
-'autosumm-replace' => 'বিষয়বসà§\8dতà§\81ক "$1"ৰে সলনি কৰা হ\'ল',
+'autosumm-replace' => 'পà§\84ষà§\8dঠাà¦\96নক "$1"ৰে সলনি কৰা হ\'ল',
 'autoredircomment' => "[[$1]]-ক পুনৰ্নিৰ্দেশ কৰা হ'ল",
 'autosumm-new' => '"$1" দি পৃষ্ঠা সৃষ্টি কৰা হ\'ল',
 
 # Live preview
 'livepreview-loading' => "ল'ড হৈ আছে…",
 'livepreview-ready' => "ল'ড হৈ আছে… প্ৰস্তুত!",
-'livepreview-failed' => "à¦\9cà§\80ৱনà§\8dত à¦ªà§\82ৰà§\8dবদৰ্শন ব্যৰ্থ হ'ল!
-সাধাৰণ à¦ªà§\82ৰà§\8dবদৰ্শন চেষ্টা কৰি চাওক।",
+'livepreview-failed' => "à¦\9cà§\80ৱনà§\8dত à¦ªà§\8dৰাà¦\95দৰ্শন ব্যৰ্থ হ'ল!
+সাধাৰণ à¦ªà§\8dৰাà¦\95দৰ্শন চেষ্টা কৰি চাওক।",
 'livepreview-error' => 'সংযোগ কৰিবলে ব্যৰ্থ হল: $1 "$2"।
-সাধাৰণ à¦ªà§\82ৰà§\8dবদৰ্শন চেষ্টা কৰি চাওক।',
+সাধাৰণ à¦ªà§\8dৰাà¦\95দৰ্শন চেষ্টা কৰি চাওক।',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} -কে নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুৱা নহবও পাৰে।',
-'lag-warn-high' => 'উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} -কে নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুৱা নহবও পাৰে।',
+'lag-warn-normal' => '$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।',
+'lag-warn-high' => 'উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'কথাবতৰা পৃষ্ঠাসমূহ বাদ দি আপোনাৰ লক্ষ্য-তালিকাত {{PLURAL:$1|এটা শিৰোনামা|$1 টা শিৰোনামা}} আছে ।',
 'watchlistedit-noitems' => 'আপোনাৰ লক্ষ্য-তালিকাত এখনো ঘাই পৃষ্ঠা নাই ।',
 'watchlistedit-normal-title' => 'লক্ষ্য-তালিকা সম্পাদন কৰক',
 'watchlistedit-normal-legend' => 'লক্ষ্য-তালিকাৰ পৰা শিৰোনামা আঁতৰাওক',
-'watchlistedit-normal-explain' => 'Titles on your watchlist are shown below.
-To remove a title, check the box next to it, and click "{{int:Watchlistedit-normal-submit}}".
-You can also [[Special:EditWatchlist/raw|edit the raw list]].',
+'watchlistedit-normal-explain' => 'আপোনাৰ নজৰ তালিকাত থকা সূচীবদ্ধ পৃষ্ঠা তলত দেখুওৱা হৈছে।
+পৃষ্ঠা সূচী আৰৰাবলৈ তাৰ আগত দিয়া বাকচত ক্লিক কৰক, আৰু "{{int:Watchlistedit-normal-submit}}"ত ক্লিক কৰক।
+আপুনি [[Special:EditWatchlist/raw|মূল তালিকাখনো]] সম্পাদনা কৰিব পাৰে।',
 'watchlistedit-normal-submit' => 'শিৰোনামা আঁতৰাওক',
 'watchlistedit-normal-done' => "{{PLURAL:$1|এটা শিৰোনামা|$1 টা শিৰোনামা}} আপোনাৰ লক্ষ্যতালিকাৰ পৰা আঁতৰোৱা হ'ল:",
 'watchlistedit-raw-title' => 'অশোধিত অনুসৰণ-তালিকা সম্পাদন কৰক',
 'watchlistedit-raw-legend' => 'অশোধিত অনুসৰণ-তালিকা সম্পাদন কৰক',
-'watchlistedit-raw-explain' => 'আপোনাৰ দৰ্শনতালিকাত থকা শীৰ্ষকসমূহ তলত দেখুৱা হৈছে, আৰু তালিকালে যোগ কৰি অথবা তালিকাৰ পৰা আতৰাই সম্পাদন কৰিব পাৰি;
+'watchlistedit-raw-explain' => 'আপোনাৰ দৰ্শন তালিকাত থকা শীৰ্ষকসমূহ তলত দেখুওৱা হৈছে, আৰু তালিকালৈ যোগ কৰি অথবা তালিকাৰ পৰা আতৰাই সম্পাদন কৰিব পাৰি;
 প্ৰতি শাৰী এটা শীৰ্ষক হিচাপে।
-যেতিয়া সম্পূৰ্ণ হব, "{{int:Watchlistedit-raw-submit}}" -ত ক্লিক কৰিব।
+যেতিয়া সম্পূৰ্ণ হব, "{{int:Watchlistedit-raw-submit}}"ত ক্লিক কৰিব।
 আপুনি লগতে [[Special:EditWatchlist|প্ৰামাণিক সম্পাদকক ব্যৱহাৰ কৰিব পাৰে]]।',
 'watchlistedit-raw-titles' => 'শিৰোনামা:',
 'watchlistedit-raw-submit' => 'লক্ষ্য-তালিকা আপডেট কৰক',
@@ -3521,7 +3544,7 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'অজ্ঞাত এক্সটেনচন টেগ "$1"',
-'duplicate-defaultsort' => '\'\'\'সাৱধান!\'\'\' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক "$2"-এ আগৰ ক্ৰমসূচক "$1"-অক বিস্থাপিত কৰিছে।',
+'duplicate-defaultsort' => '\'\'\'সাৱধান!\'\'\' পূৰ্বনিৰ্ধাৰিত ক্ৰমসূচক "$2"-এ আগৰ ক্ৰমসূচক "$1"ক বিস্থাপিত কৰিছে।',
 
 # Special:Version
 'version' => 'সংস্কৰণ',
@@ -3543,20 +3566,23 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'version-license' => 'অনুজ্ঞাপত্ৰ',
 'version-poweredby-credits' => "এই ৱিকি '''[//www.mediawiki.org/ মিডিয়াৱিকিৰ]''' দ্বাৰা প্ৰচলিত , কপিৰাইট © ২০০১-$1 $2.",
 'version-poweredby-others' => 'অন্য',
-'version-license-info' => "মিডিয়াৱিà¦\95ি à¦\8fà¦\9fা à¦¬à¦¿à¦¨à¦¾à¦®à§\82লà§\80য়া à¦\9aফà§\8dà¦\9fৱà§\87ৰ; à¦\86পà§\81নি Free Software Foundation -ৰ à¦¦à§\8dবাৰা à¦ªà§\8dৰà¦\95াশিত GNU General Public License -ৰ à¦\9aà§\81à¦\95à§\8dতিসমà§\82হৰ à¦\85নà§\8dতৰà§\8dà¦\97ত à¦\87য়াà¦\95 à¦ªà§\81নৰ à¦¬à¦¿à¦²à¦¾à¦¬ à¦ªà¦¾à§°à¦¿à¦¬ à¦\85থবা à¦¸à¦²à¦¨à¦¿  à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬; à¦¹à¦¯à¦¼à¦¤à§\8b à¦²à¦¾à¦\87à¦\9aà§\87à¦\9eà§\8dà¦\9aৰ সংস্কৰণ ২ 
-à¦\85থবা (à¦\86পà§\81নাৰ বিকল্পত) যিকোনো পৰৱৰ্তী সংস্কৰণ।
+'version-license-info' => "মিডিয়াৱিà¦\95ি à¦\8fà¦\9fা à¦¬à¦¿à¦¨à¦¾à¦®à§\82লà§\80য়া à¦\9aফà§\8dà¦\9fৱà§\87ৰ; à¦\86পà§\81নি Free Software Foundation -ৰ à¦¦à§\8dবাৰা à¦ªà§\8dৰà¦\95াশিত GNU General Public License -ৰ à¦\9aà§\81à¦\95à§\8dতিসমà§\82হৰ à¦\85নà§\8dতৰà§\8dà¦\97ত à¦\87য়াà¦\95 à¦ªà§\81নৰ à¦¬à¦¿à¦¤à§°à¦£ à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬ à¦\85থবা à¦¸à¦²à¦¨à¦¿ à¦\95ৰিব à¦ªà¦¾à§°à¦¿à¦¬; à¦¹à¦¯à¦¼à¦¤à§\8b à¦\85নà§\81à¦\9cà§\8dà¦\9eাপতà§\8dৰৰ সংস্কৰণ ২ 
+à¦\85থবা (à¦\86পà§\8bনাৰ বিকল্পত) যিকোনো পৰৱৰ্তী সংস্কৰণ।
 
-মিডিয়াৱিà¦\95ি à¦\8fà¦\87à¦\9fà§\8b à¦\86শাত à¦¬à¦¿à¦²à§\8bৱা হৈছে যে ই ব্যৱহাৰযোগ্য হ'ব, কিন্তু কোনো ৱাৰেন্টি নথকাকৈ; ব্যৱসায়ীক অথবা কোনো এটা বিশেষ কাৰণৰ যোগ্যতাৰ বাবে বুজোৱা ৱাৰেন্টি নথকাকৈ। 
+মিডিয়াৱিà¦\95ি à¦\8fà¦\87à¦\9fà§\8b à¦\86শাত à¦¬à¦¿à¦¤à§°à¦£ à¦\95ৰা হৈছে যে ই ব্যৱহাৰযোগ্য হ'ব, কিন্তু কোনো ৱাৰেন্টি নথকাকৈ; ব্যৱসায়ীক অথবা কোনো এটা বিশেষ কাৰণৰ যোগ্যতাৰ বাবে বুজোৱা ৱাৰেন্টি নথকাকৈ। 
 অধিক জানিবলৈ 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' => 'প্ৰৱেশ পইণ্ট ইউআৰএল',
+'version-entrypoints-header-entrypoint' => 'প্ৰৱেশ পইণ্ট',
+'version-entrypoints-header-url' => 'ইউআৰএল',
 
 # Special:FilePath
-'filepath' => 'ফাà¦\87ল পথ',
-'filepath-page' => 'ফাà¦\87ল:',
+'filepath' => 'নথিৰ পথ',
+'filepath-page' => 'নথি:',
 'filepath-submit' => 'যাওক',
 'filepath-summary' => 'এই বিশেষ পৃষ্ঠায় এটা নথিপত্ৰৰ বাবে সম্পূৰ্ণ পথ ঘুৰাই পঠায়।
 ছবিসমূহক সম্পূৰ্ণ বিভেদনত দেখুৱা হয়, অন্য নথিপত্ৰ ধৰণসমূহ সিহতৰ সংলঘ্ন প্ৰগ্ৰামৰ সৈতে প্ৰত্যক্ষভাৱে আৰম্ভ হয়।',
@@ -3565,12 +3591,12 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'fileduplicatesearch' => 'প্ৰতিলিপি পৃষ্ঠাসমূহ অনুসন্ধান কৰক',
 'fileduplicatesearch-summary' => 'হেছ্‌ মানসমূহৰ উপৰত নিৰ্ভৰ কৰি প্ৰতিলিপিত নথিপত্ৰসমূহৰ বাবে সন্ধান কৰক।',
 'fileduplicatesearch-legend' => 'প্ৰতিলিপিৰ বাবে অনুসন্ধান কৰক',
-'fileduplicatesearch-filename' => 'ফাইলনাম:',
+'fileduplicatesearch-filename' => 'ফাà¦\87লৰ à¦¨à¦¾à¦®:',
 'fileduplicatesearch-submit' => 'সন্ধান কৰক',
 'fileduplicatesearch-info' => '$1 × $2 পিক্সেল<br /> ফাইলৰ মাত্ৰা: $3<br /> MIME প্ৰকাৰ: $4',
-'fileduplicatesearch-result-1' => '"$1" à¦«à¦¾à¦\87লৰ কোনো প্ৰতিলিপি নাই ।',
+'fileduplicatesearch-result-1' => '"$1" à¦¨à¦¥à¦¿ৰ কোনো প্ৰতিলিপি নাই ।',
 'fileduplicatesearch-result-n' => '"$1" ফাইলৰ {{PLURAL:$2|এটা প্ৰতিলিপি|$2টা প্ৰতিলিপি}} আছে ।',
-'fileduplicatesearch-noresults' => 'à¦\95à§\8bনà§\8b "$1" à¦¨à¦¾à¦®à§° à¦«à¦¾à¦\87ল à¦¸à¦¨à§\8dধান à¦ªà§\8bৱা à¦¨à¦\97ল ।',
+'fileduplicatesearch-noresults' => 'à¦\95à§\8bনà§\8b "$1" à¦¨à¦¾à¦®à§° à¦¨à¦¥à¦¿à§° à¦¸à¦¨à§\8dধান à¦ªà§\8bৱা à¦¨à¦\97â\80\99ল ।',
 
 # Special:SpecialPages
 'specialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
@@ -3581,7 +3607,7 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'specialpages-group-maintenance' => 'তত্বাৱধানৰ কাৰ্যবিৱৰণীসমূহ',
 'specialpages-group-other' => 'অন্যান্য বিশেষ পৃষ্ঠাসমূহ',
 'specialpages-group-login' => 'প্ৰৱেশ/সদস্যভুক্তি',
-'specialpages-group-changes' => "সাম্প্ৰতিক সালসলনি আৰু ল'গসমূহ",
+'specialpages-group-changes' => 'সাম্প্ৰতিক সালসলনি আৰু অভিলেখসমূহ',
 'specialpages-group-media' => "মিডিয়া বিৱৰণী আৰু আপল'ডসমূহ",
 'specialpages-group-users' => 'সদস্যবৃন্দ আৰু অধিকাৰসমূহ',
 'specialpages-group-highuse' => 'অধিক ব্যবহৃত পৃষ্ঠাসমূহ',
@@ -3592,13 +3618,13 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'specialpages-group-spam' => 'স্পাম সা-সঁজুলি',
 
 # Special:BlankPage
-'blankpage' => 'à¦\96ালà§\80 পৃষ্ঠা',
+'blankpage' => 'à¦\89à¦\95া পৃষ্ঠা',
 'intentionallyblankpage' => 'এই পৃষ্ঠা ইচ্ছাকৃতভাৱে খালী ৰখা হৈছে ।',
 
 # External image whitelist
 'external_image_whitelist' => " #এই শাৰী যেনেকৈ আছে তেনেকৈয়ে ৰাখক<pre>
 #স্বাভাৱিক অভিব্যক্তি অংশসমূহ (কেৱল সেই অংশ যি // মাজেৰে যায়) তলত দিয়ক
-#ইহঁতক বহিৰ্তম (hotlinked) ছবিসমূহৰ URLসমূহৰ সৈতে মিলাই চোৱা হ'ব
+#ইহঁতক বহিৰ্তম (hotlinked) ছবিসমূহৰ URL সমূহৰ সৈতে মিলাই চোৱা হ'ব
 #যিসমূহ মিল খায় সেইসমূহক ছবি হিচাপে প্ৰদৰ্শন কৰা হব, নহলে কেৱল ছবিখনলৈ এটা সংযোগ দেখুওৱা হ'ব
 # # -ৰ সৈতে আৰম্ভ হোৱা শাৰীসমূহক মন্তব্য বুলি ধৰা হয়
 #ই ফলা-সংবেদ্য
@@ -3606,8 +3632,8 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 #সকলো regex অংশক এই শাৰীৰ ওপৰত দিব। এই শাৰী যেনেকৈ আছে তেনেকৈয়ে ৰাখক</pre>",
 
 # Special:Tags
-'tags' => 'সালসলনি টেগ চাওক',
-'tag-filter' => '[[Special:Tags|Tag]] ছেকনী:',
+'tags' => 'সালসলনি টেগসমূহ চাওক',
+'tag-filter' => '[[Special:Tags|টেগ]] ছেকনী:',
 'tag-filter-submit' => 'সংশোধন',
 'tags-title' => 'টেগসমূহ',
 'tags-intro' => 'ছফ্টৱেৰে সম্পাদনা চিহ্নিত কৰিব পৰা টেগসমূহ আৰু সেইবোৰৰ অৰ্থ এই পৃষ্ঠাত তালিকাভুক্ত কৰা হৈছে ।',
@@ -3638,12 +3664,12 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'dberr-info' => '(তথ্যকোষৰ চাৰ্ভাৰৰ লগত যোগাযোগ কৰিব নোৱাৰি: $1)',
 'dberr-usegoogle' => 'এই পৰিস্থিতিত আপুনি গুগলৰ মাধ্যমেৰে অনুসন্ধান কৰিব পাৰে ।',
 'dberr-outofdate' => "মন কৰক যে, আমাৰ বিষয়বস্তু সম্পৰ্কে তেওঁলোকৰ সূচী পুৰণা হ'ব পাৰে ।",
-'dberr-cachederror' => "à¦\8fà¦\87à¦\96ন à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87শà§\8dবà§\8dâ\80\8cড à¦\95পà§\80, à¦¨à¦¬à§\80à¦\95ৰণ à¦¨à¦\95ৰা হ'ব পাৰে ।",
+'dberr-cachederror' => "à¦\8fà¦\87à¦\96ন à¦\85নà§\81ৰà§\8bধ à¦\95ৰা à¦ªà§\83ষà§\8dঠাৰ à¦\95à§\87à¦\9aà§\8dâ\80\8cড à¦²à¦¿à¦ªà¦¿, à¦¯à¦¿à¦\96ন à¦¨à¦¬à§\80à¦\95ৰণ à¦¨à¦\95ৰাà¦\93 হ'ব পাৰে ।",
 
 # HTML forms
-'htmlform-invalid-input' => 'à¦\86পà§\8bনাৰ à¦\95িà¦\9bà§\81মান à¦\87নপà§\81à¦\9fৰ à¦²à¦\97ত সমস্যা হৈছে',
+'htmlform-invalid-input' => 'à¦\86পà§\8bনাৰ à¦\85নà§\8dতৰà§\8dভà§\81à¦\95à§\8dতিত à¦\95িà¦\9bà§\81মান সমস্যা হৈছে',
 'htmlform-select-badoption' => 'আপুনি ধাৰ্য কৰা মান উপযুক্ত বিকল্প নহয়।',
-'htmlform-int-invalid' => 'à¦\85পà§\81নি à¦§à¦¾à§°à§\8dয à¦\95ৰা à¦®à¦¾à¦¨ à¦\87নà§\8dà¦\9fà§\87à¦\9cাৰ (integer) নহয়।',
+'htmlform-int-invalid' => 'à¦\85পà§\81নি à¦§à¦¾à§°à§\8dয à¦\95ৰা à¦®à¦¾à¦¨ à¦\85à¦\96ণà§\8dড à¦¸à¦\82à¦\96à§\8dযা (integer) নহয়।',
 'htmlform-float-invalid' => 'অপুনি ধাৰ্য কৰা মান সংখ্যা নহয়।',
 'htmlform-int-toolow' => 'আপুনি ধাৰ্য কৰা মান ন্যূনতম $1 তকৈ তলত',
 'htmlform-int-toohigh' => 'আপুনি ধাৰ্য কৰা মান অধিকতম $1 তকৈ ওপৰত',
@@ -3657,14 +3683,14 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'sqlite-no-fts' => '$1 সম্পূৰ্ণ-পাঠ অনুসন্ধান সমৰ্থন অবিহনে',
 
 # New logging system
-'logentry-delete-delete' => '$1 মচি পেলোৱা হল পৃষ্ঠা $3',
-'logentry-delete-restore' => '$1 পুনৰ সংৰক্ষণ কৰা হল পৃষ্ঠা $3',
+'logentry-delete-delete' => '$1’ৰ দ্বাৰা $3 পৃষ্ঠাখন বিলোপ কৰা হ’ল',
+'logentry-delete-restore' => '$1 পুনৰ সংৰক্ষণ কৰা হল পৃষ্ঠা $3',
 'logentry-delete-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা দৃশ্যমানতা',
-'logentry-delete-revision' => 'পৃষ্ঠা $3: $4 -ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}} -ৰ $1 পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
-'logentry-delete-event-legacy' => '$3 -ত লগ ঘটনামসমূহৰ $1 changed দৃশ্যমানতা',
-'logentry-delete-revision-legacy' => 'পৃষ্ঠা $3 -ত পুনৰীক্ষনসমূহৰ $1 changed দৃশ্যমানতা',
+'logentry-delete-revision' => 'পৃষ্ঠা $3: $4ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}}ৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
+'logentry-delete-event-legacy' => '$3ত অভিলেখ ঘটনামসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হ’ল',
+'logentry-delete-revision-legacy' => 'পৃষ্ঠা $3ত পুনৰীক্ষনসমূহৰ $1 দৃশ্যমানতা পৰিৱৰ্তন কৰা হল',
 'logentry-suppress-delete' => '$1 সংকোচিত পৃষ্ঠা $3',
-'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
+'logentry-suppress-event' => '$3: $4 -ত {{PLURAL:$5|এটা লগ ঘটনা|$5 লগ ঘটনাসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
 'logentry-suppress-revision' => 'পৃষ্ঠা $3: $4 -ত {{PLURAL:$5|এটা পুনৰীক্ষন|$5 পুনৰীক্ষনসমূহ}} -ৰ $1 গোপন পৰিৱৰ্তনসমূহ দৃশ্যমানতা',
 'logentry-suppress-event-legacy' => '$3 -ত লগ ঘটনাসমূহৰ $1 গোপন পৰিৱৰ্তন কৰা হল দৃশ্যমানতা',
 'logentry-suppress-revision-legacy' => 'পৃষ্ঠা $3 -ত পুনৰীক্ষনসমূহৰ $1 গোপন পৰিৱৰ্তন কৰা হল',
@@ -3676,21 +3702,21 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'revdelete-uname-unhid' => 'সদস্যনাম মুকলি কৰা হৈছে',
 'revdelete-restricted' => 'এই সীমাবদ্ধতা প্ৰশাসকৰ ক্ষেত্ৰত প্ৰযোজ্য',
 'revdelete-unrestricted' => 'প্ৰশাসকৰ সীমাবদ্ধতা বাতিল কৰা হ’ল',
-'logentry-move-move' => 'পৃষ্ঠা $3 -ৰ পৰা $4 -লে $1 স্থানান্তৰ কৰা হল',
-'logentry-move-move-noredirect' => 'পুনৰ্নিৰ্দেশ নেৰাকৈ $1 স্থানান্তৰ কৰা হল পৃষ্ঠা $3 -ৰ পৰা $4',
-'logentry-move-move_redir' => 'পুনৰ্নিৰ্দেশৰে পৃষ্ঠা $3 -ৰ পৰা $4 $1 স্থানান্তৰ কৰা হল',
+'logentry-move-move' => 'পৃষ্ঠা $3ৰ পৰা $4লৈ $1য়ে স্থানান্তৰ কৰিলে',
+'logentry-move-move-noredirect' => '$1য়ে পুনৰ্নিৰ্দেশ নেৰাকৈ পৃষ্ঠা $3ৰ পৰা $4লৈ স্থানান্তৰ কৰিলে',
+'logentry-move-move_redir' => 'পুনৰ্নিৰ্দেশৰে পৃষ্ঠা $3ৰ পৰা $4 $1লৈ স্থানান্তৰ কৰা হ’ল',
 'logentry-move-move_redir-noredirect' => 'পুনৰ্নিৰ্দেশ নেৰাকৈ এটা পুনৰ্নিৰ্দেশৰ ওপৰেৰে পৃষ্ঠা $3 -ৰ পৰা $4 $1 স্থানান্তৰ কৰা হল',
 'logentry-patrol-patrol' => "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 নিৰীক্ষণ কৰা হ'ল",
 'logentry-patrol-patrol-auto' => "পৃষ্ঠা $3 -ৰ $1 চিহ্নিত সংশোধন $4 স্বচালিতভাৱে নিৰীক্ষণ কৰা হ'ল",
-'logentry-newusers-newusers' => '$1-এ এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
-'logentry-newusers-create' => '$1-এ এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
-'logentry-newusers-create2' => '$1-এ এটা ব্যৱহাৰকাৰী একাউণ্ট $3 সৃষ্টি কৰিলে',
-'logentry-newusers-autocreate' => 'একাউণ্ট $1-ক স্বয়ংক্ৰিয়ভাৱে সৃষ্টি কৰা হৈছিল',
+'logentry-newusers-newusers' => '$1’য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
+'logentry-newusers-create' => '$1য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট সৃষ্টি কৰিলে',
+'logentry-newusers-create2' => '$1’য়ে এটা ব্যৱহাৰকাৰী একাউণ্ট $3 সৃষ্টি কৰিলে',
+'logentry-newusers-autocreate' => '$1’ৰ একাউণ্ট স্বয়ংক্ৰিয়ভাৱে সৃষ্টি কৰা হৈছিল',
 'newuserlog-byemail' => 'গুপ্তশব্দ ই-মেইল কৰি পঠোৱা হৈছে',
 
 # Feedback
 'feedback-bugornote' => 'যদি আপুনি এটা কাৰিকৰী সমস্যাৰ বিৱৰণ দিবলৈ প্ৰস্তুত, অনুগ্ৰহ কৰি [$1 এটা বাগ ৰিপ\'ৰ্ট কৰক]।
-নহ\'লে আপুনি তলৰ সহজ ফৰ্ম ব্যৱহাৰ কৰিব পাৰিব। আপোনাৰ মন্তব্য আপোনাৰ সদস্যনাম আৰু আপুনি ব্যৱহাৰ কৰা ব্ৰাউজাৰৰ সৈতে "[$3 $2]" -পৃষ্ঠাত যোগ কৰা হ\'ব।',
+নহ\'লে আপুনি তলৰ সহজ ফৰ্ম ব্যৱহাৰ কৰিব পাৰিব। আপোনাৰ মন্তব্য আপোনাৰ সদস্যনাম আৰু আপুনি ব্যৱহাৰ কৰা ব্ৰাউজাৰৰ সৈতে "[$3 $2]" -পৃষ্ঠাত যোগ কৰা হ\'ব।',
 'feedback-subject' => 'বিষয়:',
 'feedback-message' => 'বাৰ্তা:',
 'feedback-cancel' => 'বাতিল কৰক',
@@ -3706,19 +3732,19 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 
 # API errors
 'api-error-badaccess-groups' => "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
-'api-error-badtoken' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦¤à§\8dৰà§\81à¦\9fি: à¦¬à§\87য়া টোকেন।',
-'api-error-copyuploaddisabled' => "ইউ আৰ এল-ৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
+'api-error-badtoken' => 'à¦\86ভà§\8dযনà§\8dতৰà§\80ণ à¦¤à§\8dৰà§\81à¦\9fি: à¦­à§\81ল টোকেন।',
+'api-error-copyuploaddisabled' => "ইউ আৰ এলৰ মাধ্যমেৰে আপল'ড কৰাটো এই চাৰ্ভাৰত নিষ্ক্ৰিয় কৰা হৈছে।",
 'api-error-duplicate' => 'এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছে।',
 'api-error-duplicate-archive' => 'এই চাইটত একে বিষয়বস্তুৰ {{PLURAL:$1|[$2 আন এটা ফাইল]|[$2 আন কিছুমান ফাইল]}} ইতিমধ্যেই আছিল, কিন্তু {{PLURAL:$1|সেইটো|সেইবোৰ}} বিলোপ কৰা হৈছে।',
-'api-error-duplicate-archive-popup-title' => 'পà§\8dৰতিলিপি {{PLURAL:$1|ফাà¦\87ল|ফাà¦\87ল}} à¦¯à§\8bনà¦\95à§\87à¦\87à¦\9fা à¦\87তিমধà§\8dযà§\87 à¦®à¦\9aা হৈছে।',
-'api-error-duplicate-popup-title' => 'প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইল}}।',
-'api-error-empty-file' => 'à¦\86পà§\81নি à¦¦à¦¾à¦\96িল à¦\95ৰা à¦«à¦¾à¦\87লà¦\96ন খালী ।',
+'api-error-duplicate-archive-popup-title' => 'পà§\8dৰতিলিপি {{PLURAL:$1|ফাà¦\87ল|ফাà¦\87ল}} à¦¯à¦¿à¦¸à¦®à§\82হ à¦\87তিমধà§\8dযà§\87 à¦¬à¦¿à¦²à§\8bপ à¦\95ৰা হৈছে।',
+'api-error-duplicate-popup-title' => 'প্ৰতিলিপি {{PLURAL:$1|ফাইল|ফাইলসমূহ}}।',
+'api-error-empty-file' => 'à¦\86পà§\81নি à¦¦à¦¾à¦\96িল à¦\95ৰা à¦«à¦¾à¦\87লà¦\9fà§\8b খালী ।',
 'api-error-emptypage' => 'নতুন, খালী পৃষ্ঠা সৃষ্টি কৰিবলৈ অনুমতি নাই।',
 'api-error-fetchfileerror' => 'আভ্যন্তৰীণ ত্ৰুটি: ফাইলটো অনাত কিবা সমস্যা হৈছে।',
 'api-error-file-too-large' => 'আপুনি দাখিল কৰা ফাইলখন বৰ ডাঙৰ ।',
 'api-error-filename-tooshort' => 'ফাইলৰ নামটো অতি চুটি।',
-'api-error-filetype-banned' => 'à¦\8fà¦\87 à¦§à§°à¦£à§° à¦«à¦¾à¦\87ল à¦¨à¦¿à¦·à§\87ধ ।',
-'api-error-filetype-missing' => 'ফাইলনামটোত এক্সটেন্‌ছন নাই।',
+'api-error-filetype-banned' => 'à¦\8fà¦\87 à¦§à§°à¦£à§° à¦«à¦¾à¦\87ল à¦¨à¦¿à¦·à¦¿à¦¦à§\8dধ।',
+'api-error-filetype-missing' => 'ফাইল নামটোত এক্সটেন্‌ছন নাই।',
 'api-error-hookaborted' => 'আপুনি কৰিব বিচৰা সালসলনি এটা এক্সটেনচনৰ দ্বাৰা বাতিল কৰা হৈছে।',
 'api-error-http' => "আভ্যন্তৰীণ ত্ৰুটি: চাৰ্ভাৰৰ লগত সংযোগ স্থাপন নহ'ল।",
 'api-error-illegal-filename' => 'ফাইলৰ এই নামটো গ্ৰহণযোগ্য নহয় ।',
@@ -3726,14 +3752,14 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 'api-error-invalid-file-key' => "আভ্যন্তৰীণ ত্ৰুটি: অস্থায়ী ভঁৰালত ফাইলটো পোৱা নগ'ল।",
 'api-error-missingparam' => 'আভ্যন্তৰীণ ত্ৰুটি: অনুৰোধত পেৰামিটাৰৰ কিবা সমস্যা ৰৈছে।',
 'api-error-missingresult' => "আভ্যন্তৰীণ ত্ৰুটি: অনুলিপি সফল হৈছেনে নাই তাক নিশ্চিত কৰিব পৰা নগ'ল।",
-'api-error-mustbeloggedin' => "ফাà¦\87ল à¦\86পল'ড à¦\95ৰিবলà§\88 à¦\86পà§\81নি à¦²à¦\97à§\8dâ\80\8c à¦\87নà§\8dâ\80\8c à¦\95ৰিব à¦²à¦¾à¦\97িব।",
+'api-error-mustbeloggedin' => "ফাà¦\87ল à¦\86পল'ড à¦\95ৰাৰ à¦\86à¦\97à§\87য়à§\87 à¦\86পà§\81নি à¦ªà§\8dৰৱà§\87শ à¦\95ৰাà¦\9fà§\8b à¦¬à¦¾à¦§à§\8dযতামà§\82লà¦\95 ।",
 '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' => 'à¦\85শা কৰা সময়ৰ ভিতৰত চাৰ্ভাৰটোৱে সঁহাৰি নজনালে।',
+'api-error-timeout' => 'à¦\86শা কৰা সময়ৰ ভিতৰত চাৰ্ভাৰটোৱে সঁহাৰি নজনালে।',
 'api-error-unclassified' => 'এক অজ্ঞাত সমস্যাই দেখা দিছে।',
 'api-error-unknown-code' => 'অজ্ঞাত সমস্যা: "$1"।',
 'api-error-unknown-error' => "আভ্যন্তৰীণ ত্ৰুটি: আপোনাৰ ফাইলটো আপল'ড কৰাত কিবা সমস্যা হৈছে।",
@@ -3742,4 +3768,17 @@ You can also [[Special:EditWatchlist/raw|edit the raw list]].',
 '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' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছৰ|বছৰ}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্ৰাব্দ|সহস্ৰাব্দ}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => "$1 চাৰ্ভাৰত তলা মোকোলাই দিব পৰা নগ'ল",
 );
index d8dd929..5ad6fa2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Asturian (Asturianu)
+/** Asturian (asturianu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author Mikel
  * @author Remember the dot
+ * @author Savh
  * @author Xuacu
  * @author לערי ריינהארט
  */
@@ -60,61 +61,61 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Sorrayar enllaces:',
 'tog-justify' => 'Xustificar parágrafos',
-'tog-hideminor' => 'Anubrir les ediciones menores nos cambios recientes',
-'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambios recientes',
-'tog-newpageshidepatrolled' => 'Atapecer les páxines vixilaes na llista de páxines nueves',
-'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambios, non sólo los recientes.",
-'tog-usenewrc' => 'Cambios recientes ameyoraos (necesita JavaScript)',
+'tog-hideminor' => 'Anubrir les ediciones menores nos cambeos recientes',
+'tog-hidepatrolled' => 'Anubrir les ediciones vixilaes nos cambeos recientes',
+'tog-newpageshidepatrolled' => 'Anubrir les páxines vixilaes na llista de páxines nueves',
+'tog-extendwatchlist' => "Espander la llista de vixilancia p'amosar tolos cambeos, non solo los más recientes.",
+'tog-usenewrc' => 'Agrupar los cambeos por páxina nos cambeos recientes y na llista de vixilancia (necesita JavaScript)',
 'tog-numberheadings' => 'Autonumberar los encabezaos',
 'tog-showtoolbar' => "Amosar la barra de ferramientes d'edición (JavaScript)",
-'tog-editondblclick' => 'Editar páxines con doble clic (JavaScript)',
+'tog-editondblclick' => 'Editar páxines con doble clic (necesita JavaScript)',
 'tog-editsection' => "Activar la edición de seiciones per aciu d'enllaces [editar]",
-'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón<br /> drechu enriba los títulos de seición (JavaScript)',
+'tog-editsectiononrightclick' => 'Activar la edición de seiciones calcando col botón drechu nos títulos de seición (necesita JavaScript)',
 'tog-showtoc' => 'Amosar índiz (pa páxines con más de 3 encabezaos)',
-'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (por un máximu de $1 {{PLURAL:$1|día|díes}})',
-'tog-watchcreations' => 'Añader les páxines que creo a la mio llista de vixilancia',
-'tog-watchdefault' => "Añader les páxines qu'edito a la mio llista de vixilancia",
-'tog-watchmoves' => 'Añader les páxines que muevo a la mio llista de vixilancia',
-'tog-watchdeletion' => "Añader les páxines qu'esborro a la mio llista de vixilancia",
-'tog-minordefault' => 'Marcar toles ediciones como menores de mou predetermináu',
+'tog-rememberpassword' => 'Recordar la mio identificación nesti ordenador (hasta un máximu de $1 {{PLURAL:$1|día|díes}})',
+'tog-watchcreations' => 'Amestar les páxines que creo a la mio llista de vixilancia',
+'tog-watchdefault' => "Amestar les páxines qu'edito a la mio llista de vixilancia",
+'tog-watchmoves' => 'Amestar les páxines que muevo a la mio llista de vixilancia',
+'tog-watchdeletion' => 'Amestar les páxines que desanicio a la mio llista de vixilancia',
+'tog-minordefault' => 'Marcar toles ediciones como menores por defeutu',
 'tog-previewontop' => "Amosar previsualización enantes de la caxa d'edición",
 'tog-previewonfirst' => 'Amosar previsualización na primer edición',
 'tog-nocache' => 'Desactivar la caché de páxines del restolador',
-'tog-enotifwatchlistpages' => 'Mandame un corréu cuando cambie una páxina de la mio llista de vixilancia',
+'tog-enotifwatchlistpages' => 'Mandame un corréu cuando camude una páxina de la mio llista de vixilancia',
 'tog-enotifusertalkpages' => "Mandame un corréu cuando camude la mio páxina d'alderique",
-'tog-enotifminoredits' => 'Mandame tamién un corréu pa les ediciones menores',
-'tog-enotifrevealaddr' => 'Amosar el mio corréu electrónicu nos correos de notificación',
-'tog-shownumberswatching' => "Amosar el númberu d'usuarios que la tán vixilando",
+'tog-enotifminoredits' => 'Mandame tamién un corréu cuando heba ediciones menores de les páxines',
+'tog-enotifrevealaddr' => 'Amosar la mio direición de corréu nos correos de notificación',
+'tog-shownumberswatching' => "Amosar el númberu d'usuarios que tán vixilando la páxina",
 'tog-oldsig' => 'Firma esistente:',
-'tog-fancysig' => 'Usar la firma como "testu wiki" (ensin enllaz automáticu)',
-'tog-externaleditor' => 'Usar un editor esternu de mou predeterminao (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Usar un diff esternu de mou predetermináu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-fancysig' => 'Tratar la firma como testu wiki (ensin enllaz automáticu)',
+'tog-externaleditor' => 'Usar un editor esternu por defeutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaldiff' => 'Usar un diff esternu por defutu (namái pa espertos, necesita configuraciones especiales nel to ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
 'tog-showjumplinks' => 'Activar los enllaces d\'accesibilidá "saltar a"',
-'tog-uselivepreview' => 'Usar vista previa en direutu (JavaScript) (en pruebes)',
+'tog-uselivepreview' => 'Usar vista previa en tiempu real (necesita JavaScript) (en pruebes)',
 'tog-forceeditsummary' => "Avisame cuando grabe col resume d'edición en blanco",
-'tog-watchlisthideown' => 'Esconder les mios ediciones na llista de vixilancia',
-'tog-watchlisthidebots' => 'Esconder les ediciones de bots na llista de vixilancia',
-'tog-watchlisthideminor' => 'Esconder les ediciones menores na llista de vixilancia',
-'tog-watchlisthideliu' => "Ocultar ediciones d'usuarios rexistraos na llista de vixilancia",
-'tog-watchlisthideanons' => "Ocultar ediciones d'usuarios anónimos na llista de vixilancia",
-'tog-watchlisthidepatrolled' => 'Anubrir les ediciones patrullaes de la llista de vixilancia',
+'tog-watchlisthideown' => 'Anubrir les mios ediciones na llista de vixilancia',
+'tog-watchlisthidebots' => 'Anubrir les ediciones de bots na llista de vixilancia',
+'tog-watchlisthideminor' => 'Anubrir les ediciones menores na llista de vixilancia',
+'tog-watchlisthideliu' => "Anubrir les ediciones d'usuarios identificaos na llista de vixilancia",
+'tog-watchlisthideanons' => "Anubrir les ediciones d'usuarios anónimos na llista de vixilancia",
+'tog-watchlisthidepatrolled' => 'Anubrir les ediciones vixilaes de la llista de vixilancia',
 'tog-nolangconversion' => 'Desactivar la conversión de variantes',
-'tog-ccmeonemails' => 'Mandame copies de los correos que mando a otros usuarios',
+'tog-ccmeonemails' => "Mandame copies de los correos qu'unvio a otros usuarios",
 'tog-diffonly' => 'Nun amosar el conteníu de la páxina embaxo de les diferencies',
 'tog-showhiddencats' => 'Amosar categoríes anubríes',
 'tog-noconvertlink' => 'Desactivar la conversión del títulu del enllaz',
-'tog-norollbackdiff' => 'Desanicier les diferencies depués de restaurar',
+'tog-norollbackdiff' => 'Desaniciar les diferencies depués de facer una restauración',
 
-'underline-always' => 'Siempres',
+'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Valor predetermináu del navegador',
+'underline-default' => 'Restolador por defeutu',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Estilu de fonte deárea d'edición:",
-'editfont-default' => 'Valor predetermináu del navegador',
-'editfont-monospace' => 'Fonte monoespaciada',
-'editfont-sansserif' => 'Fonte Sans-serif',
-'editfont-serif' => 'Fonte Serif',
+'editfont-style' => "Estilu de fonte de l'área d'edición:",
+'editfont-default' => 'Restolador por defeutu',
+'editfont-monospace' => 'Tipu de lletra monoespaciada',
+'editfont-sansserif' => 'Tipu de lletra Sans-serif',
+'editfont-serif' => 'TIpu de lletra Serif',
 
 # Dates
 'sunday' => 'domingu',
@@ -170,63 +171,63 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Categoría|Categoríes}}',
-'category_header' => 'Páxines na categoría "$1"',
+'category_header' => 'Páxines na categoría «$1»',
 'subcategories' => 'Subcategoríes',
-'category-media-header' => 'Archivos multimedia na categoría "$1"',
-'category-empty' => "''Esta categoría nun tien anguaño nengún artículu o ficheru multimedia.''",
-'hidden-categories' => '{{PLURAL:$1|Categoría anubría|Categoríes anubríes}}',
-'hidden-category-category' => 'Categoríes ocultes',
-'category-subcat-count' => "{{PLURAL:$2|Esta categoría namái tien la subcategoría siguiente.|Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}, d'un total de $2.}}",
-'category-subcat-count-limited' => 'Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}.',
-'category-article-count' => "{{PLURAL:$2|Esta categoría contién namái la páxina siguiente.|{{PLURAL:$1|La siguiente páxina ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
-'category-article-count-limited' => '{{PLURAL:$1|La siguiente páxina ta|Les siguientes $1 páxines tán}} na categoría actual.',
-'category-file-count' => "{{PLURAL:$2|Esta categoría contién namái el siguiente ficheru.|{{PLURAL:$1|El siguiente ficheru ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
-'category-file-count-limited' => '{{PLURAL:$1|El siguiente archivu ta|Los siguientes $1 archivos tán}} na categoría actual.',
+'category-media-header' => 'Ficheros multimedia na categoría «$1»',
+'category-empty' => "''Anguaño esta categoría nun tien nengún artículu nin ficheru multimedia.''",
+'hidden-categories' => '{{PLURAL:$1|Categoría anubrida|Categoríes anubríes}}',
+'hidden-category-category' => 'Categoríes anubríes',
+'category-subcat-count' => "{{PLURAL:$2|Esta categoría tien namái la subcategoría siguiente.|Esta categoría tien {{PLURAL:$1|la siguiente subcategoría|les siguientes $1 subcategoríes}}, d'un total de $2.}}",
+'category-subcat-count-limited' => 'Esta categoría tien {{PLURAL:$1|la subcategoría siguiente|les $1 subcategoríes siguientes}}.',
+'category-article-count' => "{{PLURAL:$2|Esta categoría contién namái la páxina siguiente.|{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} nesta categoría, d'un total de $2.}}",
+'category-article-count-limited' => '{{PLURAL:$1|La páxina siguiente ta|Les $1 páxines siguientes tán}} na categoría actual.',
+'category-file-count' => "{{PLURAL:$2|Esta categoría contién namái'l ficheru siguiente.|{{PLURAL:$1|El ficheru siguiente ta|Los $1 ficheros siguientes tán}} nesta categoría, d'un total de $2.}}",
+'category-file-count-limited' => '{{PLURAL:$1El ficheru siguiente ta|Los $1 ficheeros siguientes tán}} na categoría actual.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páxines indexaes',
-'noindex-category' => 'Páxines ensin indexar',
-'broken-file-category' => 'Páxines con enllaces frañaos a ficheros',
+'noindex-category' => 'Páxines non indexaes',
+'broken-file-category' => 'Páxines con enllaces frañíos a ficheros',
 
 'about' => 'Tocante a',
-'article' => 'Conteníu de la páxina',
-'newwindow' => '(abriráse nuna ventana nueva)',
+'article' => 'Páxina de conteníu',
+'newwindow' => '(ábrese nuna ventana nueva)',
 'cancel' => 'Encaboxar',
 'moredotdotdot' => 'Más...',
 'mypage' => 'La mio páxina',
-'mytalk' => "La mio páxina d'alderique",
+'mytalk' => 'El mio alderique',
 'anontalk' => 'Alderique pa esta IP',
 'navigation' => 'Navegación',
 'and' => '&#32;y',
 
 # Cologne Blue skin
-'qbfind' => 'Alcontrar',
-'qbbrowse' => 'Escartafoyar',
+'qbfind' => 'Guetar',
+'qbbrowse' => 'Restolar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
 'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Les mios páxines',
 'qbspecialpages' => 'Páxines especiales',
-'faq' => 'FAQ',
-'faqpage' => 'Project:Entrugues más frecuentes',
+'faq' => 'EMF (entrugues más frecuentes)',
+'faqpage' => 'Project:EMF',
 
 # Vector skin
-'vector-action-addsection' => 'Amestar asuntu',
+'vector-action-addsection' => 'Amestar seición',
 'vector-action-delete' => 'Desaniciar',
 'vector-action-move' => 'Treslladar',
 'vector-action-protect' => 'Protexer',
-'vector-action-undelete' => 'Des-desaniciar',
+'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Camudar la proteición',
-'vector-simplesearch-preference' => 'Activar suxerencies de gueta enantaes (piel Vector namái)',
+'vector-simplesearch-preference' => 'Activar suxerencies meyoraes de gueta (namái apariencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
 'vector-view-view' => 'Lleer',
-'vector-view-viewsource' => 'Ver códigu fonte',
+'vector-view-viewsource' => 'Ver fonte',
 'actions' => 'Aiciones',
 'namespaces' => 'Espacios de nome',
 'variants' => 'Variantes',
 
-'errorpagetitle' => 'Error',
+'errorpagetitle' => 'Fallu',
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ayuda',
@@ -236,7 +237,7 @@ $messages = array(
 'searcharticle' => 'Dir',
 'history' => 'Historial de la páxina',
 'history_short' => 'Historial',
-'updatedmarker' => 'actualizáu dende la mio última visita',
+'updatedmarker' => 'anovada dende la mio visita cabera',
 'printableversion' => 'Versión pa imprentar',
 'permalink' => 'Enllaz permanente',
 'print' => 'Imprentar',
@@ -253,54 +254,54 @@ $messages = array(
 'protect_change' => 'camudar',
 'protectthispage' => 'Protexer esta páxina',
 'unprotect' => 'Camudar la proteición',
-'unprotectthispage' => 'Camudar la proteición desta páxina',
+'unprotectthispage' => "Camudar la proteición d'esta páxina",
 'newpage' => 'Páxina nueva',
 'talkpage' => 'Aldericar sobre esta páxina',
 'talkpagelinktext' => 'Alderique',
 'specialpage' => 'Páxina especial',
 'personaltools' => 'Ferramientes personales',
 'postcomment' => 'Seición nueva',
-'articlepage' => 'Ver conteníu de la páxina',
+'articlepage' => 'Ver la páxina de conteníu',
 'talk' => 'Alderique',
 'views' => 'Vistes',
 'toolbox' => 'Ferramientes',
-'userpage' => "Ver páxina d'usuariu",
-'projectpage' => 'Ver la páxina de proyeutu',
-'imagepage' => 'Ver la páxina de ficheros',
-'mediawikipage' => 'Ver la páxina de mensaxe',
+'userpage' => "Ver la páxina d'usuariu",
+'projectpage' => 'Ver la páxina del proyeutu',
+'imagepage' => 'Ver la páxina del ficheru',
+'mediawikipage' => 'Ver la páxina de mensaxes',
 'templatepage' => 'Ver la páxina de plantía',
 'viewhelppage' => "Ver la páxina d'ayuda",
-'categorypage' => 'Ver páxina de categoríes',
-'viewtalkpage' => 'Ver alderique',
+'categorypage' => 'Ver la páxina de la categoría',
+'viewtalkpage' => "Ver la páxina d'alderique",
 'otherlanguages' => "N'otres llingües",
 'redirectedfrom' => '(Redirixío dende $1)',
 'redirectpagesub' => 'Páxina de redireición',
-'lastmodifiedat' => "Esta páxina se camudó por cabera vegada'l $1 a les $2.",
-'viewcount' => 'Esta páxina foi vista {{PLURAL:$1|una vegada|$1 vegaes}}.',
+'lastmodifiedat' => "Esta páxina camudóse per postrer vegada'l $1 a les $2.",
+'viewcount' => 'Esta páxina visitóse {{PLURAL:$1|una vegada|$1 vegaes}}.',
 'protectedpage' => 'Páxina protexida',
 'jumpto' => 'Saltar a:',
 'jumptonavigation' => 'navegación',
-'jumptosearch' => 'gueta',
-'view-pool-error' => "Lo siento, los sirvidores tan sobrecargaos nesti intre.
-Hai demasiaos usuarios intentando ver esta páxina.
-Espera un momentu enantes d'intentar acceder a esta páxina.
+'jumptosearch' => 'guetar',
+'view-pool-error' => 'Sentímoslo, los sirvidores tán sobrecargaos nestos momentos.
+Hai demasiaos usuarios faciendo por ver esta páxina.
+Por favor espera un cachín enantes de volver intentar acceder a esta páxina.
 
-$1",
-'pool-timeout' => 'Tiempu escosáu esperando pol bloquéu',
-'pool-queuefull' => "La cola d'agrupación ta llena",
-'pool-errorunknown' => 'Error desconocíu',
+$1',
+'pool-timeout' => 'Tiempu escosáu esperando pal bloquéu',
+'pool-queuefull' => 'La cola de trabayu ta enllena',
+'pool-errorunknown' => 'Fallu desconocíu',
 
 # 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' => 'Tocante a {{SITENAME}}',
 'aboutpage' => 'Project:Tocante a',
-'copyright' => 'Esti conteníu ta disponible baxo los términos de la  $1.',
-'copyrightpage' => "{{ns:project}}:Derechos d'autor",
+'copyright' => 'El conteníu ta disponible baxo los términos de llicencia  $1.',
+'copyrightpage' => "{{ns:project}}:Drechos d'autor",
 'currentevents' => 'Actualidá',
 'currentevents-url' => 'Project:Actualidá',
 'disclaimers' => 'Avisu llegal',
-'disclaimerpage' => 'Project:Alvertencia xeneral',
+'disclaimerpage' => 'Project:Avisu xeneral',
 'edithelp' => "Ayuda d'edición",
-'edithelppage' => 'Help:Edición de páxines',
+'edithelppage' => 'Help:Cómo editar una páxina',
 'helppage' => 'Help:Conteníu',
 'mainpage' => 'Portada',
 'mainpage-description' => 'Portada',
@@ -310,29 +311,29 @@ $1",
 'privacy' => 'Politica de privacidá',
 'privacypage' => 'Project:Política de privacidá',
 
-'badaccess' => 'Error de permisos',
+'badaccess' => 'Fallu de permisos',
 'badaccess-group0' => "Nun tienes permisu pa executar l'aición solicitada.",
-'badaccess-groups' => "L'aición solicitada ta llimitada a usuarios {{PLURAL:$2|del grupu|d'ún de los grupos}}: $1.",
+'badaccess-groups' => "L'aición solicitada ta acutada pa usuarios {{PLURAL:$2|del grupu|d'ún d'estos grupos}}: $1.",
 
 'versionrequired' => 'Necesítase la versión $1 de MediaWiki',
 'versionrequiredtext' => 'Necesítase la versión $1 de MediaWiki pa usar esta páxina. Ver la [[Special:Version|páxina de versión]].',
 
 'ok' => 'Aceutar',
-'retrievedfrom' => 'Sacáu de "$1"',
+'retrievedfrom' => 'Sacáu de «$1»',
 'youhavenewmessages' => 'Tienes $1 ($2).',
 'newmessageslink' => 'mensaxes nuevos',
-'newmessagesdifflink' => 'últimu cambiu',
+'newmessagesdifflink' => 'cambéu postreru',
 'youhavenewmessagesmulti' => 'Tienes mensaxes nuevos en $1',
 'editsection' => 'editar',
 'editold' => 'editar',
 'viewsourceold' => 'ver fonte',
 'editlink' => 'editar',
-'viewsourcelink' => 'amosar la fonte',
+'viewsourcelink' => 'ver fonte',
 'editsectionhint' => 'Editar seición: $1',
-'toc' => 'Conteníu',
+'toc' => 'Índiz',
 'showtoc' => 'amosar',
 'hidetoc' => 'anubrir',
-'collapsible-collapse' => 'Esconder',
+'collapsible-collapse' => 'Plegar',
 'collapsible-expand' => 'Espander',
 'thisisdeleted' => '¿Ver o restaurar $1?',
 'viewdeleted' => '¿Ver $1?',
@@ -342,18 +343,18 @@ $1",
 'feed-unavailable' => 'Les canales de sindicación nun tán disponibles',
 'site-rss-feed' => 'Canal RSS $1',
 'site-atom-feed' => 'Canal Atom $1',
-'page-rss-feed' => 'Canal RSS "$1"',
-'page-atom-feed' => 'Canal Atom "$1"',
+'page-rss-feed' => 'Canal RSS «$1»',
+'page-atom-feed' => 'Canal Atom «$1»',
 'red-link-title' => '$1 (la páxina nun esiste)',
-'sort-descending' => 'Orde descendiente',
-'sort-ascending' => 'Orde ascendiente',
+'sort-descending' => 'Orde descendente',
+'sort-ascending' => 'Orde ascendente',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Páxina',
 'nstab-user' => "Páxina d'usuariu",
-'nstab-media' => "Páxina d'archivu multimedia",
+'nstab-media' => 'Páxina de ficheru multimedia',
 'nstab-special' => 'Páxina especial',
-'nstab-project' => 'Páxina de proyeutu',
+'nstab-project' => 'Páxina del proyeutu',
 'nstab-image' => 'Ficheru',
 'nstab-mediawiki' => 'Mensaxe',
 'nstab-template' => 'Plantía',
@@ -368,266 +369,274 @@ Tamién podría ser un bug nel software usáu por {{SITENAME}}.",
 'nosuchspecialpage' => 'Nun esiste esa páxina especial',
 'nospecialpagetext' => '<strong>Pidisti una páxina especial non válida.</strong>
 
-Pues consultar la llista de les páxines especiales válides en [[Special:SpecialPages|{{int:specialpages}}]].',
+Pues atopar una llista de les páxines especiales válides en [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Error',
-'databaseerror' => 'Error na base de datos',
-'dberrortext' => 'Hebo un fallu de sintaxis nuna consulta de la base de datos.
+'error' => 'Fallu',
+'databaseerror' => 'Fallu na base de datos',
+'dberrortext' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
 Esti fallu puede ser por un problema del software.
-La postrer consulta que s\'intentó foi:
+La postrer consulta a la base de datos que s'intentó foi:
 <blockquote><tt>$1</tt></blockquote>
-dende la función "<tt>$2</tt>".
-La base datos dió el fallu "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Hebo un fallu de sintaxis nuna consulta a la base de datos.
-La postrer consulta que s\'intentó foi:
-"$1"
-dende la función "$2".
-La base de datos dió\'l fallu "$3: $4"',
-'laggedslavemode' => 'Avisu: Esta páxina pue que nun tenga actualizaciones recientes.',
+dende la función «<tt>$2</tt>».
+La base datos dio'l fallu «<tt>$3: $4</tt>».",
+'dberrortextcl' => "Hebo un fallu de sintaxis nuna consulta a la base de datos.
+La postrer consulta de la base de datos que s'intentó foi:
+«$1»
+dende la función «$2».
+La base de datos dio'l fallu «$3: $4».",
+'laggedslavemode' => "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
 'readonly' => 'Base de datos candada',
-'enterlockreason' => 'Introduz un motivu pal candáu, amiestando una estimación de cuándo va ser llevantáu esti',
-'readonlytext' => "Nestos momentos la base de datos ta candada pa nueves entraes y otres modificaciones, seique por un mantenimientu de rutina, depués d'él tará accesible de nuevo.
+'enterlockreason' => 'Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu',
+'readonlytext' => "Nestos momentos la base de datos ta candada pa nueves entraes y otres modificaciones, seique por un mantenimientu de rutina, volviendo tar accesible cuando esti dea fin.
 
 L'alministrador que la candó conseñó esti motivu: $1",
-'missing-article' => "La base de datos nun alcontró'l testu d'una páxina que tendría d'haber alcontrao, nomada \"\$1\" \$2.
+'missing-article' => "La base de datos nun atopó'l testu d'una páxina qu'hubiera tener alcontrao, nomada «\$1» \$2.
 
-Esto débese davezu a siguir un diff caducáu o un enllaz d'historial a una páxina que se desanició.
+Esto débese davezu a siguir una \"dif\" caducada o un enllaz d'historial a una páxina que se desanició.
 
 Si esti nun ye'l casu, seique tengas atopao un bug nel software.
 Por favor informa d'esto a un [[Special:ListUsers/sysop|alministrador]], anotando la URL.",
-'missingarticle-rev' => '(revisión: $1)',
+'missingarticle-rev' => '(núm. revisión: $1)',
 'missingarticle-diff' => '(dif: $1, $2)',
-'readonly_lag' => 'La base de datos foi candada automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
-'internalerror' => 'Error internu',
-'internalerror_info' => 'Error internu: $1',
-'fileappenderrorread' => 'Nun se pudo lleer "$1" mientres s\'amestaba.',
-'fileappenderror' => 'Nun se pudo amestar "$1" a "$2".',
-'filecopyerror' => 'Nun se pudo copiar el ficheru "$1" como "$2".',
-'filerenameerror' => 'Nun se pudo renomar l\'archivu "$1" como "$2".',
-'filedeleteerror' => 'Nun se pudo desaniciar el ficheru "$1".',
-'directorycreateerror' => 'Nun se pudo crear el direutoriu "$1".',
-'filenotfound' => 'Nun se pudo atopar el ficheru "$1".',
-'fileexistserror' => 'Nun se pue escribir nel archivu "$1": yá esiste',
-'unexpected' => 'Valor inesperáu: "$1"="$2".',
-'formerror' => 'Error: nun se pudo unviar el formulariu',
-'badarticleerror' => 'Esta aición nun pue facese nesta páxina',
-'cannotdelete' => 'Nun pudo desaniciase la páxina o el ficheru "$1".
-Seique daquién yá la desaniciara.',
-'cannotdelete-title' => 'Nun se pue desaniciar la páxina "$1"',
+'readonly_lag' => 'La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra',
+'internalerror' => 'Fallu internu',
+'internalerror_info' => 'Fallu internu: $1',
+'fileappenderrorread' => "Nun se pudo lleer «$1» mentanto l'amestadura.",
+'fileappenderror' => 'Nun se pudo amestar «$1» a «$2».',
+'filecopyerror' => 'Nun se pudo copiar el ficheru «$1» como «$2».',
+'filerenameerror' => 'Nun se pudo renomar el ficheru «$1» como «$2».',
+'filedeleteerror' => 'Nun se pudo desaniciar el ficheru «$1».',
+'directorycreateerror' => 'Nun se pudo crear el direutoriu «$1».',
+'filenotfound' => 'Nun se pudo atopar el ficheru «$1».',
+'fileexistserror' => 'Nun se pue escribir nel archivu «$1»: yá esiste',
+'unexpected' => 'Valor inesperáu: «$1»=«$2».',
+'formerror' => 'Fallu: Nun se pudo unviar el formulariu.',
+'badarticleerror' => 'Esta aición nun pue facese nesta páxina.',
+'cannotdelete' => "Nun pudo desaniciase la páxina o'l ficheru «$1».
+Seique daquién yá lo desaniciara.",
+'cannotdelete-title' => 'Nun se pue desaniciar la páxina «$1»',
 'badtitle' => 'Títulu incorreutu',
-'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces inter-llingua o inter-wiki incorreutos.
-Pue contener ún o más caráuteres que nun se puen usar nos títulos.',
-'perfcached' => 'Los siguientes datos tán na caché, seique nun tean actualizaos dafechu. Hai un máximu de {{PLURAL:$1|$1 resultáu disponible|$1 resultaos disponibles}} na caché.',
-'perfcachedts' => "Los siguientes datos tán na caché, y s'anovaron la cabera vegada'l $1. Hai un máximu de {{PLURAL:$4|$4 resultáu disponible|$4 resultaos disponibles}} na caché.",
-'querypage-no-updates' => "Los anovamientos d'esta páxina anguaño tán desactivaos.
-Estos datos nun se refrescarán nestos momentos.",
+'badtitletext' => 'El títulu de páxina solicitáu nun ye válidu, ta baleru o tien enllaces interllingua o interwiki incorreutos.
+Pue contener ún o más carauteres que nun se puen usar nos títulos.',
+'perfcached' => "Los datos siguientes tán na caché y seique nun tean anovaos. Hai un máximu {{PLURAL:$1|d'un resultáu disponible|de $1 resultaos disponibles}} na caché.",
+'perfcachedts' => "Los datos siguientes tán na caché y anováronse per postrer vegada'l $1. Hai un máximu {{PLURAL:$4|d'un resultáu disponible|de $4 resultaos disponibles}} na caché.",
+'querypage-no-updates' => "Anguaño los anovamientos d'esta páxina tán desactivaos.
+Estos datos nun van refrescase nestos momentos.",
 'wrong_wfQuery_params' => 'Parámetros incorreutos pa wfQuery()<br />
 Función: $1<br />
 Consulta: $2',
-'viewsource' => 'Ver códigu fonte',
-'viewsource-title' => 'Ver la fonte de "$1"',
+'viewsource' => 'Ver fonte',
+'viewsource-title' => 'Ver la fonte de «$1»',
 'actionthrottled' => 'Aición llendada',
-'actionthrottledtext' => "Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
-Por favor vuelve a tentalo dientro d'unos minutos.",
+'actionthrottledtext' => 'Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
+Por favor vuelvi intentalo nunos minutos.',
 'protectedpagetext' => 'Esta páxina ta candada pa torgar la so edición.',
-'viewsourcetext' => "Pues ver y copiar el códigu fonte d'esta páxina:",
-'viewyourtext' => "Pues ver y copiar el códigu fonte de '''les tos ediciones''' d'esta páxina:",
-'protectedinterface' => "Esta páxina proporciona testu d'interfaz a l'aplicación y ta candada pa evitar el so abusu.",
-'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu de la interfaz a l'aplicación.
-Los cambeos nesta páxina afeutarán a l'apariencia de la interfaz pa otros usuarios.
+'viewsourcetext' => "Pues ver y copiar la fonte d'esta páxina:",
+'viewyourtext' => "Pues ver y copiar la fonte de '''les tos ediciones''' d'esta páxina:",
+'protectedinterface' => "Esta páxina proporciona testu d'interfaz de l'aplicación, y ta candada pa torgar abusos.",
+'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz de l'aplicación.
+Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios.
 Si quies facer traducciones, por favor usa [//translatewiki.net/wiki/Main_Page?setlang=ast translatewiki.net], el proyeutu de traducción de MediaWiki.",
-'sqlhidden' => '(consulta SQL escondida)',
-'cascadeprotected' => 'Esta páxina ta protexida d\'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción "en cascada":
-$2',
+'sqlhidden' => '(consulta SQL anubrida)',
+'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción «en cascada» activada:
+$2",
 'namespaceprotected' => "Nun tienes permisu pa editar páxines nel espaciu de nomes '''$1'''.",
 'customcssprotected' => "Nun tienes permisu pa editar esta páxina CSS porque contién preferencies personales d'otru usuariu.",
 'customjsprotected' => "Nun tienes permisu pa editar esta páxina de JavaScript porque contién preferencies personales d'otru usuariu.",
 'ns-specialprotected' => 'Les páxines especiales nun se puen editar.',
 'titleprotected' => "Esti títulu foi protexíu de la so creación por [[User:$1|$1]].
-El motivu conseñáu ye ''$2''.",
-'filereadonlyerror' => "Nun se pudo camudar el ficheru «$1» porque l'almacén de ficheros «$2» ta en mou de sólo llectura.
+El motivu conseñáu ye «''$2''».",
+'filereadonlyerror' => "Nun se pudo camudar el ficheru «$1» porque'l repositoriu de ficheros «$2» ta en mou de namái llectura.
 
-L'alministrador que lu bloquió dió esti motivu: «$3».",
+L'alministrador que lu bloquió dio esti motivu: «$3».",
+'invalidtitle-knownnamespace' => 'Títulu non válidu col espaciu de nomes «$2» y el testu «$3»',
+'invalidtitle-unknownnamespace' => "Titulu non válidu col númberu $1 d'espaciu de nomes desconocíu y el testu «$2»",
+'exception-nologin' => 'Non identificáu',
+'exception-nologin-text' => "Esta páxina o aición necesita qu'anicies sesión nesta wiki.",
 
 # Virus scanner
-'virus-badscanner' => "Error de configuración: escáner de virus desconocíu: ''$1''",
+'virus-badscanner' => "Fallu de configuración: Escáner de virus desconocíu: ''$1''",
 'virus-scanfailed' => "fallu d'escanéu (códigu $1)",
 'virus-unknownscanner' => 'antivirus desconocíu:',
 
 # Login and logout pages
-'logouttext' => "'''Yá tas desconectáu.'''
+'logouttext' => "'''Agora tas desconeutáu.'''
 
-Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
-Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del navegador.",
-'welcomecreation' => "== Bienveníu, $1! ==
-Se creó la to cuenta.
+Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
+Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del restolador.",
+'welcomecreation' => "== ¡Bienllegáu, $1! ==
+Creóse la to cuenta.
 Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
 'yourname' => "Nome d'usuariu:",
-'yourpassword' => 'Conseña:',
-'yourpasswordagain' => 'Escribi otra vuelta la to conseña:',
-'remembermypassword' => 'Recordar la mio identificación nesti ordenador (por un máximu de $1 {{PLURAL:$1|día|díes}})',
-'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificate",
+'yourpassword' => 'Clave:',
+'yourpasswordagain' => 'Escribi otra vuelta la clave:',
+'remembermypassword' => "Recordar la mio identificación nesti restolador (un máximu {{PLURAL:$1|d'un día|de $1 díes}})",
+'securelogin-stick-https' => "Siguir coneutáu al HTTPS dempués d'identificase",
 'yourdomainname' => 'El to dominiu:',
-'externaldberror' => "O hebo un error de l'autenticación esterna de la base de datos o nun tienes permisu p'actualizar la to cuenta esterna.",
-'login' => 'Entrar',
-'nav-login-createaccount' => 'Entrar / Crear cuenta',
-'loginprompt' => "Has tener les ''cookies'' activaes pa entrar en {{SITENAME}}.",
-'userlogin' => 'Entrar / Crear cuenta',
-'userloginnocreate' => 'Entrar',
-'logout' => 'Colar',
-'userlogout' => 'Colar',
+'externaldberror' => "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
+'login' => 'Identificase',
+'nav-login-createaccount' => 'Identificase / crear una cuenta',
+'loginprompt' => 'Has tener les «cookies» activaes pa identificate en {{SITENAME}}.',
+'userlogin' => 'Identificase / crear una cuenta',
+'userloginnocreate' => 'Identificase',
+'logout' => 'Dexar de tar identificáu',
+'userlogout' => 'Dexar de tar identificáu',
 'notloggedin' => 'Non identificáu',
-'nologin' => "¿Nun tienes una cuenta? '''$1'''.",
-'nologinlink' => '¡Fai una!',
+'nologin' => '¿Nun tienes una cuenta? $1.',
+'nologinlink' => 'Crear una cuenta',
 'createaccount' => 'Crear una cuenta',
-'gotaccount' => "¿Ya tienes una cuenta? '''$1'''.",
-'gotaccountlink' => 'Aniciar sesión',
-'userlogin-resetlink' => '¿Escaecisti la información de conexón?',
-'createaccountmail' => 'per e-mail',
+'gotaccount' => '¿Ya tienes una cuenta? $1.',
+'gotaccountlink' => 'Identificase',
+'userlogin-resetlink' => "¿Escaecisti los datos d'identificación?",
+'createaccountmail' => 'Per corréu electrónicu',
 'createaccountreason' => 'Motivu:',
 'badretype' => "Les claves qu'escribisti nun concuayen.",
 'userexists' => "El nome d'usuariu conseñáu yá ta usándose.
 Por favor escueyi un nome diferente.",
-'loginerror' => "Error d'identificación",
+'loginerror' => "Fallu d'identificación",
 'createaccounterror' => 'Nun se pudo crear la cuenta: $1',
 'nocookiesnew' => "La cuenta d'usuariu ta creada, pero nun tas identificáu.
-{{SITENAME}} usa cookies pa identificar a los usuarios.
-Tienes les cookies desactivaes.
-Por favor activales y depués entra col to nuevu nome d'usuariu y conseña.",
-'nocookieslogin' => '{{SITENAME}} usa cookies pa identificar a los usuarios. Tienes les cookies deshabilitaes. Por favor actívales y inténtalo otra vuelta.',
-'nocookiesfornew' => "La cuenta nun se creó, porque nun pudimos confirmar l'orixe.
-Asegúrate de tener activaes les cookies, recarga esta páxina y vuelve a tentalo.",
-'noname' => "Nun punxisti un nome d'usuariu válidu.",
+{{SITENAME}} usa «cookies» pa identificar a los usuarios.
+Tienes les «cookies» desactivaes.
+Por favor activales y depués entra col to nome d'usuariu y clave nuevos.",
+'nocookieslogin' => '{{SITENAME}} usa «cookies» pa identificar a los usuarios.
+Tienes les «cookies» desactivaes.
+Por favor actívales y vuelvi intentalo.',
+'nocookiesfornew' => "La cuenta nun se creó porque nun pudimos confirmar l'orixe.
+Asegúrate de tener activaes les «cookies», recarga esta páxina y vuelvi intentalo.",
+'noname' => "Nun conseñasti un nome d'usuariu válidu.",
 'loginsuccesstitle' => 'Identificación correuta',
-'loginsuccess' => "'''Quedasti identificáu en {{SITENAME}} como \"\$1\".'''",
-'nosuchuser' => 'Nun hai usuariu dalu col nome "$1".
-Los nomes d\'usuariu distinguen mayúscules y minúscules.
-Comprueba la ortografía o [[Special:UserLogin/signup|crea una cuenta d\'usuariu nueva]].',
-'nosuchusershort' => 'Nun hai nengún usuariu col nome "$1".
+'loginsuccess' => "'''Quedasti identificáu en {{SITENAME}} como «$1».'''",
+'nosuchuser' => "Nun hai nengún usuariu col nome «$1».
+Los nomes d'usuariu distinguen mayúscules y minúscules.
+Mira que tea bien escritu o [[Special:UserLogin/signup|crea una cuenta nueva]].",
+'nosuchusershort' => 'Nun hai nengún usuariu col nome «$1».
 Mira que tea bien escritu.',
 'nouserspecified' => "Has especificar un nome d'usuariu.",
-'login-userblocked' => 'Esti usuariu ta bloquiáu. Nun se permite la conexón.',
-'wrongpassword' => 'La conseña escrita ye incorreuta.
-Vuelvi intentalo.',
-'wrongpasswordempty' => 'La conseña taba en blanco.
-Vuelvi intentalo.',
-'passwordtooshort' => 'Les contraseñes han de tener a lo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.',
-'password-name-match' => "La conseña tien de ser distinta del nome d'usuariu.",
-'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y conseña.",
-'mailmypassword' => 'Unviar la conseña nueva per corréu',
-'passwordremindertitle' => 'Nueva conseña provisional pa {{SITENAME}}',
-'passwordremindertext' => 'Daquién (seique tu, dende la direición IP $1) solicitó una conseña
-nueva pa {{SITENAME}} ($4). Se creó una conseña temporal pal usuariu
-"$2" que ye "$3". Si fuisti tu, necesites identificate y escoyer
-una conseña nueva agora. La conseña temporal caducará {{PLURAL:$5|nun día|en $5 díes}}.
-
-Si esta solicitú la fizo otra persona, o si recuerdes la conseña y
-nun quies volver a camudala, pues escaecete d\'esti mensaxe y siguir
-usando la conseña antigua.',
-'noemail' => 'L\'usuariu "$1" nun tien puesta direición de corréu.',
-'noemailcreate' => 'Tienes de conseñar una direición de corréu válida',
-'passwordsent' => 'S\'unvió una conseña nueva a la direición de corréu rexistrada pa "$1".
-Por favor vuelve a coneutate depués de recibila.',
-'blocked-mailpassword' => 'La edición dende la to direición IP ta bloquiada, y poro nun se pue usar la función de recuperación de conseña pa evitar abusos.',
-'eauthentsent' => "S'unvió un corréu electrónicu de confirmación a la direición indicada.
-Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu, pa confirmar que la cuenta ye de to.",
-'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la conseña {{PLURAL:$1|na cabera hora|nes caberes $1 hores}}.
+'login-userblocked' => 'Esti usuariu ta bloquiáu. Nun se permite la so identificación.',
+'wrongpassword' => 'La clave escrita ye incorreuta.
+Vuelvi intentalo.',
+'wrongpasswordempty' => 'La clave taba en blanco.
+Vuelvi intentalo.',
+'passwordtooshort' => 'Les claves han tener a lo menos {{PLURAL:$1|1 caráuter|$1 carauteres}}.',
+'password-name-match' => "La clave ha ser distinta del nome d'usuariu.",
+'password-login-forbidden' => "Ta torgao usar esti nome d'usuariu y clave.",
+'mailmypassword' => 'Unviar la clave nueva per corréu',
+'passwordremindertitle' => 'Clave nueva provisional pa {{SITENAME}}',
+'passwordremindertext' => "Daquién (seique tu, dende la direición IP $1) solicitó una clave
+nueva pa {{SITENAME}} ($4). Creóse una clave provisional pal usuariu
+«$2» que ye «$3». Si fuisti tu, necesites identificate y escoyer
+una clave nueva agora. La clave provisional caduca {{PLURAL:$5|nun día|en $5 díes}}.
+
+Si esta solicitú la fizo otra persona, o si recuerdes la clave y
+nun quies volver camudala, pues escaecete d'esti mensaxe y siguir
+usando la clave antigua.",
+'noemail' => "L'usuariu «$1» nun tien rexistrada nenguna direición de corréu.",
+'noemailcreate' => 'Has conseñar una direición de corréu válida',
+'passwordsent' => 'Univóse una clave nueva a la direición de corréu rexistrada pa «$1».
+Por favor vuelvi identificate depués de recibila.',
+'blocked-mailpassword' => 'Ta bloquiada la edición dende la to direición IP, polo que pa evitar abusos nun se pue usar la función de recuperación de clave.',
+'eauthentsent' => "Unvióse un corréu electrónicu de confirmación a la direición indicada.
+Enantes de que s'unvie nengún otru corréu a la cuenta, has siguir les instrucciones del corréu electrónicu pa confirmar que la cuenta ye de to.",
+'throttled-mailpassword' => "Yá s'unvió un recordatoriu de la clave {{PLURAL:$1|na postrer hora|nes postreres $1 hores}}.
 Pa evitar abusos, namái s'unviará un recordatoriu cada {{PLURAL:$1|hora|$1 hores}}.",
-'mailerror' => 'Error al unviar el corréu: $1',
+'mailerror' => 'Fallu al unviar el corréu: $1',
 'acct_creation_throttle_hit' => "Los visitantes d'esta wiki qu'usen la to direición IP yá crearon güei {{PLURAL:$1|1 cuenta|$1 cuentes}}, que ye'l máximu almitíu nesti periodu de tiempu.
 Poro, los visitantes qu'usen esta direición IP nun puen crear más cuentes de momentu.",
-'emailauthenticated' => "La to direición de corréu se confirmó'l $2 a les $3.",
-'emailnotauthenticated' => "La to direición de corréu nun se comprobó entá.
-Nun s'unviará corréu de denguna de les funciones siguientes.",
-'noemailprefs' => 'Conseña una direición de corréu nes tos preferencies pa que funcionen eses carauterístiques.',
-'emailconfirmlink' => 'Confirmar la direición de corréu',
-'invalidemailaddress' => "La direición de corréu nun se pue aceutar yá que paez tener un formatu non válidu.
-Por favor escribi una direición con formatu afayadizu o dexa vaciu'l campu.",
-'cannotchangeemail' => 'Les direiciones de corréu de la cuenta nun puen camudase nesta wiki.',
+'emailauthenticated' => "La to direición de corréu electrónicu confirmóse'l $2 a les $3.",
+'emailnotauthenticated' => 'La to direición de corréu electrónicu nun se comprobó entá.
+Nun va unviase nengún corréu pa nenguna de les funciones siguientes.',
+'noemailprefs' => 'Conseña una direición de corréu electrónicu nes tos preferencies pa que funcionen eses carauterístiques.',
+'emailconfirmlink' => 'Confirmar la direición de corréu electrónicu',
+'invalidemailaddress' => "La direición de corréu electrónicu nun se pue aceutar yá que paez tener un formatu non válidu.
+Por favor conseña una direición con formatu afayadizu o dexa baleru'l campu.",
+'cannotchangeemail' => 'Les direiciones de corréu electrónicu de la cuenta nun puen camudase nesta wiki.',
 'emaildisabled' => 'Esti sitiu nun pue unviar correos electrónicos.',
 'accountcreated' => 'Cuenta creada',
-'accountcreatedtext' => "La cuenta d'usuariu de $1 ta creada.",
+'accountcreatedtext' => "Creóse la cuenta d'usuariu de $1.",
 'createaccount-title' => 'Creación de cuenta pa {{SITENAME}}',
-'createaccount-text' => 'Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) nomada "$2", asociada a la conseña "$3".
-Tendríes d\'entrar y camudar la conseña agora.
+'createaccount-text' => 'Daquién creó una cuenta cola to direición de corréu electrónicu en {{SITENAME}} ($4) col nome «$2», asociada a la clave «$3».
+Habríes identificte y camudar la clave agora.
 
 Pues escaecer esti mensaxe si esta cuenta se creó por error.',
-'usernamehasherror' => "El nome d'usuariu nun pue contener caráuteres hash",
-'login-throttled' => "Ficisti demasiaos intentos recientes de conexón.
+'usernamehasherror' => "El nome d'usuariu nun pue contener carauteres «hash»",
+'login-throttled' => "Ficisti demasiaos intentos recientes d'identificación.
 Por favor espera enantes d'intentalo otra vuelta.",
 'login-abort-generic' => 'Falló la to identificación - Encaboxao',
 'loginlanguagelabel' => 'Llingua: $1',
-'suspicious-userlogout' => "Se negó la petición de desconexón porque paez que vien d'un restolador frañáu o d'un proxy de caché.",
+'suspicious-userlogout' => "Negósete'l pidimientu de desconexón porque paez que vien d'un restolador frañíu o d'un proxy de caché.",
 
 # E-mail sending
-'php-mail-error-unknown' => 'Error desconocíu na función mail() de PHP',
-'user-mail-no-addy' => 'Tentasti unviar un corréu ensin direición de corréu electrónicu.',
+'php-mail-error-unknown' => 'Fallu desconocíu na función mail() de PHP.',
+'user-mail-no-addy' => 'Intentasti unviar un corréu electrónicu ensin direición.',
 
 # Change password dialog
-'resetpass' => 'Camudar la conseña',
-'resetpass_announce' => "Entrasti con una conseña provisional unviada per corréu.
-P'acabar d'identificate, tienes d'escribir equí una conseña nueva:",
+'resetpass' => 'Camudar la clave',
+'resetpass_announce' => "Identificástite con una clave provisional unviada per corréu electrónicu.
+P'acabar d'identificate, has conseñar equí una clave nueva:",
 'resetpass_text' => '<!-- Amestar testu equí -->',
-'resetpass_header' => 'Camudar la conseña de la cuenta',
-'oldpassword' => 'Conseña antigua:',
-'newpassword' => 'Conseña nueva:',
-'retypenew' => 'Escribi otra vuelta la nueva conseña:',
-'resetpass_submit' => 'Definir una conseña y entrar',
-'resetpass_success' => '¡La to conseña se camudó correutamente!
-Coneutando dafechu...',
+'resetpass_header' => 'Camudar la clave de la cuenta',
+'oldpassword' => 'Clave antigua:',
+'newpassword' => 'Clave nueva:',
+'retypenew' => 'Escribi otra vuelta la clave nueva:',
+'resetpass_submit' => 'Conseñar una clave y identificase',
+'resetpass_success' => '¡Camudóse correutamente la to clave!
+Pasando a identificate...',
 'resetpass_forbidden' => 'Les claves nun se puen camudar',
 'resetpass-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
-'resetpass-submit-loggedin' => 'Camudar la conseña',
+'resetpass-submit-loggedin' => 'Camudar la clave',
 'resetpass-submit-cancel' => 'Encaboxar',
-'resetpass-wrong-oldpass' => 'La conseña temporal o actual nun ye válida.
-Seique yá camudasti correutamente la conseña o que pidieras una nueva conseña temporal.',
-'resetpass-temp-password' => 'Conseña temporal:',
+'resetpass-wrong-oldpass' => 'Clave provisional o actual non válida.
+Seique yá camudaras correutamente la clave o que pidieras una nueva clave provisional.',
+'resetpass-temp-password' => 'Clave provisional:',
 
 # Special:PasswordReset
-'passwordreset' => 'Reaniciar conseña',
-'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu que te recuerde los detalles de la to cuenta.',
-'passwordreset-legend' => 'Reaniciar conseña',
-'passwordreset-disabled' => 'Los reanicios de conseña tan desactivaos nesta wiki.',
-'passwordreset-pretext' => "{{PLURAL:$1||Escribi una de les partes de los datos d'abaxo}}",
+'passwordreset' => 'Reaniciar clave',
+'passwordreset-text' => 'Completa esti formulariu pa recibir un corréu electrónicu que te recuerde los detalles de la to cuenta.',
+'passwordreset-legend' => 'Reaniciar clave',
+'passwordreset-disabled' => 'Los reanicios de clave tán desactivaos nesta wiki.',
+'passwordreset-pretext' => "{{PLURAL:$1||Escribi ún de los elementos de los datos d'abaxo}}",
 'passwordreset-username' => "Nome d'usuariu:",
 'passwordreset-domain' => 'Dominiu:',
-'passwordreset-capture' => '¿Ver el mensaxe de corréu resultante?',
-'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola conseña temporal) de la que s'unvia al usuariu.",
+'passwordreset-capture' => '¿Ver el corréu electrónicu resultante?',
+'passwordreset-capture-help' => "Si marques esta caxella, podrás ver el corréu (cola clave provisional) amás d'unvialu al usuariu.",
 'passwordreset-email' => 'Direición de corréu electrónicu:',
 'passwordreset-emailtitle' => 'Detalles de la cuenta en {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Dalguién (seique tu, dende la direición IP $1) pidió un recordatoriu cola
-información de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
+'passwordreset-emailtext-ip' => "Daquién (seique tu, dende la direición IP $1)solicitó un recordatoriu de los
+detalles de la to cuenta de {{SITENAME}} ($4).
+{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
+a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta conseña temporal caducará|Estes conseñes temporales caducarán}} {{PLURAL:$5|nún día|en $5 díes}}.
-Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
-solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
-escaez esti mensaxe y sigui emplegando la conseña antigua.",
-'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} pidió un recordatoriu cola información de la to cuenta de {{SITENAME}} ($4).
-{{PLURAL:$3|La siguiente cuenta d'usuariu ta asociada|Les siguientes cuentes d'usuariu tan asociaes}} con esta direición de corréu:
+{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nún día|en $5 díes}}.
+Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona,
+o si recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir
+usando la to clave antigua.",
+'passwordreset-emailtext-user' => "L'usuariu $1 de {{SITENAME}} solicitó un recordatoriu de los detalles de la to cuenta de {{SITENAME}} ($4).
+{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}
+a esta direición de corréu electrónicu:
 
 $2
 
-{{PLURAL:$3|Esta conseña temporal caducará|Estes conseñes temporales caducarán}} {{PLURAL:$5|nun día|en $5 díes}}.
-Tendríes d'entrar al sistema y escoyer una conseña nueva agora. Si esta
-solicitú ye d'otru o recordasti la conseña orixinal y nun quies camudala,
-escaez esti mensaxe y sigui emplegando la conseña antigua.",
+{{PLURAL:$3|Esta clave provisional caduca|Estes claves provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.
+Habríes identificate y escoyer una clave nueva agora. Si esta solicitú la fizo otra persona, o si
+recordasti la clave orixinal y yá nun quies camudala, pues escaecer esti mensaxe y siguir usando
+la to clave antigua.",
 'passwordreset-emailelement' => "Nome d'usuariu: $1
-Conseña temporal: $2",
-'passwordreset-emailsent' => "S'unvió un corréu de recordatoriu.",
-'passwordreset-emailsent-capture' => "S'unvió un corréu de recordatoriu, que s'amuesa abaxo.",
-'passwordreset-emailerror-capture' => "Se xeneró un corréu de recordatoriu, que s'amuesa abaxo; pero falló unvialu al usuariu: $1",
+Clave provisional: $2",
+'passwordreset-emailsent' => 'Unvióse un corréu electrónicu de recordatoriu.',
+'passwordreset-emailsent-capture' => "Unvióse un corréu electrónicu de recordatoriu, que s'amuesa abaxo.",
+'passwordreset-emailerror-capture' => "Xeneróse un corréu electrónicu de recordatoriu, que s'amuesa abaxo, pero falló'l so unviu al usuariu: $1",
 
 # Special:ChangeEmail
 'changeemail' => 'Camudar la direición de corréu electrónicu',
 'changeemail-header' => 'Camudar la direición de corréu electrónicu de la cuenta',
-'changeemail-text' => "Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Tendrás d'escribir la to conseña pa confirmar esti cambiu.",
+'changeemail-text' => 'Rellena esti formulariu pa camudar la to direición de corréu electrónicu. Habrás escribir la to clave pa confirmar esti cambéu.',
 'changeemail-no-info' => "Has tar identificáu p'acceder direutamente a esta páxina.",
 'changeemail-oldemail' => 'Direición de corréu electrónicu actual:',
-'changeemail-newemail' => 'Nueva direición de corréu electrónicu:',
+'changeemail-newemail' => 'Direición de corréu electrónicu nueva:',
 'changeemail-none' => '(nengún)',
 'changeemail-submit' => 'Camudar el corréu electrónicu',
 'changeemail-cancel' => 'Encaboxar',
@@ -640,117 +649,128 @@ Conseña temporal: $2",
 'link_sample' => 'Títulu del enllaz',
 'link_tip' => 'Enllaz internu',
 'extlink_sample' => 'http://www.example.com títulu del enllaz',
-'extlink_tip' => "Enllaz esternu (recuerda'l prefixu http://)",
+'extlink_tip' => 'Enllaz esternu (alcuérdate del prefixu http://)',
 'headline_sample' => 'Testu de cabecera',
 'headline_tip' => 'Cabecera de nivel 2',
 'nowiki_sample' => 'Pon equí testu ensin formatu',
-'nowiki_tip' => 'Saltar el formatu wiki',
+'nowiki_tip' => 'Inorar el formatu wiki',
 'image_sample' => 'Exemplu.jpg',
 'image_tip' => 'Ficheru incrustáu',
 'media_sample' => 'Exemplu.ogg',
-'media_tip' => 'Enllaz al ficheru',
+'media_tip' => 'Enllaz del ficheru',
 'sig_tip' => 'La to robla con data y hora',
 'hr_tip' => 'Llinia horizontal (úsala con moderación)',
 
 # Edit pages
 'summary' => 'Resume:',
-'subject' => 'Asuntu/títulu:',
+'subject' => 'Asuntu/cabecera:',
 'minoredit' => 'Esta ye una edición menor',
 'watchthis' => 'Vixilar esta páxina',
-'savearticle' => 'Grabar páxina',
-'preview' => 'Vista previa',
+'savearticle' => 'Guardar la páxina',
+'preview' => 'Previsualización',
 'showpreview' => 'Amosar previsualización',
 'showlivepreview' => 'Vista rápida',
-'showdiff' => 'Amosar cambios',
+'showdiff' => 'Amosar cambeos',
 'anoneditwarning' => "'''Avisu:''' Nun tas identificáu.
-La to direición IP se grabará nel historial d'edición d'esta páxina.",
-'anonpreviewwarning' => "''Nun tas identificáu. Al guardar se rexistrará la to direición IP nel historial d'edición d'esta páxina.''",
-'missingsummary' => "'''Recordatoriu:''' Nun escribisti un resume d'edición.
-Si vuelves a calcar en \"{{int:savearticle}}\", la to edición se guardará ensin nengún resume.",
+La to direición IP va quedar grabada nel historial d'edición d'esta páxina.",
+'anonpreviewwarning' => "''Nun tas identificáu. Al guardar va queda rexistrada la to direición IP nel historial d'edición d'esta páxina.''",
+'missingsummary' => "'''Recordatoriu:''' Nun conseñasti un resume d'edición.
+Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún resume.",
 'missingcommenttext' => 'Por favor, escribi un comentariu embaxo.',
-'missingcommentheader' => "'''Recordatoriu:''' Nun-y punxisti tema/títulu a esti comentariu.
-Si vuelves a calcar en \"{{int:savearticle}}\", la to edición va grabase ensin él.",
+'missingcommentheader' => "'''Recordatoriu:''' Nun-y conseñasti asuntu/cabecera a esti comentariu.
+Si vuelves calcar en \"{{int:savearticle}}\", la to edición va guardase ensin nengún comentariu.",
 'summary-preview' => 'Previsualización del resume:',
-'subject-preview' => 'Previsualización del tema/títulu:',
+'subject-preview' => 'Previsualización del asuntu/cabecera:',
 'blockedtitle' => "L'usuariu ta bloquiáu",
-'blockedtext' => "'''El to nome d'usuariu o la to direición IP foi bloquiáu.'''
+'blockedtext' => "'''Bloquióse'l to nome d'usuariu o la to direición IP.'''
 
 El bloquéu féxolu $1.
 El motivu conseñáu ye ''$2''.
 
 * Entamu del bloquéu: $8
 * Caducidá del bloquéu: $6
-* Usuariu que se quier bloquiar: $7
+* Usuariu a bloquiar: $7
 
-Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] pa discutir el bloquéu.
-Nun pues usar la funcionalidá 'manda-y un email a esti usuariu' a nun ser que tea especificada una direición de corréu válida
-na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao el so usu.
+Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p'aldericar sobre'l bloquéu.
+Nun pues usar la funcionalidá 'manda-y un corréu electrónicu a esti usuariu' a nun ser que tea especificada una direición de
+corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao'l so usu.
 La to direición IP actual ye $3, y el númberu d'identificación del bloquéu ye $5.
-Por favor, amiesta dalgún o dambos d'estos datos nes tos consultes.",
-'autoblockedtext' => 'La to direición IP foi bloquiada automáticamente porque foi usada por otru usuariu que foi bloquiáu por $1.
-El motivu conseñáu foi esti:
+Por favor, amiesta tolos detalles nes consultes que faigas.",
+'autoblockedtext' => 'Bloquióse automáticamente la to direición IP porque la usó otru usuariu que foi bloquiáu por $1.
+El motivu conseñáu ye:
 
 :\'\'$2\'\'
 
 * Entamu del bloquéu: $8
 * Caducidá del bloquéu: $6
-* Usuariu que se quier bloquiar: $7
+* Usuariu a bloquiar: $7
 
 Pues ponete en contautu con $1 o con cualesquier otru [[{{MediaWiki:Grouppage-sysop}}|alministrador]] p\'aldericar sobre\'l bloquéu.
 
-Fíxate en que nun pues usar la funcionalidá d\'"unvia-y un corréu a esti usuariu" a nun se que tengas una direición de corréu válida rexistrada na to [[Special:Preferences|páxina de preferencies]] y que nun teas bloquiáu pa usala.
+Fíxate en que nun pues usar la funcionalidá "manda-y un corréu electrónicu a esti usuariu" a nun se que tea rexistrada una direición de corréu electrónicu válida na to [[Special:Preferences|páxina de preferencies]] y que nun te tengan bloquiao\'l so usu.
+
+La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
+Por favor, amiesta tolos detalles nes consultes que faigas.
 
 La to direición IP actual ye $3, y el númberu d\'identificación del bloquéu ye $5.
-Por favor, amiesta toos estos detalles nes consultes que faigas.',
+Por favor, amiesta tolos detalles nes consultes que faigas.',
 'blockednoreason' => 'nun se dio nengún motivu',
-'whitelistedittext' => 'Tienes que $1 pa editar páxines.',
-'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines. Por favor, configúrala y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
-'nosuchsectiontitle' => 'Nun se pue alcontrar la seición',
+'whitelistedittext' => 'Has $1 pa editar páxines.',
+'confirmedittext' => "Has confirmar la to direición de corréu electrónicu enantes d'editar páxines.
+Por favor, defínila y valídala nes tos [[Special:Preferences|preferencies d'usuariu]].",
+'nosuchsectiontitle' => 'Nun se pue atopar la seición',
 'nosuchsectiontext' => 'Intentasti editar una seición que nun esiste.
-Seique se treslladara o desaniciara mientres visitabes la páxina.',
-'loginreqtitle' => 'Identificación Requerida',
-'loginreqlink' => 'identificase',
+Seique se treslladara o desaniciara mientres víes la páxina.',
+'loginreqtitle' => 'Necesítase identificación',
+'loginreqlink' => 'identificate',
 'loginreqpagetext' => 'Has $1 pa ver otres páxines.',
-'accmailtitle' => 'Conseña unviada.',
-'accmailtext' => "Unvióse a $2 una conseña xenerada al debalu pa [[User talk:$1|$1]].
+'accmailtitle' => 'Clave unviada.',
+'accmailtext' => "Unvióse a $2 una clave xenerada al debalu pal usuariu [[User talk:$1|$1]].
 
-La conseña d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar conseña]]'' depués d'identificate.",
+La clave d'esta cuenta nueva pue camudase na páxina ''[[Special:ChangePassword|camudar clave]]'' depués d'identificate.",
 'newarticle' => '(Nuevu)',
 'newarticletext' => "Siguisti un enllaz a un artículu qu'inda nun esiste.
-Pa crear la páxina, empecipia a escribir nel cuadru que vien darréu (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
-Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to navegador.",
-'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa. Pola mor d'ello ha usase la direición numérica IP pa identificalu/la. Tala IP pue ser compartida por varios usuarios. Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|rexístrate]] pa evitar futures confusiones con otros usuarios anónimos.''",
-'noarticletext' => 'Anguaño nun hai testu nesta páxina.
-Pues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],
-o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar ésta equí]</span>.',
-'noarticletext-nopermission' => 'Anguaño nun hai testu nesta páxina.
-Pues [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n\'otres páxines,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>.',
-'userpage-userdoesnotexist' => 'La cuenta d\'usuariu "<nowiki>$1</nowiki>" nun ta rexistrada. Por favor asegúrate de que quies crear/editar esta páxina.',
-'userpage-userdoesnotexist-view' => 'La cuenta d\'usuariu "$1" nun ta rexistrada.',
-'blocked-notice-logextract' => "Esti usuariu anguaño ta bloquiáu.
-La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
-'clearyourcache' => "'''Nota:''' Llueu de salvar, seique tengas que llimpiar la caché del navegador pa ver los cambios.
-*'''Firefox / Safari:''' Caltién ''Mayús'' mentanto calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nún Mac)
-* '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nún Mac)
-* '''Internet Explorer:''' Caltién ''Ctrl'' mentanto calques ''Refrescar'', o calca ''Ctrl-F5''
-* '''Konqueror:''' Calca nel botón ''Recargar'', o calca ''F5''
-* '''Opera:''' Desanicia la caché en ''Ferramientes→Preferencies''",
-'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to nuevu CSS enantes de guardalu.",
-'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to nuevu JavaScript enantes de guardalu.",
+Pa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [[{{MediaWiki:Helppage}}|páxina d'ayuda]] pa más información).
+Si llegasti equí por enquivocu, calca nel botón '''atrás''' del to restolador.",
+'anontalkpagetext' => "----''Esta ye la páxina de'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.
+Pola mor d'ello ha usase la direición numbérica IP pa identificalu/la.
+Tala IP pue ser compartida por varios usuarios.
+Si yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:UserLogin/signup|crea una cuenta]] o [[Special:UserLogin/signup|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.''",
+'noarticletext' => 'Nestos momentos nun hai testu nesta páxina.
+Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
+o [{{fullurl:{{FULLPAGENAME}}|action=edit}} editar esta páxina equí]</span>.',
+'noarticletext-nopermission' => 'Nestos momentos nun hai testu nesta páxina.
+Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines,
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos]</span>.',
+'userpage-userdoesnotexist' => "La cuenta d'usuariu «$1» nun ta rexistrada.
+Por favor comprueba si quies crear/editar esta páxina.",
+'userpage-userdoesnotexist-view' => "La cuenta d'usuariu «$1» nun ta rexistrada.",
+'blocked-notice-logextract' => 'Nestos momentos esti usuariu ta bloquiáu.
+La postrer entrada del rexistru de bloqueos úfrese darréu pa referencia:',
+'clearyourcache' => "'''Nota:''' Llueu de guardar, seique tengas que llimpiar la caché del restolador pa ver los cambeos.
+*'''Firefox / Safari:''' Caltén ''Mayús'' mentes calques en ''Recargar'', o calca ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' nun Mac)
+* '''Google Chrome:''' Calca ''Ctrl-Mayús-R'' (''⌘-Mayús-R'' nun Mac)
+* '''Internet Explorer:''' Caltén ''Ctrl'' mentes calques ''Refrescar'', o calca ''Ctrl-F5''
+* '''Konqueror:''' Calca en ''Recargar'', o calca ''F5''
+* '''Opera:''' llimpia la caché en ''Ferramientes → Preferencies''",
+'usercssyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to CSS nuevu enantes de guardalu.",
+'userjsyoucanpreview' => "'''Conseyu:''' Usa'l botón \"{{int:showpreview}}\" pa probar el to JavaScript nuevu enantes de guardalu.",
 'usercsspreview' => "'''Recuerda que namái tas previsualizando'l to CSS d'usuariu.'''
 '''¡Tovía nun ta guardáu!'''",
-'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu, entá nun se grabó!'''",
+'userjspreview' => "'''¡Recuerda que namái tas probando/previsualizando'l to JavaScript d'usuariu.'''
+'''¡Tovía nun ta guardáu!'''",
 'sitecsspreview' => "'''Recuerda que namái tas previsualizando esti CSS.'''
 '''¡Tovía nun ta guardáu!'''",
-'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript'''
+'sitejspreview' => "'''¡Recuerda que namái tas probando esti códigu JavaScript.'''
 '''¡Tovía nun tá guardáu!'''",
-'userinvalidcssjstitle' => "'''Avisu:''' Nun hai piel \"\$1\". Recuerda que les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
+'userinvalidcssjstitle' => "'''Avisu:''' Nun hai apariencia «$1».
+Les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{ns:user}}:Foo/vector.css en cuenta de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizao)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
-¡Los cambios entá nun se guardaron! [[#editform|→ Siguir editando]]",
+¡Los cambios entá nun se guardaron!",
+'continue-editing' => 'Siguir editando',
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
 'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
 Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
@@ -844,6 +864,12 @@ 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",
+'parser-unstrip-loop-warning' => 'Deteutóse un bucle "unstrip"',
+'parser-unstrip-recursion-limit' => 'Superóse\'l llímite de recursión d\'"unstrip" ($1)',
 
 # "Undo" feature
 'undo-success' => "La edición se pue esfacer.
@@ -988,8 +1014,8 @@ Comprueba los rexistros, por favor.",
 
 # Suppression log
 'suppressionlog' => 'Rexistru de supresiones',
-'suppressionlogtext' => "Embaxo hai una llista de desanicios y bloqueos rellacionaos con conteníu anubríu a los alministradores.
-Mira la [[Special:BlockList|llista de bloqueos d'IP]] pa ver la llista de los bloqueos y torgues activos anguaño.",
+'suppressionlogtext' => 'Más abaxo hai una llista de desanicios y bloqueos rellacionaos con conteníu anubríu a los alministradores.
+Mira la [[Special:BlockList|llista de bloqueos]] pa ver la llista de los bloqueos y torgues activos anguaño.',
 
 # History merging
 'mergehistory' => 'Fusionar historiales de páxina',
@@ -1021,8 +1047,9 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 'mergelogpagetext' => "Abaxo amuésase una llista de les fusiones más recientes d'un historial de páxina con otru.",
 
 # Diffs
-'history-title' => 'Historial de revisiones de "$1"',
-'difference' => '(Diferencia ente revisiones)',
+'history-title' => 'Historial de revisiones de «$1»',
+'difference-title' => 'Diferencies ente revisiones de «$1»',
+'difference-title-multipage' => 'Diferencies ente les páxines «$1» y «$2»',
 'difference-multipage' => '(Diferencia ente páxines)',
 'lineno' => 'Llinia $1:',
 'compareselectedversions' => 'Comparar les revisiones seleicionaes',
@@ -1110,13 +1137,14 @@ Asegúrate de qu'esti cambéu caltenga la continuidá del históricu de la páxi
 'prefs-edits' => "Númberu d'ediciones:",
 'prefsnologin' => 'Non identificáu',
 'prefsnologintext' => 'Necesites tar <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} identificáu]</span> pa camudar les preferencies d\'usuariu.',
-'changepassword' => 'Camudar la conseña',
+'changepassword' => 'Camudar la clave',
 'prefs-skin' => 'Apariencia',
 'skin-preview' => 'Vista previa',
 'datedefault' => 'Ensin preferencia',
 'prefs-beta' => 'Carauterístiques beta',
 'prefs-datetime' => 'Fecha y hora',
 'prefs-labs' => 'Carauterístiques esperimentales',
+'prefs-user-pages' => "Páxines d'usuariu",
 'prefs-personal' => 'Perfil del usuariu',
 'prefs-rc' => 'Cambios recientes',
 'prefs-watchlist' => 'Llista de vixilancia',
@@ -1379,7 +1407,7 @@ Esta información sedrá pública.",
 'nchanges' => '{{PLURAL:$1|un cambiu|$1 cambios}}',
 'recentchanges' => 'Cambios recientes',
 'recentchanges-legend' => 'Opciones de cambios recientes',
-'recentchangestext' => 'Sigui los últimos cambios de la wiki nesta páxina.',
+'recentchanges-summary' => 'Sigui los cambios más recientes na wiki nesta páxina.',
 'recentchanges-feed-description' => 'Sigui nesta canal los últimos cambios de la wiki.',
 'recentchanges-label-newpage' => 'Esta edición creó una páxina nueva',
 'recentchanges-label-minor' => 'Esta ye una edición menor',
@@ -1594,14 +1622,15 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
 'backend-fail-writetemp' => 'Nun se pudo escribir nel ficheru temporal.',
 'backend-fail-closetemp' => 'Nun se pudo zarrar el ficheru temporal.',
 'backend-fail-read' => 'Nun se pudo lleer el ficheru $1.',
-'backend-fail-create' => 'Nun se pudo crear el ficheru $1.',
-'backend-fail-maxsize' => 'Nun se pudo crear el ficheru  $1  porque ye mayor de {{PLURAL:$2|$2 byte|$2 bytes}}.',
+'backend-fail-create' => 'Nun se pudo escribir el ficheru $1.',
+'backend-fail-maxsize' => 'Nun se pudo escribir el ficheru  $1  porque ye mayor de {{PLURAL:$2|un byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Nesti momentu el motor d\'almacenamientu "$1" ta en mou de sólo llectura. El motivu dau foi: "$2"',
 'backend-fail-synced' => 'El ficheru "$1" ta nún estáu inconsistente colos motores d\'almacenamientu internos',
 'backend-fail-connect' => 'Nun se pudo coneutar col motor d\'almacenamientu "$1".',
 'backend-fail-internal' => 'Hebo un fallu desconocíu nel motor d\'almacenamientu "$1".',
 'backend-fail-contenttype' => 'Non se pudo determinar la triba de conteníu de ficheru a guardar en "$1".',
 'backend-fail-batchsize' => "El motor d'almacenamientu dio un llote de $1 {{PLURAL:$1|operación|operaciones}} en ficheros; el llímite ye de $2 {{PLURAL:$2|operación|operaciones}}.",
+'backend-fail-usable' => 'Nun se pudo escribir el ficheru $1 porque nun hai permisos bastantes o falten los direutorios/contenedores.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nun se pudo coneutar cola base de datos del diariu pal sofitu d\'almacenamientu "$1".',
@@ -1722,7 +1751,7 @@ Hai disponible una [[Special:WhatLinksHere/$2|llista completa]].",
 'sharedupload-desc-there' => 'Esti ficheru ye de $1 y puen usalu otros proyeutos.
 Llee la [páxina de descripción del ficheru $2] pa más información.',
 'sharedupload-desc-here' => "Esti ficheru ye de $1 y puen usalu otros proyeutos.
-La descripción de la [páxina de descripción del ficheru $2] s'amuesa darréu.",
+La descripción de la [$2 páxina de descripción del ficheru] s'amuesa darréu.",
 'sharedupload-desc-edit' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
 Seique quieras camudar la descripción de la so [páxina de descripción de ficheru $2] allí.",
 'sharedupload-desc-create' => "Esti ficheru ye de $1 y se pue usar n'otros proyeutos.
@@ -1919,6 +1948,7 @@ Date cuenta de qu'otros sitios web puen enllazar a un ficheru con una URL direut
 Pues filtrar la visualización seleicionando una mena de rexistru, el nome d'usuariu (teniendo en cuenta les mayúscules y minúscules) o la páxina afectada (teniendo en cuenta tamién les mayúscules y minúscules).",
 'logempty' => 'Nun hai coincidencies nel rexistru.',
 'log-title-wildcard' => "Buscar títulos qu'emprimen con esti testu",
+'showhideselectedlogentries' => 'Amosar/anubrir les entraes del rexistru seleicionaes',
 
 # Special:AllPages
 'allpages' => 'Toles páxines',
@@ -1938,6 +1968,11 @@ Pues filtrar la visualización seleicionando una mena de rexistru, el nome d'usu
 'allpages-bad-ns' => '{{SITENAME}} nun tien l\'espaciu de nomes "$1".',
 'allpages-hide-redirects' => 'Anubrir redireiciones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Tas viendo una versión en caché d'esta páxina, que pue llegar a tener $1 d'antigüedá.",
+'cachedspecial-viewing-cached-ts' => "Tas viendo una versión en caché d'esta páxina, que pue nun tar anovada dafechu.",
+'cachedspecial-refresh-now' => 'Ver la más nueva.',
+
 # Special:Categories
 'categories' => 'Categoríes',
 'categoriespagetext' => "{{PLURAL:$1|La categoría darréu contién|Les categoríes darréu contienen}} páxines o ficheros multimedia.
@@ -2380,8 +2415,8 @@ Esto debería facese sólo pa prevenir vandalismu como indiquen les [[{{MediaWik
 'ipb-confirm' => 'Confirmar bloquéu',
 'badipaddress' => 'IP non válida',
 'blockipsuccesssub' => 'Bloquéu fechu correctamente',
-'blockipsuccesstext' => "Bloquióse al usuariu [[Special:Contributions/$1|$1]].
-<br />Mira na [[Special:BlockList|llista d'IPs bloquiaes]] pa revisar los bloqueos.",
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ta {{GENDER:$1|bloquiáu|bloquiada}}.<br />
+Mira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.',
 'ipb-blockingself' => '¡Tas a piques de bloquiate tú mesmu! ¿Tas seguru de que quies facer eso?',
 'ipb-confirmhideuser' => 'Tas a piques de bloquiar un usuariu con "anubrir usuariu" activao. Esto desaniciará el nome del usuariu de tolos llistaos y entraes de los rexistros. ¿De xuro quies facer eso?',
 'ipb-edit-dropdown' => 'Editar motivos de bloquéu',
@@ -2435,7 +2470,7 @@ El rexistru de desanicios s'ufre darréu pa referencia:",
 'reblock-logentry' => 'camudó los parámetros de bloquéu de [[$1]] con una caducidá de $2 $3',
 'blocklogtext' => "Esti ye un rexistru de los bloqueos y desbloqueos d'usuarios.
 Les direcciones IP bloquiaes automáticamente nun salen equí.
-Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista d'IP bloquiaes]].",
+Pa ver los bloqueos qu'hai agora mesmo, mira na [[Special:BlockList|llista de bloqueos]].",
 'unblocklogentry' => 'desbloquió $1',
 'block-log-flags-anononly' => 'namái usuarios anónimos',
 'block-log-flags-nocreate' => 'creación de cuentes desactivada',
@@ -2826,6 +2861,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'spambot_username' => 'Llimpieza de spam de MediaWiki',
 'spam_reverting' => 'Revirtiendo a la cabera versión que nun contién enllaces a $1',
 'spam_blanking' => 'Toles revisiones teníen enllaces a $1; dexando en blanco',
+'spam_deleting' => 'Toles revisiones teníen enllaces a $1, desaniciando',
 
 # Info page
 'pageinfo-title' => 'Información sobro "$1"',
@@ -3368,7 +3404,7 @@ Por favor comprueba que nun punxeras carauteres non válidos na to direición de
 
 El sirvidor de corréu devolvió: $1',
 'confirmemail_invalid' => 'Códigu de confirmación non válidu. El códigu seique tenga caducao.',
-'confirmemail_needlogin' => 'Tienes que $1 pa confirmar el to corréu.',
+'confirmemail_needlogin' => 'Has $1 pa confirmar la to direición de corréu electrónicu.',
 'confirmemail_success' => 'El to corréu quedó confimáu.
 Agora yá pues [[Special:UserLogin|coneutate]] y esfrutar de la wiki.',
 'confirmemail_loggedin' => 'Quedó confirmada la to direición de corréu.',
@@ -3541,6 +3577,9 @@ Tendríes d'haber recibío [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Lli
 'version-software' => 'Software instaláu',
 'version-software-product' => 'Productu',
 'version-software-version' => 'Versión',
+'version-entrypoints' => "URLs del puntu d'entrada",
+'version-entrypoints-header-entrypoint' => "Puntu d'entrada",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => "Ruta d'archivu",
@@ -3729,4 +3768,17 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'api-error-uploaddisabled' => 'Les xubíes tan desactivaes nesta wiki.',
 'api-error-verification-error' => 'Esti ficheru pudiera tar corrompíu, o tien una estensión incorreuta.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL: $1|segundu|segundos}}',
+'duration-minutes' => '$1 {{PLURAL: $1|minutu|minutos}}',
+'duration-hours' => '$1 {{PLURAL: $1|hora|hores}}',
+'duration-days' => '$1 {{PLURAL: $1|día|díes}}',
+'duration-weeks' => '$1 {{PLURAL: $1|selmana|selmanes}}',
+'duration-years' => '$1 {{PLURAL: $1|añu|años}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Nun se pudieron afitar los bloqueos nel sirvidor $1.',
 );
index 95235bb..0cc9e11 100644 (file)
@@ -629,7 +629,7 @@ oke <span class="plainlinks">[{{fullurl:{{#Special:Log}}|bu={{FULLPAGENAMEE}}}}
 'updated' => '(Nuskeyen)',
 'note' => "'''Straga :'''",
 'previewnote' => "'''Obral, bat krent anton tir abdinedik.'''
-Rinafa betara men tid giwayan ! [[#editform|→ Continue editing]]",
+Rinafa betara men tid giwayan !",
 'previewconflict' => 'Abdinedira nedir va krent ke batu bu inde in giwayanon titir.',
 'editing' => 'betara va $1',
 'editingsection' => 'betara va $1 (gabot)',
@@ -801,7 +801,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 
 # Diffs
 'history-title' => 'Va "$1" betarizvot',
-'difference' => '(Siatosamidaceem)',
 'difference-multipage' => '(Amiduca wal batu bu isu banu)',
 'lineno' => 'Conya $1:',
 'compareselectedversions' => 'Dodisukera va toloy reban siatos',
@@ -1067,7 +1066,7 @@ Rinafe e-mail mane me zo razdar viele ar webesik uzerar.',
 'nchanges' => '$1 {{PLURAL:$1|betaks|betaks}}',
 'recentchanges' => 'Noeltaf betakseem',
 'recentchanges-legend' => 'Ikatcuks ke noeltaf betaks',
-'recentchangestext' => 'Moo batu bu va ironokaf betakseem ke {{SITENAME}} suzdal.',
+'recentchanges-summary' => 'Moo batu bu va ironokaf betakseem ke {{SITENAME}} suzdal.',
 'recentchanges-feed-description' => 'Sledara va tel lonoeltaf betakseem va wiki koo bat rust.',
 'recentchanges-label-newpage' => 'Bata betara va warzafu bu reduyur',
 'recentchanges-label-minor' => 'Betamaks',
@@ -1785,12 +1784,14 @@ N'oubliez pas de la déverrouiller lorsque vous aurez terminé votre opération
 # Move page
 'move-page' => 'Arrundara va $1',
 'move-page-legend' => 'Va teliz tolyoltá',
-'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer un article, en déplaçant toutes ses versions antérieures vers le nouveau nom.
+'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer un article (et sa page de discussion, le cas échéant), en déplaçant toutes ses versions antérieures vers le nouveau nom.
 
-Le titre précédent deviendra une page de redirection vers le nouveau titre. Les liens vers l'ancien titre ne seront pas modifiés et la page discussion, si elle existe, ne sera pas déplacée.
+Vous pouvez mettre à jour les redirections qui pointent sur l’ancien titre automatiquement. Si vous ne le faites pas, assurez-vous qu’il n’y ait pas de redirections [[Special:DoubleRedirects|doubles]] ou [[Special:BrokenRedirects|rompues]]. Vous êtes responsable de vous assurer que les liens continuent de pointer aux bons endroits.
 
-'''ATTENTION!'''
-Il peut s'agir d'un changement radical et inattendu pour un article souvent consulté; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
+Notez que la page ne sera '''pas''' déplacée s’il y a déjà une page au nouveau titre, à moins que cette dernière ne soit vide ou une redirection, et qu’elle soit sans historique. Ceci vous permet de revenir en arrière en cas d’erreur, et vous empêche d’écraser les pages existantes.
+
+'''ATTENTION !'''
+Il peut s’agir d’un changement radical et inattendu pour un article souvent consulté ; assurez-vous que vous en comprenez bien les conséquences avant de procéder.",
 'movepagetalktext' => "La page de discussion associée, si présente, sera automatiquement renommée avec '''sauf si:'''
 *Vous renommez une page vers un autre espace,
 *Une page de discussion existe déjà avec le nouveau nom, ou
index 8d7ad25..1a04bbb 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Azerbaijani (Azərbaycanca)
+/** Azerbaijani (azərbaycanca)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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',
@@ -870,7 +871,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" səhifəsinin tarixçəsi',
-'difference' => '(Versiyalar arasındakı fərq)',
 'difference-multipage' => '(Səhifələr arasında fərq)',
 'lineno' => 'Sətir $1:',
 'compareselectedversions' => 'Seçilən versiyaları müqayisə et',
@@ -1211,7 +1211,7 @@ Həmçinin kimliyinizi gostərmədən belə, başqalarının sizinlə istifadə
 'nchanges' => '$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}',
 'recentchanges' => 'Son dəyişikliklər',
 'recentchanges-legend' => 'Son dəyişiklik seçimləri',
-'recentchangestext' => "'''Ən son dəyişiklikləri bu səhifədən izləyin:'''",
+'recentchanges-summary' => "'''Ən son dəyişiklikləri bu səhifədən izləyin:'''",
 'recentchanges-feed-description' => 'Vikidəki ən son dəyişiklikləri bu yayım kanalından izləyin.',
 'recentchanges-label-newpage' => 'Bu dəyişiklik yeni səhifə yaratdı',
 'recentchanges-label-minor' => 'Bu kiçik redaktədir',
@@ -1606,6 +1606,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 +2889,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 +2997,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 3ecdad4..bc72730 100644 (file)
  * @author Kaganer
  * @author Reedy
  * @author Roustammr
+ * @author Sagan
  * @author Timming
  * @author Рустам Нурыев
+ * @author ҒатаУлла
+ * @author Ҡамыр Батыр
  */
 
 $fallback = 'ru';
@@ -22,20 +25,36 @@ $fallback = 'ru';
 $namespaceNames = array(
        NS_MEDIA            => 'Медиа',
        NS_SPECIAL          => 'Ярҙамсы',
-       NS_TALK             => 'Фекер_алышыу',
+       NS_TALK             => 'Фекерләшеү',
        NS_USER             => 'Ҡатнашыусы',
-       NS_USER_TALK        => 'Ҡатнашыусы_м-н_фекер_алышыу',
-       NS_PROJECT_TALK     => '$1_б-са_фекер_алышыу',
+       NS_USER_TALK        => 'Ҡатнашыусы_менән_һөйләшеү',
+       NS_PROJECT_TALK     => '$1_буйынса_фекерләшеү',
        NS_FILE             => 'Рәсем',
-       NS_FILE_TALK        => 'Рәсем_б-са_фекер_алышыу',
+       NS_FILE_TALK        => 'Рәсем_буйынса_фекерләшеү',
        NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'MediaWiki_б-са_фекер_алышыу',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_буйынса_фекерләшеү',
        NS_TEMPLATE         => 'Ҡалып',
-       NS_TEMPLATE_TALK    => 'Ҡалып_б-са_фекер_алышыу',
+       NS_TEMPLATE_TALK    => 'Ҡалып_буйынса_фекерләшеү',
        NS_HELP             => 'Белешмә',
-       NS_HELP_TALK        => 'Белешмә_б-са_фекер_алышыу',
-       NS_CATEGORY         => 'Категория',
-       NS_CATEGORY_TALK    => 'Категория_б-са_фекер_алышыу',
+       NS_HELP_TALK        => 'Белешмә_буйынса_фекерләшеү',
+       NS_CATEGORY         => 'Төркөм',
+       NS_CATEGORY_TALK    => 'Төркөм_буйынса_фекерләшеү',
+);
+
+$namespaceAliases = array(
+       'Фекер_алышыу' => NS_TALK,
+       'Ҡатнашыусы_м-н_фекер_алышыу' => NS_USER_TALK,
+       '$1_б-са_фекер_алышыу' => NS_PROJECT_TALK,
+       'Рәсем_б-са_фекер_алышыу' => NS_FILE_TALK,
+       'MediaWiki_б-са_фекер_алышыу' => NS_MEDIAWIKI_TALK,
+       'Ҡалып_б-са_фекер_алышыу' => NS_TEMPLATE_TALK,
+       'Белешмә_б-са_фекер_алышыу' => NS_HELP_TALK,
+       'Категория' => NS_CATEGORY,
+       'Категория_б-са_фекер_алышыу' => NS_CATEGORY_TALK,
+);
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'ӘүҙемҠатнашыусылар', 'АктивҠатнашыусылар' ),
 );
 
 // Remove Russian aliases
@@ -106,30 +125,30 @@ $messages = array(
 'monday' => 'Дүшәмбе',
 'tuesday' => 'Шишәмбе',
 'wednesday' => 'Шаршамбы',
-'thursday' => 'Ð\9aеÑ\81еаÒ\99на',
+'thursday' => 'Кесаҙна',
 'friday' => 'Йома',
 'saturday' => 'Шәмбе',
-'sun' => 'Йәкшәмбе',
-'mon' => 'Дүшәмбе',
-'tue' => 'Шишәмбе',
-'wed' => 'Шаршамбы',
-'thu' => 'Кесеаҙна',
-'fri' => 'Ð\99ома',
-'sat' => 'Шәмбе',
-'january' => 'ғинуар',
-'february' => 'февраль',
-'march' => 'март',
-'april' => 'апрель',
-'may_long' => 'май',
-'june' => 'июнь',
-'july' => 'июль',
-'august' => 'август',
-'september' => 'сентябрь',
-'october' => 'октябрь',
-'november' => 'ноябрь',
-'december' => 'декабрь',
-'january-gen' => 'ғинуар',
-'february-gen' => 'февраль',
+'sun' => 'Йш',
+'mon' => 'Дш',
+'tue' => 'Шш',
+'wed' => 'Шр',
+'thu' => 'Кс',
+'fri' => 'Ð\99м',
+'sat' => 'Шб',
+'january' => 'ғинуар (һыуығай)',
+'february' => 'февраль (шаҡай)',
+'march' => 'март (буранай)',
+'april' => 'апрель (алағарай)',
+'may_long' => 'май (һабанай)',
+'june' => 'июнь (һөтай)',
+'july' => 'июль (майай)',
+'august' => 'август (урағай)',
+'september' => 'сентябрь (һарысай)',
+'october' => 'октябрь (ҡарасай)',
+'november' => 'ноябрь (ҡырпағай)',
+'december' => 'декабрь (аҡъюлай)',
+'january-gen' => 'ғинуар (һыуығай)',
+'february-gen' => 'февраль (шаҡай)',
 'march-gen' => 'март',
 'april-gen' => 'апрель',
 'may-gen' => 'май',
@@ -138,8 +157,8 @@ $messages = array(
 'august-gen' => 'август',
 'september-gen' => 'сентябрь',
 'october-gen' => 'октябрь',
-'november-gen' => 'ноябрь',
-'december-gen' => 'декабрь',
+'november-gen' => 'ноябрь (ҡырпағай)',
+'december-gen' => 'декабрь (аҡъюлай)',
 'jan' => 'ғин',
 'feb' => 'фев',
 'mar' => 'мар',
@@ -255,7 +274,7 @@ $messages = array(
 'mediawikipage' => 'Хәбәрҙәр битен ҡарарға',
 'templatepage' => 'Ҡалып битен ҡарарға',
 'viewhelppage' => 'Ярҙам битен ҡарарға',
-'categorypage' => 'Ð\9aаÑ\82егоÑ\80иÑ\8f битен ҡарарға',
+'categorypage' => 'ТөÑ\80көм битен ҡарарға',
 'viewtalkpage' => 'Фекер алышыу битен ҡарарға',
 'otherlanguages' => 'Башҡа телдәрҙә',
 'redirectedfrom' => '($1 битенән йүнәлтелде)',
@@ -303,6 +322,7 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
 'retrievedfrom' => 'Сығанағы — «$1»',
 'youhavenewmessages' => 'Яңы $1 бар ($2).',
 'newmessageslink' => 'яңы хәбәр',
@@ -403,8 +423,8 @@ $1',
 'cannotdelete-title' => '"$1" битен юйып булмай',
 'badtitle' => 'Ярамаған исем',
 'badtitletext' => 'Биттең һоратылған исеме дөрөҫ түгел, буш йәки телдәр араһы йәки интервики исеме яңылыш күрһәтелгән. Исемдә тыйылған символдар булыуы ла мөмкин.',
-'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Был мәғлүмәттәр кэштан алынды, ул һуңғы тапҡыр $1 яңыртылды. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Был мәғлүмәттәр кэштан алынған, уларҙа һуңғы үҙгәртеүҙәр булмаҫҡа мөмкин. Кэшта иң күбе {{PLURAL:$1|язма}} һаҡлана.',
+'perfcachedts' => 'Был мәғлүмәттәр кэштан алынған, ул һуңғы тапҡыр $1 яңыртылды.  Кэшта иң күбе  {{PLURAL:$4|язма}} һаҡлана',
 'querypage-no-updates' => 'Был битте яңыртыу хәҙер тыйылған.
 Бында күрһәтелгән мәғлүмәттәр яңыртылмаясаҡ.',
 'wrong_wfQuery_params' => 'wfQuery() функцияһы өсөн рөхсәт ителмәгән параметрҙар<br />
@@ -430,6 +450,9 @@ $2',
 'ns-specialprotected' => '«{{ns:special}}» исем арауығындағы биттәрҙе үҙгәртеп булмай.',
 'titleprotected' => "Был исем менән бит яһау [[User:$1|$1]] тарафынан тыйылған.
 Белдерелгән сәбәп: ''$2''.",
+'filereadonlyerror' => "«$1» файлын үҙгәртеп булмай, сөнки «$2» һаҡлағысы «уҡыу өсөн генә» тәртибендә.
+
+Был сикләүҙе индергән хаким биргән аңлатма:«''$3''».",
 
 # Virus scanner
 'virus-badscanner' => "Көйләү хатаһы: Билдәһеҙ вирустар сканеры: ''$1''",
@@ -513,6 +536,7 @@ $2',
 'invalidemailaddress' => 'Электрон почта адресы ҡабул ителә алмай, сөнки ул форматка тап килмәй.
 Зинһар, дөрөҫ адрес керетегеҙ йәки юлды буш ҡалдырығыҙ.',
 'cannotchangeemail' => 'Иҫәп яҙыуы электрон почта адрестарын был викила үҙгәртеп булмай.',
+'emaildisabled' => 'Был сайт электрон почта хәберҙәрен ебәрә алмай',
 'accountcreated' => 'Иҫәп яҙыуы яһалды',
 'accountcreatedtext' => '$1 исемле ҡулланыусы өсөн исәп яҙыуы яһалды.',
 'createaccount-title' => '{{SITENAME}}: теркәлеү',
@@ -704,7 +728,9 @@ $2
 'userinvalidcssjstitle' => "'''Иғтибар:''' \"\$1\" биҙәү темаһы табылманы. Иҫтә тотоғоҙ, .css һәм .js ҡулланыусы биттәренең исемдәре тик бәләкәй хәрефтәрҙән генә торорға тейеш. Мәҫәлән: {{ns:user}}:Foo/vector.css, ә {{ns:user}}:Foo/Vector.css түгел!",
 'updated' => '(Яңыртылды)',
 'note' => "'''Иҫкәрмә:'''",
-'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''",
+'previewnote' => "'''Ҡарап сығыу өлгөһө, әлегә үҙгәрештәр яҙҙырылмаған!'''
+Һеҙҙең үҙгәртеүҙәр әле яҙылмаған!",
+'continue-editing' => 'Мөхәррирләүҙе дауам итергә',
 'previewconflict' => 'Әлеге алдан ҡарау, мөхәррирләү тәҙрәһенең өҫтөндә, һаҡланғандан һуң текстың нисек күренәсәген күрһәтә.',
 'session_fail_preview' => "'''Ҡыҙғанысҡа ҡаршы, һеҙҙең ултырыш идентификаторығыҙ юғалды. Һөҙөмтәлә үҙгәртеүҙәрегеҙ ҡабул ителмәйәсәк.
 Зинһар, тағы бер тапҡыр ҡабатлағыҙ.
@@ -719,6 +745,7 @@ $2
 Бындай хәлдәр хаталы аноним web-проксилар ҡулланғанда килеп сығырға мөмкин.",
 'edit_form_incomplete' => "'''Мөхәррирләү формаһының ҡайһы өлөштәре серверға барып етмәне. Төҙәтеүҙәрегеҙҙе яҡшы итеп тикшерегеҙ һәм яңынан ҡабатлағыҙ.'''",
 'editing' => 'Мөхәрирләү  $1',
+'creating' => 'Төҙөү $1',
 'editingsection' => 'Мөхәрирләү  $1 (секция)',
 'editingcomment' => '$1 мөхәррирләнә (яңы бүлек)',
 'editconflict' => 'Мөхәррирләү конфликты: $1',
@@ -782,6 +809,7 @@ $2
 'edit-no-change' => 'Текста үҙгәртеүҙер булмау сәбәпле үҙгәртеүегеҙгә иғтибар ителмәне.',
 'edit-already-exists' => 'Яңы бит яһап булмай.
 Ул былай ҙа бар.',
+'defaultmessagetext' => 'Алдан билдәләнгән яҙма',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Иғтибар:''' был биттә хәтерҙе күп ҡулланыусы функциялар ныҡ күп.
@@ -940,7 +968,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'Йәшереү яҙмалары',
 'suppressionlogtext' => 'Түбәндә, администраторҙарҙан йәшерелгән материалдар булған һуңғы юйыуҙыр һәм блоклауҙар исемлеге килтерелгән.
-Ағымдағы блоклауҙарҙы күрер өсөн [[Special:BlockList|IP-блоклауҙар исемлеген]] ҡарағыҙ.',
+Ағымдағы блоклауҙарҙы күрер өсөн [[Special:BlockList|блоклауҙар исемлеген]] ҡарағыҙ.',
 
 # History merging
 'mergehistory' => 'Үҙгәртеүҙәр тарихын берләштерергә',
@@ -973,7 +1001,6 @@ $1",
 
 # Diffs
 'history-title' => '$1 битенең үҙгәртеү тарихы',
-'difference' => '(Өлгөләр араһында айырма)',
 'difference-multipage' => '(Биттәр араһындағы айырма)',
 'lineno' => '$1 юл:',
 'compareselectedversions' => 'Һайланған версияларҙы сағыштырыу',
@@ -1070,6 +1097,7 @@ $1",
 'prefs-beta' => 'Бета версияһы мөмкинлектәре',
 'prefs-datetime' => 'Көн һәм ваҡыт',
 'prefs-labs' => 'Һынау өсөн мөмкинлектәр',
+'prefs-user-pages' => 'Ҡатнашыусы бите',
 'prefs-personal' => 'Шәхси мәғлүмәттәр',
 'prefs-rc' => 'Һуңғы үҙгәртеүҙәр',
 'prefs-watchlist' => 'Күҙәтеү исемлеге',
@@ -1334,7 +1362,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|үҙгәртеү|үҙгәртеү}}',
 'recentchanges' => 'Һуңғы үҙгәртеүҙәр',
 'recentchanges-legend' => 'Һуңғы үҙгәртеүҙәр көйләүҙәре',
-'recentchangestext' => '{{grammar:genitive|{{SITENAME}}}}. биттәрендә индерелгән һуңғы үҙгәртеүҙәр исемлеге',
+'recentchanges-summary' => '{{grammar:genitive|{{SITENAME}}}}. биттәрендә индерелгән һуңғы үҙгәртеүҙәр исемлеге',
 'recentchanges-feed-description' => 'Был таҫмалағы һуңғы үҙгәртеүҙәрҙе күҙәтеп барырға',
 'recentchanges-label-newpage' => 'Был үҙгәртеү яңы бит яһаны',
 'recentchanges-label-minor' => 'Был әҙ үҙгәреш',
@@ -1531,13 +1559,17 @@ $1',
 'backend-fail-writetemp' => 'Ваҡытлы файлға яҙып булмай.',
 'backend-fail-closetemp' => 'Ваҡытлы файлды ябып булмай.',
 'backend-fail-read' => '«$1» файлын уҡып булмай.',
-'backend-fail-create' => '«$1» Ñ\84айлÑ\8bн Ñ\8fһап булмай.',
+'backend-fail-create' => '«$1» Ñ\84айлÑ\8bн Ñ\8fÒ\99Ñ\8bп булмай.',
 'backend-fail-readonly' => '$1 һаҡлағысы әлегә уҡыу өсөн генә асыҡ. Сәбәбе: $2',
 'backend-fail-synced' => '$1 файлы эске һаҡлағыста ярашһыҙ хәлдә тора.',
 'backend-fail-connect' => '"$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" асҡысының бикләү файлын ябып булманы.',
@@ -1868,6 +1900,10 @@ $1',
 'allpagesbadtitle' => 'Күрһәтелгән бит исеме дөрөҫ түгел йәки телдәр араһы йәки интервики ҡушымтаһы менән башлана.
 Исемдә тыйылған символдар булыуы ла мөмкин.',
 'allpages-bad-ns' => '{{SITENAME}} проектында "$1" исемдәр арауығы юҡ.',
+'allpages-hide-redirects' => 'Йүнәлтеүҙәрҙе йәшерергә',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Һуңғы версияны ҡарарға',
 
 # Special:Categories
 'categories' => 'Категориялар',
@@ -2311,7 +2347,7 @@ $1',
 'badipaddress' => 'IP адрес дөрөҫ түгел',
 'blockipsuccesssub' => 'Бикләү уңышлы башҡарылды',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] бикләнде.<br />
-[[Special:BlockList|Бикләнгән IP адрестарҙы]] ҡарарға.',
+Биктәрҙе күреү өсөн [[Special:BlockList|бикләнгән IP адрестарҙы]] ҡарағыҙ.',
 'ipb-blockingself' => 'Һеҙ үҙегеҙҙе бикләргә теләйһегеҙ! Быны эшләүҙе раҫлайһығыҙмы?',
 'ipb-confirmhideuser' => '"Ҡулланыусыны йәшер" ғәмәлдә саҡта ҡулланыусыны блокларға теләйһегеҙ. Уның исеме исемлектәрҙә һәм журналдарҙа күренмәйәсәк. Быны эшләргә теләүегеҙҙе раҫлайһығыҙмы?',
 'ipb-edit-dropdown' => 'Бикләү сәбәптәрен мөхәррирләргә',
@@ -2364,8 +2400,8 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 Түбәндә белешмә өсөн йәшереү яҙмалары журналы килтерелгән:',
 'blocklogentry' => '[[$1]] бикләгән, тамамланыу ваҡыты: $2 $3',
 'reblock-logentry' => '[[$1]] ҡатнашыусыһының бикләү көйләүҙәрен үҙгәрткән, тамамланыу ваҡыты — $2 $3',
-'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу яҙмалары журналы.
-Авто бикләнеүсе IP адрестар бында күрһәтелмәй.
+'blocklogtext' => 'Ҡатнашыусыларҙы бикләү һәм бикте алыу журналы.
+Автоматик бикләнгән IP адрестар бында күрһәтелмәй.
 [[Special:BlockList|Ғәмәлдәге тыйыуҙырҙы һәм бикләүҙәрҙе]] ҡарай алаһығыҙ.',
 'unblocklogentry' => '$1 ҡулланыусыһының блокланыу ваҡыты тамамланды',
 'block-log-flags-anononly' => 'танылмаған ҡатнашыусылар ғына',
@@ -2612,6 +2648,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
@@ -2625,12 +2663,14 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 # JavaScriptTest
 'javascripttest' => '
 JavaScript тикшереү',
-'javascripttest-disabled' => 'Был мөмкинлек һүндерелгән.',
+'javascripttest-disabled' => 'Был мөмкинлек был Википроектта ғәмәлгә индерелмәгән.',
 'javascripttest-title' => '$1 тикшеренеү үткәрелә',
 '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' => 'Ҡулланыусы битегеҙ',
@@ -2693,6 +2733,7 @@ JavaScript тикшереү',
 'tooltip-diff' => 'Сығанаҡ текстҡа ҡарата эшләгән үҙгәртеүҙәрҙе күрһәтергә.',
 'tooltip-compareselectedversions' => 'Был биттең һайланған ике өлгөһө араһындағы айырманы ҡарарға',
 'tooltip-watch' => 'Битте күҙәтеү исемлегемә өҫтәргә',
+'tooltip-watchlistedit-normal-submit' => 'Биттәрҙе юйырға',
 'tooltip-watchlistedit-raw-submit' => 'Күҙәтеү исемлеген яңыртырға',
 'tooltip-recreate' => 'Битте юйылған булыуына ҡарамаҫтан тергеҙергә',
 'tooltip-upload' => 'Күсерә башларға',
@@ -3433,6 +3474,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' => 'Файлға юл',
@@ -3585,23 +3629,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' => '$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 1675516..16c81f5 100644 (file)
@@ -649,7 +649,6 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 
 # Diffs
 'history-title' => 'Versiónsgschicht voh „$1“',
-'difference' => '(Unterschiad zwischen dé Versiónen)',
 'lineno' => 'Zeiln $1:',
 'compareselectedversions' => 'Gwöde Versionen vagleichen',
 'editundo' => 'ryckgängig',
@@ -772,7 +771,7 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'nchanges' => '$1 {{PLURAL:$1|Änderrung|Änderrungen}}',
 'recentchanges' => 'Létzde Änderrungen',
 'recentchanges-legend' => 'Åzoagopziónen',
-'recentchangestext' => "Auf derer Seiten kåst d' létzden Änderrungen auf '''{{SITENAME}}''' nochévavóing.",
+'recentchanges-summary' => "Auf derer Seiten kåst d' létzden Änderrungen auf '''{{SITENAME}}''' nochévavóing.",
 'recentchanges-feed-description' => 'Vafóig mid dém Feed dé létzden Änderrungen in {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Neiche Seiten',
 'recentchanges-label-minor' => 'Kloane Änderrungen',
index 677d6fc..a2cac90 100644 (file)
@@ -10,6 +10,7 @@
  * @author Huji
  * @author Kaganer
  * @author Mostafadaneshvar
+ * @author Reedy
  * @author ZxxZxxZ
  */
 
@@ -737,7 +738,7 @@ $2',
 اگر شما ایء ذخیره کتت، هر تغییری که دهگ بیتء چه ای بازبینی گار بنت.'''",
 'yourdiff' => 'تفاوتان',
 'copyrightwarning' => "لطفا توجه بیت که کل نوشته یات ته {{SITENAME}}  تحت $2 نشر بنت.(بچار په جزیات$1).
-اگه شما لوٹیت شمی نوشتانک اصلاح و دگه چهاپ مبنت، اچه آیانا ادان مهلیت.<b/>
+اگه شما لوٹیت شمی نوشتانک اصلاح و دگه چهاپ مبنت، اچه آیانا ادان مهلیت.
 شما ما را قول دهیت که وتی چیزا بنویسیت یا چه یک دامین عمومی کپی کتگیت.
 ''' نوشتانکی که کپی رایت دارند بی اجازه ادا هور مکنیت'''",
 'copyrightwarning2' => "لطفا توجه کنیت که کل مشارکاتن ته {{SITENAME}} شاید اصلاح, عوض و یا توسط دگه شرکت کننده آن حذف بنت.
@@ -936,7 +937,6 @@ $1",
 
 # Diffs
 'history-title' => 'تاریح بازبینی "$1"',
-'difference' => '(تفاوتان بین نسخه یان)',
 'lineno' => 'خط$1:',
 'compareselectedversions' => 'مقایسه انتخاب بوتگین نسخه یان',
 'showhideselectedversions' => 'نمایش/پنهان کتن نسخ انتخابی',
@@ -1263,7 +1263,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|تغییر|تغییرات}}',
 'recentchanges' => 'نوکین تغییرات',
 'recentchanges-legend' => 'گزینه ی نوکین تغییرات',
-'recentchangestext' => 'رندگر نوکترین تغییرات ته ویکی تی ای صفحه.',
+'recentchanges-summary' => 'رندگر نوکترین تغییرات ته ویکی تی ای صفحه.',
 'recentchanges-feed-description' => 'آهرین تغییرات ته وی کی چه ای فید رند گر',
 'rcnote' => "جهلء{{PLURAL:$1|هست '''1''' تغییری|هستن آهری '''$1''' تغییرات}} ته آهرین {{PLURAL:$2|روچ|'''$2''' روچان}}, چه$5, $4.",
 'rcnotefrom' => "جهلا تغییرات چه '''$2''' (تا  '''$1''' پیش دارگنت). هست",
index be2f3b0..e2b8e2c 100644 (file)
@@ -100,15 +100,15 @@ $messages = array(
 'tog-hideminor' => 'Tagóon an mga saradít na paghirá sa nakakaági pa sanáng pagbabàgo',
 'tog-hidepatrolled' => 'Tagóon an mga saradít na paghirá sa nakakaági pa sanáng pagbabàgo',
 'tog-newpageshidepatrolled' => 'Tagóon an mga pigbabantayán na pahina sa lista nin mga bàgong pahina',
-'tog-extendwatchlist' => 'Palakbangón an lista kan pigbabantayan tangarig mahiling an gabos na angay na pagbabàgo',
-'tog-usenewrc' => 'Paorogón an kaaging pagbabàgo (JavaScript)',
+'tog-extendwatchlist' => 'Palakbangón an taytáy kan babantayan tanganing mahilíng an gabós na angay na pagbàgo',
+'tog-usenewrc' => 'Gamiton an pinauróg na mga nakaaging pagbàgo (kaipohan nin JavaScript)',
 'tog-numberheadings' => 'Tolos na pagbílang sa mga pamayohán',
 'tog-showtoolbar' => 'Ipahilíng an toolbar nin paghirá (JavaScript)',
 'tog-editondblclick' => 'Hirahón sa dobleng paglagatík an mga pahina (JavaScript)',
 'tog-editsection' => 'Togótan an paghirá kan seksyon sa paági kan mga takód na [hirá]',
 'tog-editsectiononrightclick' => 'Togotan an paghirá kan seksyon sa pag-lagatik sa walá sa mga titulo nin seksyon (JavaScript)',
 'tog-showtoc' => 'Ipahilíng an indise kan mga laog (para sa mga pahinang igwang sobra sa 3 pamayohan)',
-'tog-rememberpassword' => 'Giromdomón an mga paglaóg ko sa kompyuter na iní (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-rememberpassword' => 'Giromdomón an mga paglaóg ko sa panlibotlibot na iní (sa nakaaging $1 {{PLURAL:$1|aldaw|mga aldaw}})',
 'tog-watchcreations' => 'Idúgang an mga pahinang ginigíbo ko sa pigbabantayan ko',
 'tog-watchdefault' => 'Idúgang an mga pahinang pighíhirá ko sa pigbabantayan ko',
 'tog-watchmoves' => 'Idúgang an mga pahinang piglilípat ko sa pigbabantayan ko',
@@ -116,7 +116,7 @@ $messages = array(
 'tog-minordefault' => 'Markahán an gabos na paghirá nin sadit na paghirá',
 'tog-previewontop' => 'Ipahilíng an patànaw bàgo an kahon nin paghirá',
 'tog-previewonfirst' => 'Ipahilíng an patànaw sa enot na paghirá',
-'tog-nocache' => 'Pogólon an pag-abang nin mga pahina',
+'tog-nocache' => 'Pugolon an pag-abáng nin mga pahina',
 'tog-enotifwatchlistpages' => 'E-koreohan ako pag pigribayan an pahinang pigbabantayan ko',
 'tog-enotifusertalkpages' => 'E-koreohan ako pag pigribáyan an pahina kan sakóng olay',
 'tog-enotifminoredits' => 'E-koreohan man giraray ako para sa saradit na paghirá kan mga pahina',
@@ -237,6 +237,7 @@ $messages = array(
 'vector-view-view' => 'Basáhon',
 'vector-view-viewsource' => 'Hilingón an ginikánan',
 'actions' => 'Mga paghiro',
+'namespaces' => 'Liang-liang',
 
 'errorpagetitle' => 'Salâ',
 'returnto' => 'Magbwelta sa $1.',
@@ -346,7 +347,7 @@ $messages = array(
 'page-rss-feed' => '"$1" Hungit na RSS',
 'page-atom-feed' => '"$1" Hungit na Atomo',
 'feed-atom' => 'Atomo',
-'red-link-title' => '$1 (dai pa naisusurat)',
+'red-link-title' => '$1 (daí pa naisusurat)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pahina',
@@ -736,7 +737,6 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 
 # Diffs
 'history-title' => 'Uusipón nin pagpakarháy kan "$1"',
-'difference' => '(Kaibhán kan mga pagpakarháy)',
 'lineno' => 'Taytáy $1:',
 'compareselectedversions' => 'Ikomparar an mga piniling bersyon',
 'editundo' => 'isulít',
@@ -757,6 +757,8 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 'nextn' => 'sunód na {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Hilingón ($1 {{int:pipe-separator}} $2) ($3)',
 'searchhelp-url' => 'Help:Mga laog',
+'searchprofile-everything' => 'Gabós',
+'searchprofile-articles-tooltip' => 'Hanapon sa $1',
 'search-result-size' => '$1 ({{PLURAL:$2|1 tatarámon|$2 mga tatarámon}})',
 'search-suggest' => 'Boót mo iyó: $1',
 'search-interwiki-more' => '(dakol pa)',
@@ -871,7 +873,7 @@ An ibang mga administrador sa ining wiki pwede pang maghiling kan mga nakatagong
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pagbabâgo|mga pagbabâgo}}',
 'recentchanges' => 'Mga nakakaági pa sanáng pagbabàgo',
-'recentchangestext' => 'Hanápon an mga pinahúring pagbabàgo sa wiki digdí sa pahinang iní.',
+'recentchanges-summary' => 'Hanapon an mga pinahuring pagbabâgo sa wiki digdi sa páhinang ini.',
 'recentchanges-feed-description' => 'Hanápon an mga pinakahuring pagbabàgo sa wiki sa hungit na ini.',
 'rcnote' => "Mahihiling sa babâ an {{PLURAL:$1| '''1''' pagbabàgo|'''$1''' pagbabàgo}} sa huring {{PLURAL:$2|na aldaw|'''$2''' na aldaw}}, sa $3.",
 'rcnotefrom' => "Mahihiling sa babâ an mga pagbabàgo poon kan '''$2''' (hasta '''$1''' ipinapahiling).",
@@ -1112,7 +1114,7 @@ An páhina pigkokonsiderar na páhina nin klaripikasyon kun naggagamit ini nin t
 'mostcategories' => 'Mga artikulong may pinaka dakol na kategorya',
 'mostimages' => 'Pinakapigtatakodan na files',
 'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
-'prefixindex' => 'Murô nin prefiho',
+'prefixindex' => 'Gabós na pahinang igwáng katakód',
 'shortpages' => 'Haralìpot na pahina',
 'longpages' => 'Mga halabang pahina',
 'deadendpages' => 'Mga pahinang mayong luwasan',
@@ -1432,7 +1434,7 @@ $1",
 
 # What links here
 'whatlinkshere' => 'An nakatakód digdí',
-'whatlinkshere-title' => 'Mga pahinang nakatakod sa $1',
+'whatlinkshere-title' => 'Mga pahinang nakatakód sa $1',
 'whatlinkshere-page' => 'Pahina:',
 'linkshere' => "An mga minasunod na pahina nakatakod sa '''[[:$1]]''':",
 'nolinkshere' => "Mayong pahinang nakatakod sa '''[[:$1]]'''.",
@@ -1496,6 +1498,7 @@ Magkaag nin espisipikong rason (halimbawa, magtao nin ehemplo kan mga páhinang
 'ipblocklist-no-results' => 'Dai nabagat an hinagad na direccion nin IP o ngaran nin paragamit.',
 'blocklink' => 'bagáton',
 'unblocklink' => 'paagihon',
+'change-blocklink' => 'sanglián an pagbagat',
 'contribslink' => 'mga ambág',
 'autoblocker' => 'Enseguidang binagat an saimong direccion nin IP ta kaaaging ginamit ini ni "[[User:$1|$1]]". An rason nin pagbagat ni $1: "$2"',
 'blocklogpage' => 'Usip nin pagbagat',
@@ -1643,13 +1646,13 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-pt-anontalk' => 'Mga olay manonongod sa mga hira halî sa ip na ini',
 'tooltip-pt-preferences' => 'Mga kabòtan ko',
 'tooltip-pt-watchlist' => 'Lista nin mga pahina na pigbabantayan an mga pagbabàgo',
-'tooltip-pt-mycontris' => 'Lista kan mga kabòtan ko',
+'tooltip-pt-mycontris' => 'Taytáy kan mga kabòtan ko',
 'tooltip-pt-login' => 'Pigaagda kang maglaog, alagad, bako man ining piriritan.',
 'tooltip-pt-anonlogin' => 'Pig-aagda kang maglaog, alagad, bakô man ining piriritan.',
 'tooltip-pt-logout' => 'Magluwas',
 'tooltip-ca-talk' => 'Olay sa pahina nin laog',
 'tooltip-ca-edit' => 'Pwede mong hirahón ining pahina. Gamiton tabi an patànaw na butones bago an pagtagama.',
-'tooltip-ca-addsection' => 'Magdugang nin komento sa orólay na ini.',
+'tooltip-ca-addsection' => 'Magdugang nin komento sa urulay na iní.',
 'tooltip-ca-viewsource' => 'Sinagangán ining pahina. Mahihilíng mo an ginikanan.',
 'tooltip-ca-history' => 'Mga nakaaging bersyon kaining pahina',
 'tooltip-ca-protect' => 'Protektahán ining pahina',
@@ -1758,7 +1761,7 @@ $1",
 'filedelete-archive-read-only' => 'An direktoryong archibo na "$1" dai nasusuratan kan webserver.',
 
 # Browsing diffs
-'previousdiff' => '← Nakaáging kaibhán',
+'previousdiff' => '← Nakaaging kaibhán',
 'nextdiff' => 'Kaibhán pa→',
 
 # Media information
@@ -1782,11 +1785,11 @@ $1",
 'sp-newimages-showfrom' => 'Hilingón an mga retratong nagpopoon sa $1',
 
 # Bad image list
-'bad_image_list' => 'An pormato iyo an minasunod:
+'bad_image_list' => 'An husay iyó an minasunód:
 
-An mga nakalista sana (mga linyang nagpopoon sa *) an pigkokonsiderar.
-An enot na takod sa linya seguradong sarong takod sa sarong salang file.
-Ano man na takod sa parehong linyang ini pigkokonsiderar na eksepsyon, i.e. mga pahina na may file sa laog nin linya.',
+An mga nakataytáy saná (mga taytáy na nagpopoón sa *) iyó an kaayon.
+An inot na takód sa taytáy kaipohan na saróng takód sa saróng saláng file.
+Anó man na minasunód na takód sa ginikanan na taytáy iyó an kaayon sa mga paglain, i.e. mga pahina na may file na maluwás sa laog kan taytáy.',
 
 # Metadata
 'metadata' => 'Metadatos',
index 0e529ae..abc9f75 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Belarusian (Ð\91еларуская)
+/** Belarusian (беларуская)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -14,6 +14,7 @@
  * @author Maksim L.
  * @author Mienski
  * @author Prima klasy4na
+ * @author Renessaince
  * @author Riwnodennyk
  * @author Urhixidur
  * @author Wizardist
@@ -49,7 +50,7 @@ $namespaceNames = array(
        NS_TALK             => 'Размовы',
        NS_USER             => 'Удзельнік',
        NS_USER_TALK        => 'Размовы_з_удзельнікам',
-       NS_PROJECT_TALK     => '$1_размовы',
+       NS_PROJECT_TALK     => 'Размовы_пра_{{GRAMMAR:вінавальны|$1}}',
        NS_FILE             => 'Выява',
        NS_FILE_TALK        => 'Размовы_пра_выяву',
        NS_MEDIAWIKI        => 'MediaWiki',
@@ -62,6 +63,10 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Размовы_пра_катэгорыю',
 );
 
+$namespaceAliases = array(
+       '$1_размовы' => NS_PROJECT_TALK,
+);
+
 $magicWords = array(
        'img_thumbnail'           => array( '1', 'міні', 'мініяцюра', 'thumbnail', 'thumb' ),
        'img_manualthumb'         => array( '1', 'міні=$1', 'мініяцюра=$1', 'thumbnail=$1', 'thumb=$1' ),
@@ -361,7 +366,7 @@ $1',
 'collapsible-expand' => 'Паказаць',
 'thisisdeleted' => 'Паказаць ці аднавіць $1?',
 'viewdeleted' => 'Ці паказаць $1?',
-'restorelink' => '{{PLURAL:$1|адна сцёртая праўка|$1 сцёртых правак}}',
+'restorelink' => '$1 {{PLURAL:$1|сцёртая праўка|сцёртых правак}}',
 'feedlinks' => 'Струмень:',
 'feed-invalid' => 'Недапушчальны тып струмяня навін.',
 'feed-unavailable' => 'Няма струмянёў навін',
@@ -710,10 +715,10 @@ $2
 'newarticle' => '(Новы)',
 'newarticletext' => 'Вы перайшлі да старонкі, якой яшчэ няма, і таму трапілі сюды. Каб пачаць новую старонку, пішыце яе тэкст у ніжэйпаказаным акне рэдагавання (падрабязнасці бач у [[{{MediaWiki:Helppage}}|даведцы]]). Калі вы тут выпадкова, проста націсніце "назад" у браўзеры.',
 'anontalkpagetext' => "----''Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунку, або ім не карыстаўся. Таму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы Адрас IP. Такі адрас IP могуць дзяліць між сабою некалькі асоб. Калі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:UserLogin/signup|стварыце рахунак]] або [[Special:UserLogin|акажыцеся]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
-'noarticletext' => 'СÑ\82аÑ\80онка Ð½Ðµ Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96вае Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83. Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е [[Special:Search/{{PAGENAME}}|паÑ\88Ñ\83каÑ\86Ñ\8c Ð³Ñ\8dÑ\82акай Ð½Ð°Ð·Ð²Ñ\8b]] ў іншых старонках ці <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах],
+'noarticletext' => 'СÑ\82аÑ\80онка Ð½Ðµ Ñ\9eÑ\82Ñ\80Ñ\8bмлÑ\96вае Ñ\82Ñ\8dкÑ\81Ñ\82Ñ\83. Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е [[Special:Search/{{PAGENAME}}|паÑ\88Ñ\83каÑ\86Ñ\8c Ð³Ñ\8dÑ\82кÑ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83]] ў іншых старонках ці <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах],
 або [{{fullurl:{{FULLPAGENAME}}|action=edit}} папрацаваць з гэтай старонкай]</span>.',
 'noarticletext-nopermission' => 'Старонка не ўтрымлівае тэксту.
\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е [[Special:Search/{{PAGENAME}}|паÑ\88Ñ\83каÑ\86Ñ\8c Ð³Ñ\8dÑ\82акай Ð½Ð°Ð·Ð²Ñ\8b]] ў іншых старонках,
\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е [[Special:Search/{{PAGENAME}}|паÑ\88Ñ\83каÑ\86Ñ\8c Ð³Ñ\8dÑ\82кÑ\83Ñ\8e Ð½Ð°Ð·Ð²Ñ\83]] ў іншых старонках,
 ці <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>.',
 'userpage-userdoesnotexist' => 'Рахунак удзельніка "<nowiki>$1</nowiki>" не зарэгістраваны. Праверце, ці вы жадаеце стварыць або паправіць гэтую старонку.',
 'userpage-userdoesnotexist-view' => 'Уліковы запіс удзельніка " $1 "не зарэгістраваны.',
@@ -999,7 +1004,6 @@ $1",
 
 # Diffs
 'history-title' => 'Гісторыя версій "$1"',
-'difference' => '(Розніца між версіямі)',
 'difference-multipage' => '(Розніца паміж старонкамі)',
 'lineno' => 'Радок $1:',
 'compareselectedversions' => 'Параўнаць азначаныя версіі',
@@ -1354,7 +1358,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|мена|менаў}}',
 'recentchanges' => 'Нядаўнія змяненні',
 'recentchanges-legend' => 'Магчымасці паказу',
-'recentchangestext' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
+'recentchanges-summary' => 'Гэта апошнія мены на пляцоўцы {{SITENAME}}.',
 'recentchanges-feed-description' => 'Сачыць за найбольш актуальнымі змяненнямі ў віксе праз гэты струмень навін.',
 'recentchanges-label-newpage' => 'Гэтай праўкай была створана новая старонка',
 'recentchanges-label-minor' => 'Гэта дробная па значэнні праўка',
index 039ec52..c64ce26 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ\91еларуская (тарашкевіца)‬)
+/** Belarusian (TaraÅ¡kievica orthography) (â\80ªÐ±еларуская (тарашкевіца)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -162,7 +162,7 @@ $namespaceNames = array(
        NS_TALK             => 'Абмеркаваньне',
        NS_USER             => 'Удзельнік',
        NS_USER_TALK        => 'Гутаркі_ўдзельніка',
-       NS_PROJECT_TALK     => 'Абмеркаваньне_$1',
+       NS_PROJECT_TALK     => 'Абмеркаваньне_{{GRAMMAR:родны|$1}}',
        NS_FILE             => 'Файл',
        NS_FILE_TALK        => 'Абмеркаваньне_файла',
        NS_MEDIAWIKI        => 'MediaWiki',
@@ -178,6 +178,7 @@ $namespaceNames = array(
 $namespaceAliases = array(
        'Удзельніца' => NS_USER,
        'Гутаркі ўдзельніцы' => NS_USER_TALK,
+       'Абмеркаваньне_$1' => NS_PROJECT_TALK,
        'Выява' => NS_FILE,
        'Абмеркаваньне выявы' => NS_FILE_TALK,
 );
@@ -260,12 +261,12 @@ $messages = array(
 'tog-hidepatrolled' => 'Хаваць патруляваныя зьмены ў сьпісе апошніх зьменаў',
 'tog-newpageshidepatrolled' => 'Хаваць правераныя старонкі ў сьпісе новых старонак',
 'tog-extendwatchlist' => 'Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія',
-'tog-usenewrc' => 'Ð\92Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ñ\83даÑ\81каналенÑ\8b Ñ\81Ñ\8cпÑ\96Ñ\81 Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\85 Ð·Ñ\8cменаў (патрабуе JavaScript)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83паваÑ\86Ñ\8c Ð·Ñ\8cменÑ\8b Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e Ñ\81Ñ\8cпÑ\96Ñ\81аÑ\85 Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\85 Ð·Ñ\8cменаÑ\9e Ñ\96 Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8fў (патрабуе JavaScript)',
 'tog-numberheadings' => 'Аўтаматычная нумарацыя загалоўкаў',
 'tog-showtoolbar' => 'Паказваць панэль інструмэнтаў рэдагаваньня (патрабуе JavaScript)',
-'tog-editondblclick' => 'Рэдагаваць старонкі па падвойным шчоўканьні (JavaScript)',
+'tog-editondblclick' => 'Рэдагаваць старонкі па падвойным пстрыку (JavaScript)',
 'tog-editsection' => 'Дазволіць рэдагаваньне асобных сэкцыяў па спасылках [рэдагаваць]',
-'tog-editsectiononrightclick' => 'Рэдагаваць сэкцыі па правым шчоўканьні мышкай на загалоўку (JavaScript)',
+'tog-editsectiononrightclick' => 'Рэдагаваць сэкцыі па правым пстрыку на загалоўку (патрабуе JavaScript)',
 'tog-showtoc' => 'Паказваць зьмест (для старонак з колькасьцю сэкцый болей за 3)',
 'tog-rememberpassword' => 'Запомніць мяне ў гэтым браўзэры (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
 'tog-watchcreations' => 'Дадаваць у мой сьпіс назіраньня старонкі, якія я буду ствараць',
@@ -469,7 +470,7 @@ $messages = array(
 'categorypage' => 'Паказаць старонку катэгорыі',
 'viewtalkpage' => 'Паказаць абмеркаваньне',
 'otherlanguages' => 'На іншых мовах',
-'redirectedfrom' => '(Перанакіравана з $1)',
+'redirectedfrom' => '(Перанакіравана з «$1»)',
 'redirectpagesub' => 'Старонка-перанакіраваньне',
 'lastmodifiedat' => 'Гэтая старонка апошні раз рэдагавалася $1 году ў $2.',
 'viewcount' => 'Гэтую старонку праглядалі $1 {{PLURAL:$1|раз|разы|разоў}}.',
@@ -642,6 +643,10 @@ $2',
 'filereadonlyerror' => 'Немагчыма зьмяніць файл «$1», бо файлавае сховішча «$2» знаходзіцца ў рэжыме толькі для чытаньня
 
 Адміністратар, які абмежаваў доступ, пазначыў прычыну: «$3».',
+'invalidtitle-knownnamespace' => 'Няслушная назва ў прасторы «$2»: «$3»',
+'invalidtitle-unknownnamespace' => 'Няслушная назва ў невядомай прасторы $1: «$2»',
+'exception-nologin' => 'Вы не ўвайшлі ў сыстэму',
+'exception-nologin-text' => 'Гэтая старонка ці дзеяньне патрабуе, каб вы ўвайшлі ў сыстэму.',
 
 # Virus scanner
 'virus-badscanner' => "Няслушная канфігурацыя: невядомы антывірусны сканэр: ''$1''",
@@ -926,7 +931,8 @@ $2
 'updated' => '(Абноўлена)',
 'note' => "'''Заўвага: '''",
 'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
-Вашыя зьмены яшчэ не былі захаваныя! [[#editform|→ Працягнуць рэдагаваньне]]",
+Вашыя зьмены яшчэ не былі захаваныя!",
+'continue-editing' => 'Працягнуць рэдагаваньне',
 'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
 'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
 Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
@@ -1022,6 +1028,12 @@ $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' => 'Старонка перавысіла дазволеную глыбіню ўключэньняў',
+'parser-unstrip-loop-warning' => 'Вызначаная незачыненая пятля',
+'parser-unstrip-recursion-limit' => 'Перавышанае абмежаваньне глыбіні рэкурсіі ($1)',
 
 # "Undo" feature
 'undo-success' => 'Рэдагаваньне можа быць адмененае. Калі ласка, параўнайце адрозьненьні паміж вэрсіямі, каб упэўніцца, што гэта адпаведныя зьмены, а потым запішыце зьмены для сканчэньня рэдагаваньня.',
@@ -1180,7 +1192,7 @@ $1",
 'mergehistory-go' => "Паказаць вэрсіі, якія магчыма аб'яднаць",
 'mergehistory-submit' => "Аб'яднаць гісторыі рэдагаваньняў",
 'mergehistory-empty' => "Няма гісторыі рэдагаваньняў, якую магчыма аб'яднаць.",
-'mergehistory-success' => "$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсій}} з [[:$1]] пасьпяхова аб'яднаныя ў [[:$2]].",
+'mergehistory-success' => '$3 {{PLURAL:$3|вэрсія|вэрсіі|вэрсіяў}} з [[:$1]] пасьпяхова аб’яднаныя ў [[:$2]].',
 'mergehistory-fail' => "Не атрымалася аб'яднаць гісторыі старонак. Калі ласка, праверце парамэтры старонкі і часу.",
 'mergehistory-no-source' => 'Не існуе крынічнай старонкі $1.',
 'mergehistory-no-destination' => 'Не існуе мэтавай старонкі $1.',
@@ -1198,8 +1210,9 @@ $1",
 'mergelogpagetext' => "Ніжэй знаходзіцца сьпіс апошніх аб'яднаньняў гісторыяў старонак.",
 
 # Diffs
-'history-title' => 'Гісторыя зьменаў старонкі «$1»',
-'difference' => '(Адрозьненьні паміж вэрсіямі)',
+'history-title' => '$1 — гісторыя зьменаў',
+'difference-title' => '$1: розьніца паміж вэрсіямі',
+'difference-title-multipage' => '«$1» і «$2» — розьніца паміж старонкамі',
 'difference-multipage' => '(Розьніца паміж старонкамі)',
 'lineno' => 'Радок $1:',
 'compareselectedversions' => 'Параўнаць выбраныя вэрсіі',
@@ -1295,6 +1308,7 @@ $1",
 'prefs-beta' => 'Тэставыя магчымасьці',
 'prefs-datetime' => 'Дата і час',
 'prefs-labs' => 'Экспэрымэнтальныя магчымасьці',
+'prefs-user-pages' => 'Старонкі ўдзельніка',
 'prefs-personal' => 'Асабістыя зьвесткі',
 'prefs-rc' => 'Апошнія зьмены',
 'prefs-watchlist' => 'Сьпіс назіраньня',
@@ -1473,12 +1487,12 @@ $1",
 'right-writeapi' => 'выкарыстаньне API для запісаў',
 'right-delete' => 'выдаленьне старонак',
 'right-bigdelete' => 'Выдаленьне старонак зь вялікімі гісторыямі',
-'right-deleterevision' => 'выдаленьне і аднаўленьне асобных вэрсій старонак',
+'right-deleterevision' => 'выдаленьне і аднаўленьне асобных вэрсіяў старонак',
 'right-deletedhistory' => 'прагляд выдаленай гісторыі старонак без доступу да выдаленага тэксту',
 'right-deletedtext' => 'прагляд выдаленага тэксту і зьменаў паміж выдаленымі вэрсіямі старонак',
 'right-browsearchive' => 'пошук выдаленых старонак',
 'right-undelete' => 'аднаўленьне старонак',
-'right-suppressrevision' => 'прагляд і аднаўленьне вэрсій схаваных ад адміністратараў',
+'right-suppressrevision' => 'прагляд і аднаўленьне вэрсіяў, схаваных ад адміністратараў',
 'right-suppressionlog' => 'прагляд прыватных журналаў',
 'right-block' => 'блякаваньне іншых удзельнікаў ад рэдагаваньняў',
 'right-blockemail' => 'блякаваньне іншых ўдзельнікаў ад дасылкі электроннай пошты',
@@ -1557,7 +1571,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}',
 'recentchanges' => 'Апошнія зьмены',
 'recentchanges-legend' => 'Налады апошніх зьменаў',
-'recentchangestext' => 'Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} на гэтай старонцы.',
+'recentchanges-summary' => 'Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} на гэтай старонцы.',
 'recentchanges-feed-description' => 'Сачыце за апошнімі зьменамі ў {{GRAMMAR:месны|{{SITENAME}}}} праз гэтую стужку.',
 'recentchanges-label-newpage' => 'Гэтым рэдагаваньнем была створаная новая старонка',
 'recentchanges-label-minor' => 'Гэтае рэдагаваньне — дробнае',
@@ -1751,14 +1765,15 @@ $1',
 'backend-fail-writetemp' => 'Немагчыма запісаць часовы файл.',
 'backend-fail-closetemp' => 'Немагчыма закрыць часовы файл.',
 'backend-fail-read' => 'Немагчыма прачытаць файл $1.',
-'backend-fail-create' => 'Немагчыма стварыць файл $1.',
-'backend-fail-maxsize' => 'Не атрымалася стварыць файл $1, бо яго памер перавышае {{PLURAL:$2|$2 байт|$2 байта|$2 байтаў}}',
+'backend-fail-create' => 'Немагчыма запісаць файл $1.',
+'backend-fail-maxsize' => 'Не атрымалася запісаць файл $1, бо яго памер перавышае {{PLURAL:$2|$2 байт|$2 байта|$2 байтаў}}.',
 'backend-fail-readonly' => 'Сэрвэр сховішча «$1» у рэжыме толькі чытаньня. Прычына: «$2»',
 'backend-fail-synced' => 'Стан файла «$1» адрозьніваецца ад стану на ўнутраным сэрвэры сховішча',
 'backend-fail-connect' => 'Немагчыма далучыцца да сэрвэра сховішча «$1».',
 'backend-fail-internal' => 'Узьнікла невядомая памылка на сэрвэры сховішча «$1».',
 'backend-fail-contenttype' => 'Немагчыма вызначыць тып зьместу файла, які мусіць быць захаваны ў «$1».',
 'backend-fail-batchsize' => 'Cховішча атрымала блёк з $1 {{PLURAL:$1|файлавай апэрацыі|файлавых апэрацыяў|файлавых апэрацыяў}}; абмежаваньне складае $2 {{PLURAL:$2|апэрацыю|апэрацыі|апэрацыяў}}.',
+'backend-fail-usable' => 'Не атрымалася запісаць файл $1 з-за недастачы правоў ці адсутнасьці дырэкторыяў або кантэйнэраў.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не атрымалася злучыцца з базай зьвестак журнала для сховішча «$1».',
@@ -2002,7 +2017,7 @@ $1',
 'ncategories' => '$1 {{PLURAL:$1|катэгорыя|катэгорыі|катэгорыяў}}',
 'nlinks' => '$1 {{PLURAL:$1|спасылка|спасылкі|спасылак}}',
 'nmembers' => '$1 {{PLURAL:$1|элемэнт|элемэнты|элемэнтаў}}',
-'nrevisions' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}}',
+'nrevisions' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}',
 'nviews' => '$1 {{PLURAL:$1|прагляд|прагляды|праглядаў}}',
 'nimagelinks' => 'Выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}',
 'ntransclusions' => 'выкарыстоўваецца на $1 {{PLURAL:$1|старонцы|старонках|старонках}}',
@@ -2082,6 +2097,7 @@ $1',
 Вы можаце адфільтраваць вынікі па тыпе журналу, удзельніку ці старонцы.',
 'logempty' => 'Падобных запісаў у журнале няма.',
 'log-title-wildcard' => 'Шукаць назвы, якія пачынаюцца з гэтага тэксту',
+'showhideselectedlogentries' => 'Паказаць/схаваць выбраныя запісы ў журнале',
 
 # Special:AllPages
 'allpages' => 'Усе старонкі',
@@ -2101,6 +2117,11 @@ $1',
 '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|Наступная катэгорыя зьмяшчае|Наступныя катэгорыі зьмяшчаюць}} старонкі і/альбо мэдыяфайлы.
@@ -2304,9 +2325,9 @@ $UNWATCHURL
 ** Парушэньне аўтарскіх правоў
 ** Вандалізм',
 'delete-edit-reasonlist' => 'Рэдагаваць прычыны выдаленьня',
-'delete-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, болей за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсій}}.
+'delete-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, болей за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Выдаленьне такіх старонак было забароненае, каб пазьбегнуць праблемаў у працы {{GRAMMAR:родны|{{SITENAME}}}}.',
-'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсій}}.
+'delete-warning-toobig' => 'Гэтая старонка мае доўгую гісторыю рэдагаваньняў, больш за $1 {{PLURAL:$1|вэрсію|вэрсіі|вэрсіяў}}.
 Яе выдаленьне можа выклікаць праблемы ў працы базы зьвестак {{GRAMMAR:родны|{{SITENAME}}}}; будзьце асьцярожны.',
 
 # Rollback
@@ -2407,7 +2428,7 @@ $UNWATCHURL
 'undelete-fieldset-title' => 'Аднавіць вэрсіі',
 'undeleteextrahelp' => "Для поўнага аднаўленьня гісторыі рэдагаваньня старонкі, пакіньце ўсе адзнакі нявызначнымі і націсьніце '''''{{int:undeletebtn}}'''''.
 Для частковага аднаўленьня, пазначце тыя вэрсіі старонкі, якія трэба аднавіць і націсьніце '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => 'У архіве $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}}',
+'undeleterevisions' => 'У архіве $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}',
 'undeletehistory' => 'Калі Вы адновіце старонку, будуць адноўленыя ўсе яе вэрсіі разам з журналам падзеяў.
 Калі пасьля выдаленьня была створаная новая старонка з такой жа назвай, адноўленыя вэрсіі зьявяцца ў гісторыі перад новымі вэрсіямі.',
 'undeleterevdel' => 'Аднаўленьня не адбудзецца, калі ў яго выніку будзе выдаленая апошняя вэрсія старонкі ці файла.
@@ -2425,8 +2446,8 @@ $UNWATCHURL
 'undeletereset' => 'Скінуць',
 'undeleteinvert' => 'Адваротны выбар',
 'undeletecomment' => 'Прычына:',
-'undeletedrevisions' => '{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсій}}',
-'undeletedrevisions-files' => 'адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}',
+'undeletedrevisions' => '{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}',
+'undeletedrevisions-files' => 'адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}',
 'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}',
 'cannotundelete' => 'Аднаўленьне не адбылося; нехта іншы мог пасьпець аднавіць старонку раней.',
 'undeletedpage' => "'''Старонка $1 была адноўленая'''
@@ -2541,8 +2562,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' => 'Рэдагаваць прычыны блякіровак',
@@ -2592,7 +2613,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' => 'стварэньне рахункаў забароненае',
@@ -2811,7 +2834,7 @@ $1',
 'importtext' => 'Калі ласка, экспартуйце файл з крынічнай вікі з дапамогай [[Special:Export|прылады экспарту]].
 Захавайце яго на свой кампутар, а потым загрузіце сюды.',
 'importstart' => 'Імпартаваньне старонак…',
-'import-revision-count' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}}',
+'import-revision-count' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}',
 'importnopages' => 'Няма старонак для імпартаваньня.',
 'imported-log-entries' => '{{PLURAL:$1|Імпартаваны $1 запіс журнала|Імпартаваныя $1 запісы журнала|Імпартаваныя $1 запісаў журнала}}.',
 'importfailed' => 'Немагчыма імпартаваць: $1',
@@ -2846,9 +2869,9 @@ $1',
 'importlogpage' => 'Журнал імпартаваньняў',
 'importlogpagetext' => 'Імпартаваньне адміністратарамі старонак з гісторыяй зьменаў зь іншых вікі.',
 'import-logentry-upload' => 'імпартавана [[$1]] праз загрузку файла',
-'import-logentry-upload-detail' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}}',
 'import-logentry-interwiki' => 'імпартавана зь іншай вікі $1',
-'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсій}} з $2',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} з $2',
 
 # JavaScriptTest
 'javascripttest' => 'Тэставаньне JavaScript',
@@ -2955,6 +2978,7 @@ $1',
 'spambot_username' => 'Чыстка спаму MediaWiki',
 'spam_reverting' => 'Адкат да апошняй вэрсіі без спасылак на $1',
 'spam_blanking' => 'Усе вэрсіі ўтрымліваюць спасылкі на $1, чыстка',
+'spam_deleting' => 'Усе вэрсіі ўтрымлівалі спасылкі на $1, выдаляем',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя пра «$1»',
@@ -3671,6 +3695,9 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-software' => 'Усталяванае праграмнае забесьпячэньне',
 'version-software-product' => 'Прадукт',
 'version-software-version' => 'Вэрсія',
+'version-entrypoints' => 'Уваходныя адрасы',
+'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Шлях да файла',
@@ -3859,4 +3886,17 @@ 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|тысячагодзьдзе|тысячагодзьдзі|тысячагодзьдзяў}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Немагчыма запытаць блякаваньні на сэрвэры $1.',
 );
index d9fb268..2c994a4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Bulgarian (Ð\91ългарски)
+/** Bulgarian (български)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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',
@@ -1173,7 +1175,7 @@ $1",
 
 # Diffs
 'history-title' => 'Преглед на историята на „$1“',
-'difference' => '(Разлики между версиите)',
+'difference-title' => 'Разлика между версии на „$1“',
 'difference-multipage' => '(Разлики между страниците)',
 'lineno' => 'Ред $1:',
 'compareselectedversions' => 'Сравнение на избраните версии',
@@ -1269,6 +1271,7 @@ $1",
 'prefs-beta' => 'Функционалности на Бета',
 'prefs-datetime' => 'Дата и час',
 'prefs-labs' => 'Функционалности на Labs',
+'prefs-user-pages' => 'Потребителски страници',
 'prefs-personal' => 'Потребителски данни',
 'prefs-rc' => 'Последни промени',
 'prefs-watchlist' => 'Списък за наблюдение',
@@ -1528,7 +1531,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|промяна|промени}}',
 'recentchanges' => 'Последни промени',
 'recentchanges-legend' => 'Опции на списъка с последни промени',
-'recentchangestext' => "Проследяване на последните промени в {{SITENAME}}.
+'recentchanges-summary' => "Проследяване на последните промени в {{SITENAME}}.
 
 Легенда: '''тек''' = разлика на текущата версия,
 '''ист''' = история на версиите",
@@ -1701,6 +1704,7 @@ $1',
 'backend-fail-notexists' => 'Файлът $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' => 'Временният файл не може да бъде отворен.',
@@ -2014,6 +2018,7 @@ $1',
 'allpagesprefix' => 'Показване на страници, започващи със:',
 'allpagesbadtitle' => 'Зададеното име е невалидно. Възможно е да съдържа междуезикова или междупроектна представка или пък знаци, които не могат да се използват в заглавия.',
 'allpages-bad-ns' => 'В {{SITENAME}} не съществува именно пространство „$1“.',
+'allpages-hide-redirects' => 'Скриване на пренасочванията',
 
 # Special:Categories
 'categories' => 'Категории',
@@ -2337,6 +2342,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 +3091,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' => 'Уникален номер на оригиналния документ',
@@ -3484,6 +3492,7 @@ MediaWiki се разпространява с надеждата, че ще б
 'version-software' => 'Инсталиран софтуер',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints-header-url' => 'Адрес',
 
 # Special:FilePath
 'filepath' => 'Път към файл',
@@ -3591,9 +3600,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 +3667,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 f3d7ba0..577d2e2 100644 (file)
 <?php
-/** Bihari (language group)
+/** Bihari (भोजपुरी)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  *
  * @ingroup Language
  * @file
- * @comment falls back to Bhojpuri.
  *
  */
 
 $fallback = 'bho';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'लिंक के नीचे रेखा',
+'tog-justify' => 'पैराग्राफ जस्टीफाई',
+'tog-hideminor' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
+'tog-numberheadings' => 'स्वयं-सांख्यिकी शिर्षक',
+'tog-rememberpassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
+'tog-previewonfirst' => 'पहिलका सम्पादन पर पूर्वावलोकन देखीं',
+
+'underline-always' => 'हमेशा',
+'underline-never' => 'कभी ना',
+'underline-default' => 'डिफॉल्ट ब्राउजर',
+
+# 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' => 'अगस्त',
+'september-gen' => 'सितम्बर',
+'october-gen' => 'अक्टूबर',
+'november-gen' => 'नवम्बर',
+'december-gen' => 'दिसम्बर',
+'jan' => 'जन',
+'feb' => 'फर',
+'mar' => 'मार्च',
+'apr' => 'अप्रिल',
+'may' => 'मई',
+'jun' => 'जून',
+'jul' => 'जुल',
+'aug' => 'अग',
+'sep' => 'सित',
+'oct' => 'अक्टू',
+'nov' => 'नव',
+'dec' => 'दिस',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|श्रेणी|श्रेणी}}',
+
+'about' => 'बारे में',
+'article' => 'सामग्री पन्ना',
+'newwindow' => '(नया विंडो में खोलीं)',
+'cancel' => 'निरस्त',
+'mytalk' => 'हमार बात',
+'navigation' => 'परिभ्रमण',
+
+# Cologne Blue skin
+'qbfind' => 'खोज',
+'qbbrowse' => 'ब्राउज',
+'qbedit' => 'सम्पादन',
+'qbpageoptions' => 'ई पन्ना',
+'qbpageinfo' => 'प्रसंग',
+'qbmyoptions' => 'हमार पन्ना',
+'qbspecialpages' => 'विशेष पन्ना',
+'faq' => 'साधारण सवाल',
+'faqpage' => 'Project:साधारण सवाल',
+
+# Vector skin
+'vector-action-delete' => 'मिटाईं',
+'vector-action-move' => 'स्थांतरण',
+'vector-action-protect' => 'संरक्षित करीं',
+'vector-action-undelete' => 'मत मिटाईं',
+'vector-action-unprotect' => 'असुरक्षित करीं',
+'vector-view-create' => 'बनाईं',
+'vector-view-edit' => 'सम्पादन',
+'vector-view-history' => 'इतिहास देखीं',
+'vector-view-view' => 'पढ़ीं',
+'vector-view-viewsource' => 'स्त्रोत देखीं',
+
+'errorpagetitle' => 'त्रुटी',
+'returnto' => 'जाईं $1 पर।',
+'tagline' => 'भोजपुरी {{SITENAME}} से',
+'help' => 'मदद',
+'search' => 'खोज',
+'searchbutton' => 'खोजीं',
+'go' => 'जाईं',
+'searcharticle' => 'जाईं',
+'history' => 'पन्ना के इतिहास',
+'history_short' => 'इतिहास',
+'updatedmarker' => 'हमार अन्तिम आगमन से बदलाव',
+'printableversion' => 'छापे लायक संस्करण',
+'permalink' => 'स्थायी लिंक',
+'print' => 'छापीं',
+'edit' => 'सम्पादन',
+'create' => 'बनाईं',
+'editthispage' => 'ई पन्ना के सम्पादन करीं',
+'create-this-page' => 'ई पन्ना के निर्माण करीं',
+'delete' => 'मिटाईं',
+'deletethispage' => 'ई पन्ना के मिटाईं',
+'protect' => 'संरक्षण करीं',
+'protect_change' => 'बदलीं',
+'protectthispage' => 'इ पन्ना के सुरक्षित करीं।',
+'unprotect' => 'असुरक्षित करीं',
+'unprotectthispage' => 'इ पन्ना के असुरक्षित करीं',
+'newpage' => 'नया पन्ना',
+'talkpage' => 'इ पन्ना पर चर्चा करीं',
+'talkpagelinktext' => 'बात-चीत',
+'specialpage' => 'ख़ाश पन्ना',
+'personaltools' => 'ब्यक्तिगत औजार',
+'postcomment' => 'नया खण्ड',
+'articlepage' => 'सामग्री पन्ना देखीं',
+'talk' => 'बात-चीत',
+'views' => 'विचारसूची',
+'toolbox' => 'औजार-पेटी',
+'userpage' => 'प्रयोगकर्ता पन्ना देखीं',
+'projectpage' => 'परियोजना पन्ना देखीं',
+'imagepage' => 'फाईल पन्ना देखीँ',
+'mediawikipage' => 'सन्देश पन्ना देखीं',
+'templatepage' => 'टेम्पलेट पन्ना देखीं',
+'viewhelppage' => 'मदद पन्ना देखीं',
+'categorypage' => 'श्रेणी पन्ना देखीं',
+'viewtalkpage' => 'बात-चीत देखीं',
+'otherlanguages' => 'अन्य भाषा में',
+'redirectedfrom' => '($1 द्वारा पुन: निर्देशित)',
+'redirectpagesub' => 'पुन: निर्देशित पन्ना',
+'lastmodifiedat' => '$1 के $2 पर ई पन्ना पर अन्तिम बार परिवर्तन भईल।',
+'protectedpage' => 'सुरक्षित पन्ना',
+'jumpto' => 'अहिजा जाईं:',
+'jumptonavigation' => 'परिभ्रमण',
+'jumptosearch' => 'खोजीं',
+'view-pool-error' => 'क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।
+ई पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।
+ई पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इन्तजार करीं।
+
+$1',
+
+# 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}}:लेखाधिकार',
+'currentevents' => 'हाल के घटना',
+'currentevents-url' => 'Project:हाल के घटना',
+'disclaimers' => 'अस्विकरण',
+'disclaimerpage' => 'Project:सामान्य अस्विकरण',
+'edithelp' => 'मदद सम्पादन',
+'edithelppage' => 'Help:सम्पादन',
+'mainpage' => 'मुख्य पन्ना',
+'mainpage-description' => 'पहिलका पन्ना',
+'portal' => 'सामुदायिक पन्ना',
+'portal-url' => 'Project:सामुदायिक पोर्टल',
+'privacy' => 'गोपनीयता नीति',
+'privacypage' => 'Project:गोपनीयता नीति',
+
+'badaccess' => 'अनुमति त्रुटी',
+'badaccess-group0' => 'रउआ जवन कार्रवाई खातिर अनुरोध कईले बानी उ के निष्पादन करे के अनुमति नईखे।',
+
+'ok' => 'ठिक',
+'retrievedfrom' => '"$1" से लियल गईल',
+'youhavenewmessages' => 'रउआ लगे बा $1 ($2).',
+'newmessageslink' => 'नया सन्देश',
+'newmessagesdifflink' => 'अन्तिम परिवर्तन',
+'youhavenewmessagesmulti' => 'रउआ लगे $1 पर नया सन्देश बा',
+'editsection' => 'सम्पादन',
+'editold' => 'सम्पादन',
+'viewsourceold' => 'स्त्रोत देखीं',
+'editlink' => 'सम्पादन',
+'viewsourcelink' => 'स्त्रोत देखीं',
+'editsectionhint' => 'सम्पादन खण्ड: $1',
+'toc' => 'सामग्री',
+'showtoc' => 'देखाईं',
+'hidetoc' => 'छुपाईं',
+'thisisdeleted' => 'देखीं या भंडार करीं $1?',
+'viewdeleted' => '$1 देखब?',
+'site-rss-feed' => '$1 आर एस एस फिड',
+'site-atom-feed' => '$1 एटम फिड',
+'page-rss-feed' => '"$1" आर एस एस फिड',
+'page-atom-feed' => '"$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-mediawiki' => 'सन्देश',
+'nstab-template' => 'टेम्पलेट',
+'nstab-help' => 'मदद पन्ना',
+'nstab-category' => 'श्रेणी',
+
+# Main script and global functions
+'nosuchaction' => 'अईसन कौनो कार्रवाई नाहि',
+'nosuchspecialpage' => 'अईसन कौनो ख़ाश पन्ना नाहि',
+'nospecialpagetext' => '<strong>रउआ एगो अवैद्य विशेष पन्ना के अनुरोध कईले बानी।</strong>
+
+वैद्य विशेष पन्ना के सूची मिल सकत बा [[Special:SpecialPages|{{int:specialpages}}]] पर।',
+
+# General errors
+'error' => 'त्रुटी',
+'databaseerror' => 'डेटाबेस त्रुटी',
+'readonly' => 'डेटाबेस लॉक बा',
+'missing-article' => 'डेटाबास ऊ पन्ना के पाठ्य के ना खोज पाईल जौन ई के खोजे के रहल, नामित "$1" $2.
+ई सब साधारणत: निम्नलिखीत अप्रचलित अन्तर अथवा एगो पन्ना पर इतिहास के लिंक जौन मिटा दिहल गईल बा के कारण भईल।
+
+यदि ई बात नईखे, त हो सकत बा सॉफ्टवेयर में बग पावत होखब।
+कृपया ई एगो  [[Special:ListUsers/sysop|प्रबन्धक]] के यू आर एल के बारे में एगो नोट बनाके खबर करीं।',
+'viewsource' => 'स्त्रोत देखीं',
+
+# Login and logout pages
+'yourname' => 'प्रयोगकर्ता नाम',
+'yourpassword' => 'गुप्त शब्द',
+'yourpasswordagain' => 'गुप्त-शब्द पुन:डालीं:',
+'login' => 'खाता में प्रवेश',
+'nav-login-createaccount' => 'खाता प्रवेश / खाता बनाईं',
+'loginprompt' => '{{SITENAME}} में प्रवेश खातिर राउर कुकिज चालू होवे के चाहीं',
+'userlogin' => 'खाता प्रवेश / खाता बनाईं',
+'userloginnocreate' => 'खाता में प्रवेश',
+'logout' => 'खाता से बाहर',
+'userlogout' => 'खाता से बाहर',
+'notloggedin' => 'खाता में प्रवेश नईखीं भईल',
+'nologin' => 'का एगो खाता नईखे? $1.',
+'nologinlink' => 'एगो खाता बनाईं',
+'createaccount' => 'खाता बनाईं',
+'gotaccount' => 'का पहिले से एगो खाता बा? $1.',
+'gotaccountlink' => 'खाता में प्रवेश',
+'createaccountmail' => 'ई-मेल द्वारा',
+'badretype' => 'रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।',
+'userexists' => 'ई प्रयोगकर्ता नाम पहिले से इस्तेमाल में बा। कृपया कौनो दोसर नाम चुनीं।',
+'loginerror' => 'खाता प्रवेश में त्रुटि',
+'createaccounterror' => 'ई खाता ना बन पाईल: $1',
+'nocookiesnew' => 'प्रयोगकर्ता खाता त बन गईल, बाँकी रउआ प्रवेश नईखीं भईल।
+{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
+राउर कुकिज असक्षम बा।
+कृपया उ के सक्षम करीं, उ के बाद राउर नया प्रयोगकर्ता नाम आ गुप्त शब्द के साथ प्रवेश करीं।',
+'nocookieslogin' => '{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
+राउर कुकिज असक्षम बा।
+कृपया उ के सक्षम करीं आ फिर से कोशिश करीं',
+'noname' => 'रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।',
+'loginsuccesstitle' => 'खाता प्रवेश में सफल',
+'loginsuccess' => "''' \"\$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
+'nosuchuser' => '"$1" नाम से कौनो प्रयोगकर्ता नईखन।
+प्रयोगकर्ता नाम संवेदनशील मामला बा।
+शब्द-वर्तनी के जाँच करीं, आ चाहे [[Special:UserLogin/signup|एगो नया खाता बनाईं]]।',
+'nouserspecified' => 'रउआ एगो प्रयोगकर्ता नाम निर्दिष्ट करे के बा।',
+'login-userblocked' => 'ई प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।',
+'wrongpassword' => 'गलत गुप्त-शब्द डलले बानी।
+कृपया फिर से कोशिश करीं।',
+'wrongpasswordempty' => 'गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।',
+'passwordtooshort' => 'गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।',
+'password-name-match' => 'राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।',
+'mailmypassword' => 'नया गुप्त-शब्द ई-मेल पर भेजीं',
+'passwordremindertitle' => '{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द',
+
+# Change password dialog
+'resetpass' => 'गुप्त-शब्द बदलीं',
+'oldpassword' => 'पुराना गुप्त-शब्द:',
+'newpassword' => 'नया गुप्त-शब्द:',
+'retypenew' => 'नया गुप्त-शब्द पुन: डालीं:',
+
+# Edit page toolbar
+'bold_tip' => 'मोट पाठ्य',
+'italic_sample' => 'इटालिक पाठ्य',
+'italic_tip' => 'इटालिक पाठ्य',
+'headline_sample' => 'शिर्षक पाठ्य',
+'image_sample' => 'उदाहरण.jpg',
+'media_sample' => 'उदाहरण.ogg',
+'media_tip' => 'फाईल लिंक',
+'sig_tip' => 'timestamp के साथ राउर हस्ताक्षर',
+
+# Edit pages
+'summary' => 'सारांश:',
+'subject' => 'विषय/शिर्षक:',
+'minoredit' => 'छोट परिवर्तन',
+'watchthis' => 'ई पन्ना ध्यानसूची में डालीं',
+'savearticle' => 'पन्ना सुरक्षित करीं',
+'preview' => 'पूर्वावलोकन',
+'showpreview' => 'पूर्वावलोकन देखाईं',
+'showlivepreview' => 'सीधा पूर्वावलोकन',
+'showdiff' => 'परिवर्तन देखाईं',
+'anoneditwarning' => "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
+'anonpreviewwarning' => "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
+'missingsummary' => "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
+'missingcommenttext' => 'कृपया निचे एगो टिप्पणी करीं।',
+'missingcommentheader' => "'''स्मरणपत्र:''' रउआ ई टिप्पणी खातिर कौनो विषय/शिर्षक प्रदान नईखीं कईले। \"{{int:savearticle}}\" यदि रउआ फिर से सुरक्षित करब त राउर सम्पादन बिना कौनो शिर्षक के सुरक्षित हो जाई।",
+'summary-preview' => 'सारांश पूर्वावलोकन:',
+'subject-preview' => 'विषय/शिर्षक पूर्वावलोकन:',
+'blockedtitle' => 'निष्क्रिय प्रयोगकर्ता',
+'blockednoreason' => 'कउनो कारण उल्लेखित नईखे',
+'nosuchsectiontitle' => 'खण्ड ना मिल सकल।',
+'loginreqtitle' => 'खाता में प्रवेश जरुरी बा',
+'loginreqlink' => 'खाता में प्रवेश',
+'accmailtitle' => 'गुप्त-शब्द भेजा गईल',
+'newarticle' => '(नया)',
+'newarticletext' => "रउआ एगो अइसन लिंक के पन्ना के अनुसरण कइले बानी जउन अभी तक उपलब्ध नइखे।
+पन्ना बनावे खातिर, नीचे के बाकस में टाईप करे के शुरु करीं (ज्यादा जानकारी खातिर देखीं [[{{MediaWiki:Helppage}}|मदद पन्ना]])।
+यदि रउआ अहिजा गलती से आ गईल बानी त, आपन ब्राउजर के '''back''' (बैक) बटन दबाईं",
+'yourdiff' => 'अंतर',
+'template-protected' => '(संरक्षित)',
+
+# History pages
+'revisionasof' => '$1 के रुप में संशोधन',
+'revision-info' => '$2 में से $1 के रुप में संशोधन',
+'previousrevision' => '← पुरान संशोधन',
+'nextrevision' => 'नया संशोधन →',
+'currentrevisionlink' => 'हाल के संशोधन',
+'cur' => 'हाल',
+'next' => 'अगिला',
+'last' => 'पछिला',
+'page_first' => 'पहिलका',
+'page_last' => 'आखिरी',
+'histlegend' => "चुनाव अन्तर: तुलना करे खातिर संशोधन के रेडियो बटन पर निशान लगाईं आ enter बटन दबाईं आ चाहे निचला बटन दबाईं।<br />
+Legend: '''({{int:cur}})''' = हाल के संशोधन के साथ अंतर, '''({{int:last}})''' = पुर्ववर्ती संशोधन के साथ अंतर, '''{{int:minoreditletter}}''' = छोट सम्पादन।",
+'history-fieldset-title' => 'इतिहास निहारीं',
+'history-show-deleted' => 'खाली मेटावल',
+'histfirst' => 'बहुत पहिले के',
+'histlast' => 'हाल के',
+'historysize' => '({{PLURAL:$1|1 बाइट|$1 बाइट}})',
+'historyempty' => '(खाली)',
+
+# Revision feed
+'history-feed-title' => 'संशोधन इतिहास',
+'history-feed-description' => 'विकि पर इ पन्ना के संशोधन के इतिहास',
+'history-feed-item-nocomment' => '$1 $2 पर',
+'history-feed-empty' => 'अनुरोध करल गईल पन्ना उपलब्ध नईखे। हो सकत बा उ के विकि पर से मिटा दिहल गईल होखे, आ चाहे उ के नाम बदल देवल गईल होखे।
+प्रासंगिक पन्ना के [[Special:Search|विकि पर खोजे के]] कोशिश करत रहीं।',
+
+# Revision deletion
+'rev-deleted-comment' => '(टिप्पणी मिटा दिहल गईल बा)',
+'rev-deleted-user' => '(प्रयोगकर्ता के नाम मिटा दिहल गईल बा)',
+'rev-deleted-event' => '(लॉग कार्रवाई मिटा दिहल गईल बा)',
+'rev-deleted-user-contribs' => '[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]',
+'rev-deleted-text-permission' => "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।
+मेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
+'rev-delundel' => 'दिखाईं/छुपाईं',
+'revdel-restore' => 'दूश्यता बदलीं',
+'revdel-restore-deleted' => 'मिटल संसोधन',
+'revdel-restore-visible' => 'दृश्यमान संसोधन',
+'pagehist' => 'पन्ना के इतिहास',
+'deletedhist' => 'मिटावल इतिहास',
+
+# Merge log
+'revertmerge' => 'अलग करीं',
+'mergelogpagetext' => 'एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भईल एगो सूची नीचे दिहल बा।',
+
+# Diffs
+'history-title' => "''$1'' के संशोधन इतिहास",
+'lineno' => 'पंक्ति $1:',
+'compareselectedversions' => 'चुनल गईल संशोधन में अन्तर देखीं',
+'showhideselectedversions' => 'चुनल गईल संशोधन दिखाईं/छुपाईं',
+'editundo' => 'पूर्ववत',
+'diff-multi' => '({{PLURAL:$1|एगो मध्यम संशोधन|$1 गो मध्यम संशोधन}} नईखे दिखावल)',
+
+# Search results
+'searchresults' => 'खोज परिणाम',
+'searchresults-title' => '$1 खातिर खोज परिणाम',
+'searchresulttext' => '{{SITENAME}} के खोज करे के बारे में अधिक जानकारी खातिर, देखीं [[{{MediaWiki:Helppage}}| {{int:help}}]]।',
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\' खातिर राउर करल गईल खोज ([[Special:Prefixindex/$1| "$1" से शुरु होवे वाला सब पन्ना]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
+'searchsubtitleinvalid' => "रउआ '''$1''' खातिर खोज कईनी ह",
+'titlematches' => 'पन्ना के शिर्षक मिलत बा।',
+'notitlematches' => 'पन्ना के शिर्षक नईखे मिलत',
+'textmatches' => 'पन्ना के पाठ्य मिलत बा',
+'notextmatches' => 'पन्ना के पाठ्य नईखे मिलत',
+'prevn' => 'पिछला {{PLURAL:$1|$1}}',
+'nextn' => 'अगला {{PLURAL:$1|$1}}',
+'prevn-title' => 'पिछला $1 {{PLURAL:$1|परिणाम}}',
+'nextn-title' => 'अगला $1 {{PLURAL:$1|परिणाम}}',
+'shown-title' => 'दिखाईं $1 {{PLURAL:$1|परिणाम}}',
+'viewprevnext' => 'देखीं ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'खोज विकल्प',
+'searchmenu-exists' => "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
+'searchmenu-new' => "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
+'searchhelp-url' => 'Help:सामग्री',
+'searchmenu-prefix' => '[[विशेष:उपसर्ग सूची/$1|इ उपसर्ग साथे पन्ना ब्राउज करीं]]',
+'searchprofile-articles' => 'सामग्री पन्ना',
+'searchprofile-project' => 'मदद आ परियोजना पन्ना',
+'searchprofile-images' => 'मल्टिमीडिया',
+'searchprofile-everything' => 'सब कुछ',
+'searchprofile-advanced' => 'अग्रिम',
+'searchprofile-articles-tooltip' => '$1 में खोजीं',
+'searchprofile-project-tooltip' => '$1 में खोजीं',
+'searchprofile-images-tooltip' => 'फाईल खातिर खोज',
+'searchprofile-everything-tooltip' => 'सभन सामग्री में खोजीं (वार्ता पन्ना सहित)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
+'search-result-score' => 'प्रासंगिकता: $1%',
+'search-redirect' => '(पुन: निर्देशण $1)',
+'search-section' => '(खंड $1)',
+'search-suggest' => 'का राउर मतलब बा: $1',
+'search-interwiki-caption' => 'बहिन परियोजना',
+'search-interwiki-default' => '$1 के परिणाम:',
+'search-interwiki-more' => '(अउर)',
+'search-mwsuggest-enabled' => 'सुझाव के साथ',
+'search-mwsuggest-disabled' => 'कौनो सुझाव ना',
+'search-relatedarticle' => 'संबंधित',
+'mwsuggest-disable' => 'AJAX सुझाव असक्षम',
+'searcheverything-enable' => 'सभन सन्दर्भ में खोजीं',
+'searchrelated' => 'संबंधित',
+'searchall' => 'सब',
+'showingresults' => "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
+'showingresultsnum' => "नीचे देखावल जा रहल बा {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
+'powersearch' => 'उन्नत खोज',
+'powersearch-legend' => 'उन्नत खोज',
+'powersearch-ns' => 'सन्दर्भ में खोजीं',
+'powersearch-redir' => 'पुन:निर्देश सूची',
+'powersearch-field' => 'खातिर खोज',
+'powersearch-togglelabel' => 'जाँच:',
+'powersearch-toggleall' => 'सब',
+'powersearch-togglenone' => 'कउनो ना',
+'search-external' => 'बाहरी खोज',
+
+# Quickbar
+'qbsettings-none' => 'कउनो ना',
+
+# Preferences page
+'preferences' => 'वरीयता',
+'mypreferences' => 'हमार पसन्द',
+'prefs-edits' => 'सम्पादन संख्या',
+'prefsnologin' => 'खाता में प्रवेश नईखीं कईले',
+'changepassword' => 'गुप्त शब्द बदलीं',
+'skin-preview' => 'पूर्वावलोकन',
+'prefs-rc' => 'तुरंत भईल परिवर्तन',
+
+# Recent changes
+'recentchanges' => 'तुरंत भईल परिवर्तन',
+'rcshowhideminor' => '$1 छोट सम्पादन',
+'diff' => 'अन्तर',
+'hist' => 'इति',
+'hide' => 'छुपाँई',
+'show' => 'दिखाईं',
+'minoreditletter' => 'छो',
+'newpageletter' => 'न',
+'boteditletter' => 'बो',
+'number_of_watching_users_pageview' => '[$1 देखल जा रहल बा {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता}}]',
+
+# Recent changes linked
+'recentchangeslinked' => 'सम्बन्धित बदलाव',
+'recentchangeslinked-feed' => 'सम्बन्धित बदलाव',
+'recentchangeslinked-toolbox' => 'सम्बन्धित बदलाव',
+
+# Upload
+'upload' => 'फाईल लादीं',
+
+# File description page
+'filehist' => 'पन्ना के इतिहास',
+'filehist-deleteall' => 'सब मिटाईं',
+'filehist-deleteone' => 'मिटाईं',
+'filehist-current' => 'मौजूदा',
+'filehist-datetime' => 'तारिख/समय',
+'filehist-thumb' => 'थम्बनेल',
+'filehist-nothumb' => 'बिन थम्बनेल',
+'filehist-user' => 'प्रयोगकर्ता',
+'filehist-dimensions' => 'आयाम',
+'filehist-filesize' => 'फाईल के आकार',
+'filehist-comment' => 'टिप्पणी',
+'filehist-missing' => 'गायब फाईल',
+'imagelinks' => 'फाईल लिंक',
+'nolinkstoimage' => 'इ फाईल जोड़े कौनो फाइल लिंक नईखे।',
+'morelinkstoimage' => 'इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।',
+'sharedupload' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।',
+'sharedupload-desc-there' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा। अधिक जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखीं।',
+'filepage-nofile' => 'इ नाम से कौनो फाईल उपलब्ध नईखे।',
+'filepage-nofile-link' => 'इ नाम से कौनो फाईल उपलब्ध नईखे, लेकिन रउआ [$1 के लाद] सकत बानी।',
+'uploadnewversion-linktext' => 'इ फाईल के नया संस्करण लादीं।',
+'shared-repo-from' => '$1 से',
+'shared-repo' => 'एगो आवटिंत भंडार गृह',
+'shared-repo-name-wikimediacommons' => 'विकिमीडिया कॉमन्स',
+
+# File reversion
+'filerevert' => 'पुन: निर्देशित $1',
+'filerevert-legend' => 'पुन: निर्देशित फाईल',
+'filerevert-comment' => 'कारण:',
+
+# File deletion
+'filedelete' => '$1 के मिटाईं',
+'filedelete-legend' => 'फाईल के मिटाईं',
+'filedelete-comment' => 'कारण:',
+'filedelete-submit' => 'मिटाईं',
+'filedelete-success' => "'''$1''' के मिटा दिहल गईल बा।",
+'filedelete-nofile' => "'''$1''' उपलब्ध नईखे।",
+
+# Random page
+'randompage' => 'अविशिष्ट पन्ना',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|बाईट|बाईट्स}}',
+'move' => 'स्थान्तरण',
+'movethispage' => 'ई पन्ना के स्थांतरण करीं',
+
+# Book sources
+'booksources' => 'किताबी स्त्रोत',
+
+# Special:AllPages
+'allpagessubmit' => 'जाईं',
+'allpagesprefix' => 'उपसर्ग के साथे पन्ना प्रदर्शन:',
+
+# E-mail user
+'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
+
+# Watchlist
+'watchlist' => 'हमार ध्यानसूची',
+'mywatchlist' => 'हमार ध्यानसूची',
+'watch' => 'ध्यानसूची में डालीं',
+'watchthispage' => 'ई पन्ना ध्यानसूची में डालीं',
+'unwatch' => 'ध्यानसूची से हटाईं',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'ध्यानसूची में जाते हुए',
+'unwatching' => 'ध्यानसूची से हटते हुए',
+
+'enotif_newpagetext' => 'इ एगो नया पन्ना ह',
+'created' => 'बनावल गईल',
+
+# Undelete
+'undeletelink' => 'देखीं/बहाल करीं',
+
+# Namespace form on various pages
+'namespace' => 'सन्दर्भ',
+'invert' => 'चयनित पलटीं',
+'blanknamespace' => '(मुख्य)',
+
+# Contributions
+'contributions' => 'प्रयोगकर्ता योगदान',
+'contributions-title' => ' $1 खातिर प्रयोगकर्ता योगदान',
+'mycontris' => 'हमार योगदान',
+'nocontribs' => 'ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।',
+'uctop' => '(शीर्ष)',
+'month' => 'महिना से (आ उ से पहिले):',
+'year' => 'साल से (आ उ से पहिले):',
+
+'sp-contributions-newbies' => 'खाली नया खाता के योगदान देखीं।',
+'sp-contributions-newbies-sub' => 'नया खाता खातिर',
+'sp-contributions-newbies-title' => 'नया खाता खातिर प्रयोगकर्ता के योगदान।',
+'sp-contributions-blocklog' => 'निष्क्रीय खाता',
+'sp-contributions-deleted' => 'नष्ट प्रयोगकर्ता के योगदान।',
+'sp-contributions-logs' => 'लौग',
+'sp-contributions-talk' => 'बात-चीत',
+'sp-contributions-userrights' => 'प्रयोगकर्ता अधिकार प्रबन्धन',
+'sp-contributions-blocked-notice' => 'ई प्रयोगकर्ता के ई समय निष्क्रीय करल गईल बा।
+नविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:',
+
+# What links here
+'whatlinkshere' => 'अहिजा का जुड़ी',
+'whatlinkshere-title' => 'पन्ना जौन "$1" से जुड़ेला',
+'whatlinkshere-page' => 'पन्ना:',
+'linkshere' => "नीचे के सब पन्ना '''[[:$1]]''' से जुड़ेला:",
+'nolinkshere' => "'''[[:$1]]''' से कौनो पन्ना नईखे जुड़ल।",
+'nolinkshere-ns' => "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
+'isredirect' => 'पुन: निर्दिष्ट पन्ना',
+'isimage' => 'तस्वीर लिंक',
+'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछला $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगला $1}}',
+'whatlinkshere-links' => '← लिंक',
+'whatlinkshere-hideredirs' => '$1 पुन: निर्देशित',
+'whatlinkshere-hidelinks' => '$1 लिंक',
+'whatlinkshere-hideimages' => '$1 तस्वीर लिंक',
+'whatlinkshere-filters' => 'फिल्टर',
+
+# Block/unblock
+'blockip' => 'प्रतिबंधित प्रयोगकर्ता',
+'blocklink' => 'निष्क्रिय',
+'unblocklink' => 'ताला खोलीं',
+'change-blocklink' => 'ब्लॉक बदलीं',
+'contribslink' => 'योगदान',
+'blocklogpage' => 'निष्क्रिय खाता',
+
+# Move page
+'movepagebtn' => 'पन्ना स्थांतरण करीं',
+'revertmove' => 'पिछलका स्थिति',
+
+# Thumbnails
+'thumbnail-more' => 'बढ़ाईं',
+'filemissing' => 'फाईल गायब',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'राउर प्रयोगकर्ता पन्ना',
+'tooltip-pt-mytalk' => 'राउर वार्ता पन्ना',
+'tooltip-pt-preferences' => 'राउर पसन्द',
+'tooltip-pt-mycontris' => 'राउर योगदान के सूची',
+'tooltip-pt-login' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
+'tooltip-pt-anonlogin' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
+'tooltip-pt-logout' => 'खाता से बाहर',
+'tooltip-ca-talk' => 'सामग्री पन्ना के बारे में बात-चीत',
+'tooltip-ca-edit' => 'रउआ ई पन्ना के सम्पादन कर सकत बानी। कृपया पन्ना सुरक्षित करे से पहिले पूर्वावलोकन बटन के इस्तेमाल करीं।',
+'tooltip-ca-addsection' => 'एगो नया खण्ड शुरु करीं',
+'tooltip-ca-viewsource' => 'इ पन्ना के संरक्षित कर दिहल गईल बा। रऊआ एकर मूल देख सकत बानी।',
+'tooltip-ca-history' => 'ई पन्ना के पिछला संशोधन',
+'tooltip-ca-protect' => 'इ पन्ना के संरक्षित करीं।',
+'tooltip-ca-unprotect' => 'इ पन्ना के संरक्षण हटाईं।',
+'tooltip-ca-delete' => 'ई पन्ना मिटाईं',
+'tooltip-ca-move' => 'ई पन्ना के स्थांतरण करीं',
+'tooltip-ca-watch' => 'इ पन्ना के आपन ध्यानसूची में डालीं',
+'tooltip-search' => '{{SITENAME}} खोजीं',
+'tooltip-search-go' => 'यदि पन्ना मौजूद होई त ईहे सटीक नाम के साथ उ पन्ना पर जाईं',
+'tooltip-search-fulltext' => 'ई पाठ्य खातिर पन्ना खोजीं',
+'tooltip-p-logo' => 'मुख्य पन्ना पर जाईं',
+'tooltip-n-mainpage' => 'मुख्य पन्ना पर जाईं',
+'tooltip-n-mainpage-description' => 'मुख्य पन्ना पर पधारीं',
+'tooltip-n-portal' => 'परियोजना के बारे मेँ, रउआ का कर सकत बानी, वस्तु कहाँ खोजब',
+'tooltip-n-currentevents' => 'वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं',
+'tooltip-n-recentchanges' => 'विकि पर तुरंत भईल परिवर्तन के सूची',
+'tooltip-n-randompage' => 'बेतरतिब पन्ना लादीं (Load करीं)',
+'tooltip-n-help' => 'जगह पता लगावे खातिर',
+'tooltip-t-whatlinkshere' => 'अहिजा लिंक होखे वाला सब विकि पन्ना के सूची',
+'tooltip-t-recentchangeslinked' => 'ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन',
+'tooltip-t-upload' => 'फाईल लादीं (अपलोड )',
+'tooltip-t-specialpages' => 'ख़ाश पन्नवन के सूची',
+'tooltip-t-print' => 'ई पन्ना के छापे लायक संस्करण।',
+'tooltip-t-permalink' => 'ई पन्ना के संसोधन खातिर स्थायी लिंक।',
+'tooltip-ca-nstab-main' => 'सामग्री पन्ना देखीं',
+'tooltip-ca-nstab-special' => 'ई एगो ख़ाश पन्ना ह, रउआ ई पन्ना के सम्पादन नईखीं कर सकत',
+'tooltip-save' => 'आपन बदलाव के सुरक्षित करीं',
+
+# Media information
+'svg-long-desc' => 'एस वी जी फाईल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाईल के आकार $3',
+'show-big-image' => 'पुरा गुणवत्ता',
+'file-info-gif-looped' => 'लूप्ड',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|फ्रेम}}',
+'file-info-png-looped' => 'लूप्ड',
+
+# Bad image list
+'bad_image_list' => 'फोर्मेट निम्न अनुसार बा:
+खाली सूची सामग्री (* से शुरु होवे वाला पंक्ति ) मानल गईल बा।
+पंक्ति पर पहिला लिंक एगो खराब फाईल के साथ जुड़ल होवे के चाहीं।
+कोई भी बाद वाला लिंक ओही पंक्ति पर अईला पर उ के अपवाद मानल जाई, अर्थात जौन पन्ना पर फाईल इनलाईन हो सकत बा।',
+
+# Metadata
+'metadata' => 'मेटाडाटा',
+'metadata-help' => 'इ फाईल में अतिरिक्त जानकारी उपलब्ध बा, हो सकत बा कि इ डिजीटल कैमरा या स्कैनर से लेवल गईल होखे। यदि इ फाईल एकर मूल फाईल में से संशोधित करल गईल बा त कुछ जानकारी उजागर ना हो सकी।',
+'metadata-expand' => 'विस्तृत विवरण देखाईं',
+'metadata-collapse' => 'विस्तृत विवरण छुपाँईं',
+
+# EXIF tags
+'exif-imagewidth' => 'चौड़ाई',
+'exif-imagelength' => 'ऊँचाई',
+'exif-bitspersample' => 'अवयव प्रति बीट',
+'exif-compression' => 'सम्पीड़न प्रणाली',
+'exif-photometricinterpretation' => 'पिक्सल रचना',
+'exif-orientation' => 'अभिसंस्करण',
+'exif-samplesperpixel' => 'अवयवन के संख्या',
+'exif-planarconfiguration' => 'डेटा प्रबन्धन',
+'exif-xresolution' => 'क्षैतिज समाधान',
+'exif-yresolution' => 'लम्बवत समाधान',
+'exif-stripoffsets' => 'चित्र डेटा के स्थिती',
+'exif-jpeginterchangeformatlength' => 'JPEG डेटा के बाइट',
+
+# 'all' in various places, this might be different for inflected languages
+'namespacesall' => 'सब',
+'monthsall' => 'सब',
+'limitall' => 'सब',
+
+# E-mail address confirmation
+'confirmemail' => 'इ-मेल पता कन्फर्म करीं',
+
+# Special:SpecialPages
+'specialpages' => 'ख़ाश पन्ना',
+
+# New logging system
+'revdelete-restricted' => 'प्रबंधक पर प्रतिबंध लागू',
+'revdelete-unrestricted' => 'प्रबंधक पर से प्रतिबंध समाप्त',
+
+);
index 614ef35..1e02306 100644 (file)
@@ -46,515 +46,514 @@ $digitTransformTable = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'        => 'लिंक के नीचे रेखा',
-'tog-justify'          => 'पैराग्राफ जस्टीफाई',
-'tog-hideminor'        => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
-'tog-numberheadings'   => 'स्वयं-सांख्यिकी शिर्षक',
-'tog-showtoolbar'      => 'सम्पादन औजार् बक्सा के दिखाइल् जाए',
+'tog-underline' => 'लिंक के नीचे रेखा',
+'tog-justify' => 'पैराग्राफ जस्टीफाई',
+'tog-hideminor' => 'हाल के परिवर्तन में मामूली संपादन छुपाईं',
+'tog-numberheadings' => 'स्वयं-सांख्यिकी शिर्षक',
+'tog-showtoolbar' => 'सम्पादन औजार् बक्सा के दिखाइल् जाए',
 'tog-rememberpassword' => 'इ ब्राउजर पर हमार प्रवेश जारी रहे (अधिकतम $1 {{PLURAL:$1|दिन|दिन}})',
-'tog-previewontop'     => 'सम्पादन बक्सा से पहिले पुर्वदर्शन दिखाईं।',
-'tog-previewonfirst'   => 'पहिलका सम्पादन पर पूर्वावलोकन देखीं',
+'tog-previewontop' => 'सम्पादन बक्सा से पहिले पुर्वदर्शन दिखाईं।',
+'tog-previewonfirst' => 'पहिलका सम्पादन पर पूर्वावलोकन देखीं',
 
-'underline-always'  => 'हमेशा',
-'underline-never'   => 'कभी ना',
+'underline-always' => 'हमेशा',
+'underline-never' => 'कभी ना',
 'underline-default' => 'डिफॉल्ट ब्राउजर',
 
 # 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|श्रेणी|श्रेणी}}',
 
-'about'      => 'बारे में',
-'article'    => 'सामग्री पन्ना',
-'newwindow'  => '(नया विंडो में खोलीं)',
-'cancel'     => 'निरस्त',
-'mytalk'     => 'हमार बात',
+'about' => 'बारे में',
+'article' => 'सामग्री पन्ना',
+'newwindow' => '(नया विंडो में खोलीं)',
+'cancel' => 'निरस्त',
+'mytalk' => 'हमार बात',
 'navigation' => 'परिभ्रमण',
 
 # Cologne Blue skin
-'qbfind'         => 'खोज',
-'qbbrowse'       => 'ब्राउज',
-'qbedit'         => 'सम्पादन',
-'qbpageoptions'  => 'ई पन्ना',
-'qbpageinfo'     => 'प्रसंग',
-'qbmyoptions'    => 'हमार पन्ना',
+'qbfind' => 'खोज',
+'qbbrowse' => 'ब्राउज',
+'qbedit' => 'सम्पादन',
+'qbpageoptions' => 'ई पन्ना',
+'qbpageinfo' => 'प्रसंग',
+'qbmyoptions' => 'हमार पन्ना',
 'qbspecialpages' => 'विशेष पन्ना',
-'faq'            => 'साधारण सवाल',
-'faqpage'        => 'Project:साधारण सवाल',
+'faq' => 'साधारण सवाल',
+'faqpage' => 'Project:साधारण सवाल',
 
 # Vector skin
-'vector-action-delete'    => 'मिटाईं',
-'vector-action-move'      => 'स्थांतरण',
-'vector-action-protect'   => 'संरक्षित करीं',
-'vector-action-undelete'  => 'मत मिटाईं',
+'vector-action-delete' => 'मिटाईं',
+'vector-action-move' => 'स्थांतरण',
+'vector-action-protect' => 'संरक्षित करीं',
+'vector-action-undelete' => 'मत मिटाईं',
 'vector-action-unprotect' => 'असुरक्षित करीं',
-'vector-view-create'      => 'बनाईं',
-'vector-view-edit'        => 'सम्पादन',
-'vector-view-history'     => 'इतिहास देखीं',
-'vector-view-view'        => 'पढ़ीं',
-'vector-view-viewsource'  => 'स्त्रोत देखीं',
-
-'errorpagetitle'    => 'त्रुटी',
-'returnto'          => 'जाईं $1 पर।',
-'tagline'           => 'भोजपुरी {{SITENAME}} से',
-'help'              => 'मदद',
-'search'            => 'खोज',
-'searchbutton'      => 'खोजीं',
-'go'                => 'जाईं',
-'searcharticle'     => 'जाईं',
-'history'           => 'पन्ना के इतिहास',
-'history_short'     => 'इतिहास',
-'updatedmarker'     => 'हमार अन्तिम आगमन से बदलाव',
-'printableversion'  => 'छापे लायक संस्करण',
-'permalink'         => 'स्थायी लिंक',
-'print'             => 'छापीं',
-'edit'              => 'सम्पादन',
-'create'            => 'बनाईं',
-'editthispage'      => 'ई पन्ना के सम्पादन करीं',
-'create-this-page'  => 'ई पन्ना के निर्माण करीं',
-'delete'            => 'मिटाईं',
-'deletethispage'    => 'ई पन्ना के मिटाईं',
-'protect'           => 'संरक्षण करीं',
-'protect_change'    => 'बदलीं',
-'protectthispage'   => 'इ पन्ना के सुरक्षित करीं।',
-'unprotect'         => 'असुरक्षित करीं',
+'vector-view-create' => 'बनाईं',
+'vector-view-edit' => 'सम्पादन',
+'vector-view-history' => 'इतिहास देखीं',
+'vector-view-view' => 'पढ़ीं',
+'vector-view-viewsource' => 'स्त्रोत देखीं',
+
+'errorpagetitle' => 'त्रुटी',
+'returnto' => 'जाईं $1 पर।',
+'tagline' => 'भोजपुरी {{SITENAME}} से',
+'help' => 'मदद',
+'search' => 'खोज',
+'searchbutton' => 'खोजीं',
+'go' => 'जाईं',
+'searcharticle' => 'जाईं',
+'history' => 'पन्ना के इतिहास',
+'history_short' => 'इतिहास',
+'updatedmarker' => 'हमार अन्तिम आगमन से बदलाव',
+'printableversion' => 'छापे लायक संस्करण',
+'permalink' => 'स्थायी लिंक',
+'print' => 'छापीं',
+'edit' => 'सम्पादन',
+'create' => 'बनाईं',
+'editthispage' => 'ई पन्ना के सम्पादन करीं',
+'create-this-page' => 'ई पन्ना के निर्माण करीं',
+'delete' => 'मिटाईं',
+'deletethispage' => 'ई पन्ना के मिटाईं',
+'protect' => 'संरक्षण करीं',
+'protect_change' => 'बदलीं',
+'protectthispage' => 'इ पन्ना के सुरक्षित करीं।',
+'unprotect' => 'असुरक्षित करीं',
 'unprotectthispage' => 'इ पन्ना के असुरक्षित करीं',
-'newpage'           => 'नया पन्ना',
-'talkpage'          => 'इ पन्ना पर चर्चा करीं',
-'talkpagelinktext'  => 'बात-चीत',
-'specialpage'       => 'ख़ाश पन्ना',
-'personaltools'     => 'ब्यक्तिगत औजार',
-'postcomment'       => 'नया खण्ड',
-'articlepage'       => 'सामग्री पन्ना देखीं',
-'talk'              => 'बात-चीत',
-'views'             => 'विचारसूची',
-'toolbox'           => 'औजार-पेटी',
-'userpage'          => 'प्रयोगकर्ता पन्ना देखीं',
-'projectpage'       => 'परियोजना पन्ना देखीं',
-'imagepage'         => 'फाईल पन्ना देखीँ',
-'mediawikipage'     => 'सन्देश पन्ना देखीं',
-'templatepage'      => 'टेम्पलेट पन्ना देखीं',
-'viewhelppage'      => 'मदद पन्ना देखीं',
-'categorypage'      => 'श्रेणी पन्ना देखीं',
-'viewtalkpage'      => 'बात-चीत देखीं',
-'otherlanguages'    => 'अन्य भाषा में',
-'redirectedfrom'    => '($1 द्वारा पुन: निर्देशित)',
-'redirectpagesub'   => 'पुन: निर्देशित पन्ना',
-'lastmodifiedat'    => '$1 के $2 पर ई पन्ना पर अन्तिम बार परिवर्तन भईल।',
-'protectedpage'     => 'सुरक्षित पन्ना',
-'jumpto'            => 'अहिजा जाईं:',
-'jumptonavigation'  => 'परिभ्रमण',
-'jumptosearch'      => 'खोजीं',
-'view-pool-error'   => 'क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।
+'newpage' => 'नया पन्ना',
+'talkpage' => 'इ पन्ना पर चर्चा करीं',
+'talkpagelinktext' => 'बात-चीत',
+'specialpage' => 'ख़ाश पन्ना',
+'personaltools' => 'ब्यक्तिगत औजार',
+'postcomment' => 'नया खण्ड',
+'articlepage' => 'सामग्री पन्ना देखीं',
+'talk' => 'बात-चीत',
+'views' => 'विचारसूची',
+'toolbox' => 'औजार-पेटी',
+'userpage' => 'प्रयोगकर्ता पन्ना देखीं',
+'projectpage' => 'परियोजना पन्ना देखीं',
+'imagepage' => 'फाईल पन्ना देखीँ',
+'mediawikipage' => 'सन्देश पन्ना देखीं',
+'templatepage' => 'टेम्पलेट पन्ना देखीं',
+'viewhelppage' => 'मदद पन्ना देखीं',
+'categorypage' => 'श्रेणी पन्ना देखीं',
+'viewtalkpage' => 'बात-चीत देखीं',
+'otherlanguages' => 'अन्य भाषा में',
+'redirectedfrom' => '($1 द्वारा पुन: निर्देशित)',
+'redirectpagesub' => 'पुन: निर्देशित पन्ना',
+'lastmodifiedat' => '$1 के $2 पर ई पन्ना पर अन्तिम बार परिवर्तन भईल।',
+'protectedpage' => 'सुरक्षित पन्ना',
+'jumpto' => 'अहिजा जाईं:',
+'jumptonavigation' => 'परिभ्रमण',
+'jumptosearch' => 'खोजीं',
+'view-pool-error' => 'क्षमा करीं, ई समय सर्वर पर बहुत ज्यादा लोड बढ़ गईल बा।
 ई पन्ना के बहुते प्रयोगकर्ता लोग देखे के कोशिश कर रहल बानी।
 ई पन्ना के फिर से देखे से पहिले कृपया कुछ देर तक इन्तजार करीं।
 
 $1',
 
 # 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}}:लेखाधिकार',
-'currentevents'        => 'हाल के घटना',
-'currentevents-url'    => 'Project:हाल के घटना',
-'disclaimers'          => 'अस्विकरण',
-'disclaimerpage'       => 'Project:सामान्य अस्विकरण',
-'edithelp'             => 'मदद सम्पादन',
-'edithelppage'         => 'Help:सम्पादन',
-'mainpage'             => 'मुख्य पन्ना',
+'aboutsite' => '{{SITENAME}} के बारे में',
+'aboutpage' => 'Project:बारे में',
+'copyright' => 'सामग्री $1 के तहत उपलब्ध बा।',
+'copyrightpage' => '{{ns:project}}:लेखाधिकार',
+'currentevents' => 'हाल के घटना',
+'currentevents-url' => 'Project:हाल के घटना',
+'disclaimers' => 'अस्विकरण',
+'disclaimerpage' => 'Project:सामान्य अस्विकरण',
+'edithelp' => 'मदद सम्पादन',
+'edithelppage' => 'Help:सम्पादन',
+'mainpage' => 'मुख्य पन्ना',
 'mainpage-description' => 'पहिलका पन्ना',
-'portal'               => 'सामुदायिक पन्ना',
-'portal-url'           => 'Project:सामुदायिक पोर्टल',
-'privacy'              => 'गोपनीयता नीति',
-'privacypage'          => 'Project:गोपनीयता नीति',
+'portal' => 'सामुदायिक पन्ना',
+'portal-url' => 'Project:सामुदायिक पोर्टल',
+'privacy' => 'गोपनीयता नीति',
+'privacypage' => 'Project:गोपनीयता नीति',
 
-'badaccess'        => 'अनुमति त्रुटी',
+'badaccess' => 'अनुमति त्रुटी',
 'badaccess-group0' => 'रउआ जवन कार्रवाई खातिर अनुरोध कईले बानी उ के निष्पादन करे के अनुमति नईखे।',
 
-'ok'                      => 'ठिक',
-'retrievedfrom'           => '"$1" से लियल गईल',
-'youhavenewmessages'      => 'रउआ लगे बा $1 ($2).',
-'newmessageslink'         => 'नया सन्देश',
-'newmessagesdifflink'     => 'अन्तिम परिवर्तन',
+'ok' => 'ठिक',
+'retrievedfrom' => '"$1" से लियल गईल',
+'youhavenewmessages' => 'रउआ लगे बा $1 ($2).',
+'newmessageslink' => 'नया सन्देश',
+'newmessagesdifflink' => 'अन्तिम परिवर्तन',
 'youhavenewmessagesmulti' => 'रउआ लगे $1 पर नया सन्देश बा',
-'editsection'             => 'सम्पादन',
-'editold'                 => 'सम्पादन',
-'viewsourceold'           => 'स्त्रोत देखीं',
-'editlink'                => 'सम्पादन',
-'viewsourcelink'          => 'स्त्रोत देखीं',
-'editsectionhint'         => 'सम्पादन खण्ड: $1',
-'toc'                     => 'सामग्री',
-'showtoc'                 => 'देखाईं',
-'hidetoc'                 => 'छुपाईं',
-'thisisdeleted'           => 'देखीं या भंडार करीं $1?',
-'viewdeleted'             => '$1 देखब?',
-'site-rss-feed'           => '$1 आर एस एस फिड',
-'site-atom-feed'          => '$1 एटम फिड',
-'page-rss-feed'           => '"$1" आर एस एस फिड',
-'page-atom-feed'          => '"$1" एटम फिड',
-'red-link-title'          => '$1 (पन्ना मौजूद नईखे)।',
+'editsection' => 'सम्पादन',
+'editold' => 'सम्पादन',
+'viewsourceold' => 'स्त्रोत देखीं',
+'editlink' => 'सम्पादन',
+'viewsourcelink' => 'स्त्रोत देखीं',
+'editsectionhint' => 'सम्पादन खण्ड: $1',
+'toc' => 'सामग्री',
+'showtoc' => 'देखाईं',
+'hidetoc' => 'छुपाईं',
+'thisisdeleted' => 'देखीं या भंडार करीं $1?',
+'viewdeleted' => '$1 देखब?',
+'site-rss-feed' => '$1 आर एस एस फिड',
+'site-atom-feed' => '$1 एटम फिड',
+'page-rss-feed' => '"$1" आर एस एस फिड',
+'page-atom-feed' => '"$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' => 'श्रेणी',
 
 # Main script and global functions
-'nosuchaction'      => 'अईसन कौनो कार्रवाई नाहि',
+'nosuchaction' => 'अईसन कौनो कार्रवाई नाहि',
 'nosuchspecialpage' => 'अईसन कौनो ख़ाश पन्ना नाहि',
 'nospecialpagetext' => '<strong>रउआ एगो अवैद्य विशेष पन्ना के अनुरोध कईले बानी।</strong>
 
 वैद्य विशेष पन्ना के सूची मिल सकत बा [[Special:SpecialPages|{{int:specialpages}}]] पर।',
 
 # General errors
-'error'           => 'त्रुटी',
-'databaseerror'   => 'डेटाबेस त्रुटी',
-'readonly'        => 'डेटाबेस लॉक बा',
+'error' => 'त्रुटी',
+'databaseerror' => 'डेटाबेस त्रुटी',
+'readonly' => 'डेटाबेस लॉक बा',
 'missing-article' => 'डेटाबास ऊ पन्ना के पाठ्य के ना खोज पाईल जौन ई के खोजे के रहल, नामित "$1" $2.
 ई सब साधारणत: निम्नलिखीत अप्रचलित अन्तर अथवा एगो पन्ना पर इतिहास के लिंक जौन मिटा दिहल गईल बा के कारण भईल।
 
 यदि ई बात नईखे, त हो सकत बा सॉफ्टवेयर में बग पावत होखब।
 कृपया ई एगो  [[Special:ListUsers/sysop|प्रबन्धक]] के यू आर एल के बारे में एगो नोट बनाके खबर करीं।',
-'viewsource'      => 'स्त्रोत देखीं',
+'viewsource' => 'स्त्रोत देखीं',
 
 # Login and logout pages
-'yourname'                => 'प्रयोगकर्ता नाम',
-'yourpassword'            => 'गुप्त शब्द',
-'yourpasswordagain'       => 'गुप्त-शब्द पुन:डालीं:',
-'login'                   => 'खाता में प्रवेश',
+'yourname' => 'प्रयोगकर्ता नाम',
+'yourpassword' => 'गुप्त शब्द',
+'yourpasswordagain' => 'गुप्त-शब्द पुन:डालीं:',
+'login' => 'खाता में प्रवेश',
 'nav-login-createaccount' => 'खाता प्रवेश / खाता बनाईं',
-'loginprompt'             => '{{SITENAME}} में प्रवेश खातिर राउर कुकिज चालू होवे के चाहीं',
-'userlogin'               => 'खाता प्रवेश / खाता बनाईं',
-'userloginnocreate'       => 'खाता में प्रवेश',
-'logout'                  => 'खाता से बाहर',
-'userlogout'              => 'खाता से बाहर',
-'notloggedin'             => 'खाता में प्रवेश नईखीं भईल',
-'nologin'                 => 'का एगो खाता नईखे? $1.',
-'nologinlink'             => 'एगो खाता बनाईं',
-'createaccount'           => 'खाता बनाईं',
-'gotaccount'              => 'का पहिले से एगो खाता बा? $1.',
-'gotaccountlink'          => 'खाता में प्रवेश',
-'createaccountmail'       => 'ई-मेल द्वारा',
-'badretype'               => 'रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।',
-'userexists'              => 'ई प्रयोगकर्ता नाम पहिले से इस्तेमाल में बा। कृपया कौनो दोसर नाम चुनीं।',
-'loginerror'              => 'खाता प्रवेश में त्रुटि',
-'createaccounterror'      => 'ई खाता ना बन पाईल: $1',
-'nocookiesnew'            => 'प्रयोगकर्ता खाता त बन गईल, बाँकी रउआ प्रवेश नईखीं भईल।
+'loginprompt' => '{{SITENAME}} में प्रवेश खातिर राउर कुकिज चालू होवे के चाहीं',
+'userlogin' => 'खाता प्रवेश / खाता बनाईं',
+'userloginnocreate' => 'खाता में प्रवेश',
+'logout' => 'खाता से बाहर',
+'userlogout' => 'खाता से बाहर',
+'notloggedin' => 'खाता में प्रवेश नईखीं भईल',
+'nologin' => 'का एगो खाता नईखे? $1.',
+'nologinlink' => 'एगो खाता बनाईं',
+'createaccount' => 'खाता बनाईं',
+'gotaccount' => 'का पहिले से एगो खाता बा? $1.',
+'gotaccountlink' => 'खाता में प्रवेश',
+'createaccountmail' => 'ई-मेल द्वारा',
+'badretype' => 'रउआ जौन गुप्त शब्द डालत बानी उ नईखे मेल खात।',
+'userexists' => 'ई प्रयोगकर्ता नाम पहिले से इस्तेमाल में बा। कृपया कौनो दोसर नाम चुनीं।',
+'loginerror' => 'खाता प्रवेश में त्रुटि',
+'createaccounterror' => 'ई खाता ना बन पाईल: $1',
+'nocookiesnew' => 'प्रयोगकर्ता खाता त बन गईल, बाँकी रउआ प्रवेश नईखीं भईल।
 {{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
 राउर कुकिज असक्षम बा।
 कृपया उ के सक्षम करीं, उ के बाद राउर नया प्रयोगकर्ता नाम आ गुप्त शब्द के साथ प्रवेश करीं।',
-'nocookieslogin'          => '{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
+'nocookieslogin' => '{{SITENAME}} प्रयोगकर्ता लोग के खाता में प्रवेश करावे खातिर कुकिज के प्रयोग करेला।
 राउर कुकिज असक्षम बा।
 कृपया उ के सक्षम करीं आ फिर से कोशिश करीं',
-'noname'                  => 'रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।',
-'loginsuccesstitle'       => 'खाता प्रवेश में सफल',
-'loginsuccess'            => "''' \"\$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
-'nosuchuser'              => '"$1" नाम से कौनो प्रयोगकर्ता नईखन।
+'noname' => 'रउआ उपयुक्त प्रयोगकर्ता नाम नईखीं निर्दिष्ट कईले।',
+'loginsuccesstitle' => 'खाता प्रवेश में सफल',
+'loginsuccess' => "''' \"\$1\" के रुप में रउआ {{SITENAME}} में अब प्रवेश कर चुकल बानी।'''",
+'nosuchuser' => '"$1" नाम से कौनो प्रयोगकर्ता नईखन।
 प्रयोगकर्ता नाम संवेदनशील मामला बा।
 शब्द-वर्तनी के जाँच करीं, आ चाहे [[Special:UserLogin/signup|एगो नया खाता बनाईं]]।',
-'nosuchusershort'         => 'ई नाम से कौनो प्रयोगकर्ता नईखन "$1".
+'nosuchusershort' => 'ई नाम से कौनो प्रयोगकर्ता नईखन "$1".
 आपन शब्द-वर्तनी के जाँच करीं।',
-'nouserspecified'         => 'रउआ एगो प्रयोगकर्ता नाम निर्दिष्ट करे के बा।',
-'login-userblocked'       => 'ई प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।',
-'wrongpassword'           => 'गलत गुप्त-शब्द डलले बानी।
+'nouserspecified' => 'रउआ एगो प्रयोगकर्ता नाम निर्दिष्ट करे के बा।',
+'login-userblocked' => 'ई प्रयोगकर्ता के खाता निष्क्रिय हो चुकल बा। प्रवेश के आज्ञा नईखे।',
+'wrongpassword' => 'गलत गुप्त-शब्द डलले बानी।
 कृपया फिर से कोशिश करीं।',
-'wrongpasswordempty'      => 'गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।',
-'passwordtooshort'        => 'गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।',
-'password-name-match'     => 'राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।',
-'mailmypassword'          => 'नया गुप्त-शब्द ई-मेल पर भेजीं',
-'passwordremindertitle'   => '{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द',
+'wrongpasswordempty' => 'गुप्त-शब्द खाली बा। कृपया फिर से कोशिश करीं।',
+'passwordtooshort' => 'गुप्त-शब्द कम से कम {{PLURAL:$1|1 अक्षर|$1 अक्षर}} के होवे के चाहीं।',
+'password-name-match' => 'राउर गुप्त-शब्द राउर प्रयोगकर्ता नाम से अलग होवे के चाहीं।',
+'mailmypassword' => 'नया गुप्त-शब्द ई-मेल पर भेजीं',
+'passwordremindertitle' => '{{SITENAME}} खातिर नया अस्थायी गुप्त-शब्द',
 
 # Change password dialog
-'resetpass'   => 'गुप्त-शब्द बदलीं',
+'resetpass' => 'गुप्त-शब्द बदलीं',
 'oldpassword' => 'पुराना गुप्त-शब्द:',
 'newpassword' => 'नया गुप्त-शब्द:',
-'retypenew'   => 'नया गुप्त-शब्द पुन: डालीं:',
+'retypenew' => 'नया गुप्त-शब्द पुन: डालीं:',
 
 # Edit page toolbar
-'bold_tip'        => 'मोट पाठ्य',
-'italic_sample'   => 'इटालिक पाठ्य',
-'italic_tip'      => 'इटालिक पाठ्य',
+'bold_tip' => 'मोट पाठ्य',
+'italic_sample' => 'इटालिक पाठ्य',
+'italic_tip' => 'इटालिक पाठ्य',
 'headline_sample' => 'शिर्षक पाठ्य',
-'image_sample'    => 'उदाहरण.jpg',
-'media_sample'    => 'उदाहरण.ogg',
-'media_tip'       => 'फाईल लिंक',
-'sig_tip'         => 'timestamp के साथ राउर हस्ताक्षर',
+'image_sample' => 'उदाहरण.jpg',
+'media_sample' => 'उदाहरण.ogg',
+'media_tip' => 'फाईल लिंक',
+'sig_tip' => 'timestamp के साथ राउर हस्ताक्षर',
 
 # Edit pages
-'summary'              => 'सारांश:',
-'subject'              => 'विषय/शिर्षक:',
-'minoredit'            => 'छोट परिवर्तन',
-'watchthis'            => 'ई पन्ना ध्यानसूची में डालीं',
-'savearticle'          => 'पन्ना सुरक्षित करीं',
-'preview'              => 'पूर्वावलोकन',
-'showpreview'          => 'पूर्वावलोकन देखाईं',
-'showlivepreview'      => 'सीधा पूर्वावलोकन',
-'showdiff'             => 'परिवर्तन देखाईं',
-'anoneditwarning'      => "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
-'anonpreviewwarning'   => "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
-'missingsummary'       => "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
-'missingcommenttext'   => 'कृपया निचे एगो टिप्पणी करीं।',
+'summary' => 'सारांश:',
+'subject' => 'विषय/शिर्षक:',
+'minoredit' => 'छोट परिवर्तन',
+'watchthis' => 'ई पन्ना ध्यानसूची में डालीं',
+'savearticle' => 'पन्ना सुरक्षित करीं',
+'preview' => 'पूर्वावलोकन',
+'showpreview' => 'पूर्वावलोकन देखाईं',
+'showlivepreview' => 'सीधा पूर्वावलोकन',
+'showdiff' => 'परिवर्तन देखाईं',
+'anoneditwarning' => "'''चेतावनी:''' रउआ आपन खाता में प्रवेश नईखीं कईले। ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज कईल जाई।",
+'anonpreviewwarning' => "''रउआ खाता में प्रवेश नईखीं भईल। सुरक्षित करेब त ई पन्ना के सम्पादन इतिहास पर राउर आई पी पता दर्ज हो जाई।\"",
+'missingsummary' => "'''स्मरणपत्र:'''रउआ एगो सारांश के सम्पादन नईखीं प्रदान कईले। अगर रउआ \"फिर से सुरक्षित करीं\" पर क्लिक करेब, त राउर सम्पादन बिना एगो सारांश के सुरक्षित हो जाई।",
+'missingcommenttext' => 'कृपया निचे एगो टिप्पणी करीं।',
 'missingcommentheader' => "'''स्मरणपत्र:''' रउआ ई टिप्पणी खातिर कौनो विषय/शिर्षक प्रदान नईखीं कईले। \"{{int:savearticle}}\" यदि रउआ फिर से सुरक्षित करब त राउर सम्पादन बिना कौनो शिर्षक के सुरक्षित हो जाई।",
-'summary-preview'      => 'सारांश पूर्वावलोकन:',
-'subject-preview'      => 'विषय/शिर्षक पूर्वावलोकन:',
-'blockedtitle'         => 'निष्क्रिय प्रयोगकर्ता',
-'blockednoreason'      => 'कउनो कारण उल्लेखित नईखे',
-'nosuchsectiontitle'   => 'खण्ड ना मिल सकल।',
-'loginreqtitle'        => 'खाता में प्रवेश जरुरी बा',
-'loginreqlink'         => 'खाता में प्रवेश',
-'accmailtitle'         => 'गुप्त-शब्द भेजा गईल',
-'newarticle'           => '(नया)',
-'newarticletext'       => "रउआ एगो अइसन लिंक के पन्ना के अनुसरण कइले बानी जउन अभी तक उपलब्ध नइखे।
+'summary-preview' => 'सारांश पूर्वावलोकन:',
+'subject-preview' => 'विषय/शिर्षक पूर्वावलोकन:',
+'blockedtitle' => 'निष्क्रिय प्रयोगकर्ता',
+'blockednoreason' => 'कउनो कारण उल्लेखित नईखे',
+'nosuchsectiontitle' => 'खण्ड ना मिल सकल।',
+'loginreqtitle' => 'खाता में प्रवेश जरुरी बा',
+'loginreqlink' => 'खाता में प्रवेश',
+'accmailtitle' => 'गुप्त-शब्द भेजा गईल',
+'newarticle' => '(नया)',
+'newarticletext' => "रउआ एगो अइसन लिंक के पन्ना के अनुसरण कइले बानी जउन अभी तक उपलब्ध नइखे।
 पन्ना बनावे खातिर, नीचे के बाकस में टाईप करे के शुरु करीं (ज्यादा जानकारी खातिर देखीं [[{{MediaWiki:Helppage}}|मदद पन्ना]])।
 यदि रउआ अहिजा गलती से आ गईल बानी त, आपन ब्राउजर के '''back''' (बैक) बटन दबाईं",
-'yourdiff'             => 'अंतर',
-'template-protected'   => '(संरक्षित)',
+'yourdiff' => 'अंतर',
+'template-protected' => '(संरक्षित)',
 
 # History pages
-'revisionasof'           => '$1 के रुप में संशोधन',
-'revision-info'          => '$2 में से $1 के रुप में संशोधन',
-'previousrevision'       => '← पुरान संशोधन',
-'nextrevision'           => 'नया संशोधन →',
-'currentrevisionlink'    => 'हाल के संशोधन',
-'cur'                    => 'हाल',
-'next'                   => 'अगिला',
-'last'                   => 'पछिला',
-'page_first'             => 'पहिलका',
-'page_last'              => 'आखिरी',
-'histlegend'             => "चुनाव अन्तर: तुलना करे खातिर संशोधन के रेडियो बटन पर निशान लगाईं आ enter बटन दबाईं आ चाहे निचला बटन दबाईं।<br />
+'revisionasof' => '$1 के रुप में संशोधन',
+'revision-info' => '$2 में से $1 के रुप में संशोधन',
+'previousrevision' => '← पुरान संशोधन',
+'nextrevision' => 'नया संशोधन →',
+'currentrevisionlink' => 'हाल के संशोधन',
+'cur' => 'हाल',
+'next' => 'अगिला',
+'last' => 'पछिला',
+'page_first' => 'पहिलका',
+'page_last' => 'आखिरी',
+'histlegend' => "चुनाव अन्तर: तुलना करे खातिर संशोधन के रेडियो बटन पर निशान लगाईं आ enter बटन दबाईं आ चाहे निचला बटन दबाईं।<br />
 Legend: '''({{int:cur}})''' = हाल के संशोधन के साथ अंतर, '''({{int:last}})''' = पुर्ववर्ती संशोधन के साथ अंतर, '''{{int:minoreditletter}}''' = छोट सम्पादन।",
 'history-fieldset-title' => 'इतिहास निहारीं',
-'history-show-deleted'   => 'खाली मेटावल',
-'histfirst'              => 'बहुत पहिले के',
-'histlast'               => 'हाल के',
-'historysize'            => '({{PLURAL:$1|1 बाइट|$1 बाइट}})',
-'historyempty'           => '(खाली)',
+'history-show-deleted' => 'खाली मेटावल',
+'histfirst' => 'बहुत पहिले के',
+'histlast' => 'हाल के',
+'historysize' => '({{PLURAL:$1|1 बाइट|$1 बाइट}})',
+'historyempty' => '(खाली)',
 
 # Revision feed
-'history-feed-title'          => 'संशोधन इतिहास',
-'history-feed-description'    => 'विकि पर इ पन्ना के संशोधन के इतिहास',
+'history-feed-title' => 'संशोधन इतिहास',
+'history-feed-description' => 'विकि पर इ पन्ना के संशोधन के इतिहास',
 'history-feed-item-nocomment' => '$1 $2 पर',
-'history-feed-empty'          => 'अनुरोध करल गईल पन्ना उपलब्ध नईखे। हो सकत बा उ के विकि पर से मिटा दिहल गईल होखे, आ चाहे उ के नाम बदल देवल गईल होखे।
+'history-feed-empty' => 'अनुरोध करल गईल पन्ना उपलब्ध नईखे। हो सकत बा उ के विकि पर से मिटा दिहल गईल होखे, आ चाहे उ के नाम बदल देवल गईल होखे।
 प्रासंगिक पन्ना के [[Special:Search|विकि पर खोजे के]] कोशिश करत रहीं।',
 
 # Revision deletion
-'rev-deleted-comment'         => '(टिप्पणी मिटा दिहल गईल बा)',
-'rev-deleted-user'            => '(प्रयोगकर्ता के नाम मिटा दिहल गईल बा)',
-'rev-deleted-event'           => '(लॉग कार्रवाई मिटा दिहल गईल बा)',
-'rev-deleted-user-contribs'   => '[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]',
+'rev-deleted-comment' => '(टिप्पणी मिटा दिहल गईल बा)',
+'rev-deleted-user' => '(प्रयोगकर्ता के नाम मिटा दिहल गईल बा)',
+'rev-deleted-event' => '(लॉग कार्रवाई मिटा दिहल गईल बा)',
+'rev-deleted-user-contribs' => '[प्रयोगकर्ता नाम आ चाहे आइ पी पता हटा दिहल गईल बा - योगदान से सम्पादन छुप गईल बा]',
 'rev-deleted-text-permission' => "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।
 मेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
-'rev-delundel'                => 'दिखाईं/छुपाईं',
-'revdel-restore'              => 'दूश्यता बदलीं',
-'revdel-restore-deleted'      => 'मिटल संसोधन',
-'revdel-restore-visible'      => 'दृश्यमान संसोधन',
-'pagehist'                    => 'पन्ना के इतिहास',
-'deletedhist'                 => 'मिटावल इतिहास',
+'rev-delundel' => 'दिखाईं/छुपाईं',
+'revdel-restore' => 'दूश्यता बदलीं',
+'revdel-restore-deleted' => 'मिटल संसोधन',
+'revdel-restore-visible' => 'दृश्यमान संसोधन',
+'pagehist' => 'पन्ना के इतिहास',
+'deletedhist' => 'मिटावल इतिहास',
 
 # Merge log
-'revertmerge'      => 'अलग करीं',
+'revertmerge' => 'अलग करीं',
 'mergelogpagetext' => 'एक पन्ना इतिहास के दुसर पन्ना इतिहास में तुरंत विलय भईल एगो सूची नीचे दिहल बा।',
 
 # Diffs
-'history-title'            => "''$1'' के संशोधन इतिहास",
-'difference'               => '(संशोधन के बीच अन्तर)',
-'lineno'                   => 'पंक्ति $1:',
-'compareselectedversions'  => 'चुनल गईल संशोधन में अन्तर देखीं',
+'history-title' => "''$1'' के संशोधन इतिहास",
+'lineno' => 'पंक्ति $1:',
+'compareselectedversions' => 'चुनल गईल संशोधन में अन्तर देखीं',
 'showhideselectedversions' => 'चुनल गईल संशोधन दिखाईं/छुपाईं',
-'editundo'                 => 'पूर्ववत',
-'diff-multi'               => '({{PLURAL:$1|एगो मध्यम संशोधन|$1 गो मध्यम संशोधन}} नईखे दिखावल)',
+'editundo' => 'पूर्ववत',
+'diff-multi' => '({{PLURAL:$1|एगो मध्यम संशोधन|$1 गो मध्यम संशोधन}} नईखे दिखावल)',
 
 # Search results
-'searchresults'                    => 'खोज परिणाम',
-'searchresults-title'              => '$1 खातिर खोज परिणाम',
-'searchresulttext'                 => '{{SITENAME}} के खोज करे के बारे में अधिक जानकारी खातिर, देखीं [[{{MediaWiki:Helppage}}| {{int:help}}]]।',
-'searchsubtitle'                   => '\'\'\'[[:$1]]\'\'\' खातिर राउर करल गईल खोज ([[Special:Prefixindex/$1| "$1" से शुरु होवे वाला सब पन्ना]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
-'searchsubtitleinvalid'            => "रउआ '''$1''' खातिर खोज कईनी ह",
-'titlematches'                     => 'पन्ना के शिर्षक मिलत बा।',
-'notitlematches'                   => 'पन्ना के शिर्षक नईखे मिलत',
-'textmatches'                      => 'पन्ना के पाठ्य मिलत बा',
-'notextmatches'                    => 'पन्ना के पाठ्य नईखे मिलत',
-'prevn'                            => 'पिछला {{PLURAL:$1|$1}}',
-'nextn'                            => 'अगला {{PLURAL:$1|$1}}',
-'prevn-title'                      => 'पिछला $1 {{PLURAL:$1|परिणाम}}',
-'nextn-title'                      => 'अगला $1 {{PLURAL:$1|परिणाम}}',
-'shown-title'                      => 'दिखाईं $1 {{PLURAL:$1|परिणाम}}',
-'viewprevnext'                     => 'देखीं ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend'                => 'खोज विकल्प',
-'searchmenu-exists'                => "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
-'searchmenu-new'                   => "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
-'searchhelp-url'                   => 'Help:सामग्री',
-'searchmenu-prefix'                => '[[विशेष:उपसर्ग सूची/$1|इ उपसर्ग साथे पन्ना ब्राउज करीं]]',
-'searchprofile-articles'           => 'सामग्री पन्ना',
-'searchprofile-project'            => 'मदद आ परियोजना पन्ना',
-'searchprofile-images'             => 'मल्टिमीडिया',
-'searchprofile-everything'         => 'सब कुछ',
-'searchprofile-advanced'           => 'अग्रिम',
-'searchprofile-articles-tooltip'   => '$1 में खोजीं',
-'searchprofile-project-tooltip'    => '$1 में खोजीं',
-'searchprofile-images-tooltip'     => 'फाईल खातिर खोज',
+'searchresults' => 'खोज परिणाम',
+'searchresults-title' => '$1 खातिर खोज परिणाम',
+'searchresulttext' => '{{SITENAME}} के खोज करे के बारे में अधिक जानकारी खातिर, देखीं [[{{MediaWiki:Helppage}}| {{int:help}}]]।',
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\' खातिर राउर करल गईल खोज ([[Special:Prefixindex/$1| "$1" से शुरु होवे वाला सब पन्ना]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
+'searchsubtitleinvalid' => "रउआ '''$1''' खातिर खोज कईनी ह",
+'titlematches' => 'पन्ना के शिर्षक मिलत बा।',
+'notitlematches' => 'पन्ना के शिर्षक नईखे मिलत',
+'textmatches' => 'पन्ना के पाठ्य मिलत बा',
+'notextmatches' => 'पन्ना के पाठ्य नईखे मिलत',
+'prevn' => 'पिछला {{PLURAL:$1|$1}}',
+'nextn' => 'अगला {{PLURAL:$1|$1}}',
+'prevn-title' => 'पिछला $1 {{PLURAL:$1|परिणाम}}',
+'nextn-title' => 'अगला $1 {{PLURAL:$1|परिणाम}}',
+'shown-title' => 'दिखाईं $1 {{PLURAL:$1|परिणाम}}',
+'viewprevnext' => 'देखीं ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-legend' => 'खोज विकल्प',
+'searchmenu-exists' => "'''इ विकि पर ''[[:$1]]'' नाम से एगो पन्ना उपलब्ध बा'''",
+'searchmenu-new' => "'''इ विकि पर ''[[:$1]]'' नाम से पन्ना बनाईं'''",
+'searchhelp-url' => 'Help:सामग्री',
+'searchmenu-prefix' => '[[विशेष:उपसर्ग सूची/$1|इ उपसर्ग साथे पन्ना ब्राउज करीं]]',
+'searchprofile-articles' => 'सामग्री पन्ना',
+'searchprofile-project' => 'मदद आ परियोजना पन्ना',
+'searchprofile-images' => 'मल्टिमीडिया',
+'searchprofile-everything' => 'सब कुछ',
+'searchprofile-advanced' => 'अग्रिम',
+'searchprofile-articles-tooltip' => '$1 में खोजीं',
+'searchprofile-project-tooltip' => '$1 में खोजीं',
+'searchprofile-images-tooltip' => 'फाईल खातिर खोज',
 'searchprofile-everything-tooltip' => 'सभन सामग्री में खोजीं (वार्ता पन्ना सहित)',
-'search-result-size'               => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
-'search-result-score'              => 'प्रासंगिकता: $1%',
-'search-redirect'                  => '(पुन: निर्देशण $1)',
-'search-section'                   => '(खंड $1)',
-'search-suggest'                   => 'का राउर मतलब बा: $1',
-'search-interwiki-caption'         => 'बहिन परियोजना',
-'search-interwiki-default'         => '$1 के परिणाम:',
-'search-interwiki-more'            => '(अउर)',
-'search-mwsuggest-enabled'         => 'सुझाव के साथ',
-'search-mwsuggest-disabled'        => 'कौनो सुझाव ना',
-'search-relatedarticle'            => 'संबंधित',
-'mwsuggest-disable'                => 'AJAX सुझाव असक्षम',
-'searcheverything-enable'          => 'सभन सन्दर्भ में खोजीं',
-'searchrelated'                    => 'संबंधित',
-'searchall'                        => 'सब',
-'showingresults'                   => "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
-'showingresultsnum'                => "नीचे देखावल जा रहल बा {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
-'powersearch'                      => 'उन्नत खोज',
-'powersearch-legend'               => 'उन्नत खोज',
-'powersearch-ns'                   => 'सन्दर्भ में खोजीं',
-'powersearch-redir'                => 'पुन:निर्देश सूची',
-'powersearch-field'                => 'खातिर खोज',
-'powersearch-togglelabel'          => 'जाँच:',
-'powersearch-toggleall'            => 'सब',
-'powersearch-togglenone'           => 'कउनो ना',
-'search-external'                  => 'बाहरी खोज',
+'search-result-size' => '$1 ({{PLURAL:$2|1 शब्द|$2 शब्द}})',
+'search-result-score' => 'प्रासंगिकता: $1%',
+'search-redirect' => '(पुन: निर्देशण $1)',
+'search-section' => '(खंड $1)',
+'search-suggest' => 'का राउर मतलब बा: $1',
+'search-interwiki-caption' => 'बहिन परियोजना',
+'search-interwiki-default' => '$1 के परिणाम:',
+'search-interwiki-more' => '(अउर)',
+'search-mwsuggest-enabled' => 'सुझाव के साथ',
+'search-mwsuggest-disabled' => 'कौनो सुझाव ना',
+'search-relatedarticle' => 'संबंधित',
+'mwsuggest-disable' => 'AJAX सुझाव असक्षम',
+'searcheverything-enable' => 'सभन सन्दर्भ में खोजीं',
+'searchrelated' => 'संबंधित',
+'searchall' => 'सब',
+'showingresults' => "नीचे देखावल जा रहल बा {{PLURAL:$1|'''1''' परिणाम|'''$1''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
+'showingresultsnum' => "नीचे देखावल जा रहल बा {{PLURAL:$3|'''1''' परिणाम|'''$3''' परिणाम}} #'''$2''' से शुरु होवे वाला।",
+'powersearch' => 'उन्नत खोज',
+'powersearch-legend' => 'उन्नत खोज',
+'powersearch-ns' => 'सन्दर्भ में खोजीं',
+'powersearch-redir' => 'पुन:निर्देश सूची',
+'powersearch-field' => 'खातिर खोज',
+'powersearch-togglelabel' => 'जाँच:',
+'powersearch-toggleall' => 'सब',
+'powersearch-togglenone' => 'कउनो ना',
+'search-external' => 'बाहरी खोज',
 
 # Quickbar
 'qbsettings-none' => 'कउनो ना',
 
 # Preferences page
-'preferences'    => 'वरीयता',
-'mypreferences'  => 'हमार पसन्द',
-'prefs-edits'    => 'सम्पादन संख्या',
-'prefsnologin'   => 'खाता में प्रवेश नईखीं कईले',
+'preferences' => 'वरीयता',
+'mypreferences' => 'हमार पसन्द',
+'prefs-edits' => 'सम्पादन संख्या',
+'prefsnologin' => 'खाता में प्रवेश नईखीं कईले',
 'changepassword' => 'गुप्त शब्द बदलीं',
-'skin-preview'   => 'पूर्वावलोकन',
-'prefs-rc'       => 'तुरंत भईल परिवर्तन',
+'skin-preview' => 'पूर्वावलोकन',
+'prefs-rc' => 'तुरंत भईल परिवर्तन',
 
 # Recent changes
-'recentchanges'                     => 'तुरंत भईल परिवर्तन',
-'rcshowhideminor'                   => '$1 छोट सम्पादन',
-'diff'                              => 'अन्तर',
-'hist'                              => 'इति',
-'hide'                              => 'छुपाँई',
-'show'                              => 'दिखाईं',
-'minoreditletter'                   => 'छो',
-'newpageletter'                     => 'न',
-'boteditletter'                     => 'बो',
+'recentchanges' => 'तुरंत भईल परिवर्तन',
+'rcshowhideminor' => '$1 छोट सम्पादन',
+'diff' => 'अन्तर',
+'hist' => 'इति',
+'hide' => 'छुपाँई',
+'show' => 'दिखाईं',
+'minoreditletter' => 'छो',
+'newpageletter' => 'न',
+'boteditletter' => 'बो',
 'number_of_watching_users_pageview' => '[$1 देखल जा रहल बा {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता}}]',
 
 # Recent changes linked
-'recentchangeslinked'         => 'सम्बन्धित बदलाव',
-'recentchangeslinked-feed'    => 'सम्बन्धित बदलाव',
+'recentchangeslinked' => 'सम्बन्धित बदलाव',
+'recentchangeslinked-feed' => 'सम्बन्धित बदलाव',
 'recentchangeslinked-toolbox' => 'सम्बन्धित बदलाव',
 
 # Upload
 'upload' => 'फाईल लादीं',
 
 # File description page
-'filehist'                          => 'पन्ना के इतिहास',
-'filehist-deleteall'                => 'सब मिटाईं',
-'filehist-deleteone'                => 'मिटाईं',
-'filehist-current'                  => 'मौजूदा',
-'filehist-datetime'                 => 'तारिख/समय',
-'filehist-thumb'                    => 'थम्बनेल',
-'filehist-nothumb'                  => 'बिन थम्बनेल',
-'filehist-user'                     => 'प्रयोगकर्ता',
-'filehist-dimensions'               => 'आयाम',
-'filehist-filesize'                 => 'फाईल के आकार',
-'filehist-comment'                  => 'टिप्पणी',
-'filehist-missing'                  => 'गायब फाईल',
-'imagelinks'                        => 'फाईल लिंक',
-'nolinkstoimage'                    => 'इ फाईल जोड़े कौनो फाइल लिंक नईखे।',
-'morelinkstoimage'                  => 'इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।',
-'sharedupload'                      => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।',
-'sharedupload-desc-there'           => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा। अधिक जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखीं।',
-'filepage-nofile'                   => 'इ नाम से कौनो फाईल उपलब्ध नईखे।',
-'filepage-nofile-link'              => 'इ नाम से कौनो फाईल उपलब्ध नईखे, लेकिन रउआ [$1 के लाद] सकत बानी।',
-'uploadnewversion-linktext'         => 'इ फाईल के नया संस्करण लादीं।',
-'shared-repo-from'                  => '$1 से',
-'shared-repo'                       => 'एगो आवटिंत भंडार गृह',
+'filehist' => 'पन्ना के इतिहास',
+'filehist-deleteall' => 'सब मिटाईं',
+'filehist-deleteone' => 'मिटाईं',
+'filehist-current' => 'मौजूदा',
+'filehist-datetime' => 'तारिख/समय',
+'filehist-thumb' => 'थम्बनेल',
+'filehist-nothumb' => 'बिन थम्बनेल',
+'filehist-user' => 'प्रयोगकर्ता',
+'filehist-dimensions' => 'आयाम',
+'filehist-filesize' => 'फाईल के आकार',
+'filehist-comment' => 'टिप्पणी',
+'filehist-missing' => 'गायब फाईल',
+'imagelinks' => 'फाईल लिंक',
+'nolinkstoimage' => 'इ फाईल जोड़े कौनो फाइल लिंक नईखे।',
+'morelinkstoimage' => 'इ फाइल संगे जुड़ल [[Special:WhatLinksHere/$1|सब लिंक]] देखीं।',
+'sharedupload' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा।',
+'sharedupload-desc-there' => 'इ फाईल $1 से बा आ दुसर परियोजना में प्रयोग करल जा सकत बा। अधिक जानकारी खातिर कृपया [$2 फाईल विवरण पन्ना] देखीं।',
+'filepage-nofile' => 'इ नाम से कौनो फाईल उपलब्ध नईखे।',
+'filepage-nofile-link' => 'इ नाम से कौनो फाईल उपलब्ध नईखे, लेकिन रउआ [$1 के लाद] सकत बानी।',
+'uploadnewversion-linktext' => 'इ फाईल के नया संस्करण लादीं।',
+'shared-repo-from' => '$1 से',
+'shared-repo' => 'एगो आवटिंत भंडार गृह',
 'shared-repo-name-wikimediacommons' => 'विकिमीडिया कॉमन्स',
 
 # File reversion
-'filerevert'         => 'पुन: निर्देशित $1',
-'filerevert-legend'  => 'पुन: निर्देशित फाईल',
+'filerevert' => 'पुन: निर्देशित $1',
+'filerevert-legend' => 'पुन: निर्देशित फाईल',
 'filerevert-comment' => 'कारण:',
 
 # File deletion
-'filedelete'         => '$1 के मिटाईं',
-'filedelete-legend'  => 'फाईल के मिटाईं',
+'filedelete' => '$1 के मिटाईं',
+'filedelete-legend' => 'फाईल के मिटाईं',
 'filedelete-comment' => 'कारण:',
-'filedelete-submit'  => 'मिटाईं',
+'filedelete-submit' => 'मिटाईं',
 'filedelete-success' => "'''$1''' के मिटा दिहल गईल बा।",
-'filedelete-nofile'  => "'''$1''' उपलब्ध नईखे।",
+'filedelete-nofile' => "'''$1''' उपलब्ध नईखे।",
 
 # Random page
 'randompage' => 'अविशिष्ट पन्ना',
 
 # Miscellaneous special pages
-'nbytes'       => '$1 {{PLURAL:$1|बाईट|बाईट्स}}',
-'move'         => 'स्थान्तरण',
+'nbytes' => '$1 {{PLURAL:$1|बाईट|बाईट्स}}',
+'move' => 'स्थान्तरण',
 'movethispage' => 'ई पन्ना के स्थांतरण करीं',
 
 # Book sources
@@ -568,123 +567,123 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'emailuser' => 'ई प्रयोगकर्ता के ईमेल करीं',
 
 # Watchlist
-'watchlist'     => 'हमार ध्यानसूची',
-'mywatchlist'   => 'हमार ध्यानसूची',
-'watch'         => 'ध्यानसूची में डालीं',
+'watchlist' => 'हमार ध्यानसूची',
+'mywatchlist' => 'हमार ध्यानसूची',
+'watch' => 'ध्यानसूची में डालीं',
 'watchthispage' => 'ई पन्ना ध्यानसूची में डालीं',
-'unwatch'       => 'ध्यानसूची से हटाईं',
+'unwatch' => 'ध्यानसूची से हटाईं',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'ध्यानसूची में जाते हुए',
+'watching' => 'ध्यानसूची में जाते हुए',
 'unwatching' => 'ध्यानसूची से हटते हुए',
 
 'enotif_newpagetext' => 'इ एगो नया पन्ना ह',
-'created'            => 'बनावल गईल',
+'created' => 'बनावल गईल',
 
 # Undelete
 'undeletelink' => 'देखीं/बहाल करीं',
 
 # Namespace form on various pages
-'namespace'      => 'सन्दर्भ',
-'invert'         => 'चयनित पलटीं',
+'namespace' => 'सन्दर्भ',
+'invert' => 'चयनित पलटीं',
 'blanknamespace' => '(मुख्य)',
 
 # Contributions
-'contributions'       => 'प्रयोगकर्ता योगदान',
+'contributions' => 'प्रयोगकर्ता योगदान',
 'contributions-title' => ' $1 खातिर प्रयोगकर्ता योगदान',
-'mycontris'           => 'हमार योगदान',
-'nocontribs'          => 'ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।',
-'uctop'               => '(शीर्ष)',
-'month'               => 'महिना से (आ उ से पहिले):',
-'year'                => 'साल से (आ उ से पहिले):',
-
-'sp-contributions-newbies'        => 'खाली नया खाता के योगदान देखीं।',
-'sp-contributions-newbies-sub'    => 'नया खाता खातिर',
-'sp-contributions-newbies-title'  => 'नया खाता खातिर प्रयोगकर्ता के योगदान।',
-'sp-contributions-blocklog'       => 'निष्क्रीय खाता',
-'sp-contributions-deleted'        => 'नष्ट प्रयोगकर्ता के योगदान।',
-'sp-contributions-logs'           => 'लौग',
-'sp-contributions-talk'           => 'बात-चीत',
-'sp-contributions-userrights'     => 'प्रयोगकर्ता अधिकार प्रबन्धन',
+'mycontris' => 'हमार योगदान',
+'nocontribs' => 'ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।',
+'uctop' => '(शीर्ष)',
+'month' => 'महिना से (आ उ से पहिले):',
+'year' => 'साल से (आ उ से पहिले):',
+
+'sp-contributions-newbies' => 'खाली नया खाता के योगदान देखीं।',
+'sp-contributions-newbies-sub' => 'नया खाता खातिर',
+'sp-contributions-newbies-title' => 'नया खाता खातिर प्रयोगकर्ता के योगदान।',
+'sp-contributions-blocklog' => 'निष्क्रीय खाता',
+'sp-contributions-deleted' => 'नष्ट प्रयोगकर्ता के योगदान।',
+'sp-contributions-logs' => 'लौग',
+'sp-contributions-talk' => 'बात-चीत',
+'sp-contributions-userrights' => 'प्रयोगकर्ता अधिकार प्रबन्धन',
 'sp-contributions-blocked-notice' => 'ई प्रयोगकर्ता के ई समय निष्क्रीय करल गईल बा।
 नविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:',
 
 # What links here
-'whatlinkshere'            => 'अहिजा का जुड़ी',
-'whatlinkshere-title'      => 'पन्ना जौन "$1" से जुड़ेला',
-'whatlinkshere-page'       => 'पन्ना:',
-'linkshere'                => "नीचे के सब पन्ना '''[[:$1]]''' से जुड़ेला:",
-'nolinkshere'              => "'''[[:$1]]''' से कौनो पन्ना नईखे जुड़ल।",
-'nolinkshere-ns'           => "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
-'isredirect'               => 'पुन: निर्दिष्ट पन्ना',
-'isimage'                  => 'तस्वीर लिंक',
-'whatlinkshere-prev'       => '{{PLURAL:$1|पिछला|पिछला $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|अगला|अगला $1}}',
-'whatlinkshere-links'      => '← लिंक',
+'whatlinkshere' => 'अहिजा का जुड़ी',
+'whatlinkshere-title' => 'पन्ना जौन "$1" से जुड़ेला',
+'whatlinkshere-page' => 'पन्ना:',
+'linkshere' => "नीचे के सब पन्ना '''[[:$1]]''' से जुड़ेला:",
+'nolinkshere' => "'''[[:$1]]''' से कौनो पन्ना नईखे जुड़ल।",
+'nolinkshere-ns' => "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
+'isredirect' => 'पुन: निर्दिष्ट पन्ना',
+'isimage' => 'तस्वीर लिंक',
+'whatlinkshere-prev' => '{{PLURAL:$1|पिछला|पिछला $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|अगला|अगला $1}}',
+'whatlinkshere-links' => '← लिंक',
 'whatlinkshere-hideredirs' => '$1 पुन: निर्देशित',
-'whatlinkshere-hidelinks'  => '$1 लिंक',
+'whatlinkshere-hidelinks' => '$1 लिंक',
 'whatlinkshere-hideimages' => '$1 तस्वीर लिंक',
-'whatlinkshere-filters'    => 'फिल्टर',
+'whatlinkshere-filters' => 'फिल्टर',
 
 # Block/unblock
-'blockip'          => 'प्रतिबंधित प्रयोगकर्ता',
-'blocklink'        => 'निष्क्रिय',
-'unblocklink'      => 'ताला खोलीं',
+'blockip' => 'प्रतिबंधित प्रयोगकर्ता',
+'blocklink' => 'निष्क्रिय',
+'unblocklink' => 'ताला खोलीं',
 'change-blocklink' => 'ब्लॉक बदलीं',
-'contribslink'     => 'योगदान',
-'blocklogpage'     => 'निष्क्रिय खाता',
+'contribslink' => 'योगदान',
+'blocklogpage' => 'निष्क्रिय खाता',
 
 # Move page
 'movepagebtn' => 'पन्ना स्थांतरण करीं',
-'revertmove'  => 'पिछलका स्थिति',
+'revertmove' => 'पिछलका स्थिति',
 
 # Thumbnails
 'thumbnail-more' => 'बढ़ाईं',
-'filemissing'    => 'फाईल गायब',
+'filemissing' => 'फाईल गायब',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'राउर प्रयोगकर्ता पन्ना',
-'tooltip-pt-mytalk'              => 'राउर वार्ता पन्ना',
-'tooltip-pt-preferences'         => 'राउर पसन्द',
-'tooltip-pt-mycontris'           => 'राउर योगदान के सूची',
-'tooltip-pt-login'               => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
-'tooltip-pt-anonlogin'           => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
-'tooltip-pt-logout'              => 'खाता से बाहर',
-'tooltip-ca-talk'                => 'सामग्री पन्ना के बारे में बात-चीत',
-'tooltip-ca-edit'                => 'रउआ ई पन्ना के सम्पादन कर सकत बानी। कृपया पन्ना सुरक्षित करे से पहिले पूर्वावलोकन बटन के इस्तेमाल करीं।',
-'tooltip-ca-addsection'          => 'एगो नया खण्ड शुरु करीं',
-'tooltip-ca-viewsource'          => 'इ पन्ना के संरक्षित कर दिहल गईल बा। रऊआ एकर मूल देख सकत बानी।',
-'tooltip-ca-history'             => 'ई पन्ना के पिछला संशोधन',
-'tooltip-ca-protect'             => 'इ पन्ना के संरक्षित करीं।',
-'tooltip-ca-unprotect'           => 'इ पन्ना के संरक्षण हटाईं।',
-'tooltip-ca-delete'              => 'ई पन्ना मिटाईं',
-'tooltip-ca-move'                => 'ई पन्ना के स्थांतरण करीं',
-'tooltip-ca-watch'               => 'इ पन्ना के आपन ध्यानसूची में डालीं',
-'tooltip-search'                 => '{{SITENAME}} खोजीं',
-'tooltip-search-go'              => 'यदि पन्ना मौजूद होई त ईहे सटीक नाम के साथ उ पन्ना पर जाईं',
-'tooltip-search-fulltext'        => 'ई पाठ्य खातिर पन्ना खोजीं',
-'tooltip-p-logo'                 => 'मुख्य पन्ना पर जाईं',
-'tooltip-n-mainpage'             => 'मुख्य पन्ना पर जाईं',
+'tooltip-pt-userpage' => 'राउर प्रयोगकर्ता पन्ना',
+'tooltip-pt-mytalk' => 'राउर वार्ता पन्ना',
+'tooltip-pt-preferences' => 'राउर पसन्द',
+'tooltip-pt-mycontris' => 'राउर योगदान के सूची',
+'tooltip-pt-login' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
+'tooltip-pt-anonlogin' => 'रउआ के खाता प्रवेश खातिर प्रोत्साहित करल जा रहल बा, बाँकि ई अनिवार्य नईखे',
+'tooltip-pt-logout' => 'खाता से बाहर',
+'tooltip-ca-talk' => 'सामग्री पन्ना के बारे में बात-चीत',
+'tooltip-ca-edit' => 'रउआ ई पन्ना के सम्पादन कर सकत बानी। कृपया पन्ना सुरक्षित करे से पहिले पूर्वावलोकन बटन के इस्तेमाल करीं।',
+'tooltip-ca-addsection' => 'एगो नया खण्ड शुरु करीं',
+'tooltip-ca-viewsource' => 'इ पन्ना के संरक्षित कर दिहल गईल बा। रऊआ एकर मूल देख सकत बानी।',
+'tooltip-ca-history' => 'ई पन्ना के पिछला संशोधन',
+'tooltip-ca-protect' => 'इ पन्ना के संरक्षित करीं।',
+'tooltip-ca-unprotect' => 'इ पन्ना के संरक्षण हटाईं।',
+'tooltip-ca-delete' => 'ई पन्ना मिटाईं',
+'tooltip-ca-move' => 'ई पन्ना के स्थांतरण करीं',
+'tooltip-ca-watch' => 'इ पन्ना के आपन ध्यानसूची में डालीं',
+'tooltip-search' => '{{SITENAME}} खोजीं',
+'tooltip-search-go' => 'यदि पन्ना मौजूद होई त ईहे सटीक नाम के साथ उ पन्ना पर जाईं',
+'tooltip-search-fulltext' => 'ई पाठ्य खातिर पन्ना खोजीं',
+'tooltip-p-logo' => 'मुख्य पन्ना पर जाईं',
+'tooltip-n-mainpage' => 'मुख्य पन्ना पर जाईं',
 'tooltip-n-mainpage-description' => 'मुख्य पन्ना पर पधारीं',
-'tooltip-n-portal'               => 'परियोजना के बारे मेँ, रउआ का कर सकत बानी, वस्तु कहाँ खोजब',
-'tooltip-n-currentevents'        => 'वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं',
-'tooltip-n-recentchanges'        => 'विकि पर तुरंत भईल परिवर्तन के सूची',
-'tooltip-n-randompage'           => 'बेतरतिब पन्ना लादीं (Load करीं)',
-'tooltip-n-help'                 => 'जगह पता लगावे खातिर',
-'tooltip-t-whatlinkshere'        => 'अहिजा लिंक होखे वाला सब विकि पन्ना के सूची',
-'tooltip-t-recentchangeslinked'  => 'ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन',
-'tooltip-t-upload'               => 'फाईल लादीं (अपलोड )',
-'tooltip-t-specialpages'         => 'ख़ाश पन्नवन के सूची',
-'tooltip-t-print'                => 'ई पन्ना के छापे लायक संस्करण।',
-'tooltip-t-permalink'            => 'ई पन्ना के संसोधन खातिर स्थायी लिंक।',
-'tooltip-ca-nstab-main'          => 'सामग्री पन्ना देखीं',
-'tooltip-ca-nstab-special'       => 'ई एगो ख़ाश पन्ना ह, रउआ ई पन्ना के सम्पादन नईखीं कर सकत',
-'tooltip-save'                   => 'आपन बदलाव के सुरक्षित करीं',
+'tooltip-n-portal' => 'परियोजना के बारे मेँ, रउआ का कर सकत बानी, वस्तु कहाँ खोजब',
+'tooltip-n-currentevents' => 'वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं',
+'tooltip-n-recentchanges' => 'विकि पर तुरंत भईल परिवर्तन के सूची',
+'tooltip-n-randompage' => 'बेतरतिब पन्ना लादीं (Load करीं)',
+'tooltip-n-help' => 'जगह पता लगावे खातिर',
+'tooltip-t-whatlinkshere' => 'अहिजा लिंक होखे वाला सब विकि पन्ना के सूची',
+'tooltip-t-recentchangeslinked' => 'ई पन्ना से जुड़ल पन्नवन पर तुरंत भईल परिवर्तन',
+'tooltip-t-upload' => 'फाईल लादीं (अपलोड )',
+'tooltip-t-specialpages' => 'ख़ाश पन्नवन के सूची',
+'tooltip-t-print' => 'ई पन्ना के छापे लायक संस्करण।',
+'tooltip-t-permalink' => 'ई पन्ना के संसोधन खातिर स्थायी लिंक।',
+'tooltip-ca-nstab-main' => 'सामग्री पन्ना देखीं',
+'tooltip-ca-nstab-special' => 'ई एगो ख़ाश पन्ना ह, रउआ ई पन्ना के सम्पादन नईखीं कर सकत',
+'tooltip-save' => 'आपन बदलाव के सुरक्षित करीं',
 
 # Media information
-'file-nohires'         => ' उच्च गुणवत्ता उपलब्ध नईखे।',
-'svg-long-desc'        => 'एस वी जी फाईल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाईल के आकार $3',
-'show-big-image'       => 'पुरा गुणवत्ता',
+'file-nohires' => ' उच्च गुणवत्ता उपलब्ध नईखे।',
+'svg-long-desc' => 'एस वी जी फाईल, नॉमिनल्ली $1 x $2 पिक्सल्स, फाईल के आकार $3',
+'show-big-image' => 'पुरा गुणवत्ता',
 'file-info-gif-looped' => 'लूप्ड',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|फ्रेम}}',
 'file-info-png-looped' => 'लूप्ड',
@@ -696,29 +695,29 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 कोई भी बाद वाला लिंक ओही पंक्ति पर अईला पर उ के अपवाद मानल जाई, अर्थात जौन पन्ना पर फाईल इनलाईन हो सकत बा।',
 
 # Metadata
-'metadata'          => 'मेटाडाटा',
-'metadata-help'     => 'इ फाईल में अतिरिक्त जानकारी उपलब्ध बा, हो सकत बा कि इ डिजीटल कैमरा या स्कैनर से लेवल गईल होखे। यदि इ फाईल एकर मूल फाईल में से संशोधित करल गईल बा त कुछ जानकारी उजागर ना हो सकी।',
-'metadata-expand'   => 'विस्तृत विवरण देखाईं',
+'metadata' => 'मेटाडाटा',
+'metadata-help' => 'इ फाईल में अतिरिक्त जानकारी उपलब्ध बा, हो सकत बा कि इ डिजीटल कैमरा या स्कैनर से लेवल गईल होखे। यदि इ फाईल एकर मूल फाईल में से संशोधित करल गईल बा त कुछ जानकारी उजागर ना हो सकी।',
+'metadata-expand' => 'विस्तृत विवरण देखाईं',
 'metadata-collapse' => 'विस्तृत विवरण छुपाँईं',
 
 # EXIF tags
-'exif-imagewidth'                  => 'चौड़ाई',
-'exif-imagelength'                 => 'ऊँचाई',
-'exif-bitspersample'               => 'अवयव प्रति बीट',
-'exif-compression'                 => 'सम्पीड़न प्रणाली',
-'exif-photometricinterpretation'   => 'पिक्सल रचना',
-'exif-orientation'                 => 'अभिसंस्करण',
-'exif-samplesperpixel'             => 'अवयवन के संख्या',
-'exif-planarconfiguration'         => 'डेटा प्रबन्धन',
-'exif-xresolution'                 => 'क्षैतिज समाधान',
-'exif-yresolution'                 => 'लम्बवत समाधान',
-'exif-stripoffsets'                => 'चित्र डेटा के स्थिती',
+'exif-imagewidth' => 'चौड़ाई',
+'exif-imagelength' => 'ऊँचाई',
+'exif-bitspersample' => 'अवयव प्रति बीट',
+'exif-compression' => 'सम्पीड़न प्रणाली',
+'exif-photometricinterpretation' => 'पिक्सल रचना',
+'exif-orientation' => 'अभिसंस्करण',
+'exif-samplesperpixel' => 'अवयवन के संख्या',
+'exif-planarconfiguration' => 'डेटा प्रबन्धन',
+'exif-xresolution' => 'क्षैतिज समाधान',
+'exif-yresolution' => 'लम्बवत समाधान',
+'exif-stripoffsets' => 'चित्र डेटा के स्थिती',
 'exif-jpeginterchangeformatlength' => 'JPEG डेटा के बाइट',
 
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'सब',
-'monthsall'     => 'सब',
-'limitall'      => 'सब',
+'monthsall' => 'सब',
+'limitall' => 'सब',
 
 # E-mail address confirmation
 'confirmemail' => 'इ-मेल पता कन्फर्म करीं',
@@ -727,7 +726,7 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'specialpages' => 'ख़ाश पन्ना',
 
 # New logging system
-'revdelete-restricted'   => 'प्रबंधक पर प्रतिबंध लागू',
+'revdelete-restricted' => 'प्रबंधक पर प्रतिबंध लागू',
 'revdelete-unrestricted' => 'प्रबंधक पर से प्रतिबंध समाप्त',
 
 );
index 35aade9..f40423a 100644 (file)
@@ -11,6 +11,7 @@
  * @author Ezagren
  * @author J Subhi
  * @author Kaganer
+ * @author Riemogerz
  */
 
 $fallback = 'id';
@@ -52,6 +53,96 @@ $namespaceAliases = array(
        'Pembicaraan_Kategori'  => NS_CATEGORY_TALK,
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Pamakai_aktip' ),
+       'Allmessages'               => array( 'Pasan_sistim' ),
+       'Allpages'                  => array( 'Daptar_tungkaran' ),
+       'Ancientpages'              => array( 'Tungkaran_lawas' ),
+       'Badtitle'                  => array( 'Judul_nang_buruk' ),
+       'Blankpage'                 => array( 'Tungkaran_kusung' ),
+       'Block'                     => array( 'Blukir_pamakai' ),
+       'Blockme'                   => array( 'Blukir_ulun' ),
+       'Booksources'               => array( 'Sumbar_buku' ),
+       'BrokenRedirects'           => array( 'Paugahan_rakai' ),
+       'Categories'                => array( 'Daptar_tumbung' ),
+       'ChangeEmail'               => array( 'Ganti_suril' ),
+       'ChangePassword'            => array( 'Ganti_katasunduk' ),
+       'ComparePages'              => array( 'Bandingakan_tungkaran' ),
+       'Confirmemail'              => array( 'Kunpirmasi_suril' ),
+       'Contributions'             => array( 'Sumbangan_pamakai' ),
+       'CreateAccount'             => array( 'Ulah_akun' ),
+       'Deadendpages'              => array( 'Tungkaran_buntu' ),
+       'DeletedContributions'      => array( 'Sumbangan_nang_dihapus' ),
+       'Disambiguations'           => array( 'Disambiguasi' ),
+       'EditWatchlist'             => array( 'Babak_daptar_pantauan' ),
+       'Fewestrevisions'           => array( 'Paubahan_tasadikit' ),
+       'FileDuplicateSearch'       => array( 'Panggagaian_barakas_kambar' ),
+       'Filepath'                  => array( 'Andakan_barakas' ),
+       'BlockList'                 => array( 'Daptar_pamblukiran' ),
+       'LinkSearch'                => array( 'Tautan_luar' ),
+       'Listadmins'                => array( 'Daptar_pambakal' ),
+       'Listbots'                  => array( 'Daptar_bot' ),
+       'Listfiles'                 => array( 'Daptar_barakas' ),
+       'Listgrouprights'           => array( 'Daptar_hak_galambang' ),
+       'Listredirects'             => array( 'Daptar_paugahan' ),
+       'Listusers'                 => array( 'Daptar_pamakai' ),
+       'Log'                       => array( 'Catatan' ),
+       'Lonelypages'               => array( 'Tungkaran_yatim' ),
+       'Longpages'                 => array( 'Tungkaran_panjang' ),
+       'MergeHistory'              => array( 'Sajarah_panggabungan' ),
+       'MIMEsearch'                => array( 'Panggagaian_MIME' ),
+       'Mostcategories'            => array( 'Tumbung_pambanyaknya' ),
+       'Mostimages'                => array( 'Barakas_paling_dipakai' ),
+       'Mostlinked'                => array( 'Tungkaran_paling_dipakai' ),
+       'Mostlinkedcategories'      => array( 'Tumbung_paling_dipakai' ),
+       'Mostlinkedtemplates'       => array( 'Citakan_paling_dipakai' ),
+       'Mostrevisions'             => array( 'Paubahan_pambanyaknya' ),
+       'Movepage'                  => array( 'Pindahakan_tungkaran' ),
+       'Mycontributions'           => array( 'Sumbangan_ulun' ),
+       'Mypage'                    => array( 'Tungkaran_ulun' ),
+       'Mytalk'                    => array( 'Pamandiran_ulun' ),
+       'Myuploads'                 => array( 'Unggahan_ulun' ),
+       'Newimages'                 => array( 'Barakas_hanyar' ),
+       'Newpages'                  => array( 'Tungkaran_hanyar' ),
+       'PermanentLink'             => array( 'Tautan_tatap' ),
+       'Popularpages'              => array( 'Tungkaran_popular' ),
+       'Preferences'               => array( 'Kakatujuan' ),
+       'Protectedpages'            => array( 'Tungkaran_nang_dilindungi' ),
+       'Protectedtitles'           => array( 'Judul_nang_dilindungi' ),
+       'Randompage'                => array( 'Tungkaran_babarang' ),
+       'Randomredirect'            => array( 'Paugahan_babarang' ),
+       'Recentchanges'             => array( 'Paubahan_pahanyarnya' ),
+       'Recentchangeslinked'       => array( 'Paubahan_tarait' ),
+       'Revisiondelete'            => array( 'Hapus_ralatan' ),
+       'RevisionMove'              => array( 'Ralatan_pamindahan' ),
+       'Search'                    => array( 'Panggagaian' ),
+       'Shortpages'                => array( 'Tungkaran_handap' ),
+       'Specialpages'              => array( 'Tungkaran_istimiwa' ),
+       'Statistics'                => array( 'Statistik' ),
+       'Tags'                      => array( 'Tag' ),
+       'Unblock'                   => array( 'Pawalangan_pamblukiran' ),
+       'Uncategorizedcategories'   => array( 'Tumbung_kada_batumbung' ),
+       'Uncategorizedimages'       => array( 'Barakas_kada_batumbung' ),
+       'Uncategorizedpages'        => array( 'Tungkaran_kada_batumbung' ),
+       'Uncategorizedtemplates'    => array( 'Citakan_kada_batumbung' ),
+       'Undelete'                  => array( 'Pawalangan_pahapusan' ),
+       'Unusedcategories'          => array( 'Tumbung_puang' ),
+       'Unusedimages'              => array( 'Barakas_kada_tapakai' ),
+       'Unusedtemplates'           => array( 'Citakan_kada_tapakai' ),
+       'Unwatchedpages'            => array( 'Tungkaran_kada_di-itihi' ),
+       'Upload'                    => array( 'Paunggahan' ),
+       'Userlogin'                 => array( 'Babuat_log' ),
+       'Userlogout'                => array( 'Kaluar_log' ),
+       'Userrights'                => array( 'Hak_pamakai' ),
+       'Wantedcategories'          => array( 'Tumbung_nang_dikahandaki' ),
+       'Wantedfiles'               => array( 'Barakas_nang_dikahandaki' ),
+       'Wantedpages'               => array( 'Tungkaran_nang_dikahandaki' ),
+       'Wantedtemplates'           => array( 'Citakan_nang_dikahandaki' ),
+       'Watchlist'                 => array( 'Daptar_itihan' ),
+       'Whatlinkshere'             => array( 'Tautan_balik' ),
+       'Withoutinterwiki'          => array( 'Kada_pakai_interwiki' ),
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Garisi di bawah tautan',
@@ -99,7 +190,7 @@ $messages = array(
 'tog-showhiddencats' => 'Tampaiakan tutumbung tasungkup',
 'tog-norollbackdiff' => 'Kada usah manampaiakan lainan imbah mambulikakan',
 
-'underline-always' => 'Salalu',
+'underline-always' => 'Tarus',
 'underline-never' => 'Kada suah',
 'underline-default' => 'Default Panjalajahan web',
 
@@ -111,18 +202,18 @@ $messages = array(
 'editfont-serif' => 'Tulisan Serif',
 
 # Dates
-'sunday' => 'Ahat',
+'sunday' => 'Ahad',
 'monday' => 'Sanayan',
 'tuesday' => 'Salasa',
 'wednesday' => 'Arba',
-'thursday' => 'Kemés',
+'thursday' => 'Kamis',
 'friday' => 'Jumahat',
 'saturday' => 'Saptu',
 'sun' => 'Aha',
 'mon' => 'San',
 'tue' => 'Sal',
 'wed' => 'Arb',
-'thu' => 'Kem',
+'thu' => 'Kam',
 'fri' => 'Jum',
 'sat' => 'Sap',
 'january' => 'Januari',
@@ -139,7 +230,7 @@ $messages = array(
 'december' => 'Disimbir',
 'january-gen' => 'Januari',
 'february-gen' => 'Pibuari',
-'march-gen' => 'Marat',
+'march-gen' => 'Marit',
 'april-gen' => 'April',
 'may-gen' => 'Mai',
 'june-gen' => 'Juni',
@@ -147,7 +238,7 @@ $messages = array(
 'august-gen' => 'Agustus',
 'september-gen' => 'Siptimbir',
 'october-gen' => 'Uktubir',
-'november-gen' => 'Nopember',
+'november-gen' => 'Nupimbir',
 'december-gen' => 'Disimbir',
 'jan' => 'Jan',
 'feb' => 'Pib',
@@ -170,11 +261,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 +360,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 +450,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 +459,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 +469,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 +479,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 +496,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,8 +526,11 @@ 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''.",
+'filereadonlyerror' => 'Kada kawa mamudipikasi data "$1" marga repositori data "$2" ada di modus read-only.
+
+Administrator nang takunci nintu manawarakan panjalasan: "$3".',
 
 # Virus scanner
 'virus-badscanner' => "Konpigurasi buruk: pamindai virus kada dipinandui: ''$1''",
@@ -444,7 +538,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 +584,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 +601,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".
@@ -528,13 +622,14 @@ Kadada suril nang akan dikirim maumpati pitur.',
 'invalidemailaddress' => 'Alamat suril ini kada kawa ditarima karana pormat kada sah.
 Muhun buati sabuting alamat suril nang bujur pormatnya atawa puangkan haja isian itu.',
 'cannotchangeemail' => 'Akun alamat suril kada kawa diganti pada wiki ngini.',
+'emaildisabled' => 'Situs naya kada kawa mangirim suril.',
 '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 +651,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 +664,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 +678,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 +696,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 +724,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 +733,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 +783,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 +818,8 @@ 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!",
+'continue-editing' => 'Lanjutakan mambabak',
 '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 +835,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 +858,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 +901,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.
@@ -818,6 +916,11 @@ Babarapa citakan akan kada taumpatakan.",
 'parser-template-loop-warning' => 'Citakan baulang takantup: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Citakan batas kadalaman recursi limpuar ($1)',
 'language-converter-depth-warning' => 'Batas kadalaman pakonversi bahasa limpuar ($1)',
+'node-count-exceeded-category' => 'Tungkaran di mana node-count tarlalui',
+'node-count-exceeded-warning' => 'Tungkaran malabihi node-count',
+'expansion-depth-exceeded-category' => 'Tungkaran dimana kadalaman ikspansi talalui',
+'expansion-depth-exceeded-warning' => 'Tungkaran malabihi kadalaman ikspansi',
+'parser-unstrip-loop-warning' => 'Lingkaran unstrip taditiksi',
 
 # "Undo" feature
 'undo-success' => 'Babakan kawa diwalangi.
@@ -961,7 +1064,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',
@@ -996,13 +1099,12 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 
 # Diffs
 'history-title' => "Ralatan halam matan ''$1''",
-'difference' => '(Nang balain antar ralatan)',
 'difference-multipage' => '(Nang balain antar tungkaran-tungkaran)',
 'lineno' => 'Baris $1:',
 '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 +1126,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 +1144,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 +1281,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',
@@ -1353,24 +1455,24 @@ Amun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan ga
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
-'recentchanges' => 'Parubahan tahanyar',
-'recentchanges-legend' => 'Pilihan parubahan tahanyar',
-'recentchangestext' => 'Jajak parubahan wiki pahanyarnya pada tungkaran ngini',
+'recentchanges' => 'Paubahan pahanyarnya',
+'recentchanges-legend' => 'Pilihan paubahan pahanyarnya',
+'recentchanges-summary' => '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",
-'rcnote' => "Di bawah ni {{PLURAL:$1|'''1'''|'''$1'''}} parubahan tahanyar dalam {{PLURAL:$2|'''1''' hari|'''$2''' hari}} tauncit, sampai $4 pukul $5.",
+'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'''}} paubahan pahanyarnya 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',
+'rclistfrom' => 'Tampaiakan paubahan pahanyarnya 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',
+'rclinks' => 'Tampaiakan $1 paubahan pahanyarnya dalam $2 hari tauncit<br />$3',
 'diff' => 'bida',
 'hist' => 'halam',
 'hide' => 'Sungkupakan',
@@ -1393,7 +1495,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 +1753,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 +1762,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.',
@@ -1813,6 +1915,8 @@ Ngini wayah ini sudah diugahakan ka [[$2]].',
 'wantedpages' => 'Tutungkaran nang dihandaki',
 'wantedpages-badtitle' => 'Judul kada sah dalam setelan kulihan: $1',
 'wantedfiles' => 'Barakas nang dihandaki',
+'wantedfiletext-nocat' => 'Data-data naya dipakai tagal kada ada. Data matan ripusituri asing kawa tadaptar biar haja ada. Satiap 
+File-file berikut digunakan tapi tidak ada. File dari repositori asing dapat terdaftar meskipun ada. Any such false positives will be <del>manyarang</del>.',
 'wantedtemplates' => 'Citakan nang dihandaki',
 'mostlinked' => 'Tutungkaran tatuju tautan pambanyaknya',
 'mostlinkedcategories' => 'Tutumbung tatuju tautan pambanyaknya',
@@ -1890,6 +1994,10 @@ Pian kada mawatasi tiringan lawan mamilih sabuah macam log, ngaran-pamuruk (sans
 'allpagesbadtitle' => 'Judul tungkaran nang dibari kada sah atawa baisi sabuah awalan antar-bahasa atawa antar-wiki.
 Nangini bisa baisi satu atawa labih karaktir nang saharusnya kadada di judul.',
 'allpages-bad-ns' => '{{SITENAME}} kada baisi ngaran-kamar "$1".',
+'allpages-hide-redirects' => 'Sambunyiakan paalihan',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Itihi tahanyar.',
 
 # Special:Categories
 'categories' => 'Tutumbung',
@@ -1932,7 +2040,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 +2183,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 +2358,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 +2367,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 +2381,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 +2442,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 +2458,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 +2497,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',
@@ -2638,52 +2746,56 @@ Muhun cubai pulang.',
 'import-logentry-interwiki' => 'ditranswiki $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ralatan|raralatan}} matan $2',
 
+# JavaScriptTest
+'javascripttest' => 'Mantis JavaScript',
+'javascripttest-pagetext-skins' => 'Pilih kulit nang cagar Pian cubai:',
+
 # 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',
 'tooltip-n-portal' => 'Pasal rangka-gawian, apa nang kawa pian gawi, di mana maugai sasuatu',
 'tooltip-n-currentevents' => 'Gagai panjalasan prihal paristiwa damini',
-'tooltip-n-recentchanges' => 'Daptar parubahan tahanyar dalam wiki',
+'tooltip-n-recentchanges' => 'Daptar paubahan pahanyarnya dalam wiki',
 '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' => 'Paubahan pahanyarnya 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 +2806,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 +2898,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 +2934,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 +3342,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
@@ -3431,6 +3543,7 @@ Pian saharusnya [{{SERVER}}{{SCRIPTPATH}}/COPYING sabuah salinan Lisansi Publik
 'version-software' => 'Parangkat lunak tapasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Virsi',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Wadah barakas',
@@ -3560,9 +3673,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.',
 
@@ -3582,4 +3695,22 @@ Salain ngitu, Pian kawa mamuruk prmulir nyaman di bawah ngini. Kumintar Pian aka
 'feedback-bugcheck' => 'Harat! hanyar dipariksa bahwasa ngini lainan salah asa [$1 bug nang dipinandui].',
 'feedback-bugnew' => 'Ulun mamariksa. Malapurakan sabuah bug hanyar',
 
+# API errors
+'api-error-missingresult' => 'Kasalahan intarnal: kada kawa manantuakan napakah panyalinan tuntung.',
+'api-error-mustbeloggedin' => 'Pian harus babuat ka log gasan maunggah barakas.',
+'api-error-mustbeposted' => 'Ada bug di parangkat lamah naya; kada mamakai mituda HTTP nang bujur.',
+'api-error-noimageinfo' => 'Paunggahan tuntung, tagal paladen kada mambarii inpurmasi napa haja masalah barakas.',
+'api-error-nomodule' => 'Kasalahan intarnal: kada ada modul unggahan nang ditatapakan.',
+'api-error-ok-but-empty' => 'Kasalahan intarnal: kada ada tanggapan matan paladen.',
+'api-error-overwrite' => 'Kada dibariakan manindihi barakas nang sudah ada.',
+'api-error-stashfailed' => 'Kasalahan intarnal: server gagal manyimban barakas samantara.',
+'api-error-timeout' => 'Peladen kada marispun di waktu nang diharapakan',
+'api-error-unclassified' => 'Tajadi kasalahan nang kada dikatahui.',
+'api-error-unknown-code' => 'Kasalahan kada dipinandui: "$1".',
+'api-error-unknown-error' => 'Kasalahan intarnal: tajadi kasalahan pas mancuba maunggah barakas Pian.',
+'api-error-unknown-warning' => 'Paringatan kada dipinandui: "$1".',
+'api-error-unknownerror' => 'Kasalahan kada dipinandui: "$1".',
+'api-error-uploaddisabled' => 'Paunggahan dinunaktipakan di wiki naya.',
+'api-error-verification-error' => 'Barakas naya kira-kira rusak atawa baisi ikstinsi nang salah.',
+
 );
index 85f28b5..9bccafe 100644 (file)
@@ -311,7 +311,7 @@ $1',
 'disclaimerpage' => 'Project:সাধারণ দাবিত্যাগ',
 'edithelp' => 'সম্পাদনা সহায়িকা',
 'edithelppage' => 'Help:কিভাবে একটি পাতা সম্পাদনা করবেন',
-'helppage' => 'Help:সহায়িà¦\95া',
+'helppage' => 'Help:সà§\82à¦\9aি',
 'mainpage' => 'প্রধান পাতা',
 'mainpage-description' => 'প্রধান পাতা',
 'policy-url' => 'Project:নীতিমালা',
@@ -451,6 +451,11 @@ $2',
 'customjsprotected' => 'আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।',
 'ns-specialprotected' => '{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।',
 'titleprotected' => "[[User:$1|$1]]-কে এই শিরোনামের পাতা সৃষ্টি করতে বাধা দেয়া হচ্ছে। কারণ: ''$2''।",
+'filereadonlyerror' => '"$1" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন "$2" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।
+
+একজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: "$3"',
+'invalidtitle-knownnamespace' => 'অবৈধ শিরনাম, যেখানে নামস্থান "$2" এবং লেখা হয়েছে "$3"',
+'invalidtitle-unknownnamespace' => 'অবৈধ শিরনাম, যেখানে ব্যবহৃত হয়েছে অপরিচিত নামস্থান সংখ্যা $1 এবং লেখা হয়েছে "$2"',
 
 # Virus scanner
 'virus-badscanner' => "ভুল কনফিগারেশন: অজ্ঞাত ভাইরাস স্কেনার: ''$1''",
@@ -534,6 +539,7 @@ $2',
 'emailconfirmlink' => 'আপনার ই-মেইলের ঠিকানা নিশ্চিত করুন',
 'invalidemailaddress' => 'এই ই-মেইল ঠিকানাটি গ্রহণযোগ্য নয়, কারণ সম্ভবত এটি সঠিক ফরম্যাটে লেখা হয়নি। অনুগ্রহ করে সঠিক ফরম্যাটে লেখা ই-মেইল ঠিকানা দিন, অথবা ক্ষেত্রটি খালি রাখুন।',
 'cannotchangeemail' => 'একাউন্ট ইমেইল ঠিকানা এই উইকিতে পরিবর্তন করা যাবে না।',
+'emaildisabled' => 'এই সাইটটিতে ই-মেইল প্রদানের সুবিধা নেই।',
 'accountcreated' => 'অ্যাকাউন্ট তৈরি করা হয়েছে',
 'accountcreatedtext' => '$1 এর জন্য ব্যবহারকারী অ্যাকাউন্ট তৈরি করা হয়েছে।',
 'createaccount-title' => '{{SITENAME}}-এর জন্য অ্যাকাউন্ট সৃষ্টি',
@@ -578,6 +584,7 @@ $2',
 'passwordreset-username' => 'ব্যবহারকারী নাম:',
 'passwordreset-domain' => 'ডোমেইন:',
 'passwordreset-capture' => 'অনুসন্ধানের ফলাফলের ইমেইল দেখুন?',
+'passwordreset-capture-help' => 'আপনি যদি এই চেক বক্সে ক্লিক করেন, তবে অস্থায়ী শব্দচাবিসহ একটি ই-মেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।',
 'passwordreset-email' => 'ইমেইল ঠিকানা:',
 'passwordreset-emailtitle' => '{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি',
 'passwordreset-emailtext-ip' => 'কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার
@@ -712,12 +719,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' => "'''মনে রাখবেন আপনি আপনার জন্য বরাদ্ধকৃত সিএসএস প্রাকদর্শন করছেন।
@@ -730,7 +737,9 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'userinvalidcssjstitle' => "'''সতর্কীকরণ:''' \"\$1\" নামে কোন আবরণ নেই। মনে রাখবেন, পছন্দমাফিক .css এবং .js পাতাগুলি ছোট হাতের শিরোনাম ব্যবহার করে, যেমন {{ns:user}}:Foo/vector.css; কিন্তু এরকম শিরোনাম নয়: {{ns:user}}:Foo/Vector.css",
 'updated' => '(হালনাগাদ)',
 'note' => "'''নোট:'''",
-'previewnote' => "'''এটি প্রাকদর্শন মাত্র। কোনো পরিবর্তন এখনও সংরক্ষণ করা হয়নি!'''",
+'previewnote' => "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''
+আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
+'continue-editing' => 'সম্পাদনা চালিয়ে যান',
 'previewconflict' => 'এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।',
 'session_fail_preview' => "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''",
 'session_fail_preview_html' => "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''
@@ -741,6 +750,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'token_suffix_mismatch' => "'''আপনার সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে, কারণ আপনার ক্লায়েন্ট প্রোগ্রামটি সম্পাদনা টেক্সটের বিরামচিহ্নগুলি গুলিয়ে ফেলেছে। পাতাটির টেক্সটে যাতে ক্ষতি না হয় সেজন্য সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে। আপনি কোন ত্রুটিপূর্ণ ওয়েব-ভিত্তিক বেনামী প্রক্সি সেবা ব্যবহার করলে এরকম হতে পারে।'''",
 'edit_form_incomplete' => "'''আপনার সম্পাদনার কিছু অংশ সার্ভারে পৌছায় নি; আপনার সম্পাদনা সম্পূর্ণরুপে আছে কিনা নিশ্চিত হয়ে আবার চেষ্টা করুন'''",
 'editing' => 'সম্পাদনা করছেন: $1',
+'creating' => '$1 পাতাটি তৈরি করছেন',
 'editingsection' => 'সম্পাদনা করছেন $1 (অনুচ্ছেদ)',
 'editingcomment' => 'সম্পাদনা করছেন $1 (নতুন অনুচ্ছেদ)',
 'editconflict' => 'সম্পাদনা দ্বন্দ্ব: $1',
@@ -759,7 +769,8 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন, বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন।
 '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না!'''",
 'copyrightwarning2' => "অনুগ্রহ করে লক্ষ করুন: {{SITENAME}}-এর এই ভুক্তিতে আপনার লেখা বা অবদান অন্যান্য ব্যবহারকারীরা পরিবর্তন বা পরিবর্ধন করতে, এমনকি মুছে ফেলতে পারবেন। {{SITENAME}} এ আপনার সকল লেখালেখি/অবদান গনু ফ্রি ডকুমেন্টেশনের ($1) আওতায় বিনামূল্যে প্রাপ্য ও হস্তান্তরযোগ্য। আপনার জমা দেয়া লেখা যে কেউ হৃদয়হীনভাবে সম্পাদনা করতে এবং যথেচ্ছভাবে ব্যবহার করতে পারেন। আপনি যদি এ ব্যাপারে একমত না হন, তাহলে এখানে আপনার লেখা জমা দেবেন না। আপনি আরো প্রতিজ্ঞা করছেন যে, এই লেখাগুলো আপনি নিজে লিখেছেন (তবে কোন মৌলিক গবেষণা নয়) বা সাধারণের ব্যবহারের জন্য উন্মুক্ত কোন উৎস থেকে সংগ্রহ করেছেন। '''স্বত্ব সংরক্ষিত কোন লেখা স্বত্বাধিকারীর অনুমতি ছাড়া এখানে জমা দেবেন না।'''",
-'longpageerror' => "'''ত্রুটি: আপনার জমা দেয়া টেক্সটের পরিমাণ $1 কিলোবাইট, যা সর্বোচ্চ সীমা $2 কিলোবাইটের চেয়ে বেশি। এটি সংরক্ষণ করা সম্ভব নয়।'''",
+'longpageerror' => "'''ত্রুটি:  আপনার জমা দেয়া টেক্সটের পরিমাণ {{PLURAL:$1|এক কিলোবাইট|$1 কিলোবাইট}}, যা সর্বোচ্চ সীমা {{PLURAL:$2|এক কিলোবাইটের|$2 কিলোবাইটের}} চেয়ে বেশি।'''
+এটি সংরক্ষণ করা সম্ভব নয়।",
 'readonlywarning' => "'''সতর্কীকরণ: রক্ষণাবেক্ষণের জন্য ডাটাবেজ অবরুদ্ধ রাখা হয়েছে, তাই এই মুহূর্তে আপনার সম্পাদনা সংরক্ষণ করতে পারবেন না।
 আপনি চাইলে লেখাটি কাট এবং পেষ্ট করে ভবিষ্যতের জন্য কোন টেক্সট ফাইলে সংরক্ষণ করতে পারেন।'''
 
@@ -801,6 +812,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'edit-no-change' => 'আপনার সম্পাদনাটি উপেক্ষা করা হয়েছে, কারণ লেখাতে কোনো পরিবর্তন করা হয়নি।',
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
+'defaultmessagetext' => 'আদি টেক্সট',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -814,6 +826,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' => 'সম্পাদনাটি বাতিল করা যাবে। অনুগ্রহ করে নিচের তুলনাটি পরীক্ষা করে দেখুন ও নিশ্চিত করুন যে এটাই আপনি করতে চান, এবং তারপর নিচের সম্পাদনাগুলি সংরক্ষণ করে সম্পাদনাটির বাতিল প্রক্রিয়া সমাপ্ত করুন।',
@@ -869,17 +883,33 @@ $3-এর দেয়া কারণ হল ''$2''",
 'rev-deleted-text-unhide' => "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।
 বিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।
 আপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
+'rev-suppressed-text-unhide' => "পাতার এই সংস্করণটি '''অপসারিত''' হয়েছে।
+বিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।
+আপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
 'rev-deleted-text-view' => 'পাতার এই সংশোধনটি অপসারণ করা হয়েছে।
 আপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।',
+'rev-suppressed-text-view' => 'পাতার এই সংশোধনটি অপসারণ করা হয়েছে।
+আপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।',
 'rev-deleted-no-diff' => "আপনি পাতার এই পার্থক্যটি দেখতে পারবেন না কারণ একটি সংস্করণ '''অপসারিত''' হয়েছে।
 বিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।",
 'rev-suppressed-no-diff' => "আপনি এই পার্থক্যটি দেখতে পারবেন না কারণ একটি সংস্করণ '''অপসারণ''' করা হয়েছে।",
+'rev-deleted-unhide-diff' => "পার্থক্য তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারিত''' হয়েছে।
+বিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।
+আপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
+'rev-suppressed-unhide-diff' => "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারিত''' হয়েছে।
+বিস্তারিত কারণ এর [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] পাওয়া যেতে পারে।
+আপনি ইচ্ছা পোষণ করলে [$1 এই সংস্করণটি দেখতে পারেন]।",
+'rev-deleted-diff-view' => "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারণ''' করা হয়েছে।
+আপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।",
+'rev-suppressed-diff-view' => "তুলনা করা হয়েছে এমন সংস্করণগুলোর কোনো একটি '''অপসারণ''' করা হয়েছে।
+আপনি এটি দেখতে পারেন; এ সংক্রাস্ত বিস্তারিত বিবরণ [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} অবলুপ্তি লগে] থাকতে পারে।",
 'rev-delundel' => 'দেখাও/আড়াল করো',
 'rev-showdeleted' => 'দেখাও',
 'revisiondelete' => 'অবলুপ্ত/পুনঃস্থাপন সংশোধনসমূহ',
 'revdelete-nooldid-title' => 'বেঠিক লক্ষ্য সংশোধন',
 'revdelete-nooldid-text' => 'এই কাজটি সম্পন্ন করার জন্য আপনি কোন লক্ষ্য সংশোধন নির্বাচন করেননি, নির্বাচিত সংশোধন নেই, অথবা আপনি বর্তমান সংশোধন লুকাতে চাইছেন।',
 'revdelete-nologtype-title' => 'কোনো লগ টাইপ দেওয়া হয়নি।',
+'revdelete-nologtype-text' => 'আপনি হয়তো এই কাজটি করার জন্য কোনো লগ নির্ধারণ করেননি।',
 'revdelete-nologid-title' => 'ভুল লগ ভুক্তি',
 'revdelete-no-file' => 'নির্ধারিত ফাইলটি নেই।',
 'revdelete-show-file-submit' => 'হ্যাঁ',
@@ -904,6 +934,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 'revdelete-submit' => 'নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো',
 'revdelete-success' => "'''সংশোধন দৃশ্যমানতা সফলভাবে হালনাগাদ করা হয়েছে।'''",
 'logdelete-success' => "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
+'logdelete-failure' => "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''
+$1",
 'revdel-restore' => 'দৃশ্যমানতা পরিবর্তন করো',
 'revdel-restore-deleted' => 'অপসারিত সংস্করণ',
 'revdel-restore-visible' => 'প্রদর্শনযোগ্য সংস্করণ',
@@ -952,7 +984,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 
 # Diffs
 'history-title' => '"$1" এর সংশোধনের ইতিহাস',
-'difference' => '(সংস্করণগুলোর মধ্যে পার্থক্য)',
+'difference-title' => '"$1"-এর বিভিন্ন সংস্করণের মধ্যে পার্থক্য',
+'difference-title-multipage' => '"$1" ও "$2"-পাতার মধ্যে পার্থক্য',
 'difference-multipage' => 'পাতাগুলোর মধ্যে পার্থক্য',
 'lineno' => '$1 নং লাইন:',
 'compareselectedversions' => 'নির্বাচিত সংস্করণগুলো তুলনা করো',
@@ -1045,6 +1078,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'prefs-beta' => 'বেটা বৈশিষ্টসমূহ',
 'prefs-datetime' => 'তারিখ ও সময়',
 'prefs-labs' => 'পরীক্ষাগার বৈশিষ্টসমূহ',
+'prefs-user-pages' => 'ব্যবহারকারীর পাতা',
 'prefs-personal' => 'ব্যবহারকারীর বৃত্তান্ত',
 'prefs-rc' => 'সাম্প্রতিক পরিবর্তনসমূহ',
 'prefs-watchlist' => 'নজরতালিকা',
@@ -1152,7 +1186,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' => 'সদস্য:',
@@ -1283,7 +1317,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 'recentchanges' => 'সাম্প্রতিক পরিবর্তনসমূহ',
 'recentchanges-legend' => 'সাম্প্রতিক পরিবর্তনের পছন্দসমূহ',
-'recentchangestext' => 'এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।',
+'recentchanges-summary' => 'এই পাতায় উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।',
 'recentchanges-feed-description' => 'এই ফিডে উইকিটির সবচেয়ে সাম্প্রতিক পরিবর্তনগুলি অনুসরণ করুন।',
 'recentchanges-label-newpage' => 'এই সম্পাদনায় একটি নতুন পাতা তৈরি হয়েছে',
 'recentchanges-label-minor' => 'এটি একটি অনুল্লেখিত সম্পাদনা',
@@ -1362,6 +1396,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।',
@@ -1371,12 +1406,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>'''
@@ -1401,6 +1438,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'overwroteimage' => '"[[$1]]"-এর একটি নতুন সংস্করণ আপলোড করা হয়েছে',
 'uploaddisabled' => 'আপলোড নিষ্ক্রিয় আছে',
 'copyuploaddisabled' => 'ইউআরএল এর মাধ্যমে আপলোড নিস্ক্রিয় রয়েছে।',
+'uploadfromurl-queued' => 'আপনার আপলোড সারিবদ্ধ হয়েছে।',
 'uploaddisabledtext' => 'ফাইল আপলোড নিষ্ক্রিয়।',
 'php-uploaddisabledtext' => 'পিএইপি -এ ফাইল আপলোড নিস্ক্রিয় রয়েছে।
 অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
@@ -1417,8 +1455,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> দিয়ে শুরু হওয়া আবশ্যক।',
@@ -1435,6 +1475,8 @@ $3-এর দেয়া কারণ হল ''$2''",
 
 # File backend
 'backend-fail-delete' => '$1 ফাইলটি অপসারণ সম্ভব নয়।',
+'backend-fail-read' => '$1 ফাইলটি ওপেন করা যাচ্ছে না।',
+'backend-fail-create' => '$1 ফাইলটি তৈরী করা যাচ্ছে না।',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ফাইলটির জিপ পরীক্ষা করার সময় একটি ত্রুটি দেখা দিয়েছে।',
@@ -1460,6 +1502,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',
 
@@ -1509,6 +1552,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'linkstoimage' => 'নিচের {{PLURAL:$1|টি পাতা|$1টি পাতা}} থেকে এই ফাইলে সংযোগ আছে:',
 'nolinkstoimage' => 'এই ফাইলে সংযোগ করে এমন কোন পাতা নেই।',
 'morelinkstoimage' => 'এই ফাইলের [[Special:WhatLinksHere/$1|আরও লিঙ্ক]] দেখাও।',
+'linkstoimage-redirect' => '$1 (ফাইল পুনঃর্নিদেশ) $2',
 'sharedupload' => 'এই ফাইলটি $1 থেকে নেওয়া হয়েছে এবং এবং অন্যান্য প্রকল্পেও ব্যবহৃত হতে পারে।',
 'sharedupload-desc-here' => 'এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।
 এর [$2 ফাইল বিবরণ পৃষ্ঠা] উপর বর্ণনা নিম্নে দেখানো হলো।',
@@ -1544,6 +1588,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 ** ফাইলের অনুলিপি',
 'filedelete-edit-reasonlist' => 'অপসারণের কারণ সম্পাদনা',
 'filedelete-maintenance' => 'রক্ষণাবেক্ষণের সময় ফাইল অপরাসণ এবং পুনরুদ্ধার সাময়িকভাবে নিস্ক্রিয় রয়েছে।',
+'filedelete-maintenance-title' => 'ফাইলটি অপসারণ করা সম্ভব নয়',
 
 # MIME search
 'mimesearch' => 'MIME অনুসন্ধান',
@@ -1590,7 +1635,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'statistics-users-active-desc' => 'ব্যবহারকারী যারা বিগত {{PLURAL:$1|দিনে|$1 দিনে}} একটি কাজ করেছেন।',
 'statistics-mostpopular' => 'সবচেয়ে বেশী বার দেখা পাতাসমূহ',
 
-'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহ',
+'disambiguations' => 'দ্ব্যর্থতা-দূরীকরণ পাতাসমূহে সংযোগকৃত পাতাসমূহ',
 'disambiguationspage' => 'Template:দ্ব্যর্থতা_নিরসন',
 'disambiguations-text' => "নিচের পাতাগুলি থেকে একটি '''দ্ব্যর্থতা নিরসন পাতা'''-তে সংযোগ আছে। এর পরিবর্তে এগুলি থেকে একটি উপযুক্ত বিষয়ে সংযোগ থাকা আবশ্যক।<br />যদি কোন পাতায় এমন কোন টেমপ্লেট থাকে যেটিতে [[MediaWiki:Disambiguationspage]] থেকে সংযোগ আছে, তবে সেই পাতাটিকে একটি দ্ব্যর্থতা নিরসন পাতা হিসেবে গণ্য করা হয়।",
 
@@ -1708,6 +1753,10 @@ $3-এর দেয়া কারণ হল ''$2''",
 'allpagesprefix' => 'এই উপসর্গবিশিষ্ট পাতাগুলো দেখাও:',
 'allpagesbadtitle' => 'প্রদত্ত পাতার শিরোনামটি অবৈধ ছিল অথবা এটিতে কোন আন্তঃভাষা বা আন্তঃউইকি উপসর্গ ছিল। এটিতে এক বা একাধিক ক্যারেক্টার থাকতে পারে যা শিরোনামে ব্যবহার করা সম্ভব নয়।',
 'allpages-bad-ns' => '{{SITENAME}}-এ "$1" নামের কোন নামস্থান নেই।',
+'allpages-hide-redirects' => 'পুনর্নির্দেশনাগুলো লুকাও',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'সাম্প্রতিকগুলো প্রদর্শন করো।',
 
 # Special:Categories
 'categories' => 'বিষয়শ্রেণীসমূহ',
@@ -1841,7 +1890,7 @@ $3-এর দেয়া কারণ হল ''$2''",
 'enotif_lastvisited' => 'আপনার শেষ আগমনের পরে সংঘটিত সমস্ত পরিবর্তনের জন্য $1 দেখুন।',
 'enotif_lastdiff' => 'এই পরিবর্তনটি দেখার জন্য $1 দেখুন।',
 'enotif_anon_editor' => 'বেনামী ব্যবহারকারী $1',
-'enotif_body' => 'প্রিয় $WATCHINGUSERNAME,
+'enotif_body' => '!প্রিয় $WATCHINGUSERNAME,
 
 {{SITENAME}}-এর $PAGETITLE শিরোনামের পাতাটি $PAGEEDITDATE তারিখে $PAGEEDITOR $CHANGEDORCREATED করেছেন। পাতাটির বর্তমান সংস্করণের জন্য $PAGETITLE_URL দেখুন।
 
@@ -1929,7 +1978,8 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => 'সুরক্ষা লগ',
-'protectlogtext' => 'নিচে পাতা বন্ধ ও খোলার একটি তালিকা দেয়া হল। বর্তমানে সক্রিয় পাতার সুরক্ষাগুলির তালিকা দেখতে [[Special:ProtectedPages|সুরক্ষিত পাতার তালিকা]] দেখুন।',
+'protectlogtext' => 'নিচে সুরক্ষিত পাতার  একটি তালিকা দেয়া হল। 
+বর্তমানে সক্রিয় পাতার সুরক্ষাগুলির তালিকা দেখতে [[Special:ProtectedPages|সুরক্ষিত পাতার তালিকা]] দেখুন।',
 'protectedarticle' => 'সুরক্ষিত "[[$1]]"',
 'modifiedarticleprotection' => '"[[$1]]"-এর জন্য সুরক্ষার স্তর পরিবর্তন করা হয়েছে',
 'unprotectedarticle' => '"[[$1]]"-এর সুরক্ষা সরিয়ে নেওয়া হয়েছে',
@@ -1954,6 +2004,7 @@ $UNWATCHURL
 'protect-level-sysop' => 'কেবল প্রশাসকদের জন্য',
 'protect-summary-cascade' => 'প্রপাতাকার',
 'protect-expiring' => '$1 (UTC) সময়ে মেয়াদোত্তীর্ণ',
+'protect-expiring-local' => 'মেয়াদ উত্তীর্ণের সময় $1',
 'protect-expiry-indefinite' => 'অসীম',
 'protect-cascade' => 'এই পাতায় অন্তর্ভুক্ত পাতাগুলিও সুরক্ষিত করা হোক (প্রপাতাকার সুরক্ষা)',
 'protect-cantedit' => 'আপনি এই পাতার সুরক্ষার স্তর পরিবর্তন করতে পারবেন না, কারণ আপনার তা সম্পাদনা করার অনুমতি নেই।',
@@ -2276,12 +2327,14 @@ $1',
 পাতা রপ্তানি করতে চাইলে নিচের টেক্সট বাক্সে শিরোনামগুলি প্রবেশ করান, প্রতি লাইনে একটি শিরোনাম দিয়ে, এবং নির্বাচন করুন আপনি বর্তমান সংস্করণসহ সবগুলি পুরনো সংস্করণ পাতার ইতিহাসের লাইনসহ রপ্তানি করতে চান, নাকি কেবল সর্বশেষ সম্পাদনাটির তথ্যসহ বর্তমান সংস্করণটি রপ্তানি করতে চান।
 
 দ্বিতীয় ক্ষেত্রটিতে আপনি একটি সংযোগও ব্যবহার করতে পারেন, যেমন "[[{{MediaWiki:Mainpage}}]]" পাতাটির জন্য [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'সকল পাতা রপ্তানি',
 'exportcuronly' => 'সম্পূর্ণ ইতিহাস নয়, কেবল বর্তমান সংশোধনটি অন্তর্ভুক্ত করা হোক',
 'exportnohistory' => "----
 '''লক্ষ্য করুন:''' কর্মদক্ষতা-সম্পর্কিত কারণের জন্য এই ফর্মের মাধ্যমে কোন পাতার সমগ্র ইতিহাস রপ্তানি করা নিষ্ক্রিয় করা হয়েছে।",
 'export-submit' => 'রপ্তানি করা হোক',
 'export-addcattext' => 'এই বিষয়শ্রেণী থেকে পাতা যোগ করা হোক:',
 'export-addcat' => 'যোগ',
+'export-addnstext' => 'নামস্থান থেকে পাতা যুক্ত করুন:',
 'export-addns' => 'যোগ',
 'export-download' => 'ফাইল হিসেবে সংরক্ষণ করা হোক',
 
@@ -2353,6 +2406,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' => 'যে আইপি ঠিকানা থেকে আপনি সম্পাদনা করছেন, তার ব্যবহারকারী পাতা',
@@ -2413,6 +2469,7 @@ $1',
 'tooltip-diff' => 'আপনি টেক্সটে কী কী পরিবর্তন করেছেন, তা দেখানো হোক।',
 'tooltip-compareselectedversions' => 'এই পাতার দুইটি নির্বাচিত সংস্করণের মধ্যে তুলনা দেখুন।',
 'tooltip-watch' => 'এই পাতাটি আমার নজরতালিকায় যোগ করো',
+'tooltip-watchlistedit-normal-submit' => 'শিরোনাম অপসারণ',
 'tooltip-recreate' => 'মুছে ফেলা সত্ত্বেও পাতাটি পুনরায় সৃষ্টি করুন',
 'tooltip-upload' => 'আপলোড শুরু করো',
 'tooltip-rollback' => '"পুনর্বহাল" এই পাতায় সর্বশেষ অবদানকারীর সম্পাদনাসমূহ বাতিল করে পাতাটিকে পূর্বাবস্থায় ফিরিয়ে দেয়',
@@ -2866,6 +2923,7 @@ $1',
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'কিলোমিটার',
 'exif-gpsdestdistance-m' => 'ফাইল',
+'exif-gpsdestdistance-n' => 'নটিক্যাল মাইল',
 
 'exif-gpsdop-excellent' => 'খুব ভাল ($1)',
 'exif-gpsdop-good' => 'ভাল ($1)',
@@ -2893,6 +2951,7 @@ $1',
 
 'exif-rating-rejected' => 'প্রত্যাখাত',
 
+'exif-iimcategory-ace' => 'শিল্প, সংস্কৃতি এবং বিনোদন',
 'exif-iimcategory-clj' => 'অপরাধ ও আইন',
 'exif-iimcategory-dis' => 'দুর্যোগ ও দুর্ঘটনা',
 'exif-iimcategory-fin' => 'অর্থনীতি এবং বাণিজ্য',
@@ -2971,11 +3030,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' => '← পূর্ববর্তী পাতা',
@@ -3064,6 +3125,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'version-software' => 'ইনস্টলকৃত সফটওয়্যার',
 'version-software-product' => 'পণ্য',
 'version-software-version' => 'সংস্করণ',
+'version-entrypoints-header-url' => 'ইউআরএল',
 
 # Special:FilePath
 'filepath' => 'ফাইলের পাথ',
@@ -3104,14 +3166,14 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'intentionallyblankpage' => 'এই পাতাটি ইচ্ছা করে খালি রাখা হয়েছে',
 
 # External image whitelist
-'external_image_whitelist' => '  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন
+'external_image_whitelist' => '  #এই লাইন ঠিক যেমন আছে<প্রাক> তেমন রাখুন<pre>
  #রেগুলার এক্সপ্রেশনের টুকরা নীচে (শুধুমাত্র অংশ / / মধ্যে যে যায়) বসান
 #এইগুলি এক্সটার্নাল (hotlinked) ইমেজের URL-এর সাথে মেলানো হবে
 #যেগুলি মিলবে, সেগুলি চিত্র হিসাবে প্রদর্শিত হবে, অন্যথায় শুধুমাত্র ইমেজ লিঙ্ক প্রদর্শিত হবে
 #যে লাইনের প্রারম্ভে # আছে সেই লাইনগুলি মন্তব্যসমূহ হিসাবে ব্যবহার করা হয়
 #এটি কেস-অসংবেদী
 
-#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</ প্রাক>',
+#এই রেখার উপরের regex টুকরা বসান. এই লাইন ঠিক যেমন আছে তেমন রাখুন</pre>',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ট্যাগ]] ছাকনী:',
@@ -3130,6 +3192,9 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'compare-rev1' => 'সংশোধন ১',
 'compare-rev2' => 'সংশোধন ২',
 'compare-submit' => 'তুলনা',
+'compare-invalid-title' => 'আপনার প্রদেয় শিরোনামটি সঠিক নয়।',
+'compare-title-not-exists' => 'আপনার কাঙ্ক্ষিত শিরোনামটি নেই।',
+'compare-revision-not-exists' => 'আপনার কাঙ্ক্ষিত সংস্করণটি নেই।',
 
 # Database error messages
 'dberr-header' => 'এই উইকিতে কোন সমস্যা রয়েছে',
@@ -3143,14 +3208,33 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 
 # HTML forms
 'htmlform-invalid-input' => 'আপনার প্রদানকৃত ইনপুটে সমস্যা রয়েছে',
+'htmlform-select-badoption' => 'যে মান আপনি উল্লেখ করেছেন তা গ্রহণযোগ্য অপশন নয়।',
 'htmlform-required' => 'মান প্রদান করা আবশ্যক।',
 'htmlform-submit' => 'জমা দাও',
 'htmlform-reset' => 'পরিবর্তন বাতিল',
 'htmlform-selectorother-other' => 'অন্য',
 
 # 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
@@ -3162,6 +3246,10 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'feedback-error1' => 'ত্রুটি: এপিআই থেকে অজানা ফলাফল এসেছে',
 'feedback-error2' => 'ত্রুটি: সম্পাদনা ব্যর্থ',
 'feedback-error3' => 'ত্রুটি: এপিআই থেকে কোন সাড়া নেই',
+'feedback-thanks' => 'ধন্যবাদ! আপনার মতামত "[$2 $1]" পাতায় করা হয়েছে।',
+'feedback-close' => 'সম্পন্ন',
+'feedback-bugcheck' => 'উত্তম! পরিক্ষা করে দেখুন অবিলম্বে  [$1  জানা বাগ] কিনা।',
+'feedback-bugnew' => 'আমি পরীক্ষা করেছি। নতুন একটি বাগ রিপোর্ট করুন।',
 
 # API errors
 'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
@@ -3172,6 +3260,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' => 'এই ফাইল নামটি খুবই ছোট।',
@@ -3196,7 +3285,19 @@ $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' => 'সম্ভবত এই ফাইলটি ত্রুটিপূর্ণ অথবা এর এক্সটেনশনটি ভুল।',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|সেকেন্ড|সেকেন্ড}}',
+'duration-minutes' => '$1 {{PLURAL:$1|মিনিট|মিনিট}}',
+'duration-hours' => '$1 {{PLURAL:$1|ঘন্টা|ঘন্টা}}',
+'duration-days' => '$1 {{PLURAL:$1|দিন|দিন}}',
+'duration-weeks' => '{{PLURAL: $1|সপ্তাহ|সপ্তাহ}}',
+'duration-years' => '$1 {{PLURAL:$1|বছর|বছর}}',
+'duration-decades' => '$1 {{PLURAL:$1|দশক|দশক}}',
+'duration-centuries' => '$1 {{PLURAL:$1|শতাব্দী|শতাব্দী}}',
+'duration-millennia' => '$1 {{PLURAL:$1|সহস্রাব্দ|সহস্রাব্দ}}',
+
 );
index 7d8dd6c..aeccfb7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Bishnupria Manipuri (à¦\87মার à¦ à¦¾à¦°/বিষà§\8dণà§\81পà§\8dরিয়া à¦®à¦£à¦¿à¦ªà§\81রà§\80)
+/** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -813,7 +813,6 @@ $2',
 
 # Diffs
 'history-title' => '"$1"-র রিভিসন ইতিহাসহান',
-'difference' => '(রিভিসনহানির ফারাকহান)',
 'lineno' => 'লাইন $1:',
 'compareselectedversions' => 'বাসাইল সংস্করণহানি তুলনা কর',
 'showhideselectedversions' => 'বাসিসি রিভিশনহানি দেখাদে/গুর',
index 729184c..12ff736 100644 (file)
@@ -17,317 +17,317 @@ $fallback = 'fa';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'لینکهای خط به زیر',
-'tog-justify'                 => 'فاصله نهادن سی پاراگرافها',
-'tog-hideminor'               => 'من ته نبیدن تغییرات کوچیک',
-'tog-extendwatchlist'         => 'گپ کردن لیستهای من ته سی دیدن همه تغییراتی که ابوه',
-'tog-usenewrc'                => 'گپ کردن تغییرات آخری - جاوااسکریپت',
-'tog-numberheadings'          => 'شماره وندن خودکار سی سرخط ها',
-'tog-showtoolbar'             => 'نشو دادن تغییرات  تولبار  یا   جای نشودادن ابزارها- جاوااسکریپت',
-'tog-editondblclick'          => 'اصلاح صفحات با دوبار کلیک - جاوااسکریپت',
-'tog-editsection'             => 'امکان اصلاح یه قسمت زه راه لینکها',
+'tog-underline' => 'لینکهای خط به زیر',
+'tog-justify' => 'فاصله نهادن سی پاراگرافها',
+'tog-hideminor' => 'من ته نبیدن تغییرات کوچیک',
+'tog-extendwatchlist' => 'گپ کردن لیستهای من ته سی دیدن همه تغییراتی که ابوه',
+'tog-usenewrc' => 'گپ کردن تغییرات آخری - جاوااسکریپت',
+'tog-numberheadings' => 'شماره وندن خودکار سی سرخط ها',
+'tog-showtoolbar' => 'نشو دادن تغییرات  تولبار  یا   جای نشودادن ابزارها- جاوااسکریپت',
+'tog-editondblclick' => 'اصلاح صفحات با دوبار کلیک - جاوااسکریپت',
+'tog-editsection' => 'امکان اصلاح یه قسمت زه راه لینکها',
 'tog-editsectiononrightclick' => 'امکان اصلاح یه قسمت زه راه راست کلیک کردن رو عنوان  اوقسمت- جاوااسکریپت',
-'tog-showtoc'                 => 'نشودادن فهرست محتوا سی صفحاتی که بیشتر زه سه سرخط دارن',
-'tog-rememberpassword'        => 'به حافظه کامپیوتر دادن نحوه ورودی خوم (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'          => 'اضاف کردن اوصفحاتی که خوم درست کردم به فهرست نمایشی',
-'tog-watchdefault'            => 'اضاف کردن اوصفحاتی که خوم اصلاح کردم به فهرست نمایشی',
-'tog-watchmoves'              => 'اضاف کردن صفحاتی که خوم جابجا کردم به فهرست نمایشی',
-'tog-watchdeletion'           => 'اضاف کردن صفحاتی که خوم پاک کردم به فهرست نمایشی خوم',
-'tog-minordefault'            => 'علامت نهادن به اصلاحات ناقص',
-'tog-previewontop'            => 'نشودادن پیش نمایش قبل از یوکه جعبه یا کادر اصلاح بوه',
-'tog-previewonfirst'          => 'نشو دادن پیش نمایش  دراصلاح اول',
-'tog-nocache'                 => 'ناتوان کردن صفحه  درحال کچ',
-'tog-enotifwatchlistpages'    => 'امیل به مو وقتی که  صفحه ای که منه فهرست نمایش مونه تغییر کرد',
-'tog-enotifusertalkpages'     => 'امیل به مو وقتی که صفحه گفتگوی مو تغییر کرد',
-'tog-enotifminoredits'        => 'امیل به مو سی صفحات ناقص اصلاح شده',
-'tog-enotifrevealaddr'        => 'نشودادن امیل مو درامیلهای آگاهی-خبری',
-'tog-shownumberswatching'     => 'نشودادن شماره کاربران درحال کار یاتماشا',
-'tog-fancysig'                => 'امضاهای ناتمام - بدون لینکهای اتوماتیک',
-'tog-externaleditor'          => 'بی دقتی در استفاده از اصلاح کننده های خارجی',
-'tog-externaldiff'            => 'استفاده زه برنامه های مختلف خارجی بوسیله پیش نمایش(سی تجربه کردن فقط نیاز به تنظیم خاص کامپیوترتان دارین)',
-'tog-showjumplinks'           => 'قادر ساختن "پرش به" لینکهای دردسترس',
-'tog-uselivepreview'          => 'استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )',
-'tog-forceeditsummary'        => 'یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه',
-'tog-watchlisthideown'        => 'قایم کردن اصلاحات مو  زه لیست پیگیریها',
-'tog-watchlisthidebots'       => 'قایم کردن اصلاحات بوت زه لیست پیگیریها',
-'tog-watchlisthideminor'      => 'قایم کردن اصلاحات ریز زه لیست پیگیریها',
-'tog-watchlisthideliu'        => 'قایم کردن اصلاحات انجام وابیده  بوسیله کاربران داخل سیستم وابیده زه لیست پیگیریها',
-'tog-watchlisthideanons'      => 'قایم کردن اصلاحات انجام شده بوسیله کاربران داخل سیستم نشده زه لیست پیگیری',
-'tog-ccmeonemails'            => 'ارسال کپی امیلهایی که مو به  کاربران دیه ارسال کردم به مو',
-'tog-diffonly'                => 'نشو نده صفحه ای که دارای محتوای متفاوت زیره',
-'tog-showhiddencats'          => 'نشودادن دسته بندیهای قایم شده',
-
-'underline-always'  => 'همیشه',
-'underline-never'   => 'هرگز',
+'tog-showtoc' => 'نشودادن فهرست محتوا سی صفحاتی که بیشتر زه سه سرخط دارن',
+'tog-rememberpassword' => 'به حافظه کامپیوتر دادن نحوه ورودی خوم (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-watchcreations' => 'اضاف کردن اوصفحاتی که خوم درست کردم به فهرست نمایشی',
+'tog-watchdefault' => 'اضاف کردن اوصفحاتی که خوم اصلاح کردم به فهرست نمایشی',
+'tog-watchmoves' => 'اضاف کردن صفحاتی که خوم جابجا کردم به فهرست نمایشی',
+'tog-watchdeletion' => 'اضاف کردن صفحاتی که خوم پاک کردم به فهرست نمایشی خوم',
+'tog-minordefault' => 'علامت نهادن به اصلاحات ناقص',
+'tog-previewontop' => 'نشودادن پیش نمایش قبل از یوکه جعبه یا کادر اصلاح بوه',
+'tog-previewonfirst' => 'نشو دادن پیش نمایش  دراصلاح اول',
+'tog-nocache' => 'ناتوان کردن صفحه  درحال کچ',
+'tog-enotifwatchlistpages' => 'امیل به مو وقتی که  صفحه ای که منه فهرست نمایش مونه تغییر کرد',
+'tog-enotifusertalkpages' => 'امیل به مو وقتی که صفحه گفتگوی مو تغییر کرد',
+'tog-enotifminoredits' => 'امیل به مو سی صفحات ناقص اصلاح شده',
+'tog-enotifrevealaddr' => 'نشودادن امیل مو درامیلهای آگاهی-خبری',
+'tog-shownumberswatching' => 'نشودادن شماره کاربران درحال کار یاتماشا',
+'tog-fancysig' => 'امضاهای ناتمام - بدون لینکهای اتوماتیک',
+'tog-externaleditor' => 'بی دقتی در استفاده از اصلاح کننده های خارجی',
+'tog-externaldiff' => 'استفاده زه برنامه های مختلف خارجی بوسیله پیش نمایش(سی تجربه کردن فقط نیاز به تنظیم خاص کامپیوترتان دارین)',
+'tog-showjumplinks' => 'قادر ساختن "پرش به" لینکهای دردسترس',
+'tog-uselivepreview' => 'استفاده زه پیش نمایش زنده(جاوااسکریپ) (تجربی )',
+'tog-forceeditsummary' => 'یادآوری سریع به مو هنگام اصلاح عقیم وخلاصه',
+'tog-watchlisthideown' => 'قایم کردن اصلاحات مو  زه لیست پیگیریها',
+'tog-watchlisthidebots' => 'قایم کردن اصلاحات بوت زه لیست پیگیریها',
+'tog-watchlisthideminor' => 'قایم کردن اصلاحات ریز زه لیست پیگیریها',
+'tog-watchlisthideliu' => 'قایم کردن اصلاحات انجام وابیده  بوسیله کاربران داخل سیستم وابیده زه لیست پیگیریها',
+'tog-watchlisthideanons' => 'قایم کردن اصلاحات انجام شده بوسیله کاربران داخل سیستم نشده زه لیست پیگیری',
+'tog-ccmeonemails' => 'ارسال کپی امیلهایی که مو به  کاربران دیه ارسال کردم به مو',
+'tog-diffonly' => 'نشو نده صفحه ای که دارای محتوای متفاوت زیره',
+'tog-showhiddencats' => 'نشودادن دسته بندیهای قایم شده',
+
+'underline-always' => 'همیشه',
+'underline-never' => 'هرگز',
 'underline-default' => 'پیش نمایش مرورگر',
 
 # 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'                  => 'دسته های فرعی',
-'category-media-header'          => 'مدیا دردسته "$1"',
-'category-empty'                 => 'ای دسته درحال حاضر دارای هیچ صفحه یا مدیایی نه',
-'hidden-categories'              => '{{PLURAL:$1|دسته قایم|دسته های قایم}}',
-'hidden-category-category'       => 'دسته های قایم',
-'category-subcat-count'          => '{{PLURAL:$2|ای دسته فقط دسته های فرعی زیر راداره.|ای دسته چیزهای زیر راداره {{PLURAL:$1|دسته فرعی|$1 دسته های فرعی}}, بیشتراز$2 کل.}}',
-'category-subcat-count-limited'  => 'ای دسته چیزهای زیر راداره {{PLURAL:$1|دسته فرعی|$1 دسته های فرعی}}.',
-'category-article-count'         => '{{PLURAL:$2|ای دسته فقط دارای صفحات زیره.|ذیل الذکر{{PLURAL:$1|صفحه است|$1 صفحات هستند}} دراین دسته, بیشترزه$2 کل.}}',
+'pagecategories' => '{{PLURAL:$1|دسته|دسته ها}}',
+'category_header' => 'صفحات دردسته "$1"',
+'subcategories' => 'دسته های فرعی',
+'category-media-header' => 'مدیا دردسته "$1"',
+'category-empty' => 'ای دسته درحال حاضر دارای هیچ صفحه یا مدیایی نه',
+'hidden-categories' => '{{PLURAL:$1|دسته قایم|دسته های قایم}}',
+'hidden-category-category' => 'دسته های قایم',
+'category-subcat-count' => '{{PLURAL:$2|ای دسته فقط دسته های فرعی زیر راداره.|ای دسته چیزهای زیر راداره {{PLURAL:$1|دسته فرعی|$1 دسته های فرعی}}, بیشتراز$2 کل.}}',
+'category-subcat-count-limited' => 'ای دسته چیزهای زیر راداره {{PLURAL:$1|دسته فرعی|$1 دسته های فرعی}}.',
+'category-article-count' => '{{PLURAL:$2|ای دسته فقط دارای صفحات زیره.|ذیل الذکر{{PLURAL:$1|صفحه است|$1 صفحات هستند}} دراین دسته, بیشترزه$2 کل.}}',
 'category-article-count-limited' => 'ذیل الذکر {{PLURAL:$1|صفحه است|$1 صفحات هستند}} درآن دسته جریانی.',
-'category-file-count'            => '{{PLURAL:$2|ای دسته فقط فایلهای زیر راداره.|ذیل الذکر{{PLURAL:$1|فایل است|$1 فایلهاهستند}} درای دسته, بیشترزه$2 کل.}}',
-'category-file-count-limited'    => 'ذیل الذکر {{PLURAL:$1|فایل است|$1 فایلها هستند}} درآن دسته جریانی.',
-'listingcontinuesabbrev'         => 'دنباله',
+'category-file-count' => '{{PLURAL:$2|ای دسته فقط فایلهای زیر راداره.|ذیل الذکر{{PLURAL:$1|فایل است|$1 فایلهاهستند}} درای دسته, بیشترزه$2 کل.}}',
+'category-file-count-limited' => 'ذیل الذکر {{PLURAL:$1|فایل است|$1 فایلها هستند}} درآن دسته جریانی.',
+'listingcontinuesabbrev' => 'دنباله',
 
-'about'     => 'درباره',
+'about' => 'درباره',
 'newwindow' => '(پنجره تازه واز کن)',
-'cancel'    => 'لغو',
-'mytalk'    => 'صحبت مو',
+'cancel' => 'لغو',
+'mytalk' => 'صحبت مو',
 
 # Cologne Blue skin
-'qbfind'  => 'پیدا کردن',
-'qbedit'  => 'اصلاح',
-'faq'     => 'اف ای کیو',
+'qbfind' => 'پیدا کردن',
+'qbedit' => 'اصلاح',
+'faq' => 'اف ای کیو',
 'faqpage' => 'Project:اف ای کیو',
 
-'errorpagetitle'   => 'خطا',
-'returnto'         => 'بازگشت به $1.',
-'tagline'          => 'از {{SITENAME}}',
-'help'             => 'راهنما',
-'search'           => 'جستن',
-'searchbutton'     => 'جستن',
-'searcharticle'    => 'برو',
-'history'          => 'گزارش صفحه',
-'history_short'    => 'گزارش تاریخی',
+'errorpagetitle' => 'خطا',
+'returnto' => 'بازگشت به $1.',
+'tagline' => 'از {{SITENAME}}',
+'help' => 'راهنما',
+'search' => 'جستن',
+'searchbutton' => 'جستن',
+'searcharticle' => 'برو',
+'history' => 'گزارش صفحه',
+'history_short' => 'گزارش تاریخی',
 'printableversion' => 'نسخه قابل چاپ',
-'permalink'        => 'لینک دایمی',
-'edit'             => 'اصلاح',
-'editthispage'     => 'اصلاح ای صفحه',
-'delete'           => 'حذف',
-'protect'          => 'حفاظت وحمایت',
-'newpage'          => 'صفحه تازه',
-'talkpage'         => 'بحث ای صفحه',
+'permalink' => 'لینک دایمی',
+'edit' => 'اصلاح',
+'editthispage' => 'اصلاح ای صفحه',
+'delete' => 'حذف',
+'protect' => 'حفاظت وحمایت',
+'newpage' => 'صفحه تازه',
+'talkpage' => 'بحث ای صفحه',
 'talkpagelinktext' => 'صحبت',
-'specialpage'      => 'صفحه مخصوص',
-'personaltools'    => 'ابزارهای شخصی',
-'postcomment'      => 'ارسال یک توضیح',
-'articlepage'      => 'دیدن صفحه محتوا',
-'talk'             => 'بحث',
-'views'            => 'مشاهدات',
-'toolbox'          => '
+'specialpage' => 'صفحه مخصوص',
+'personaltools' => 'ابزارهای شخصی',
+'postcomment' => 'ارسال یک توضیح',
+'articlepage' => 'دیدن صفحه محتوا',
+'talk' => 'بحث',
+'views' => 'مشاهدات',
+'toolbox' => '
 جعبه ابزار',
-'userpage'         => 'دیدن صفحه کاربر',
-'projectpage'      => 'دیدن صفحه پروژه',
-'imagepage'        => 'دیدن صفحه مدیا',
-'mediawikipage'    => 'دیدن صفحه پیام',
-'templatepage'     => 'دیدن صفحه قالب',
-'viewhelppage'     => 'دیدن صفحه کمک',
-'categorypage'     => 'دیدن صفحه طبقه بندی',
-'viewtalkpage'     => 'دیدن بحث ها',
-'otherlanguages'   => 'درزبانهای دیگر',
-'redirectedfrom'   => '(تصحیح مجدداز$1)',
-'redirectpagesub'  => 'صفحه تصحیح وهدایت مجدد',
-'lastmodifiedat'   => 'این صفحه اخیرا تغییر واصلاح شددر $1, در $2.',
-'viewcount'        => 'این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.',
-'protectedpage'    => 'صفحه حمایت شده',
-'jumpto'           => 'پریدن به:',
+'userpage' => 'دیدن صفحه کاربر',
+'projectpage' => 'دیدن صفحه پروژه',
+'imagepage' => 'دیدن صفحه مدیا',
+'mediawikipage' => 'دیدن صفحه پیام',
+'templatepage' => 'دیدن صفحه قالب',
+'viewhelppage' => 'دیدن صفحه کمک',
+'categorypage' => 'دیدن صفحه طبقه بندی',
+'viewtalkpage' => 'دیدن بحث ها',
+'otherlanguages' => 'درزبانهای دیگر',
+'redirectedfrom' => '(تصحیح مجدداز$1)',
+'redirectpagesub' => 'صفحه تصحیح وهدایت مجدد',
+'lastmodifiedat' => 'این صفحه اخیرا تغییر واصلاح شددر $1, در $2.',
+'viewcount' => 'این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.',
+'protectedpage' => 'صفحه حمایت شده',
+'jumpto' => 'پریدن به:',
 'jumptonavigation' => 'راندن یا هدایت کردن',
-'jumptosearch'     => 'جستن',
+'jumptosearch' => 'جستن',
 
 # 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'            => 'محتوا باای شماره قابل دسترسیه
+'aboutsite' => 'درباره {{SITENAME}}',
+'aboutpage' => 'Project:درباره',
+'copyright' => 'محتوا باای شماره قابل دسترسیه
  $1.',
-'copyrightpage'        => '{{ns:project}}:کپی رایت',
-'currentevents'        => 'اتفاقات جاری',
-'currentevents-url'    => 'Project:اتفاقات جاری',
-'disclaimers'          => 'انکار کننده ها',
-'disclaimerpage'       => 'Project:انکار کاربران',
-'edithelp'             => 'کمک برای اصلاح',
-'edithelppage'         => 'Help:اصلاح',
-'helppage'             => 'Help:محتوا',
-'mainpage'             => 'صفحه اصلی',
+'copyrightpage' => '{{ns:project}}:کپی رایت',
+'currentevents' => 'اتفاقات جاری',
+'currentevents-url' => 'Project:اتفاقات جاری',
+'disclaimers' => 'انکار کننده ها',
+'disclaimerpage' => 'Project:انکار کاربران',
+'edithelp' => 'کمک برای اصلاح',
+'edithelppage' => 'Help:اصلاح',
+'helppage' => 'Help:محتوا',
+'mainpage' => 'صفحه اصلی',
 'mainpage-description' => 'صفحه اصلی',
-'policy-url'           => 'Project:خط مشی',
-'portal'               => 'درگاه کاربران',
-'portal-url'           => 'Project:درگاه کاربران',
-'privacy'              => 'خط مشی رازداری',
-'privacypage'          => 'Project:خط مشی رازداری',
+'policy-url' => 'Project:خط مشی',
+'portal' => 'درگاه کاربران',
+'portal-url' => 'Project:درگاه کاربران',
+'privacy' => 'خط مشی رازداری',
+'privacypage' => 'Project:خط مشی رازداری',
 
-'badaccess'        => 'خطا :اجازه بگیر',
+'badaccess' => 'خطا :اجازه بگیر',
 'badaccess-group0' => 'ایسا اجازه انجام کاری که خواستین را ندارین',
 'badaccess-groups' => 'او کاری که ایسا درخواست کردین فقط سی کاربرانیه که من ای  گروهن
 {{PLURAL:$2|آن گروه|یکی زه گروهها}}: $1.',
 
-'versionrequired'     => 'یه نسخه زه نیازمندیهای ویکی مدیا
+'versionrequired' => 'یه نسخه زه نیازمندیهای ویکی مدیا
 $1',
 'versionrequiredtext' => 'یه نسخه زه ویکی مدیا($1) نیازمند ه به استفاده زه ای صفحه
 بوین :[[Special:Version|version page]].',
 
-'ok'                      => 'خووه',
+'ok' => 'خووه',
 'pagetitle-view-mainpage' => 'سرصفحه',
-'retrievedfrom'           => 'بازیافت از"$1"',
-'youhavenewmessages'      => 'پیام تاره داری $1 ($2).',
-'newmessageslink'         => 'پیام تازه',
-'newmessagesdifflink'     => 'تغییر آخری',
+'retrievedfrom' => 'بازیافت از"$1"',
+'youhavenewmessages' => 'پیام تاره داری $1 ($2).',
+'newmessageslink' => 'پیام تازه',
+'newmessagesdifflink' => 'تغییر آخری',
 'youhavenewmessagesmulti' => 'ایسا پیام تازه دارین منه
 $1',
-'editsection'             => 'اصلاح',
-'editold'                 => 'اصلاح',
-'viewsourceold'           => 'دیدن منبع',
-'editsectionhint'         => 'اصلاح یه قسمت: $1',
-'toc'                     => 'محتواها',
-'showtoc'                 => 'نمایش',
-'hidetoc'                 => 'قایم',
-'thisisdeleted'           => 'دیدن یا اعاده $1?',
-'viewdeleted'             => 'دیدن$1?',
-'restorelink'             => '{{PLURAL:$1|پاک کردن یه اصلاح|$1 پاک کردن اصلاحات}}',
-'feedlinks'               => 'تغذیه:',
-'feed-invalid'            => 'اشتراک  زه راه  تایپ باطله',
-'site-rss-feed'           => 'خبرخو RSS سی $1',
-'site-atom-feed'          => 'خبرخو Atom سی $1',
-'page-rss-feed'           => 'خبرخو RSS سی «$1»',
+'editsection' => 'اصلاح',
+'editold' => 'اصلاح',
+'viewsourceold' => 'دیدن منبع',
+'editsectionhint' => 'اصلاح یه قسمت: $1',
+'toc' => 'محتواها',
+'showtoc' => 'نمایش',
+'hidetoc' => 'قایم',
+'thisisdeleted' => 'دیدن یا اعاده $1?',
+'viewdeleted' => 'دیدن$1?',
+'restorelink' => '{{PLURAL:$1|پاک کردن یه اصلاح|$1 پاک کردن اصلاحات}}',
+'feedlinks' => 'تغذیه:',
+'feed-invalid' => 'اشتراک  زه راه  تایپ باطله',
+'site-rss-feed' => 'خبرخو RSS سی $1',
+'site-atom-feed' => 'خبرخو Atom سی $1',
+'page-rss-feed' => 'خبرخو RSS سی «$1»',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'     => 'صفحه کاربر',
-'nstab-project'  => 'صفحه پروژه',
-'nstab-image'    => 'فایل',
+'nstab-user' => 'صفحه کاربر',
+'nstab-project' => 'صفحه پروژه',
+'nstab-image' => 'فایل',
 'nstab-template' => 'قالب یا الگو',
 'nstab-category' => 'دسته',
 
 # General errors
-'badtitle'       => 'عنوان بد',
-'badtitletext'   => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرسته
+'badtitle' => 'عنوان بد',
+'badtitletext' => 'عنوان درخواستی نامعتبر، خالی، یا عنوانی بین زبانی یا بین‌ویکی‌ای با پیوند نادرسته
 و ممکنه دارای یک یا چند کاراکتر بوه که در عنوان مربوط نوا زش استفاده کنین',
-'viewsource'     => 'مشاهده منبع',
+'viewsource' => 'مشاهده منبع',
 'viewsourcetext' => 'ایسا ترین بوینین وکپی کنین منبع ای صفحه را:',
 
 # Login and logout pages
-'yourname'                => 'نام کاربر:',
-'yourpassword'            => 'رمز:',
-'remembermypassword'      => 'رمز اویدن به سیستم را دراین رایانه به خاطر بسپار (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'اویدن به سیستم',
+'yourname' => 'نام کاربر:',
+'yourpassword' => 'رمز:',
+'remembermypassword' => 'رمز اویدن به سیستم را دراین رایانه به خاطر بسپار (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'اویدن به سیستم',
 'nav-login-createaccount' => 'اویدن به سیستم',
-'loginprompt'             => 'ایسا وا کوکی ها رافعال کنین سی اویدن به  {{SITENAME}}.',
-'userlogin'               => 'اویدن به سیستم / درست کردن حساب کاربری',
-'logout'                  => 'رهدن زه سیستم',
-'userlogout'              => 'رهدن زه سیستم',
-'nologin'                 => "آیا ایسا حساب کاربری ندارین? '''$1'''.",
-'nologinlink'             => 'درست کردن یه حساب کاربری',
-'createaccount'           => 'درست کردن حساب کاربری',
-'gotaccount'              => "آیا تقریبا یه حساب کاربری دارین? '''$1'''.",
-'gotaccountlink'          => 'اویدن به',
-'loginsuccesstitle'       => 'اویدن با بخت وتوفیق به سیستم',
-'loginsuccess'            => "''' ایسا اویدن به داخل سایت {{SITENAME}} بعنوان \"\$1\".'''",
-'nosuchuser'              => 'کاربری به ای نام وجود نداره "$1".
+'loginprompt' => 'ایسا وا کوکی ها رافعال کنین سی اویدن به  {{SITENAME}}.',
+'userlogin' => 'اویدن به سیستم / درست کردن حساب کاربری',
+'logout' => 'رهدن زه سیستم',
+'userlogout' => 'رهدن زه سیستم',
+'nologin' => "آیا ایسا حساب کاربری ندارین? '''$1'''.",
+'nologinlink' => 'درست کردن یه حساب کاربری',
+'createaccount' => 'درست کردن حساب کاربری',
+'gotaccount' => "آیا تقریبا یه حساب کاربری دارین? '''$1'''.",
+'gotaccountlink' => 'اویدن به',
+'loginsuccesstitle' => 'اویدن با بخت وتوفیق به سیستم',
+'loginsuccess' => "''' ایسا اویدن به داخل سایت {{SITENAME}} بعنوان \"\$1\".'''",
+'nosuchuser' => 'کاربری به ای نام وجود نداره "$1".
 حروف نام را چک کنین, یا [[Special:UserLogin/signup|درست کنین یه حساب کاربری تازه]].',
-'nosuchusershort'         => 'کاربری به ای نام وجود نداره"$1".
+'nosuchusershort' => 'کاربری به ای نام وجود نداره"$1".
 حروف نام راچک کنین.',
-'nouserspecified'         => 'ایسا دارین یه نام کاربر ذکر اکنین.',
-'wrongpassword'           => 'رمز وارد وابیده درست نه.
+'nouserspecified' => 'ایسا دارین یه نام کاربر ذکر اکنین.',
+'wrongpassword' => 'رمز وارد وابیده درست نه.
 لطفا دوباره سعی کنین.',
-'wrongpasswordempty'      => 'رمز وارد وابیده عقیم یامبهم بی.
+'wrongpasswordempty' => 'رمز وارد وابیده عقیم یامبهم بی.
 لطفا دوباره سعی کنین.',
-'passwordtooshort'        => 'رمز ایسا غیر معتبر یا کوتاه هده.
+'passwordtooshort' => 'رمز ایسا غیر معتبر یا کوتاه هده.
 آن وا داشته بوه حداقل {{PLURAL:$1|1 کاراکتر|$1 کاراکترها}} همچنین وا زه نام کاربریتو متفاوت بوه.',
-'mailmypassword'          => 'امیل رمز تازه',
-'passwordremindertitle'   => 'رمز موقتی تازه سی {{SITENAME}}',
-'passwordremindertext'    => 'یه نفر (شاید خودتو, زه نشانی آی پی$1) درخواست یه رمز تازه کرده سی {{SITENAME}} ($4). یه رمز موقتی سی کاربر
+'mailmypassword' => 'امیل رمز تازه',
+'passwordremindertitle' => 'رمز موقتی تازه سی {{SITENAME}}',
+'passwordremindertext' => 'یه نفر (شاید خودتو, زه نشانی آی پی$1) درخواست یه رمز تازه کرده سی {{SITENAME}} ($4). یه رمز موقتی سی کاربر
 "$2" درست شده وگذاشته وابیده به"$3". ایر مطابق میل ایسا بوه, نیازه که داخل سیستم بوین ویه رمز تازه انتخاب کنین.
 
 ایر آن فرد همچنین درخواست کرده بوه  یونه, یا ایر ایسا رمزتو را به خاط داشته این ,
 وسی مدت طولانی نه خوین هونه تغییر بدین, ایسا وا نادیده بگیرین ای پیام  را وهمچنان زه رمز قدیمی خوتو استفاده کنین',
-'noemail'                 => 'وجود نداره نشانی امیل ضبط وابده زه کاریر "$1".',
-'passwordsent'            => 'یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی "$1".
+'noemail' => 'وجود نداره نشانی امیل ضبط وابده زه کاریر "$1".',
+'passwordsent' => 'یه رمز تازه ارسال وابید به نشانی امیل ثبت وابده سی "$1".
 لطفا بعد از دریافت آن داخل سیستم بوین.',
-'eauthentsent'            => 'یه نامه الکترونیکی سی تایید نشانی پست الکترونیکی به نشانی مورنظر ارسال وابید. قبل زه یو که نامه دیگری قابل ارسال به این نشانی بوه، وا دستورهایی که در آن نامه اویده را جهت تأیید ای مساله که ای نشانی مال ایسانه اجرا کنین.',
+'eauthentsent' => 'یه نامه الکترونیکی سی تایید نشانی پست الکترونیکی به نشانی مورنظر ارسال وابید. قبل زه یو که نامه دیگری قابل ارسال به این نشانی بوه، وا دستورهایی که در آن نامه اویده را جهت تأیید ای مساله که ای نشانی مال ایسانه اجرا کنین.',
 
 # Change password dialog
 'retypenew' => 'تایپ دوباره رمز:',
 
 # Edit page toolbar
-'bold_sample'     => 'متن گپ نما',
-'bold_tip'        => 'متن گپ نما',
-'italic_sample'   => 'متن شکسته',
-'italic_tip'      => 'متن شکسته',
-'link_sample'     => 'عنوان لینک',
-'link_tip'        => 'لینک داخلی',
-'extlink_sample'  => 'http://www.example.com عنوان لینک',
-'extlink_tip'     => '(به خاطر بسپار http:// prefix)
+'bold_sample' => 'متن گپ نما',
+'bold_tip' => 'متن گپ نما',
+'italic_sample' => 'متن شکسته',
+'italic_tip' => 'متن شکسته',
+'link_sample' => 'عنوان لینک',
+'link_tip' => 'لینک داخلی',
+'extlink_sample' => 'http://www.example.com عنوان لینک',
+'extlink_tip' => '(به خاطر بسپار http:// prefix)
 لینک خارجی',
 'headline_sample' => 'سرخط متن',
-'headline_tip'    => '2سرخط یکسان',
-'nowiki_sample'   => 'متن شکل نداده یافرمت نوابیده را ایچو بنین',
-'nowiki_tip'      => 'زه فرمت کردن یا شکل دادن ویکی چشم پوشی کن',
-'image_tip'       => 'فایل محاط وابید',
-'media_tip'       => 'لینک فایل',
-'sig_tip'         => 'امضای ایسا و برچسب زمان',
-'hr_tip'          => 'خط افقی (کم استفاده کنین)',
+'headline_tip' => '2سرخط یکسان',
+'nowiki_sample' => 'متن شکل نداده یافرمت نوابیده را ایچو بنین',
+'nowiki_tip' => 'زه فرمت کردن یا شکل دادن ویکی چشم پوشی کن',
+'image_tip' => 'فایل محاط وابید',
+'media_tip' => 'لینک فایل',
+'sig_tip' => 'امضای ایسا و برچسب زمان',
+'hr_tip' => 'خط افقی (کم استفاده کنین)',
 
 # Edit pages
-'summary'                    => 'خلاصه:',
-'subject'                    => 'موضوع/سرخط:',
-'minoredit'                  => 'ای یه اصلاح ریزه-رز',
-'watchthis'                  => 'پیگیری ای صفحه',
-'savearticle'                => 'صفحه ضبط بوه',
-'preview'                    => 'پیش نمایش',
-'showpreview'                => 'پیش‌نمایش',
-'showdiff'                   => 'نشودادن تغییرات',
-'anoneditwarning'            => "'''توجه:''' ایسا داخل سیستم نوابیدین.
+'summary' => 'خلاصه:',
+'subject' => 'موضوع/سرخط:',
+'minoredit' => 'ای یه اصلاح ریزه-رز',
+'watchthis' => 'پیگیری ای صفحه',
+'savearticle' => 'صفحه ضبط بوه',
+'preview' => 'پیش نمایش',
+'showpreview' => 'پیش‌نمایش',
+'showdiff' => 'نشودادن تغییرات',
+'anoneditwarning' => "'''توجه:''' ایسا داخل سیستم نوابیدین.
 آی پی آدرستو درگزارش اصلاح صفحه ضبط ابوه.",
-'summary-preview'            => 'پیش نمایش - خلاصه:',
-'blockedtext'                => ' "\'\'\'دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.\'\'\'
+'summary-preview' => 'پیش نمایش - خلاصه:',
+'blockedtext' => ' "\'\'\'دسترسی نام کاربری یا نشانی اینترنتی ایسا بسته وابیده.\'\'\'
 ای کار توسط $1 انجام شده‌است.
 دلیلی که گده اینه: $2\'\'
 * آغاز قطع دسترسی: $8
@@ -340,69 +340,68 @@ $1',
 دقت کنین که سی ارسال پست الکترونیکی در ویکی، وا پست الکترونیکی خود را زه طریق صفحه[[Special:Preferences|تنظیمات]] فعال کرده بوین، و نیز، وا امکان استفاده زه ای ویژگی سی ایساقطع نبوه.
 نشانی اینترنتی الان ایسا $3 است و شماره قطع دسترسی $5 است.
 لطفاً ای شماره را در هر درخواستی که در ای مورد مطرح اکنین ذکر کنین',
-'newarticle'                 => '(تازه)',
-'newarticletext'             => 'ایسا لینکی را دنبال کردین و به صفحه‌ای رسیدین که هنی درست نوابیده.
+'newarticle' => '(تازه)',
+'newarticletext' => 'ایسا لینکی را دنبال کردین و به صفحه‌ای رسیدین که هنی درست نوابیده.
 سی ایجاد صفحه، داخل مستطیل زیر شروع به تایپ کنین (سی اطلاعات بیشتر به [[{{ns:project}}:راهنما|صفحه راهنما]] برین).
 ایر اشتباهی ایچو اویدین دکمه «برگشت» مرورگرتو را بزنین.',
-'noarticletext'              => ' الان ای صفحه متنی نداره، ایسا ترین [[Special:Search/{{PAGENAME}}عنوان ای صفحه را در صفحه‌های دیگر جستجو کنین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای صفحه را اصلاح کنین].',
-'previewnote'                => "'''ای فقط یه پیش نمایشه;
+'noarticletext' => ' الان ای صفحه متنی نداره، ایسا ترین [[Special:Search/{{PAGENAME}}عنوان ای صفحه را در صفحه‌های دیگر جستجو کنین]] یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} ای صفحه را اصلاح کنین].',
+'previewnote' => "'''ای فقط یه پیش نمایشه;
 تغییراتی که ایسا دادین هنی ضبط نوابیده!'''",
-'editing'                    => 'درحال اصلاح $1',
-'editingsection'             => 'درحال اصلاح $1 (قسمت)',
-'copyrightwarning'           => "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).
+'editing' => 'درحال اصلاح $1',
+'editingsection' => 'درحال اصلاح $1 (قسمت)',
+'copyrightwarning' => "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).
 
 
 (سی دیدن  جزئیات بیشتر به $1 برین
 
 ایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />
 درضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
-'templatesused'              => 'قالبهای استفاده شده من ای صفحه:',
-'templatesusedpreview'       => 'قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:',
-'template-protected'         => '(تحت حمایت)',
-'template-semiprotected'     => '(نیمه حمایت وابیده)',
-'nocreatetext'               => '{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].',
+'templatesused' => 'قالبهای استفاده شده من ای صفحه:',
+'templatesusedpreview' => 'قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:',
+'template-protected' => '(تحت حمایت)',
+'template-semiprotected' => '(نیمه حمایت وابیده)',
+'nocreatetext' => '{{SITENAME}}قابلیت درست کردن صفحات تازه را محدود کرده‌. ترین برگردین و صفحه‌ موجود را اصلاح کنین یا اینکه  [[Special:UserLogin|به سیستم داخل بوین یا حساب کاربری درست کنین]].',
 'recreate-moveddeleted-warn' => "'''هشدار: ایسا در حال درست کردن دوباره صفحه‌ای هدین که قبلاً حذف وابیده '''در نظر داشته بوین که ادامه اصلاح ای صفحه کار درستی هده یا نه. نمایه حذف مربوط به ای صفحه سی راحتی کار در ادامه اویده",
 
 # History pages
-'viewpagelogs'        => 'نشودادن نمایه ها سی ای صفحه',
-'currentrev'          => 'نسخه جاری',
-'revisionasof'        => 'اصلاح $1',
-'revision-info'       => 'یه نسخه اصلاح شده درتاریخ  $1 بوسیله $2',
-'previousrevision'    => '← اصلاح قبلی',
-'nextrevision'        => 'نسخه بعدی →',
+'viewpagelogs' => 'نشودادن نمایه ها سی ای صفحه',
+'currentrev' => 'نسخه جاری',
+'revisionasof' => 'اصلاح $1',
+'revision-info' => 'یه نسخه اصلاح شده درتاریخ  $1 بوسیله $2',
+'previousrevision' => '← اصلاح قبلی',
+'nextrevision' => 'نسخه بعدی →',
 'currentrevisionlink' => 'نسخه جاری',
-'cur'                 => 'فعلی',
-'last'                => 'قبلی',
-'page_first'          => 'اولین',
-'page_last'           => 'آخری',
-'histlegend'          => "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />
+'cur' => 'فعلی',
+'last' => 'قبلی',
+'page_first' => 'اولین',
+'page_last' => 'آخری',
+'histlegend' => "انتخاب متفاوت: علامت بنین رو رادیو جعبه ها زه آن نسخه ها سی مقایسه وامتیاز دادن ویا داخل تکمه های زیر سی مسابقه بوین  .<br />
 'شرح: (فعلی) = تفاوت با نسخه جاری
 (قبلی) = تفاوت با نسخه قبلی، جز = ویرایش جزئی',",
-'histfirst'           => 'کهنه ترین',
-'histlast'            => 'تازه ترین',
+'histfirst' => 'کهنه ترین',
+'histlast' => 'تازه ترین',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 در $2',
 
 # Diffs
-'history-title'           => 'گزارش تاریخی نسخه زه "$1"',
-'difference'              => '(تفاوت بین نسخه ها)',
-'lineno'                  => 'سطر $1:',
+'history-title' => 'گزارش تاریخی نسخه زه "$1"',
+'lineno' => 'سطر $1:',
 'compareselectedversions' => 'مقایسه نسخه‌های انتخاب‌ وابیده',
-'editundo'                => 'لغو اصلاح آخر',
-'diff-multi'              => '({{PLURAL:$1|یه اصلاح میانی|$1 اصلاحات میانی}} نشو داده نوابیده.)',
+'editundo' => 'لغو اصلاح آخر',
+'diff-multi' => '({{PLURAL:$1|یه اصلاح میانی|$1 اصلاحات میانی}} نشو داده نوابیده.)',
 
 # Search results
-'prevn'          => 'قبلی {{PLURAL:$1|$1}}',
-'nextn'          => 'بعدی {{PLURAL:$1|$1}}',
-'viewprevnext'   => 'مشاهده ($1 {{int:pipe-separator}} $2) ($3)',
+'prevn' => 'قبلی {{PLURAL:$1|$1}}',
+'nextn' => 'بعدی {{PLURAL:$1|$1}}',
+'viewprevnext' => 'مشاهده ($1 {{int:pipe-separator}} $2) ($3)',
 'searchhelp-url' => 'Help:محتوا',
-'powersearch'    => 'جستجوی کاملتر',
+'powersearch' => 'جستجوی کاملتر',
 
 # Preferences page
-'preferences'         => 'اولویتها',
-'mypreferences'       => 'اولویتهای مو',
-'yourrealname'        => 'نام واقعی:',
+'preferences' => 'اولویتها',
+'mypreferences' => 'اولویتهای مو',
+'yourrealname' => 'نام واقعی:',
 'prefs-help-realname' => 'ذکر نام واقعی اختیاریه ایر تصمیم به گدن بگیرین هنگام ارجاع به آثارتو و انتساب هونو به ایسا زه نام واقعیتو استفاده ابوه',
 
 'grouppage-sysop' => '{{ns:project}}:مدیران',
@@ -411,39 +410,39 @@ $1',
 'rightslog' => 'نمایه حقوق کاربر',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|تغییر|تغییرات}}',
-'recentchanges'                  => 'تغییرات اخیر',
+'nchanges' => '$1 {{PLURAL:$1|تغییر|تغییرات}}',
+'recentchanges' => 'تغییرات اخیر',
 'recentchanges-feed-description' => 'ردیابی آخرین تغییرات  ویکی در ای خورد',
-'rcnote'                         => "در زیر {{PLURAL:$1|'''۱''' تغییر|آخرین '''$1''' تغییر}} در آخرین {{PLURAL:$2|روز|'''$2''' روز}} را، تا $5، $4 ابینین.",
-'rcnotefrom'                     => 'در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).',
-'rclistfrom'                     => 'نشودادن تغییرات تازه با شروع زه $1',
-'rcshowhideminor'                => 'اصلاحات کوچیک $1',
-'rcshowhidebots'                 => '$1 ربات‌ها یا بوتها',
-'rcshowhideliu'                  => '$1 کاربران داخل وابیده',
-'rcshowhideanons'                => '$1 کاربران داخل نوابیده',
-'rcshowhidepatr'                 => '$1 اصلاحات پاسداری شده',
-'rcshowhidemine'                 => '$1 اصلاحات مو',
-'rclinks'                        => 'نشودادن آخرین $1 تغییر در $2 روز اخیر؛ $3',
-'diff'                           => 'تفاوت',
-'hist'                           => 'گزارش',
-'hide'                           => 'قایم شدن',
-'show'                           => 'نشودادن',
-'minoreditletter'                => 'رز',
-'newpageletter'                  => 'تا',
-'boteditletter'                  => 'ر',
+'rcnote' => "در زیر {{PLURAL:$1|'''۱''' تغییر|آخرین '''$1''' تغییر}} در آخرین {{PLURAL:$2|روز|'''$2''' روز}} را، تا $5، $4 ابینین.",
+'rcnotefrom' => 'در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).',
+'rclistfrom' => 'نشودادن تغییرات تازه با شروع زه $1',
+'rcshowhideminor' => 'اصلاحات کوچیک $1',
+'rcshowhidebots' => '$1 ربات‌ها یا بوتها',
+'rcshowhideliu' => '$1 کاربران داخل وابیده',
+'rcshowhideanons' => '$1 کاربران داخل نوابیده',
+'rcshowhidepatr' => '$1 اصلاحات پاسداری شده',
+'rcshowhidemine' => '$1 اصلاحات مو',
+'rclinks' => 'نشودادن آخرین $1 تغییر در $2 روز اخیر؛ $3',
+'diff' => 'تفاوت',
+'hist' => 'گزارش',
+'hide' => 'قایم شدن',
+'show' => 'نشودادن',
+'minoreditletter' => 'رز',
+'newpageletter' => 'تا',
+'boteditletter' => 'ر',
 
 # Recent changes linked
-'recentchangeslinked'          => 'تغییرات مرتبط',
-'recentchangeslinked-feed'     => 'تغییرات مرتبط',
-'recentchangeslinked-toolbox'  => 'تغییرات مرتبط',
-'recentchangeslinked-title'    => 'تغییرهای مرتبط با $1',
+'recentchangeslinked' => 'تغییرات مرتبط',
+'recentchangeslinked-feed' => 'تغییرات مرتبط',
+'recentchangeslinked-toolbox' => 'تغییرات مرتبط',
+'recentchangeslinked-title' => 'تغییرهای مرتبط با $1',
 'recentchangeslinked-noresult' => 'در دوره زمانی داده‌شده تغییری در صفحه‌های لینک داده رخ نداده‌',
-'recentchangeslinked-summary'  => " ای صفحه خاص تغییرات اخیر در صفحه‌های لینک داده شده به این صفحه را نشو اده.
+'recentchangeslinked-summary' => " ای صفحه خاص تغییرات اخیر در صفحه‌های لینک داده شده به این صفحه را نشو اده.
 صفحه‌هایی که در لیست پی‌گیریهای ایسا بون به شکل '''سیاه''' نشو داده ابون.",
 
 # Upload
-'upload'        => 'آپلود فایل',
-'uploadbtn'     => 'آپلود فایل',
+'upload' => 'آپلود فایل',
+'uploadbtn' => 'آپلود فایل',
 'uploadlogpage' => 'نمایه آپلود',
 'uploadedimage' => 'آپلود وابید "[[$1]]"',
 
@@ -451,19 +450,19 @@ $1',
 'listfiles' => 'لیست فایل',
 
 # File description page
-'file-anchor-link'          => 'فایل',
-'filehist'                  => 'گزارش تاریخی فایل',
-'filehist-help'             => 'رو تاریخ‌ها کلیک کنید تا نسخه مرتبط را ببینین.',
-'filehist-current'          => 'جاری',
-'filehist-datetime'         => 'تاریخ/زمان',
-'filehist-user'             => 'کاربر',
-'filehist-dimensions'       => 'ابعاد',
-'filehist-filesize'         => 'اندازه فایل',
-'filehist-comment'          => 'توضیح',
-'imagelinks'                => 'لینکها',
-'linkstoimage'              => 'ذیل الذکر {{PLURAL:$1|لینکهای صفحه|$1 لینک صفحات}} به ای فایل:',
-'nolinkstoimage'            => 'هیچ صفحه ای نه که لینک وابیده بوه به ای فایل',
-'sharedupload'              => 'ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه',
+'file-anchor-link' => 'فایل',
+'filehist' => 'گزارش تاریخی فایل',
+'filehist-help' => 'رو تاریخ‌ها کلیک کنید تا نسخه مرتبط را ببینین.',
+'filehist-current' => 'جاری',
+'filehist-datetime' => 'تاریخ/زمان',
+'filehist-user' => 'کاربر',
+'filehist-dimensions' => 'ابعاد',
+'filehist-filesize' => 'اندازه فایل',
+'filehist-comment' => 'توضیح',
+'imagelinks' => 'لینکها',
+'linkstoimage' => 'ذیل الذکر {{PLURAL:$1|لینکهای صفحه|$1 لینک صفحات}} به ای فایل:',
+'nolinkstoimage' => 'هیچ صفحه ای نه که لینک وابیده بوه به ای فایل',
+'sharedupload' => 'ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه',
 'uploadnewversion-linktext' => 'آپلود کردن یه نسخه تازه زه ای فایل',
 
 # MIME search
@@ -495,52 +494,52 @@ $1',
 'fewestrevisions' => 'صفحات با کمترین تعداداصلاحات وتجدیدنظرها',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|بایت|بایت}}',
-'nlinks'                  => '$1 {{PLURAL:$1|لینک|لینکها}}',
-'nmembers'                => '$1 {{PLURAL:$1|عضو|اعضا}}',
-'lonelypages'             => 'صفحات یتیم وابیده',
-'uncategorizedpages'      => 'صفحات دسته بندی نوابیده',
+'nbytes' => '$1 {{PLURAL:$1|بایت|بایت}}',
+'nlinks' => '$1 {{PLURAL:$1|لینک|لینکها}}',
+'nmembers' => '$1 {{PLURAL:$1|عضو|اعضا}}',
+'lonelypages' => 'صفحات یتیم وابیده',
+'uncategorizedpages' => 'صفحات دسته بندی نوابیده',
 'uncategorizedcategories' => 'دسته های دسته بندی نوابیده',
-'uncategorizedimages'     => 'فایلهای تصویری دسته بندی نوابیده',
-'uncategorizedtemplates'  => 'قالبها یا الگوهای دسته بندی نوابیده',
-'unusedcategories'        => 'دسته های استفاده نوابیده',
-'unusedimages'            => 'فایلهای استفاده نوابیده',
-'wantedcategories'        => 'دسته های  درخواستی',
-'wantedpages'             => 'صفحات درخواستی',
-'mostlinked'              => 'صفحاتی که بیشتر زه همه به هونو لینک داده وابیده',
-'mostlinkedcategories'    => 'دسته هایی که بیشتر زه همه به هونو لینک داده وابیده',
-'mostlinkedtemplates'     => 'قالبها یا الگوهایی که بیشتر زه همه به هونو لینک داده وابیده',
-'mostcategories'          => 'صفحات با بیشترین تعداد دسته بندی',
-'mostimages'              => 'تصاویری که بیشتر زه همه به هونو لینک داده وابیده',
-'mostrevisions'           => 'صفحات با تعداد اصلاحات زیاد',
-'prefixindex'             => 'نمایه پیشوندی',
-'shortpages'              => 'صفحات کوتاه',
-'longpages'               => 'صفحات بلند',
-'deadendpages'            => 'صفحات بن بست ولاینحل',
-'protectedpages'          => 'صفحات حفاظت وحمایت وابیده',
-'listusers'               => 'لیست کاربر',
-'newpages'                => 'صفحات تازه',
-'ancientpages'            => 'کهنه ترین صفحات',
-'move'                    => 'جابجا کردن',
-'movethispage'            => 'جابجایی ای صفحه',
+'uncategorizedimages' => 'فایلهای تصویری دسته بندی نوابیده',
+'uncategorizedtemplates' => 'قالبها یا الگوهای دسته بندی نوابیده',
+'unusedcategories' => 'دسته های استفاده نوابیده',
+'unusedimages' => 'فایلهای استفاده نوابیده',
+'wantedcategories' => 'دسته های  درخواستی',
+'wantedpages' => 'صفحات درخواستی',
+'mostlinked' => 'صفحاتی که بیشتر زه همه به هونو لینک داده وابیده',
+'mostlinkedcategories' => 'دسته هایی که بیشتر زه همه به هونو لینک داده وابیده',
+'mostlinkedtemplates' => 'قالبها یا الگوهایی که بیشتر زه همه به هونو لینک داده وابیده',
+'mostcategories' => 'صفحات با بیشترین تعداد دسته بندی',
+'mostimages' => 'تصاویری که بیشتر زه همه به هونو لینک داده وابیده',
+'mostrevisions' => 'صفحات با تعداد اصلاحات زیاد',
+'prefixindex' => 'نمایه پیشوندی',
+'shortpages' => 'صفحات کوتاه',
+'longpages' => 'صفحات بلند',
+'deadendpages' => 'صفحات بن بست ولاینحل',
+'protectedpages' => 'صفحات حفاظت وحمایت وابیده',
+'listusers' => 'لیست کاربر',
+'newpages' => 'صفحات تازه',
+'ancientpages' => 'کهنه ترین صفحات',
+'move' => 'جابجا کردن',
+'movethispage' => 'جابجایی ای صفحه',
 
 # Book sources
 'booksources' => 'منابع کتاب',
 
 # Special:Log
-'specialloguserlabel'  => 'کاربر:',
+'specialloguserlabel' => 'کاربر:',
 'speciallogtitlelabel' => 'عنوان:',
-'log'                  => 'نمایه ها',
-'all-logs-page'        => 'همه نمایه ها',
+'log' => 'نمایه ها',
+'all-logs-page' => 'همه نمایه ها',
 
 # Special:AllPages
-'allpages'       => 'همه صفحات',
+'allpages' => 'همه صفحات',
 'alphaindexline' => '$1 به
 $2',
-'nextpage'       => 'صفحه بعدی ($1)',
-'prevpage'       => 'صفحه قبلی($1)',
-'allpagesfrom'   => 'نمایش دادن صفحات با شروع زه:',
-'allarticles'    => 'همه صفحات',
+'nextpage' => 'صفحه بعدی ($1)',
+'prevpage' => 'صفحه قبلی($1)',
+'allpagesfrom' => 'نمایش دادن صفحات با شروع زه:',
+'allarticles' => 'همه صفحات',
 'allpagessubmit' => 'برو',
 'allpagesprefix' => 'نشو دادن صفحات همراه با پیشوند:',
 
@@ -551,109 +550,109 @@ $2',
 'emailuser' => 'امیل ای کاربر',
 
 # Watchlist
-'watchlist'         => 'لیست پیگیریهای مو',
-'mywatchlist'       => 'لیست پیگیریهای مو',
-'addedwatchtext'    => "صفحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا
+'watchlist' => 'لیست پیگیریهای مو',
+'mywatchlist' => 'لیست پیگیریهای مو',
+'addedwatchtext' => "صفحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا
 اضاف وابید.
 تغییرات این صفحه و صفحه صحبت مر بوطه اش در آینده ایچو لیست ابوه. به‌علاوه، ای صفحه، سی واضح‌تر دیده وابیدن در [[Special:RecentChanges|فهرست تغییرات اخیر]] به شکل <b>سیاه</b> ایا.
 
 ایر بعدا خواستین ای  صفحه زه لیست پی‌گیریهاتو ورداشته بوه، رو «'''عدم پی‌گیری'''» در بالای صفحه کلیک کنین.",
-'removedwatchtext'  => 'آن صفحه"[[:$1]]" جابجا وابیده زه[[Special:لیست پیگیری|لیست پیگیری ایسا]].',
-'watch'             => 'پی‌گیری',
-'watchthispage'     => 'پیگیری ای صفحه',
-'unwatch'           => 'عدم پیگیری',
+'removedwatchtext' => 'آن صفحه"[[:$1]]" جابجا وابیده زه[[Special:لیست پیگیری|لیست پیگیری ایسا]].',
+'watch' => 'پی‌گیری',
+'watchthispage' => 'پیگیری ای صفحه',
+'unwatch' => 'عدم پیگیری',
 'watchlist-details' => '{{PLURAL:$1|$1 صفحه|$1 صفحات}} درلیست پیگیری ایسا, صفحات صحبت حساب نیبوه.',
-'wlshowlast'        => 'نمایش آخرین $1 ساعت $2 روز $3',
+'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'درحال پیگیری...',
+'watching' => 'درحال پیگیری...',
 'unwatching' => 'درحالت عدم پیگیری...',
 
 # Delete
-'deletepage'            => 'حذف صفحه',
-'historywarning'        => 'توجه: آن صفحه ای که ایسا اخوین حذف کنین گزارش تاریخی داره:',
-'confirmdeletetext'     => 'ایسا اخوین یه صفحه بلند با همه گزارش تاریخی هونه حذف کنین.
+'deletepage' => 'حذف صفحه',
+'historywarning' => 'توجه: آن صفحه ای که ایسا اخوین حذف کنین گزارش تاریخی داره:',
+'confirmdeletetext' => 'ایسا اخوین یه صفحه بلند با همه گزارش تاریخی هونه حذف کنین.
 لطفا کانفیرم یا تائید کنین که تمایل وقصد ای کار را دارین, وایسا دوین یا می دانید نتایج وآثار ای کار را, و ایسا انجام ادین ای کار را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]].',
-'actioncomplete'        => 'عمل  مربوطه راکامل کن',
-'deletedtext'           => '"$1" حذف وابیده.
+'actioncomplete' => 'عمل  مربوطه راکامل کن',
+'deletedtext' => '"$1" حذف وابیده.
 بوین $2 سی ثبت حذف آخر.',
-'dellogpage'            => 'نمایه _ حذف',
-'deletecomment'         => 'دلیل:',
-'deleteotherreason'     => 'دیه/دلیل اضافی:',
+'dellogpage' => 'نمایه _ حذف',
+'deletecomment' => 'دلیل:',
+'deleteotherreason' => 'دیه/دلیل اضافی:',
 'deletereasonotherlist' => 'دلیل دیه',
 
 # Rollback
 'rollbacklink' => 'عقب گرد',
 
 # Protect
-'protectlogpage'              => 'نمایه حفاظت وحمایت',
-'prot_1movedto2'              => '[[$1]] جابجا وابید به[[$2]]',
-'protectcomment'              => 'دلیل:',
-'protectexpiry'               => 'سپری وابیده ها:',
-'protect_expiry_invalid'      => 'با سپری وابیدن وقت غیر معتبره.',
-'protect_expiry_old'          => 'سپری وابیدن وقت مربوط به گذشته.',
-'protect-text'                => "ایسا ممکنه بوینین وتغییر بدین سطح حمایت زه ای صفحه'''$1'''.",
-'protect-locked-access'       => "حساب کاربری ایسا اجازه تغییر سطح حمایت ای صفحه را نداره.
+'protectlogpage' => 'نمایه حفاظت وحمایت',
+'prot_1movedto2' => '[[$1]] جابجا وابید به[[$2]]',
+'protectcomment' => 'دلیل:',
+'protectexpiry' => 'سپری وابیده ها:',
+'protect_expiry_invalid' => 'با سپری وابیدن وقت غیر معتبره.',
+'protect_expiry_old' => 'سپری وابیدن وقت مربوط به گذشته.',
+'protect-text' => "ایسا ممکنه بوینین وتغییر بدین سطح حمایت زه ای صفحه'''$1'''.",
+'protect-locked-access' => "حساب کاربری ایسا اجازه تغییر سطح حمایت ای صفحه را نداره.
 ای چونه تنظیمات جاری سی آن صفحه '''$1''':",
-'protect-cascadeon'           => 'ای صفحه  در حال حاضر حفاظت وحمایت وابیده چون که در {{PLURAL:$1|صفحه|صفحات}}
+'protect-cascadeon' => 'ای صفحه  در حال حاضر حفاظت وحمایت وابیده چون که در {{PLURAL:$1|صفحه|صفحات}}
 زیر که گزینه حفاظت وحمایت موجی {{PLURAL:$1|آن|آن‌ها}} فعال هده ،
 ایسا ترین سطح حفاظت ای صفحه را تغییر بدین اما ای کارنتره تاثیری رو
 حفاظت وحمایت موجی صفحه داشته بوه.',
-'protect-default'             => '(پیش فرض)',
-'protect-fallback'            => 'درخواست"$1" اجازه',
+'protect-default' => '(پیش فرض)',
+'protect-fallback' => 'درخواست"$1" اجازه',
 'protect-level-autoconfirmed' => 'بستن کاربران ثبت نام نوابیده',
-'protect-level-sysop'         => 'Sysops فقط',
-'protect-summary-cascade'     => 'موجی کردن',
-'protect-expiring'            => 'سپری وابیده $1 (UTC)',
-'protect-cascade'             => 'حمایت صفحات دربرگیرنده در ای صفحه (cascading protection)',
-'protect-cantedit'            => 'ایسا نترین تغییر بدین سطوح حمایتی ای صفحه را, زیرا ایسا اجازه اصلاح آن را ندارین.',
-'protect-expiry-options'      => '۱ ساعت:1 hour,۱ روز:1 day,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite',
-'restriction-type'            => 'اجازه:',
-'restriction-level'           => 'سطح محدودیت:',
+'protect-level-sysop' => 'Sysops فقط',
+'protect-summary-cascade' => 'موجی کردن',
+'protect-expiring' => 'سپری وابیده $1 (UTC)',
+'protect-cascade' => 'حمایت صفحات دربرگیرنده در ای صفحه (cascading protection)',
+'protect-cantedit' => 'ایسا نترین تغییر بدین سطوح حمایتی ای صفحه را, زیرا ایسا اجازه اصلاح آن را ندارین.',
+'protect-expiry-options' => '۱ ساعت:1 hour,۱ روز:1 day,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite',
+'restriction-type' => 'اجازه:',
+'restriction-level' => 'سطح محدودیت:',
 
 # Undelete
 'undeletebtn' => 'بازیافت',
 
 # Namespace form on various pages
-'namespace'      => 'فضای نام:',
-'invert'         => 'انتخاب برعکس بوه',
+'namespace' => 'فضای نام:',
+'invert' => 'انتخاب برعکس بوه',
 'blanknamespace' => '(اصلی)',
 
 # Contributions
 'contributions' => 'شراکتهای کاربر',
-'mycontris'     => 'شراکتهای مو',
-'contribsub2'   => 'سی $1 ($2)',
-'uctop'         => '(بالا)',
-'month'         => 'در این ماه (و قبل زه آن):',
-'year'          => 'در ای سال (وقبل زه آن):',
+'mycontris' => 'شراکتهای مو',
+'contribsub2' => 'سی $1 ($2)',
+'uctop' => '(بالا)',
+'month' => 'در این ماه (و قبل زه آن):',
+'year' => 'در ای سال (وقبل زه آن):',
 
 'sp-contributions-newbies-sub' => 'سی حسابهای کاربری تازه',
-'sp-contributions-blocklog'    => 'نمایه بسته وابیده ها',
-'sp-contributions-talk'        => 'صحبت',
+'sp-contributions-blocklog' => 'نمایه بسته وابیده ها',
+'sp-contributions-talk' => 'صحبت',
 
 # What links here
-'whatlinkshere'       => 'لینک های ای صفحه',
+'whatlinkshere' => 'لینک های ای صفحه',
 'whatlinkshere-title' => 'صفحات آن لینک به "$1"',
-'linkshere'           => "لینک صفحات ذیل الذکر به '''[[:$1]]''':",
-'nolinkshere'         => "هیچ صفحه ای پیوند نداردبه '''[[:$1]]'''.",
-'isredirect'          => 'صفحه تغییر مسیر',
-'istemplate'          => 'استفاده‌ وابیده داخل صفحه',
-'whatlinkshere-prev'  => '{{PLURAL:$1|قبلی |مورد قبلی$1}}',
-'whatlinkshere-next'  => '{{PLURAL:$1|بعدی |مورد بعدی $1}}',
+'linkshere' => "لینک صفحات ذیل الذکر به '''[[:$1]]''':",
+'nolinkshere' => "هیچ صفحه ای پیوند نداردبه '''[[:$1]]'''.",
+'isredirect' => 'صفحه تغییر مسیر',
+'istemplate' => 'استفاده‌ وابیده داخل صفحه',
+'whatlinkshere-prev' => '{{PLURAL:$1|قبلی |مورد قبلی$1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|بعدی |مورد بعدی $1}}',
 'whatlinkshere-links' => '← لینکها',
 
 # Block/unblock
-'blockip'       => 'بستن کاربر',
-'ipboptions'    => '۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite',
-'ipblocklist'   => 'آدرسهای  آی پی وکاربران بسته وابیدند',
-'blocklink'     => 'بسته بوه !',
-'unblocklink'   => 'باز بوه',
-'contribslink'  => 'شراکت',
-'blocklogpage'  => 'نمایه _ بسته‌وابیده‌ها',
+'blockip' => 'بستن کاربر',
+'ipboptions' => '۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite',
+'ipblocklist' => 'آدرسهای  آی پی وکاربران بسته وابیدند',
+'blocklink' => 'بسته بوه !',
+'unblocklink' => 'باز بوه',
+'contribslink' => 'شراکت',
+'blocklogpage' => 'نمایه _ بسته‌وابیده‌ها',
 'blocklogentry' => 'بسته وابید [[$1]] با سپری وابیدن وقت زه $2 $3',
 
 # Move page
-'movepagetext'     => "با استفاده زه فرم زیر نام صفحه تغییر اکنه و همه گزارش تاریخی هو به نام تازه جابجا ابوه.
+'movepagetext' => "با استفاده زه فرم زیر نام صفحه تغییر اکنه و همه گزارش تاریخی هو به نام تازه جابجا ابوه.
 عنوان کهنه تبدیل به یک صفحه تغییر مسیر به عنوان جدید ابوه.
 ایسا ترین بطور اتوماتیک تغییر مسیر های مربوط به عنوان اصلی رو به روز رسانی کنین. ایر ایسا مطمئن نهدین با دیدن یونو مطمئن بوین:
 [[Special:تغییر مسیر دوبل|دوبل ]] یا[[Special:تغییرمسیر خروا یا اشکسته|تغییرمسیرهای خراو یا اشکسته]].
@@ -676,21 +675,21 @@ $2',
 * کادر زیر را تیک نزده بوین.
 
 در ای موارد، وا صفحه را بطور دستی جابجا کرده و یا محتویات دو صفحه را با اصلاح ادغام کنین.",
-'movearticle'      => 'جابجایی صفحه:',
-'newtitle'         => 'به عنوان تازه:',
-'move-watch'       => 'پیگیری ای صفحه',
-'movepagebtn'      => 'جابجایی صفحه',
-'pagemovedsub'     => 'جابجایی با بخت وتوفیق انجام وابید',
-'movepage-moved'   => '\'\'\'"$1" جابجا وابیده به "$2"\'\'\'',
-'articleexists'    => 'یه صفحه زه ای  نوم تقریبا موجوده, یا نومی که ایسا انتخاب کردین غیر  معتبره
+'movearticle' => 'جابجایی صفحه:',
+'newtitle' => 'به عنوان تازه:',
+'move-watch' => 'پیگیری ای صفحه',
+'movepagebtn' => 'جابجایی صفحه',
+'pagemovedsub' => 'جابجایی با بخت وتوفیق انجام وابید',
+'movepage-moved' => '\'\'\'"$1" جابجا وابیده به "$2"\'\'\'',
+'articleexists' => 'یه صفحه زه ای  نوم تقریبا موجوده, یا نومی که ایسا انتخاب کردین غیر  معتبره
 لطفا نوم دیه انتخاب کنین.',
-'talkexists'       => "'''آن صفحه خوس با بخت وتوفیق جابجا وابید, ولی صفحه صحبت نتره جابجا بوه چونکه یکی تقریبا موجوده درعنوان تازه
+'talkexists' => "'''آن صفحه خوس با بخت وتوفیق جابجا وابید, ولی صفحه صحبت نتره جابجا بوه چونکه یکی تقریبا موجوده درعنوان تازه
 لطفا به صورت دستی آنها را ترکیب کنین.'''",
-'movedto'          => 'جابجا وابید به',
-'movetalk'         => 'جابجایی صفحه صحبت مربوطه',
-'movelogpage'      => 'نمایه جابجایی',
-'movereason'       => 'دلیل:',
-'revertmove'       => 'واگردانی',
+'movedto' => 'جابجا وابید به',
+'movetalk' => 'جابجایی صفحه صحبت مربوطه',
+'movelogpage' => 'نمایه جابجایی',
+'movereason' => 'دلیل:',
+'revertmove' => 'واگردانی',
 
 # Export
 'export' => 'صفحات صادره',
@@ -699,74 +698,74 @@ $2',
 'allmessages' => 'پیامهای سیستم',
 
 # Thumbnails
-'thumbnail-more'  => 'گپ کردن',
+'thumbnail-more' => 'گپ کردن',
 'thumbnail_error' => 'خطا سی درست کردن ناخن دانه: $1',
 
 # Import log
 'importlogpage' => 'داخل نمایه کردن',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'صفحه کاربری مو',
-'tooltip-pt-mytalk'               => 'صفحه صحبت مو',
-'tooltip-pt-preferences'          => 'اولویت های مو',
-'tooltip-pt-watchlist'            => 'لیست صفحه‌هایی که ایسا تغییرات هونو  دنبال اکنین',
-'tooltip-pt-mycontris'            => 'لیست شراکتهای مو',
-'tooltip-pt-login'                => 'توصیه ابوه که به سیستم داخل بوین اما اجباری نه.',
-'tooltip-pt-logout'               => 'رهدن زه سیستم',
-'tooltip-ca-talk'                 => 'صحبت درباره صفحه محتوا',
-'tooltip-ca-edit'                 => 'ایسا ترین ای  صفحه را اصلاح کنین. لطفاً قبل  ذخیره کردن زه دکمه پیش‌ نمایش استفاده کنین',
-'tooltip-ca-addsection'           => 'اضاف کردن یه توضیح به ای مبحث',
-'tooltip-ca-viewsource'           => 'ای صفحه  تحت حمایته ایساترین منبعسه بوینین',
-'tooltip-ca-protect'              => 'حفاظت وحمایت زه ای صفحه',
-'tooltip-ca-delete'               => 'حذف ای صفحه',
-'tooltip-ca-move'                 => 'جابجاکردن ای صفحه',
-'tooltip-ca-watch'                => 'اضاف کردن ای صفحه به لیست پیگیریهاتو',
-'tooltip-ca-unwatch'              => 'حذف ای صفحه زه لیست پی‌گیری‌های ایسا',
-'tooltip-search'                  => 'جستن {{SITENAME}}',
-'tooltip-n-mainpage'              => 'دیدن صفحه اصلی',
-'tooltip-n-portal'                => 'درباره ای پروژه چه ترین  کنین و  کیه  ترین آن جیزها رو پیدا کنین',
-'tooltip-n-currentevents'         => 'پیداکردن اطلاعات زمینه یاسابقه اطلاعات در اتفاقات جاری',
-'tooltip-n-recentchanges'         => 'فهرست  تغییرات آخری درویکی',
-'tooltip-n-randompage'            => 'لود کردن یه صفحه بطور اتفاقی',
-'tooltip-n-help'                  => 'محلی برای کشف کردن',
-'tooltip-t-whatlinkshere'         => 'فهرست همه صفحات ویکی که ایچو لینک دارن',
-'tooltip-t-recentchangeslinked'   => 'تغییرات آخری  درصفحاتی که لینک شده اند به ای صفحه',
-'tooltip-feed-rss'                => 'تغذیه آراس اس برای ای صفحه',
-'tooltip-feed-atom'               => 'تغذیه کوچیک ترین جزء  ای صفحه',
-'tooltip-t-contributions'         => 'دیدن فهرست مشارکت کننده ها ومقاله دهنده های ای صفحه',
-'tooltip-t-emailuser'             => 'ارسال یه امیل به ای کاربر',
-'tooltip-t-upload'                => 'آپلودکردن فایلها',
-'tooltip-t-specialpages'          => 'فهرست همه صفحات مخصوص',
-'tooltip-t-print'                 => 'نسخه فابل پرینت ای صفحه',
-'tooltip-t-permalink'             => 'لینک دایمی به ای نسخه از صفحه',
-'tooltip-ca-nstab-main'           => 'دیدن آن صفحه محتوا',
-'tooltip-ca-nstab-user'           => 'دیدن صفحه کاربر',
-'tooltip-ca-nstab-media'          => 'دیدن صفحه مدیا',
-'tooltip-ca-nstab-special'        => 'ای صفحه مخصوصه وایسا نترین خود ای صفحه رااصلاح کنین',
-'tooltip-ca-nstab-project'        => 'دیدن صفحه پروژه',
-'tooltip-ca-nstab-image'          => 'دیدن صفحه فایل',
-'tooltip-ca-nstab-mediawiki'      => 'دیدن پیام سیستم',
-'tooltip-ca-nstab-template'       => 'دیدن قالب قابل تغییر',
-'tooltip-ca-nstab-help'           => 'دیدن صفحه کمک',
-'tooltip-ca-nstab-category'       => 'دیدن صفحه طبقه بندی',
-'tooltip-minoredit'               => 'علامت نهادن به این به عنوان اصلاح حداقل یاکم',
-'tooltip-save'                    => 'ضبط کردن تغییرات',
-'tooltip-preview'                 => ' زه قبل دیدن تغییرات قبل از ضبط کردن سی مطمئن وابیدن لطفا استفاده کنید قبل از ضبط کردن',
-'tooltip-diff'                    => 'دیدن تغییراتی که ایسا من ای متن انجام دادین',
+'tooltip-pt-userpage' => 'صفحه کاربری مو',
+'tooltip-pt-mytalk' => 'صفحه صحبت مو',
+'tooltip-pt-preferences' => 'اولویت های مو',
+'tooltip-pt-watchlist' => 'لیست صفحه‌هایی که ایسا تغییرات هونو  دنبال اکنین',
+'tooltip-pt-mycontris' => 'لیست شراکتهای مو',
+'tooltip-pt-login' => 'توصیه ابوه که به سیستم داخل بوین اما اجباری نه.',
+'tooltip-pt-logout' => 'رهدن زه سیستم',
+'tooltip-ca-talk' => 'صحبت درباره صفحه محتوا',
+'tooltip-ca-edit' => 'ایسا ترین ای  صفحه را اصلاح کنین. لطفاً قبل  ذخیره کردن زه دکمه پیش‌ نمایش استفاده کنین',
+'tooltip-ca-addsection' => 'اضاف کردن یه توضیح به ای مبحث',
+'tooltip-ca-viewsource' => 'ای صفحه  تحت حمایته ایساترین منبعسه بوینین',
+'tooltip-ca-protect' => 'حفاظت وحمایت زه ای صفحه',
+'tooltip-ca-delete' => 'حذف ای صفحه',
+'tooltip-ca-move' => 'جابجاکردن ای صفحه',
+'tooltip-ca-watch' => 'اضاف کردن ای صفحه به لیست پیگیریهاتو',
+'tooltip-ca-unwatch' => 'حذف ای صفحه زه لیست پی‌گیری‌های ایسا',
+'tooltip-search' => 'جستن {{SITENAME}}',
+'tooltip-n-mainpage' => 'دیدن صفحه اصلی',
+'tooltip-n-portal' => 'درباره ای پروژه چه ترین  کنین و  کیه  ترین آن جیزها رو پیدا کنین',
+'tooltip-n-currentevents' => 'پیداکردن اطلاعات زمینه یاسابقه اطلاعات در اتفاقات جاری',
+'tooltip-n-recentchanges' => 'فهرست  تغییرات آخری درویکی',
+'tooltip-n-randompage' => 'لود کردن یه صفحه بطور اتفاقی',
+'tooltip-n-help' => 'محلی برای کشف کردن',
+'tooltip-t-whatlinkshere' => 'فهرست همه صفحات ویکی که ایچو لینک دارن',
+'tooltip-t-recentchangeslinked' => 'تغییرات آخری  درصفحاتی که لینک شده اند به ای صفحه',
+'tooltip-feed-rss' => 'تغذیه آراس اس برای ای صفحه',
+'tooltip-feed-atom' => 'تغذیه کوچیک ترین جزء  ای صفحه',
+'tooltip-t-contributions' => 'دیدن فهرست مشارکت کننده ها ومقاله دهنده های ای صفحه',
+'tooltip-t-emailuser' => 'ارسال یه امیل به ای کاربر',
+'tooltip-t-upload' => 'آپلودکردن فایلها',
+'tooltip-t-specialpages' => 'فهرست همه صفحات مخصوص',
+'tooltip-t-print' => 'نسخه فابل پرینت ای صفحه',
+'tooltip-t-permalink' => 'لینک دایمی به ای نسخه از صفحه',
+'tooltip-ca-nstab-main' => 'دیدن آن صفحه محتوا',
+'tooltip-ca-nstab-user' => 'دیدن صفحه کاربر',
+'tooltip-ca-nstab-media' => 'دیدن صفحه مدیا',
+'tooltip-ca-nstab-special' => 'ای صفحه مخصوصه وایسا نترین خود ای صفحه رااصلاح کنین',
+'tooltip-ca-nstab-project' => 'دیدن صفحه پروژه',
+'tooltip-ca-nstab-image' => 'دیدن صفحه فایل',
+'tooltip-ca-nstab-mediawiki' => 'دیدن پیام سیستم',
+'tooltip-ca-nstab-template' => 'دیدن قالب قابل تغییر',
+'tooltip-ca-nstab-help' => 'دیدن صفحه کمک',
+'tooltip-ca-nstab-category' => 'دیدن صفحه طبقه بندی',
+'tooltip-minoredit' => 'علامت نهادن به این به عنوان اصلاح حداقل یاکم',
+'tooltip-save' => 'ضبط کردن تغییرات',
+'tooltip-preview' => ' زه قبل دیدن تغییرات قبل از ضبط کردن سی مطمئن وابیدن لطفا استفاده کنید قبل از ضبط کردن',
+'tooltip-diff' => 'دیدن تغییراتی که ایسا من ای متن انجام دادین',
 'tooltip-compareselectedversions' => 'دیدن تفاوتهای بین دونسخه انتخاب وابیده زه ای صفحه',
-'tooltip-watch'                   => 'اضاف کردن ای صفحه به فهرست مشاهداتتان',
-'tooltip-recreate'                => 'دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده',
-'tooltip-upload'                  => 'شروع آپلود',
-'tooltip-rollback'                => '"اعاده" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک',
+'tooltip-watch' => 'اضاف کردن ای صفحه به فهرست مشاهداتتان',
+'tooltip-recreate' => 'دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده',
+'tooltip-upload' => 'شروع آپلود',
+'tooltip-rollback' => '"اعاده" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک',
 
 # Browsing diffs
 'previousdiff' => '← اصلاح قدیمی',
-'nextdiff'     => 'تفاوت بعدی→',
+'nextdiff' => 'تفاوت بعدی→',
 
 # Media information
 'file-info-size' => '$1 × $2 پیکسل, اندازه فایل: $3, MIME نوع: $4',
-'file-nohires'   => 'قابلیت تفکیک بالاتری در دسترس نه.',
-'svg-long-desc'  => 'SVG فایل, تقریبا$1 × $2 پیکسل, اندازه فایل: $3',
+'file-nohires' => 'قابلیت تفکیک بالاتری در دسترس نه.',
+'svg-long-desc' => 'SVG فایل, تقریبا$1 × $2 پیکسل, اندازه فایل: $3',
 'show-big-image' => 'تصویر با قابلیت تفکیک کامل',
 
 # Special:NewFiles
@@ -779,11 +778,11 @@ $2',
 لینکهای بعدی در همان سطر، به عنوان موارد استثنا در نظر گریده ابون',
 
 # Metadata
-'metadata'          => 'فراداده',
-'metadata-help'     => ' ای فایل دارای اطلاعات اضافه‌ای است که احتمالاً با دوربین دیجیتالی‌ یا پویشگری که سی ایجاد یا دیجیتالی‌کردن آن به کار رهده اضاف وابیده . ایر فایل زه وضعیت اولیه اس تغییر داده وابیده بوه ممکنه همه توضیحات موجود اطلاعات عکس را منعکس نکنه',
-'metadata-expand'   => 'نشودادن جزئیات تفصیلی',
+'metadata' => 'فراداده',
+'metadata-help' => ' ای فایل دارای اطلاعات اضافه‌ای است که احتمالاً با دوربین دیجیتالی‌ یا پویشگری که سی ایجاد یا دیجیتالی‌کردن آن به کار رهده اضاف وابیده . ایر فایل زه وضعیت اولیه اس تغییر داده وابیده بوه ممکنه همه توضیحات موجود اطلاعات عکس را منعکس نکنه',
+'metadata-expand' => 'نشودادن جزئیات تفصیلی',
 'metadata-collapse' => 'قایم کردن جزئیات تفصیلی',
-'metadata-fields'   => 'فراداده EXIF نشو داده وابیده در این پیام وقتی جدول فراداده‌های تصویر جمع وابیده بوه هم نمایش داده ابوه.
+'metadata-fields' => 'فراداده EXIF نشو داده وابیده در این پیام وقتی جدول فراداده‌های تصویر جمع وابیده بوه هم نمایش داده ابوه.
 بقیه موارد فقط وقتی نشوداده ابوه که جدول یادشده واز بوه.
 * make
 * model
@@ -800,18 +799,18 @@ $2',
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'اصلاح ای صفحه با استفاده زه یه ویرایشگر خارجی',
+'edit-externally' => 'اصلاح ای صفحه با استفاده زه یه ویرایشگر خارجی',
 'edit-externally-help' => ' سی اطلاعات بیشتر [//www.mediawiki.org/wiki/Manual:External_editors راهنمایی‌های تنظیمات] اصلاح کننده خارجی را بوینین.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'همه',
 'namespacesall' => 'همه',
-'monthsall'     => 'همه ماهها',
+'monthsall' => 'همه ماهها',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'نشودادن تغییرات مربوطه',
 'watchlisttools-edit' => 'نشودادن واصلاح کردن لیست پیگیریها',
-'watchlisttools-raw'  => 'اصلاح لیست خام پی‌گیری‌ها',
+'watchlisttools-raw' => 'اصلاح لیست خام پی‌گیری‌ها',
 
 # Special:Version
 'version' => 'ترجمه یا تفسیر',
index a9a7847..89e6163 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Breton (Brezhoneg)
+/** Breton (brezhoneg)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -185,7 +185,7 @@ $messages = array(
 'tog-hidepatrolled' => "Kuzhat ar c'hemmoù evezhiet e-touez ar c'hemmoù diwezhañ",
 'tog-newpageshidepatrolled' => 'Kuzhat ar pajennoù evezhiet diouzh roll ar pajennoù nevez',
 'tog-extendwatchlist' => 'Astenn ar roll evezhiañ a-benn diskouez an holl gemmoù ha neket ar re ziwezhañ hepken.',
-'tog-usenewrc' => "Ober gant ar c'hemmoù nevez gwellaet<br /> (rekis eo JavaScript)",
+'tog-usenewrc' => "Diskouez ar c'hemmoù nevez en ur feson kempennoc'h (rekis eo JavaScript)",
 'tog-numberheadings' => 'Niverenniñ emgefre an titloù',
 'tog-showtoolbar' => 'Diskouez ar varrenn gant ar meuzioù skridaozañ',
 'tog-editondblclick' => 'Daouglikañ evit kemmañ ur bajenn (JavaScript)',
@@ -561,9 +561,11 @@ $2',
 'ns-specialprotected' => "N'haller ket kemmañ ar pajennoù en esaouenn anv {{ns:special}}.",
 'titleprotected' => "Gwarezet eo bet an titl-mañ p'eo bet krouet gant [[User:$1|$1]].
 Setu amañ perak ''$2''.",
-'filereadonlyerror' => 'Dibosupl kemmañ ar restr "$1" abalamour m\'emañ ar c\'havlec\'h restrom "$2" e mod lenn nemetken.
+'filereadonlyerror' => 'Dibosupl kemmañ ar restr "$1" abalamour m\'emañ ar c\'havlec\'h restroù "$2" e mod lenn nemetken.
 
-"\'\'$3\'\'" eo an abeg roet.',
+"\'\'$3\'\'" eo an abeg roet gant ar merour en deus prennet anezhi.',
+'invalidtitle-knownnamespace' => 'Titl direizh gant an esaouenn anv "$2" hag an destenn "$3"',
+'invalidtitle-unknownnamespace' => 'Titl direizh gant an niverenn esaouenn anv $1 hag an destenn "$2" dianav',
 
 # Virus scanner
 'virus-badscanner' => "Kefluniadur fall : skanner viruzoù dianav : ''$1''",
@@ -599,7 +601,7 @@ Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}
 'createaccount' => 'Krouiñ ur gont nevez',
 'gotaccount' => "Ur gont zo ganeoc'h dija ? '''$1'''.",
 'gotaccountlink' => 'Kevreañ',
-'userlogin-resetlink' => "Ha disoñjet hoc'h eus ho titouroù kevreañ ?",
+'userlogin-resetlink' => "Ha disoñjet eo bet ho titouroù kevreañ ganeoc'h ?",
 'createaccountmail' => 'dre bostel',
 'createaccountreason' => 'Abeg :',
 'badretype' => 'Ne glot ket ar gerioù-tremen an eil gant egile.',
@@ -849,7 +851,8 @@ Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'updated' => '(Hizivaet)',
 'note' => "'''Notenn :'''",
 'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
-N'eo ket bet enrollet ho kemmoù evit c'hoazh ! [[#editform|→ Kenderc'hel da gemmañ]]",
+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.
@@ -923,6 +926,7 @@ Diverket eo bet evit doare.',
 'edit-no-change' => "N'eo ket bet kemeret ho tegasadenn e kont rak ne oa ket bet kemmet netra en destenn.",
 'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
 Krouet e oa bet c'hoazh.",
+'defaultmessagetext' => 'Testenn dre ziouer',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.
@@ -938,6 +942,12 @@ 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",
+'parser-unstrip-loop-warning' => "Detektet ez eus bet ul lagadenn n'haller ket divontañ",
+'parser-unstrip-recursion-limit' => "Aet dreist d'ar vevenn rekurziñ n'haller ket divontañ : $1",
 
 # "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ù.",
@@ -1113,7 +1123,8 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 
 # Diffs
 'history-title' => 'Istor stummoù disheñvel "$1"',
-'difference' => "(Diforc'hioù etre ar stummoù)",
+'difference-title' => 'Diforc\'hioù etre adstummoù "$1"',
+'difference-title-multipage' => 'Diforc\'hioù etre ar pajennoù "$1" ha "$2"',
 'difference-multipage' => "(diforc'h etre ar pajennoù)",
 'lineno' => 'Linenn $1:',
 'compareselectedversions' => 'Keñveriañ ar stummoù diuzet',
@@ -1208,6 +1219,7 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'prefs-beta' => 'Perzhioù beta',
 'prefs-datetime' => 'Deiziad hag eur',
 'prefs-labs' => 'Perzhioù "labs"',
+'prefs-user-pages' => 'Pajennoù implijer',
 'prefs-personal' => 'Titouroù personel',
 'prefs-rc' => 'Kemmoù diwezhañ',
 'prefs-watchlist' => 'Roll evezhiañ',
@@ -1341,7 +1353,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'group' => 'Strollad :',
 'group-user' => 'Implijerien',
 'group-autoconfirmed' => 'Implijerien bet kadarnaet ent emgefre',
-'group-bot' => 'Botoù',
+'group-bot' => 'Robotoù',
 'group-sysop' => 'Merourien',
 'group-bureaucrat' => 'Burevidi',
 'group-suppress' => 'Dindan evezh',
@@ -1470,7 +1482,7 @@ Ma skrivit anezhañ e vo implijet evit lakaat war wel ar pezh a vo bet degaset g
 'nchanges' => '$1 {{PLURAL:$1|kemm|kemm}}',
 'recentchanges' => 'Kemmoù diwezhañ',
 'recentchanges-legend' => "Dibarzhioù ar c'hemmoù diwezhañ",
-'recentchangestext' => "Dre ar bajenn-mañ e c'hallit heuliañ ar c'hemmoù diwezhañ bet degaset d'ar wiki.",
+'recentchanges-summary' => "Dre ar bajenn-mañ e c'hallit heuliañ ar c'hemmoù diwezhañ bet degaset d'ar wiki.",
 'recentchanges-feed-description' => "Heuilhit ar c'hemmoù diwezhañ er wiki el lusk-mañ.",
 'recentchanges-label-newpage' => "Gant ar c'hemm-mañ e vo krouet ur bajenn nevez.",
 'recentchanges-label-minor' => "Ur c'hemm dister eo hemañ",
@@ -1660,13 +1672,13 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
 'upload-copy-upload-invalid-domain' => "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
 
 # File backend
-'backend-fail-stream' => 'Dibosupl lenn ar restr $1.',
+'backend-fail-stream' => 'Dibosupl eo lenn ar restr $1.',
 'backend-fail-backup' => 'Dibosupl enrollañ ar restr $1.',
 'backend-fail-notexists' => "N'eus ket eus ar restr $1.",
 'backend-fail-hashes' => 'Dibosupl eo bet tapout hacherezh ar restr evit keñveriañ.',
 'backend-fail-notsame' => "Ur restr disheñvel zo e $1 c'hoazh.",
 'backend-fail-invalidpath' => "$1 n'eo ket un hent stokañ reizh.",
-'backend-fail-delete' => 'Dibosupl eo diverkañ a restr $1.',
+'backend-fail-delete' => 'Dibosupl eo diverkañ ar restr $1.',
 'backend-fail-alreadyexists' => 'Ar restr "$1" zo anezhi c\'hoazh.',
 'backend-fail-store' => 'Dibosupl stokañ ar restr $1 e $2.',
 'backend-fail-copy' => 'Dibosupl eilañ ar restr "$1" war-du "$2".',
@@ -1675,14 +1687,15 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
 'backend-fail-writetemp' => 'Dibosupl skrivañ er restr padennek.',
 'backend-fail-closetemp' => 'Dibosupl eo serriñ ar restr padennek.',
 'backend-fail-read' => 'Dibosupl lenn ar restr $1.',
-'backend-fail-create' => 'Dibosupl krouiñ ar restr $1.',
-'backend-fail-maxsize' => "Dibosupl krouiñ ar restr $1 peogwir eo brasoc'h eget {{PLURAL:$2|un okted|$2 okted}}.",
+'backend-fail-create' => 'Dibosupl eo krouiñ ar restr $1.',
+'backend-fail-maxsize' => "Dibosupl skrivañ er restr $1 peogwir eo brasoc'h eget {{PLURAL:$2|un okted|$2 okted}}.",
 'backend-fail-readonly' => 'Emañ an dermenell stokañ "$1" e mod lenn hepken. Setu aze an abeg a oa bet roet : "$2".',
 'backend-fail-synced' => 'Emañ ar restr "$1" en ur stad direizhet en termenelloù stokañ diabarzh',
 'backend-fail-connect' => 'Dibosupl kevreañ ouzh termenell stokañ ar restr "$1".',
 'backend-fail-internal' => 'C\'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr "$1".',
 'backend-fail-contenttype' => 'Dibosupl termeniñ ar seurt danvez da enrollañ e "$1".',
 'backend-fail-batchsize' => 'Pourvezet he deus an dermenell stokañ ur pakad a $1 {{PLURAL:$1|oberiadenn|oberiadenn}}; sevel a ra ar vevenn da $2 {{PLURAL:$2|oberiadenn|oberiadenn}}.',
+'backend-fail-usable' => "Dibosupl skrivañ ar restr $1 rak re skort eo an aotreoù pe mankout a ra kavlec'hioù/endalc'herioù.",
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'N\'eus ket bet gallet kevreañ ouzh diaz roadennoù ar marilh evit an dermenell stokañ "$1".',
@@ -2002,6 +2015,7 @@ Na zisoñjit ket e c'hall lec'hiennoù all kaout ul liamm eeun war-du ur restr b
 Gallout a rit strishaat ar mod diskwel en ur zibab ar marilh, an anv implijer (diwallit ouzh ar pennlizherennoù) pe ar bajenn a fell deoc'h (memes tra).",
 'logempty' => 'Goullo eo istor ar bajenn-mañ.',
 'log-title-wildcard' => 'Klask an titloù a grog gant an destenn-mañ',
+'showhideselectedlogentries' => 'Diskouez/kuzhat penngerioù ar marilh bet diuzet',
 
 # Special:AllPages
 'allpages' => 'An holl bajennoù',
@@ -2021,6 +2035,11 @@ Gallout a rit strishaat ar mod diskwel en ur zibab ar marilh, an anv implijer (d
 'allpages-bad-ns' => 'N\'eus ket a esaouenn anv anvet "$1" war {{SITENAME}}.',
 'allpages-hide-redirects' => 'Kuzhat an adkasoù',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Emaoc'h o sellet ouzh ur stumm krubuilhet eus ar bajenn-mañ, a c'hall bezañ kement ha $1 kozh",
+'cachedspecial-viewing-cached-ts' => "Emaoc'h o sellet ouzh ur stumm krubuilhet eus ar bajenn-mañ a c'hall bezañ dispredet un disterañ.",
+'cachedspecial-refresh-now' => 'Gwelet an hini nevesañ.',
+
 # Special:Categories
 'categories' => 'Roll ar rummadoù',
 'categoriespagetext' => 'Er {{PLURAL:$1|rummad|rummadoù}}da-heul ez eus pajennoù pe restroù media.
@@ -2338,7 +2357,7 @@ Ma'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e
 'undelete-revision' => 'Stumm diverket eus $1, (gwiriadenn eus $4 da $5) gant $3 :',
 'undeleterevision-missing' => "Stumm fall pe diank. Pe hoc'h eus heuliet ul liamm fall, pe eo bet diziverket ar stumm pe c'hoazh eo bet lamet diouzh an dielloù.",
 'undelete-nodiff' => "N'eus bet kavet stumm kent ebet.",
-'undeletebtn' => 'Diziverkañ!',
+'undeletebtn' => 'Assevel',
 'undeletelink' => 'gwelet/assevel',
 'undeleteviewlink' => 'gwelet',
 'undeletereset' => 'Adderaouekaat',
@@ -2516,7 +2535,7 @@ Setu aze an abeg(où) m\'eo bet stanket $1 : "$2"',
 'blocklog-showsuppresslog' => "Stanket ha kuzhet eo bet an implijer-mañ c'hoazh. A-is emañ marilh ar diverkadennoù, d'ho titouriñ :",
 'blocklogentry' => 'en/he deus stanket [[$1]] betek an $2 $3',
 'reblock-logentry' => "en deus kemmet an arventennoù stankañ evit [[$1]] gant un termen d'an $2 $3",
-'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket outo ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.",
+'blocklogtext' => "Setu roud stankadennoù ha distankadennoù an implijerien. N'eo ket bet rollet ar chomlec'hioù IP bet stanket ent emgefre. Sellet ouzh [[Special:BlockList|roll an implijerien stanket]] evit gwelet piv zo stanket e gwirionez.",
 'unblocklogentry' => 'distanket "$1"',
 'block-log-flags-anononly' => 'implijerien dizanv hepken',
 'block-log-flags-nocreate' => 'berzet eo krouiñ kontoù',
@@ -2896,6 +2915,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'spambot_username' => 'Naetaat ar strob gant MediaWiki',
 'spam_reverting' => "Distreiñ d'ar stumm diwezhañ hep liamm davet $1",
 'spam_blanking' => 'Diverkañ an holl stummoù enno liammoù davet $1',
+'spam_deleting' => 'An holl stummoù enno liammoù war-zu $1, o tiverkañ',
 
 # Info page
 'pageinfo-title' => 'Titouroù evit "$1"',
@@ -3623,6 +3643,9 @@ Sañset oc'h bezañ resevet [{{SERVER}}{{SCRIPTPATH}}/COPYING un eilskrid eus ar
 'version-software' => 'Meziant staliet',
 'version-software-product' => 'Produ',
 'version-software-version' => 'Stumm',
+'version-entrypoints' => 'URLoù ar poent mont e-barzh',
+'version-entrypoints-header-entrypoint' => 'Poent mont e-barzh',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Hent moned ur restr',
@@ -3761,7 +3784,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...",
@@ -3811,4 +3834,17 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'api-error-uploaddisabled' => 'Diweredekaat eo an enporzh war ar wiki-mañ.',
 'api-error-verification-error' => 'Pe eo brein ar restr pe eo fall an astenn anezhi.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|eilenn|eilenn}}',
+'duration-minutes' => '$1 {{PLURAL:$1|munut|munut}}',
+'duration-hours' => '($1 {{PLURAL:$1|eurvezh|eurvezh}})',
+'duration-days' => '($1 {{PLURAL:$1|deiz|deiz}})',
+'duration-weeks' => '$1 {{PLURAL:$1|sizhun|sizhun}}',
+'duration-years' => '$1 {{PLURAL:$1|bloaz|bloaz}}',
+'duration-decades' => '$1 {{PLURAL:$1|degad|degas}}',
+'duration-centuries' => "$1 {{PLURAL:$1|c'hantved|kantved}}",
+'duration-millennia' => '$1 {{PLURAL:$1|milvloaz|milvoaz}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Dibosupl eo bet tapout ar prennoù war ar servijer $1.',
 );
index b666236..68c3e0e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Bosnian (Bosanski)
+/** Bosnian (bosanski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -61,6 +61,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'KnjizniIzvori' ),
        'BrokenRedirects'           => array( 'NedovršenaPreusmjerenja' ),
        'Categories'                => array( 'Kategorije' ),
+       'ChangeEmail'               => array( 'IzmjeniMail' ),
        'ChangePassword'            => array( 'PonistiLozinku' ),
        'ComparePages'              => array( 'UporedjivanjeStranica' ),
        'Confirmemail'              => array( 'PotvrdiEmail' ),
@@ -70,6 +71,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'ObrisaniDoprinosi' ),
        'Disambiguations'           => array( 'Čvor' ),
        'DoubleRedirects'           => array( 'DvostrukaPreusmjerenja' ),
+       'EditWatchlist'             => array( 'IzmjeniPraćeniSpisak' ),
        'Emailuser'                 => array( 'EmailKorisnika' ),
        'Export'                    => array( 'Izvoz' ),
        'Fewestrevisions'           => array( 'Najmanje_uređivane_stranice' ),
@@ -522,7 +524,7 @@ $1',
 'disclaimerpage' => 'Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti',
 'edithelp' => 'Pomoć pri uređivanju stranice',
 'edithelppage' => 'Help:Uređivanje',
-'helppage' => 'Help:Sadržaj',
+'helppage' => 'Pomoć:Sadržaj',
 'mainpage' => 'Početna strana',
 'mainpage-description' => 'Početna strana',
 'policy-url' => 'Project:Pravila',
@@ -638,8 +640,8 @@ Moguće je da ju je neko drugi već obrisao.',
 'cannotdelete-title' => 'Ne mogu izbrisati stranicu "$1"',
 'badtitle' => 'Loš naslov',
 'badtitletext' => 'Zahtjevani naslov stranice je bio neispravan, prazan ili neispravno povezan međujezički ili interviki naslov.',
-'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.',
+'perfcachedts' => 'Slijedeći podaci se nalaze u memoriji i zadnji put su ažurirani $1. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata}}.',
 'querypage-no-updates' => 'Ažuriranje ove stranice je isključeno.
 Podaci koji se ovdje nalaze ne moraju biti aktuelni.',
 'wrong_wfQuery_params' => 'Netačni parametri za wfQuery()<br />
@@ -754,6 +756,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 promijeniti 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}}',
@@ -960,7 +963,9 @@ Posljednje stavke zapisnika 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' => "'''Pažnja:'''",
-'previewnote' => "'''Ovo je samo pregled; izmjene stranice nisu još sačuvane!'''",
+'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
+Izmjene stranice nisu još sačuvane!",
+'continue-editing' => 'Nastavi uređivati',
 'previewconflict' => 'Ovaj pregled reflektuje tekst u gornjem polju
 kako će izgledati ako pritisnete "Sačuvaj članak".',
 '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.'''",
@@ -974,6 +979,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' => 'Pravljenje stranice $1',
 'editingsection' => 'Uređujete $1 (dio)',
 'editingcomment' => 'Uređujete $1 (nova sekcija)',
 'editconflict' => 'Sukobljenje izmjene: $1',
@@ -1043,6 +1049,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.
@@ -1058,6 +1065,12 @@ Ovakvi argumenti se trebaju izbjegavati.',
 'parser-template-loop-warning' => 'Otkrivena kružna greška u šablonu: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Dubina uključivanja šablona prekoračena ($1)',
 'language-converter-depth-warning' => 'Prekoračena granica dubine jezičkog pretvarača ($1)',
+'node-count-exceeded-category' => 'Stranice sa prekoračenim brojem čvorova',
+'node-count-exceeded-warning' => 'Stranice koje imaju prevelik broj čvorova',
+'expansion-depth-exceeded-category' => 'Stranice koje su prekoračile dubinu proširenja',
+'expansion-depth-exceeded-warning' => 'Stranice koje su prekoračile dubinu proširenja',
+'parser-unstrip-loop-warning' => 'Pronađena petlja',
+'parser-unstrip-recursion-limit' => 'Prekoračeno ograničenje rekurzije ($1)',
 
 # "Undo" feature
 'undo-success' => 'Izmjena se može vratiti.
@@ -1202,7 +1215,7 @@ Molimo provjerite zapise.',
 # Suppression log
 'suppressionlog' => 'Zapisi sakrivanja',
 'suppressionlogtext' => 'Ispod je spisak brisanja i blokiranja koja su povezana sa sadržajem koji je sakriven od administratora. 
-Vidi [[Special:BlockList|spisak IP blokiranja]] za pregled trenutno važećih blokada.',
+Vidi [[Special:BlockList|spisak blokiranja]] za pregled trenutno važećih blokada.',
 
 # History merging
 'mergehistory' => 'Spoji historije stranice',
@@ -1235,8 +1248,9 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'mergelogpagetext' => 'Ispod je spisak nedavnih spajanja historija stranica.',
 
 # Diffs
-'history-title' => 'Historija izmjena stranice "$1"',
-'difference' => '(Razlika između revizija)',
+'history-title' => 'Historija revizija "$1"',
+'difference-title' => 'Razlike između revizija od "$1"',
+'difference-title-multipage' => 'Razlika između stranica "$1" i "$2"',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Linija $1:',
 'compareselectedversions' => 'Uporedite označene verzije',
@@ -1317,7 +1331,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'qbsettings-fixedright' => 'Pričvršćena desno',
 'qbsettings-floatingleft' => 'Plutajuća lijevo',
 'qbsettings-floatingright' => 'Plutajući desno',
-'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma vašeg jezika',
+'qbsettings-directionality' => 'Čvrsto, u zavisnosti od usmjerenosti pisma Vašeg jezika',
 
 # Preferences page
 'preferences' => 'Podešavanja',
@@ -1332,6 +1346,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 'prefs-beta' => 'Beta mogućnosti',
 'prefs-datetime' => 'Datum i vrijeme',
 'prefs-labs' => 'Eksperimentalne mogućnosti',
+'prefs-user-pages' => 'Korisničke stranice',
 'prefs-personal' => 'Korisnički podaci',
 'prefs-rc' => 'Podešavanja nedavnih izmjena',
 'prefs-watchlist' => 'Moji praćeni članci',
@@ -1403,6 +1418,7 @@ Ovo se ne može vratiti unazad.',
 'yourrealname' => 'Vaše pravo ime:',
 'yourlanguage' => 'Jezik:',
 'yourvariant' => 'Varijanta jezika:',
+'prefs-help-variant' => 'Vaša preferirana varijanta ili pravopis za prikaz sadržaja stranica na ovoj wiki.',
 'yournick' => 'Nadimak (za potpise):',
 'prefs-help-signature' => 'Komentari na stranicama za razgovor trebaju biti potpisani sa "<nowiki>~~~~</nowiki>" koje će biti pretvoreno u vaš potpis i vrijeme.',
 'badsig' => 'Loš sirovi potpis.
@@ -1457,7 +1473,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'userrights-no-interwiki' => 'Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.',
 'userrights-nodatabase' => 'Baza podataka $1 ne postoji ili nije lokalna baza.',
 'userrights-nologin' => 'Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.',
-'userrights-notallowed' => 'Vaš korisnički račun nema privilegije da dodaje prava korisnika.',
+'userrights-notallowed' => 'Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.',
 'userrights-changeable-col' => 'Grupe koje možete mijenjati',
 'userrights-unchangeable-col' => 'Grupe koje ne možete mijenjati',
 
@@ -1544,7 +1560,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'right-siteadmin' => 'Zaključavanje i otključavanje baze podataka',
 'right-override-export-depth' => 'Izvoz stranica uključujući povezane stranice do dubine od 5 linkova',
 'right-sendemail' => 'Slanje e-maila drugim korisnicima',
-'right-passwordreset' => 'Poništavanje šifre korisnika ([[Special:PasswordReset|posebna stranica]])',
+'right-passwordreset' => 'Pogledaj e-mailove za obnavljanje šifre',
 
 # User rights log
 'rightslog' => 'Zapisnik korisničkih prava',
@@ -1578,6 +1594,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'action-suppressionlog' => 'vidite ovaj privatni zapis',
 'action-block' => 'blokirate uređivanje ovog korisnika',
 'action-protect' => 'promijeniti nivo zaštite za ovu stranicu',
+'action-rollback' => 'brzo vraćanje izmjena zadnjeg korisnika koji je uređivao određenu stranicu',
 'action-import' => 'uvozite ovu stranicu iz druge wiki',
 'action-importupload' => 'uvezete ovu stranicu putem postavljanja datoteke',
 'action-patrol' => 'označite izmjene drugih kao patrolirane',
@@ -1593,7 +1610,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'nchanges' => '$1 {{PLURAL:$1|promjena|promjene|promjena}}',
 'recentchanges' => 'Nedavne izmjene',
 'recentchanges-legend' => 'Postavke nedavnih izmjena',
-'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
+'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
 'recentchanges-feed-description' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
 'recentchanges-label-newpage' => 'Ovom izmjenom se pravi nova stranica',
 'recentchanges-label-minor' => 'Ovo je mala izmjena',
@@ -1619,6 +1636,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|korisnik|korisnika}} koji pregledaju]',
 'rc_categories' => 'Ograniči na kategorije (razdvojene sa "|")',
 'rc_categories_any' => 'Sve',
+'rc-change-size-new' => '$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene',
 'newsectionsummary' => '/* $1 */ nova sekcija',
 'rc-enhanced-expand' => 'Pokaži detalje (neophodna JavaScript)',
 'rc-enhanced-hide' => 'Sakrij detalje',
@@ -1781,11 +1799,18 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'upload-too-many-redirects' => 'URL sadrži previše preusmjerenja',
 'upload-unknown-size' => 'Nepoznata veličina',
 'upload-http-error' => 'Desila se HTTP greška: $1',
+'upload-copy-upload-invalid-domain' => 'Kopije postavljenih datoteka nisu dostupne sa ove domene.',
 
 # File backend
+'backend-fail-stream' => 'Ne mogu emitirati datoteku $1.',
 'backend-fail-backup' => 'Ne može sigurnosno kopirati datoteku $1.',
 'backend-fail-notexists' => 'Datoteka $1 ne postoji.',
+'backend-fail-hashes' => 'Nisam našao datoteku disperzije radi usporedbe.',
+'backend-fail-notsame' => 'Već postoji različita datoteka $1.',
+'backend-fail-invalidpath' => '$1 nije valjana putanja za skladištenje.',
+'backend-fail-delete' => 'Ne može se izbrisati datoteka $1.',
 'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
+'backend-fail-store' => 'Ne može se spremiti datoteka $1 na $2.',
 'backend-fail-read' => 'Ne mogu čitati datoteku $1.',
 'backend-fail-create' => 'Ne mogu napraviti datoteku $1.',
 
@@ -1855,9 +1880,8 @@ Možda možete pokušati kada bude manje opterećenje.',
 'upload_source_file' => ' (datoteka na Vašem računaru)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ova specijalna stranica prikazuje sve postavljene datoteke.
-Uobičajeno je da posljednja postavljena datoteka bude prikazana na vrhu spiska.
-Klikom na zaglavlje kolone možete promjeniti način sortiranja.',
+'listfiles-summary' => 'Ova posebna stranica prikazuje sve postavljene datoteke.
+Kada je filtrirana od strane korisnika, prikazane su samo datoteke ako je korisnik postavio posljednju verziju te datoteke.',
 'listfiles_search_for' => 'Traži medije po imenu:',
 'imgfile' => 'datoteka',
 'listfiles' => 'Spisak slika',
@@ -1984,7 +2008,7 @@ Prije brisanja provjerite da li druge stranice vode na te šablone.',
 'statistics-users-active-desc' => 'Korisnici koju su izvršili akciju u toku {{PLURAL:$1|zadnjeg dana|zadnja $1 dana|zadnjih $1 dana}}',
 'statistics-mostpopular' => 'Najviše pregledane stranice',
 
-'disambiguations' => 'Stranice za čvor članke',
+'disambiguations' => 'Stranice koje vode na čvor članke',
 'disambiguationspage' => '{{ns:template}}:Čvor',
 'disambiguations-text' => "Slijedeće stranice su povezane sa '''čvor stranicom'''.
 Po pravilu, one se trebaju povezati sa konkretnim člankom.<br />
@@ -2085,7 +2109,7 @@ na kome bi se izvela ova funkcija.',
 'booksources-invalid-isbn' => 'Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.',
 
 # Special:Log
-'specialloguserlabel' => 'Korisnik:',
+'specialloguserlabel' => 'Izvršilac:',
 'speciallogtitlelabel' => 'Cilj (naslov ili korisnik):',
 'log' => 'Protokoli',
 'all-logs-page' => 'Svi javni registri',
@@ -2111,6 +2135,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 preusmjerenja',
 
 # Special:Categories
 'categories' => 'Kategorije',
@@ -2127,12 +2152,13 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
 'sp-deletedcontributions-contribs' => 'doprinosi',
 
 # Special:LinkSearch
-'linksearch' => 'Vanjski linkovi',
+'linksearch' => 'Pretraga vanjskih linkova',
 'linksearch-pat' => 'Šema traženja:',
 'linksearch-ns' => 'Imenski prostor:',
 'linksearch-ok' => 'Traži',
-'linksearch-text' => 'Općeniti izrazi poput "*.wikipedia.org" se mogu koristiti.<br />
-Podržani protokoli: <tt>$1</tt>',
+'linksearch-text' => 'Mogu se koristiti općeniti izrazi poput "*.wikipedia.org"
+Potrebna je najmanje osnovna domena, naprimjer "*.org."<br />
+Podržani protokoli: <tt>$1</tt> (ne dodavajte bilo koji od ovih u vašu pretragu).',
 'linksearch-line' => '$1 je povezan od $2',
 'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
 
@@ -2239,7 +2265,7 @@ Ako kasnije želite da uklonite stranicu sa vašeg spiska praćenih članaka, kl
 'watchmethod-list' => 'provjerava se da li ima nedavnih izmjena u praćenim stranicama',
 'watchlistcontains' => 'Vaš spisak praćenih članaka sadrži $1 {{PLURAL:$1|stranicu|stranica}}.',
 'iteminvalidname' => "Problem sa '$1', neispravno ime...",
-'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}.",
+'wlnote' => "Ispod je {{PLURAL:$1|najskorija izmjena|'''$1''' najskorije izmjene|'''$1''' najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih '''$2''' sata|u posljednjih '''$2''' sati}}, od $3, $4.",
 'wlshowlast' => 'Prikaži posljednjih $1 sati $2 dana $3',
 'watchlist-options' => 'Opcije spiska praćenja',
 
@@ -2550,8 +2576,8 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 'ipb-confirm' => 'Potvrdite blokiranje',
 'badipaddress' => 'Pogrešna IP adresa',
 'blockipsuccesssub' => 'Blokiranje je uspjelo',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je blokiran.
-<br />Pogledajte [[Special:BlockList|IP spisak blokiranih korisnika]] za pregled blokiranja.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />
+Pogledajte [[Special:BlockList|spisak blokiranja]] za pregled blokiranja.',
 'ipb-blockingself' => 'Ovom akcijom ćete blokirati sebe! Da li ste sigurni da to želite?',
 'ipb-confirmhideuser' => "Upravo ćete blokirati korisnika sa uključenom opcijom ''sakrij korisnika''. Ovim će korisničko ime biti sakriveno u svim spiskovima i stavkama zapisnika. Da li ste sigurni da to želite?",
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
@@ -2604,8 +2630,8 @@ Razlog za blokiranje je korisnika $1 je: \'\'$2\'\'',
 'blocklogentry' => 'je blokirao [[$1]] sa vremenom isticanja blokade od $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',
@@ -2743,7 +2769,7 @@ stranica za razgovor nije mogla biti premještena jer takva već postoji na novo
 Odredišna stranica "[[:$1]]" već postoji.
 Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
 'delete_and_move_confirm' => 'Da, obriši stranicu',
-'delete_and_move_reason' => 'Obrisano da bi se napravio prostor za premještanje',
+'delete_and_move_reason' => 'Obrisano da bi se napravio prostor za premještanje iz "[[$1]]"',
 'selfmove' => 'Izvorni i ciljani naziv su isti; strana ne može da se premjesti preko same sebe.',
 'immobile-source-namespace' => 'Ne mogu premjestiti stranice u imenski prostor "$1"',
 'immobile-target-namespace' => 'Ne mogu se premjestiti stranice u imenski prostor "$1"',
@@ -2869,10 +2895,11 @@ Nedostaje privremeni folder.',
 
 # JavaScriptTest
 'javascripttest' => 'Testiranje JavaScript-e',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena.',
+'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Pokretanje $1 testova',
 'javascripttest-pagetext-noframework' => 'Ova stranica je određena za pokretanje JavaScript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznat radni okvir testiranja"$1".',
+'javascripttest-pagetext-skins' => 'Izaberite s kojom temom želite da pokrenete probu:',
 'javascripttest-qunit-intro' => 'Pogledajte [$1 dokumentaciju za testiranje] na mediawiki.org.',
 
 # Tooltip help for the actions
@@ -3761,6 +3788,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',
@@ -3874,6 +3902,10 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'revdelete-unrestricted' => 'uklonjena ograničenja za administratore',
 'logentry-move-move' => '$1 je premjestio stranicu $3 na $4',
 'logentry-move-move-noredirect' => '$1 je premjestio stranicu $3 na $4 bez ostavljanja preusmjerenja',
+'logentry-move-move_redir' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja',
+'logentry-move-move_redir-noredirect' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
+'logentry-patrol-patrol' => '$1 je označio izmjenu $4 stranice $3 pregledanim',
+'logentry-patrol-patrol-auto' => '$1 je automatski označio izmjenu $4 stranice $3 pregledanim',
 'logentry-newusers-newusers' => '$1 je napravio korisnički račun',
 'logentry-newusers-create' => '$1 je napravio korisnički račun',
 'logentry-newusers-create2' => '$1 je napravio korisnički račun $3',
@@ -3881,6 +3913,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'newuserlog-byemail' => 'šifra je poslana putem e-maila',
 
 # Feedback
+'feedback-bugornote' => 'Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite "bug" (grešku)].
+Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan na stranicu "[$3 $2]", zajedno s vašim korisničkim imenom i internetskog preglednika koji koristite.',
 'feedback-subject' => 'Tema:',
 'feedback-message' => 'Poruka:',
 'feedback-cancel' => 'Odustani',
@@ -3932,4 +3966,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 '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-days' => '$1 {{PLURAL:$1|dan|dana}}',
+
 );
index 7f4276a..3b2852c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Catalan (Català)
+/** Catalan (català)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -99,88 +99,94 @@ $magicWords = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'Usuaris_actius' ),
        'Allmessages'               => array( 'Missatges', 'MediaWiki' ),
-       'Allpages'                  => array( 'Llista de pàgines' ),
-       'Ancientpages'              => array( 'Pàgines velles' ),
-       'Blankpage'                 => array( 'Pàgina en blanc', 'Blanc' ),
+       'Allpages'                  => array( 'Llista_de_pàgines' ),
+       'Ancientpages'              => array( 'Pàgines_velles' ),
+       'Badtitle'                  => array( 'Títol_incorrecte' ),
+       'Blankpage'                 => array( 'Pàgina_en_blanc', 'Blanc' ),
        'Block'                     => array( 'Bloca' ),
        'Blockme'                   => array( 'Bloca\'m' ),
-       'Booksources'               => array( 'Fonts bibliogràfiques' ),
-       'BrokenRedirects'           => array( 'Redireccions rompudes' ),
-       'ChangePassword'            => array( 'Reinicia contrasenya' ),
-       'Confirmemail'              => array( 'Confirma adreça' ),
+       'Booksources'               => array( 'Fonts_bibliogràfiques' ),
+       'BrokenRedirects'           => array( 'Redireccions_rompudes' ),
+       'ChangeEmail'               => array( 'Canvia_adreça_electrònica' ),
+       'ChangePassword'            => array( 'Reinicia_contrasenya' ),
+       'Confirmemail'              => array( 'Confirma_adreça' ),
        'Contributions'             => array( 'Contribucions' ),
-       'CreateAccount'             => array( 'Crea compte' ),
+       'CreateAccount'             => array( 'Crea_compte' ),
        'Deadendpages'              => array( 'Atzucacs' ),
-       'DeletedContributions'      => array( 'Contribucions esborrades' ),
+       'DeletedContributions'      => array( 'Contribucions_esborrades' ),
        'Disambiguations'           => array( 'Desambiguacions' ),
-       'DoubleRedirects'           => array( 'Redireccions dobles' ),
-       'Emailuser'                 => array( 'Envia missatge' ),
+       'DoubleRedirects'           => array( 'Redireccions_dobles' ),
+       'Emailuser'                 => array( 'Envia_missatge' ),
        'Export'                    => array( 'Exporta' ),
-       'Fewestrevisions'           => array( 'Pàgines menys editades' ),
-       'FileDuplicateSearch'       => array( 'Cerca fitxers duplicats' ),
+       'Fewestrevisions'           => array( 'Pàgines_menys_editades' ),
+       'FileDuplicateSearch'       => array( 'Cerca_fitxers_duplicats' ),
        'Import'                    => array( 'Importa' ),
-       'BlockList'                 => array( 'Usuaris blocats' ),
-       'LinkSearch'                => array( 'Enllaços web', 'Busca enllaços', 'Recerca d\'enllaços web' ),
+       'BlockList'                 => array( 'Usuaris_blocats' ),
+       'LinkSearch'                => array( 'Enllaços_web', 'Busca_enllaços', 'Recerca_d\'enllaços_web' ),
        'Listadmins'                => array( 'Administradors' ),
        'Listbots'                  => array( 'Bots' ),
        'Listfiles'                 => array( 'Imatges' ),
-       'Listgrouprights'           => array( 'Drets dels grups d\'usuaris' ),
+       'Listgrouprights'           => array( 'Drets_dels_grups_d\'usuaris' ),
        'Listredirects'             => array( 'Redireccions' ),
        'Listusers'                 => array( 'Usuaris' ),
-       'Lockdb'                    => array( 'Bloca bd' ),
+       'Lockdb'                    => array( 'Bloca_bd' ),
        'Log'                       => array( 'Registre' ),
-       'Lonelypages'               => array( 'Pàgines òrfenes' ),
-       'Longpages'                 => array( 'Pàgines llargues' ),
-       'MergeHistory'              => array( 'Fusiona historial' ),
-       'MIMEsearch'                => array( 'Cerca MIME' ),
-       'Mostcategories'            => array( 'Pàgines amb més categories' ),
-       'Mostimages'                => array( 'Imatges més útils' ),
-       'Mostlinked'                => array( 'Pàgines més enllaçades' ),
-       'Mostlinkedcategories'      => array( 'Categories més útils' ),
-       'Mostlinkedtemplates'       => array( 'Plantilles més útils' ),
-       'Mostrevisions'             => array( 'Pàgines més editades' ),
+       'Lonelypages'               => array( 'Pàgines_òrfenes' ),
+       'Longpages'                 => array( 'Pàgines_llargues' ),
+       'MergeHistory'              => array( 'Fusiona_historial' ),
+       'MIMEsearch'                => array( 'Cerca_MIME' ),
+       'Mostcategories'            => array( 'Pàgines_amb_més_categories' ),
+       'Mostimages'                => array( 'Imatges_més_útils' ),
+       'Mostlinked'                => array( 'Pàgines_més_enllaçades' ),
+       'Mostlinkedcategories'      => array( 'Categories_més_útils' ),
+       'Mostlinkedtemplates'       => array( 'Plantilles_més_útils' ),
+       'Mostrevisions'             => array( 'Pàgines_més_editades' ),
        'Movepage'                  => array( 'Reanomena' ),
-       'Mycontributions'           => array( 'Contribucions pròpies' ),
-       'Mypage'                    => array( 'Pàgina personal' ),
-       'Mytalk'                    => array( 'Discussió personal' ),
-       'Newimages'                 => array( 'Imatges noves' ),
-       'Newpages'                  => array( 'Pàgines noves' ),
-       'Popularpages'              => array( 'Pàgines populars' ),
+       'Mycontributions'           => array( 'Contribucions_pròpies' ),
+       'Mypage'                    => array( 'Pàgina_personal' ),
+       'Mytalk'                    => array( 'Discussió_personal' ),
+       'Newimages'                 => array( 'Imatges_noves' ),
+       'Newpages'                  => array( 'Pàgines_noves' ),
+       'Popularpages'              => array( 'Pàgines_populars' ),
        'Preferences'               => array( 'Preferències' ),
-       'Prefixindex'               => array( 'Cerca per prefix' ),
-       'Protectedpages'            => array( 'Pàgines protegides' ),
-       'Protectedtitles'           => array( 'Títols protegits' ),
-       'Randompage'                => array( 'Article aleatori', 'Atzar', 'Aleatori' ),
-       'Randomredirect'            => array( 'Redirecció aleatòria' ),
-       'Recentchanges'             => array( 'Canvis recents' ),
+       'Prefixindex'               => array( 'Cerca_per_prefix' ),
+       'Protectedpages'            => array( 'Pàgines_protegides' ),
+       'Protectedtitles'           => array( 'Títols_protegits' ),
+       'Randompage'                => array( 'Article_aleatori', 'Atzar', 'Aleatori' ),
+       'Randomredirect'            => array( 'Redirecció_aleatòria' ),
+       'Recentchanges'             => array( 'Canvis_recents' ),
        'Recentchangeslinked'       => array( 'Seguiment' ),
-       'Revisiondelete'            => array( 'Esborra versió' ),
+       'Revisiondelete'            => array( 'Esborra_versió' ),
+       'RevisionMove'              => array( 'Mou_versió' ),
        'Search'                    => array( 'Cerca' ),
-       'Shortpages'                => array( 'Pàgines curtes' ),
-       'Specialpages'              => array( 'Pàgines especials' ),
+       'Shortpages'                => array( 'Pàgines_curtes' ),
+       'Specialpages'              => array( 'Pàgines_especials' ),
        'Statistics'                => array( 'Estadístiques' ),
-       'Uncategorizedcategories'   => array( 'Categories sense categoria' ),
-       'Uncategorizedimages'       => array( 'Imatges sense categoria' ),
-       'Uncategorizedpages'        => array( 'Pàgines sense categoria' ),
-       'Uncategorizedtemplates'    => array( 'Plantilles sense categoria' ),
+       'Unblock'                   => array( 'Desbloca', 'Desbloqueja' ),
+       'Uncategorizedcategories'   => array( 'Categories_sense_categoria' ),
+       'Uncategorizedimages'       => array( 'Imatges_sense_categoria' ),
+       'Uncategorizedpages'        => array( 'Pàgines_sense_categoria' ),
+       'Uncategorizedtemplates'    => array( 'Plantilles_sense_categoria' ),
        'Undelete'                  => array( 'Restaura' ),
-       'Unlockdb'                  => array( 'Desbloca bd' ),
-       'Unusedcategories'          => array( 'Categories no usades' ),
-       'Unusedimages'              => array( 'Imatges no usades' ),
-       'Unusedtemplates'           => array( 'Plantilles no usades' ),
-       'Unwatchedpages'            => array( 'Pàgines desateses' ),
+       'Unlockdb'                  => array( 'Desbloca_bd' ),
+       'Unusedcategories'          => array( 'Categories_no_usades' ),
+       'Unusedimages'              => array( 'Imatges_no_usades' ),
+       'Unusedtemplates'           => array( 'Plantilles_no_usades' ),
+       'Unwatchedpages'            => array( 'Pàgines_desateses' ),
        'Upload'                    => array( 'Carrega' ),
-       'Userlogin'                 => array( 'Registre i entrada' ),
-       'Userlogout'                => array( 'Finalitza sessió' ),
+       'Userlogin'                 => array( 'Registre_i_entrada' ),
+       'Userlogout'                => array( 'Finalitza_sessió' ),
        'Userrights'                => array( 'Drets' ),
        'Version'                   => array( 'Versió' ),
-       'Wantedcategories'          => array( 'Categories demanades' ),
-       'Wantedfiles'               => array( 'Arxius demanats' ),
-       'Wantedpages'               => array( 'Pàgines demanades' ),
-       'Watchlist'                 => array( 'Llista de seguiment' ),
+       'Wantedcategories'          => array( 'Categories_demanades' ),
+       'Wantedfiles'               => array( 'Arxius_demanats' ),
+       'Wantedpages'               => array( 'Pàgines_demanades' ),
+       'Wantedtemplates'           => array( 'Plantilles_demanades' ),
+       'Watchlist'                 => array( 'Llista_de_seguiment' ),
        'Whatlinkshere'             => array( 'Enllaços' ),
-       'Withoutinterwiki'          => array( 'Sense interwiki' ),
+       'Withoutinterwiki'          => array( 'Sense_interwiki' ),
 );
 
 $linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
@@ -193,7 +199,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Amaga edicions patrullades als canvis recents',
 'tog-newpageshidepatrolled' => 'Amaga pàgines patrullades de la llista de pàgines noves',
 'tog-extendwatchlist' => 'Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents',
-'tog-usenewrc' => 'Usa la presentació millorada dels canvis recents (cal JavaScript)',
+'tog-usenewrc' => 'Utilitza una presentació millorada dels canvis recents (cal JavaScript)',
 'tog-numberheadings' => 'Enumera automàticament els encapçalaments',
 'tog-showtoolbar' => "Mostra la barra d'eines d'edició (cal JavaScript)",
 'tog-editondblclick' => 'Edita les pàgines amb un doble clic (cal JavaScript)',
@@ -209,8 +215,8 @@ $messages = array(
 'tog-previewontop' => "Mostra una previsualització abans del quadre d'edició",
 'tog-previewonfirst' => 'Mostra una previsualització en la primera modificació',
 'tog-nocache' => 'Inhabilita la memòria cau de les pàgines',
-'tog-enotifwatchlistpages' => "Notifica'm per correu electrònic dels canvis a les pàgines que vigili",
-'tog-enotifusertalkpages' => "Notifica'm per correu quan hi hagi modificacions a la pàgina de discussió del meu compte d'usuari",
+'tog-enotifwatchlistpages' => "Envia'm un correu electrònic quan es modifiqui una pàgina de la meva llista de seguiment",
+'tog-enotifusertalkpages' => "Envia'm un correu electrònic quan es modifiqui la meva pàgina de discussió",
 'tog-enotifminoredits' => "Notifica'm per correu també en casos d'edicions menors",
 'tog-enotifrevealaddr' => "Mostra la meua adreça electrònica en els missatges d'avís per correu",
 'tog-shownumberswatching' => "Mostra el nombre d'usuaris que hi vigilen",
@@ -228,7 +234,7 @@ $messages = array(
 'tog-watchlisthideanons' => "Amaga a la llista les edicions d'usuaris anònims",
 'tog-watchlisthidepatrolled' => 'Amaga edicions patrullades de la llista de seguiment',
 'tog-nolangconversion' => 'Inhabilita la conversió de variants',
-'tog-ccmeonemails' => "Envia'm còpies dels missatges que enviï als altres usuaris.",
+'tog-ccmeonemails' => "Envia'm còpia dels missatges que enviï als altres usuaris",
 'tog-diffonly' => 'Amaga el contingut de la pàgina davall de la taula de diferències',
 'tog-showhiddencats' => 'Mostra les categories ocultes',
 'tog-noconvertlink' => 'Inhabilita la conversió dels títols dels enllaços',
@@ -570,8 +576,10 @@ $2",
 'ns-specialprotected' => 'No es poden modificar les pàgines especials.',
 'titleprotected' => "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].
 Els seus motius han estat: «''$2''».",
-'filereadonlyerror' => "No s'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers «$2» està en mode només de lectura.
-El motiu donat és «''$3''».",
+'filereadonlyerror' => 'No s\'ha pogut modificar el fitxer «$1» perquè el repositori de fitxers "$2" està en mode només de lectura.
+L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
+'invalidtitle-knownnamespace' => "El títol amb l'espai de noms «$2» i text «$3» no és vàlid",
+'invalidtitle-unknownnamespace' => 'Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»',
 
 # Virus scanner
 'virus-badscanner' => "Mala configuració: antivirus desconegut: ''$1''",
@@ -849,7 +857,8 @@ Per més detalls, la darrera entrada del registre es mostra a continuació:",
 'updated' => '(Actualitzat)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Recorda que això és només una previsualització.'''
-Els vostres canvis encara no s'han desat! [[#editform|→ Continuar editant]]",
+Els vostres canvis encara no s'han desat!",
+'continue-editing' => "Continua l'edició",
 'previewconflict' => "Aquesta previsualització reflecteix, a l'àrea
 d'edició superior, el text tal i com apareixerà si trieu desar-lo.",
 'session_fail_preview' => "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.
@@ -929,6 +938,7 @@ Sembla haver estat esborrada.",
 'edit-no-change' => 'La vostra modificació ha estat ignorada perquè no feia cap canvi al text.',
 'edit-already-exists' => "No s'ha pogut crear una pàgina.
 Ja existeix.",
+'defaultmessagetext' => 'Missatge per defecte',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.
@@ -944,6 +954,12 @@ Se n'han omès els arguments.",
 'parser-template-loop-warning' => "S'ha detectat un bucle de plantilla: [[$1]]",
 'parser-template-recursion-depth-warning' => "S'ha excedit el límit de recursivitat de plantilles ($1)",
 'language-converter-depth-warning' => "El límit de la profunditat del conversor d'idiomes ha excedit ($1)",
+'node-count-exceeded-category' => "Pàgines on s'ha excedit el recompte de nodes",
+'node-count-exceeded-warning' => 'La pàgina ha excedit el recompte de nodes',
+'expansion-depth-exceeded-category' => "Pàgines on s'ha excedit la profunditat d'expansió",
+'expansion-depth-exceeded-warning' => "La pàgina ha excedit la profunditat d'expansió",
+'parser-unstrip-loop-warning' => "S'ha detectat un bucle no desmuntable",
+'parser-unstrip-recursion-limit' => "S'ha excedit el límit ($1) de recursivitat no desmuntable",
 
 # "Undo" feature
 'undo-success' => "Pot desfer-se la modificació. Si us plau, reviseu la comparació de sota per a assegurar-vos que és el que voleu fer; llavors deseu els canvis per a finalitzar la desfeta de l'edició.",
@@ -1087,8 +1103,8 @@ Si us plau, verifica els registres.",
 
 # Suppression log
 'suppressionlog' => 'Registre de supressió',
-'suppressionlogtext' => 'A continuació es mostra una llista de les supressions i blocs que impliquen contingut ocult a administradors.
-Veure la [[Special:BlockList|List]] per a la llista de prohibicions actualment operatives i blocs.',
+'suppressionlogtext' => 'A continuació es mostra una llista de les supressions i blocs que impliquen contingut ocult per administradors.
+Veure la [[Special:BlockList|llista de bloqueigs]] per a la llista de prohibicions actualment operatives i bloqueigs.',
 
 # History merging
 'mergehistory' => 'Fusiona els historials de les pàgines',
@@ -1120,8 +1136,9 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 'mergelogpagetext' => "A sota hi ha una llista de les fusions més recents d'una pàgina d'historial en una altra.",
 
 # Diffs
-'history-title' => 'Historial de versions de «$1»',
-'difference' => '(Diferència entre revisions)',
+'history-title' => '$1: Historial de revisions',
+'difference-title' => '$1: Diferència entre les revisions',
+'difference-title-multipage' => '$1 i $2: Diferència entre les pàgines',
 'difference-multipage' => '(Diferència entre pàgines)',
 'lineno' => 'Línia $1:',
 'compareselectedversions' => 'Compara les versions seleccionades',
@@ -1216,6 +1233,7 @@ Assegureu-vos que aquest canvi mantindrà la continuïtat històrica de la pàgi
 'prefs-beta' => 'Característiques beta',
 'prefs-datetime' => 'Data i hora',
 'prefs-labs' => 'Característiques de laboratori',
+'prefs-user-pages' => "Pàgines d'usuari",
 'prefs-personal' => "Perfil d'usuari",
 'prefs-rc' => 'Canvis recents',
 'prefs-watchlist' => 'Llista de seguiment',
@@ -1266,7 +1284,7 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Oceà Índic',
 'timezoneregion-pacific' => 'Oceà Pacífic',
-'allowemail' => "Habilita el correu electrònic des d'altres usuaris",
+'allowemail' => 'Permet que altres usuaris puguin enviar-me correus electrònics',
 'prefs-searchoptions' => 'Preferències de la cerca',
 'prefs-namespaces' => 'Espais de noms',
 'defaultns' => 'Cerca per defecte en els següents espais de noms:',
@@ -1307,7 +1325,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'prefs-i18n' => 'Internacionalització',
 'prefs-signature' => 'Signatura',
 'prefs-dateformat' => 'Format de la data',
-'prefs-timeoffset' => "Duració de l'acció",
+'prefs-timeoffset' => 'Decalatge horari',
 'prefs-advancedediting' => 'Opcions avançades',
 'prefs-advancedrc' => 'Opcions avançades',
 'prefs-advancedrendering' => 'Opcions avançades',
@@ -1477,7 +1495,7 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'nchanges' => '$1 {{PLURAL:$1|canvi|canvis}}',
 'recentchanges' => 'Canvis recents',
 'recentchanges-legend' => 'Opcions de canvis recents',
-'recentchangestext' => 'Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.',
+'recentchanges-summary' => 'Seguiu els canvis recents del projecte {{SITENAME}} en aquesta pàgina.',
 'recentchanges-feed-description' => 'Segueix en aquest canal els canvis més recents del wiki.',
 'recentchanges-label-newpage' => 'Aquesta modificació inicià una pàgina',
 'recentchanges-label-minor' => 'Aquesta és una modificació menor',
@@ -1664,13 +1682,18 @@ $1',
 'backend-fail-closetemp' => "No s'ha pogut tancar el fitxer temporal.",
 'backend-fail-read' => "No s'ha pogut llegir el fitxer $1.",
 'backend-fail-create' => "No s'ha pogut crear el fitxer $1.",
-'backend-fail-maxsize' => "No s'ha pogut crear el fitxer $1 perquè és més gran que {{PLURAL:$2|un byte|$2 bytes}}.",
+'backend-fail-maxsize' => "No s'ha pogut escriure el fitxer $1 perquè és més gran que {{PLURAL:$2|un byte|$2 bytes}}.",
 'backend-fail-readonly' => "El rerefons d'emmagatzemament «$1» actualment només és de lectura. Es va donar el motiu: «$2»",
 'backend-fail-synced' => "El fitxer «$1» es troba en un estat inconsistent amb els rerefons d'emmagatzemament interns.",
 'backend-fail-connect' => "No s'ha pogut connectar al fitxer de rerefons d'emmagatzemament «$1».",
 'backend-fail-internal' => "S'ha produït un error desconegut en el fitxer de rerefons d'emmagatzemament «$1».",
 'backend-fail-contenttype' => 'No es pot determinar el tipus de contingut del fitxer per emmagatzemar a «$1».',
 'backend-fail-batchsize' => "El rerefons d'emmagatzemament ha rebut un lot {{PLURAL:$1|d'$1 operació|de $1 operacions}} de fitxer; el límit és $2 {{PLURAL:$2|operació|operacions}}.",
+'backend-fail-usable' => "No s'ha pogut escriure el fitxer $1 a causa de permisos insuficients o perquè hi manquen directoris/contenidors.",
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'No es pot connectar amb la base de dades per emmagatzemar el backend "$1".',
+'filejournal-fail-dbquery' => 'No es pot actualitzat la base de dades per a emmagatzemar el backend "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => "No s'ha pogut desbloquejar «$1»; no és bloquejat.",
@@ -1983,6 +2006,7 @@ Tingueu en compte que altres llocs web poden enllaçar un fitxer amb un URL dire
 Podeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari realitzador (distingeix entre majúscules i minúscules), o la pàgina objectiu (també en distingeix).",
 'logempty' => 'No hi ha cap coincidència en el registre.',
 'log-title-wildcard' => 'Cerca els títols que comencin amb aquest text',
+'showhideselectedlogentries' => 'Mostra/amaga les entrades de registre seleccionades',
 
 # Special:AllPages
 'allpages' => 'Totes les pàgines',
@@ -2002,6 +2026,11 @@ Podeu reduir l'extensió seleccionant el tipus de registre, el nom d'usuari real
 'allpages-bad-ns' => "El projecte {{SITENAME}} no disposa de l'espai de noms «$1».",
 'allpages-hide-redirects' => 'Amaga les redireccions',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Esteu veient una versió a la memòria cau de la pàgina, que pot tenir fins a $1.',
+'cachedspecial-viewing-cached-ts' => 'Esteu veient una versió a la memòria cau de la pàgina, que podria no ser completament actual.',
+'cachedspecial-refresh-now' => 'Mostra la darrera.',
+
 # Special:Categories
 'categories' => 'Categories',
 'categoriespagetext' => "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.
@@ -2444,8 +2473,8 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipb-confirm' => 'Confirma el blocatge',
 'badipaddress' => "L'adreça IP no té el format correcte.",
 'blockipsuccesssub' => "S'ha blocat amb èxit",
-'blockipsuccesstext' => "L'usuari «[[Special:Contributions/$1|$1]]» ha estat blocat.
-<br />Vegeu la [[Special:BlockList|llista d'IP blocades]] per revisar els bloquejos.",
+'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] ha estat {{GENDER:$1|bloquejat|bloquejada|bloquejat/da}}.<br />
+Vegeu la [[Special:BlockList|llista d'IP blocades]] per revisar els bloqueigs.",
 'ipb-blockingself' => 'Esteu a punt de blocar-vos a vós mateix! Esteu segurs de voler-ho fer?',
 'ipb-confirmhideuser' => "Esteu a punt de bloquejar un usuari que està marcat amb l'opció «amaga l'usuari». Això suprimirà el seu nom a totes les llistes i registres. Esteu segurs de voler-ho fer?",
 'ipb-edit-dropdown' => 'Edita les raons per a blocar',
@@ -2499,7 +2528,7 @@ Per més detalls, a sota es mostra el registre de bloquejos:',
 Per més detalls, a sota es mostra el registre de supressions:',
 'blocklogentry' => "ha blocat l'{{GENDER:$1|usuari|usuària}} [[$1]] per un període de: $2 $3",
 'reblock-logentry' => 'canviades les opcions del blocatge a [[$1]] amb caducitat a $2, $3',
-'blocklogtext' => "Això és una relació de accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista d'usuaris actualment bloquejats]].",
+'blocklogtext' => 'Això és una relació de accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista de bloqueigs]] per veure una llista dels actuals bloqueigs operatius.',
 'unblocklogentry' => 'ha desblocat $1',
 'block-log-flags-anononly' => 'només els usuaris anònims',
 'block-log-flags-nocreate' => "s'ha desactivat la creació de comptes",
@@ -2862,6 +2891,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'spambot_username' => 'Neteja de brossa del MediaWiki',
 'spam_reverting' => 'Es reverteix a la darrera versió que no conté enllaços a $1',
 'spam_blanking' => "Totes les revisions contenien enllaços $1, s'està deixant en blanc",
+'spam_deleting' => "S'estan suprimint totes les revisions que contenien enllaços a $1",
 
 # Info page
 'pageinfo-title' => 'Informació de «$1»',
@@ -3571,6 +3601,9 @@ Amb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còp
 'version-software' => 'Programari instaŀlat',
 'version-software-product' => 'Producte',
 'version-software-version' => 'Versió',
+'version-entrypoints' => "URL de punts d'entrada",
+'version-entrypoints-header-entrypoint' => "Punt d'entrada",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Camí del fitxer',
@@ -3759,4 +3792,17 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'api-error-uploaddisabled' => 'Estan desactivades les càrregues en aquest wiki',
 'api-error-verification-error' => 'Aquest fitxer pot estar danyat, o tenir una extensió incorrecta.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segon|segons}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minuts}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|hores}}',
+'duration-days' => '$1 {{PLURAL:$1|dia|dies}}',
+'duration-weeks' => '$1 {{PLURAL:$1|setmana|setmanes}}',
+'duration-years' => '$1 {{PLURAL:$1|any|anys}}',
+'duration-decades' => '$1 {{PLURAL:$1|dècada|dècades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|segle|segles}}',
+'duration-millennia' => '$1 {{PLURAL:$1|mil·leni|mil·lenis}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => "No s'han pogut aconseguir els bloquejos al servidor $1.",
 );
index 1efedc7..d2b0477 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Xqt
  */
 
 $datePreferences = array(
@@ -348,7 +349,6 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 
 # Diffs
 'history-title' => '"$1" gì siŭ-gāi lĭk-sṳ̄',
-'difference' => '(Bēng-buōng cĭ-găng gì chă-biék)',
 'lineno' => 'Dâ̤ $1 hòng:',
 'compareselectedversions' => 'Bī-piâng gēng-sōng bēng-buōng',
 'editundo' => 'chṳ̄-siĕu',
@@ -414,7 +414,7 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 
 # Recent changes
 'recentchanges' => 'Cī-bŏng gì gāi-biéng',
-'recentchangestext' => 'Găk cī hiĕk dŭi-sùi wiki cī-bŏng dék sĭng gì gāi-biéng.',
+'recentchanges-summary' => 'Găk cī hiĕk dŭi-sùi wiki cī-bŏng dék sĭng gì gāi-biéng.',
 'rcnote' => 'Â-dā̤ sê <strong>{{PLURAL:$1|ék|$2}}</strong> gĕ̤ng ī-nô̤i (hiêng-câi sê $3) dék sĭng gì <strong>{{PLURAL:$1|1|$1}}</strong> hâung gāi-biéng.',
 'rclistfrom' => 'Hiēng-sê iù $1 kăi-sṳ̄ gì sĭng gāi-biéng',
 'rcshowhideminor' => '$1 guó-éu siŭ-gāi',
@@ -501,6 +501,8 @@ Siók-mìng: (dāng) = gâe̤ng dék sĭng bēng-buōng bī-piâng, (sèng) = g
 'statistics' => 'Só-gé̤ṳ',
 'statistics-header-users' => 'Ê̤ṳng-hô só-gé̤ṳ',
 
+'disambiguationspage' => 'Template:Gì-ngiê',
+
 'brokenredirects-edit' => 'gāi',
 'brokenredirects-delete' => 'chēng',
 
index 3e4b7e9..cb6fdff 100644 (file)
@@ -719,7 +719,6 @@ $1',
 
 # Diffs
 'history-title' => '$1 — хийцаман исторе',
-'difference' => '(Тайпанара юкъар башхалла)',
 'lineno' => 'Могlа $1:',
 'compareselectedversions' => 'Хаьржиначуьна башхо муха ю хьажа',
 'showhideselectedversions' => 'Гайта/къайлайаха хаьржина башхонаш',
index ab9bfc9..aef2dc4 100644 (file)
@@ -698,7 +698,6 @@ Hinumdomi nga ang paggamit sa mga sumpay sa nabigasyon mo-reset sa column.',
 
 # Diffs
 'history-title' => 'Kaagi sa rebisyon sa "$1"',
-'difference' => '(Kalainan sa mga rebisyon)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'Ikompara ang piniling mga bersiyon',
 'editundo' => 'i-way bili',
index edb8f9e..99d4116 100644 (file)
@@ -616,7 +616,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 
 # Diffs
 'history-title' => 'Historian tinilaika nu "$1"',
-'difference' => '(Diferensia siha gi tinilaika)',
 'lineno' => 'Liña $1:',
 'compareselectedversions' => "Akompara i tinilaika siha ma'ayek",
 'editundo' => 'funas',
index 0d7185f..cf78ce7 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sorani (کوردی)
+/** Sorani Kurdish (کوردی)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -413,8 +413,8 @@ $1',
 'editlink' => 'دەستکاری',
 'viewsourcelink' => 'سەرچاوەکەی ببینە',
 'editsectionhint' => 'دەستکاری کردنی بەشی: $1',
-'toc' => 'Ù\86اÙ\88Û\95رÛ\86Ú©',
-'showtoc' => 'نیشاندان',
+'toc' => 'Ù¾Û\8eرست',
+'showtoc' => 'نیشانیبدە',
 'hidetoc' => 'بیشارەوە',
 'collapsible-collapse' => 'کۆیبکەوە',
 'collapsible-expand' => 'بڵاویبکەوە',
@@ -814,6 +814,7 @@ $2
 دەستکاریەکەت بۆ بەرگری لە تێکەڵ‌بوونی دەقی لاپەڕەکە وەر نەگیرا.<br />
 ئەمە بڕێ‌جار کاتێ ڕوو ئەدات کە لە خزمەتی پرۆکسی سەر وێب کەڵک وەر بگریت.",
 'editing' => 'دەستکاریکردنی $1',
+'creating' => 'دروستکردنی $1',
 'editingsection' => 'دەستکاریکردنی: $1 (بەش)',
 'editingcomment' => 'دەستکاریکردنی $1 (بەشی  نوێ)',
 'editconflict' => 'دەستکاری کێشە : $1',
@@ -1063,7 +1064,8 @@ $1",
 
 # Diffs
 'history-title' => 'مێژووی پیاچوونەوەکانی «$1»',
-'difference' => '(جیاوازی نێوان پیاچوونەوەکان)',
+'difference-title' => 'جیاوازی نێوان پیاچوونەوەکانی «$1»',
+'difference-title-multipage' => 'جیاوازیی نێوان پەڕەی «$1» و «$2»',
 'difference-multipage' => '(جیاوازی نێوان پەڕەکان)',
 'lineno' => 'ھێڵی  $1:',
 'compareselectedversions' => 'پیاچوونەوە ھەڵبژێردراوەکان ھەڵسەنگێنە',
@@ -1159,6 +1161,7 @@ $1",
 'prefs-beta' => 'کەرەسەکانی بیتا',
 'prefs-datetime' => 'کات و ڕێکەوت',
 'prefs-labs' => 'کەرەسەکانی تاقیگەکان',
+'prefs-user-pages' => 'پەڕە بەکارھێنەرییەکان',
 'prefs-personal' => 'پرۆفایلی بەکارھێنەر',
 'prefs-rc' => 'دوایین گۆڕانکارییەکان',
 'prefs-watchlist' => 'لیستی چاودێری',
@@ -1257,7 +1260,7 @@ $1",
 'prefs-advancedrendering' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedsearchoptions' => 'هەڵبژاردە پێشکەوتووەکان',
 'prefs-advancedwatchlist' => 'هەڵبژاردە پێشکەوتووەکان',
-'prefs-displayrc' => 'هەڵبژاردەکانی نیشان‌دان',
+'prefs-displayrc' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaysearchoptions' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-displaywatchlist' => 'ھەڵبژاردەکانی نیشاندان',
 'prefs-diffs' => 'جیاوازییەکان',
@@ -1411,7 +1414,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
 'recentchanges' => 'دوایین گۆڕانکارییەکان',
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
-'recentchangestext' => 'دÙ\88اÛ\8c Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86Û\8c Ø¦Û\95Ù\85 Ù\88Û\8cÚ©Û\8cÛ\95 Ø¨Ú©Û\95Ù\88Û\95 Ù\84Û\95Ù\85 Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Ù\88Û\95.',
+'recentchanges-summary' => 'Ù\84Û\95Ù\85 Ù¾Û\95Ú\95Û\95دا Ø¨Û\95 Ø¯Ù\88اÛ\8c Ø¯Ù\88اÛ\8cÛ\8cÙ\86 Ú¯Û\86Ú\95اÙ\86کارÛ\8cÛ\8cÛ\95کاÙ\86 Ù\84Û\95Ù\85 Ù\88Û\8cÚ©Û\8cÛ\95دا Ø¨Ú©Û\95Ù\88Û\95.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
 'recentchanges-label-newpage' => 'ئەم دەستکاریە لاپەڕەیەکی نوێی درووست‌کرد',
 'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
@@ -1881,7 +1884,7 @@ $1',
 
 # Special:ListUsers
 'listusersfrom' => 'نیشاندانی بەکارھێنەران بە دست پێکردن لە:',
-'listusers-submit' => 'نیشاندان',
+'listusers-submit' => 'نیشانیبدە',
 'listusers-noresult' => 'ھیچ بەکارھێنەرێک نەدۆزرایەوە.',
 'listusers-blocked' => '(بەربەست‌کراو)',
 
@@ -3187,6 +3190,8 @@ $5
 'revdelete-restricted' => 'ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران',
 'revdelete-unrestricted' => 'ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران',
 'logentry-move-move' => '$1 پەڕەی $3ی گواستەوە بۆ $4',
+'logentry-move-move-noredirect' => '$1 پەڕەی $3 گواستەوە بۆ $4 بێ بەجێھشتنی ڕەوانەکردنەوەیەک',
+'logentry-move-move_redir-noredirect' => '$1 پەڕەی $3 گواستەوە بۆ $4 لە جێگەی ڕەوانەکەرێک بە بێ بەجێھشتنی ڕەوانەکردنەوەیەک',
 'logentry-newusers-newusers' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد',
 'logentry-newusers-create' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد',
 'logentry-newusers-create2' => '$1 ھەژمارێکی بەکارھێنەریی دروستکرد $3',
@@ -3206,4 +3211,15 @@ $5
 'api-error-unknown-code' => 'ھەڵەی نەزانراو: «$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 499c41f..b63fe8d 100644 (file)
@@ -555,7 +555,6 @@ Indi pag-ilakip ang pila ka mga suleras.',
 
 # Diffs
 'history-title' => 'Kasaysayan sang pagbag-o sang "$1"',
-'difference' => '(Ginkala-in sang mga rebisyon)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'I-kumpara ang pinili-an nga mga rebisyon',
 'editundo' => 'ibalik',
index ff86968..c3abfdc 100644 (file)
@@ -824,7 +824,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 
 # Diffs
 'history-title' => '$1 саифесининъ денъишмелер тарихы',
-'difference' => '(Версиялар арасы фаркълар)',
 'difference-multipage' => '(Саифелер арасындаки фаркъ)',
 'lineno' => '$1 сатыр:',
 'compareselectedversions' => 'Сайлангъан версияларны тенъештир',
@@ -913,7 +912,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'prefs-rc' => 'Сонъки денъишмелер',
 'prefs-watchlist' => 'Козетюв джедвели',
 'prefs-watchlist-days' => 'Козетюв джедвелинде косьтериледжек кунь сайысы:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Энъ чокъ $1 {{PLURAL:$1|кунь|кунь}}',
 'prefs-watchlist-edits' => 'Кенишлетилген козетюв джедвелинде косьтериледжек денъишмелер сайысы:',
 'prefs-watchlist-edits-max' => '(энъ чокъ 1000)',
 'prefs-watchlist-token' => 'Козетюв джедвели ишарети:',
@@ -1042,7 +1041,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|денъишме|денъишме}}',
 'recentchanges' => 'Сонъки денъишмелер',
 'recentchanges-legend' => 'Сонъки денъишмелер сазламалары',
-'recentchangestext' => 'Япылгъан энъ сонъки денъишмелерни бу саифеде корип оласынъыз.',
+'recentchanges-summary' => 'Япылгъан энъ сонъки денъишикликлерни бу саифеде корип оласынъыз.',
 'recentchanges-feed-description' => 'Бу лента вастасынен викиде сонъки денъишмелерни козет.',
 'recentchanges-label-newpage' => 'Бу денъишме янъы бир саифе яратты',
 'recentchanges-label-minor' => 'Бу, кичик бир денъишме',
index 0837acc..84a2ee2 100644 (file)
@@ -821,7 +821,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 
 # Diffs
 'history-title' => '"$1" saifesiniñ deñişmeler tarihı',
-'difference' => '(Versiyalar arası farqlar)',
 'difference-multipage' => '(Saifeler arasındaki farq)',
 'lineno' => '$1 satır:',
 'compareselectedversions' => 'Saylanğan versiyalarnı teñeştir',
@@ -910,7 +909,7 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'prefs-rc' => 'Soñki deñişmeler',
 'prefs-watchlist' => 'Közetüv cedveli',
 'prefs-watchlist-days' => 'Közetüv cedvelinde kösterilecek kün sayısı:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Eñ çoq $1 {{PLURAL:$1|kün|kün}}',
 'prefs-watchlist-edits' => 'Kenişletilgen közetüv cedvelinde kösterilecek deñişmeler sayısı:',
 'prefs-watchlist-edits-max' => 'Eñ çoq 1000',
 'prefs-watchlist-token' => 'Közetüv cedveli işareti:',
@@ -1039,7 +1038,7 @@ Eger bildirseñiz, saifelerdeki deñişmelerni kimniñ yapqanını köstermek i
 'nchanges' => '$1 {{PLURAL:$1|deñişme|deñişme}}',
 'recentchanges' => 'Soñki deñişmeler',
 'recentchanges-legend' => 'Soñki deñişmeler sazlamaları',
-'recentchangestext' => 'Yapılğan eñ soñki deñişmelerni bu saifede körip olasıñız.',
+'recentchanges-summary' => 'Yapılğan eñ soñki deñişikliklerni bu saifede körip olasıñız.',
 'recentchanges-feed-description' => 'Bu lenta vastasınen vikide soñki deñişmelerni közet.',
 'recentchanges-label-newpage' => 'Bu deñişme yañı bir saife yarattı',
 'recentchanges-label-minor' => 'Bu, kiçik bir deñişme',
index 8100d12..761bf4a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Czech (Ä\8cesky)
+/** Czech (Ä\8desky)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -361,7 +361,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skrýt patrolované editace v posledních změnách',
 'tog-newpageshidepatrolled' => 'Skrýt patrolované stránky ze seznamu nových stránek',
 'tog-extendwatchlist' => 'Na seznamu sledovaných stránek zobrazovat všechny změny, ne jen tu poslední',
-'tog-usenewrc' => 'Používat zdokonalené poslední změny (vyžaduje JavaScript)',
+'tog-usenewrc' => 'V posledních změnách a sledovaných stránkách seskupovat změny podle stránek (vyžaduje JavaScript)',
 'tog-numberheadings' => 'Automaticky číslovat nadpisy',
 'tog-showtoolbar' => 'Zobrazit panel nástrojů (vyžaduje JavaScript)',
 'tog-editondblclick' => 'Editovat dvojklikem (JavaScript)',
@@ -371,7 +371,7 @@ $messages = array(
 'tog-rememberpassword' => 'Zapamatovat si mé přihlášení v tomto prohlížeči (maximálně $1 {{PLURAL:$1|den|dny|dní}})',
 'tog-watchcreations' => 'Přidávat mnou založené stránky ke sledovaným',
 'tog-watchdefault' => 'Přidávat mnou editované stránky ke sledovaným',
-'tog-watchmoves' => 'Přidávat přesouvané stránky mezi sledované',
+'tog-watchmoves' => 'Přidávat mnou přesouvané stránky mezi sledované',
 'tog-watchdeletion' => 'Přidávat stránky, které smažu, mezi sledované',
 'tog-minordefault' => 'Označit editaci implicitně jako malá editace',
 'tog-previewontop' => 'Zobrazovat náhled před editačním oknem (ne za ním)',
@@ -740,6 +740,10 @@ $2',
 'filereadonlyerror' => "Nelze změnit soubor „$1“, protože úložiště souborů „$2“ je momentálně pouze pro čtení.
 
 Správce serveru, který úložiště zamkl, poskytl toto zdůvodnění: „''$3''“.",
+'invalidtitle-knownnamespace' => 'Neplatný název se jmenným prostorem „$2“ a textem „$3“',
+'invalidtitle-unknownnamespace' => 'Neplatný název s neznámým číslem jmenného prostoru $1 a textem „$2“',
+'exception-nologin' => 'Nejste přihlášen(a)',
+'exception-nologin-text' => 'Tato stránka nebo akce vyžaduje, abyste byli na této wiki přihlášeni.',
 
 # Virus scanner
 'virus-badscanner' => "Špatná konfigurace: neznámý antivirový program: ''$1''",
@@ -950,16 +954,16 @@ Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace z
 'summary-preview' => 'Náhled shrnutí:',
 'subject-preview' => 'Náhled předmětu/nadpisu:',
 'blockedtitle' => 'Uživatel zablokován',
-'blockedtext' => "'''Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
+'blockedtext' => "Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
 
-Zablokování provedl $1.
+Zablokování provedl{{gender:$1||a}} $1.
 Udaným důvodem bylo ''$2''.
 
 * Začátek blokování: $8
 * Zablokování vyprší: $6
 * Blokovaný uživatel: $7
 
-Pokud chcete zablokování prodiskutovat, můžete kontaktovat uživatele $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
+Pokud chcete zablokování prodiskutovat, můžete kontaktovat {{gender:$1|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
 Uvědomte si, že nemůžete použít nabídku „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.
 Vaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
 'autoblockedtext' => "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.
@@ -1022,7 +1026,8 @@ Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
 'updated' => '(Změna uložena)',
 'note' => "'''Poznámka:'''&nbsp;",
 'previewnote' => "'''Pamatujte, že toto je pouze náhled.'''
-Změny zatím nebyly uloženy! [[#editform|→ Pokračovat v editaci]]",
+Změny zatím nebyly uloženy!",
+'continue-editing' => 'Pokračovat v editaci',
 'previewconflict' => 'Tento náhled ukazuje text tak, jak bude vypadat po uložení stránky.',
 'session_fail_preview' => "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.
 Zkuste to prosím znovu.
@@ -1114,6 +1119,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Detekováno zacyklení unstrip',
+'parser-unstrip-recursion-limit' => 'Překročen limit rekurze unstrip ($1)',
 
 # "Undo" feature
 'undo-success' => 'Editace může být zrušena. Zkontrolujte a pak potvrďte změny zobrazené níže.',
@@ -1290,8 +1301,9 @@ Ujistěte se, že tato změna udrží souvislost a posloupnost verzí v historii
 'mergelogpagetext' => 'Níže je seznam nejnovějších sloučení historie jedné stránky s jinou.',
 
 # Diffs
-'history-title' => 'Historie verzí stránky „$1“',
-'difference' => '(Rozdíly mezi verzemi)',
+'history-title' => '$1: Historie verzí',
+'difference-title' => '$1: Porovnání verzí',
+'difference-title-multipage' => '$1 a $2: Porovnání stránek',
 'difference-multipage' => '(Rozdíly mezi stránkami)',
 'lineno' => 'Řádka $1:',
 'compareselectedversions' => 'Porovnat vybrané verze',
@@ -1387,6 +1399,7 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'prefs-beta' => 'Funkce z betaverze',
 'prefs-datetime' => 'Datum a čas',
 'prefs-labs' => 'Funkce z Labs',
+'prefs-user-pages' => 'Uživatelské stránky',
 'prefs-personal' => 'Údaje o uživateli',
 'prefs-rc' => 'Poslední změny',
 'prefs-watchlist' => 'Sledované stránky',
@@ -1647,7 +1660,7 @@ Tuto operaci nelze vrátit zpět.',
 'nchanges' => '$1 {{PLURAL:$1|změna|změny|změn}}',
 'recentchanges' => 'Poslední změny',
 'recentchanges-legend' => 'Možnosti posledních změn',
-'recentchangestext' => 'Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.',
+'recentchanges-summary' => 'Sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}} na této stránce.',
 'recentchanges-feed-description' => 'Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.',
 'recentchanges-label-newpage' => 'Touto editací byla založena nová stránka',
 'recentchanges-label-minor' => 'Toto je malá editace',
@@ -1846,14 +1859,15 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
 'backend-fail-writetemp' => 'Do dočasného souboru nelze zapisovat.',
 'backend-fail-closetemp' => 'Dočasný soubor nelze zavřít.',
 'backend-fail-read' => 'Soubor $1 nelze číst.',
-'backend-fail-create' => 'Soubor $1 nelze vytvořit.',
-'backend-fail-maxsize' => 'Nelze vytvořit soubor $1, protože je větší než {{PLURAL:$2|$2 bajt|$2 bajty|$2 bajtů}}.',
+'backend-fail-create' => 'Nepodařilo se zapsat do souboru $1.',
+'backend-fail-maxsize' => 'Nepodařilo se zapsat do souboru $1, protože je větší než {{PLURAL:$2|$2 bajt|$2 bajty|$2 bajtů}}.',
 'backend-fail-readonly' => 'Koncový úložný systém „$1“ je momentálně pouze pro čtení. Udaným důvodem je: „$2“',
 'backend-fail-synced' => 'Soubor „$1“ je v interních koncových úložných systémech v nekonzistentním stavu',
 'backend-fail-connect' => 'Nepodařilo se připojit ke koncovému úložnému systému „$1“.',
 'backend-fail-internal' => 'V koncovém úložném systému „$1“ došlo k neznámé chybě.',
 'backend-fail-contenttype' => 'Nelze určit typ obsahu souboru k uložení do „$1“.',
 'backend-fail-batchsize' => 'Koncový úložný systém přijal dávku s $1 {{PLURAL:souborovou operací|souborovými operacemi}}; maximum je {{PLURAL:$2|$2}}.',
+'backend-fail-usable' => 'Nepodařilo se zapsat do souboru $1 kvůli nedostatečným oprávněním nebo chybějícím adresářům/kontejnerům.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nelze se připojit k žurnálové databázi pro koncový úložný systém „$1“.',
@@ -2171,6 +2185,7 @@ Uvědomte si, že jiné webové stránky mohou na soubor odkazovat pomocí pří
 Zobrazení můžete zúžit výběrem typu záznamu, uživatelského jména (záleží na velikosti písmen) nebo dotčené stránky (také záleží na velikosti písmen).',
 'logempty' => 'Protokol neobsahuje žádný odpovídající záznam.',
 'log-title-wildcard' => 'Hledat názvy začínající na tento text',
+'showhideselectedlogentries' => 'Ukázat/skrýt vybrané záznamy',
 
 # Special:AllPages
 'allpages' => 'Všechny stránky',
@@ -2190,6 +2205,11 @@ Zobrazení můžete zúžit výběrem typu záznamu, uživatelského jména (zá
 'allpages-bad-ns' => '{{SITENAME}} nemá jmenný prostor "$1".',
 'allpages-hide-redirects' => 'Skrýt přesměrování',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Prohlížíte si cachovanou verzi této stránky, která může být až $1 stará.',
+'cachedspecial-viewing-cached-ts' => 'Prohlížíte si cachovanou verzi této stránky, která nemusí být zcela aktuální.',
+'cachedspecial-refresh-now' => 'Zobrazit nejnovější.',
+
 # Special:Categories
 'categories' => 'Kategorie',
 'categoriespagetext' => 'Následující kategorie {{PLURAL:$1|obsahuje|obsahují}} stránky nebo soubory.
@@ -2618,7 +2638,7 @@ Udejte přesný důvod níže (například ocitujte, které stránky byly poško
 'ipb-confirm' => 'Potvrdit zablokování',
 'badipaddress' => 'Neplatná IP adresa',
 'blockipsuccesssub' => 'Zablokování uspělo',
-'blockipsuccesstext' => 'Uživatel „[[Special:Contributions/$1|$1]]“ je zablokován.<br />
+'blockipsuccesstext' => '„[[Special:Contributions/$1|$1]]“ je {{GENDER:$1|zablokován|zablokována}}.<br />
 Můžete si prohlédnout [[Special:BlockList|seznam zablokovaných uživatelů]].',
 'ipb-blockingself' => 'Chystáte se zablokovat {{gender:|sám|sama|sami}} sebe! Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
 'ipb-confirmhideuser' => 'Chystáte se zablokovat uživatele se zapnutou volbou „skrýt uživatelské jméno“. To způsobí, že jméno uživatele zmizí ze všech seznamů a protokolovacích záznamů. Jste si {{gender:|jist|jista|jisti}}, že to chcete udělat?',
@@ -2670,7 +2690,9 @@ Zde je pro přehled zobrazen výpis z knihy zablokování:',
 'blocklog-showsuppresslog' => 'Tento uživatel byl zablokován a skryt. Zde je pro přehled zobrazen výpis záznamu utajení:',
 'blocklogentry' => 'blokuje „[[$1]]“ s časem vypršení $2 $3',
 'reblock-logentry' => 'mění nastavení bloku „[[$1]]“ s časem vypršení $2 $3',
-'blocklogtext' => 'Toto je kniha úkonů blokování a odblokování uživatelů. Automaticky blokované IP adresy nejsou vypsány. Podívejte se na [[Special:BlockList|seznam blokování IP]] s výčtem aktuálních zákazů a blokování.',
+'blocklogtext' => 'Toto je kniha úkonů blokování a odblokování uživatelů.
+Automaticky blokované IP adresy nejsou vypsány.
+Vizte též [[Special:BlockList|seznam všech probíhajících bloků]].',
 'unblocklogentry' => 'odblokovává „$1“',
 'block-log-flags-anononly' => 'pouze anonymní uživatelé',
 'block-log-flags-nocreate' => 'vytváření účtů zablokováno',
@@ -3049,7 +3071,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'spamprotectionmatch' => 'Následující text spustil náš filtr proti spamu: $1',
 'spambot_username' => 'Systémový čistič spamu',
 'spam_reverting' => 'Revert na poslední verzi neobsahující odkazy na $1',
-'spam_blanking' => 'Všechny revize obsahovaly odkazy na $1, vyprázdněno',
+'spam_blanking' => 'Všechny verze obsahovaly odkazy na $1, vyprázdněno',
+'spam_deleting' => 'Všechny verze obsahovaly odkazy na $1, smazáno',
 
 # Info page
 'pageinfo-title' => 'Informace o "$1"',
@@ -3816,6 +3839,9 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'version-software' => 'Nainstalovaný software',
 'version-software-product' => 'Název',
 'version-software-version' => 'Verze',
+'version-entrypoints' => 'URL vstupních bodů',
+'version-entrypoints-header-entrypoint' => 'Vstupní bod',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cesta k souboru',
@@ -4004,4 +4030,17 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'api-error-uploaddisabled' => 'Načítání souborů je na této wiki vypnuto.',
 'api-error-verification-error' => 'Soubor je možná poškozen nebo má špatnou příponu.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuty|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodina|hodiny|hodin}}',
+'duration-days' => '$1 {{PLURAL:$1|den|dny|dní}}',
+'duration-weeks' => '$1 {{PLURAL:$1|týden|týdny|týdnů}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|roky|let}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekáda|dekády|dekád}}',
+'duration-centuries' => '$1 {{PLURAL:$1|století}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Nepodařilo se získat zámek serveru $1.',
 );
index 515e428..61de1fb 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kashubian (Kaszëbsczi)
+/** Kashubian (kaszëbsczi)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -556,7 +556,6 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
 
 # Diffs
 'history-title' => 'Historëjô wersëji dlô "$1"',
-'difference' => '(różnice midzë wersëjama)',
 'lineno' => 'Lëniô $1:',
 'compareselectedversions' => 'Przërównôj wëbróné wersëje',
 'editundo' => 'doprowadzë nazôd',
@@ -728,7 +727,7 @@ Mòżesz zezwòlëc jinszim brëkòwniką na łączbã z Tobą przez Twòją sta
 'nchanges' => '{{PLURAL:$1|zjinaka|zjinaczi|zjinaków}}',
 'recentchanges' => 'Slédné edicëje',
 'recentchanges-legend' => 'Òptacëje slédnych zjinaków',
-'recentchangestext' => 'Na starna prezentérëje historëjã slédnëch edicëjów w {{SITENAME}}.',
+'recentchanges-summary' => 'Na starna prezentérëje historëjã slédnëch edicëjów w {{SITENAME}}.',
 'recentchanges-feed-description' => 'Pòdstrzegô slédny zmianë w tim pòwrózkù.',
 'recentchanges-label-minor' => 'To je drobnô edicëjô',
 'rcnote' => "Niżi {{PLURAL:$1|nachôdô sã '''1''' slédnô zjinaka zrobionô|nachôdają sã '''$1''' slédné zjinaczi zrobioné|nachôdô sã '''$1''' slédnych zjinaków zrobionëch}} w {{PLURAL:$2|slédnégò dnia|slédnych '''$2''' dniach}}, rëchùjąc òd $5 dnia $4.",
index 19227ca..73eed18 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' => 'послѣдьн҄ь мѣнъ строи',
+'recentchanges-summary' => 'с҄ьдє послѣдьнѩ мѣнꙑ сѥѩ викиопꙑтьствованиꙗ видѣти можєши',
 '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..1efc850 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' => 'Хӳтĕлеве пăрахăçла',
@@ -574,7 +575,6 @@ $1 хутшăнакан патне, е ытти [[{{MediaWiki:Grouppage-sysop}}|
 'suppressionlog' => 'Пытару журналĕ',
 
 # Diffs
-'difference' => '(Версисем хушшинчи улшăнусем)',
 'lineno' => '$1-мĕш йĕрке:',
 'editundo' => 'пăрахăçла',
 
@@ -587,6 +587,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 +752,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 +968,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'viewdeletedpage' => 'Кăларса пăрахнă страницăсене пăх',
 'undeleterevisions' => 'Архивра пурĕ $1 верси',
 'undeletebtn' => 'Каялла тавăр!',
+'undeleteviewlink' => 'пăх',
 'undeletereset' => 'Тасат',
 'undeletedrevisions' => '$1 кăларса пăрахнă тӳрлетӳсене каялла тавăрнă',
 'undelete-search-box' => 'Кăларса пăрахнă страницăсен хушшинчи шырав',
@@ -1066,12 +1072,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 +1088,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 +1131,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'ilsubmit' => 'Шырамалла',
 'bydate' => 'дата тăрăх',
 
+# Metadata
+'metadata' => 'Метаданнăйсем:',
+
 # EXIF tags
 'exif-exifversion' => 'Exif версийĕ',
 'exif-flashpixversion' => 'Ĕçлеме пултаракан FlashPix версийĕ',
index 4926cdd..221f124 100644 (file)
@@ -124,7 +124,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr newidiadau diweddar',
 'tog-newpageshidepatrolled' => 'Cuddio tudalennau sydd wedi derbyn ymweliad patrôl rhag y rhestr dudalennau newydd',
 'tog-extendwatchlist' => "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
-'tog-usenewrc' => 'Defnyddio newidiadau diweddar gwell (angen JavaScript)',
+'tog-usenewrc' => "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio' (angen JavaScript)",
 'tog-numberheadings' => "Rhifo penawdau'n awtomatig",
 'tog-showtoolbar' => 'Dangos y bar offer golygu (angen JavaScript)',
 'tog-editondblclick' => 'Golygu tudalennau wrth glicio ddwywaith (angen JavaScript)',
@@ -503,6 +503,8 @@ Rhoddwyd y rheswm hwn - ''$2''.",
 'filereadonlyerror' => 'Nid oes modd newid y ffeil "$1" oherwydd nad oes modd gwneud dim heblaw darllen storfa\'r ffeil yn "$2" yn unig.
 
 Y rheswm a roddwyd gan y gweinyddwr a roddodd y ffeil dan glo yw "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Teitl annilys o\'r enw "$3" yn y parth "$2"',
+'invalidtitle-unknownnamespace' => 'Teitl annilys ag iddi\'r rhif parth anhysbys $1 a\'r enw "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Cyfluniad gwael: sganiwr firysau anhysbys: ''$1''",
@@ -775,7 +777,8 @@ Dyma'r cofnod lòg diweddaraf, er gwybodaeth:",
 Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:user}}:Foo/vector.css yn hytrach na {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Diweddariad)',
 'note' => "'''Dalier sylw:'''",
-'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto! [[#editform|→ Parhau i olygu]]",
+'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 +872,12 @@ 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",
+'parser-unstrip-loop-warning' => 'Wedi darganfod dolen dad-blicio (unstrip loop)',
+'parser-unstrip-recursion-limit' => 'Wedi mynd dros ben y terfyn ar ddychweliad dad-blicio (unstrip recursion) ($1)',
 
 # "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.",
@@ -919,7 +928,7 @@ Gallwch [[Special:Search|chwilio'r]] wici am dudalennau eraill perthnasol.",
 'rev-deleted-comment' => '(dilëwyd crynodeb y golygiad)',
 'rev-deleted-user' => '(enw defnyddiwr wedi ei ddiddymu)',
 'rev-deleted-event' => '(tynnwyd gweithred y lòg)',
-'rev-deleted-user-contribs' => '[tynnwyd enw defnyddiwr neu gyfeiriad IP i ffwrdd - ni ddangosir y golygiad ar y rhestr cyfraniadau]',
+'rev-deleted-user-contribs' => '[tynnwyd enw defnyddiwr neu gyfeiriad IP i ffwrdd - ni ddangosir y golygiad ar y rhestr gyfraniadau]',
 'rev-deleted-text-permission' => "'''Dilëwyd''' y diwygiad hwn o'r dudalen.
 Mae manylion ar gael yn y [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lòg dileuon].",
 'rev-deleted-text-unhide' => "Cafodd y diwygiad hwn o'r dudalen ei '''ddileu'''.
@@ -1012,7 +1021,7 @@ Edrychwch ar y logiau er mwyn cael rhagor o wybodaeth.",
 # Suppression log
 'suppressionlog' => 'Lòg cuddio',
 'suppressionlogtext' => "Dyma restr y dileuon a'r blociau lle y cuddiwyd cynnwys rhag y gweinyddwyr.
-Gallwch weld rhestr y gwaharddiadau a'r blociau gweithredol ar y [[Special:BlockList|rhestr blociau IP]].",
+Gallwch weld rhestr y gwaharddiadau a'r blociau gweithredol ar y [[Special:BlockList|rhestr blociau]].",
 
 # History merging
 'mergehistory' => 'Cyfuno hanesion y tudalennau',
@@ -1044,8 +1053,9 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
 'mergelogpagetext' => "Fe ddilyn rhestr o'r achosion diweddaraf o hanes tudalen yn cael ei gyfuno a hanes tudalen arall.",
 
 # Diffs
-'history-title' => "Hanes golygu '$1'",
-'difference' => '(Gwahaniaethau rhwng diwygiadau)',
+'history-title' => '$1: hanes golygu',
+'difference-title' => 'Y gwahaniaeth rhwng diwygiadau o "$1"',
+'difference-title-multipage' => 'Y gwahaniaeth rhwng y tudalennau "$1" a "$2"',
 'difference-multipage' => '(Y gwahaniaeth rhwng y tudalennau)',
 'lineno' => 'Llinell $1:',
 'compareselectedversions' => 'Cymharer y fersiynau dewisedig',
@@ -1142,6 +1152,7 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 'prefs-beta' => 'Nodweddion Beta',
 'prefs-datetime' => 'Dyddiad ac amser',
 'prefs-labs' => 'Nodweddion Labs',
+'prefs-user-pages' => 'Tudalennau defnyddwyr',
 'prefs-personal' => 'Data defnyddiwr',
 'prefs-rc' => 'Newidiadau diweddar',
 'prefs-watchlist' => 'Rhestr wylio',
@@ -1404,7 +1415,7 @@ Mae'r wybodaeth hon ar gael i'r cyhoedd.",
 'nchanges' => '$1 {{PLURAL:$1|newid|newid|newid|newid|newid|o newidiadau}}',
 'recentchanges' => 'Newidiadau diweddar',
 'recentchanges-legend' => "Dewisiadau'r newidiadau diweddar",
-'recentchangestext' => "Dilynwch y newidiadau diweddaraf i'r wici ar y dudalen hon.",
+'recentchanges-summary' => "Dilynwch y newidiadau diweddaraf i'r wici ar y dudalen hon.",
 'recentchanges-feed-description' => "Dilynwch y newidiadau diweddaraf i'r wici gyda'r porthiant hwn.",
 'recentchanges-label-newpage' => 'Dechreuwyd tudalen newydd wrth olygu',
 'recentchanges-label-minor' => 'Mân olygiad',
@@ -1597,14 +1608,15 @@ Os yw'r broblem yn parhau, cysylltwch â [[Special:ListUsers/sysop|gweinyddwr]].
 'backend-fail-writetemp' => "Wedi methu ysgrifennu i'r ffeil dros dro.",
 'backend-fail-closetemp' => "Wedi methu cau'r ffeil dros dro.",
 'backend-fail-read' => 'Wedi methu darllen y ffeil $1.',
-'backend-fail-create' => "Wedi methu creu'r ffeil $1.",
-'backend-fail-maxsize' => "Ni ellid cynhyrchu'r ffeil $1 oherwydd ei bod yn fwy na{{PLURAL:$2||g un beit| $2 feit| $2 beit| $2 beit| $2 beit}}.",
+'backend-fail-create' => "Wedi methu ysgrifennu'r ffeil $1.",
+'backend-fail-maxsize' => "Ni ellid ysgrifennu'r ffeil $1 oherwydd ei bod yn fwy na{{PLURAL:$2||g un beit| $2 feit| $2 beit| $2 beit| $2 beit}} o faint.",
 'backend-fail-readonly' => 'Ar hyn o bryd gellir darllen y storfa "$1" yn unig. Y rheswm dros hyn yw: "\'\'$2\'\'"',
 'backend-fail-synced' => 'Mae\'r ffeil "$1" mewn cyflwr anghyson oddi mewn i\'r storfeydd tu ôl i\'r llenni.',
 'backend-fail-connect' => 'Ni ellid cysylltu â\'r storfa tu ôl i\'r llenni yn "$1".',
 'backend-fail-internal' => 'Cafwyd gwall anhysbys yn y storfa tu ôl i\'r llenni yn "$1".',
 'backend-fail-contenttype' => 'Methwyd a dirnad pa fath o gynnwys sydd yn y ffeil y ceisir ei storio yn "$1".',
 'backend-fail-batchsize' => "Rhoddwyd llwyth o {{PLURAL:$1|$1 o weithrediadau}} ffeil i'w gwneud i'r storfa; ni all nifer y {{PLURAL:$2|gweithrediadau}} fod yn fwy na $2.",
+'backend-fail-usable' => "Ni ellid ysgrifennu'r ffeil $1 oherwydd nad oedd caniatad digonol ynteu bod cyfeiriaduron neu flychau yn eisiau.",
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Methwyd cysylltu â lòg y gweithrediadau ar y storfa "$1".',
@@ -1717,8 +1729,8 @@ Pan hidlir y rhestr yn ôl defnyddiwr, yr unig rhai a ddangosir o blith y ffeili
 'filehist-missing' => 'Y ffeil yn eisiau',
 'imagelinks' => 'Defnydd y ffeil',
 'linkstoimage' => "Mae'r {{PLURAL:$1|tudalen|dudalen|tudalennau|tudalennau|tudalennau|tudalennau}} isod yn cysylltu i'r ddelwedd hon:",
-'linkstoimage-more' => "Mae rhagor na $1 {{PLURAL:$1|tudalen yn|dudalen yn|dudalen yn|o dudalennau'n|o dudalennau'n|o dudalennau'n}} cysylltu at y ffeil hon.
-Mae'r rhestr canlynol yn dangos y {{PLURAL:$1|$1 cysylltiad cyntaf}} at y ffeil hon yn unig. Mae [[Special:WhatLinksHere/$2|rhestr lawn]] ar gael.",
+'linkstoimage-more' => "Mae mwy na $1 {{PLURAL:$1|tudalen yn|dudalen yn|dudalen yn|o dudalennau'n|o dudalennau'n|o dudalennau'n}} cysylltu at y ffeil hon.
+Mae'r rhestr ganlynol yn dangos y {{PLURAL:$1|$1 cysylltiad cyntaf}} at y ffeil hon yn unig. Mae [[Special:WhatLinksHere/$2|rhestr lawn]] ar gael.",
 'nolinkstoimage' => 'Nid oes cyswllt ar unrhyw dudalen yn arwain at y ffeil hon.',
 'morelinkstoimage' => 'Gweld [[Special:WhatLinksHere/$1|rhagor o gysylltiadau]] at y ffeil hon.',
 'linkstoimage-redirect' => "$1 (tudalen ffeil sy'n ailgyfeirio) $2",
@@ -1926,6 +1938,7 @@ Gallwch weld chwiliad mwy penodol trwy ddewis y math o lòg, enw'r defnyddiwr, n
 Sylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
 'logempty' => 'Does dim eitemau yn cyfateb yn y lòg.',
 'log-title-wildcard' => "Chwilio am deitlau'n dechrau gyda'r geiriau hyn",
+'showhideselectedlogentries' => 'Dewis dangos neu guddio cofnodion lòg',
 
 # Special:AllPages
 'allpages' => 'Pob tudalen',
@@ -1945,6 +1958,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.
@@ -2385,8 +2403,8 @@ Rhowch reswm dros rwystro'r defnyddiwr (er enghraifft, dywedwch pa dudalen(au) a
 'ipb-confirm' => "Cadarnhau'r rhwystr",
 'badipaddress' => 'Cyfeiriad IP annilys.',
 'blockipsuccesssub' => 'Llwyddodd y rhwystr',
-'blockipsuccesstext' => 'Mae cyfeiriad IP [[Special:Contributions/$1|$1]] wedi cael ei flocio.<br />
-Gwelwch y [[Special:BlockList|rhestr flociau IP]] er mwyn arolygu blociau.',
+'blockipsuccesstext' => 'Mae [[Special:Contributions/$1|$1]] wedi cael ei flocio.<br />
+Gweler y [[Special:BlockList|rhestr blociau]] er mwyn arolygu blociau.',
 'ipb-blockingself' => "Rydych ar rwystro'ch hunan! A ydych yn siŵr eich bod chi am wneud hyn?",
 'ipb-confirmhideuser' => 'Rydych ar rwystro defnyddiwr sydd yn "guddiedig." Bydd hyn yn atal enw\'r defnyddiwr ym mhob rhestr a chofnod lòg. A ydych yn siŵr eich bod chi am wneud hyn?',
 'ipb-edit-dropdown' => "Golygu'r rhesymau dros flocio",
@@ -2439,7 +2457,9 @@ Dyma'r lòg rhwystro perthnasol:",
 Dyma'r lòg cuddio perthnasol:",
 'blocklogentry' => 'wedi rhwystro "[[$1]]" sy\'n dod i\'w ben ar $2 $3',
 'reblock-logentry' => "wedi newid y gosodiadau rhwystro sydd ar [[$1]] sy'n dod i'w ben am $2 $3",
-'blocklogtext' => "Dyma lòg o'r holl weithredoedd rhwystro a dadrwystro. Nid yw'r cyfeiriadau IP sydd wedi cael ei rwystro'n awtomatig ar y rhestr. Gweler y [[Special:BlockList|rhestr rhwystrau IP]] am restr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o bryd.",
+'blocklogtext' => "Dyma lòg o'r holl weithredoedd rhwystro a dadrwystro. 
+Nid yw'r cyfeiriadau IP sydd wedi cael eu rhwystro'n awtomatig ar y rhestr. 
+Gallwch weld rhestr y rhwystrau a'r gwaharddiadau sydd yn weithredol ar hyn o bryd ar y [[Special:BlockList|rhestr rhwystrau]].",
 'unblocklogentry' => 'wedi dadrwystro $1',
 'block-log-flags-anononly' => 'defnyddwyr anhysbys yn unig',
 'block-log-flags-nocreate' => 'analluogwyd creu cyfrif',
@@ -2772,7 +2792,7 @@ Mae ffolder dros dro yn eisiau.',
 'tooltip-rollback' => "Yn troi golygiad(au) y defnyddiwr diwethaf i'r dudalen hon yn ôl gydag un clic.",
 'tooltip-undo' => 'Mae "dadwneud" yn troi\'r golygiad hwn yn ôl ac yn dangos rhagolwg o\'r golygiad adferedig.
 Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
-'tooltip-preferences-save' => "Rhoi'r dewisiadau ar gadw",
+'tooltip-preferences-save' => 'Rhodder y dewisiadau ar gadw',
 'tooltip-summary' => 'Rhowch grynodeb byr',
 
 # Metadata
@@ -2793,11 +2813,12 @@ Gellir ychwanegu rheswm dros y dadwneud yn y crynodeb.',
 # Spam protection
 'spamprotectiontitle' => 'Hidlydd amddiffyn rhag sbam',
 'spamprotectiontext' => 'Ataliwyd y dudalen rhag ei rhoi ar gadw gan yr hidlydd sbam.
-Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr gwaharddedig.',
+Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr waharddedig.',
 'spamprotectionmatch' => "Dyma'r testun gyneuodd ein hidlydd amddiffyn rhag sbam: $1",
 'spambot_username' => 'Teclyn clirio sbam MediaWiki',
-'spam_reverting' => "Yn troi nôl i'r diwygiad diweddaraf sydd ddim yn cynnwys cysylltiadau i $1",
-'spam_blanking' => 'Roedd cysylltiadau i $1 gan bob golygiad, yn blancio',
+'spam_reverting' => 'Wedi adfer y diwygiad diweddaraf na sydd yn cynnwys cysylltiadau i $1',
+'spam_blanking' => 'Roedd cysylltiadau i $1 gan bob golygiad, felly gwacawyd y dudalen',
+'spam_deleting' => 'Roedd pob diwygiad yn cynnwys cysylltiadau â $1, felly fe ddilëwyd y dudalen',
 
 # Info page
 'pageinfo-title' => 'Manylion "$1"',
@@ -2871,7 +2892,7 @@ Mae'n bosib y bydd eich cyfrifiadur yn cael ei danseilio wrth ddefnyddio'r ffeil
 
 # Special:NewFiles
 'newimages' => 'Oriel y ffeiliau newydd',
-'imagelisttext' => "Isod mae rhestr {{PLURAL:$1|gwag o ffeiliau|o '''$1''' ffeil|o '''$1''' ffeil wedi'u trefnu $2|o '''$1''' ffeil wedi'u trefnu $2|o '''$1''' o ffeiliau wedi'u trefnu $2|o '''$1''' o ffeiliau wedi'u trefnu $2|}}.",
+'imagelisttext' => "Isod mae rhestr {{PLURAL:$1|wag o ffeiliau|o '''$1''' ffeil|o '''$1''' ffeil wedi'u trefnu $2|o '''$1''' ffeil wedi'u trefnu $2|o '''$1''' o ffeiliau wedi'u trefnu $2|o '''$1''' o ffeiliau wedi'u trefnu $2|}}.",
 'newimages-summary' => "Mae'r dudalen arbennig hon yn dangos y ffeiliau a uwchlwythwyd yn ddiweddar.",
 'newimages-legend' => 'Hidlo',
 'newimages-label' => "Enw'r ffeil (neu ran ohono):",
@@ -3492,6 +3513,9 @@ 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
 'filepath' => 'Llwybr y ffeil',
@@ -3679,4 +3703,17 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'api-error-uploaddisabled' => 'Analluogwyd uwchlwytho ar y wici hwn.',
 'api-error-verification-error' => "Gallai'r ffeil hon fod wedi ei llygru, neu gall fod estyniad anghywir iddi.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|eiliad}}',
+'duration-minutes' => '$1 {{PLURAL:$1|munud|munud|funud|munud|munud|munud}}',
+'duration-hours' => '$1 {{PLURAL:$1|awr}}',
+'duration-days' => '$1 {{PLURAL:$1|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}}',
+'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|canmlwydd|ganmlwydd|ganmlwydd|canmlwydd|chanmlwydd|canmlwydd}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milflwydd|filflwydd|filflwydd|milflwydd|milflwydd|milflwydd}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Wedi methu sicrhau cloion ar y gweinydd $1.',
 );
index a7cefa0..46944a2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Danish (Dansk)
+/** Danish (dansk)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -193,7 +193,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skjul patruljerede redigeringer i seneste ændringer',
 'tog-newpageshidepatrolled' => 'Skjul patruljerede sider på listen over nye sider',
 'tog-extendwatchlist' => 'Udvid overvågningslisten til at vise alle ændringer og ikke kun den nyeste',
-'tog-usenewrc' => 'Brug forbedret liste over seneste ændringer (kræver JavaScript)',
+'tog-usenewrc' => 'Gruppér ændringerne per side i listen over seneste ændringer og overvågningslisten (kræver JavaScript)',
 'tog-numberheadings' => 'Automatisk nummerering af overskrifter',
 'tog-showtoolbar' => 'Vis værktøjslinje til redigering (JavaScript)',
 'tog-editondblclick' => 'Redigér sider med dobbeltklik (JavaScript)',
@@ -571,7 +571,9 @@ $2',
 'titleprotected' => "Dette sidenavn er beskyttet mod oprettelse af [[User:$1|$1]]. Begrundelsen for beskyttelsen er ''$2''.",
 'filereadonlyerror' => 'Ude af stand til at redigere filen "$1", fordi fildatabasen "$2" er skrivebeskyttet.
 
-Begrundelsen er "\'\'$3\'\'".',
+Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".',
+'invalidtitle-knownnamespace' => 'Ugyldig titel med navnerummet "$2" og teksten "$3"',
+'invalidtitle-unknownnamespace' => 'Ugyldig titel med ukendt navnerum nummer $1 og tekst "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Konfigurationsfejl: ukendt virus-scanner: ''$1''",
@@ -858,7 +860,8 @@ Loggen over den seneste blokering ses nedenfor:',
 'updated' => '(Opdateret)',
 'note' => "'''Bemærk:'''",
 'previewnote' => "'''Husk at dette er kun en forhåndsvisning.'''
-Dine ændringer er endnu ikke blevet gemt! [[#editform|→ Fortsæt med at redigere]]",
+Dine ændringer er endnu ikke blevet gemt!",
+'continue-editing' => 'Fortsæt med at redigere',
 'previewconflict' => 'Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.',
 'session_fail_preview' => "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.
 Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
@@ -947,6 +950,8 @@ Der bør være færre end {{PLURAL:$2|$2 kald}}, lige nu er der {{PLURAL:$1|$1 k
 'parser-template-loop-warning' => 'Skabelonløkke fundet: [[$1]]',
 'parser-template-recursion-depth-warning' => 'En skabelon er rekursivt inkluderet for mange gange ($1)',
 'language-converter-depth-warning' => 'Dybdegrænse for sprogkonvertering overskredet ($1)',
+'expansion-depth-exceeded-category' => 'Sider, der overskrider ekspansionsdybden',
+'expansion-depth-exceeded-warning' => 'Siden overskred ekspansionsdybden',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan fjernes.
@@ -1086,7 +1091,7 @@ Se venligst loglisterne.',
 # Suppression log
 'suppressionlog' => 'Skjulningslog',
 'suppressionlogtext' => 'Nedenfor listes de sletninger og blokeringer, som involverer indhold, der er skjult for administratorer.
-Se [[Special:BlockList|IP-blokeringslisten]] for listen over alle aktuelle blokeringer.',
+Se [[Special:BlockList|blokeringslisten]] for listen over alle aktuelle blokeringer.',
 
 # History merging
 'mergehistory' => 'Sammenflet sidehistorikker',
@@ -1120,8 +1125,9 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'mergelogpagetext' => 'Nedenfor vises en liste med de nyeste sammenfletninger af en sides historik i en anden.',
 
 # Diffs
-'history-title' => 'Versionshistorik for "$1"',
-'difference' => '(Forskel mellem versioner)',
+'history-title' => '$1: Versionshistorik',
+'difference-title' => 'Forskel mellem versioner af "$1"',
+'difference-title-multipage' => 'Forskel mellem siderne "$1" og "$2"',
 'difference-multipage' => '(Forskel mellem sider)',
 'lineno' => 'Linje $1:',
 'compareselectedversions' => 'Sammenlign valgte versioner',
@@ -1165,8 +1171,8 @@ Vær opmæksom på at bevare kontinuiteten i sidehistorikken.
 'search-result-size' => '$1 ({{PLURAL:$2|et ord|$2 ord}})',
 'search-result-category-size' => '{{PLURAL:$1|1 medlem|$1 medlemmer}} ({{PLURAL:$2|1 underkategori|$2 underkategorier}}, {{PLURAL:$3|1 fil|$3 filer}})',
 'search-result-score' => 'Relevans: $1%',
-'search-redirect' => '(omdiriger $1)',
-'search-section' => '(sektion $1)',
+'search-redirect' => '(omdirigering $1)',
+'search-section' => '(afsnit $1)',
 'search-suggest' => 'Mente du: $1',
 'search-interwiki-caption' => 'Søsterprojekter',
 'search-interwiki-default' => '{{PLURAL:$1|et resultat|$1 resultater}}:',
@@ -1217,6 +1223,7 @@ Du kan prøve at bruge \"all:\" som præfiks for at søge i alt indhold (inkl. d
 'prefs-beta' => 'Betafunktioner',
 'prefs-datetime' => 'Dato og klokkeslæt',
 'prefs-labs' => 'Testfunktioner',
+'prefs-user-pages' => 'Brugerside',
 'prefs-personal' => 'Brugerdata',
 'prefs-rc' => 'Seneste ændringer',
 'prefs-watchlist' => 'Overvågningsliste',
@@ -1478,7 +1485,7 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'nchanges' => '$1 {{PLURAL:$1|ændring|ændringer}}',
 'recentchanges' => 'Seneste ændringer',
 'recentchanges-legend' => 'Indstillinger for seneste ændringer',
-'recentchangestext' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
+'recentchanges-summary' => "På denne side kan du følge de seneste ændringer på '''{{SITENAME}}'''.",
 'recentchanges-feed-description' => 'Med dette feed kan du følge de seneste ændringer på {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Denne redigering oprettede en ny side',
 'recentchanges-label-minor' => 'Dette er en mindre ændring',
@@ -1666,8 +1673,8 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
 'backend-fail-writetemp' => 'Kunne ikke skrive til midlertidig fil.',
 'backend-fail-closetemp' => 'Kunne ikke lukke midlertidig fil.',
 'backend-fail-read' => 'Kunne ikke læse filen $1.',
-'backend-fail-create' => 'Kunne ikke oprette filen $1.',
-'backend-fail-maxsize' => 'Kunne ikke oprette filen $1, da den er større end {{PLURAL:$2|$2 byte|$2 bytes}}.',
+'backend-fail-create' => 'Kunne ikke gemme filen $1.',
+'backend-fail-maxsize' => 'Kunne ikke gemme filen $1, da den er større end {{PLURAL:$2|en byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Lagrings-backend "$1" er i øjeblikket skrivebeskyttet. Den angivne begrundelse var: " $2 "',
 'backend-fail-synced' => 'Filen "$1" er i en inkonsistent tilstand inden for de interne lagringsbackends',
 'backend-fail-connect' => 'Kunne ikke forbinde til lagringsbackend "$1".',
@@ -1987,6 +1994,7 @@ Læg mærke til at andre hjemmesider kan henvise til filen med en direkte URL, o
 Du kan afgrænse visningen ved at vælge en logtype, brugernavn eller påvirket side. Der skelnes mellem små og store bogstaver for både bruger- og sidenavne.',
 'logempty' => 'Intet passende fundet.',
 'log-title-wildcard' => 'Søg i titler som begynder med teksten',
+'showhideselectedlogentries' => 'Vis/skjul de markerede loghændelser',
 
 # Special:AllPages
 'allpages' => 'Alle sider',
@@ -2006,6 +2014,11 @@ Du kan afgrænse visningen ved at vælge en logtype, brugernavn eller påvirket
 'allpages-bad-ns' => 'Navnerummet $1 findes ikke på {{SITENAME}}.',
 'allpages-hide-redirects' => 'Skjul omdirigeringer',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du ser en hengemt version af denne side, som kan være op til $1 gammel.',
+'cachedspecial-viewing-cached-ts' => 'Du ser en hengemt version af denne side, som måske ikke er helt aktuel.',
+'cachedspecial-refresh-now' => 'Vis seneste.',
+
 # Special:Categories
 'categories' => 'Kategorier',
 'categoriespagetext' => 'Følgende {{PLURAL:$1|kategori|kategorier}} indeholder sider eller media.
@@ -2440,7 +2453,7 @@ Angiv en konkret begrundelse herunder (for eksempel med angivelse af sider der h
 'badipaddress' => 'IP-adressen/brugernavnet er udformet forkert eller eksistere ikke.',
 'blockipsuccesssub' => 'Blokeringen er gennemført.',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] er blevet blokeret.<br />
-Se [[Special:BlockList|IP-blokeringslisten]] for alle blokeringer.',
+Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'ipb-blockingself' => 'Du er ved at blokere dig selv! Er du sikker på, du vil gøre det?',
 'ipb-confirmhideuser' => 'Du er ved at blokere en bruger med "skjul bruger" aktiveret. Dette vil skjule brugerens navn på alle lister og logposter. Er du sikker på du vil gøre det?',
 'ipb-edit-dropdown' => 'Ændre spærreårsager',
@@ -2493,7 +2506,9 @@ Blokeringsloggen vises nedenfor som reference:',
 Skjulningsloggen vises nedenfor som reference:',
 'blocklogentry' => 'blokerede [[$1]] med en varighed på $2 $3',
 'reblock-logentry' => 'ændrede blokeringsindstillinger for [[$1]] med en varighed $2 $3',
-'blocklogtext' => 'Dette er en liste med blokerede brugere og ophævede blokeringer af brugere. Automatisk blokerede IP-adresser er ikke anført her. Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med blokerede brugere.',
+'blocklogtext' => 'Dette er en liste med blokerede brugere og ophævede blokeringer af brugere.
+Automatisk blokerede IP-adresser er ikke anført her.
+Se [[Special:BlockList|blokeringslisten]] for den nuværende liste med aktuelle blokeringer.',
 'unblocklogentry' => 'ophævede blokering af "$1"',
 'block-log-flags-anononly' => 'kun anonyme',
 'block-log-flags-nocreate' => 'Oprettelse af brugerkonti blokeret',
@@ -2763,7 +2778,7 @@ Du kan se på kildeteksten.',
 'tooltip-ca-move' => 'Flyt denne side',
 'tooltip-ca-watch' => 'Sæt denne side på din overvågningsliste',
 'tooltip-ca-unwatch' => 'Fjern denne side fra din overvågningsliste',
-'tooltip-search' => 'Søg på denne wiki',
+'tooltip-search' => 'Søg på {{SITENAME}}',
 'tooltip-search-go' => 'Vis en side med præcis dette navn, hvis den findes',
 'tooltip-search-fulltext' => 'Søg efter sider der indeholder denne tekst',
 'tooltip-p-logo' => 'Forsiden',
@@ -2841,6 +2856,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'spambot_username' => 'MediaWiki spam-rensning',
 'spam_reverting' => 'Sidste version uden henvisning til $1 gendannet.',
 'spam_blanking' => 'Alle versioner, som indeholdt henvisninger til $1, er renset.',
+'spam_deleting' => 'Alle versioner indeholder henvisninger til $1, sletter',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
@@ -3542,6 +3558,9 @@ Du skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General
 'version-software' => 'Installeret software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL-adresser til indgangspunkter',
+'version-entrypoints-header-entrypoint' => 'Indgangspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Filsti',
@@ -3729,4 +3748,15 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'api-error-uploaddisabled' => 'Oplægning af filer er slået fra på denne wiki.',
 'api-error-verification-error' => 'Denne fil kan være beskadiget, eller den har måske en forkert filendelse.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minutter}}',
+'duration-hours' => '$1 {{PLURAL:$1|time|timer}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dage}}',
+'duration-weeks' => '$1 {{PLURAL:$1|uge|uger}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|årti|årtier}}',
+'duration-centuries' => '$1 {{PLURAL:$1|århundrede|århundreder}}',
+'duration-millennia' => '$1 {{PLURAL:$1|årtusind|årtusinder}}',
+
 );
index c7513ce..b38021a 100644 (file)
@@ -44,6 +44,7 @@
  * @author Purodha
  * @author Raimond Spekking (Raymond) <raimond.spekking@gmail.com> since January 2007
  * @author Red Baron
+ * @author Reedy
  * @author Remember the dot
  * @author Revolus
  * @author Rillke
@@ -119,12 +120,12 @@ $specialPageAliases = array(
        'Block'                     => array( 'Sperren' ),
        'Blockme'                   => array( 'Proxy-Sperre' ),
        'Booksources'               => array( 'ISBN-Suche' ),
-       'BrokenRedirects'           => array( 'Kaputte_Weiterleitungen' ),
+       'BrokenRedirects'           => array( 'Defekte_Weiterleitungen', 'Kaputte_Weiterleitungen' ),
        'Categories'                => array( 'Kategorien' ),
        'ChangeEmail'               => array( 'E-Mail-Adresse_ändern' ),
        'ChangePassword'            => array( 'Passwort_ändern', 'Passwort_zurücksetzen' ),
        'ComparePages'              => array( 'Seiten_vergleichen' ),
-       'Confirmemail'              => array( 'E-Mail_bestaetigen', 'E-Mail_bestätigen' ),
+       'Confirmemail'              => array( 'E-Mail_bestätigen', 'E-Mail_bestaetigen' ),
        'Contributions'             => array( 'Beiträge' ),
        'CreateAccount'             => array( 'Benutzerkonto_anlegen' ),
        'Deadendpages'              => array( 'Sackgassenseiten' ),
@@ -132,14 +133,15 @@ $specialPageAliases = array(
        'Disambiguations'           => array( 'Begriffsklärungsverweise' ),
        'DoubleRedirects'           => array( 'Doppelte_Weiterleitungen' ),
        'EditWatchlist'             => array( 'Beobachtungsliste_bearbeiten' ),
-       'Emailuser'                 => array( 'E-Mail' ),
+       'Emailuser'                 => array( 'E-Mail_senden', 'Mailen', 'E-Mail' ),
        'Export'                    => array( 'Exportieren' ),
        'Fewestrevisions'           => array( 'Wenigstbearbeitete_Seiten' ),
        'FileDuplicateSearch'       => array( 'Dateiduplikatsuche', 'Datei-Duplikat-Suche' ),
        'Filepath'                  => array( 'Dateipfad' ),
        'Import'                    => array( 'Importieren' ),
-       'Invalidateemail'           => array( 'E-Mail_nicht_bestaetigen', 'E-Mail_nicht_bestätigen' ),
-       'BlockList'                 => array( 'Liste_der_Sperren', 'Gesperrte_IP-Adressen', 'Gesperrte_IPs' ),
+       'Invalidateemail'           => array( 'E-Mail_nicht_bestätigen', 'E-Mail_nicht_bestaetigen' ),
+       'JavaScriptTest'            => array( 'JavaScript-Test' ),
+       'BlockList'                 => array( 'Liste_der_Sperren', 'Gesperrte_IP-Adressen', 'Gesperrte_IPs', 'Sperrliste' ),
        'LinkSearch'                => array( 'Weblinksuche', 'Weblink-Suche' ),
        'Listadmins'                => array( 'Administratoren' ),
        'Listbots'                  => array( 'Bots' ),
@@ -201,9 +203,9 @@ $specialPageAliases = array(
        'Userlogout'                => array( 'Abmelden' ),
        'Userrights'                => array( 'Benutzerrechte' ),
        'Wantedcategories'          => array( 'Gewünschte_Kategorien' ),
-       'Wantedfiles'               => array( 'Fehlende_Dateien' ),
+       'Wantedfiles'               => array( 'Gewünschte_Dateien', 'Fehlende_Dateien' ),
        'Wantedpages'               => array( 'Gewünschte_Seiten' ),
-       'Wantedtemplates'           => array( 'Fehlende_Vorlagen' ),
+       'Wantedtemplates'           => array( 'Gewünschte_Vorlagen', 'Fehlende_Vorlagen' ),
        'Watchlist'                 => array( 'Beobachtungsliste' ),
        'Whatlinkshere'             => array( 'Linkliste', 'Verweisliste' ),
        'Withoutinterwiki'          => array( 'Fehlende_Interwikis' ),
@@ -244,12 +246,12 @@ $dateFormats = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
-       'nogallery'               => array( '0', '__KEINE_GALERIE__', '__NOGALLERY__' ),
+       'notoc'                   => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
+       'nogallery'               => array( '0', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
        'forcetoc'                => array( '0', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
        'toc'                     => array( '0', '__INHALTSVERZEICHNIS__', '__TOC__' ),
        'noeditsection'           => array( '0', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__KEINKOPF__', '__NOHEADER__' ),
+       'noheader'                => array( '0', '__KEINKOPF__', '__KEIN_HEADER__', '__KEIN_KOPF__', '__KEINHEADER__', '__NOHEADER__' ),
        'currentmonth'            => array( '1', 'JETZIGER_MONAT', 'JETZIGER_MONAT_2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'           => array( '1', 'JETZIGER_MONAT_1', 'CURRENTMONTH1' ),
        'currentmonthname'        => array( '1', 'JETZIGER_MONATSNAME', 'CURRENTMONTHNAME' ),
@@ -298,19 +300,26 @@ $magicWords = array(
        'subjectpagename'         => array( '1', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
        'subjectpagenamee'        => array( '1', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'subst'                   => array( '0', 'ERS:', 'SUBST:' ),
-       'img_thumbnail'           => array( '1', 'miniatur', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', 'miniatur=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'safesubst'               => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
+       'img_thumbnail'           => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
+       'img_manualthumb'         => array( '1', 'miniatur=$1', 'mini=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'               => array( '1', 'rechts', 'right' ),
        'img_left'                => array( '1', 'links', 'left' ),
        'img_none'                => array( '1', 'ohne', 'none' ),
        'img_center'              => array( '1', 'zentriert', 'center', 'centre' ),
        'img_framed'              => array( '1', 'gerahmt', 'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( '1', 'rahmenlos', 'frameless' ),
-       'img_page'                => array( '1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
+       'img_page'                => array( '1', 'seite=$1', 'seite_$1', 'page=$1', 'page $1' ),
        'img_upright'             => array( '1', 'hochkant', 'hochkant=$1', 'hochkant $1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'              => array( '1', 'rand', 'border' ),
-       'img_sub'                 => array( '1', 'tiefgestellt', 'sub' ),
-       'img_super'               => array( '1', 'hochgestellt', 'super', 'sup' ),
+       'img_baseline'            => array( '1', 'grundlinie', 'baseline' ),
+       'img_sub'                 => array( '1', 'tiefgestellt', 'tief', 'sub' ),
+       'img_super'               => array( '1', 'hochgestellt', 'hoch', 'super', 'sup' ),
+       'img_top'                 => array( '1', 'oben', 'top' ),
+       'img_text_top'            => array( '1', 'text-oben', 'text-top' ),
+       'img_middle'              => array( '1', 'mitte', 'middle' ),
+       'img_bottom'              => array( '1', 'unten', 'bottom' ),
+       'img_text_bottom'         => array( '1', 'text-unten', 'text-bottom' ),
        'img_link'                => array( '1', 'verweis=$1', 'link=$1' ),
        'img_alt'                 => array( '1', 'alternativtext=$1', 'alt=$1' ),
        'int'                     => array( '0', 'NACHRICHT:', 'INT:' ),
@@ -318,12 +327,14 @@ $magicWords = array(
        'ns'                      => array( '0', 'NR:', 'NS:' ),
        'nse'                     => array( '0', 'NR_URL:', 'NSE:' ),
        'localurl'                => array( '0', 'LOKALE_URL:', 'LOCALURL:' ),
+       'localurle'               => array( '0', 'LOKALE_URL_C:', 'LOCALURLE:' ),
        'articlepath'             => array( '0', 'ARTIKELPFAD', 'ARTICLEPATH' ),
-       'pageid'                  => array( '0', 'SEITENID', 'PAGEID' ),
        'scriptpath'              => array( '0', 'SKRIPTPFAD', 'SCRIPTPATH' ),
-       'stylepath'               => array( '0', 'STYLEPFAD', 'STYLEPATH' ),
+       'stylepath'               => array( '0', 'STILPFAD', 'STYLEPFAD', 'STYLEPATH' ),
        'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
        'gender'                  => array( '0', 'GESCHLECHT:', 'GENDER:' ),
+       'notitleconvert'          => array( '0', '__KEINE_TITELKONVERTIERUNG__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'        => array( '0', '__KEINE_INHALTSKONVERTIERUNG__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'             => array( '1', 'JETZIGE_KALENDERWOCHE', 'CURRENTWEEK' ),
        'currentdow'              => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
        'localweek'               => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
@@ -337,7 +348,9 @@ $magicWords = array(
        'revisiontimestamp'       => array( '1', 'REVISIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
        'revisionuser'            => array( '1', 'REVISIONSBENUTZER', 'REVISIONUSER' ),
        'fullurl'                 => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
+       'fullurle'                => array( '0', 'VOLLSTÄNDIGE_URL_C:', 'FULLURLE:' ),
        'canonicalurl'            => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
+       'canonicalurle'           => array( '0', 'KANONISCHE_URL_C:', 'CANONICALURLE:' ),
        'lcfirst'                 => array( '0', 'INITIAL_KLEIN:', 'LCFIRST:' ),
        'ucfirst'                 => array( '0', 'INITIAL_GROSS:', 'UCFIRST:' ),
        'lc'                      => array( '0', 'KLEIN:', 'LC:' ),
@@ -348,13 +361,13 @@ $magicWords = array(
        'nonewsectionlink'        => array( '1', '__KEIN_NEUER_ABSCHNITTSLINK__', '__KEIN_PLUS_LINK__', '__NONEWSECTIONLINK__' ),
        'currentversion'          => array( '1', 'JETZIGE_VERSION', 'CURRENTVERSION' ),
        'urlencode'               => array( '0', 'URLENKODIERT:', 'URLENCODE:' ),
-       'anchorencode'            => array( '0', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
+       'anchorencode'            => array( '0', 'ANKERENKODIERT:', 'SPRUNGMARKEENKODIERT:', 'ANCHORENCODE' ),
        'currenttimestamp'        => array( '1', 'JETZIGER_ZEITSTEMPEL', 'CURRENTTIMESTAMP' ),
        'localtimestamp'          => array( '1', 'LOKALER_ZEITSTEMPEL', 'LOCALTIMESTAMP' ),
        'directionmark'           => array( '1', 'TEXTAUSRICHTUNG', 'DIRECTIONMARK', 'DIRMARK' ),
        'language'                => array( '0', '#SPRACHE:', '#LANGUAGE:' ),
        'contentlanguage'         => array( '1', 'INHALTSSPRACHE', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
-       'pagesinnamespace'        => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'pagesinnamespace'        => array( '1', 'SEITEN_IM_NAMENSRAUM:', 'SEITEN_IN_NR:', 'SEITEN_NR:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'          => array( '1', 'ADMINANZAHL', 'NUMBEROFADMINS' ),
        'formatnum'               => array( '0', 'ZAHLENFORMAT', 'FORMATNUM' ),
        'padleft'                 => array( '0', 'FÜLLENLINKS', 'PADLEFT' ),
@@ -362,6 +375,7 @@ $magicWords = array(
        'special'                 => array( '0', 'spezial', 'special' ),
        'defaultsort'             => array( '1', 'SORTIERUNG:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                => array( '0', 'DATEIPFAD:', 'FILEPATH:' ),
+       'tag'                     => array( '0', 'markierung', 'tag' ),
        'hiddencat'               => array( '1', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
        'pagesincategory'         => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
@@ -371,6 +385,10 @@ $magicWords = array(
        'staticredirect'          => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
        'protectionlevel'         => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
        'formatdate'              => array( '0', 'DATUMSFORMAT', 'formatdate', 'dateformat' ),
+       'url_path'                => array( '0', 'PFAD', 'PATH' ),
+       'url_query'               => array( '0', 'ABFRAGE', 'QUERY' ),
+       'defaultsort_noerror'     => array( '0', 'keinfehler', 'noerror' ),
+       'defaultsort_noreplace'   => array( '0', 'keineersetzung', 'noreplace' ),
 );
 
 $imageFiles = array(
@@ -386,7 +404,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden',
 'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden',
 'tog-extendwatchlist' => 'Erweiterte Beobachtungsliste zur Anzeige aller Änderungen',
-'tog-usenewrc' => 'Erweiterte Darstellung der „Letzten Änderungen“ (benötigt JavaScript)',
+'tog-usenewrc' => 'Seitenbezogene Gruppierung bei den „Letzten Änderungen“ und auf der Beobachtungsliste (benötigt JavaScript)',
 'tog-numberheadings' => 'Überschriften automatisch nummerieren',
 'tog-showtoolbar' => 'Bearbeiten-Werkzeugleiste anzeigen (benötigt JavaScript)',
 'tog-editondblclick' => 'Seiten mit Doppelklick bearbeiten (benötigt JavaScript)',
@@ -412,7 +430,7 @@ $messages = array(
 'tog-externaleditor' => 'Externen Editor standardmäßig nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-externaldiff' => 'Externes Programm standardmäßig für Versionsunterschiede nutzen (nur für Experten, erfordert spezielle Einstellungen auf dem eigenen Computer. [//www.mediawiki.org/wiki/Manual:External_editors Weitere Informationen hierzu.])',
 'tog-showjumplinks' => '„Wechseln zu“-Links aktivieren',
-'tog-uselivepreview' => 'Sofortige Vorschau nutzen (benötigt JavaScript) (experimentell)',
+'tog-uselivepreview' => 'Vorschau sofort anzeigen (benötigt JavaScript) (experimentell)',
 'tog-forceeditsummary' => 'Warnen, sofern beim Speichern die Zusammenfassung fehlt',
 'tog-watchlisthideown' => 'Eigene Bearbeitungen in der Beobachtungsliste ausblenden',
 'tog-watchlisthidebots' => 'Bearbeitungen durch Bots in der Beobachtungsliste ausblenden',
@@ -422,7 +440,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Kontrollierte Änderungen in der Beobachtungsliste ausblenden',
 'tog-nolangconversion' => 'Konvertierung von Sprachvarianten deaktivieren',
 'tog-ccmeonemails' => 'Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende',
-'tog-diffonly' => 'Zeige beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite',
+'tog-diffonly' => 'Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen',
 'tog-showhiddencats' => 'Anzeige versteckter Kategorien',
 'tog-noconvertlink' => 'Konvertierung des Titels deaktivieren',
 'tog-norollbackdiff' => 'Unterschied nach dem Zurücksetzen unterdrücken',
@@ -739,8 +757,9 @@ Möglicherweise wurde sie bereits von jemand anderem gelöscht.',
 'badtitle' => 'Ungültiger Titel',
 'badtitletext' => 'Der Titel der angeforderten Seite ist ungültig, leer oder ein ungültiger Sprachlink von einem anderen Wiki.',
 'perfcached' => 'Die folgenden Daten stammen aus dem Cache und sind möglicherweise nicht aktuell. Maximal {{PLURAL:$1|ein Ergebnis ist|$1 Ergebnisse sind}} im Cache verfügbar.',
-'perfcachedts' => 'Diese Daten stammen aus dem Cache. Der Zeitpunkt der letzten Aktualisierung: $1. Maximal {{PLURAL:$4|ein Ergebnis ist|$4 Ergebnisse sind}} im Cache verfügbar.',
-'querypage-no-updates' => "'''Die Aktualisierungsfunktion dieser Seite ist zurzeit deaktiviert. Die Daten werden bis auf Weiteres nicht erneuert.'''",
+'perfcachedts' => 'Diese Daten stammen aus dem Cache. Der Zeitpunkt der letzten Aktualisierung: $2, $3 Uhr. Maximal {{PLURAL:$4|ein Ergebnis ist|$4 Ergebnisse sind}} im Cache verfügbar.',
+'querypage-no-updates' => 'Die Aktualisierungsfunktion dieser Seite ist zurzeit deaktiviert.
+Die Daten werden bis auf Weiteres nicht erneuert.',
 'wrong_wfQuery_params' => 'Falsche Parameter für wfQuery()<br />
 Funktion: $1<br />
 Abfrage: $2',
@@ -768,6 +787,10 @@ Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerich
 'filereadonlyerror' => 'Die Datei „$1“ kann nicht verändert werden, da auf das Dateirepositorium „$2“ nur Lesezugriff möglich ist.
 
 Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3“.',
+'invalidtitle-knownnamespace' => 'Ungültiger Titel mit Namensraum „$2“ und Text „$3“',
+'invalidtitle-unknownnamespace' => 'Ungültiger Titel mit unbekannter Namensraumnummer $1 und Text „$2“',
+'exception-nologin' => 'Nicht angemeldet',
+'exception-nologin-text' => 'Diese Seite oder Aktion erfordert, dass du auf diesem Wiki angemeldet bist.',
 
 # Virus scanner
 'virus-badscanner' => "Fehlerhafte Konfiguration: unbekannter Virenscanner: ''$1''",
@@ -822,7 +845,7 @@ Es muss sichergestellt sein, dass Cookies aktiviert sind. Danach diese Seite ern
 Überprüfe die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|melde dich als neuer Benutzer an]].',
 'nosuchusershort' => 'Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfe die Schreibweise.',
 'nouserspecified' => 'Bitte gib einen Benutzernamen an.',
-'login-userblocked' => '{{GENDER:$1|Dieser Benutzer|Dieser Benutzerin|Dieser Benutzer}} ist gesperrt. Anmeldung nicht erlaubt.',
+'login-userblocked' => '{{GENDER:$1|Dieser Benutzer|Diese Benutzerin|Dieser Benutzer}} ist gesperrt. Die Anmeldung ist nicht erlaubt.',
 'wrongpassword' => 'Das Passwort ist falsch. Bitte versuche es erneut.',
 'wrongpasswordempty' => 'Es wurde kein Passwort eingegeben. Bitte versuche es erneut.',
 'passwordtooshort' => 'Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.',
@@ -1048,7 +1071,8 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
 'updated' => '(Geändert)',
 'note' => "'''Hinweis:'''",
 'previewnote' => "'''Dies ist nur eine Vorschau.'''
-Die Seite wurde noch nicht gespeichert! [[#editform|→ Weiter bearbeiten]]",
+Die Seite wurde noch nicht gespeichert!",
+'continue-editing' => 'Weiter bearbeiten',
 'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.',
 'session_fail_preview' => "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
 Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.
@@ -1063,7 +1087,7 @@ Sollte das Problem bestehen bleiben, [[Special:UserLogout|melde dich ab]] und da
 Eine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
 'edit_form_incomplete' => "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfe deine Bearbeitungen auf Vollständigkeit und versuche es erneut.'''",
 'editing' => 'Bearbeiten von „$1“',
-'creating' => '$1 wird erstellt',
+'creating' => 'Erstellen von „$1“',
 'editingsection' => 'Bearbeiten von „$1“ (Abschnitt)',
 'editingcomment' => 'Bearbeiten von „$1“ (Neuer Abschnitt)',
 'editconflict' => 'Bearbeitungskonflikt: $1',
@@ -1140,6 +1164,12 @@ 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.',
+'parser-unstrip-loop-warning' => 'Zirkelbezug festgestellt',
+'parser-unstrip-recursion-limit' => 'Rekursionsgrenze beim Auflösen überschritten ($1)',
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
@@ -1156,7 +1186,7 @@ Grund der Sperre: ''$2''",
 
 # History pages
 'viewpagelogs' => 'Logbücher dieser Seite anzeigen',
-'nohistory' => 'Es gibt keine Versionsgeschichte für diese Seite.',
+'nohistory' => 'Zu dieser Seite ist keine Versionsgeschichte vorhanden.',
 'currentrev' => 'Aktuelle Version',
 'currentrev-asof' => 'Aktuelle Version vom $2, $3 Uhr',
 'revisionasof' => 'Version vom $2, $3 Uhr',
@@ -1173,7 +1203,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}})',
@@ -1314,8 +1344,9 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'mergelogpagetext' => 'Dies ist das Logbuch der vereinigten Versionsgeschichten.',
 
 # Diffs
-'history-title' => 'Versionsgeschichte von „$1“',
-'difference' => '(Unterschied zwischen Versionen)',
+'history-title' => '$1: Versionsgeschichte',
+'difference-title' => '$1: Unterschied zwischen den Versionen',
+'difference-title-multipage' => '$1 und $2: Unterschied zwischen den Seiten',
 'difference-multipage' => '(Unterschied zwischen Seiten)',
 'lineno' => 'Zeile $1:',
 'compareselectedversions' => 'Gewählte Versionen vergleichen',
@@ -1409,14 +1440,15 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'datedefault' => 'Standard',
 'prefs-beta' => 'Beta-Funktionen',
 'prefs-datetime' => 'Datum und Zeit',
-'prefs-labs' => 'Alpha-Funktionen (experimentell)',
+'prefs-labs' => 'Alpha-Funktionen',
+'prefs-user-pages' => 'Benutzerseiten',
 'prefs-personal' => 'Benutzerdaten',
 'prefs-rc' => 'Letzte Änderungen',
 'prefs-watchlist' => 'Beobachtungsliste',
-'prefs-watchlist-days' => 'Anzahl der Tage, die die Beobachtungsliste standardmäßig umfassen soll:',
+'prefs-watchlist-days' => 'Maximale Anzahl der einbezogenen Tage:',
 'prefs-watchlist-days-max' => 'Maximal {{PLURAL:$1|ein Tag|$1 Tage}}',
-'prefs-watchlist-edits' => 'Maximale Zahl der Einträge:',
-'prefs-watchlist-edits-max' => 'Maximale Anzahl: 1000',
+'prefs-watchlist-edits' => 'Maximale Anzahl der angezeigten Einträge:',
+'prefs-watchlist-edits-max' => 'Maximal 1.000 Einträge',
 'prefs-watchlist-token' => 'Beobachtungslisten-Token:',
 'prefs-misc' => 'Verschiedenes',
 'prefs-resetpass' => 'Passwort ändern',
@@ -1435,7 +1467,7 @@ Stelle sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
 'resultsperpage' => 'Treffer pro Seite:',
 'stub-threshold' => 'Linkformatierung <a href="#" class="stub">kleiner Seiten</a> (in Byte):',
 'stub-threshold-disabled' => 'Deaktiviert',
-'recentchangesdays' => 'Anzahl der Tage, die die Liste der „Letzten Änderungen“ standardmäßig umfassen soll:',
+'recentchangesdays' => 'Anzahl der standardmäßig einbezogenen Tage:',
 'recentchangesdays-max' => 'Maximal $1 {{PLURAL:$1|Tag|Tage}}',
 'recentchangescount' => 'Anzahl der standardmäßig angezeigten Bearbeitungen:',
 'prefs-help-recentchangescount' => 'Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.',
@@ -1492,7 +1524,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'gender-unknown' => 'Nicht angegeben',
 'gender-male' => 'Männlich',
 'gender-female' => 'Weiblich',
-'prefs-help-gender' => 'Optional: Wird unter anderem von der Software für die geschlechtsspezifische Anrede genutzt. Diese Information ist <u>öffentlich</u>.',
+'prefs-help-gender' => 'Optional: Wird unter anderem von der Software für die geschlechtsspezifische Anrede genutzt. Diese Information ist öffentlich.',
 'email' => 'E-Mail',
 'prefs-help-realname' => 'Optional. Damit kann dein bürgerlicher Name deinen Beiträgen zugeordnet werden.',
 'prefs-help-email' => 'Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.',
@@ -1527,9 +1559,9 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'saveusergroups' => 'Gruppenzugehörigkeit ändern',
 'userrights-groupsmember' => 'Mitglied von:',
 'userrights-groupsmember-auto' => 'Automatisch Mitglied von:',
-'userrights-groups-help' => 'Du kannst die Gruppenzugehörigkeit dieses Benutzers ändern:
-* Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist.
-* Ein nichtmarkiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist.
+'userrights-groups-help' => 'Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:
+* Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.
+* Ein nichtmarkiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.
 * Ein * bedeutet, dass du das Benutzerrecht nach Erteilung nicht wieder zurücknehmen kannst (oder umgekehrt).',
 'userrights-reason' => 'Grund:',
 'userrights-no-interwiki' => 'Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.',
@@ -1672,7 +1704,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'nchanges' => '$1 {{PLURAL:$1|Änderung|Änderungen}}',
 'recentchanges' => 'Letzte Änderungen',
 'recentchanges-legend' => 'Anzeigeoptionen',
-'recentchangestext' => "Auf dieser Seite kannst du die letzten Änderungen auf '''{{SITENAME}}''' nachverfolgen.",
+'recentchanges-summary' => 'Auf dieser Seite kannst du die letzten Änderungen in diesem Wiki nachverfolgen.',
 'recentchanges-feed-description' => 'Verfolge mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Neue Seite',
 'recentchanges-label-minor' => 'Kleine Änderung',
@@ -1778,8 +1810,7 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'largefileserver' => 'Die Datei ist größer als die vom Server eingestellte Maximalgröße.',
 'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrolliere, ob du die Datei wirklich hochladen willst.',
 'windows-nonascii-filename' => 'Dieses Wiki unterstützt keine Dateinamen die Sonderzeichen enthalten.',
-'fileexists' => "Eine Datei mit diesem Namen existiert bereits.
-Bitte prüfe '''<tt>[[:$1]]</tt>''', wenn du dir nicht sicher bist, ob du sie ändern willst.
+'fileexists' => "Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfe '''<tt>[[:$1]]</tt>''', sofern du dir nicht sicher bist, ob du sie ändern möchtest.
 [[$1|thumb]]",
 'filepageexists' => "Eine Beschreibungsseite wurde bereits als '''<tt>[[:$1]]</tt>''' erstellt, es ist aber keine Datei mit diesem Namen vorhanden.
 Die eingegebene Beschreibung wird nicht auf die Beschreibungsseite übernommen.
@@ -1821,7 +1852,7 @@ Das Hochladen von Java-Dateien ist nicht gestattet, da sie die Umgehung von Sich
 'destfilename' => 'Zielname:',
 'upload-maxfilesize' => 'Maximale Dateigröße: $1',
 'upload-description' => 'Dateibeschreibung',
-'upload-options' => 'Hochlade-Optionen',
+'upload-options' => 'Hochladeoptionen',
 'watchthisupload' => 'Diese Datei beobachten',
 'filewasdeleted' => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfe zuerst den Eintrag im $1, bevor du die Datei wirklich speicherst.',
 'filename-bad-prefix' => "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.
@@ -1879,14 +1910,15 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'backend-fail-writetemp' => 'Die temporäre Datei konnte nicht geschrieben werden.',
 'backend-fail-closetemp' => 'Die temporäre Datei konnte nicht geschlossen werden.',
 'backend-fail-read' => 'Die Datei $1 konnte nicht gelesen werden.',
-'backend-fail-create' => 'Die Datei $1 konnte nicht erstellt werden.',
-'backend-fail-maxsize' => 'Die Datei $1 konnte nicht erstellt werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
+'backend-fail-create' => 'Die Datei $1 konnte nicht gespeichert werden.',
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht gespeichert werden, da sie größer als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
 'backend-fail-readonly' => 'Das Speicher-Backend „$1“ befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: „$2“',
 'backend-fail-synced' => 'Die Datei „$1“ befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
 'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend „$1“ hergestellt werden.',
 'backend-fail-internal' => 'Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.',
 'backend-fail-contenttype' => 'Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.',
 'backend-fail-batchsize' => 'Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.',
+'backend-fail-usable' => 'Die Datei $1 konnte, entweder aufgrund eines nicht vorhandenen Verzeichnisses oder aufgrund unzureichender Berechtigungen, nicht gespeichert werden.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends „$1“ hergestellt werden.',
@@ -1900,8 +1932,8 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'lockmanager-fail-openlock' => 'Die Sperrdatei für „$1“ konnte nicht geöffnet werden.',
 'lockmanager-fail-releaselock' => 'Die Sperre für „$1“ konnte nicht freigegeben werden.',
 'lockmanager-fail-db-bucket' => 'Es konnte mit Sammelabruf $1 keine ausreichende Anzahl an Verbindungen zu Sperrdatenbanken hergestellt werden.',
-'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnte nicht freigegeben werden.',
-'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnte nicht freigegeben werden.',
+'lockmanager-fail-db-release' => 'Die Sperren auf Datenbank $1 konnten nicht freigegeben werden.',
+'lockmanager-fail-svr-release' => 'Die Sperren auf Server $1 konnten nicht freigegeben werden.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Es ist ein Fehler beim Öffnen der Datei zur ZIP-Überprüfung aufgetreten.',
@@ -2010,8 +2042,8 @@ Eine [[Special:WhatLinksHere/$2|vollständige Liste]] ist verfügbar.',
 Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
 'sharedupload-desc-create' => 'Diese Datei stammt aus $1 und kann von anderen Projekten verwendet werden.
 Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
-'filepage-nofile' => 'Es existiert keine Datei mit diesem Namen.',
-'filepage-nofile-link' => 'Es existiert keine Datei mit diesem Namen, aber du kannst [$1 diese Datei hochladen].',
+'filepage-nofile' => 'Es ist keine Datei dieses namens vorhanden.',
+'filepage-nofile-link' => 'Es ist keine Datei dieses namens vorhanden. Du kannst jedoch [$1 diese Datei hochladen].',
 'uploadnewversion-linktext' => 'Eine neue Version dieser Datei hochladen',
 'shared-repo-from' => 'aus $1',
 'shared-repo' => 'einem gemeinsam genutzten Medienarchiv',
@@ -2060,7 +2092,7 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'listredirects' => 'Weiterleitungen',
 
 # Unused templates
-'unusedtemplates' => 'Unbenutzte Vorlagen',
+'unusedtemplates' => 'Verwaiste Vorlagen',
 'unusedtemplatestext' => 'Diese Seite listet alle Seiten im {{ns:template}}-Namensraum auf, die nicht in anderen Seiten eingebunden sind.
 Überprüfe andere Links zu den Vorlagen, bevor du diese löscht.',
 'unusedtemplateswlh' => 'Andere Links',
@@ -2137,8 +2169,8 @@ Jede Zeile enthält Links zur ersten und zweiten Weiterleitung sowie dem Ziel de
 'uncategorizedcategories' => 'Nicht kategorisierte Kategorien',
 'uncategorizedimages' => 'Nicht kategorisierte Dateien',
 'uncategorizedtemplates' => 'Nicht kategorisierte Vorlagen',
-'unusedcategories' => 'Unbenutzte Kategorien',
-'unusedimages' => 'Unbenutzte Dateien',
+'unusedcategories' => 'Verwaiste Kategorien',
+'unusedimages' => 'Verwaiste Dateien',
 'popularpages' => 'Beliebteste Seiten',
 'wantedcategories' => 'Gewünschte Kategorien',
 'wantedpages' => 'Gewünschte Seiten',
@@ -2205,6 +2237,7 @@ Bitte prüfe, ob sie korrekt von der Quelle übertragen wurde.',
 Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Groß-/Kleinschreibung muss beachtet werden).',
 'logempty' => 'Keine passenden Einträge.',
 'log-title-wildcard' => 'Titel beginnt mit …',
+'showhideselectedlogentries' => 'Ausgewählte Logbucheinträge anzeigen/verstecken',
 
 # Special:AllPages
 'allpages' => 'Alle Seiten',
@@ -2224,10 +2257,15 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
 'allpages-bad-ns' => 'Der Namensraum „$1“ ist in {{SITENAME}} nicht vorhanden.',
 'allpages-hide-redirects' => 'Weiterleitungen ausblenden',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du siehst die gecachte Version dieser Seite, die bis zu $1 alt sein kann.',
+'cachedspecial-viewing-cached-ts' => 'Du siehst die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
+'cachedspecial-refresh-now' => 'Aktuelle Version ansehen.',
+
 # Special:Categories
 'categories' => 'Kategorien',
 'categoriespagetext' => 'Folgende {{PLURAL:$1|Kategorie enthält|Kategorien enthalten}} Seiten oder Dateien.
-[[Special:UnusedCategories|Unbenutzte Kategorien]] werden hier nicht aufgeführt.
+[[Special:UnusedCategories|Verwaiste Kategorien]] werden hier nicht aufgeführt.
 Siehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].',
 'categoriesfrom' => 'Zeige Kategorien ab:',
 'special-categories-sort-count' => 'Sortierung nach Anzahl',
@@ -2482,9 +2520,10 @@ Siehe die [[Special:ProtectedPages|Liste der geschützten Seiten]] für alle akt
 'protect-existing-expiry' => 'Aktuelles Seitenschutzende: $2, $3 Uhr',
 'protect-otherreason' => 'Anderer/ergänzender Grund:',
 'protect-otherreason-op' => 'Anderer Grund',
-'protect-dropdown' => '*Allgemeine Schutzgründe
-** Weblink-Spam
-** Editwar
+'protect-dropdown' => '* Allgemeine Schutzgründe
+** Edit-War
+** Wiederkehrender Vandalismus
+** Wiederholtes Einstellen von Werbung
 ** Häufig eingebundene Vorlage
 ** Seite mit hoher Besucherzahl',
 'protect-edit-reasonlist' => 'Schutzgründe bearbeiten',
@@ -2649,7 +2688,7 @@ Bitte gib den Grund für die Sperre an.',
 'ipb-confirm' => 'Sperrung bestätigen',
 'badipaddress' => 'Die IP-Adresse hat ein falsches Format.',
 'blockipsuccesssub' => 'Sperre erfolgreich',
-'blockipsuccesstext' => 'Der Benutzer/die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
+'blockipsuccesstext' => 'Der Benutzer / die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
 Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperren]].',
 'ipb-blockingself' => 'Du bist gerade dabei, dich selbst zu sperren! Möchtest du das wirklich tun?',
 'ipb-confirmhideuser' => 'Du bist gerade dabei einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?',
@@ -2934,7 +2973,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'importuploaderrortemp' => 'Das Hochladen der Importdatei ist fehlgeschlagen. Ein temporäres Verzeichnis fehlt.',
 'import-parse-failure' => 'Fehler beim XML-Import:',
 'import-noarticle' => 'Es wurde keine zu importierende Seite angegeben!',
-'import-nonewrevisions' => 'Es sind keine neuen Versionen zum Import vorhanden, alle Versionen wurden bereits früher importiert.',
+'import-nonewrevisions' => 'Alle Versionen wurden bereits zu einem früheren Zeitpunkt importiert.',
 'xml-error-string' => '$1 Zeile $2, Spalte $3, (Byte $4): $5',
 'import-upload' => 'XML-Daten importieren',
 'import-token-mismatch' => 'Verlust der Sessiondaten. Bitte versuche es erneut.',
@@ -2959,7 +2998,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'javascripttest-title' => '$1-Tests werden durchgeführt',
 'javascripttest-pagetext-noframework' => 'Diese Seite ist JavaSkript-Tests vorbehalten.',
 'javascripttest-pagetext-unknownframework' => 'Unbekanntes Framework „$1“.',
-'javascripttest-pagetext-frameworks' => 'Bitte eines der folgenden Frameworks auswählen: $1',
+'javascripttest-pagetext-frameworks' => 'Bitte wähle eine der folgenden Prüfumgebungen aus: $1',
 'javascripttest-pagetext-skins' => 'Wähle eine Benutzeroberfläche zur Durchführung der Tests aus:',
 'javascripttest-qunit-intro' => 'Siehe die [$1 Dokumentation zu Tests] auf mediawiki.org',
 'javascripttest-qunit-heading' => 'MediaWiki-JavaSkript-QUnit-Tester',
@@ -3090,7 +3129,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'spamprotectionmatch' => "'''Der folgende Text wurde vom Spamfilter gefunden: ''$1'''''",
 'spambot_username' => 'MediaWiki-Spam-Säuberung',
 'spam_reverting' => 'Letzte Version ohne Links zu $1 wiederhergestellt.',
-'spam_blanking' => 'Alle Versionen enthielten Links zu $1, bereinigt.',
+'spam_blanking' => 'Alle Versionen mit einem Link zu $1 wurden bereinigt.',
+'spam_deleting' => 'Alle Versionen mit einem Link zu $1 wurden gelöscht.',
 
 # Info page
 'pageinfo-title' => 'Informationen zu „$1“',
@@ -3183,7 +3223,7 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|$1 Sekunde|$1 Sekunden}}',
 'minutes' => '{{PLURAL:$1|$1 Minute|$1 Minuten}}',
-'hours' => '{{PLURAL:$1|$1 Stunde|$1 Stunden}}',
+'hours' => '{{PLURAL:$1|einer Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
 'ago' => 'vor $1',
 
@@ -3620,7 +3660,7 @@ Weitere werden standardmäßig nicht angezeigt.
 'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
 Wenn du dein Benutzerkonto erst vor kurzem erstellt hast, warte bitte noch ein paar Minuten auf die E-Mail, bevor du einen neuen Code anforderst.',
 'confirmemail_send' => 'Bestätigungscode zuschicken',
-'confirmemail_sent' => 'Bestätigungs-E-Mail wurde verschickt.',
+'confirmemail_sent' => 'Die Bestätigungs-E-Mail wurde verschickt.',
 'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an deine E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
 'confirmemail_sendfailed' => '{{SITENAME}} konnte die Bestätigungs-E-Mail nicht an dich versenden.
 Bitte prüfe die E-Mail-Adresse auf ungültige Zeichen.
@@ -3738,10 +3778,10 @@ Bitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
 'size-gigabytes' => '$1 GB',
 
 # Live preview
-'livepreview-loading' => 'Am Laden …',
+'livepreview-loading' => 'Lade …',
 'livepreview-ready' => 'Laden … Fertig!',
-'livepreview-failed' => 'Die sofortige Vorschau ist nicht möglich!
-Bitte die normale Vorschau nutzen.',
+'livepreview-failed' => 'Die Vorschau kann nicht sofort angezeigt werden!
+Bitte nutze die reguläre Vorschau.',
 'livepreview-error' => 'Verbindung nicht möglich: $1 „$2“. Bitte die normale Vorschau benutzen.',
 
 # Friendlier slave lag warnings
@@ -3819,6 +3859,11 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'version-software' => 'Installierte Software',
 'version-software-product' => 'Software',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'Eingangspunkt-URLs',
+'version-entrypoints-header-entrypoint' => 'Eingangspunkt',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Artikelpfad]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Skriptpfad]',
 
 # Special:FilePath
 'filepath' => 'Dateipfad',
@@ -4006,4 +4051,17 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'api-error-uploaddisabled' => 'Das Hochladen ist in diesem Wiki deaktiviert.',
 'api-error-verification-error' => 'Die hochzuladende Datei ist entweder fehlerhaft oder hat keine Dateinamenserweiterung.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekunde|Sekunden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minute|Minuten}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stunde|Stunden}}',
+'duration-days' => '$1 {{PLURAL:$1|Tag|Tage}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Woche|Wochen}}',
+'duration-years' => '$1 {{PLURAL:$1|Jahr|Jahre}}',
+'duration-decades' => '$1 {{PLURAL:$1|Jahrzehnt|Jahrzehnte}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Die Sperren auf Server $1 konnte nicht abgerufen werden.',
 );
index dfab851..a72d0a1 100644 (file)
  * @author Xoser
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Medya',
+       NS_SPECIAL          => 'Xısusi',
+       NS_TALK             => 'Werênayış',
+       NS_USER             => 'Karber',
+       NS_USER_TALK        => 'Karber_mesac',
+       NS_PROJECT_TALK     => '$1_werênayış',
+       NS_FILE             => 'Dosya',
+       NS_FILE_TALK        => 'Dosya_werênayış',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_werênayış',
+       NS_TEMPLATE         => 'Şablon',
+       NS_TEMPLATE_TALK    => 'Şablon_werênayış',
+       NS_HELP             => 'Desteg',
+       NS_HELP_TALK        => 'Desteg_werênayış',
+       NS_CATEGORY         => 'Kategori',
+       NS_CATEGORY_TALK    => 'Kategori_werênayış',
+);
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'KarbereAktivi', 'AktivKarberi' ),
+       'Allmessages'               => array( 'MesaciPero' ),
+       'Allpages'                  => array( 'PeleyPero' ),
+       'Ancientpages'              => array( 'PeleyVereni' ),
+       'Badtitle'                  => array( 'SernameyoXırab' ),
+       'Blankpage'                 => array( 'PelaVeng', 'VengPela' ),
+       'Block'                     => array( 'Bloke', 'BlokeIP', 'BlokeKarber' ),
+       'Blockme'                   => array( 'BlokeMe' ),
+       'Booksources'               => array( 'KıtabeÇıme' ),
+       'BrokenRedirects'           => array( 'HetenayışoXırab' ),
+       'Categories'                => array( 'Kategoriye' ),
+       'ChangeEmail'               => array( 'EpostaBıvurne' ),
+       'ChangePassword'            => array( 'ParolaBıvurne', 'ParolaResetke' ),
+       'ComparePages'              => array( 'PelaPêverke' ),
+       'Confirmemail'              => array( 'EpostayAraştke' ),
+       'Contributions'             => array( 'İştiraxi' ),
+       'CreateAccount'             => array( 'HesabVırazê' ),
+       'Deadendpages'              => array( 'PelaBêgıre' ),
+       'DeletedContributions'      => array( 'İştıraxêkeBesterneyayê' ),
+       'Disambiguations'           => array( 'ManeoBin' ),
+       'DoubleRedirects'           => array( 'DıletHeteneayış' ),
+       'EditWatchlist'             => array( 'ListeyaSeyriVurnayış' ),
+       'Emailuser'                 => array( 'EpostayaKarberi' ),
+       'Export'                    => array( 'Ateberde' ),
+       'Fewestrevisions'           => array( 'TewrtaynRevizyon' ),
+       'FileDuplicateSearch'       => array( 'KopyaydosyaCıgeyrayış', 'DıletdosyaCıgeyrayış' ),
+       'Filepath'                  => array( 'RayaDosya', 'HerunaDosya', 'CayêDosya' ),
+       'Import'                    => array( 'Azeredê', 'Atewrke' ),
+       'Invalidateemail'           => array( 'TesdiqêepostaBıterknê' ),
+       'BlockList'                 => array( 'ListeyêBLoki', 'IPBloki', 'Blokeyê_IP' ),
+       'LinkSearch'                => array( 'GreCıgeyrayış' ),
+       'Listadmins'                => array( 'ListeyêXizmetkaran' ),
+       'Listbots'                  => array( 'ListeyêBotan' ),
+       'Listfiles'                 => array( 'ListeyêDosyayan', 'DosyayaListeke', 'ListeyêResiman' ),
+       'Listgrouprights'           => array( 'ListeyêHeqêGruban', 'HeqêGrubdeKarberan' ),
+       'Listredirects'             => array( 'ListeyêHetanayışi' ),
+       'Listusers'                 => array( 'ListeyêKarberan', 'KarberaListeke' ),
+       'Lockdb'                    => array( 'DBKilitke' ),
+       'Log'                       => array( 'Qeyd', 'Qeydi' ),
+       'Lonelypages'               => array( 'PeleyêBêkesi' ),
+       'Longpages'                 => array( 'PeleyeDergi' ),
+       'MergeHistory'              => array( 'RavêrdaPêtewrke' ),
+       'MIMEsearch'                => array( 'NIMECıgeyrayış' ),
+       'Mostcategories'            => array( 'TewrvêşiKategoriyıni' ),
+       'Mostimages'                => array( 'DosyeyêkeCırêvêşiGreDeyayo' ),
+       'Mostlinked'                => array( 'PeleyêkeCırêvêşiGreDeyayo' ),
+       'Mostlinkedcategories'      => array( 'KategoriyêkeCırêvêşiGreDeyayo' ),
+       'Mostlinkedtemplates'       => array( 'ŞablonêkeCırêvêşiGreDeyayo' ),
+       'Mostrevisions'             => array( 'TewrvêşiRevizyon' ),
+       'Movepage'                  => array( 'PelaAhuln' ),
+       'Mycontributions'           => array( 'İştırakeMe' ),
+       'Mypage'                    => array( 'PelaMe' ),
+       'Mytalk'                    => array( 'PersiyeME' ),
+       'Myuploads'                 => array( 'BarkerdışeMe' ),
+       'Newimages'                 => array( 'DosyeyêNewey', 'ResimêNewey' ),
+       'Newpages'                  => array( 'PeleyeNewey' ),
+       'PasswordReset'             => array( 'ParolaReset' ),
+       'PermanentLink'             => array( 'DaimiGre' ),
+       'Popularpages'              => array( 'PeleyêPopuleri' ),
+       'Preferences'               => array( 'Tercihi' ),
+       'Prefixindex'               => array( 'SerVerole' ),
+       'Protectedpages'            => array( 'PeleyêkeStaryayê' ),
+       'Protectedtitles'           => array( 'SernameyêkeStaryayê' ),
+       'Randompage'                => array( 'Raştamê', 'PelayakeRaştamê' ),
+       'Randomredirect'            => array( 'HetenayışoRaştmae' ),
+       'Recentchanges'             => array( 'VurnayışêPeyêni' ),
+       'Recentchangeslinked'       => array( 'GreyêVurnayışêPeyêni' ),
+       'Revisiondelete'            => array( 'RevizyoniBesterne' ),
+       'RevisionMove'              => array( 'RevizyoniAhulne' ),
+       'Search'                    => array( 'Cıgeyre' ),
+       'Shortpages'                => array( 'PeleyêKılmi' ),
+       'Specialpages'              => array( 'PeleyXısusi' ),
+       'Statistics'                => array( 'İstatistiki' ),
+       'Tags'                      => array( 'Etiketi' ),
+       'Unblock'                   => array( 'Bloqihewad' ),
+       'Uncategorizedcategories'   => array( 'KategoriyêkeKategorinêbiyê' ),
+       'Uncategorizedimages'       => array( 'DosyeyêkeKategorinêbiyê' ),
+       'Uncategorizedpages'        => array( 'PeleyêkeKategorinêbiyê' ),
+       'Uncategorizedtemplates'    => array( 'ŞablonêkeKategorinêbiyê' ),
+       'Undelete'                  => array( 'Peyserbiya' ),
+       'Unlockdb'                  => array( 'DBKlitiake' ),
+       'Unusedcategories'          => array( 'KategoriyêkeNêkaryayê' ),
+       'Unusedimages'              => array( 'DosyeyêkeNêkaryayê' ),
+       'Unusedtemplates'           => array( 'ŞablonêkeNêkaryayê' ),
+       'Unwatchedpages'            => array( 'PeleyêkeNêweyneyênê' ),
+       'Upload'                    => array( 'Barke' ),
+       'UploadStash'               => array( 'BarkerdışêNımtey' ),
+       'Userlogin'                 => array( 'KarberDekewtış' ),
+       'Userlogout'                => array( 'KarberVıcyayış' ),
+       'Userrights'                => array( 'HeqêKarberan', 'SysopKerdış', 'BotKerdış' ),
+       'Version'                   => array( 'Versiyon' ),
+       'Wantedcategories'          => array( 'KategoriyêkeWazênê' ),
+       'Wantedfiles'               => array( 'DosyeyêkeWazênê' ),
+       'Wantedpages'               => array( 'PeleyêkeWazênê' ),
+       'Wantedtemplates'           => array( 'ŞablonyêkeWazênê' ),
+       'Watchlist'                 => array( 'Listeyseyri' ),
+       'Whatlinkshere'             => array( 'PelarêGre' ),
+       'Withoutinterwiki'          => array( 'Bêİnterwiki' ),
+);
+
+$magicWords = array(
+       'redirect'                => array( '0', '#HETENAYIŞ', '#REDIRECT' ),
+       'notoc'                   => array( '0', '__ESTENÇINO__', '__NOTOC__' ),
+       'nogallery'               => array( '0', '__GALERİÇINO__', '__NOGALLERY__' ),
+       'forcetoc'                => array( '0', '__ESTENZARURET__', '__FORCETOC__' ),
+       'toc'                     => array( '0', '__ESTEN__', '__TOC__' ),
+       'noeditsection'           => array( '0', '__TİMARKERDIŞÇINO__', '__NOEDITSECTION__' ),
+       'noheader'                => array( '0', '__SERNAMEÇINO__', '__NOHEADER__' ),
+       'currentmonth'            => array( '1', 'MEWCUDAŞMİ', 'MEWCUDAŞMİ2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
+       'currentmonth1'           => array( '1', 'MEWCUDAŞMİ1', 'CURRENTMONTH1' ),
+       'currentmonthname'        => array( '1', 'NAMEYAŞMDAMEWCUD', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'     => array( '1', 'MEWCUDAŞMACI', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'      => array( '1', 'MEWCUDAŞMİKILMKERDIŞ', 'CURRENTMONTHABBREV' ),
+       'currentday'              => array( '1', 'MEWCUDROCE', 'CURRENTDAY' ),
+       'currentday2'             => array( '1', 'MEWCUDROCE2', 'CURRENTDAY2' ),
+       'currentdayname'          => array( '1', 'NAMEYÊMEWCUDROCE', 'CURRENTDAYNAME' ),
+       'currentyear'             => array( '1', 'MEWCUDSERRE', 'CURRENTYEAR' ),
+       'currenttime'             => array( '1', 'MEWCUDDEME', 'CURRENTTIME' ),
+       'currenthour'             => array( '1', 'MEWCUDSEHAT', 'CURRENTHOUR' ),
+       'localmonth'              => array( '1', 'WAREYAŞMİ', 'WAREYAŞMİ2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonth1'             => array( '1', 'WAREYAŞMİ1', 'LOCALMONTH1' ),
+       'localmonthname'          => array( '1', 'NAMEYÊWAREYAŞMİ', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'       => array( '1', 'NAMEYWAREDÊAŞMİDACI', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'        => array( '1', 'WAREYAŞMİKILMKERDIŞ', 'LOCALMONTHABBREV' ),
+       'localday'                => array( '1', 'WAREYROCE', 'LOCALDAY' ),
+       'localday2'               => array( '1', 'WAREYROCE2', 'LOCALDAY2' ),
+       'localdayname'            => array( '1', 'NAMEYÊWAREYROCE', 'LOCALDAYNAME' ),
+       'localyear'               => array( '1', 'WAREYSERRE', 'LOCALYEAR' ),
+       'localtime'               => array( '1', 'WAREYDEME', 'LOCALTIME' ),
+       'localhour'               => array( '1', 'WAREYSEHAT', 'LOCALHOUR' ),
+       'numberofpages'           => array( '1', 'AMARİYAPELAN', 'NUMBEROFPAGES' ),
+       'numberofarticles'        => array( '1', 'AMARİYAWESİQAN', 'NUMBEROFARTICLES' ),
+       'numberoffiles'           => array( '1', 'AMARİYADOSYAYAN', 'NUMBEROFFILES' ),
+       'numberofusers'           => array( '1', 'AMARİYAKARBERAN', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'     => array( '1', 'AMARİYAAKTİVKARBERAN', 'NUMBEROFACTIVEUSERS' ),
+       'numberofedits'           => array( '1', 'AMARİYAVURNAYIŞAN', 'NUMBEROFEDITS' ),
+       'numberofviews'           => array( '1', 'AMARİYAMOCNAYIŞAN', 'NUMBEROFVIEWS' ),
+       'pagename'                => array( '1', 'NAMEYPELA', 'PAGENAME' ),
+       'pagenamee'               => array( '1', 'NAMEYPELAA', 'PAGENAMEE' ),
+       'namespace'               => array( '1', 'CANAME', 'NAMESPACE' ),
+       'namespacee'              => array( '1', 'CANAMEE', 'NAMESPACEE' ),
+       'namespacenumber'         => array( '1', 'AMARİYACANAME', 'NAMESPACENUMBER' ),
+       'talkspace'               => array( '1', 'CAYÊWERÊNAYIŞİ', 'TALKSPACE' ),
+       'talkspacee'              => array( '1', 'CAYÊWERÊNAYIŞAN', 'TALKSPACEE' ),
+       'subjectspace'            => array( '1', 'CAYÊMESEL', 'CAYÊWESİQE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
+       'subjectspacee'           => array( '1', 'CAYÊMESELAN', 'CAYÊWESİQAN', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
+       'fullpagename'            => array( '1', 'NAMEYPELAPÊRO', 'FULLPAGENAME' ),
+       'fullpagenamee'           => array( '1', 'NAMEYPELAPÊRON', 'FULLPAGENAMEE' ),
+       'subpagename'             => array( '1', 'NAMEYBINPELA', 'SUBPAGENAME' ),
+       'subpagenamee'            => array( '1', 'NAMEYBINPELAA', 'SUBPAGENAMEE' ),
+       'basepagename'            => array( '1', 'NAMEYSERPELA', 'BASEPAGENAME' ),
+       'basepagenamee'           => array( '1', 'NAMEYSERPELAA', 'BASEPAGENAMEE' ),
+       'talkpagename'            => array( '1', 'NAMEYPELAWERÊNAYIŞ', 'TALKPAGENAME' ),
+       'talkpagenamee'           => array( '1', 'NAMEYPELAWERÊNAYIŞAN', 'TALKPAGENAMEE' ),
+       'subjectpagename'         => array( '1', 'NAMEYPELAMESEL', 'NAMEYPELAWESİQE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'        => array( '1', 'NAMEYPELAMESELER', 'NAMEYPELAQESİQER', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
+       'msg'                     => array( '0', 'MSC', 'MSG:' ),
+       'subst'                   => array( '0', 'KOPYAKE', 'ATEBERDE', 'SUBST:' ),
+       'safesubst'               => array( '0', 'EMELEYATEBERDE', 'SAFESUBST:' ),
+       'msgnw'                   => array( '0', 'MSJNW:', 'MSGNW:' ),
+       'img_thumbnail'           => array( '1', 'resmowerdı', 'werdı', 'thumbnail', 'thumb' ),
+       'img_manualthumb'         => array( '1', 'resmowerdı=$1', 'erwdı=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'img_right'               => array( '1', 'raşt', 'right' ),
+       'img_left'                => array( '1', 'çep', 'left' ),
+       'img_none'                => array( '1', 'çıno', 'none' ),
+       'img_width'               => array( '1', '$1pik', '$1piksel', '$1px' ),
+       'img_center'              => array( '1', 'werte', 'miyan', 'center', 'centre' ),
+       'img_framed'              => array( '1', 'çerçeweyın', 'çerçeweya', 'çerçewe', 'framed', 'enframed', 'frame' ),
+       'img_frameless'           => array( '1', 'beçerçewe', 'frameless' ),
+       'img_page'                => array( '1', 'pela=$1', 'pela_$1', 'page=$1', 'page $1' ),
+       'img_border'              => array( '1', 'sinor', 'border' ),
+       'img_top'                 => array( '1', 'gedug', 'top' ),
+       'img_middle'              => array( '1', 'merkez', 'middle' ),
+       'img_link'                => array( '1', 'gre=$1', 'link=$1' ),
+       'int'                     => array( '0', 'İNT:', 'INT:' ),
+       'scriptpath'              => array( '0', 'RAYASCRIPTİ', 'SCRIPTPATH' ),
+       'stylepath'               => array( '0', 'TERZÊTEWRİ', 'STYLEPATH' ),
+       'grammar'                 => array( '0', 'GRAMER:', 'GRAMMAR:' ),
+       'gender'                  => array( '0', 'CİNSİYET:', 'GENDER:' ),
+       'notitleconvert'          => array( '0', '__SERNAMEVURNAYIŞÇINO__', '__SVÇ__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'        => array( '0', '__ZERREVURNAYIŞÇINO__', '__ZVÇ__', '__NOCONTENTCONVERT__', '__NOCC__' ),
+       'currentweek'             => array( '1', 'MEVCUDHEFTE', 'CURRENTWEEK' ),
+       'currentdow'              => array( '1', 'MEVCUDWAREYHEFTİ', 'CURRENTDOW' ),
+       'localweek'               => array( '1', 'WAREYHEFTİ', 'LOCALWEEK' ),
+       'localdow'                => array( '1', 'WAREYROCAHEFTİ', 'LOCALDOW' ),
+       'revisionid'              => array( '1', 'NIMREYREVİZYONİ', 'REVISIONID' ),
+       'revisionday'             => array( '1', 'ROCAREVİZYONİ', 'REVISIONDAY' ),
+       'revisionday2'            => array( '1', 'ROCAREVİZYON1', 'REVISIONDAY2' ),
+       'revisionmonth'           => array( '1', 'AŞMAREVİZYONİ', 'REVISIONMONTH' ),
+       'revisionmonth1'          => array( '1', 'AŞMAREVİZYONİ1', 'REVISIONMONTH1' ),
+       'revisionyear'            => array( '1', 'SERRAREVİZYONİ', 'REVISIONYEAR' ),
+       'revisiontimestamp'       => array( '1', 'MELUMATÊREVİZYONÊDEMİ', 'REVISIONTIMESTAMP' ),
+       'revisionuser'            => array( '1', 'REVİZYONKARBER', 'REVISIONUSER' ),
+       'plural'                  => array( '0', 'ZAFEN:', 'PLURAL:' ),
+       'fullurl'                 => array( '0', 'GREPÊRO:', 'FULLURL:' ),
+       'fullurle'                => array( '0', 'GREYOPÊRON:', 'FULLURLE:' ),
+       'canonicalurl'            => array( '0', 'GREYÊKANONİK:', 'CANONICALURL:' ),
+       'canonicalurle'           => array( '0', 'GREYOKANONİK:', 'CANONICALURLE:' ),
+       'lcfirst'                 => array( '0', 'KHİLK:', 'LCFIRST:' ),
+       'ucfirst'                 => array( '0', 'BHİLK:', 'UCFIRST:' ),
+       'lc'                      => array( '0', 'KH:', 'LC:' ),
+       'uc'                      => array( '0', 'BH:', 'UC:' ),
+       'raw'                     => array( '0', 'XAM:', 'RAW:' ),
+       'displaytitle'            => array( '1', 'SERNAMEİBIMOCNE', 'DISPLAYTITLE' ),
+       'newsectionlink'          => array( '1', '__GREYÊSERNAMEDÊNEWİ__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'        => array( '1', '__GREYÊSERNAMEDÊNEWİÇINO__', '__NONEWSECTIONLINK__' ),
+       'currentversion'          => array( '1', 'MEWCUDVERSİYON', 'CURRENTVERSION' ),
+       'currenttimestamp'        => array( '1', 'MEWCUDWAREYSEHAT', 'CURRENTTIMESTAMP' ),
+       'localtimestamp'          => array( '1', 'MALUMATÊWAREYSEHAT', 'LOCALTIMESTAMP' ),
+       'language'                => array( '0', '#ZIWAN', '#LANGUAGE:' ),
+       'contentlanguage'         => array( '1', 'ZIWANÊESTİN', 'ZIWESTEN', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
+       'pagesinnamespace'        => array( '1', 'PELEYÊKECADÊNAMİDEYÊ', 'PELECN', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
+       'numberofadmins'          => array( '1', 'AMARİYAXİZMETKARAN', 'NUMBEROFADMINS' ),
+       'formatnum'               => array( '0', 'BABETNAYIŞ', 'FORMATNUM' ),
+       'special'                 => array( '0', 'xısusi', 'special' ),
+       'speciale'                => array( '0', 'xısusiye', 'speciale' ),
+       'defaultsort'             => array( '1', 'RATNAYIŞOHESBNAYIŞ', 'QESAYARATNAYIŞOHESBNAYIŞ', 'KATEGORİYARATNAYIŞOHESBNAYIŞ', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
+       'filepath'                => array( '0', 'RAYADOSYA:', 'FILEPATH:' ),
+       'tag'                     => array( '0', 'etiket', 'tag' ),
+       'hiddencat'               => array( '1', '__KATEGORİYANIMITİ__', '__HIDDENCAT__' ),
+       'pagesincategory'         => array( '1', 'PELEYÊKEKATEGORİDEYÊ', 'KATDÊPELEY', 'PAGESINCATEGORY', 'PAGESINCAT' ),
+       'pagesize'                => array( '1', 'EBATÊPELA', 'PAGESIZE' ),
+       'index'                   => array( '1', '__SERSIQ__', '__INDEX__' ),
+       'noindex'                 => array( '1', '__SERSIQÇINYO__', '__NOINDEX__' ),
+       'numberingroup'           => array( '1', 'GRUBDEAMARE', 'AMARİYAGRUBER', 'NUMBERINGROUP', 'NUMINGROUP' ),
+       'staticredirect'          => array( '1', '__STATİKHETENAYIŞ__', '__STATICREDIRECT__' ),
+       'protectionlevel'         => array( '1', 'SEWİYEYÊSTARE', 'PROTECTIONLEVEL' ),
+       'url_wiki'                => array( '0', 'WİKİ', 'WIKI' ),
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Bınê gırey de xete bance:',
@@ -26,7 +276,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
 'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro bıasê, tenya tewr peyêni nê',
-'tog-usenewrc' => 'Vurnayışanê peyênanê herakerdeyan bıxebetne (JavaScript lazımo)',
+'tog-usenewrc' => 'Vurnayışanê peyniya hera kerdeyan bıxebetne (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Goceganê hacetanê vurnayışi bımocne (JavaScript lazımo)',
 'tog-editondblclick' => 'Pê dı rey tıknayış pele sero bıxebetiye (JavaScript lazımo)',
@@ -59,10 +309,12 @@ $messages = array(
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
-'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrolkerdeyan bınımne',
+'tog-watchlisthidepatrolled' => 'Lista seyrkerdışi ra vurnayışanê qontrol kerdeyan bınımne',
+'tog-nolangconversion' => 'Varyant çerx kerdışa bıqefılne',
 'tog-ccmeonemails' => 'E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe',
 'tog-diffonly' => 'Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê',
 'tog-showhiddencats' => 'Kategoriyanê dızdine bımocne',
+'tog-noconvertlink' => 'Greyê sernami çerx kerdışi bıqefılne',
 'tog-norollbackdiff' => 'Peyserardışi ra dıme ferqi caverde',
 
 'underline-always' => 'Tım',
@@ -129,7 +381,7 @@ $messages = array(
 'dec' => 'Kan',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategoriye|Kategoriy}}',
+'pagecategories' => '{{PLURAL:$1|Kategori|Kategoriy}}',
 'category_header' => 'Pelê ke kategoriya "$1" derê',
 'subcategories' => 'Kategoriyê bınêni',
 'category-media-header' => 'Medyawa ke kategoriya "$1" dera',
@@ -146,13 +398,14 @@ $messages = array(
 'index-category' => 'Pelê endeksıni',
 'noindex-category' => 'Pelê ke endeksıni niyê',
 'broken-file-category' => 'Peleye ke linkê Dosyayandê xelata muhtewa kenê',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => "'''MediaWiki niya ro.'''",
 
 'about' => 'Heqa',
-'article' => 'Pela tedeesteyan',
+'article' => 'Wesiqe',
 'newwindow' => '(zerrey pençereyê dê newey de beno a)',
-'cancel' => 'Texelnayış',
+'cancel' => 'Bıterkne',
 'moredotdotdot' => 'Vêşêri...',
 'mypage' => 'Pela mı',
 'mytalk' => 'Werênayışê mı',
@@ -167,28 +420,28 @@ $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',
 
 # Vector skin
-'vector-action-addsection' => 'Qal berze cı',
-'vector-action-delete' => 'Bestere',
-'vector-action-move' => 'Bere',
+'vector-action-addsection' => 'Mesel Vırazê',
+'vector-action-delete' => 'Besterne',
+'vector-action-move' => 'Ahûln',
 'vector-action-protect' => 'Bıpawe',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
-'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışiê raverberdeyan ake (Tenya vector skin de)',
+'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışê raverberdan ake (Tenya vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Tarixi bımocne',
-'vector-view-view' => 'Bıwane',
+'vector-view-view' => 'Bıwanên',
 'vector-view-viewsource' => 'Çımey bıvêne',
-'actions' => 'Karê kerdey',
+'actions' => 'Kerdeni',
 'namespaces' => 'Cayê namey',
 'variants' => 'Varyanti',
 
-'errorpagetitle' => 'Xeta',
+'errorpagetitle' => 'Xırab',
 'returnto' => 'Peyser şo $1.',
 'tagline' => '{{SITENAME}} ra',
 'help' => 'Peşti',
@@ -196,18 +449,18 @@ $messages = array(
 'searchbutton' => 'Cı geyre',
 'go' => 'Şo',
 'searcharticle' => 'Şo',
-'history' => 'Tarixê pele',
-'history_short' => 'Tarix',
+'history' => 'Ravêrdena pela',
+'history_short' => 'Ravêrden',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Asayışê çapkerdışi',
-'permalink' => 'Gıreyo jûqere',
+'printableversion' => 'Asayışo çapkerden',
+'permalink' => 'Gıreyo daimi',
 'print' => 'Çap ke',
 'view' => 'Bıvêne',
-'edit' => 'Bıvurne',
+'edit' => 'Bıvurnên',
 'create' => 'Vırazê',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
-'delete' => 'Bestere',
+'delete' => 'Besterne',
 'deletethispage' => 'Ena pele bestere',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
@@ -216,16 +469,16 @@ $messages = array(
 'protectthispage' => 'Ena pele bıpawe',
 'unprotect' => 'Starkerdışi bıvurne',
 'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
-'newpage' => 'Pela newiye',
+'newpage' => 'Pela newi',
 'talkpage' => 'Ena pele sero werêne',
-'talkpagelinktext' => 'Werênayış',
-'specialpage' => 'Pela xase',
+'talkpagelinktext' => 'Mesac',
+'specialpage' => 'Pela xısusiye',
 'personaltools' => 'Hacetê şexsi',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
 'talk' => 'Werênayış',
 'views' => 'Asayışi',
-'toolbox' => 'Qutiya hacetan',
+'toolbox' => 'Haceti',
 'userpage' => 'Pela karberi bıvêne',
 'projectpage' => 'Pela procey bıvêne',
 'imagepage' => 'Pela dosya bımocne',
@@ -259,22 +512,22 @@ $1',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
 'currentevents' => 'Veng u vac',
 'currentevents-url' => 'Project:Veng u vac',
-'disclaimers' => 'Redê mesulêti',
+'disclaimers' => 'Redê mesuliyeti',
 'disclaimerpage' => 'Project:Reddê mesuliyetê bıngey',
-'edithelp' => 'Peştdarina vurnayışi',
-'edithelppage' => 'Help:Pele çıtewr vurniyena',
-'helppage' => 'Help:Tedeestey',
+'edithelp' => 'Seni vurneyêno?',
+'edithelppage' => 'Help:Pela seni vurniyêna',
+'helppage' => 'Help:Estêni',
 'mainpage' => 'Pela Seri',
 'mainpage-description' => 'Pela Seri',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê cemaeti',
 'portal-url' => 'Project:Portalê cemaeti',
 'privacy' => 'Madeyê dızdine',
-'privacypage' => 'Project:Madeyê dızdine',
+'privacypage' => 'Project:Xısusiyetê nımtışi',
 
 'badaccess' => 'Xeta mısadey',
 'badaccess-group0' => 'Heqa şıma çıniya, karo ke şıma waşt, bıkerê.',
-'badaccess-groups' => 'No fealiyetê şımawo waşte tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.',
+'badaccess-groups' => 'No fealiyeto ke şıma waşt, tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.',
 
 'versionrequired' => 'No $1 MediaWiki lazımo',
 'versionrequiredtext' => 'Seba gurenayışê na pele versiyonê MediaWiki $1 lazımo. 
@@ -283,11 +536,12 @@ $1',
 'ok' => 'Temam',
 'pagetitle' => '"$1" adres ra gerya.',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => '"$1" ra ard',
 'youhavenewmessages' => 'To rê estê $1 ($2).',
 'newmessageslink' => 'mesacê newey',
 'newmessagesdifflink' => 'vurnayışo peyên',
-'youhavenewmessagesmulti' => 'To rê $1 de mesacê newey estê',
+'youhavenewmessagesmulti' => '$1 mesaco newe esto',
 'editsection' => 'bıvurne',
 'editsection-brackets' => '[$1]',
 'editold' => 'bıvurne',
@@ -295,11 +549,11 @@ $1',
 'editlink' => 'bıvurne',
 'viewsourcelink' => 'çımey bıvêne',
 'editsectionhint' => 'Qısımi bıvurne: $1',
-'toc' => 'Tedeestey',
+'toc' => 'Sernameyê meselan',
 'showtoc' => 'bımocne',
 'hidetoc' => 'bınımne',
-'collapsible-collapse' => 'Kılmever ke',
-'collapsible-expand' => 'Hera',
+'collapsible-collapse' => 'Kılm ke',
+'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}}',
@@ -311,6 +565,7 @@ $1',
 'page-rss-feed' => '"$1" Cıresnayışê RSSi',
 'page-atom-feed' => '"$1" Cıresnayışê atomi',
 'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1 (pele çıniya)',
 'sort-descending' => 'Ratnayışê qemeyayışi',
 'sort-ascending' => 'Ratnayışê Zeydnayışi',
@@ -319,13 +574,13 @@ $1',
 'nstab-main' => 'Pele',
 'nstab-user' => 'Pela Karberi',
 'nstab-media' => 'Pela Medya',
-'nstab-special' => 'Pela xase',
+'nstab-special' => 'Pela xısusiye',
 'nstab-project' => 'Pela Procey',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
 'nstab-template' => 'Şablon',
 'nstab-help' => 'Pela peşti',
-'nstab-category' => 'Kategoriye',
+'nstab-category' => 'Kategori',
 
 # Main script and global functions
 'nosuchaction' => 'Fealiyeto wınasi çıniyo',
@@ -335,10 +590,10 @@ Keyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.',
 'nosuchspecialpage' => 'Pela xasa wınasiye çıniya',
 'nospecialpagetext' => '<strong>To yew pela xasa nêvêrdiye waşte.</strong>
 
-Seba lista pelanê xasanê vêrdeyan kerem ke: [[Special:SpecialPages|{{int:specialpages}}]].',
+Seba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error' => 'Xeta',
+'error' => 'Xırab',
 'databaseerror' => 'Xeta serveri',
 'dberrortext' => 'Rêzê vateyê database de xeta bı.
 No xeta belka software ra yo.
@@ -383,27 +638,37 @@ Belka yewna ten kerdo hewn a.',
 'badtitletext' => 'Sernamey pela ke şıma waşt, nêvêrd, thalo/vengo ya ki zıwano miyanêno ğelet gırêdae ya ki sernamey wiki.
 Beno ke, tede yew ya zi zêdê işareti estê ke sernaman de nêxebetiyenê.',
 'perfcached' => 'Datay cı ver hazır biye. No semedê ra nıkayin niyo! tewr zaf {{PLURAL:$1|netice|$1 netice}} debêno de',
-'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticeycı}} debyayo de',
+'perfcachedts' => 'Cêr de malumatê nımıteyi esti, demdê newe kerdışo peyın: $1. Tewr zaf {{PLURAL:$4|netice|$4 neticey cı}} debyayo de',
 'querypage-no-updates' => 'Nıka newe kerdış nêbeno. no datayi ca de newe nêbeni .',
 'wrong_wfQuery_params' => 'wfQuery() parametreyo şaş<br />
 Fonksiyon: $1<br />
 Perse: $2',
 'viewsource' => 'Çımey bıvêne',
 'viewsource-title' => "Cı geyrayışê $1'i bıvin",
-'actionthrottled' => 'Fealiyet xeneqna',
+'actionthrottled' => 'Kerden peysnaya',
 'actionthrottledtext' => 'Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.
 Çend deqey ra tepeya reyna bıcerrebnên.',
 'protectedpagetext' => 'No pel qey nêvuriyayiş hao (nao) pawyeno.',
 'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
+'viewyourtext' => "Na pela '''Vurnayışê ke kerdê''' re şıma şenê 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' => "'''Teme:''' Şıma hao jû pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.
+Vurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.
+Seba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
 '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ış.',
+'customcssprotected' => 'Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
+'customjsprotected' => 'Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
+'ns-specialprotected' => 'Peley xısusi nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
+'filereadonlyerror' => 'Dosyay vurnayışê "$1" nê abê no lakin depoy dosya da "$2" mod dê  salt wendi deyo.
+
+Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
+'invalidtitle-knownnamespace' => 'Canemey "$2" u metnê "$3" xırabo',
+'invalidtitle-unknownnamespace' => 'Sernameye nêşınasiya yana amraiya canameyo  $1 u metno "$2" xırab',
 
 # Virus scanner
 'virus-badscanner' => "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
@@ -423,15 +688,16 @@ Hesabê şıma biyo a.
 'yourpassword' => 'Parola',
 'yourpasswordagain' => 'Parola reyna bınusne:',
 'remembermypassword' => 'Parola mı nê cıgeyraoği de biya xo viri (heta $1 {{PLURAL:$1|roc|roci}}).',
+'securelogin-stick-https' => "Dekewtış kerdışi dıma HTTPS'i dı grêdaye bıman",
 'yourdomainname' => 'Nameyê şıma yo meydani',
 'externaldberror' => 'Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.',
 'login' => 'Cı kewe',
-'nav-login-createaccount' => 'Cı kewe / hesab vıraze',
+'nav-login-createaccount' => 'Dekew de / hesab vıraze',
 'loginprompt' => "Cıkewtena {{SITENAME}}i rê gani ''cookies'' akerdey bê.",
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
-'logout' => 'Cı ra veciye',
-'userlogout' => 'Veciye',
+'logout' => 'Bıveciyên',
+'userlogout' => 'Bıveciyên',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
@@ -453,9 +719,12 @@ Ravêri inan akerê, dıma be name u parola şımawa newiye cı kewê.',
 'nocookieslogin' => 'Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.
 Şıma çerezi qapan kerdi.
 Ravêri inan akerê u reyna bıcerrebnê.',
+'nocookiesfornew' => 'Hesabê karberi nêvıraziya, MA nêzana sebebê cı kotirawo.
+Akerdış dê çerezarê xo emel bê uena pela fına barkerê.',
+'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Yew nameyo maqbul bınuse.',
-'loginsuccesstitle' => 'Hesab bıyo a.',
-'loginsuccess' => '{{SITENAME}} Na keyepel de pê no "$1" name şıma hesab kerdo a.',
+'loginsuccesstitle' => 'Hesab abıya',
+'loginsuccess' => "'''{{SITENAME}} dı name dê \"\$1\" şıma hesab akerdo.'''",
 'nosuchuser' => 'Ebe namey "$1"i yew karber çıniyo.
 Nuştışê namanê karberan de herfa pil u qıce rê diqet kerên.
 Nuştışê xo qonrol kerên, ya zi [[Special:UserLogin/signup|yew hesabo newe akerên]].',
@@ -464,8 +733,9 @@ Nuştışê xo qonrol kerên, ya zi [[Special:UserLogin/signup|yew hesabo newe a
 'login-userblocked' => 'No karber/na karbere blokekerdeyo/blokekerdiya. Cıkewtışi rê musade çıniyo.',
 'wrongpassword' => 'Parola ğeleta. Rêna / fına bıcerrebne .',
 'wrongpasswordempty' => 'Parola tola, venga. tekrar bınuse.',
-'passwordtooshort' => 'Parolayê to gani bi {{PLURAL:$1|1 karakter|$1 karakteran}}.',
+'passwordtooshort' => 'Derganiya parola wa tewr tayn {{PLURAL:$1|1 karakter|$1 karakteran}} dı bo.',
 'password-name-match' => 'Parola u nameyê şıma gani zeypê (seypê) nêbo.',
+'password-login-forbidden' => 'No namey karberi u parola karkerdışê cı  kerdo xırab.',
 'mailmypassword' => 'E-mail sera parola newiye bırışe',
 'passwordremindertitle' => 'Qey na keyepel {{SITENAME}} yew parolayo emanet',
 'passwordremindertext' => 'Yew ten (muhtemelen, şıma na aderesê IP ra $1 ) {{SITENAME}} ($4) newe yew parola waşt. "$2" no name ri emanet yew parola vıraziya "$3". Eke na şıma waşta, hesabê xo akere u newe yew parola bıvıraze. Muddetê parolayê şıma yo emanet {{PLURAL:$5|1 roc|$5 roci}}.
@@ -475,19 +745,21 @@ Eke vurnayişê parolayi, şıma nêwaşt ya zi parolayê şıma ameyo şıma vi
 'noemailcreate' => 'Şıma gani yew parolayo meqbul peda bıkeri',
 'passwordsent' => '"$1" No name de yew e-posta erşawiya (ruşya). hesabê xo, şıma wext mesaj gırewt u çax akere.',
 'blocked-mailpassword' => 'Cıkewetışê na keyepel de şıma qedexe biye, ey ra newe yew şifre nêerşawyeno.',
-'eauthentsent' => 'Adreso ke şıma dayo ma, ma yew e-posta erşawıt uca, o e-posta de kodê tesdiq kerdış esto.
-Heta ke şıma o e-posta tesdiq nêkeri ma yewna e-posta şıma ri nêerşaweni.',
+'eauthentsent' => 'Adreso ke şıma dayo ma, ma yew e-posta rışt uca, o e-posta de kodê araşt kerdış esto.
+Heta ke şıma o e-postaaraşt nêkeri ma yewna e-posta şıma ri nêrışêno.',
 'throttled-mailpassword' => 'Parola vir ardış, zerreyê {{PLURAL:$1|yew seet|$1 seet}} de erşawiya.
 Parola her {{PLURAL:$1|yew seete|$1 seete}} de yew rey erşawiyena.',
 'mailerror' => 'Erşawıtışe xetayê e-posta: $1',
 'acct_creation_throttle_hit' => 'Yew ten IP adresê şıma xebıtnayo u kewto no wiki, roco peyin de {{PLURAL:$1|1 hesab|$1 hesab}} vıraşto.
 xulasa ney kesê ke IP adresê şıma xebıtneni hini nêeşkeni ney ra zêdêr hesab akeri.',
-'emailauthenticated' => 'E-posta şıma ney tarixi de $2 $3 tarihinde tesdiq biyo.',
+'emailauthenticated' => "Adresê E-posta da şıma '''$2''' seate $3 dı kerdo araşt.",
 'emailnotauthenticated' => 'No format de nuştışê e-postayi qebul nêbeno.
 Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'noemailprefs' => 'Hesab biyo a.',
-'emailconfirmlink' => 'E-postayê xo tesdiq kere',
+'emailconfirmlink' => 'E-postayê xo araşt kerê',
 'invalidemailaddress' => 'No format de nuştışê e-postayi qebul nêbeno. Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
+'cannotchangeemail' => 'E-postay hesabi ena wiki sera nêvurneyêno.',
+'emaildisabled' => 'Na site ra e-posta nêrışêno.',
 'accountcreated' => 'Hesab vıraciya',
 'accountcreatedtext' => 'Qey no $1 karker newe yew hesab vıraziya.',
 'createaccount-title' => 'Qey {{SITENAME}} newe yew heab vıraştış',
@@ -496,9 +768,14 @@ Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'usernamehasherror' => 'Namey karberi de karakteri gani têmiyan ra mebê',
 'login-throttled' => 'Demekê cıwa ver de şıma zah teşebbusê hesab akerdış kerd.
 Bıne vındere u newe ra dest pê bıkere.',
+'login-abort-generic' => 'Dekewtışê şıma xırabo-terkneyayo',
 'loginlanguagelabel' => 'Zıwan: $1',
 'suspicious-userlogout' => 'Waştişê tu ya veciyayişi kebul nibiya cunki ihtimal o ke waştiş yew browser ya zi proksiyê heripiyaye ra ameya.',
 
+# E-mail sending
+'php-mail-error-unknown' => "PHP's mail() fonksiyoni de xırabin vıcyê.",
+'user-mail-no-addy' => 'Bê E-posta kerd ju e-posta bırşo cırê.',
+
 # Change password dialog
 'resetpass' => 'Parola bıvurne',
 'resetpass_announce' => 'Şıma pê yew parolayê muweqqet hesab kerd a, qey qedyayişe dekewtış newe yew parola bınuse:',
@@ -519,24 +796,44 @@ Bıne vındere u newe ra dest pê bıkere.',
 
 # Special:PasswordReset
 'passwordreset' => 'Parola ancia bınuse',
+'passwordreset-text' => 'Nê formi melumatê hesab dê şıma birê şıma viri deye pırkerê.',
 'passwordreset-legend' => 'Parola ancia bınuse',
+'passwordreset-disabled' => 'Parola reset kerdış ena viki sera qefılneyayo.',
 'passwordreset-pretext' => '{{PLURAL:$1||Enê cerenan ra jeweri defiye de}}',
 'passwordreset-username' => 'Namey karberi:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'neticey e-postay bımocne?',
+'passwordreset-capture-help' => 'Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.',
 'passwordreset-email' => 'Adresa e-postey:',
 'passwordreset-emailtitle' => 'Hesab timarê {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
+'passwordreset-emailtext-user' => '$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:
+
+$2
+
+{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.
+Ena parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.',
 'passwordreset-emailelement' => 'Namey karberi: $1
 Parola vêrdiye: $2',
+'passwordreset-emailsent' => 'E-postay xo vira kerdışi rışiyê.',
+'passwordreset-emailsent-capture' => 'Zey cêri e-postay xo vira kerdışi rışiyê.',
+'passwordreset-emailerror-capture' => 'ey cêri e-postay xo vira kerdışi vıraziyê lakin merdum dê $1 rê nêrışiyê.',
 
 # Special:ChangeEmail
 'changeemail' => 'E-posta adresa xo bıvurnê',
 'changeemail-header' => 'E-posya adresta hesabdê xo bıvurnê',
+'changeemail-text' => 'Şıma qayılê ke e-postay xo bıvurnê se enê formi pırkerê. Qandê araşt kerdışi zi parolay xo şıma de bınusnê',
+'changeemail-no-info' => 'Resayışê ena pela rê Dekewtış icab keno.',
 'changeemail-oldemail' => 'E-postay şımaya newki:',
 'changeemail-newemail' => 'E-postay şımayê newe:',
 'changeemail-none' => '(Çıno)',
 'changeemail-submit' => 'E-postay xo bıvurne',
-'changeemail-cancel' => 'Bıterqne',
+'changeemail-cancel' => 'Bıterkne',
 
 # Edit page toolbar
 'bold_sample' => 'Çapo qalınd',
@@ -547,20 +844,21 @@ Parola vêrdiye: $2',
 'link_tip' => 'Gırê dahili',
 'extlink_sample' => 'http://www.example.com titleya gire',
 'extlink_tip' => 'Çımeyo tewer (http:// prefix)',
-'headline_sample' => 'nuşteyo headline',
+'headline_sample' => 'nuştey xeta seri',
 'headline_tip' => 'Ket 2 headline',
 'nowiki_sample' => 'Non-format nuşte itiya ra bıerz',
 'nowiki_tip' => 'Formatê wiki iptal bık',
-'image_sample' => 'resım bıerze cı',
+'image_sample' => 'Misal resim.jpg',
 'image_tip' => 'Dosyaya embedi',
+'media_sample' => 'misal.jpg',
 'media_tip' => 'Gırey dosya',
 'sig_tip' => 'İmzay tı u tarix',
 'hr_tip' => 'Çızgiy Horizantoli (use sparingly)',
 
 # Edit pages
-'summary' => 'Mênine:',
+'summary' => 'Xulasa:',
 'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Eno yew vurnayışo qıckeko',
+'minoredit' => 'Vurnayışo qıckeko',
 'watchthis' => 'Ena pele seyr ke',
 'savearticle' => 'Ena pele qeyd ke',
 'preview' => 'Verqayt',
@@ -634,17 +932,24 @@ 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!'''",
 'userjspreview' => "'''şıma tena test keni ya ziverqayn seyr keni - karberê JavaScript'i hema qayd nebiyo.'''",
+'sitecsspreview' => "'''Şımayê enewke tenya verqaytê dosya da CSS vınenê.''' 
+'''Hewna qayd nêbı!'''",
+'sitejspreview' => "'''Şımayê enewke tenya verqaytê kodê dosya da JavaScriptê karberi vınenê.''' 
+'''hewna qayd nebı!'''",
 'userinvalidcssjstitle' => "'''Teme:''' Mewzuyê \"\$1\" çıniyo.
 Dosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
-'updated' => '(Biyo rocane)',
+'updated' => '(Newenyaya)',
 'note' => "'''Not:'''",
 'previewnote' => "Teme! ena teyna verqeyda.'''
-Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]",
+Vurnayışê tu hama qeyd nıbiyo!",
+'continue-editing' => 'Vurnayışi rê dewam ke',
 'previewconflict' => 'No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.',
 'session_fail_preview' => 'Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.',
 'session_fail_preview_html' => "'''Ma meluli! Sebayê vindbiyayişê datasistemi ma vurnayişê şıma nêeşkeni qaydker.'''
@@ -655,8 +960,9 @@ Vurnayışê tu hama qeyd nıbiyo![[#editform|→ timar kerdışi rê dewam ke]]
 'token_suffix_mismatch' => "'''Vurnayişê şıma tepeya ameyo çunke qutiyê imla xerıbya.
 Vurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.
 Eke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
-'editing' => 'Şımayê kenê "$1" bıvurnê',
-'creating' => "Şımaye kene $1'i vıraze",
+'edit_form_incomplete' => "'''Qandê form dê vurnayışa tay wastera ma nêreşti; Vurnayışê ke şıma kerdê nêalızyayê, çım ra ravyarnê u fına bıcerbnê.'''",
+'editing' => 'Pela "$1"\'i bıvurnê',
+'creating' => "Pela $1'i vıraze",
 'editingsection' => '$1 vurneno (qısım)',
 'editingcomment' => '$1 vuryeno (qısmo newe)',
 'editconflict' => 'Vurnayişê ke yewbini nêtepışeni: $1',
@@ -675,8 +981,7 @@ Tı ma ri soz dano ki tı nuşte xo oricinali nuşt, ya zi tı yew dokumantê um
 '''İTİYA DI METARİYALÊ \"COPYRIGHT\"İ NINUSİ!.'''",
 'copyrightwarning2' => 'Ney bızane ke nuşteyê ke şıma ruşneni (şaweni) keyepelê {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niye kes bıvurno, nuşetyanê xo meerze ita. <br />
 Wexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).',
-'longpageerror' => "'''Xeta: Dergeya nuşte dê şıma nezdi $1 kilobayta, u $2 kilobayt ra vêşiyo.
-Qeyd biyayişê cı nêbeno'''",
+'longpageerror' => "'''Xırab: Dergeya nuşte dê şıma nezdi {{PLURAL:$1|kilobayto|$1 kilobayto}}, feqet {{PLURAL:$2|kilobayt|$2 kilobayt}} ra vêşiyo. Qeyd biyayişê cı nêbeno'''",
 'readonlywarning' => "'''DİQET: Semedê mıqayti, database kılit biyo. No sebeb ra vurnayişê şıma qayd nêbeno. Nuşteyanê şıma yewna serkar eşkeno wedaro u pey ra şıma eşkeni reyna ita de qayd bıker'''
 
 Serkar o ke kılit kerdo; no beyanat dayo: $1",
@@ -687,12 +992,14 @@ Wexta ke şıma no pel vurneni diqet bıkeri, log bivini:",
 'cascadeprotectedwarning' => "'''Diqet:''' Na pele kılit biya, tenya karberê idarekeri şenê ke naye bıvurnê, çıke na zerrey {{PLURAL:$1|na pela şipa-kılitkerdiye|nê pelanê şipanê-kılitkerdiyan}} dera:",
 'titleprotectedwarning' => "'''Diqet: Na pele kılit biya, [[Special:ListGroupRights|heqê xususiy]] lazımê ke naye vırazê.'''
 Loge peniye cor de este:",
-'templatesused' => '{{PLURAL:$1|Template|Templateyan}} ke ena pele dı ca genê:',
+'templatesused' => '{{PLURAL:$1|Şablon|Şabloni}} ke na pela de xebtênê:',
 'templatesusedpreview' => '{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:',
 'templatesusedsection' => '{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:',
 'template-protected' => '(kılit biyo)',
 'template-semiprotected' => '(nimey ena pele kılit biya)',
 'hiddencategories' => 'Ena pela bınê {{PLURAL:$1|1 hidden category|$1 categoriyan nımne}}:',
+'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
+'edittools-upload' => '-',
 'nocreatetitle' => 'Vıraştışê pele mehcuro',
 'nocreatetext' => '{{SITENAME}}, Pelê neweyi vıraştış re destur çino.
 şıma eşkeni tepiya şêri u eke şıma qayd biyaye yê [[Special:UserLogin|şıma eşkeni hesab akeri]], eke niye [[Special:UserLogin|şıma eşkeni qayd bıbiy]].',
@@ -716,6 +1023,7 @@ Hewna kerde aseno.',
 'edit-no-change' => 'Vurnayişê şıma qebul nêbı, çunke nuşte de yew vurnayiş n3evıraziya.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
+'defaultmessagetext' => 'Normal metnê nuşti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Hişyari: No pel de fonksiyoni zaf esti.
@@ -730,6 +1038,12 @@ Taye şabloni zerre pel de nêmociyayeni.',
 'parser-template-loop-warning' => 'Gıreyê şabloni ca biyo: [[$1]]',
 'parser-template-recursion-depth-warning' => 'limitê şablonê newekerdışi biyo de ($1)',
 'language-converter-depth-warning' => 'xoritiya çarnekarê zıwanan viyarnê ra ($1)',
+'node-count-exceeded-category' => 'Pela ra hetê kotya amardışê cı ravêrya',
+'node-count-exceeded-warning' => 'Amariya pela ravêrya.',
+'expansion-depth-exceeded-category' => 'Pela dı hetê canaya zoriya herayin ravêrya',
+'expansion-depth-exceeded-warning' => 'Ravêriya pela xori herayêna',
+'parser-unstrip-loop-warning' => 'Unstrip lete vineya',
+'parser-unstrip-recursion-limit' => 'Sinorê limit dê qayış dê ($1) ravêrya',
 
 # "Undo" feature
 'undo-success' => 'No vurnayiş tepeye geryeno. pêverronayişêyê cêrıni kontrol bıkeri.',
@@ -749,18 +1063,18 @@ Sebebo ke terefê $3 ra diyao ''$2''",
 'currentrev' => 'Halo nıkayên',
 'currentrev-asof' => 'Revizyonanê peniyan, tarixê $1',
 'revisionasof' => 'Verziyonê roca $1ine',
-'revision-info' => 'Teshihkerdışê roca $1ine be terefê $2',
+'revision-info' => 'Tehsis kerdışê roca $1ine be terefê $2',
 'previousrevision' => '← Çımraviyarnayışo kıhanêr',
 'nextrevision' => 'Tekrar-diyayışo newêr →',
-'currentrevisionlink' => 'Revizyono peni',
+'currentrevisionlink' => 'Revizyono veror',
 'cur' => 'ferq',
 'next' => 'badên',
 'last' => 'pey',
 'page_first' => 'verên',
 'page_last' => 'peyên',
-'histlegend' => "Ferqê weçinıtış: Qutiya versiyonan isaret bık u dest bı ''enter''i ya zi gozaga cêrêne klik bık.<br />
-Cetwel: (pey) = ferqê versiyonê peni,
-(ver) = ferqê versiyonê verni, Q = vurnayışo qıçkek.",
+'histlegend' => "'''Ferqê weçinayışi:''' Qutiya versiyonan mor ke u  ''enter''i pıploxne ya zi makera cêrêner pılpxne.<br /> 
+Lecant: '''({{int:cur}})''' = ferqê versiyonê peni,
+'''({{int:last}})''' = ferqê versiyonê verni, '''{{int:minoreditletter}}''' = vurnayışo werdı.",
 'history-fieldset-title' => 'Tarixê browsey',
 'history-show-deleted' => 'Tenya esterıt',
 'histfirst' => 'Verênêr',
@@ -817,7 +1131,7 @@ Eke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
 'revdelete-nologid-text' => 'Şıma vıraştışê nê fonksiyoni rê ya yew cıkewtışo waşte diyar nêkerdo, ya ki çıkewtışo diyarkerde çıniyo.',
 'revdelete-no-file' => 'Dosya diyarkerdiye çıniya.',
 'revdelete-show-file-confirm' => 'Şıma eminê ke wazenê çımraviyarnayışê esterıtey na dosya "<nowiki>$1</nowiki>" $2 ra $3 de bıvênê?',
-'revdelete-show-file-submit' => 'Heya',
+'revdelete-show-file-submit' => 'E',
 'revdelete-selected' => "'''[[:$1]]: ra {{PLURAL:$2|çımraviyarnayışo weçinıte|çımraviyarnayışê weçinıtey}}'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:'''",
 'revdelete-text' => "'''Çımraviyarnayışê esterıtey u kerdışi hewna tarixê pele u qeydan de asenê, hema parçeyê zerrekê dinan areze nêbenê.'''
@@ -835,7 +1149,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşenê h
 'revdelete-hide-user' => 'Karber u IP ê ke vurnayiş kerdo bınım.',
 'revdelete-hide-restricted' => 'Malumatan pa serkaran u karberan ra bınım.',
 'revdelete-radio-same' => '(mevurne)',
-'revdelete-radio-set' => 'Heya',
+'revdelete-radio-set' => 'E',
 'revdelete-radio-unset' => 'Nê',
 'revdelete-suppress' => 'Hem ê binan ra hem zi serkaran ra malumatan bınım',
 'revdelete-unsuppress' => 'reizyonê ke tepiya anciye serbest ker',
@@ -872,8 +1186,8 @@ rocaneyan kontrol bıkere.',
 
 # Suppression log
 'suppressionlog' => 'qeydê pinani kerdışi',
-'suppressionlogtext' => "Cêrdı, kahyayan ra zerreko nımıte u  merdumê bloke kerdışi tede estê
-listey xelati u bloki re  [[Special:BlockList|IP'yê ke bloke biyê]] bivinê.",
+'suppressionlogtext' => "Cêr de, kahyayan ra zerreko nımıte esto,eno listey besterneya u merdumê bloke kerdışiyo
+Listey xırabi u bloki re pelay [[Special:BlockList|IP'yê ke bloke biyê]] bivinê.",
 
 # History merging
 'mergehistory' => 'vere cûye pelan bıhewelın',
@@ -897,6 +1211,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergehistory-comment' => '[[:$1]] u [[:$2]] yew biyê: $3',
 'mergehistory-same-destination' => 'Pela çime u destinasyonî gani eyni nibiy.',
 'mergehistory-reason' => 'Sebeb:',
+'mergehistory-revisionrow' => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog' => 'Logê yew kerdişî',
@@ -905,8 +1220,9 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'mergelogpagetext' => 'Cêr de jû liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.',
 
 # Diffs
-'history-title' => 'Tarixê revizyoniyê "$1"',
-'difference' => '(Ferqê revizyonan)',
+'history-title' => 'Rewizyonê $1:',
+'difference-title' => 'Ferkê revizyonan de "$1"',
+'difference-title-multipage' => 'Ferkê pelan dê "$1" u "$2"',
 'difference-multipage' => '(Ferqê pelan)',
 'lineno' => 'Rêza $1i:',
 'compareselectedversions' => 'Verziyonan kontrol bıke',
@@ -934,7 +1250,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) bıvênên',
 'searchmenu-legend' => 'bıgeyre tercihan (sae bıke)',
 'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
-'searchmenu-new' => "''Na Wikipediya de pela \"[[:\$1]]\" vıraze!'''",
+'searchmenu-new' => "''Na Wiki de pelay \"[[:\$1]]\" vıraze!'''",
 'searchhelp-url' => 'Help:Tedeestey',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
 'searchprofile-articles' => 'Pelê tedeestey',
@@ -947,7 +1263,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 'searchprofile-images-tooltip' => 'Qe doyayî bigêre',
 'searchprofile-everything-tooltip' => 'Tedeestey hemine cı geyre (pelanê mınaqeşey zi tey)',
 'searchprofile-advanced-tooltip' => 'qe cayê nimeyî bigêre',
-'search-result-size' => '$1 ({{PLURAL:$2|1 çekuye|$2 çekuy}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 kelime|$2 kelimey}})',
 'search-result-category-size' => '{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 ketegoriyê bini|$2 kategiryanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})',
 'search-result-score' => 'Eleqa: $1%',
 'search-redirect' => '(ber $1)',
@@ -972,21 +1288,22 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'powersearch' => 'Cıgeyrayışo hera',
 'powersearch-legend' => 'Cıgeyrayışo hera',
 'powersearch-ns' => 'Cayanê nameyan de cıgeyrayış:',
-'powersearch-redir' => 'Raçarnayeyan lista ke',
+'powersearch-redir' => 'Listeya hetenayışan',
 'powersearch-field' => 'Seba cı seyr ke',
 'powersearch-togglelabel' => 'Qontrol ke:',
 'powersearch-toggleall' => 'Pêro',
-'powersearch-togglenone' => 'Çıniyo',
+'powersearch-togglenone' => 'Çıno',
 'search-external' => 'Cıgeyrayışê teberi',
 'searchdisabled' => '{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.',
 
 # Quickbar
 'qbsettings' => 'Çûwo pêt',
-'qbsettings-none' => 'Çıniyo',
+'qbsettings-none' => 'Çıno',
 'qbsettings-fixedleft' => 'Rêcaene çhep',
 'qbsettings-fixedright' => 'Rêcaene raşt',
 'qbsettings-floatingleft' => 'rêcaene çhep',
 'qbsettings-floatingright' => 'rêcaene raşt',
+'qbsettings-directionality' => 'Sabito, hereket de dosya da zıwan de şımaya gıredayeyo',
 
 # Preferences page
 'preferences' => 'Tercihi',
@@ -1001,6 +1318,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'prefs-beta' => 'Xacetê beta',
 'prefs-datetime' => 'Tarix u wext',
 'prefs-labs' => 'Xacetê labs',
+'prefs-user-pages' => 'Pela Karberi',
 'prefs-personal' => 'Pela karberi',
 'prefs-rc' => 'Vurnayışê peyêni',
 'prefs-watchlist' => 'Lista seyr-kerdışi',
@@ -1015,9 +1333,9 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'prefs-setemail' => 'E-posta adresiyê xo saz kerê',
 'prefs-email' => 'Tercihê e-maili',
 'prefs-rendering' => 'Asayış',
-'saveprefs' => 'Qeyd ke',
+'saveprefs' => 'Star ke',
 'resetprefs' => 'Vurnayışê ke qeyd nêbiy, pak ke',
-'restoreprefs' => 'Eyaranê standardan pêroine peyser bia',
+'restoreprefs' => 'Sazanê standardan pêron newe dere barke',
 'prefs-editing' => 'Cay pela nustısi',
 'prefs-edit-boxsize' => 'Ebatê pencereyê vurnayîşî.',
 'rows' => 'Xeti:',
@@ -1062,36 +1380,39 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'prefs-common-css-js' => 'CSS/JavaScript pê şablonanê peran de pay biya:',
 'prefs-reset-intro' => 'ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.
 Na game tepeya nêerziyena.',
-'prefs-emailconfirm-label' => 'Konfirmasyonê e-maili',
+'prefs-emailconfirm-label' => 'Tesdiqiya E-posta:',
 'prefs-textboxsize' => 'Ebatê pencerey vurnayışi',
 'youremail' => 'E-Mail (mecbur niyo) *:',
 'username' => 'Namey karberi:',
 'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grup|grupan}}:',
+'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grub|grubi}}:',
+'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Wextê qeydbiyayışi',
-'yourrealname' => 'Nameyo raştıkên:',
+'prefs-registration-date-time' => '$1',
+'yourrealname' => 'Nameyo raştay',
 'yourlanguage' => 'Zıwan:',
 'yourvariant' => 'Varyante miyandê zuwani:',
+'prefs-help-variant' => 'Zerrey ena viki mocnayışi rê varyant yana ortografi re şıre tercihan dê xo.',
 'yournick' => 'imza:',
 'prefs-help-signature' => 'mesajê ke pelê werenayişi de gani pê ney "<nowiki>~~~~</nowiki>" imza bıbi.',
 'badsig' => 'Îmzayê tu raşt niyo.
 Etiketê HTMLî kontrol bike.',
 'badsiglength' => 'İmzayê şıma zaf dergo.
 $1 gani bınê no {{PLURAL:$1|karakter|karakter}}de bıbo.',
-'yourgender' => 'Cınsiyetê to:',
+'yourgender' => 'Neri makey:',
 'gender-unknown' => 'Cınsiyet nêvato',
 'gender-male' => 'cıwamêrd',
 'gender-female' => 'Cenıke',
 'prefs-help-gender' => 'keyfiyo: sofware qey adersê cinsiyet şuxulneno, no malumat umumiyo.',
-'email' => 'E-mail',
+'email' => 'E-posta',
 'prefs-help-realname' => 'Nameyo raşt waştena şıma rê mendo.
 Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de mocnenê.',
 'prefs-help-email' => 'Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.',
 'prefs-help-email-others' => 'Şıma şenê weçinê ke ê bini be yew gırey pela şımaya karberi ya zi pela werênayışi sera şıma de ebe e-poste irtıbat kewê.
 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-info' => 'Seron zanayış',
+'prefs-i18n' => 'Şaryayış kerdış',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
@@ -1105,6 +1426,10 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
 'prefs-diffs' => 'Diffs',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'e-posta adresi raştayo',
+'email-address-validity-invalid' => 'e-postayo raştay defiye de',
+
 # User rights
 'userrights' => 'İdarey heqanê karberan',
 'userrights-lookup-user' => 'Grubanê karberi/karbere idare bıke',
@@ -1126,11 +1451,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'userrights-notallowed' => 'Hesabdê şımadı heqanê xo hewadayış u xorê heq dekerdış çıno.',
 'userrights-changeable-col' => 'Grubê ke şıma şenê bıvurnê',
 'userrights-unchangeable-col' => 'Grubê ke şıma nêşenê bıvurnê',
+'userrights-irreversible-marker' => '$1*',
 
 # Groups
 'group' => 'Grup:',
 'group-user' => 'Karberi',
-'group-autoconfirmed' => 'Karberê ke otomatikmen tesdiq biy',
+'group-autoconfirmed' => 'Karbero ke xob xo biyê araşt',
 'group-bot' => 'Boti',
 'group-sysop' => 'İdarekari',
 'group-bureaucrat' => 'Burokrati',
@@ -1138,21 +1464,21 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'group-all' => '(pêro)',
 
 'group-user-member' => '{{GENDER:$1|karber}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|Karbero ke otomotik tesdiq biyo}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Karbero ke xob xo biyê araşt}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|İdarekar}}',
 'group-bureaucrat-member' => '{{GENDER:$1|buroqrat}}',
 'group-suppress-member' => '{{GENDER:$1|Temaşekar}}',
 
 'grouppage-user' => '{{ns:project}}:Karberi',
-'grouppage-autoconfirmed' => '{{ns:project}}: karberê tesdiqbiyaey',
+'grouppage-autoconfirmed' => '{{ns:project}}:Karbero ke xob xo biyê araşt',
 'grouppage-bot' => '{{ns:project}}:Boti',
 'grouppage-sysop' => '{{ns:project}}:İdarekeri',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
 'grouppage-suppress' => '{{ns:project}}:Kontrol',
 
 # Rights
-'right-read' => 'Pele bıwane',
+'right-read' => 'Pelan bıwanê',
 'right-edit' => 'Pele bıvurne',
 'right-createpage' => 'Pele vıraze (pelê ke ê werênayışi niyê)',
 'right-createtalk' => 'Pela werênayışi vıraze',
@@ -1168,7 +1494,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-reupload-own' => 'Dosyeyê ke to bar kerdi, inan sero bınuse',
 'right-reupload-shared' => 'Dosyeyê ke ambarê medyao barekerde de, inan mehelli wedare',
 'right-upload_by_url' => 'Yew URL ra dosyan bar bıke',
-'right-purge' => 'Seba yew pela ke tesdiq nêbiya, viria (cache) keypele pak bıke',
+'right-purge' => 'Verde ju pela araşt kerdışi hafızay sita besterne',
 'right-autoconfirmed' => 'Pelanê ke nême kılit biyê, inan bıvurne',
 'right-bot' => 'Zey yew karê xoserkerdey be',
 'right-nominornewtalk' => 'Pelanê werênayışan rê vurnayışê qıckeki çıniyê, qutiya mesacanê newiyan bıgurene',
@@ -1182,7 +1508,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-browsearchive' => 'Bıgeyre pelanê eserıtiyan',
 'right-undelete' => 'Jû pela esterıtiye peyser bia',
 'right-suppressrevision' => 'İdarekeran ra dızdeni/miyanki, newede vurnayışan de qayt ke u newede vıraze',
-'right-suppressionlog' => 'Loganê xasan bıvêne',
+'right-suppressionlog' => 'Rocekanê xasan bıvêne',
 'right-block' => 'Karberanê binan karê vurnayışi ra bloke bıke',
 'right-blockemail' => 'Yew karberê erşawıtışê/rıştena e-maili ra bloke bıke',
 'right-hideuser' => 'Yew namey karberi  şari ra dızdeni/miyanki bloke bıke',
@@ -1210,15 +1536,17 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-siteadmin' => 'Database kilit bike u a bike',
 'right-override-export-depth' => 'Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike',
 'right-sendemail' => 'Karberanê binî ra e-mail bişirav',
+'right-passwordreset' => 'E-postayanê parola reset kerdışa vineno',
 
 # User rights log
 'rightslog' => 'Qeydê heqanê karberi',
 'rightslogtext' => 'Ena listeyê loganê ke heqqa karbaranî mucneno.',
 'rightslogentry' => 'eza biyayişê grupî $1 ra $2 rê $3î bivurne',
+'rightslogentry-autopromote' => '$2 otomatikmen gırdkerdışi ra kerd $3.',
 'rightsnone' => '(çino)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'ena pele bıwane',
+'action-read' => 'ena pela wanayış',
 'action-edit' => 'ena pela bıvurnê',
 'action-createpage' => 'pelan bıvıraze',
 'action-createtalk' => 'pelanê werênayışi bıvıraze',
@@ -1242,6 +1570,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-suppressionlog' => 'ena logê xasî bivîne',
 'action-block' => 'enê karberi vurnayışi ra bıreyne',
 'action-protect' => 'seviyeyê pawitişî se ena pele bivurne',
+'action-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
 'action-import' => 'ena pele yewna wîkî ra import bike',
 'action-importupload' => 'ena pele yew dosyayê bar kerdişî ra import bike',
 'action-patrol' => 'vurnayîşê karberanê binî nişan bike patrol biye',
@@ -1251,37 +1580,40 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-userrights' => 'heqqa karberanê hemî bivurne',
 'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
 'action-siteadmin' => 'database kilit bike ya zi a bike',
+'action-sendemail' => 'e-posta bırşe',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|vurnayış|vurnayışan}}',
+'nchanges' => '$1 {{PLURAL:$1|fın vurna|fıni vurna}}',
 'recentchanges' => 'Vurnayışê peyêni',
 'recentchanges-legend' => 'Tercihê vurnayışanê peniyan',
-'recentchangestext' => 'eno pele de ser wîkî de vurnayîşî penîyî teqib bike',
+'recentchanges-summary' => 'Ena pele de wiki sero vurnayışê peyêni teqib ke',
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
-'recentchanges-label-newpage' => 'Ena edît yew pela newî viraşt',
+'recentchanges-label-newpage' => 'Enê vurnayışi pelaya newi vıraşt',
 'recentchanges-label-minor' => 'Eno yew edîto qickek o',
 'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
 'recentchanges-label-unpatrolled' => 'Eno edît patrol nibiyo',
 'rcnote' => "Bıni dı {{PLURAL:$1|is '''1''' vurnayış|peni '''$1''' vurnayışan estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetani $5, $4.",
 'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
 'rclistfrom' => '$1 ra vurnayışanê neweyan bımoc',
-'rcshowhideminor' => '$1 vurnayışê qıçan',
-'rcshowhidebots' => '$1 botan',
-'rcshowhideliu' => '$1 karberanê kewti',
-'rcshowhideanons' => '$1 karberano anonomiyan',
+'rcshowhideminor' => 'Vurnayışanê werdiya $1',
+'rcshowhidebots' => 'Bota $1',
+'rcshowhideliu' => 'karberanê qeydına $1',
+'rcshowhideanons' => 'karberanê anoniman $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
-'rcshowhidemine' => '$1 nuştışanê mı',
-'rclinks' => 'bımoc $1 vurnayışi $2 roci dı<br />$3',
+'rcshowhidemine' => 'nuştışanê mı $1',
+'rclinks' => 'Peyni $2 rocan de vurnayışa $1  bımocne <br />$3',
 'diff' => 'ferq',
-'hist' => 'ver',
+'hist' => 'verên',
 'hide' => 'Bınımne',
 'show' => 'Bımocne',
-'minoreditletter' => 'q',
+'minoreditletter' => 'werdı',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
+'unpatrolledletter' => '!',
 'number_of_watching_users_pageview' => '[$1 ho seyr keno {{PLURAL:$1|karber|karberî}}]',
 'rc_categories' => 'Kategoriyanî rê limît bike (pê "|" ciya bike)',
 'rc_categories_any' => 'Her yew',
+'rc-change-size' => '$1',
 'rc-change-size-new' => 'Vurnayışa dıma $1 {{PLURAL:$1|bayt|bayt}}',
 'newsectionsummary' => '/* $1 */ qısımo newe',
 'rc-enhanced-expand' => 'detayan bımoc (requires JavaScript)',
@@ -1326,16 +1658,17 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
 'uploadlogpage' => 'Cıkewtışê bar-kerdışi',
 'uploadlogpagetext' => 'cêr de [[Special:NewFiles|listeyê dosyayan]] estî.',
 'filename' => 'Namey Dosya',
-'filedesc' => 'qisse',
-'fileuploadsummary' => 'qisse:',
+'filedesc' => 'Xulasa',
+'fileuploadsummary' => 'Xulasa:',
 'filereuploadsummary' => 'Vurnayîşê dosyayî:',
-'filestatus' => 'statuyê copyrightî',
-'filesource' => 'Çımey:',
+'filestatus' => 'Weziyetê heqê telifiye:',
+'filesource' => 'Çıme:',
 'uploadedfiles' => 'Dosyayê ke bar biye',
 'ignorewarning' => 'Îkazi kebul meke u dosya reyna bar bike',
 'ignorewarnings' => 'Îkazi kebul meke',
 'minlength1' => 'Nameyanê dosyayî de gani bî ezamî yew herf est biyê.',
 'illegalfilename' => '"$1" no nameyê dosya de tayê karakteri nêşuxulyenî. newe ra tesel bıkerê',
+'filename-toolong' => 'Nameyê dosyayan 240 bayt ra derg do nêbo.',
 'badfilename' => "Nameyanê dosyayî ''$1'' rê vurneyî biye.",
 'filetype-mime-mismatch' => 'Derg kerdıştê Dosyada ".$1" u ($2) MIME tipiya cıya pêro nina.',
 'filetype-badmime' => 'Dosyaye ke tipê MIME "$1"î de bar nibeno.',
@@ -1343,12 +1676,12 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
 'filetype-unwanted-type' => "'''\".\$1\"''' na tewırê dosyayi nêwazyena. pêşniyaz biyaye {{PLURAL:\$3|tewırê dosyayi|tewırê dosyayi}} \$2.",
 'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena|Ena babeta dosya qebul ne vinena}}. Eke cırê izin deyayo $2. {{PLURAL:$3|Babatan dosyayan|babeta dosyayan}}',
 'filetype-missing' => 'Ena dosya de extention (ze ".jpg") çini yo.',
-'empty-file' => 'Dosya ke ti şawit veng biy.',
-'file-too-large' => 'Dosya ke ti şawit zaf gird biy.',
+'empty-file' => 'Dosyaya ke şıma rışta venga.',
+'file-too-large' => 'Dosyaye ke şıma rışta zaf gırda.',
 'filename-tooshort' => 'Namayê dosyayi zaf kilm a.',
 'filetype-banned' => 'Tipê ena dosya qedexe biya.',
 'verification-error' => 'Ena dosya taramayê dosyayi temam nikena.',
-'hookaborted' => 'Vurnayişê tu ke ti deneme kerd pê yew extensiyon ra iptal biya.',
+'hookaborted' => 'Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.',
 'illegal-filename' => 'Ena nameyê dosyayi kebul nibena.',
 'overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
 'unknown-error' => 'Yew xeteyê nizanyeni biya.',
@@ -1358,6 +1691,7 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
 gırdîyê na dosyayi $2.',
 'largefileserver' => 'Ena dosya zaf girde ke server kebul nikeno.',
 'emptyfile' => 'dosya ya ke şıma bar kerda veng asena, nameyê dosyayi şaş nusyaya belka.',
+'windows-nonascii-filename' => 'Na wiki namen de dosyayan de xısusi karaxtera karkerdışa peşti nêdana.',
 'fileexists' => "no name de yew dosya ca ra esta.
 Eke şıma emin niyê bıvurni bıewne na dosya'''<tt>[[:$1]]</tt>'''
 [[$1|thumb]]",
@@ -1391,9 +1725,11 @@ Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani q
 'php-uploaddisabledtext' => 'barkerdışê dosyayê PHP nıka çino. kerem kere eyarê file_uploads korol bıkerê.',
 'uploadscripted' => 'Ena dosya de yew HTML ya zi kodê scriptî este ke belki browserê webî fam nikeno.',
 'uploadvirus' => 'Ena dosya de yew virus estê: Qe detayan: $1',
+'uploadjava' => 'Dosya, zerre de cıdı jew Java .class dosyaya ZIP esta.
+Dosyayn de Java barkerdışi rê icazet nêdeyê, çıkı emeleya merduman nêbena.',
 'upload-source' => 'Dosyayê henî',
 'sourcefilename' => 'Nameyê dosyaye çimeyî',
-'sourceurl' => 'URLê henî',
+'sourceurl' => "URL'yê Çımi",
 'destfilename' => 'Destînasyonê nameyêdosya',
 'upload-maxfilesize' => 'Ebatêî dosya tewr girdî: $1',
 'upload-description' => 'Deskripsiyonê dosyayî',
@@ -1402,11 +1738,26 @@ Semedê ancia barkerdışi dewamkerdış ra ver tarixê esterışê dosya gani q
 'filewasdeleted' => 'no name de yew dosya yew wexto nızdi de bar biya u dıma zi serkaran hewn a kerdo. wexya ke şıma dosya bar keni bıewnê no pel $1.',
 'filename-bad-prefix' => "name yo ke şıma bar keni zey nameyê kamerayê dijital î, pê ney '''\"\$1\"''' destpêkeno .
 kerem kere yewna nameyo eşkera bıvicinê.",
+'filename-prefix-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Syntax is as follows:
+#   * Everything from a "#" character to the end of the line is a comment
+#   * Every non-blank line is a prefix for typical file names assigned automatically by digital cameras
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # some mobile phones
+IMG # generic
+JD # Jenoptik
+MGP # Pentax
+PICT # misc.
+ #</pre> <!-- leave this line exactly as it is -->',
 'upload-success-subj' => 'bar biyo',
 'upload-success-msg' => '[$2] barkerdışê şıma qebul bı. Barkerdışê şımayo itado: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Problem bar bike',
 'upload-failure-msg' => '[$1] delal: $2 ra barkerdıştê şıman ra jew xelat vıcyayo.',
 'upload-warning-subj' => 'İqazê barkerdışi',
+'upload-warning-msg' => 'Barkerdış dê [$2] de xırabey vıcyê. Xırabi timar kerdışi re  peyser şırê  [[Special:Upload/stash/$1|heruna barkerdışi]].',
 
 'upload-proto-error' => 'Porotokol raşt ni yo.',
 'upload-proto-error-text' => 'Bar kerdişê durî gani  URLî estbiye ke pe <code>http://</code> ya zi <code>ftp://</code> başli beno.',
@@ -1420,17 +1771,65 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'upload-too-many-redirects' => 'Eno URL de zaf redireksiyonî esto.',
 'upload-unknown-size' => 'Ebat nizanyeno',
 'upload-http-error' => 'Yew ğeletê HTTPî biyo: $1',
+'upload-copy-upload-invalid-domain' => 'Na domain ra kopyayê barkerdışanê nêbenê.',
 
 # File backend
+'backend-fail-stream' => '$1 nê vırazeyê',
+'backend-fail-backup' => '$1 nê wendeyê',
+'backend-fail-notexists' => '$1 name dı dosya çına.',
+'backend-fail-hashes' => 'Şınasiya dosyaya gırotışê cı nêgêriya.',
+'backend-fail-notsame' => 'Zey $1 ju dosya xora  esta.',
+'backend-fail-invalidpath' => '$1 rayê da depo kerdışa raştay niya.',
+'backend-fail-delete' => '$1 nê besterneyê',
+'backend-fail-alreadyexists' => "Dosyay $1'ya nêwanêna",
 'backend-fail-store' => '$1 ra $2 berdışo nê wanêno',
 'backend-fail-copy' => '$1 ra $2 kopya kerdışena dosyayo nêbeno',
 'backend-fail-move' => '$1 ra $2 berdışo nê wanêno',
 'backend-fail-opentemp' => 'Teferruatê dosyayo nêwanêno',
+'backend-fail-writetemp' => 'Dosyaya idari nênusneyê.',
+'backend-fail-closetemp' => 'Dosyaya idari nêracneyê',
 'backend-fail-read' => 'Na "$1" dosya nê wanêna',
-'backend-fail-create' => '$1 nê vırazêna',
+'backend-fail-create' => 'Dosyay $1 nê vırazıyê',
+'backend-fail-maxsize' => 'Dosyay $1 aya nênusneyêna feqet gırdeya cı {{PLURAL:$2|bayta|$2 bayto}}',
+'backend-fail-readonly' => 'Depo kerdışê "$1" enewke salt wanêno.Sebebê cı zi:"\'\'$2\'\'"',
+'backend-fail-synced' => 'Dosyay " $1 " miyan de depo kerdışeyda cıdı pê nêtepıştey esta',
+'backend-fail-connect' => 'Depo kerdışê "$1" peyni de nêgrêdeya.',
+'backend-fail-internal' => 'Depo kerdışê "$1" peyni de ju xırabin vıcyê.',
+'backend-fail-contenttype' => 'Qandê depo kerdışi zerrey babeta dosya da "$1" nêvineya.',
+'backend-fail-batchsize' => 'Depo kerdışê  dosya da $1 {{PLURAL:$1|operasyon de|operasyonê}} cı groto; sinorê  {{PLURAL:$2|operasyoni|operasyona}} $2.',
+'backend-fail-usable' => 'Dosyay $1 nênusneyê çıkı ratnayışê cı racnayeyo yana kewmiyo.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Depo kerdış de "$1" qande malumatê gurweynayışi cıya irtibat nêkewiya.',
+'filejournal-fail-dbquery' => 'Depo kerdış de "$1" qande malumatê gurweynayışi cıyo nêbeno.',
+
+# Lock manager
+'lockmanager-notlocked' => 'Dosyay "$1" kılit nêbiya; kesi kılit nêkerda.',
+'lockmanager-fail-closelock' => 'Dosyay kıliti nêracneyê "$1".',
+'lockmanager-fail-deletelock' => 'Dosyay kıliti nêbesterneyê "$1".',
+'lockmanager-fail-acquirelock' => 'Kılitê cı nêgêriya "$1".',
+'lockmanager-fail-openlock' => 'Dosyay kıliti nêracneyê qandê "$1".',
+'lockmanager-fail-releaselock' => 'Dosyay kıliti nêvıradeyê "$1".',
+'lockmanager-fail-db-bucket' => 'Kılite malumat da sitıl de $1 irtibat kewtışi re bes nêkeno.',
+'lockmanager-fail-db-release' => 'Malumatê kıliti nêvıradeyê $1.',
+'lockmanager-fail-svr-release' => 'Wasterê kıliti nêvıradeyê $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Dosya ZIP kontrol kerdışi re akerdin de jew xırabin amê.',
+'zip-wrong-format' => "Dosyaya ke nışan biya dosyay ZIP'i niya.",
+'zip-bad' => 'Dosya xırabiya yana zewbi sebeb ra ZIP dosyaya nêwanêna.
+Kontrolê emeleyey oyo veş nêbeno.',
+'zip-unsupported' => 'Dosya MediaWiki ra ZIP dosyaya nêwanêna yana derganiya ZIP de cı aya pıro nina. Kontrolê emeleyey oyo veş nêbeno.',
 
 # Special:UploadStash
 'uploadstash' => 'Nımıtışê barkerdışi',
+'uploadstash-summary' => "Na pela barkerdış (yana hewna barbenayış dı) hema hewna wiki'dedosyeyê ke nêpêseryayê enarê rasayış gre danop. Enê dosyay o ke a dosya keno bar tek o şena a dosya bıvino.",
+'uploadstash-clear' => 'Dosyeyê ke idareten bıvıryê ena besternê',
+'uploadstash-nofiles' => 'Dosyeyê ke idareten bıvıryê çınyê.',
+'uploadstash-badtoken' => 'Karkerdışê cı nêbı, muhtemelen desture şımayê timarkerdışi zeman do şıma ravêrdo. Fına bıcerbnê.',
+'uploadstash-errclear' => 'Besternayışê dosyayan nêbı',
+'uploadstash-refresh' => 'Listanê dosyayan aneweke',
+'invalid-chunk-offset' => 'Ofseto nêravyarde',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Cıkewtış red biyo',
@@ -1449,6 +1848,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization Selahiyetê resımi b
 no wiki bı umumi eyar biyo.
 qey pawıtışi, img_auth.php battal verdiyayo.",
 'img-auth-noread' => 'Heqqa karberanî çino ke "$1" biwendi',
+'img-auth-bad-query-string' => "URL'dı ratnayışo nêravêrde esto.",
 
 # HTTP errors
 'http-invalid-url' => 'URL raşt niya: $1',
@@ -1482,16 +1882,16 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'imgfile' => 'dosya',
 'listfiles' => 'Lista Dosya',
 'listfiles_thumb' => 'Resmo qıckek',
-'listfiles_date' => 'Tarix',
+'listfiles_date' => 'Deme',
 'listfiles_name' => 'Name',
 'listfiles_user' => 'Karber',
-'listfiles_size' => 'Ebat',
+'listfiles_size' => 'Gırdiye',
 'listfiles_description' => 'Vatiş/deskripsiyon',
 'listfiles_count' => 'Versiyoni',
 
 # File description page
 'file-anchor-link' => 'Dosya',
-'filehist' => 'Tarixê dosya',
+'filehist' => 'Ravêrdê dosya',
 'filehist-help' => 'Klik bık ser yew tarih u aye tarih dı versionê dosya bıvin.',
 'filehist-deleteall' => 'hemî biestere',
 'filehist-deleteone' => 'bıestere',
@@ -1504,10 +1904,10 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'filehist-user' => 'Karber',
 'filehist-dimensions' => 'Dimensiyoni',
 'filehist-filesize' => 'Ebatê dosyayî',
-'filehist-comment' => 'Rexne',
+'filehist-comment' => 'Vatış',
 'filehist-missing' => 'Dosya nieseno',
 'imagelinks' => 'Gurenayışê dosya',
-'linkstoimage' => 'Ena {{PLURAL:$1|pelge şın|$1 pelgayan şın}} ena dosya:',
+'linkstoimage' => 'Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:',
 'linkstoimage-more' => '$1 ra ziyed {{PLURAL:$1|pel|pel}} re gırey dano.
 listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocnena.
 [[Special:WhatLinksHere/$2|pêroyê liste]] mevcud o.',
@@ -1518,11 +1918,17 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'sharedupload' => 'Ena dosya $1 ra u belki projeyê binan dı hewitiyeno.',
 'sharedupload-desc-there' => 'depoyê $1 u projeyê bini na dosyayi xebıtneni. qey teferruati bıewnê [$2 teferruati dosyayi].',
 'sharedupload-desc-here' => 'depoyê $1 u projeyê bini na dosyayi xebıtneni. qey teferruati bıewnê [$2 teferruati dosyayi].',
+'sharedupload-desc-edit' => 'Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.
+Şıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].',
+'sharedupload-desc-create' => 'Na dosya $1 proceyan dê binandı ke şeno bıgurweyno.
+Şıma qayılê ke malumatê cı bıvurnê se şıre [pela da $2 ].',
 'filepage-nofile' => 'Ena name de dosya çin o.',
 'filepage-nofile-link' => 'Ena name de dosya çin o. Feqet ti eşkeno [$1 bar bike].',
 'uploadnewversion-linktext' => 'Versiyonê newiyerê ena dosya bar ke',
 'shared-repo-from' => '$1 ra',
 'shared-repo' => 'yew embarê repositoryî',
+'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
+'filepage.css' => '/* CSS placed here is included on the file description page, also included on foreign client wikis */',
 
 # File reversion
 'filerevert' => '$1 reyna biyere',
@@ -1552,6 +1958,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 ** Çift/dosyaya kopyayın',
 'filedelete-edit-reasonlist' => 'Sebebê esterayîşî bivurne',
 'filedelete-maintenance' => 'Esterayîş u resterasyonê dosyayî wextê texmirî de nibenê.',
+'filedelete-maintenance-title' => 'Dosyaya nêbesterneyêna',
 
 # MIME search
 'mimesearch' => 'MIME bigêre',
@@ -1563,10 +1970,10 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'unwatchedpages' => 'Pelanê seyrnibiyeyî',
 
 # List redirects
-'listredirects' => 'Listeyê redireksiyonî',
+'listredirects' => 'Listeya Hetenayışan',
 
 # Unused templates
-'unusedtemplates' => 'Templateyanê nihebitiyeno',
+'unusedtemplates' => 'Şablonê ke nê xebtênê',
 'unusedtemplatestext' => 'no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.',
 'unusedtemplateswlh' => 'linkanê binî',
 
@@ -1575,13 +1982,13 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'randompage-nopages' => 'Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.',
 
 # Random redirect
-'randomredirect' => 'Redereksiyonê randomî',
+'randomredirect' => 'Xoseri hetenayış',
 'randomredirect-nopages' => 'Ena cayênameyê "$1"î de redereksiyonî çin o.',
 
 # Statistics
 'statistics' => 'İstatistiki',
 'statistics-header-pages' => 'İstatistikê pele',
-'statistics-header-edits' => 'Îstatistiksê vurnayîşî',
+'statistics-header-edits' => 'Îstatistikê vurnayîşî',
 'statistics-header-views' => 'Îstatistiksê vînayîşî',
 'statistics-header-users' => 'Îstatistiksê karberî',
 'statistics-header-hooks' => 'Îstatistiksê binî',
@@ -1592,34 +1999,36 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-edits' => 'Amarê vurnayîşî ke wextê {{SITENAME}} ronayîşî ra',
 'statistics-edits-average' => 'Ser her pele de amarê vurnayîşîyê averageyî',
 'statistics-views-total' => 'Yekunî bivîne',
+'statistics-views-total-desc' => 'Peleyê ke çınyê yana xısusiyê e nina zerre nêkerdê',
 'statistics-views-peredit' => 'Ser her vurnayîşî de vînayîşî',
 'statistics-users' => 'Qeyd biye [[Special:ListUsers|karberî]]',
 'statistics-users-active' => 'Karberê aktifi',
 'statistics-users-active-desc' => '{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.',
 'statistics-mostpopular' => 'Pelayanê ke tewr zafî vînî biye',
 
-'disambiguations' => 'Pelayê ke maneyo bini rê grê danê',
+'disambiguations' => 'Pelayê ke maneyo bini rê gırey cı esto',
 'disambiguationspage' => 'Template:disambig',
 'disambiguations-text' => 'satıro ewwil de ke peli ca genî; gıreyê pelê ciya-manayi mocneni. İkinci sırada <br />tiya de [[MediaWiki:Disambiguationspage]] gani heme gıreyê şablonê ciya-manayan  re gıre bıdiyo',
 
-'doubleredirects' => 'redireksiyonê herdi',
+'doubleredirects' => 'Hetenayışê dıletıni',
 'doubleredirectstext' => 'no pel pelê ray motışani liste keno.
 gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 <del>serê ey nuşteyi</del> safi biye.',
 'double-redirect-fixed-move' => '[[$1]] kırışiya, hıni ray dana [[$2]] no pel',
+'double-redirect-fixed-maintenance' => 'raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno',
 'double-redirect-fixer' => 'Fixerî redirek bike',
 
-'brokenredirects' => 'Redireksiyonî ke hin nixebitiyeno',
+'brokenredirects' => 'Hetenayışê vengi',
 'brokenredirectstext' => 'Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:',
 'brokenredirects-edit' => 'bıvurne',
 'brokenredirects-delete' => 'bıestere',
 
-'withoutinterwiki' => 'Pelî ke bê linkanê ziwanî',
+'withoutinterwiki' => 'Peleyê ke zıwanan de bina re gırey cı çınyo',
 'withoutinterwiki-summary' => 'Enê pelî ke versiyonê ziwanî binî ra link nidano.',
-'withoutinterwiki-legend' => 'Prefiks',
+'withoutinterwiki-legend' => 'Verole',
 'withoutinterwiki-submit' => 'Bımocne',
 
-'fewestrevisions' => 'Pelî de ke revizyonê tayî estê',
+'fewestrevisions' => 'Peleyê ke cı sero tewr tayn timaryayış vıraziyayo',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayti}}',
@@ -1628,48 +2037,53 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
 'nviews' => '$1 {{PLURAL:$1|vînayîş|vînayîşî}}',
+'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
+'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
 'specialpage-empty' => 'Ser ena report netice çini yo.',
-'lonelypages' => 'Pelî ke yetim mend',
+'lonelypages' => 'Peleyê ke cı rê gıre nêdeyayo',
 'lonelypagestext' => 'Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.',
 'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
-'uncategorizedcategories' => 'Kategoriyanê ke kategorî nibiye',
-'uncategorizedimages' => 'Dosyayê ke kategorî nibiye',
-'uncategorizedtemplates' => 'Templateyê ke kategorî nibiye',
-'unusedcategories' => 'Kategoriyanê ke nihebitiyeno',
-'unusedimages' => 'Dosyayê ke nihebitiyeno',
+'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
+'uncategorizedimages' => 'Dosyayê ke bê kategorîyê',
+'uncategorizedtemplates' => 'Şablonê ke bê kategoriyê',
+'unusedcategories' => 'Kategoriyê ke nê xebtênê',
+'unusedimages' => 'Dosyeyê ke nê xebtênê',
 'popularpages' => 'Pelî ke populer o.',
-'wantedcategories' => 'Kategoriyî ke ganî estî bî.',
-'wantedpages' => 'Pelî ke ganî estî bî.',
+'wantedcategories' => 'Kategoriye ke waştênê',
+'wantedpages' => 'Peleye ke waştênê',
 'wantedpages-badtitle' => 'sernuşte meqbul niyo: $1',
-'wantedfiles' => 'Dosyayî ke ganî estî bî.',
-'wantedtemplates' => 'Templateyî ke ganî estî bî.',
+'wantedfiles' => 'Dosyeye ke waştênê',
+'wantedfiletext-cat' => 'Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].',
+'wantedfiletext-nocat' => 'Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>',
+'wantedtemplates' => 'Şablonê ke waştênê',
 'mostlinked' => 'Pelî ke tewr zafî lînk bîy.',
 'mostlinkedcategories' => 'Kategorî ke tewr zafî lînk bîy.',
-'mostlinkedtemplates' => 'Templateyî ke tewr zafî lînk bîy.',
+'mostlinkedtemplates' => 'Şablonê ke tewr zafî pela re gıre bîye.',
 'mostcategories' => 'Pelan ke tewr zaf kategorî estê.',
 'mostimages' => 'Dosyayan ke tewr zaf link estê.',
 'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
-'prefixindex' => 'Pelayanê hemi pe verbend',
-'shortpages' => 'Pelê kılmi',
-'longpages' => 'Pelê dergi',
+'prefixindex' => 'Veroleya peley pêro',
+'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
+'shortpages' => 'Peleyê kılmeki',
+'longpages' => 'Peleyê dergeki',
 'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
-'protectedpages' => 'Pelan ke kilit biya.',
+'protectedpages' => 'Pelayê ke biyê star',
 'protectedpages-indef' => 'têna pawıteyê bêmuddeti',
 'protectedpages-cascade' => 'Kilit biyaye ke teyna cascadiye',
 'protectedpagestext' => 'pelê cêrınî pawiyenê',
 'protectedpagesempty' => 'pê ney parametreyan pelê pawiteyi çinî',
-'protectedtitles' => 'sernuşteyê pawıteyi',
+'protectedtitles' => 'Sernameyê ke starênê',
 'protectedtitlestext' => 'sernameyê cêrıni pawıte yî',
 'protectedtitlesempty' => 'pê ney parametreyan sernuşteyê pawite çinê',
-'listusers' => 'Lista karberan',
+'listusers' => 'Listeyê Karberan',
 'listusers-editsonly' => 'Teyna karberan bimucne ke ey nuştê',
 'listusers-creationsort' => 'goreyê wextê vıraştışi rêz ker',
 'usereditcount' => '$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}',
 'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
 'newpages' => 'Pelê newey',
 'newpages-username' => 'Namey Karberi:',
-'ancientpages' => 'Pelê kıhanêri',
+'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
 'move' => 'bere',
 'movethispage' => 'Ena pele bere',
 'unusedimagestext' => 'Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.
@@ -1682,10 +2096,12 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 'pager-newer-n' => '{{PLURAL:$1|newiyer 1|newiyer $1}}',
 'pager-older-n' => '{{PLURAL:$1|Kıhanyer 1|Kıhanyer $1}}',
 'suppress' => 'Kontrol',
+'querypage-disabled' => 'Na pelaya xısusi,sebeb de performansi ra qefılneyê.',
 
 # Book sources
 'booksources' => 'Çımey kitaban',
 'booksources-search-legend' => 'Ser çımey kitaban bıgeyr',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Şo',
 'booksources-text' => 'listeya cêrıni, keyepelê kitap rotoxan o.',
 'booksources-invalid-isbn' => 'ISBN raşt nêasena bıewnê çımeyê orjinali, raşt kopya biya nê nêbiyaya?',
@@ -1693,24 +2109,25 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 # Special:Log
 'specialloguserlabel' => 'Weskedar:',
 'speciallogtitlelabel' => 'Menzil (sernuşte yana karber):',
-'log' => 'Logan',
+'log' => 'Qeydi',
 'all-logs-page' => 'Loganê umum yê hemî',
 'alllogstext' => 'qey {{SITENAME}}i mocnayişê heme rocaneyani.
 tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyna hessasiyê herfa pil u qıciyi) bıweçine u esayiş qıc kerê.',
 'logempty' => 'qaydi de weina yew malumat çino',
 'log-title-wildcard' => 'sername yê ke pê ney nuşteyi destkenêpê bıgêr.',
+'showhideselectedlogentries' => 'Qeydê weçinayışê bımocne/bınımne dekerê',
 
 # Special:AllPages
-'allpages' => 'Pelan hemi',
+'allpages' => 'Peli pêro',
 'alphaindexline' => '$1 ra $2ine',
-'nextpage' => 'Pela peyêne ($1)',
+'nextpage' => 'Pela badê cû ($1)',
 'prevpage' => 'Pela verêne ($1)',
 'allpagesfrom' => 'Pelanê ke be ena herfe dest pêkenê bımocne',
 'allpagesto' => 'Pelanê ke be ena herfe qediyenê bımocne:',
 'allarticles' => 'Peli pêro',
-'allinnamespace' => 'Pelanê hemî ($1 cayênameyî)',
+'allinnamespace' => 'Peli pênro ( $1 cayênameyî)',
 'allnotinnamespace' => 'Pelanê hemî ($1 cayênameyî de niyo)',
-'allpagesprev' => 'Eveli',
+'allpagesprev' => 'Verêni',
 'allpagesnext' => 'ver şo',
 'allpagessubmit' => 'Şo',
 'allpagesprefix' => 'herfê ke şıma tiya de nuşti, pê ney herfan pelê ke destpêkenê liste ker:',
@@ -1718,10 +2135,15 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 'allpages-bad-ns' => '{{SITENAME}} keyepel de wina "$1" yew nameyê cayi çino.',
 'allpages-hide-redirects' => 'Raçarnaya bınımne',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Şıma rê verhafıza versiyonê na pela aseno, hetana $1 cı kehani.',
+'cachedspecial-viewing-cached-ts' => 'Na pela raşt niya, şımayê enewke versiyonê verhafızada na pela vinenê.',
+'cachedspecial-refresh-now' => 'Peyêni bıvin.',
+
 # Special:Categories
 'categories' => 'Kategoriy',
 'categoriespagetext' => '{{PLURAL:$1|kategoriyê|kategoriyê}} cêrıni de pel u media esto.
-[[Special:UnusedCategories|kategori yê ke nêşuxulyeni]] tiya de nêmociyeni.
+[[Special:UnusedCategories|kategoriyê ke nê xebtênê]] tiya de nêmociyeni.
 hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 'categoriesfrom' => 'kategori yê ke pê ninan destpêkeno ramocın:',
 'special-categories-sort-count' => 'goreyê çendi rêz ker.',
@@ -1736,7 +2158,7 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 'linksearch' => 'Gıreyê teberi cı geyrê',
 'linksearch-pat' => 'bıgêr motif:',
 'linksearch-ns' => 'Cayênameyî:',
-'linksearch-ok' => 'Bigêre',
+'linksearch-ok' => 'Cı geyre',
 'linksearch-text' => 'joker ê zey "*.wikipedia.org"i karneno.<br />
 qaydeyê destek biyayeyi: <tt>$1</tt>',
 'linksearch-line' => '$1, $2 ra link biya',
@@ -1771,6 +2193,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'listgrouprights-rights' => 'Heqqî',
 'listgrouprights-helppage' => 'Help:Heqqanê gruban',
 'listgrouprights-members' => '(lista ezayan)',
+'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
+'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
 'listgrouprights-addgroup' => 'şıma eşkenî hesabê xo re {{PLURAL:$2|grub|gruban}} têare kerî: $1',
 'listgrouprights-removegroup' => 'şıma eşkenî hesabê xo ra {{PLURAL:$2|grub|gruban}} bıvecî: $1',
 'listgrouprights-addgroup-all' => 'şıma hesabê xo re heme gruban eşkeni têare bıkeri',
@@ -1795,12 +2219,13 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'noemailtext' => 'no/na karber yew e-postayo meqbul nêdawa/o',
 'nowikiemailtitle' => 'E-postayan re destur çino',
 'nowikiemailtext' => 'no/na karber/e, karberanê binani ra gırewtışê e-postayi tercih nêkerd.',
-'emailtarget' => 'Namey Qarqeri defiyê de.',
+'emailnotarget' => 'Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.',
+'emailtarget' => 'Namey Karberi defiyê de.',
 'emailusername' => 'Nameyê karberi:',
 'emailusernamesubmit' => 'Stare dı',
 'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
-'emailfrom' => 'Kam ra',
-'emailto' => 'Kam rê',
+'emailfrom' => 'Rışten:',
+'emailto' => 'Geren:',
 'emailsubject' => 'behs/mesela:',
 'emailmessage' => 'Mesaj',
 'emailsend' => 'bıerşawê/bıruşnê',
@@ -1813,16 +2238,17 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 # User Messenger
 'usermessage-summary' => 'Mesajê sistemi caverd.',
 'usermessage-editor' => 'Mesaj berdoxe sistemi',
+'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => 'lista mına seyr-kerdışi',
 'mywatchlist' => 'Lista mına seyrkerdışi',
-'watchlistfor2' => 'Semedê $1 ($2)',
+'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
 'watchnologin' => 'hesab akerde niyo',
 'watchnologintext' => 'qey vurnayişê listeya temaşakerdışi [[Special:UserLogin|gani şıma hesab akeri]].',
-'addwatch' => 'Listeyê seyr kerdişî xo mıyan ke',
+'addwatch' => 'Listeyê seyri deke',
 'addedwatchtext' => 'Ma pele "[[:$1]]" zerri [[Special:Watchlist|watchlist]]ê tı kerd de.
 Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem ma tu ri heber dun, zerri [[Special:RecentChanges|list of recent changes]] name pele beno qalın. Tı ri beno qolay çıta vurnaye biyo.',
 'removewatch' => 'Listedê mınê seyr kerdışi ra hewad',
@@ -1841,16 +2267,17 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 'watchmethod-list' => 'pel ê ke şıma temaşa kenî vuryayişê peyinê ey konrol beno',
 'watchlistcontains' => 'listeya seyrkerdışê şıma de $1 tene {{PLURAL:$1|peli|peli}} estî.',
 'iteminvalidname' => "pê no '$1' unsuri problem bı, nameyo nemeqbul...",
-'wlnote' => "Bıni dı {{PLURAL:$1|vurnayış|peyniya '''$1'''  dı vurnayışi estê}} {{PLURAL:$2|roci|'''$2''' roci}}, hetani $5, $4 esênê.",
-'wlshowlast' => 'bımoc $1 seat $2 rocan $3',
-'watchlist-options' => 'Tercihanê listey seyrkerdışi',
+'wlnote' => "$3 seate u bahde $4 deqa dıma {{PLURAL:$2|ju seate dı|'''$2''' ju seate dı}} {{PLURAL:$1|vurnayışe peyeni|vurnayışe '''$1''' peyeni}} cêrdeyê",
+'wlshowlast' => 'Peyni de vurnayışan ra  $1 seata u $2 roca $3 bımocnê',
+'watchlist-options' => 'Tercihê liste da seyri',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Seyr ke...',
 'unwatching' => 'Seyr meke...',
+'watcherrortext' => 'Sazanê listeda seyri vurnayış de pox ta "$1" xırabey vıcyê .',
 
 'enotif_mailer' => 'postaya xeberdayişi {{SITENAME}}',
-'enotif_reset' => 'heme pelan ziyaret kerde nişane bıker',
+'enotif_reset' => 'Pela pêro ziyaret kerde deye mor ke',
 'enotif_newpagetext' => 'Ena yew pela newî ya.',
 'enotif_impersonal_salutation' => '{{SITENAME}} karber',
 'changed' => 'vurniya',
@@ -1901,7 +2328,7 @@ Tı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi
 'actionfailed' => 'kar nêbı',
 'deletedtext' => '"$1" biya wedariya.
 Qe qeydê wedarnayışi, $2 bevinin.',
-'dellogpage' => 'Logê bıesterışi',
+'dellogpage' => 'Qeydê besternayışi',
 'dellogpagetext' => 'listeya cêrıni heme qaydê hewn a kerdeyan o.',
 'deletionlog' => 'qaydê hewnakerdışani',
 'reverted' => 'revizyono verin tepiya anciyayo',
@@ -1947,11 +2374,14 @@ kerem kerê "tepiya" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar
 Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .',
 'protectedarticle' => '"[[$1]]" kılit biyo',
 'modifiedarticleprotection' => 'Qe "[[$1]]", seviye kılit kerdişi vurnayi biyo',
-'unprotectedarticle' => 'pawıtış weradiya/wedariya: "[[$1]]"',
+'unprotectedarticle' => 'Starkerdışê "[[$1]]" hewadeya',
 'movedarticleprotection' => 'eyarê pawıtışi no "[[$2]]" peli ra kırışiya no "[[$1]]" peli',
 'protect-title' => 'qey "$1" yew seviyaya pawıtışi bıvıcinê',
+'protect-title-notallowed' => 'Star kerdış sewiyeyê "$1" bıvinê',
 'prot_1movedto2' => 'nameyê [[$1]] peli yo newe: [[$2]]',
-'protect-legend' => 'pawıtışi tesdiq bıker',
+'protect-badnamespace-title' => 'Heruna naman itad starêna',
+'protect-badnamespace-text' => 'Na herunda namide peley nêstarênê.',
+'protect-legend' => 'Pawıtışi araşt ke',
 'protectcomment' => 'Sebeb:',
 'protectexpiry' => 'Qediyeno:',
 'protect_expiry_invalid' => 'Demo qediyayışi raşt niyo.',
@@ -1996,9 +2426,9 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 
 # Restrictions (nouns)
 'restriction-edit' => 'Bıvurne',
-'restriction-move' => 'Bere',
+'restriction-move' => 'Ahûln',
 'restriction-create' => 'Viraze',
-'restriction-upload' => 'Bar bike',
+'restriction-upload' => 'Barke',
 
 # Restriction levels
 'restriction-level-sysop' => 'pawıtışê tamamîye',
@@ -2006,14 +2436,14 @@ Tı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken "cascading p
 'restriction-level-all' => 'seviye ya ke raşt ame',
 
 # Undelete
-'undelete' => 'pelê hewn a şiyayeyani ra mocın',
+'undelete' => 'Peleyê ke besterneyayê enê bımocnê',
 'undeletepage' => 'bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar',
 'undeletepagetitle' => "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
 'viewdeletedpage' => 'bıewn pelê hewn a şiyayeyani',
 'undeletepagetext' => '{{PLURAL:$1|pelo|$1 pelo}} cerın hewn a şiyo labele hema zi arşiv de yo u tepiya geriyeno.
 Arşiv daimi pak beno.',
 'undelete-fieldset-title' => 'revizyonan tepiya bar ker',
-'undeleteextrahelp' => "qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê.",
+'undeleteextrahelp' => "Qey ardışê pel u verê pelani tuşê '''tepiya biya!'''yi bıtıknê. qey ciya ciya ardışê verê pelani zi qutiye tesdiqi nişane kerê u tuşê '''tepiya biya!'''yi bıtıknê '''''{{int:undeletebtn}}'''''.. qey hewn a kerdışê qutiya tesdiqan u qey sıfır kerdışê cayê sebebani zi tuşê '''agêr caverd/aça ker'''i bıtıknê '''''{{int:undeletebtn}}'''''..",
 'undeleterevisions' => '$1 {{PLURAL:$1|revizyon|revizyon}} arşiw bi',
 'undeletehistory' => 'eke şıma pel tepiya biyari heme revizyonî zi tepiya yeni.
 eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, revizyonê o pelê verıni zerreyê no pel de aseno.',
@@ -2023,10 +2453,10 @@ eke yew pel hewn a biyo u pê nameyê o peli newe ra yew pel bıvıraziyo, reviz
 'undeleterevision-missing' => 'revizyonê nemeqbul u vindbiyayeyi.
 Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi şaş o.',
 'undelete-nodiff' => 'revizyonê verıni nidiya',
-'undeletebtn' => 'Restore bike',
+'undeletebtn' => 'Timar bike',
 'undeletelink' => 'bıvêne/peyser bia',
 'undeleteviewlink' => 'ra mocın',
-'undeletereset' => 'Sifir bike',
+'undeletereset' => 'Reset kerê',
 'undeleteinvert' => 'vicnayeyi qeldaye açarn',
 'undeletecomment' => 'Sebeb:',
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
@@ -2036,33 +2466,39 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 'undeletedpage' => "'''$1 pel tepiya anciya'''
 
 qey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
-'undelete-header' => 'qey vinayişê peli yê ke cıwa ver hewn a biyê: [[Special:Log/delete|qeydê hewn a kerdışi]].',
+'undelete-header' => 'Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].',
+'undelete-search-title' => 'Bıgeyre pelanê eserıtiyan',
 'undelete-search-box' => 'bıgêr pelê hewn a biyayeyani',
 'undelete-search-prefix' => 'pel ê ke pê ney destpêkenî, ramocın',
-'undelete-search-submit' => 'bigêre',
+'undelete-search-submit' => 'Cı geyre',
 'undelete-no-results' => 'Zerre arşîvê esterayîşî de peleyan match nibiyê.',
 'undelete-filename-mismatch' => 'Vurnayîşê ke pê wextê puli ye $1î nieşkenî biyare: nameyê dosyayî match nibeno',
 'undelete-bad-store-key' => 'Vurnayîşê ke pê wextê puli ye $1î nieşkenî biyare: verniyê esterayîşî de dosyayî vînî biya.',
 'undelete-cleanup-error' => 'Eka dosyayê arşîvî "$1"î ke ho wedariyeno feqet yew ğelet biya.',
 'undelete-missing-filearchive' => 'arşiwê IDyê yi dosyayi $1 tepiya niyeno çunke database de niyo.
 belka cıwa ver hewn a biyo..',
+'undelete-error' => 'Besternayışê peyd bıgi pela de xırabin vıcyê',
 'undelete-error-short' => 'Eka dosyayê biyereno feqet yew ğelet biya: $1',
 'undelete-error-long' => 'hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:
 
 $1',
 'undelete-show-file-confirm' => '"<nowiki>$1</nowiki>" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?',
-'undelete-show-file-submit' => 'Ya',
+'undelete-show-file-submit' => 'E',
+'undelete-revisionrow' => '$1 $2 $3 $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'Cayê namey:',
-'invert' => 'seleksiyon peyser biya',
+'invert' => 'Bê weçineni ê bina peyser biya',
+'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
+'namespace_association' => 'Pineyê cadê naman',
+'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 '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)',
+'mycontris' => 'İştıraqê mı',
+'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
 'uctop' => '(ser)',
 'month' => 'Aşm ra (u verniyer):',
@@ -2071,11 +2507,11 @@ $1',
 'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
 'sp-contributions-newbies-sub' => 'Qe hesebê newe',
 'sp-contributions-newbies-title' => 'Îştîrakê karberî ser hesabê neweyî',
-'sp-contributions-blocklog' => 'Cıkewtışê kılit-kerdışi',
+'sp-contributions-blocklog' => 'Qeydê kılit-kerdışi',
 'sp-contributions-deleted' => 'vurnayîşê karberî wedariyayê',
 'sp-contributions-uploads' => 'barkerdey',
-'sp-contributions-logs' => 'logî',
-'sp-contributions-talk' => 'werênayış',
+'sp-contributions-logs' => 'qeydi',
+'sp-contributions-talk' => 'mesac',
 'sp-contributions-userrights' => 'Îdarayê heqqanê karberan',
 'sp-contributions-blocked-notice' => 'verniyê no/na karber/e geriyayo/a
 qê referansi qeydê vernigrewtışi cêr de eşkera biyo:',
@@ -2088,22 +2524,22 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 
 # What links here
 'whatlinkshere' => 'Çı tiyay rê gırê beno',
-'whatlinkshere-title' => 'Peleyan gre biya "$1"',
+'whatlinkshere-title' => 'Peleye ke  "$1" re gre biyê',
 'whatlinkshere-page' => 'Pele:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
 'nolinkshere' => "Yew pel zi '''[[:$1]]''' rê link nibeno.",
 'nolinkshere-ns' => "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
 'isredirect' => 'pele redireksiyon',
-'istemplate' => 'transklusyon',
+'istemplate' => 'Çarnayışin',
 'isimage' => 'gıreyê dosya',
-'whatlinkshere-prev' => '{{PLURAL:$1|peni|peni $1}}',
+'whatlinkshere-prev' => '{{PLURAL:$1|veror|veror $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|verni|verni $1}}',
 'whatlinkshere-links' => '← gırey',
-'whatlinkshere-hideredirs' => '$1 redreksiyon',
-'whatlinkshere-hidetrans' => '$1 transklusyons',
+'whatlinkshere-hideredirs' => 'Hetekerdışa $1',
+'whatlinkshere-hidetrans' => 'Açarnayışê $1',
 'whatlinkshere-hidelinks' => '$1 greyan',
 'whatlinkshere-hideimages' => 'gireyê resimî $1',
-'whatlinkshere-filters' => 'Filtreyan',
+'whatlinkshere-filters' => 'Parzumi',
 
 # Block/unblock
 'autoblockid' => 'Otomatik vındarnayış #$1',
@@ -2125,6 +2561,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 ** Tehditwari hereket/Taciz
 ** yew ra ziyed hesaban xırab şuxulnayiş
 ** nameyê karberi yo ke meqbul niyo',
+'ipb-hardblock' => 'KArberê ke ena IP ra dekewte de wa vurnayış nêkerê',
 'ipbcreateaccount' => 'Hesab viraştişi blok bik',
 'ipbemailban' => 'Ena karber rê destur medî  ke ay e-mail neşiravî',
 'ipbenableautoblock' => 'verniyê IPadresa peyin ê no karberi u wexta ke vurnayişi kerd ê IPadresani otomotik bıger.',
@@ -2135,11 +2572,15 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipbotherreason' => 'Sebebê bini:',
 'ipbhidename' => 'Nameyê karberî listeyan u vurnayîşan ra binumne',
 'ipbwatchuser' => 'Pela miniqaşe u pela ena karberî seyr bike',
+'ipb-disableusertalk' => 'No karber wexto ke bloqedeyo wa pela da xodı vurnayış kerdışi rê izin medı',
 'ipb-change-block' => 'Pê ena ayaran, karberî reyna bloke bike',
+'ipb-confirm' => 'Bloke kerdışi tesdik ke',
 'badipaddress' => 'Adresê IPî raşt niyo',
 'blockipsuccesssub' => 'Blok biyo',
-'blockipsuccesstext' => 'verniyê [[Special:Contributions/$1|$1]] geriya.
-<br />qey çım ra viyarnayişê verni-grewtışi bıewnê[[Special:BlockList|Ê yê ke verniyê IPadresê inan geriyayê]].',
+'blockipsuccesstext' => 'Verniya [[Special:Contributions/$1|$1]] gêriyaya.
+<br />Qey çım ra viyarnayişê verni-grewtışi bewni [[Special:BlockList|Ê yê ke verniyê IP adresê cı gêriyaya]].',
+'ipb-blockingself' => 'Şımayê kenê ke xo bloke kerê! Şıma qayılye xo bloke kerê?',
+'ipb-confirmhideuser' => 'Wexto ke "karberi bınımnê" nışandeyo se şıma ye kenê karberi bloke kerê. No, Namey karberi lista pêron dı u dekewtışê rocekan dı aktiv bo.Şıma qayıli ney bıkerê?',
 'ipb-edit-dropdown' => 'Sebebê blokî bivurne',
 'ipb-unblock-addr' => '$1 a bik',
 'ipb-unblock' => 'Yew adresê IPî ya zi nameyê karberî blok bike',
@@ -2149,15 +2590,22 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'unblockiptext' => 'eke şıma qayili ê yê ke verniyê IPadesê inan geriyayê akeri formê cêrıni dekerê.',
 'ipusubmit' => 'Ena blok wedarne',
 'unblocked' => '[[User:$1|$1]] blok biyo',
+'unblocked-range' => "Blokey $1'i wederya",
 'unblocked-id' => 'Blokê $1î wedariyayo',
 'blocklist' => 'Karberê kılitbiyaey',
 'ipblocklist' => 'Karberê kılitbiyaey',
 'ipblocklist-legend' => 'Yew karberê blok biyaye bivîne',
+'blocklist-userblocks' => 'Wederneyanê hesaba bınımne',
+'blocklist-tempblocks' => 'Wederneyanê idaretan bınımne',
+'blocklist-addressblocks' => 'Nêverdışanê IP bınımne',
+'blocklist-rangeblocks' => 'Nêverdışanê gırda bınımne',
+'blocklist-timestamp' => 'İmzay demi',
 'blocklist-target' => 'Menzil',
 'blocklist-expiry' => 'Wahdey qedyayışi',
 'blocklist-by' => 'hizmetdarê blokê',
+'blocklist-params' => 'Parametreyê wedernayışi',
 'blocklist-reason' => 'Sebeb:',
-'ipblocklist-submit' => 'Bigêre',
+'ipblocklist-submit' => 'Cı geyre',
 'ipblocklist-localblock' => 'blokê mehelli',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|blokê|blokê}} bini',
 'infiniteblock' => 'ebedî',
@@ -2181,9 +2629,9 @@ Sebebê kılit-biyayışê $1\'i: "$2"o',
 'blocklog-showsuppresslog' => 'verniyê no/na karberi cıwa ver geriyayo/ya.',
 'blocklogentry' => '[[$1]] block kerd, hetani $2 $3',
 'reblock-logentry' => 'qey [[$1]]i tarixê qediyayişi $2 $3 pa ninan a eyarê ver-grewtışan vurna.',
-'blocklogtext' => 'No kuliyatê kılitkerdış u rakerdışê fealiyetê karberano.
-Adresê IPyê ke otomatikmen kılit biyê lista de çıniyê.
-Seba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kılitkerdışê IPy]] bıvênên.',
+'blocklogtext' => "No kuliyatê kılitkerdış u rakerdışê fealiyetê karberano.
+Adresê IP'ya ke otomatikmen kılit biyê lista de çıniya.
+Seba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kılitkerdışê IPy]] bıvinê.",
 'unblocklogentry' => '$1 ake',
 'block-log-flags-anononly' => 'teyna karberê anonîmî',
 'block-log-flags-nocreate' => 'akerdışê hesabi qapan bi',
@@ -2199,6 +2647,7 @@ Seba lista karberanê ke heta nıka kılit biyê [[Special:BlockList|lista kıli
 'ipb_already_blocked' => '"$1" zaten blok biya',
 'ipb-needreblock' => '$1 xora engel biyo. Tı wazenay eyaran bıvurnê?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Kılitkerdışo bin|Kılitkerdışê bini}}',
+'unblock-hideuser' => 'NAmeyê karberi nımneyayo qandê coy şıma nêşenê bloqey cı wedarnê.',
 'ipb_cant_unblock' => 'xeta: IDyê ver-grewtışi $1 nêesa/asa.
 belka ver-grewtış wedariyayo.',
 'ipb_blocked_as_range' => 'xeta: $1 verniyê IPadresi direk nêgeriyayo u ver-gırewtışi nêwedariyeno .
@@ -2210,6 +2659,7 @@ labele parçeya benateyê na $2 adresibi u ey ra ver-geryayo u şıma eşkeni no
 'proxyblocker-disabled' => 'Eno fonksiyon nêxebetiyeno.',
 'proxyblockreason' => 'IPadresa şıma yew proxyo akerdeyo u ey ra verniyê ey geriya.',
 'proxyblocksuccess' => 'Kar bi temam.',
+'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP adresa şıma, hetê no {{SITENAME}} keyepeli ra  DNSBL de proxy hesibyayo u liste biyo.',
 'sorbs_create_account_reason' => 'IP adresa şıma, hetê no translatewiki.net keyepeli ra DNSBL de proxy hesibyayo u liste biyo.
 
@@ -2230,7 +2680,7 @@ eke şıma ıney gure keni u şıma xo ra emini, taahhud bıde wexta gure şıma
 'unlockconfirm' => 'Ya, ez wazene database a bikeri.',
 'lockbtn' => 'Database kilit bik',
 'unlockbtn' => 'Database a bik',
-'locknoconfirm' => 'Å\9fıma qutiyê tesdiq kerdıÅ\9fi niÅ\9fane nıkerd',
+'locknoconfirm' => 'Å\9eıma qutiyê araÅ\9ft kerdıÅ\9fi nêweçinê.',
 'lockdbsuccesssub' => 'Database kilit biya',
 'unlockdbsuccesssub' => 'Database a biya',
 'lockdbsuccesstext' => 'database qefıliya.<br />
@@ -2255,6 +2705,18 @@ Tı nıeşkeni name yew pele reyna bıvurni.
 '''Teme!'''
 Ena transfer ser peleyanê populari zaf muhumo;
 Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
+'movepagetext-noredirectfixer' => "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.
+Ma nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.
+Tı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.
+Eg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|raçarnayışo dılet]] ya zi [[Special:BrokenRedirects|raçarnayışo xırab]]i qontrol bıke.
+Tı gani qontrol bıki eg gıreyan şıno peleyanê raşti.
+
+Teme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.
+Tı nıeşkeni name yew pele reyna bıvurni.
+
+'''İkaz!'''
+Ena transfer ser peleyanê populari zaf muhumo;
+Ma tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
 'movepagetalktext' => "Ma peleyê mınaqeşeyê ena pele otomatik beno, '''ma nıeşken ber, eg:'''
 *Yew peleyê mınaqeşeyê ser ena name rona esto, ya zi
 *Tı quti check nıkerd.
@@ -2307,6 +2769,7 @@ Yewna name bınus.',
 'immobile-source-page' => 'nameyê no peli nêvuriyeno',
 'immobile-target-page' => 'sernameyê no hedefi re nêkırışiyeno',
 'imagenocrossnamespace' => 'Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno',
+'nonfile-cannot-move-to-file' => 'Ekê dosya niyê, cade namande dosyaya nêahulneyênê',
 'imagetypemismatch' => 'tipa dosyaya neweyi re pênêgıneno/nêgıneno pê',
 'imageinvalidfilename' => 'nameyê dosyayi ya hedefi meqbul niyo.',
 'fix-double-redirects' => 'rayberdış ê ke sernameyê orjinali re işaret keni rocane bıker.',
@@ -2321,16 +2784,18 @@ Wexta ke şıma no pel vurneni diqet bıkeri, loge bivini:",
 Ma rica keno yewna sername binuse.',
 
 # Export
-'export' => 'Pelan export bık',
+'export' => 'Pela ateber dı',
 'exporttext' => 'şıma yew pelê nişanebiyayeyi, nuşteyê taqımê pelani, pê pêşteyê XMLi eşkeni bıdi teberi.
 wiki yo ke wikimedya xebıtneno, pê [[Special:Import|pelê zerre dayişê]] no wikiyi beno.
 
 şıma eşkeni yew gırey bıerzi,
 ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].',
+'exportall' => 'Pela Pêron ateberdı',
 'exportcuronly' => 'têna revizyonê peyin bıger',
 'exportnohistory' => "----
 '''Not:''' pê no form teberdayişê verê (tarix) pelan battal biyo",
-'export-submit' => 'bıkırış',
+'exportlistauthors' => 'zerre de qandê her pela listey iştiraxkara esto',
+'export-submit' => 'Teber de',
 'export-addcattext' => 'kategoriya cerıni ra maddeyan têare ker',
 'export-addcat' => 'têare ker',
 'export-addnstext' => 'pelan cayê nameyan ra têare ker',
@@ -2340,21 +2805,21 @@ 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',
+'allmessagescurrent' => 'nuşte yo ke Karyayo',
 'allmessagestext' => 'na liste, listeya mesajê cayê nameyê wikimedya yo.
 eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê [//www.mediawiki.org/wiki/Localisation mahalli kerdışê wikimedyayi] u [//translatewiki.net translatewiki.net] ziyaret bıkerê.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' qefelnaye yo u ey ra '''{{ns:special}}:Allmessages''' karkerdışi re akerde niyo.",
 'allmessages-filter-legend' => 'Filitre',
 'allmessages-filter' => 'goreyê xususi kerdışi re filtre bıker',
 'allmessages-filter-unmodified' => 'Nivurnaye',
-'allmessages-filter-all' => 'Heme/pêro',
+'allmessages-filter-all' => 'Pêro',
 'allmessages-filter-modified' => 'Vurnaye',
 'allmessages-prefix' => 'pê prefiks filtre bıker',
 'allmessages-language' => 'Ziwan:',
-'allmessages-filter-submit' => 'Şi',
+'allmessages-filter-submit' => 'Şo',
 
 # Thumbnails
 'thumbnail-more' => 'Gırd ke',
@@ -2362,6 +2827,8 @@ eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê
 'thumbnail_error' => 'Thumbnail niviraziya: $1',
 'djvu_page_error' => 'pelê DjVuyi bêşumulo',
 'djvu_no_xml' => 'Qe DjVu nieşkenî XML fetch bikî',
+'thumbnail-temp-create' => 'İdare dosyay resimiya nêvırazêna',
+'thumbnail-dest-create' => 'Resimo werdiyo keyd nêbeno',
 'thumbnail_invalid_params' => 'Parametreya thumbnailî raşt niyşê',
 'thumbnail_dest_directory' => 'Nieşkenî direktorê destinasyonî virazî',
 'thumbnail_image-type' => 'Tipê resimî kebul nibeno',
@@ -2408,6 +2875,11 @@ dosyaya emaneti vindbiyo',
 'import-upload' => 'Dosyayê XML bar bike',
 'import-token-mismatch' => "vindibiyayişê ma'lumatê hesabi. kerem kerê newe ra tesel/cereb bıkerê.",
 'import-invalid-interwiki' => 'Eya wîkî ra nieşkenî împort bike.',
+'import-error-edit' => 'Pela " $1 " qandê vurnayışi aya nêgêrêna çıkı cı rê icazet nêdeyayo.',
+'import-error-create' => 'Pela " $1 " qandê vıraştışi aya nêabêna çıkı cı rê icazet nêdeyayo.',
+'import-error-interwiki' => 'Pela " $1 " qandê name dayışi aya nêgêrêna çıkı namey cı (interwiki) sero cırê ca abıryayo.',
+'import-error-special' => 'Pela " $1 " qandê vıraştışi aya nêgêrêna çıkı namay cı nameyo do xısusiyo u na pela rê no name nêgêrêno.',
+'import-error-invalid' => 'Pela "$1" nêdebyê de çıkı namey cı çınyo.',
 
 # Import log
 'importlogpage' => 'Logê împortî',
@@ -2417,8 +2889,19 @@ dosyaya emaneti vindbiyo',
 'import-logentry-interwiki' => '$1 transwiki biyo',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra',
 
+# JavaScriptTest
+'javascripttest' => 'Cerbnayışê JavaScripti',
+'javascripttest-disabled' => 'Na kerdin, na wiki sero aktiv nêbiya.',
+'javascripttest-title' => 'Testê $1 gurweyênê',
+'javascripttest-pagetext-noframework' => 'Na pela testanê JavaScripta gurweynayışi re abıryaya.',
+'javascripttest-pagetext-unknownframework' => 'Çerçeweyê "$1" cerbnayışi xırabo.',
+'javascripttest-pagetext-frameworks' => 'Şıma ra reca xorê cêr ra test weçinê:$1',
+'javascripttest-pagetext-skins' => 'Testa akarfinayışi rê verqayt:',
+'javascripttest-qunit-intro' => 'Mediawiki.org dı [dokumanê $1] bıvinê.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
+
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Pela ya Qarberi',
+'tooltip-pt-userpage' => 'Pelaya karberi',
 'tooltip-pt-anonuserpage' => 'pelê karberê IPyi',
 'tooltip-pt-mytalk' => 'Pela ya Qıse vatışi',
 'tooltip-pt-anontalk' => 'vurnayiş ê ke no Ipadresi ra biyo muneqeşa bıker',
@@ -2427,8 +2910,8 @@ dosyaya emaneti vindbiyo',
 'tooltip-pt-mycontris' => 'Lista iştırakanê to',
 'tooltip-pt-login' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
 'tooltip-pt-anonlogin' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
-'tooltip-pt-logout' => 'Veciye',
-'tooltip-ca-talk' => 'Pela tedeesteyan sero werênayış',
+'tooltip-pt-logout' => 'Bıveciyên',
+'tooltip-ca-talk' => 'Zerrey pela sero werênayış',
 'tooltip-ca-edit' => 'Tı şenay na pele bıvurnê.
 Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-ca-addsection' => 'Yew qısımo newe ake',
@@ -2437,7 +2920,7 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 Çımey ena pele bıvin',
 'tooltip-ca-history' => 'Versiyonê verênê ena pele',
 'tooltip-ca-protect' => 'Ena pele kılit ke',
-'tooltip-ca-unprotect' => 'Ena pele a bike',
+'tooltip-ca-unprotect' => 'Starkerdışe ena peler bıvurne',
 'tooltip-ca-delete' => 'Ena pele bıestere',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
@@ -2446,9 +2929,9 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-search' => 'Zerreyê {{SITENAME}} de cı geyre',
 'tooltip-search-go' => 'Ebe nê namey tami şo yew pela ke esta',
 'tooltip-search-fulltext' => 'Seba nê meqaley pelan seha ke',
-'tooltip-p-logo' => 'Pelaseri',
-'tooltip-n-mainpage' => 'Pela Seri bıvêne',
-'tooltip-n-mainpage-description' => 'Pela seri bıvêne',
+'tooltip-p-logo' => 'Pela seri',
+'tooltip-n-mainpage' => 'Şo pela seri',
+'tooltip-n-mainpage-description' => 'Şo pela seri',
 'tooltip-n-portal' => 'Heqa projey de, çı şenay bıkerê, çı koti vêniyeno',
 'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
 'tooltip-n-recentchanges' => 'Wiki de lista vurnayışanê peyênan',
@@ -2464,12 +2947,12 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-t-specialpages' => 'Lista pelanê xasanê pêroinan',
 'tooltip-t-print' => 'Nımuney çapkerdışiê ena pele',
 'tooltip-t-permalink' => 'Gırêyo daimi be ena versiyonê pele',
-'tooltip-ca-nstab-main' => 'Pela tedeesteyan bıvêne',
+'tooltip-ca-nstab-main' => 'Pela zerreki bımocne',
 'tooltip-ca-nstab-user' => 'Pela karberi bıvin',
 'tooltip-ca-nstab-media' => 'Pele Mediya bivinên',
 'tooltip-ca-nstab-special' => 'Na yew pelê da xususiya, şıma nêşenê nae bıvurnê',
 'tooltip-ca-nstab-project' => 'pelayê kılit-kerdeyi bıvin',
-'tooltip-ca-nstab-image' => 'Pela tedeesteyan bıvêne',
+'tooltip-ca-nstab-image' => 'Pelay dosya bımocne',
 'tooltip-ca-nstab-mediawiki' => 'Mesacê sistemi bivinên',
 'tooltip-ca-nstab-template' => 'Şabloni bıvêne',
 'tooltip-ca-nstab-help' => 'Peleyê yardimi bivinên',
@@ -2480,6 +2963,8 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-diff' => 'Vurnayışe mı bımoc',
 'tooltip-compareselectedversions' => 'Ferqê versiyonan bevinin',
 'tooltip-watch' => 'Eno pele listey tıyo seyir-kerdişi ri dek',
+'tooltip-watchlistedit-normal-submit' => 'Sernuşteya hewad',
+'tooltip-watchlistedit-raw-submit' => 'Listeyê seyri newen ke',
 'tooltip-recreate' => 'pel hewn a bışiyo zi tepiya biya',
 'tooltip-upload' => 'Bar bike',
 'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
@@ -2509,14 +2994,32 @@ Tı eşkeno yew sebeb bınus.',
 'spamprotectionmatch' => 'nuşte yo ke rıcnayoxê spami herikneno: $1',
 'spambot_username' => 'wikimedya spam-pakkerdışi',
 'spam_reverting' => 'agêriyeno revizyon o ke tawayê $1 ıney piya çiniyo',
-'spam_blanking' => 'revizyonê hemeyi de ıney $1 re gıreyi estî, deverdiyeno',
+'spam_blanking' => 'Revizyonê gredê $1 vineyay, wa weng kero',
+'spam_deleting' => 'Revizyonê gredê $1 vineyay, wa besterneyê',
 
 # Info page
+'pageinfo-title' => 'Heq tê "$1"\'i',
 'pageinfo-header-edits' => 'Vurnayışi',
 'pageinfo-header-watchlist' => 'Listey temaşi',
 'pageinfo-header-views' => 'Bıvin',
 'pageinfo-subjectpage' => 'Pele',
 'pageinfo-talkpage' => 'Pelay qıse',
+'pageinfo-watchers' => 'Amarina temaşekaran',
+'pageinfo-edits' => 'Amarina vurnayışan',
+'pageinfo-authors' => 'Amarina nuştekaran',
+'pageinfo-views' => 'Amarina mocnayışan',
+'pageinfo-viewsperedit' => 'Vurnayışi sero vurnayışa bımocnêyış',
+
+# Skin names
+'skinname-standard' => 'Klasik',
+'skinname-nostalgia' => 'Nostalciya',
+'skinname-cologneblue' => 'Cologne Blue',
+'skinname-monobook' => 'MonoBook',
+'skinname-myskin' => 'MySkin',
+'skinname-chick' => 'Şıq',
+'skinname-simple' => 'Rehat',
+'skinname-modern' => 'Modern',
+'skinname-vector' => 'Vektor',
 
 # Patrolling
 'markaspatrolleddiff' => 'Nişan bike ke devriye biyo',
@@ -2547,19 +3050,23 @@ $1',
 
 # Browsing diffs
 'previousdiff' => '← Vurnayışê kıhanyer',
-'nextdiff' => 'Vurnayışo newêr →',
+'nextdiff' => 'Vurnayışo peyên →',
 
 # Media information
 'mediawarning' => "'''Teme''': Na dosya de belkia kodê xırabıni estê.
 Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'imagemaxsize' => "Limitê ebat ê resimi:<br />''(qe pela deskripsiyonê dosyayan)''",
 'thumbsize' => 'Ebadê Thumbnaili',
+'widthheight' => '$1 - $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pele|peli}}',
 'file-info' => 'ebatê dosyayi: $1, MIME tip: $2',
 'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
+'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
 'file-nohires' => 'Rovıleşiyayışo berzêr çıniyo.',
 'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
 'show-big-image' => 'Resolosyonê temami',
+'show-big-image-preview' => "Verqayd dergiya: $1'i.",
+'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
 'show-big-image-size' => '$1 × $2 piksel',
 'file-info-gif-looped' => 'viyariye biyo',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
@@ -2568,18 +3075,23 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'file-info-png-frames' => '$1 {{PLURAL:$1|çerçeve|çerçeveyi}}',
 
 # Special:NewFiles
-'newimages' => 'Galeyê dosyayanê newe',
+'newimages' => 'Galeriya dosyayan dê newan',
 'imagelisttext' => "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
 'newimages-summary' => 'Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.',
 'newimages-legend' => 'Filtre',
 'newimages-label' => 'Nameyê dosya ( ya zi parçe ey)',
-'showhidebots' => '($1 botan)',
+'showhidebots' => '(bota $1)',
 'noimages' => 'Çik çini yo.',
 'ilsubmit' => 'Cıgeyre',
 'bydate' => 'goreyê zemani',
 'sp-newimages-showfrom' => 'Dosyayê newi ke $2, $1 ra dest pe keni bimocne',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1s',
+'minutes-abbrev' => '$1m',
+'hours-abbrev' => '$1h',
+'days-abbrev' => '$1d',
 'seconds' => 'verdê {{PLURAL:$1|$1 saniya|$1 saniya}}',
 'minutes' => 'verdê {{PLURAL:$1|$1 daka|$1 daka}}',
 'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
@@ -2593,12 +3105,67 @@ Tenya çiyo ke beno lista (rezê ke be * dest kenê cı) çıman ver de vêniyen
 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.',
 
+/*
+Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language
+*/
+'variantname-zh-hans' => 'hans',
+'variantname-zh-hant' => 'hant',
+'variantname-zh-cn' => 'cn',
+'variantname-zh-tw' => 'tw',
+'variantname-zh-hk' => 'hk',
+'variantname-zh-mo' => 'mo',
+'variantname-zh-sg' => 'sg',
+'variantname-zh-my' => 'my',
+'variantname-zh' => 'zh',
+
+# Variants for Gan language
+'variantname-gan-hans' => 'hans',
+'variantname-gan-hant' => 'hant',
+'variantname-gan' => 'gan',
+
+# Variants for Serbian language
+'variantname-sr-ec' => 'sr-ec',
+'variantname-sr-el' => 'sr-el',
+'variantname-sr' => 'sr',
+
+# Variants for Kazakh language
+'variantname-kk-kz' => 'kk-kz',
+'variantname-kk-tr' => 'kk-tr',
+'variantname-kk-cn' => 'kk-cn',
+'variantname-kk-cyrl' => 'kk-cyrl',
+'variantname-kk-latn' => 'kk-latn',
+'variantname-kk-arab' => 'kk-arab',
+'variantname-kk' => 'kk',
+
+# Variants for Kurdish language
+'variantname-ku-arab' => 'ku-Arab',
+'variantname-ku-latn' => 'ku-Latn',
+'variantname-ku' => 'ku',
+
+# Variants for Tajiki language
+'variantname-tg-cyrl' => 'tg-Cyrl',
+'variantname-tg-latn' => 'tg-Latn',
+'variantname-tg' => 'tg',
+
+# Variants for Inuktitut language
+'variantname-ike-cans' => 'ike-Cans',
+'variantname-ike-latn' => 'ike-Latn',
+'variantname-iu' => 'iu',
+
+# Variants for Tachelhit language
+'variantname-shi-tfng' => 'shi-Tfng',
+'variantname-shi-latn' => 'shi-Latn',
+'variantname-shi' => 'shi',
+
 # 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
@@ -2614,9 +3181,11 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 * gpslatitude
 * gpslongitude
 * gpsaltitude',
+'metadata-langitem' => "'''$2:''' $1",
+'metadata-langitem-default' => '$1',
 
 # EXIF tags
-'exif-imagewidth' => 'Verini',
+'exif-imagewidth' => 'Herayey',
 'exif-imagelength' => 'Dergi',
 'exif-bitspersample' => 'yew parçe de biti',
 'exif-compression' => 'Planê kompresyoni',
@@ -2661,6 +3230,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-exposuretime' => 'Zemanê orta de vinderdişi',
 'exif-exposuretime-format' => '$1 san ($2)',
 'exif-fnumber' => 'F Amar',
+'exif-fnumber-format' => 'f/$1',
 'exif-exposureprogram' => 'Programê Orta de Vinderdişi',
 'exif-spectralsensitivity' => 'Hesasiyetê spektrali',
 'exif-isospeedratings' => 'ISO değerê piti',
@@ -2674,6 +3244,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-lightsource' => 'Çimeyê roşni',
 'exif-flash' => 'Flaş',
 'exif-focallength' => 'Deganiyê fokus ê lensi',
+'exif-focallength-format' => '$1 mm',
 'exif-subjectarea' => 'Wareyê ey',
 'exif-flashenergy' => 'Kuvetê flaşi',
 'exif-focalplanexresolution' => 'Focal plane X resolution',
@@ -2728,20 +3299,103 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpsareainformation' => 'Nameyê wareyê GPSi',
 'exif-gpsdatestamp' => 'Tarixê GPSi',
 'exif-gpsdifferential' => 'GPS differential correction',
+'exif-coordinate-format' => '$1° $2′ $3″ $4',
 'exif-jpegfilecomment' => "Vatışê dosyada JPEG'i",
 'exif-keywords' => 'Qesa kelimey',
+'exif-worldregioncreated' => 'Resim dınya dı qanci mıntıqara gêriyayo',
+'exif-countrycreated' => 'Resim qanci dewlet ra gêriyayo',
+'exif-countrycodecreated' => 'Cayo ke resim ancıyayo kodê dewlet da cı',
+'exif-provinceorstatecreated' => 'Cayê resim antışi dewlet yana wılayet',
+'exif-citycreated' => 'Suka ke resim gêriyayao',
+'exif-sublocationcreated' => 'Bın lokasyonê resimê suker da cı grot',
+'exif-worldregiondest' => 'Wareyo ke mocneyêno',
+'exif-countrydest' => 'Dewleta ke mocneyêna',
+'exif-countrycodedest' => 'Kodê dewleto ke mocneyoêno',
+'exif-provinceorstatedest' => 'Eyalet yana wılayeto ke mocneyêno',
+'exif-citydest' => 'Sûka ke mocneyêna',
+'exif-sublocationdest' => 'Mıntıqeya sûker mocnayış',
+'exif-objectname' => 'Sernuşteyo qıckek',
+'exif-specialinstructions' => 'Talimatê xısusi',
+'exif-headline' => 'Sername',
+'exif-credit' => 'Kredi/Destegdaren',
+'exif-source' => 'Çıme',
+'exif-editstatus' => 'Resmi vurnayışê weziyeti',
+'exif-urgency' => 'Aciliyet',
+'exif-fixtureidentifier' => 'Namey fiksturi',
+'exif-locationdest' => 'Tarifê cay',
+'exif-locationdestcode' => 'Lokasyon kodi vaciya',
+'exif-objectcycle' => 'Qandê medyay deme u roce cı',
+'exif-contact' => 'Zanışiya irtibati',
 'exif-writer' => 'Nuştekar',
-'exif-languagecode' => 'Zuwan',
+'exif-languagecode' => 'Zıwan',
+'exif-iimversion' => 'Verqaydê IIM',
 'exif-iimcategory' => 'Kategori',
+'exif-iimsupplementalcategory' => 'Oleyê Kategoriyan',
+'exif-datetimeexpires' => 'No peyra mekarênê',
+'exif-datetimereleased' => 'Bıroşe',
+'exif-originaltransmissionref' => 'Oricinal pusula da kodê açarnayışi',
+'exif-identifier' => 'Şınasnayer',
+'exif-lens' => 'Lensê karkerdışi',
+'exif-serialnumber' => 'Seri nımreyê kamera',
+'exif-cameraownername' => 'Wayırê kamera',
 'exif-label' => 'Etiket',
+'exif-datetimemetadata' => 'Malumatê metamalumati peyd timarya',
+'exif-nickname' => 'Bêresmi namey cı',
+'exif-rating' => 'Rey dayış (5i sera)',
+'exif-rightscertificate' => 'Sertifikayê idariya heqan',
+'exif-copyrighted' => 'Weziyetê telifi',
+'exif-copyrightowner' => 'Wayırê Telifi',
+'exif-usageterms' => 'Şertê karkerdışi',
+'exif-webstatement' => 'Heqê telifiya miyandene',
+'exif-originaldocumentid' => 'Xasiya ID ya dokuman de orcinali',
+'exif-licenseurl' => 'Qandê Lisans de heqê telifiye URL',
+'exif-morepermissionsurl' => 'Alternatif malumatê lisansi',
+'exif-attributionurl' => 'No nuşte çı wext karyayo, şıma ra reca gre dekerê de',
+'exif-preferredattributionname' => 'No nuşte çı wext karyayo, Şıma ra reca morkerê',
+'exif-pngfilecomment' => "Vatışê dosyada PNG'i",
+'exif-disclaimer' => 'Reddê mesuliyeti',
+'exif-contentwarning' => 'İkazê zerreki',
+'exif-giffilecomment' => "vatena dosya da GIF'i",
+'exif-intellectualgenre' => 'Babeta çêki',
+'exif-subjectnewscode' => 'Kodê muhtewa',
+'exif-scenecode' => 'IPTC kodê sahni',
+'exif-event' => 'Weqaya ke nameycıyo ravreno',
+'exif-organisationinimage' => 'Organizasyono ke ravêreno',
+'exif-personinimage' => 'Merdumo ke nameycıyo ravêreno',
+'exif-originalimageheight' => 'Veror de resim nêkırpnayışi dergeya cı',
+'exif-originalimagewidth' => 'Veror de resim nêkırpnayışi herayeya cı',
+
+# Make & model, can be wikified in order to link to the camera and model name
+'exif-contact-value' => '$1
+
+$2
+<div class="adr">
+$3
+
+$4, $5, $6 $7
+</div>
+$8',
+'exif-subjectnewscode-value' => '$2 ($1)',
 
 # EXIF attributes
-'exif-compression-1' => 'têhet nêanciyayo',
-'exif-compression-6' => 'wext o ke nêzaniyeno',
+'exif-compression-1' => 'Nêdegusneyayo',
+'exif-compression-2' => 'CCITT Group 3 1-Dimensiyonel dergeya cı timarkerdışê cı bıwanê',
+'exif-compression-3' => 'CCITT Group 3 fax kodkerdış',
+'exif-compression-4' => 'CCITT Group 4 fax kodkerdış',
+'exif-compression-5' => 'LZW',
+'exif-compression-6' => 'JPEG (verên)',
+'exif-compression-7' => 'JPEG',
+'exif-compression-8' => 'Deflate (Adobe)',
+'exif-compression-32773' => 'PackBits (Macintosh RLE)',
+'exif-compression-32946' => 'Deflate (PKZIP)',
+'exif-compression-34712' => 'JPEG2000',
 
 'exif-copyrighted-true' => 'Heqê telifiye',
 'exif-copyrighted-false' => 'Malê umumiye',
 
+'exif-photometricinterpretation-2' => 'RGB',
+'exif-photometricinterpretation-6' => 'YCbCr',
+
 'exif-unknowndate' => 'Tarix nizanyano',
 
 'exif-orientation-1' => 'Normal',
@@ -2756,9 +3410,19 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-planarconfiguration-1' => 'chunky format',
 'exif-planarconfiguration-2' => 'planar format',
 
+'exif-xyresolution-i' => '$1 dpi',
+'exif-xyresolution-c' => '$1 dpc',
+
+'exif-colorspace-1' => 'sRGB',
 'exif-colorspace-65535' => 'Kalibrasyon nêvıraziyayo',
 
 'exif-componentsconfiguration-0' => 'çini yo',
+'exif-componentsconfiguration-1' => 'Y',
+'exif-componentsconfiguration-2' => 'Cb',
+'exif-componentsconfiguration-3' => 'Cr',
+'exif-componentsconfiguration-4' => 'R',
+'exif-componentsconfiguration-5' => 'G',
+'exif-componentsconfiguration-6' => 'B',
 
 'exif-exposureprogram-0' => 'nêdiya daşınasnayişi',
 'exif-exposureprogram-1' => 'Pê/bı dest',
@@ -2796,6 +3460,10 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-lightsource-17' => 'Roşna standarde A',
 'exif-lightsource-18' => 'Roşna standarde B',
 'exif-lightsource-19' => 'Roşna standarde C',
+'exif-lightsource-20' => 'D55',
+'exif-lightsource-21' => 'D65',
+'exif-lightsource-22' => 'D75',
+'exif-lightsource-23' => 'D50',
 'exif-lightsource-24' => 'ISO volframê studyoyi',
 'exif-lightsource-255' => 'Çimeyê roşni yê bini',
 
@@ -2821,6 +3489,8 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-sensingmethod-7' => 'Sensorê hirê-çizgi',
 'exif-sensingmethod-8' => 'sensora aritmetik a ke rengın his kena',
 
+'exif-filesource-3' => 'Dicital makinay kamera',
+
 'exif-scenetype-1' => 'ca de fotoğraf ker',
 
 'exif-customrendered-0' => 'Prosesê normali',
@@ -2869,6 +3539,10 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpslongitude-e' => 'derganiya rocvetış',
 'exif-gpslongitude-w' => 'Derganiya rocawan',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cordeyo',
+'exif-gpsaltitude-below-sealevel' => 'Sewiye de roy ra $1 {{PLURAL:$1|metre|metre}} cêrdeyo',
+
 'exif-gpsstatus-a' => 'peymawıtış dewam keno',
 'exif-gpsstatus-v' => 'şuxuliyayişê peymawıtışi',
 
@@ -2903,6 +3577,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-ycbcrpositioning-2' => 'Wayırê-site',
 
 'exif-dc-contributor' => 'İştırakdari',
+'exif-dc-coverage' => 'Heruna yana wextin grotışa medya',
 'exif-dc-date' => 'Tarix(i)',
 'exif-dc-publisher' => 'Wılakar',
 'exif-dc-relation' => 'Medyay cı',
@@ -2914,6 +3589,8 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 
 'exif-isospeedratings-overflow' => '65535 ra gırdo',
 
+'exif-maxaperturevalue-value' => '$1 APEX (f/$2)',
+
 'exif-iimcategory-ace' => 'Zagon, kultur u keyfiye',
 'exif-iimcategory-clj' => 'Arey u huquq',
 'exif-iimcategory-dis' => 'Weqey u Qezey',
@@ -2933,7 +3610,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-iimcategory-wea' => 'Hewa',
 
 'exif-urgency-normal' => 'Normal ($1)',
-'exif-urgency-low' => '($1) Qemiyo',
+'exif-urgency-low' => '($1) Kemiyo',
 'exif-urgency-high' => '( $1 ) Vêşiyo',
 'exif-urgency-other' => 'Sıftê  şınasiya karberi ($1)',
 
@@ -2950,9 +3627,9 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 # E-mail address confirmation
 'confirmemail' => 'Adresê emaîlî xo konfirme bike',
 'confirmemail_noemail' => 'Yew emaîlê tu raştîyê çin o ke [[Special:Preferences|tercihê karberî]] ayar bike.',
-'confirmemail_text' => 'qey şuxulnayişê e-postayê wikiyi gani ewwil e-posyaê şıma tesdiq bıbo.
-adresa şıma re qey erşawıtışê e-postayê tesdiqi, butonê cêrıni bıtıknê.
-e-posta yo ke erşawiyeno tede gıreyê kodê tesdiqi esto, gıreyi bıtıkne akerê u e-postayê xo tesdiq kerê.',
+'confirmemail_text' => 'Qey gurweyayışê e-postayê wikiyi gani veror e-postayê şıma araşt bıbo.
+Adresa şıma re qey erşawıtışê e-postayê araştin, butonê cêrıni pıploxnê.
+E-posta yo ke erşawiyeno tede gıreyê kodê araşti esto, gıreyi pıploxne akerê u e-postayê xo araşt kerê.',
 'confirmemail_pending' => 'Yew codê konfirmasyonî ma ti ra şiravt;
 Eka ti newe hesabê xo viraşt, ti gani yew di dekika vindero u email xo kontrol bike, yani reyna yew hesab meviraz.',
 'confirmemail_send' => 'Yew kodê konfirmasyonî email mina bişirave',
@@ -2974,15 +3651,15 @@ Ti eşkeno [[Special:UserLogin|ci kewt]].',
 'confirmemail_body' => 'Brayo delal, mara ke şıma no IP-adresi ra,
 keyepelê {{SITENAME}}i de pêno $2 e-postayi hesab kerda.
 
-eke raşta no e-posta eyê şımayo şıma gani tesdiq bıkerî, qey tesdiq kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrêni bıtıkne.
+eke raşta no e-posta eyê şımayo şıma gani araşt bıkerî, qey araşt kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrêni bıtıkne.
 
 $3
 
-eke şıma hesab *nê akerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gıreyê cêrıni bıtıknê:
+eke şıma hesab *nê akerdo*, qey terqnayışê araşt kerdışê adresa e-postayi gıreyê cêrıni pıploxnê:
 
 $5
 
-kodê tesdiqi heta ıney tarixi $4 meqbulo.',
+kodê araşti heta ıney tarixi $4 meqbulo.',
 'confirmemail_body_changed' => 'Yew ten, muhtemelen şıma no IP-adresi $1 ra,
 keyepelê {{SITENAME}}i de pê no $2 e-postayi hesab kerd a.
 
@@ -2995,6 +3672,19 @@ eke şıma hesab *a nêkerdo*, qey ibtalê tesdiqkerdışê adresa e-postayi gı
 
 $5
 
+kodê tesdiqi heta ıney tarixi $4 meqbul o.',
+'confirmemail_body_set' => 'Jew ten, muhtemelen şıma no IP-adresi $1 ra,
+keye pelê {{SITENAME}}i de pê no $2 e-postayi hesab kerda.
+
+Eke raşta no e-posta eyê şıma yo şıma gani tesdiq bıkerî,
+qey tesdiq kerdışi gani karê e-postayê keyepeli {{SITENAME}} aktif bıbo, qey aktif kerdışi gıreyê cêrıni bıtıkne:
+
+$3
+
+eke şıma hesab *nêakerdo*, qey ibtalê tesdiq kerdışê adresa e-postayi gıreyê cêrêni bıtıknê:
+
+$5
+
 kodê tesdiqi heta ıney tarixi $4 meqbul o.',
 'confirmemail_invalidated' => 'Konfermasyonê adres ê emaîlî iptal biy',
 'invalidateemail' => 'confirmasyonê e-maili iptal bik',
@@ -3006,10 +3696,13 @@ kodê tesdiqi heta ıney tarixi $4 meqbul o.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Teme''': Ena pele  verniyê ti de eseteriyaya!",
-'confirmrecreate' => "Karberê [[User:$1|$1]]î ([[User talk:$1|talk]]), verniyê vurnayîşê ti ra ena pele wedarno, sebeb: ''$2''
-Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
+'confirmrecreate' => "Karberê [[User:$1|$1]]î ([[User talk:$1|mesac]]), verniyê vurnayîşê ti ra ena pele wedarno, sebeb: ''$2''
+Ma rica keno tesdiq bike ke ti raştî wazeno eno pel bivirazo.",
+'confirmrecreate-noreason' => 'karbero [[User:$1|$1]] ([[User talk:$1|mesac]]) , dest pêkerdışiena pela sero vurnayışiya tepya ena pela besternê. Şıma qayıli ke ena pela fına vırazê se ena pela tesdiq kerê.',
 'recreate' => 'Reyna viraz',
 
+'unit-pixel' => 'px',
+
 # action=purge
 'confirm_purge_button' => 'Temam',
 'confirm-purge-top' => 'Cacheyê eno pel biestere?',
@@ -3021,11 +3714,23 @@ Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
 'confirm-unwatch-button' => 'TEMAM',
 'confirm-unwatch-top' => 'Ena pele lista xoya seyirkerdışi ra bıvece?',
 
+# Separators for various lists, etc.
+'semicolon-separator' => '&#32;',
+'comma-separator' => ',&#32;',
+'colon-separator' => ':&#32;',
+'autocomment-prefix' => '-&#32;',
+'pipe-separator' => '&#32;|&#32;',
+'word-separator' => '&#32;',
+'ellipsis' => '...',
+'percent' => '$1%',
+'parentheses' => '($1)',
+'brackets' => '[$1]',
+
 # Multipage image navigation
-'imgmultipageprev' => 'peleyê verin',
-'imgmultipagenext' => 'pelo serîn →',
+'imgmultipageprev' => '← peleyê verin',
+'imgmultipagenext' => 'pela badê cû →',
 'imgmultigo' => 'Şı!',
-'imgmultigoto' => 'Şi pel $1',
+'imgmultigoto' => 'Şo pela da $1',
 
 # Table pager
 'ascending_abbrev' => 'berz',
@@ -3036,14 +3741,36 @@ Ma rica keno konfirme bike ke ti raştî wazeno eno pel bivirazo.",
 'table_pager_last' => 'Pela peyêne',
 'table_pager_limit' => 'Jû pele de $1 unsuran bımocne',
 'table_pager_limit_label' => 'Her pele ra xacetan',
-'table_pager_limit_submit' => 'Şi',
+'table_pager_limit_submit' => 'Şo',
 'table_pager_empty' => 'Netice çini yo',
 
 # Auto-summaries
 'autosumm-blank' => 'Pele de her çi wederna',
 'autosumm-replace' => "Maqale pê '$1' vuriya",
 'autoredircomment' => 'Pele [[$1]] rê redirek biyo',
-'autosumm-new' => "Pê '$1' pele viraziyo.",
+'autosumm-new' => "Pela vıraziyê, '$1' bıvinê",
+
+# Size units
+'size-bytes' => '$1 B',
+'size-kilobytes' => '$1 KB',
+'size-megabytes' => '$1 MB',
+'size-gigabytes' => '$1 GB',
+'size-terabytes' => '$1 TB',
+'size-petabytes' => '$1 PB',
+'size-exabytes' => '$1 EB',
+'size-zetabytes' => '$1 ZB',
+'size-yottabytes' => '$1 YB',
+
+# Bitrate units
+'bitrate-bits' => '$1bps',
+'bitrate-kilobits' => '$1kbps',
+'bitrate-megabits' => '$1Mbps',
+'bitrate-gigabits' => '$1Gbps',
+'bitrate-terabits' => '$1Tbps',
+'bitrate-petabits' => '$1Pbps',
+'bitrate-exabits' => '$1Ebps',
+'bitrate-zetabits' => '$1Zbps',
+'bitrate-yottabits' => '$1Ybps',
 
 # Live preview
 'livepreview-loading' => 'Ho bar keni...',
@@ -3072,7 +3799,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist/raw|edit the raw list]].',
 Eka vurnayîşê ti qediyo, Listeyê Seyr Kerdişî Rocaniye Bike "{{int:Watchlistedit-raw-submit}}" klik bike.
 Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'watchlistedit-raw-titles' => 'Seroğî:',
-'watchlistedit-raw-submit' => 'Listeyê seyr kerdişî xo update bike',
+'watchlistedit-raw-submit' => 'Listeyê seyri newen ke',
 'watchlistedit-raw-done' => 'Listeyê tuyê seyrkerdişi rocaniye biyo',
 'watchlistedit-raw-added' => '{{PLURAL:$1|1 seroğ|$1 seroğî}} de kerd:',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 seroğ|$1 seroğî}} de wedarno:',
@@ -3082,8 +3809,67 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'watchlisttools-edit' => 'listey seyrkerdışi bevin u edit bık',
 'watchlisttools-raw' => 'Listeyê seyr-kerdışi bıvin',
 
+# Iranian month names
+'iranian-calendar-m1' => 'Farvardin',
+'iranian-calendar-m2' => 'Ordibeheşt',
+'iranian-calendar-m3' => 'Xordad',
+'iranian-calendar-m4' => 'Tir',
+'iranian-calendar-m5' => 'Morded',
+'iranian-calendar-m6' => 'Şahrivar',
+'iranian-calendar-m7' => 'Mehr',
+'iranian-calendar-m8' => 'Aban',
+'iranian-calendar-m9' => 'Azar',
+'iranian-calendar-m10' => 'Dey',
+'iranian-calendar-m11' => 'Behman',
+'iranian-calendar-m12' => 'Esfend',
+
+# Hijri month names
+'hijri-calendar-m1' => 'Muharram',
+'hijri-calendar-m2' => 'Sefer',
+'hijri-calendar-m3' => 'Rebiel ewwel',
+'hijri-calendar-m4' => 'Rebiel sani',
+'hijri-calendar-m5' => 'Cemaziel ewwel',
+'hijri-calendar-m6' => 'Cemaziel tani',
+'hijri-calendar-m7' => 'Receb',
+'hijri-calendar-m8' => 'Şehban',
+'hijri-calendar-m9' => 'Remezan',
+'hijri-calendar-m10' => 'Şewwal',
+'hijri-calendar-m11' => 'Zil Qade',
+'hijri-calendar-m12' => 'Zil Hicce',
+
+# Hebrew month names
+'hebrew-calendar-m1' => 'Tişrei',
+'hebrew-calendar-m2' => 'Çeşvan',
+'hebrew-calendar-m3' => 'Kislev',
+'hebrew-calendar-m4' => 'Tevet',
+'hebrew-calendar-m5' => 'Şevat',
+'hebrew-calendar-m6' => 'Adar',
+'hebrew-calendar-m6a' => 'Adar I',
+'hebrew-calendar-m6b' => 'Adar II',
+'hebrew-calendar-m7' => 'Nisan',
+'hebrew-calendar-m8' => 'Iyar',
+'hebrew-calendar-m9' => 'Sivan',
+'hebrew-calendar-m10' => 'Tamuz',
+'hebrew-calendar-m11' => 'Av',
+'hebrew-calendar-m12' => 'Elul',
+'hebrew-calendar-m1-gen' => 'Tişrei',
+'hebrew-calendar-m2-gen' => 'Çeşvan',
+'hebrew-calendar-m3-gen' => 'Kislev',
+'hebrew-calendar-m4-gen' => 'Tevet',
+'hebrew-calendar-m5-gen' => 'Şevat',
+'hebrew-calendar-m6-gen' => 'Adar',
+'hebrew-calendar-m6a-gen' => 'Adar I',
+'hebrew-calendar-m6b-gen' => 'Adar II',
+'hebrew-calendar-m7-gen' => 'Nisan',
+'hebrew-calendar-m8-gen' => 'Iyar',
+'hebrew-calendar-m9-gen' => 'Sivan',
+'hebrew-calendar-m10-gen' => 'Tamuz',
+'hebrew-calendar-m11-gen' => 'Av',
+'hebrew-calendar-m12-gen' => 'Elul',
+
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesac]])',
+'timezone-utc' => 'ŞWC',
 
 # Core parser functions
 'unknown_extension_tag' => 'Etiketê ekstensiyon ê "$1"î nizanyeno',
@@ -3097,6 +3883,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-variables' => 'Vurnayeyî',
 'version-antispam' => 'Spam vındarnayış',
 'version-skins' => 'Cıldi',
+'version-api' => 'API',
 'version-other' => 'Bin',
 'version-mediahandlers' => 'Kulbê medyayî',
 'version-hooks' => 'Çengelî',
@@ -3106,33 +3893,44 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-hook-name' => 'Nameyê çengelî',
 'version-hook-subscribedby' => 'Eza biyayoğ',
 'version-version' => '(Versiyon $1)',
+'version-svn-revision' => '(r$2)',
 'version-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
+'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
+
+Nuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.
+
+enê programiya piya [{{SERVER}}{{SCRIPTPATH}}/COPYING jew kopyay lisans dê GNU] zi şımarê icab keno; narak lisansê şıma çıno se, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA adresi ra yana [//www.gnu.org/licenses/old-licenses/gpl-2.0.html enê lisansi buwane].",
 'version-software' => 'Softwareyê ronayi',
 'version-software-product' => 'Mal',
 'version-software-version' => 'Versiyon',
+'version-entrypoints' => "heruna dekewtış de GRE'i",
+'version-entrypoints-header-entrypoint' => 'Heruna dekewtışi',
+'version-entrypoints-header-url' => 'GRE',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
 # Special:FilePath
-'filepath' => 'Raherê dosyayi',
+'filepath' => 'Heruna dosyayer',
 'filepath-page' => 'Dosya:',
 'filepath-submit' => 'Şo',
 'filepath-summary' => 'Na pela xısusiye raya temame jû dosya rê ana.
 Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqedar direkt dest keno pê.',
 
 # Special:FileDuplicateSearch
-'fileduplicatesearch' => 'kopyayê dosyayi bigêre',
+'fileduplicatesearch' => 'Dosyayanê zey pêyan cı geyrê',
 'fileduplicatesearch-summary' => 'Dosyanê çıftan bınê têmiyankewteyan de bıgeyre.',
 'fileduplicatesearch-legend' => 'kopyayê ena dosya bigêre',
 'fileduplicatesearch-filename' => 'Nameyê dosyayi',
-'fileduplicatesearch-submit' => 'bigêre',
+'fileduplicatesearch-submit' => 'Cı geyre',
 'fileduplicatesearch-info' => '$1 × $2 piksel<br />Ebatê dosyayî: $3<br />Tipê MIMEî: $4',
 'fileduplicatesearch-result-1' => "Dosyayê ''$1î'' de hem-kopya çini yo.",
 'fileduplicatesearch-result-n' => "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
 '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>
@@ -3143,11 +3941,11 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 'specialpages-group-changes' => 'Vurnayişê peni u logan',
 'specialpages-group-media' => 'Raporê medya u bar kerdîşî',
 'specialpages-group-users' => 'Karber u heqqî',
-'specialpages-group-highuse' => 'Pelî ke zaf klik benê',
+'specialpages-group-highuse' => 'Peleyê ke vêşi karênê',
 'specialpages-group-pages' => 'listeyanê pelan',
-'specialpages-group-pagetools' => 'hacetanê pelayan',
-'specialpages-group-wiki' => 'Data u hacetê wîkîyî',
-'specialpages-group-redirects' => 'Pela xasî reyna direk kenê',
+'specialpages-group-pagetools' => 'Hacetê pelan',
+'specialpages-group-wiki' => 'Malumatê wiki u haceti',
+'specialpages-group-redirects' => 'Pela xasîyê ke heteneyayê',
 'specialpages-group-spam' => 'hacetê spami',
 
 # Special:BlankPage
@@ -3165,7 +3963,7 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 #parçeyê ifadeya rêzbiyayeyani bıerzê serê ney satıri. no satır zey xo verde/raverde </pre>',
 
 # Special:Tags
-'tags' => 'Etiketê vurnayîş ê raştî',
+'tags' => 'Etiketê vurnayîşê raştî',
 'tag-filter' => '[[Special:Tags|Tag]] filitre:',
 'tag-filter-submit' => 'Filitre',
 'tags-title' => 'Etiketan',
@@ -3178,21 +3976,25 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'tags-hitcount' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
 
 # Special:ComparePages
-'comparepages' => 'Peleyan miqeyese bike',
+'comparepages' => 'Pela miqeyese ke',
 'compare-selector' => 'Revizyonê pele miqayese bike',
 'compare-page1' => 'Pel 1',
 'compare-page2' => 'Pel 2',
 'compare-rev1' => 'Revizyonê 1i',
 'compare-rev2' => 'Revizyonê 2i',
 'compare-submit' => 'Miqayese',
+'compare-invalid-title' => 'Sernameyo ke şımayê vanê ravêrde niyo.',
+'compare-title-not-exists' => 'Sernameyo ke şımayê vanê mewcud niyo.',
+'compare-revision-not-exists' => 'Revizyono ke şımaye vanê mewcud niyo.',
 
 # Database error messages
 'dberr-header' => 'Ena Wiki de yew ğelet esta',
-'dberr-problems' => 'Qusir ma mevin! Site ma de nika ğeletê teknikî  esto.',
+'dberr-problems' => 'Mayê muxulêm!
+Ena sita dı newke xırabiya teknik esta.',
 'dberr-again' => 'Yew di dekika vinder u hin bar bike.',
-'dberr-info' => '(Nieşkenî serverê databaseyî bireso: $1)',
+'dberr-info' => '(Erzmelumati ra xızmetkari nêreseno: $1)',
 'dberr-usegoogle' => 'Ti eşkeno hem zi ser Google de bigêre.',
-'dberr-outofdate' => 'Note bike ke belki îdeksê tedesteyî rocaniye niyo.',
+'dberr-outofdate' => 'Ekê raten da ma deyê belki zi newen niyo qandê coy diqet kerê.',
 'dberr-cachederror' => 'Pel ke ti wazeno yew kopyayê cacheyî ay esto, ay belki rocaniyeyo.',
 
 # HTML forms
@@ -3207,23 +4009,44 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'htmlform-reset' => 'Vurnayişî reyna biyar',
 'htmlform-selectorother-other' => 'Bin',
 
+# SQLite database support
+'sqlite-has-fts' => '$1 tam-metn destegê cı geyrayışiya piya',
+'sqlite-no-fts' => '$1 tam-metn bê destegê cı geyrayışi',
+
 # New logging system
-'logentry-delete-delete' => "$1'i Pelaya $3'i besternê",
-'logentry-delete-restore' => "$1'i pelaya $3'i peyd grot",
-'revdelete-content-hid' => 'nusno nımte',
-'revdelete-summary-hid' => 'Vurnayışi nımtey niyê',
-'revdelete-uname-hid' => 'Namey karberi nımteyo',
+'logentry-delete-delete' => "Karber $1' pelay $3' besternê",
+'logentry-delete-restore' => "Karber $1' pelay $3' peyser grot",
+'logentry-delete-event' => '$1 asaneyaışê {{PLURAL:$5|weqey roceke|$5 weqey rocekan}} kerdi het de $3: $4 vurna',
+'logentry-delete-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı vurna',
+'logentry-delete-event-legacy' => '$1 Asayışê vurnayışê $3 dekerde de',
+'logentry-delete-revision-legacy' => '$1 revizyonê pela da $3 asayışê cı vurna',
+'logentry-suppress-delete' => '$1  $3 rê pıloxneyê',
+'logentry-suppress-event' => '$1 asayışê  {{PLURAL:$5|weqey rocaka|$5 weqey rocekan}}  $3: $4 miyanıki vurna',
+'logentry-suppress-revision' => '$1 $3: pela da $4 dı  {{PLURAL:$5|jew revizyon|$5 revizyon}} asayışê cı xısusiye vurna',
+'logentry-suppress-event-legacy' => '$1 Asayışê vurnayışê ciyo xısusiyeta cı $3 dekerde de',
+'logentry-suppress-revision-legacy' => '$1 revizyonê pela da $3 asayışê cıyo xısuiye vurna',
+'revdelete-content-hid' => 'zerreko nımte',
+'revdelete-summary-hid' => 'xulusaya vurnayışa nımneyê',
+'revdelete-uname-hid' => 'namey karberi nımteyo',
+'revdelete-content-unhid' => 'errek mocneya',
 'revdelete-summary-unhid' => 'Xulusaya vurnayışa mucneyê',
-'revdelete-uname-unhid' => 'Namey karberi ne nımteyo',
+'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-move-move_redir' => '$1 pela $3 pela da $4 sera hetenayış ra ahulnê',
+'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
+'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
+'logentry-patrol-patrol-auto' => '$1 Otomatik revizyonê pela da $4  $3 ke kontrol',
 'logentry-newusers-newusers' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create' => '$1 deye namey karberi vıraziya',
 'logentry-newusers-create2' => "$1'i $3 rê hesab vıraşt",
+'logentry-newusers-autocreate' => 'Hesabê $1 Otomatikmen vıraziya',
 'newuserlog-byemail' => 'pê e-mail ra paralo şiravt',
 
 # Feedback
+'feedback-bugornote' => 'Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da "[ $3  $2 ]", namey karber dê xoya piya u wasteriya karfiye.',
 'feedback-subject' => 'Muhtewa:',
 'feedback-message' => 'Mesac:',
 'feedback-cancel' => 'Bıterkne',
@@ -3231,12 +4054,61 @@ satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
 'feedback-adding' => 'Pela rê peyxeberdar defêno...',
 'feedback-error1' => 'Xeta: API ra neticey ne vıcyay',
 'feedback-error2' => 'Xeta: Timar kerdış nebı',
+'feedback-error3' => 'Xeta: API ra cewab çıno',
+'feedback-thanks' => 'Teşekkur kemê! Vatışê şıma pela da "[$2 $1]" esta.',
 'feedback-close' => 'Biya star',
+'feedback-bugcheck' => 'Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.',
+'feedback-bugnew' => 'Mı qontrol ke. Xetaya newi xeber ke',
 
 # API errors
+'api-error-badaccess-groups' => 'Ena wiki de dosya barkerdışi rê mısade nêdeyêno.',
+'api-error-badtoken' => 'Xirabiya zerrek:Xırab resim.',
+'api-error-copyuploaddisabled' => 'URL barkerdış ena waster dı qefılyayo.',
+'api-error-duplicate' => 'Ena {{PLURAL:$1|ze ke [zey $2]|biya [zey dosya da $2]}} zeq wesiqa biya wendeyê.',
+'api-error-duplicate-archive' => 'Ena {{PLURAL:$1|vurneyaya [$2 zey na dosya]| [zerrey cı zey $2 dosya]}} aseno,feqet {{PLURAL:$1|ena dosya|tewr veri}} besterneyaya.',
+'api-error-duplicate-archive-popup-title' => 'Ena {{PLURAL:$1|Dosya besterneyaya|dosya}} xora  besterneyaya.',
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|dosyaya|dosyaya}} dılet',
+'api-error-empty-file' => 'Dosyaya ke şıma rışta venga.',
+'api-error-emptypage' => 'Newi, pelaya veng vıraştışi rê mısade nêdeyêno.',
+'api-error-fetchfileerror' => 'Xırabiya zerrek:Dosya grotış dı tay çi raşt nêşı.',
+'api-error-file-too-large' => 'Dosyaye ke şıma rışta zaf gırda.',
+'api-error-filename-tooshort' => 'Namayê dosyayi zaf kilm a.',
+'api-error-filetype-banned' => 'Tipê ena dosya qedexe biya.',
+'api-error-filetype-missing' => 'Derganiya dosya kemiya',
+'api-error-hookaborted' => 'Vurnayişê tu ke to cerbna pê yew çengal ra terkneya.',
+'api-error-http' => 'Xırabiya zerreki:Wasteriya irtabet bırya.',
+'api-error-illegal-filename' => 'Ena nameyê dosyayi kebul nibena.',
+'api-error-internal-error' => 'Xırabiye zerrek:Na wikide barkerdış de şıma dı çıyê raşt nêşı.',
+'api-error-invalid-file-key' => 'Xırabiye zerrek:İdari  depokerdışê dosya nêvineya.',
+'api-error-missingparam' => 'Xırabiye zerrek:Parametre waştış dı xırabin',
+'api-error-missingresult' => 'Xırabiya zerrek:Kopya kerdışê cı nêbı.',
+'api-error-mustbeloggedin' => 'Dosya barkerdışi re cıkewtış icab keno.',
+'api-error-mustbeposted' => 'Zırabiya zerrek:HTTP POST waştış icab keno',
+'api-error-noimageinfo' => 'Barkerdışê dosya temamya lakin wasterira marê malumat nêdeyayo.',
+'api-error-nomodule' => 'Xırabiya zerrek:Sazkerdışê modul dê barkerdışi nêvıraziyayo.',
+'api-error-ok-but-empty' => 'Xırabiya zerrek:Wastero cıwan nêdano.',
+'api-error-overwrite' => 'Ser yew dosyayê ke hama esta, ser ey qeyd nibena.',
+'api-error-stashfailed' => 'Xırabiya zerrek:Wasteri idari dosyey kerdi vıni.',
+'api-error-timeout' => 'Cıwab dayışê wasteri peyra mend.',
+'api-error-unclassified' => 'Yew xeteyê nizanyeni biya.',
 'api-error-unknown-code' => "$1'dı jew xeta vıciye",
+'api-error-unknown-error' => 'Zerre xırabin:Dasoya barkerdış de tay çi raşt nêşı.',
 'api-error-unknown-warning' => "$1'dı ikazo xırab:",
 'api-error-unknownerror' => "$1'dı jew xeta vıciye",
-
+'api-error-uploaddisabled' => 'BArkerdış ena wikide qefılneyayo',
+'api-error-verification-error' => 'Dosya xırabiya yana derganiya cı xıraba.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniya|saniyey}}',
+'duration-minutes' => '$1 {{PLURAL:$1|deqa|deqey}}',
+'duration-hours' => '($1 {{PLURAL:$1|seate|seati}})',
+'duration-days' => '($1 {{PLURAL:$1|roce|roci}})',
+'duration-weeks' => '$1 {{PLURAL: $1|hefte|heftey}}',
+'duration-years' => '$1 {{PLURAL:$1|serre|serri}}',
+'duration-decades' => '$1 {{PLURAL:$1|dades|dadesi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|seserre|seserri}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenyum|milenyumi}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Kılitê teqdimkarê $1i nêvêniyenê.',
 );
index c93d107..d7ce8be 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lower Sorbian (Dolnoserbski)
+/** Lower Sorbian (dolnoserbski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Dbc334
  * @author Derbeth
  * @author Dunak
  * @author Dundak
@@ -165,7 +166,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Doglědowane změny w aktualnych změnach schowaś',
 'tog-newpageshidepatrolled' => 'Doglědowane boki z lisćiny nowych bokow schowaś',
 'tog-extendwatchlist' => 'Wobglědowańku wócyniś, aby wšě změny pokazał, nic jano nejnowše',
-'tog-usenewrc' => 'Rozšyrjonu lisćinu aktualnych změnow (JavaScript trěbny) wužywaś',
+'tog-usenewrc' => 'Kupkowe změny pó boku w aktualnych změnach a wobglědowanjach (trjeba JavaScript)',
 'tog-numberheadings' => 'Nadpisma awtomatiski numerěrowaś',
 'tog-showtoolbar' => 'Wobźěłańsku lejstwu pokazaś (JavaScript)',
 'tog-editondblclick' => 'Boki z dwójnym kliknjenim wobźěłaś (JavaScript)',
@@ -541,6 +542,10 @@ Wótpšašanje: $2',
 'filereadonlyerror' => 'Njejo móžno dataju "$1" změniś, dokulaž datajowy repozitorium "$2" jo jano cytajobny.
 
 Administrator, kenž jo jen zastajił, jo toś tu pśicynu pódał: "$3".',
+'invalidtitle-knownnamespace' => 'Njepłaśiwy titel z mjenjowym rumom "$2" a tekstom "$3"',
+'invalidtitle-unknownnamespace' => 'Njepłaśiwy titel z njeznatym mjenjowym rumom $1 a tekstom "$2"',
+'exception-nologin' => 'Njejsy se pśizjawił',
+'exception-nologin-text' => 'Toś ten bok abo toś ta akcija pomina, až sy na toś tom wikiju pśizjawjony.',
 
 # Virus scanner
 'virus-badscanner' => "Špatna konfiguracija: njeznaty wirusowy scanner: ''$1''",
@@ -810,7 +815,8 @@ Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:'
 'updated' => '(Zaktualizěrowane)',
 'note' => "'''Pokazka:'''",
 'previewnote' => "'''Wobmysli, až to jo jano pśeglěd.'''
-Twóje změny hyšći njejsu składowane! [[#editform|→ Dalej wobźěłaś]]",
+Twóje změny hyšći njejsu składowane!",
+'continue-editing' => 'Dalej wobźěłaś',
 'previewconflict' => 'Toś ten pśeglěd wótbłyšćujo tekst górjejcnego póla. Bok buźo tak wuglědaś, jolic jen něnto składujoš.',
 'session_fail_preview' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili. Pšosym wopytaj hyšći raz. Jolic až to pón pśecej hyšći njejźo, wopytaj se wótzjawiś a zasej pśizjawiś.'''",
 'session_fail_preview_html' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili.'''
@@ -894,6 +900,12 @@ 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ł',
+'parser-unstrip-loop-warning' => 'Njeskóńcna kokula namakana',
+'parser-unstrip-recursion-limit' => 'Rekursiska granica pśekšocona ($1)',
 
 # "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.',
@@ -1037,7 +1049,7 @@ Pšosym pśeglědaj protokole.',
 
 # Suppression log
 'suppressionlog' => 'Protokol pódłocowanjow',
-'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj  [[Special:BlockList|lisćinu IP-blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
+'suppressionlogtext' => 'To jo lisćina wulašowanjow a blokěrowanjow, kótaraž ma wopśimjeśe, kótarež jo wót administratorow schowane. Glědaj  [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu aktualnych wugnanjow a blokěrowanjow.',
 
 # History merging
 'mergehistory' => 'Zwězaś stawizny bokow',
@@ -1069,8 +1081,9 @@ Zaruc, až historija wersijow nastawka jo njepśetergnjona.',
 'mergelogpagetext' => 'Dołojce jo lisćina nejnowejšych zjadnośenjow historije boka z drugej.',
 
 # Diffs
-'history-title' => 'Stawizny wersijow boka „$1“',
-'difference' => '(rozdźěle mjazy wersijoma/wersijami)',
+'history-title' => '$1: Wersijowe stawizny',
+'difference-title' => '$1: Rozdźěl mjazy wersijami',
+'difference-title-multipage' => '$1 a $2: Rozdźěl mjazy bokami',
 'difference-multipage' => '(Rozdźěl mjazy bokami)',
 'lineno' => 'Rědka $1:',
 'compareselectedversions' => 'Wuzwólonej wersiji pśirownaś',
@@ -1162,9 +1175,10 @@ 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-user-pages' => 'Wužywarske boki',
 'prefs-personal' => 'Wužywarski profil',
 'prefs-rc' => 'Aktualne změny',
 'prefs-watchlist' => 'Wobglědowańka',
@@ -1425,7 +1439,7 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
 'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny}}',
 'recentchanges' => 'Aktualne změny',
 'recentchanges-legend' => 'Opcije aktualnych změnow',
-'recentchangestext' => "How móžoš slědne změny we '''{{GRAMMAR:lokatiw|{{SITENAME}}}}''' slědowaś.",
+'recentchanges-summary' => "How móžoš slědne změny we '''{{GRAMMAR:lokatiw|{{SITENAME}}}}''' slědowaś.",
 'recentchanges-feed-description' => 'Slěduj z toś tym zapódaśim nejaktualnjejše změny we {{GRAMMAR:lokatiw|{{SITENAME}}}}.',
 'recentchanges-label-newpage' => 'Toś ta změna jo nowy bok napórała.',
 'recentchanges-label-minor' => 'To jo snadna změna',
@@ -1626,14 +1640,15 @@ $1',
 'backend-fail-writetemp' => 'Temporerna dataja njedajo se pisaś.',
 'backend-fail-closetemp' => 'Temporerna dataja njedajo se zacyniś.',
 'backend-fail-read' => 'Dataja $1 njedajo se cytaś.',
-'backend-fail-create' => 'Dataja $1 njedajo se napóraś.',
-'backend-fail-maxsize' => 'Dataja $1 njedajo se napóraś, dokulaž jo wětša ako {{PLURAL:$2|$2 bajt|$2 bajta|$2 bajty|$2 bajtow}}.',
+'backend-fail-create' => 'Dataja $1 njedajo se pisaś.',
+'backend-fail-maxsize' => 'Dataja $1 njedajo se pisaś, dokulaž jo wětša ako {{PLURAL:$2|jaden bajt|$2 bajta|$2 bajty|$2 bajtow}}.',
 'backend-fail-readonly' => 'Składowański backend "$1" dajo se tuchylu jano cytaś. Pśicyna jo była: "$2"',
 'backend-fail-synced' => 'Dataja "$1" jo  w internem składowańskem backenźe w inkonsistentnem stawje',
 'backend-fail-connect' => 'Zwisk z datajowym składowańskem backendom "$1" njejo móžno.',
 'backend-fail-internal' => 'W składowańskem backenźe "$1" jo njeznata zmólka nastała.',
 'backend-fail-contenttype' => 'Wopśimjeśowy typ dataje, kótaraž ma se na "$1" składowaś, njedajo se zwěsćiś.',
 'backend-fail-batchsize' => 'Štapjelowa dataja, kótaraž wopśimujo {{PLURAL:$1|jadnu operaciju|$1 operaciji|$1 operacije|$1 operacijow}},  jo se  na składowański backend pósłała; limit jo $2 {{PLURAL:$1|operaciju|operaciji|operacije|operacijow}}.',
+'backend-fail-usable' => 'Dataja $1 njedajo se dla njedosegajucych  abo felujucych zapisow pisaś.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Njejo žeden zwisk ze žurnaloweju datoweju banku za składowański backend "$1" móžno.',
@@ -1704,7 +1719,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)',
@@ -1948,6 +1963,7 @@ Pšosym glědaj na to, až druge websedła móžu k drugej dataji z direktnym UR
 'alllogstext' => 'To jo kombiněrowane zwobraznjenje wšyknych we {{GRAMMAR:lokatiw|{{SITENAME}}}} k dispoziciji stojecych protokolow. Móžoš naglěd pśez wubraśe protokolowego typa, wužywarskego mjenja (pód źiwanim wjelikopisanja) abo pótrjefjonego boka (teke pód źiwanim wjelikopisanja) wobgranicowaś.',
 'logempty' => 'Žedne se góźece zapise njeeksistěruju.',
 'log-title-wildcard' => 'Pytaś nadpismo, kótarež zachopijo z ...',
+'showhideselectedlogentries' => 'Wubrane protokolowe zapiski pokazaś/schowaś',
 
 # Special:AllPages
 'allpages' => 'Wšykne boki',
@@ -1967,6 +1983,11 @@ Pšosym glědaj na to, až druge websedła móžu k drugej dataji z direktnym UR
 'allpages-bad-ns' => 'Mjenjowy rum „$1“ w {{SITENAME}} njeeksistěrujo.',
 'allpages-hide-redirects' => 'Dalejpósrědnjenja schowaś',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Woglědujoš se pufrowanu wersiju toś togo boka, kótaraž móžo do $1 stara byś.',
+'cachedspecial-viewing-cached-ts' => 'Woglědujoš se pufrowanu wersiju toś togo boka, kótaraž by mógła njeaktualna byś.',
+'cachedspecial-refresh-now' => 'Aktualnu wersiju se woglědaś.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slědujuca kategorija wopśimujo|Slědujucej kategoriji wopśimujotej|Slědujuce kategorije wopśimuju|Slědujuce kategorije wopśimuju}} boki abo medije.
@@ -2391,8 +2412,8 @@ Nejnowšy zapisk protokola blokěrowanjow pódawa se dołojce ako referenca:',
 'ipb-confirm' => 'Blokěrowanje wobkšuśiś',
 'badipaddress' => 'IP-adresa jo njekorektna',
 'blockipsuccesssub' => 'Wuspěšnje blokěrowane',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se blokěrował.<br />
-Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěrowanja pśeglědał.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] jo se {{GENDER:$1|blokěrował|blokěrowała}}.<br />
+Glědaj do [[Special:BlockList|lisćiny blokěrowanjow]], aby blokěrowanja pśeglědał.',
 'ipb-blockingself' => 'Coš samogo blokěrowaś! Coš to napšawdu cyniś?',
 'ipb-confirmhideuser' => 'Coš rowno wužywarja z nastajenim "wužywarja schowaś" blokěrowaś. To k tomu dowjeźo, až mě wužywarja pódłocyjo se we wšych lisćinach a protokolowych zapiskach. Coš to napšawdu cyniś?',
 'ipb-edit-dropdown' => 'Pśicyny blokěrowanja wobźěłaś',
@@ -2442,9 +2463,7 @@ Glědaj do [[Special:BlockList|lisćiny aktiwnych blokěrowanjow]], aby blokěro
 'blocklog-showsuppresslog' => 'Toś ten wužywaŕ jo se pjerwjej zablokěrował a schował. Protokol pódtłocowanjow pódawa se dołojce ako referenca:',
 'blocklogentry' => '[[$1]] blokěrujo se na $2 $3',
 'reblock-logentry' => 'jo změnił blokěrowańske nastajenja za [[$1]] z casom spadnjenja $2 $3',
-'blocklogtext' => 'To jo protokol blokěrowanjow a dopušćenjow.
-IP-adresy, ako su awtomatiski se blokěrowali, se njepokažu.
-Na boce [[Special:BlockList|Lisćina blokěrowanych IP-adresow a wužywarskich mjenjow]] jo móžno, akualne blokěrowanja pśeglědowaś.',
+'blocklogtext' => 'To jo protokol blokěrowanja a wótblokěrowanja wužywarjow. Awtomatiski blokěrowane IP-adrese se njenalistuju. Glědaj [[Special:BlockList|lisćinu blokěrowanjow]] za lisćinu tuchylnych wugnanjow a blokěrowanjow.',
 'unblocklogentry' => 'jo $1 zasej dopušćił',
 'block-log-flags-anononly' => 'jano anonymne',
 'block-log-flags-nocreate' => 'stwórjenje konta jo se znjemóžniło',
@@ -2800,6 +2819,7 @@ W zespominanju dajo se pśicyna pódaś.',
 'spambot_username' => 'MediaWikijowe spamowe rěšenje',
 'spam_reverting' => 'Nawrośijo se slědna wersija, kótaraž njejo wopśimjeła wótkaz na $1.',
 'spam_blanking' => 'Wšykne wersije su wopśimowali wótkaze na $1, do rěcha spórane.',
+'spam_deleting' => 'Wšykne wersije z wótkazami do $1 so lašuju',
 
 # Info page
 'pageinfo-title' => 'Informacije za bok "$1"',
@@ -3031,7 +3051,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',
@@ -3507,6 +3527,9 @@ Ty by dejał [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licence GNU General Public
 'version-software' => 'Instalěrowana software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Wersija',
+'version-entrypoints' => 'URL zastupneho dypka',
+'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Datajowa droga',
@@ -3694,4 +3717,17 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'api-error-uploaddisabled' => 'Nagraśa su na toś tom wikiju znjemóžnjone.',
 'api-error-verification-error' => 'Toś ta dataja by mógła wobkškóźona byś abo wopacnu kóńcowku měś.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunźe|sekundy|sekundow}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuśe|minuty|minutow}}',
+'duration-hours' => '$1 {{PLURAL:$1|góźina|góźinje|góźiny|góźinow}}',
+'duration-days' => '$1 {{PLURAL:$1|źeń|dnja|dny|dnjow}}',
+'duration-weeks' => '$1 {{PLURAL: $1|tyźeń|tyźenja|tyźenje|tyźenjow}}',
+'duration-years' => '$1 {{PLURAL: $1|lěto|lěśe|lěta|lět}}',
+'duration-decades' => '$1 {{PLURAL:$1|lětźasetk|lětźasetka|lětźasetki|lětźastkow}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
+'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Zastajenja na serwer $1 njedaju se wótwołaś.',
 );
index f40255e..d32ea2b 100644 (file)
@@ -848,7 +848,6 @@ Intaai [[Special:BlockList|lis IP nantaban]] montok lis kawawagu karaja mogoduh
 
 # Diffs
 'history-title' => 'Susuyan sinimakan do "$1"',
-'difference' => '(Pisuaian mantad sinimakan)',
 'lineno' => 'Baris $1:',
 'compareselectedversions' => 'Popitimbang sinimakan nopili',
 'showhideselectedversions' => 'Pokitono/polisoko sinimakan nopili',
index 21471f4..f701a65 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
@@ -1267,8 +1276,9 @@ $1",
 'mergelogpagetext' => 'Παρακάτω είναι μια λίστα με τις πιο πρόσφατες συγχωνεύσεις ιστορικού μιας σελίδας σε άλλο.',
 
 # Diffs
-'history-title' => 'Ιστορικό εκδόσεων για τη σελίδα "$1"',
-'difference' => '(Διαφορές μεταξύ αναθεωρήσεων)',
+'history-title' => '"$1": Ιστορικό εκδόσεων',
+'difference-title' => 'Διαφορά μεταξύ των αναθεωρήσεων του "$1"',
+'difference-title-multipage' => 'Διαφορά μεταξύ των σελίδων "$1" και "$2"',
 'difference-multipage' => '(Διαφορές μεταξύ των σελίδων)',
 'lineno' => 'Γραμμή $1:',
 'compareselectedversions' => 'Σύγκριση των εκδόσεων που έχουν επιλεγεί',
@@ -1363,6 +1373,7 @@ $1",
 'prefs-beta' => 'Λειτουργίες της Beta',
 'prefs-datetime' => 'Ημερομηνία και ώρα',
 'prefs-labs' => 'Λειτουργίες των Labs',
+'prefs-user-pages' => 'Σελίδες του χρήστη',
 'prefs-personal' => 'Στοιχεία χρήστη',
 'prefs-rc' => 'Πρόσφατες αλλαγές και εμφάνιση πολύ σύντομων άρθρων',
 'prefs-watchlist' => 'Λίστα παρακολούθησης',
@@ -1623,7 +1634,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|αλλαγή|αλλαγές}}',
 'recentchanges' => 'Πρόσφατες αλλαγές',
 'recentchanges-legend' => 'Επιλογές των πρόσφατων αλλαγών',
-'recentchangestext' => 'Παρακολουθήστε σε αυτή τη σελίδα τις πιο πρόσφατες αλλαγές στο Wiki.',
+'recentchanges-summary' => 'Παρακολουθήστε σε αυτή τη σελίδα τις πιο πρόσφατες αλλαγές στο Wiki.',
 'recentchanges-feed-description' => 'Παρακολουθήστε τις πιο πρόσφατες αλλαγές στο wiki σε αυτή τη ροή δεδομένων.',
 'recentchanges-label-newpage' => 'Αυτή η επεξεργασία δημιούργησε μια νέα σελίδα',
 'recentchanges-label-minor' => 'Αυτή είναι μια αλλαγή μικρής κλίμακας',
@@ -1653,6 +1664,7 @@ $1",
 'newsectionsummary' => '/* $1 */ νέα ενότητα',
 'rc-enhanced-expand' => 'Εμφάνιση λεπτομερειών (απαιτείται JavaScript)',
 'rc-enhanced-hide' => 'Απόκρυψη λεπτομερειών',
+'rc-old-title' => 'αρχικά δημιουργήθηκε ως " $1 "',
 
 # Recent changes linked
 'recentchangeslinked' => 'Σχετικές αλλαγές',
@@ -1807,6 +1819,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 +1947,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 +2082,7 @@ $1',
 'wantedpages-badtitle' => 'Μη εγκυρός τίτλος στο σύνολο αποτελέσματος: $1',
 'wantedfiles' => 'Επιθυμητά αρχεία',
 'wantedfiletext-cat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Αρχεία από εξωτερικά αποθετήρια ενδέχεται να παρατίθενται παρότι υπάρχουν. Κάθε τέτοιες λανθασμένες αναφορές θα <del>διαγραμμίζονται</del>. Επιπλέον, σελίδες που ενσωματώνουν αρχεία που δεν υπάρχουν παρατίθενται στο [[:$1]].',
+'wantedfiletext-nocat' => 'Τα ακόλουθα αρχεία χρησιμοποιούνται αλλά δεν υπάρχουν. Πέρα από τα υπάρχοντα ενδέχεται να έχουν καταχωριστεί και αρχεία από εξωτερικές πηγές λογισμικού. Τέτοιες ψευδο-υπαρκτές καταχωρίσεις θα εμφανίζονται <del>διαγραμμισμένες</del>.',
 'wantedtemplates' => 'Επιθυμητά πρότυπα',
 'mostlinked' => 'Οι σελίδες με τις περισσότερες αναφορές',
 'mostlinkedcategories' => 'Περισσότερο χρησιμοποιούμενες κατηγορίες',
@@ -2073,6 +2091,7 @@ $1',
 'mostimages' => 'Περισσότερο χρησιμοποιούμενα αρχεία',
 'mostrevisions' => 'Άρθρα με τις περισσότερες αναθεωρήσεις',
 'prefixindex' => 'Όλες οι σελίδες με πρόθεμα',
+'prefixindex-namespace' => 'Όλες οι σελίδες με πρόθεμα (περιοχής  $1)',
 'shortpages' => 'Σύντομες σελίδες',
 'longpages' => 'Εκτενείς σελίδες',
 'deadendpages' => 'Αδιέξοδες σελίδες',
@@ -2110,6 +2129,7 @@ $1',
 # Book sources
 'booksources' => 'Πηγές βιβλίων',
 'booksources-search-legend' => 'Αναζήτηση για πηγές βιβλίων',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Πήγαινε',
 'booksources-text' => 'Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:',
 'booksources-invalid-isbn' => 'Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.',
@@ -2139,6 +2159,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 +2185,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 +2408,7 @@ $UNWATCHURL
 'protect-title-notallowed' => 'Εμφάνιση επιπέδου προστασίας για την "$1"',
 'prot_1movedto2' => 'Η [[$1]] μετακινήθηκε στη θέση [[$2]]',
 'protect-badnamespace-title' => 'Μη-προστατευόμενη ομάδα σελίδων',
+'protect-badnamespace-text' => 'Οι  σελίδες σε αυτόν τον ονοματοχώρο δεν μπορούν να κλειδωθούν.',
 'protect-legend' => 'Επιβεβαίωση κλειδώματος',
 'protectcomment' => 'Αιτία:',
 'protectexpiry' => 'Λήξη',
@@ -2577,8 +2606,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 +2660,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' => 'δημιουργία λογαριασμού απενεργοποιημένη',
@@ -2658,7 +2687,7 @@ $1',
 'proxyblocker-disabled' => 'Η λειτουργία αυτή έχει απενεργοποιηθεί.',
 'proxyblockreason' => 'Η διεύθυνση IP σας έχει υποστεί φραγή γιατί είναι open proxy. Παρακαλούμε επικοινωνείστε με τον παροχέα υπηρεσιών Διαδικτύου που χρησιμοποιείτε ή με την τεχνική υποστήριξη, για να θέσετε υπ΄ όψη τους αυτό το σοβαρό θέμα ασφάλειας.',
 'proxyblocksuccess' => 'Ολοκληρώθηκε!',
-'sorbsreason' => 'Η διεύθνυση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.',
+'sorbsreason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί ως open proxy στο DNSBL.',
 'sorbs_create_account_reason' => 'Η διεύθυνση IP σας έχει χαρακτηρισθεί open proxy στο DNSBL. Δεν μπορείτε να δημιουργήσετε λογαριασμό χρήστη.',
 'cant-block-while-blocked' => 'Δεν μπορείτε να φράξετε άλλους χρήστες ενώ είστε φραγμένος/η.',
 'cant-see-hidden-user' => 'Ο χρήστης που προσπαθείτε να αποκλείσετε έχει ήδη αποκλειστεί και αποκρυφτεί.
@@ -2879,7 +2908,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 +2978,7 @@ $1',
 'tooltip-diff' => 'Προβολή των αλλαγών που κάνατε στο κείμενο.',
 'tooltip-compareselectedversions' => 'Εμφάνιση των διαφορών ανάμεσα στις δύο αναθεωρήσεις της σελίδας που έχετε επιλέξει.',
 'tooltip-watch' => 'Προσθήκη της σελίδας στη λίστα παρακολούθησης',
+'tooltip-watchlistedit-normal-submit' => 'Μετακίνηση τίτλων',
 'tooltip-watchlistedit-raw-submit' => 'Ενημέρωση λίστας παρακολούθησης',
 'tooltip-recreate' => 'Ξαναδημιούργησε τη σελίδα παρόλο που έχει διαγραφεί',
 'tooltip-upload' => 'Έναρξη φόρτωσης',
@@ -3661,6 +3699,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 +3724,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' => 'Διαδρομή αρχείου',
@@ -3795,13 +3837,33 @@ $5
 'sqlite-no-fts' => '$1 χωρίς την υποστήριξη αναζήτησης πλήρους κειμένου',
 
 # New logging system
+'logentry-delete-delete' => 'Ο/η $1 διέγραψε τη σελίδα $3',
+'logentry-delete-restore' => 'Ο/η $1 αποκατέστησε τη σελίδα $3',
+'logentry-delete-event' => '$1 άλλαξε την ορατότητα σε  {{PLURAL:$5|ένα γεγονός καταγραφής|$5 log events}} στο  $3: $4',
+'logentry-suppress-delete' => 'Ο $1 διέγραψε τη σελίδα $3',
+'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' => 'Ακύρωση',
@@ -3812,6 +3874,8 @@ $5
 'feedback-error3' => 'Σφάλμα: Καμία απάντηση από το API',
 'feedback-thanks' => 'Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα "[$2 $1]".',
 'feedback-close' => 'Ολοκληρώθηκε',
+'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
+'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
 # API errors
 'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
@@ -3851,4 +3915,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 6b07bc6..b8c2405 100644 (file)
@@ -191,6 +191,7 @@ $bookstoreList = array(
  * Customisable syntax for wikitext and elsewhere.
  *
  * IDs must be valid identifiers, they cannot contain hyphens.
+ * CASE is 0 to match all case variants, 1 for case-sensitive
  *
  * Note to translators:
  *   Please include the English words as synonyms.  This allows people
@@ -287,7 +288,8 @@ $magicWords = array(
        'nse'                    => array( 0,    'NSE:'                   ),
        'localurl'               => array( 0,    'LOCALURL:'              ),
        'localurle'              => array( 0,    'LOCALURLE:'             ),
-       'articlepath'            => array( 0,    'ARTICLEPATH'            ),
+       'articlepath'            => array( 0,    'ARTICLEPATH'            ),
+       'pageid'                 => array( 0,    'PAGEID'                 ),
        'server'                 => array( 0,    'SERVER'                 ),
        'servername'             => array( 0,    'SERVERNAME'             ),
        'scriptpath'             => array( 0,    'SCRIPTPATH'             ),
@@ -635,7 +637,7 @@ XHTML id names.
 'tog-hidepatrolled'           => 'Hide patrolled edits in recent changes',
 'tog-newpageshidepatrolled'   => 'Hide patrolled pages from new page list',
 'tog-extendwatchlist'         => 'Expand watchlist to show all changes, not just the most recent',
-'tog-usenewrc'                => 'Use enhanced recent changes (requires JavaScript)',
+'tog-usenewrc'                => 'Group changes by page in recent changes and watchlist (requires JavaScript)',
 'tog-numberheadings'          => 'Auto-number headings',
 'tog-showtoolbar'             => 'Show edit toolbar (requires JavaScript)',
 'tog-editondblclick'          => 'Edit pages on double click (requires JavaScript)',
@@ -758,6 +760,7 @@ XHTML id names.
 'index-category'                 => 'Indexed pages',
 'noindex-category'               => 'Noindexed pages',
 'broken-file-category'           => 'Pages with broken file links',
+'categoryviewer-pagedlinks'      => '($1) ($2)',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD', # only translate this message to other languages if you have to change it
 
@@ -999,9 +1002,6 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
 'directorycreateerror' => 'Could not create directory "$1".',
 'filenotfound'         => 'Could not find file "$1".',
 'fileexistserror'      => 'Unable to write to file "$1": File exists.',
-'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".',
 'unexpected'           => 'Unexpected value: "$1"="$2".',
 'formerror'            => 'Error: Could not submit form.',
 'badarticleerror'      => 'This action cannot be performed on this page.',
@@ -1039,6 +1039,11 @@ $2',
 'ns-specialprotected'  => 'Special pages cannot be edited.',
 'titleprotected'       => 'This title has been protected from creation by [[User:$1|$1]].
 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''",
@@ -1082,6 +1087,8 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 Please choose a different name.',
 'loginerror'                 => 'Login error',
 'createaccounterror'         => 'Could not create account: $1',
+'exception-nologin'          => 'Not logged in',
+'exception-nologin-text'     => 'This page or action requires you to be logged in on this wiki.',
 'nocookiesnew'               => 'The user account was created, but you are not logged in.
 {{SITENAME}} uses cookies to log in users.
 You have cookies disabled.
@@ -1372,7 +1379,8 @@ Custom .css and .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.css
 'updated'                          => '(Updated)',
 'note'                             => "'''Note:'''",
 'previewnote'                      => "'''Remember that this is only a preview.'''
-Your changes have not yet been saved! [[#editform|→ Continue editing]]",
+Your changes have not yet been saved!",
+'continue-editing'                 => "Continue editing",
 'previewconflict'                  => 'This preview reflects the text in the upper text editing area as it will appear if you choose to save.',
 'session_fail_preview'             => "'''Sorry! We could not process your edit due to a loss of session data.'''
 Please try again.
@@ -1399,7 +1407,7 @@ You will have to merge your changes into the existing text.
 '''Only''' the text in the upper text area will be saved when you press \"{{int:savearticle}}\".",
 'yourtext'                         => 'Your text',
 'storedversion'                    => 'Stored revision',
-'nonunicodebrowser'                => "'''Warning: Your browser is not unicode compliant.'''
+'nonunicodebrowser'                => "'''Warning: Your browser is not Unicode compliant.'''
 A workaround is in place to allow you to safely edit pages: Non-ASCII characters will appear in the edit box as hexadecimal codes.",
 'editingold'                       => "'''Warning: You are editing an out-of-date revision of this page.'''
 If you save it, any changes made since this revision will be lost.",
@@ -1477,6 +1485,12 @@ These arguments have been omitted.",
 'parser-template-loop-warning'            => 'Template loop detected: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Template recursion depth limit exceeded ($1)',
 'language-converter-depth-warning'        => 'Language converter depth limit exceeded ($1)',
+'node-count-exceeded-category'            => 'Pages where node-count is exceeded',
+'node-count-exceeded-warning'             => 'Page exceeded the node-count',
+'expansion-depth-exceeded-category'       => 'Pages where expansion depth is exceeded',
+'expansion-depth-exceeded-warning'        => 'Page exceeded the expansion depth',
+'parser-unstrip-loop-warning'             => 'Unstrip loop detected',
+'parser-unstrip-recursion-limit'          => 'Unstrip recursion limit exceeded ($1)',
 
 # "Undo" feature
 'undo-success' => 'The edit can be undone.
@@ -1626,7 +1640,7 @@ Please check the logs.',
 # Suppression log
 'suppressionlog'     => 'Suppression log',
 'suppressionlogtext' => 'Below is a list of deletions and blocks involving content hidden from administrators.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 
 # History merging
 'mergehistory'                     => 'Merge page histories',
@@ -1652,6 +1666,7 @@ Note that using the navigation links will reset this column.',
 'mergehistory-comment'             => 'Merged [[:$1]] into [[:$2]]: $3',
 'mergehistory-same-destination'    => 'Source and destination pages cannot be the same',
 'mergehistory-reason'              => 'Reason:',
+'mergehistory-revisionrow'         => '$1 ($2) $3 . . $4 $5 $6',
 
 # Merge log
 'mergelog'           => 'Merge log',
@@ -1660,15 +1675,16 @@ Note that using the navigation links will reset this column.',
 'mergelogpagetext'   => 'Below is a list of the most recent merges of one page history into another.',
 
 # Diffs
-'history-title'            => 'Revision history of "$1"',
-'difference'               => '(Difference between revisions)',
-'difference-multipage'     => '(Difference between pages)',
-'lineno'                   => 'Line $1:',
-'compareselectedversions'  => 'Compare selected revisions',
-'showhideselectedversions' => 'Show/hide selected revisions',
-'editundo'                 => 'undo',
-'diff-multi'               => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
-'diff-multi-manyusers'     => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
+'history-title'              => 'Revision history of "$1"',
+'difference-title'           => 'Difference between revisions of "$1"',
+'difference-title-multipage' => 'Difference between pages "$1" and "$2"',
+'difference-multipage'       => '(Difference between pages)',
+'lineno'                     => 'Line $1:',
+'compareselectedversions'    => 'Compare selected revisions',
+'showhideselectedversions'   => 'Show/hide selected revisions',
+'editundo'                   => 'undo',
+'diff-multi'                 => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by {{PLURAL:$2|one user|$2 users}} not shown)',
+'diff-multi-manyusers'       => '({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by more than $2 {{PLURAL:$2|user|users}} not shown)',
 
 # Search results
 'search-summary'                   => '', # do not translate or duplicate this message to other languages
@@ -1781,6 +1797,7 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 'prefs-beta'                    => 'Beta features',
 'prefs-datetime'                => 'Date and time',
 'prefs-labs'                    => 'Labs features',
+'prefs-user-pages'              => 'User pages',
 'prefs-personal'                => 'User profile',
 'prefs-rc'                      => 'Recent changes',
 'prefs-watchlist'               => 'Watchlist',
@@ -2051,7 +2068,8 @@ Your e-mail address is not revealed when other users contact you.',
 'recentchanges'                     => 'Recent changes',
 'recentchanges-url'                 => 'Special:RecentChanges', # do not translate or duplicate this message to other languages
 'recentchanges-legend'              => 'Recent changes options',
-'recentchangestext'                 => 'Track the most recent changes to the wiki on this page.',
+'recentchanges-summary'             => 'Track the most recent changes to the wiki on this page.',
+'recentchangestext'                 => '-', # do not translate or duplicate this message to other languages
 'recentchanges-feed-description'    => 'Track the most recent changes to the wiki in this feed.',
 'recentchanges-label-newpage'       => 'This edit created a new page',
 'recentchanges-label-minor'         => 'This is a minor edit',
@@ -2273,8 +2291,9 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-writetemp'     => 'Could not write to temporary file.',
 'backend-fail-closetemp'     => 'Could not close temporary file.',
 'backend-fail-read'          => 'Could not read file $1.',
-'backend-fail-create'        => 'Could not create file $1.',
-'backend-fail-maxsize'       => 'Could not create file $1 because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.',
+'backend-fail-create'        => 'Could not write file $1.',
+'backend-fail-maxsize'       => 'Could not write file $1 because it is larger than {{PLURAL:$2|one byte|$2 bytes}}.',
+'backend-fail-usable'        => 'Could not write file $1 due to insufficient permissions or missing directories/containers.',
 'backend-fail-readonly'      => 'The storage backend "$1" is currently read-only. The reason given is: "\'\'$2\'\'"',
 'backend-fail-synced'        => 'The file "$1" is in an inconsistent state within the internal storage backends',
 'backend-fail-connect'       => 'Could not connect to storage backend "$1".',
@@ -2282,7 +2301,6 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-contenttype'   => 'Could not determine the content type of the file to store at "$1".',
 'backend-fail-batchsize'     => 'Storage backend given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
 
-# File journal
 'filejournal-fail-dbconnect' => 'Could not connect to the journal database for storage backend "$1".',
 'filejournal-fail-dbquery'   => 'Could not update the journal database for storage backend "$1".',
 
@@ -2295,6 +2313,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'lockmanager-fail-releaselock' => 'Could not release lock for "$1".',
 'lockmanager-fail-db-bucket'   => 'Could not contact enough lock databases in bucket $1.',
 'lockmanager-fail-db-release'  => 'Could not release locks on database $1.',
+'lockmanager-fail-svr-acquire' => 'Could not acquire locks on server $1.',
 'lockmanager-fail-svr-release' => 'Could not release locks on server $1.',
 
 # ZipDirectoryReader
@@ -2508,7 +2527,7 @@ Remember to check for other links to the templates before deleting them.',
 'disambiguationspage'     => 'Template:disambig',
 'disambiguations-text'    => "The following pages link to a '''disambiguation page'''.
 They should link to the appropriate topic instead.<br />
-A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]]",
+A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects'                   => 'Double redirects',
 'doubleredirects-summary'           => '', # do not translate or duplicate this message to other languages
@@ -2643,35 +2662,41 @@ Please note that other web sites may link to a file with a direct URL, and so ma
 'pubmedurl' => '//www.ncbi.nlm.nih.gov/pubmed/$1?dopt=Abstract', # do not translate or duplicate this message to other languages
 
 # Special:Log
-'specialloguserlabel'  => 'Performer:',
-'speciallogtitlelabel' => 'Target (title or user):',
-'log'                  => 'Logs',
-'all-logs-page'        => 'All public logs',
-'alllogstext'          => 'Combined display of all available logs of {{SITENAME}}.
+'specialloguserlabel'        => 'Performer:',
+'speciallogtitlelabel'       => 'Target (title or user):',
+'log'                        => 'Logs',
+'all-logs-page'              => 'All public logs',
+'alllogstext'                => 'Combined display of all available logs of {{SITENAME}}.
 You can narrow down the view by selecting a log type, the username (case-sensitive), or the affected page (also case-sensitive).',
-'logempty'             => 'No matching items in log.',
-'log-title-wildcard'   => 'Search titles starting with this text',
+'logempty'                   => 'No matching items in log.',
+'log-title-wildcard'         => 'Search titles starting with this text',
+'showhideselectedlogentries' => 'Show/hide selected log entries',
 
 # Special:AllPages
-'allpages'          => 'All pages',
-'allpages-summary'  => '', # do not translate or duplicate this message to other languages
-'alphaindexline'    => '$1 to $2',
-'nextpage'          => 'Next page ($1)',
-'prevpage'          => 'Previous page ($1)',
-'allpagesfrom'      => 'Display pages starting at:',
-'allpagesto'        => 'Display pages ending at:',
-'allarticles'       => 'All pages',
-'allinnamespace'    => 'All pages ($1 namespace)',
-'allnotinnamespace' => 'All pages (not in $1 namespace)',
-'allpagesprev'      => 'Previous',
-'allpagesnext'      => 'Next',
-'allpagessubmit'    => 'Go',
-'allpagesprefix'    => 'Display pages with prefix:',
-'allpagesbadtitle'  => 'The given page title was invalid or had an inter-language or inter-wiki prefix.
+'allpages'                => 'All pages',
+'allpages-summary'        => '', # do not translate or duplicate this message to other languages
+'alphaindexline'          => '$1 to $2',
+'nextpage'                => 'Next page ($1)',
+'prevpage'                => 'Previous page ($1)',
+'allpagesfrom'            => 'Display pages starting at:',
+'allpagesto'              => 'Display pages ending at:',
+'allarticles'             => 'All pages',
+'allinnamespace'          => 'All pages ($1 namespace)',
+'allnotinnamespace'       => 'All pages (not in $1 namespace)',
+'allpagesprev'            => 'Previous',
+'allpagesnext'            => 'Next',
+'allpagessubmit'          => 'Go',
+'allpagesprefix'          => 'Display pages with prefix:',
+'allpagesbadtitle'        => 'The given page title was invalid or had an inter-language or inter-wiki prefix.
 It may contain one or more characters which cannot be used in titles.',
-'allpages-bad-ns'   => '{{SITENAME}} does not have namespace "$1".',
+'allpages-bad-ns'         => '{{SITENAME}} does not have namespace "$1".',
 'allpages-hide-redirects' => 'Hide redirects',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'You are viewing a cached version of this page, which can be up to $1 old.',
+'cachedspecial-viewing-cached-ts' => 'You are viewing a cached version of this page, which might not be completely actual.',
+'cachedspecial-refresh-now' => 'View latest.',
+
 # Special:Categories
 'categories'                    => 'Categories',
 'categories-summary'            => '', # do not translate or duplicate this message to other languages
@@ -3035,6 +3060,7 @@ It may have already been undeleted.',
 $1',
 'undelete-show-file-confirm'   => 'Are you sure you want to view the deleted revision of the file "<nowiki>$1</nowiki>" from $2 at $3?',
 'undelete-show-file-submit'    => 'Yes',
+'undelete-revisionrow'        => "$1 $2 $3 $4 . . $5 $6 $7",
 
 # Namespace form on various pages
 'namespace'                     => 'Namespace:',
@@ -3137,7 +3163,7 @@ Fill in a specific reason below (for example, citing particular pages that were
 'badipaddress'                    => 'Invalid IP address',
 'blockipsuccesssub'               => 'Block succeeded',
 'blockipsuccesstext'              => '[[Special:Contributions/$1|$1]] has been blocked.<br />
-See [[Special:BlockList|IP block list]] to review blocks.',
+See the [[Special:BlockList|block list]] to review blocks.',
 'ipb-blockingself'                => 'You are about to block yourself!  Are you sure you want to do that?',
 'ipb-confirmhideuser'             => 'You are about to block a user with "hide user" enabled.  This will suppress the user\'s name in all lists and log entries.  Are you sure you want to do that?',
 'ipb-edit-dropdown'               => 'Edit block reasons',
@@ -3172,10 +3198,10 @@ See [[Special:BlockList|IP block list]] to review blocks.',
 'expiringblock'                   => 'expires on $1 at $2',
 'anononlyblock'                   => 'anon. only',
 'noautoblockblock'                => 'autoblock disabled',
-'createaccountblock'              => 'account creation blocked',
-'emailblock'                      => 'e-mail blocked',
+'createaccountblock'              => 'account creation disabled',
+'emailblock'                      => 'e-mail disabled',
 'blocklist-nousertalk'            => 'cannot edit own talk page',
-'ipblocklist-empty'               => 'The blocklist is empty.',
+'ipblocklist-empty'               => 'The block list is empty.',
 'ipblocklist-no-results'          => 'The requested IP address or username is not blocked.',
 'blocklink'                       => 'block',
 'unblocklink'                     => 'unblock',
@@ -3193,12 +3219,12 @@ The suppress log is provided below for reference:',
 'reblock-logentry'                => 'changed block settings for [[$1]] with an expiry time of $2 $3',
 'blocklogtext'                    => 'This is a log of user blocking and unblocking actions.
 Automatically blocked IP addresses are not listed.
-See the [[Special:BlockList|IP block list]] for the list of currently operational bans and blocks.',
+See the [[Special:BlockList|block list]] for the list of currently operational bans and blocks.',
 'unblocklogentry'                 => 'unblocked $1',
 'block-log-flags-anononly'        => 'anonymous users only',
 'block-log-flags-nocreate'        => 'account creation disabled',
 'block-log-flags-noautoblock'     => 'autoblock disabled',
-'block-log-flags-noemail'         => 'e-mail blocked',
+'block-log-flags-noemail'         => 'e-mail disabled',
 'block-log-flags-nousertalk'      => 'cannot edit own talk page',
 'block-log-flags-angry-autoblock' => 'enhanced autoblock enabled',
 'block-log-flags-hiddenname'      => 'username hidden',
@@ -3670,6 +3696,7 @@ This is probably caused by a link to a blacklisted external site.',
 'spambot_username'    => 'MediaWiki spam cleanup',
 'spam_reverting'      => 'Reverting to last revision not containing links to $1',
 'spam_blanking'       => 'All revisions contained links to $1, blanking',
+'spam_deleting'       => 'All revisions contained links to $1, deleting',
 
 # Info page
 'pageinfo-title'            => 'Information for "$1"',
@@ -4409,6 +4436,7 @@ Please confirm that you really want to recreate this page.",
 'ellipsis'            => '...', # only translate this message to other languages if you have to change it
 'percent'             => '$1%', # only translate this message to other languages if you have to change it
 'parentheses'         => '($1)', # only translate this message to other languages if you have to change it
+'brackets'            => '[$1]', # only translate this message to other languages if you have to change it
 
 # Multipage image navigation
 'imgmultipageprev' => '← previous page',
@@ -4618,6 +4646,14 @@ You should have received [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the GNU Gen
 'version-software'              => 'Installed software',
 'version-software-product'      => 'Product',
 'version-software-version'      => 'Version',
+'version-entrypoints'           => 'Entry point URLs',
+'version-entrypoints-header-entrypoint' => 'Entry point',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
+'version-entrypoints-index-php' => '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
+'version-entrypoints-api-php'   => '[https://www.mediawiki.org/wiki/Manual:api.php api.php]',
+'version-entrypoints-load-php'  => '[https://www.mediawiki.org/wiki/Manual:load.php load.php]',
 
 # Special:FilePath
 'filepath'         => 'File path',
@@ -4832,4 +4868,15 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'api-error-uploaddisabled'                => 'Uploading is disabled on this wiki.',
 'api-error-verification-error'            => 'This file might be corrupt, or have the wrong extension.',
 
+# Durations
+'duration-seconds'   => '$1 {{PLURAL:$1|second|seconds}}',
+'duration-minutes'   => '$1 {{PLURAL:$1|minute|minutes}}',
+'duration-hours'     => '$1 {{PLURAL:$1|hour|hours}}',
+'duration-days'      => '$1 {{PLURAL:$1|day|days}}',
+'duration-weeks'     => '$1 {{PLURAL:$1|week|weeks}}',
+'duration-years'     => '$1 {{PLURAL:$1|year|years}}',
+'duration-decades'   => '$1 {{PLURAL:$1|decade|decades}}',
+'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 574a21f..1f7eea9 100644 (file)
@@ -17,6 +17,7 @@
  * @author Iketsi
  * @author Jens Liebenau
  * @author Kaganer
+ * @author Karika
  * @author Lucas
  * @author LyzTyphone
  * @author Malafaya
@@ -24,6 +25,7 @@
  * @author Michawiki
  * @author Mihxil
  * @author MinuteElectron
+ * @author Objectivesea
  * @author Omnipaedista
  * @author Pedroca cerebral
  * @author Petrus Adamus
@@ -298,7 +300,7 @@ $magicWords = array(
        'url_query'               => array( '0', 'INFORMPETO', 'QUERY' ),
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $datePreferences = false;
 $defaultDateFormat = 'dmy';
@@ -533,12 +535,12 @@ $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',
+'pool-timeout' => 'Tempolimo atingita dum atendo de ŝlosado',
 'pool-queuefull' => 'Atendovico de servilaro estas plena.',
 'pool-errorunknown' => 'Nekonata eraro',
 
@@ -699,6 +701,8 @@ $2',
 'ns-specialprotected' => 'Paĝoj en la {{ns:special}} nomspaco ne povas esti redaktataj.',
 'titleprotected' => "Ĉi titolo estas protektita de kreado de [[User:$1|$1]].
 La kialo donata estis ''$2''.",
+'invalidtitle-knownnamespace' => 'Nevalida titolo kun nomspaco "$2" kaj teksto "$3"',
+'invalidtitle-unknownnamespace' => 'Nevalida titolo kun nekonata nomspaca numero $1 kaj teksto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Malbona konfiguro: nekonata virusa skanilo: ''$1''",
@@ -788,6 +792,7 @@ Neniu retpoŝto estos sendita pro iuj jenaj kialoj.',
 'invalidemailaddress' => 'La retadreso ne povas esti akceptita, ĉar ĝi verŝajne havas malvalidan formaton.
 Enigi bone formatita adreso aŭ malplenigi tiun kampon.',
 'cannotchangeemail' => 'Kontaj retpoŝtadresoj ne povas esti ŝanĝita en ĉi tiu vikio.',
+'emaildisabled' => 'Ĉi tiu paĝaro ne povas sendi retpoŝtojn.',
 'accountcreated' => 'Konto kreita',
 'accountcreatedtext' => 'La uzanto-konto por $1 estas kreita.',
 'createaccount-title' => 'Konto-kreado por {{SITENAME}}',
@@ -988,7 +993,9 @@ 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!",
+'continue-editing' => 'Redaktu plu',
 '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.
@@ -1005,6 +1012,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',
@@ -1083,6 +1091,10 @@ Iuj ŝablonoj ne estos inkluzivitaj.',
 'parser-template-loop-warning' => 'Rekursiva ŝablono estis trovita: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limo de ŝablona profundeco pligrandiĝis ($1)',
 'language-converter-depth-warning' => 'Profundo de lingvo-konvertilo preterpasis limon ($1)',
+'node-count-exceeded-category' => 'Paĝoj kie la nombro da nodoj estas preterpasita',
+'node-count-exceeded-warning' => 'Paĝo preterpasis la nombron da nodoj.',
+'expansion-depth-exceeded-category' => 'Paĝoj en kiuj la ekpansiprofundo estas preterpasita',
+'expansion-depth-exceeded-warning' => 'Paĝo preterpasis la ekpansiprofundon.',
 
 # "Undo" feature
 'undo-success' => 'La redakto estas malfarebla.
@@ -1226,8 +1238,8 @@ Bonvolu kontroli la protokolojn.',
 
 # Suppression log
 'suppressionlog' => 'Protokolo pri subigado',
-'suppressionlogtext' => 'Jen listo de forigoj kaj forbaroj pri enhavo kaŝita per administrantoj.
-Rigardu la [[Special:BlockList|IP-forbarliston]] por la listo de nune operaciaj forbaroj kaj forigoj.',
+'suppressionlogtext' => 'Malsupre estas listo de forigoj kaj forbaroj pri enhavo kaŝita de administrantoj.
+Rigardu la [[Special:BlockList|forbarliston]] por la listo de nune operaciaj forbaroj kaj forigoj.',
 
 # History merging
 'mergehistory' => 'Kunfandigi historiojn de paĝoj',
@@ -1259,8 +1271,9 @@ Certigu ke ĉi tiu ŝanĝo tenos kontinuecon de la historia paĝo.',
 'mergelogpagetext' => 'Jen listo de la plej lastatempaj kunigoj de unu paĝhistorio en alian.',
 
 # Diffs
-'history-title' => 'Redakto-historio de "$1"',
-'difference' => '(Malsamoj inter versioj)',
+'history-title' => 'Revizio-historio de "$1"',
+'difference-title' => '$1: Malsamoj inter versioj',
+'difference-title-multipage' => 'Malsamoj inter la paĝoj $1 kaj $2',
 'difference-multipage' => '(Diferenco inter paĝoj)',
 'lineno' => 'Linio $1:',
 'compareselectedversions' => 'Kompari la elektitajn versiojn',
@@ -1618,7 +1631,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'nchanges' => '$1 {{PLURAL:$1|ŝanĝo|ŝanĝoj}}',
 'recentchanges' => 'Lastaj ŝanĝoj',
 'recentchanges-legend' => 'Opcioj pri lastaj ŝanĝoj',
-'recentchangestext' => 'Per ĉi tiu paĝo vi povas sekvi la plej lastajn ŝanĝojn en la {{SITENAME}}.',
+'recentchanges-summary' => 'Per ĉi tiu paĝo vi povas sekvi la plej lastajn ŝanĝojn en la {{SITENAME}}.',
 'recentchanges-feed-description' => 'Sekvi la plej lastatempajn ŝanĝojn al la vikio en ĉi tiu fonto.',
 'recentchanges-label-newpage' => 'Ĉi tiu redakto kreis novan paĝon',
 'recentchanges-label-minor' => 'Ĉi tiu estas eta redakto',
@@ -1809,7 +1822,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
 'backend-fail-writetemp' => 'Ne povis skribi intertempan dosieron.',
 'backend-fail-closetemp' => 'Ne povis fermi provizoran dosieron.',
 'backend-fail-read' => 'Ne povas legi dosieron "$1".',
-'backend-fail-create' => 'Ne povas krei dosieron $1.',
+'backend-fail-create' => 'Ne povas skribi dosieron $1.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Ne povis malŝlosi "$1"; ĝi ne estas ŝlosita.',
@@ -2140,6 +2153,9 @@ Vi povas plistrikti la mendon per selektado de protokola speco, la salutnomo (in
 'allpages-bad-ns' => '{{SITENAME}} ne havas nomspacon "$1".',
 'allpages-hide-redirects' => 'Kaŝi alidirektilojn',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Vidas plej nova.',
+
 # Special:Categories
 'categories' => 'Kategorioj',
 'categoriespagetext' => 'La {{PLURAL:$1|jena kategorio|jenaj kategorioj}} ekzistas jam en la vikio.
@@ -2273,7 +2289,7 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
 'watcherrortext' => 'Eraro okazis ŝanĝinte vian agordojn de atentaro por "$1".',
 
 'enotif_mailer' => 'Averta retmesaĝo de {{SITENAME}}',
-'enotif_reset' => 'Marki ĉiujn vizititajn paĝojn',
+'enotif_reset' => 'Marki ĉiujn paĝojn vizititaj',
 'enotif_newpagetext' => 'Tiu ĉi estas nova paĝo',
 'enotif_impersonal_salutation' => 'Uzanto de {{SITENAME}}',
 'changed' => 'ŝanĝita',
@@ -2570,7 +2586,7 @@ Jen la lasta ero de la forbara protokolo:',
 'badipaddress' => 'Neniu uzanto, aŭ la IP-adreso estas misformita.',
 'blockipsuccesssub' => 'Oni sukcese forbaris la adreson/nomon.',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] estas forbarita. <br />
-Vidu la [[Special:BlockList|liston de IP-forbaroj]] por kontroli.',
+Vidu la [[Special:BlockList|liston de forbaroj]] por kontroli.',
 'ipb-blockingself' => 'Vi preskaŭ forbaros vin mem! Ĉu vi certas ke vi volas fari ĉi tiel?',
 'ipb-confirmhideuser' => 'Vi preskaŭ forbaras uzanto kun "kaŝi uzanton" ŝalta. Ĉi tiu kaŝi la nomon de uzanto en ĉiuj listoj ka protokoloj. Ĉu vi certas ke vi volas fari ĉi tiel?',
 'ipb-edit-dropdown' => 'Redakti kialojn por forbaro.',
@@ -2622,7 +2638,7 @@ La kialo donita por la forbaro de $1 estis: "$2"',
 'blocklog-showsuppresslog' => 'Ĉi tiu uzanto estis forbarita kaj kaŝita antaŭe. Jen la protokolo pri subpremado por via informo:',
 'blocklogentry' => 'forbaris [[$1]] por daŭro de $2 $3',
 'reblock-logentry' => 'ŝanĝis forbarajn opciojn [[$1]] kun findato de $2 $3',
-'blocklogtext' => 'Ĉi tio estas protokolo pri forbaraj kaj malforbaraj agoj. Aŭtomate forbaritaj IP adresoj ne estas listigitaj. Vidu la [[Special:BlockList|IP forbarliston]] por ĉi-momente fobaritaj uzantoj kaj IP-adresoj.',
+'blocklogtext' => 'Ĉi tio estas protokolo pri forbaraj kaj malforbaraj agoj. Aŭtomate forbaritaj IP-adresoj ne estas listigitaj. Vidu la [[Special:BlockList|forbarliston]] por ĉi-momente forbaritaj uzantoj kaj IP-adresoj.',
 'unblocklogentry' => '$1 estis restarigita',
 'block-log-flags-anononly' => 'nur anonimaj uzantoj',
 'block-log-flags-nocreate' => 'kreado de kontoj malebligita',
@@ -2957,6 +2973,41 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'tooltip-preferences-save' => 'Konservi preferojn',
 'tooltip-summary' => 'Enigu mallongan resumon',
 
+# Stylesheets
+'common.css' => '/* La jena CSS influos la aspekton de ĉiaj temoj. */',
+'standard.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Klasika temo. */',
+'nostalgia.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Nostalgia temo. */',
+'cologneblue.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kolonja Blua temo. */',
+'monobook.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Libreja temo. */',
+'myskin.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Miŝela temo. */',
+'chick.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Kokida temo. */',
+'simple.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Simpla temo. */',
+'modern.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Moderna temo. */',
+'vector.css' => '/* La jena CSS influos la paĝaspekton por uzantoj de la Vektora temo. */',
+'print.css' => '/* La jena CSS influos la prezentadon de la presaĵo. */',
+'handheld.css' => '/* La jena CSS influos manpremitajn komputilojn sur bazo de la temo kiu arangiĝis en $wgHandheldStyle. */',
+'noscript.css' => '/* La jena CSS influos uzantojn, kiuj desebligis Ĝavaskripton. */',
+'group-autoconfirmed.css' => '/* La jena CSS sole influos auxtokonfirmatajn uzantojn. */',
+'group-bot.css' => '/* La jena CSS sole influos robotojn. */',
+'group-sysop.css' => '/* La jena CSS sole influos administrantojn. */',
+'group-bureaucrat.css' => '/* La jena CSS sole influos burokratojn. */',
+
+# Scripts
+'common.js' => '/* La jena Ĝavaskripto ŝargiĝos por ĉiaj uzantoj ĉe ĉiu paĝoŝargado. */',
+'standard.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Klasika temo. */',
+'nostalgia.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Nostalgia temo. */',
+'cologneblue.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kolonja Blua temo. */',
+'monobook.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Libreja temo. */',
+'myskin.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Miŝela temo. */',
+'chick.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Kokida temo. */',
+'simple.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Simpla temo. */',
+'modern.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Moderna temo. */',
+'vector.js' => '/* La jena Ĝavaskripto ŝargiĝos por uzantoj de la Vektora temo. */',
+'group-autoconfirmed.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por auxtokonfirmataj uzantoj. */',
+'group-bot.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por robotoj. */',
+'group-sysop.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por administrantoj. */',
+'group-bureaucrat.js' => '/* La jena Ĝavaskripto sole ŝargiĝos por burokratoj. */',
+
 # Metadata
 'notacceptable' => 'La viki-servilo ne povas doni datumon en formato kiun via kliento povas legi.',
 
@@ -2995,11 +3046,15 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 'pageinfo-viewsperedit' => 'Po rigardoj por redakto',
 
 # Skin names
-'skinname-standard' => 'Klasika',
+'skinname-standard' => 'Klasiko',
 'skinname-nostalgia' => 'Nostalgio',
 'skinname-cologneblue' => 'Kolonja Bluo',
 'skinname-monobook' => 'Librejo',
+'skinname-myskin' => 'Miŝelo',
 'skinname-chick' => 'Kokido',
+'skinname-simple' => 'Simplo',
+'skinname-modern' => 'Moderno',
+'skinname-vector' => 'Vektoro',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marki kiel patrolitan',
index c36f13b..4330a53 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Spanish (Español)
+/** Spanish (español)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -24,6 +24,7 @@
  * @author Candalua
  * @author Capmo
  * @author Cerealito
+ * @author Ciencia Al Poder
  * @author Clerc
  * @author Crazymadlover
  * @author Cvmontuy
@@ -41,6 +42,7 @@
  * @author Hercule
  * @author Icvav
  * @author Imre
+ * @author Invadinado
  * @author Jatrobat
  * @author Jens Liebenau
  * @author Jurock
@@ -219,25 +221,25 @@ $magicWords = array(
        'currentmonth'            => array( '1', 'MESACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'           => array( '1', 'MESACTUAL1', 'CURRENTMONTH1' ),
        'currentmonthname'        => array( '1', 'MESACTUALCOMPLETO', 'NOMBREMESACTUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN', 'GENERADORNOMBREMESACTUAL' ),
-       'currentmonthabbrev'      => array( '1', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV', 'ABREVIACIONNOMBREMESACTUAL' ),
+       'currentmonthnamegen'     => array( '1', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'      => array( '1', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
        'currentday'              => array( '1', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
        'currentday2'             => array( '1', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
        'currentdayname'          => array( '1', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
        'currentyear'             => array( '1', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
        'currenttime'             => array( '1', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR', 'HORA_MINUTOS_ACTUAL' ),
+       'currenthour'             => array( '1', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTHOUR' ),
        'localmonth'              => array( '1', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
        'localmonth1'             => array( '1', 'MESLOCAL1', 'LOCALMONTH1' ),
        'localmonthname'          => array( '1', 'MESLOCALCOMPLETO', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN', 'GENERADORNOMBREMESLOCAL' ),
-       'localmonthabbrev'        => array( '1', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV', 'ABREVIACIONMESLOCAL' ),
+       'localmonthnamegen'       => array( '1', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'        => array( '1', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
        'localday'                => array( '1', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
        'localday2'               => array( '1', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
        'localdayname'            => array( '1', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
        'localyear'               => array( '1', 'AÑOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME', 'HORALOCAL' ),
-       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR', 'HORAMINUTOSLOCAL' ),
+       'localtime'               => array( '1', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
+       'localhour'               => array( '1', 'HORALOCAL', 'LOCALHOUR' ),
        'numberofpages'           => array( '1', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
@@ -272,10 +274,10 @@ $magicWords = array(
        'img_center'              => array( '1', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
        'img_framed'              => array( '1', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( '1', 'sinmarco', 'sin_enmarcar', 'sinenmarcar', 'frameless' ),
-       'img_page'                => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página $1', 'page=$1', 'page $1' ),
+       'img_page'                => array( '1', 'pagina=$1', 'página=$1', 'pagina_$1', 'página_$1', 'page=$1', 'page $1' ),
        'img_border'              => array( '1', 'borde', 'border' ),
        'img_link'                => array( '1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'NOMBREDELSITIO', 'SITENAME', 'NOMBREDESITIO' ),
+       'sitename'                => array( '1', 'NOMBREDELSITIO', 'SITENAME' ),
        'ns'                      => array( '0', 'EN:', 'NS:' ),
        'localurl'                => array( '0', 'URLLOCAL', 'LOCALURL:' ),
        'localurle'               => array( '0', 'URLLOCALC:', 'LOCALURLE:' ),
@@ -349,7 +351,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ocultar ediciones patrulladas en los cambios recientes',
 'tog-newpageshidepatrolled' => 'Ocultar páginas patrulladas de la lista de páginas nuevas',
 'tog-extendwatchlist' => 'Expandir la lista de seguimiento a todos los cambios, no sólo a los más recientes.',
-'tog-usenewrc' => 'Cambios recientes mejorados (requiere JavaScript)',
+'tog-usenewrc' => 'Agrupar los cambios por página en los cambios recientes y en la lista de vigilancia (requiere JavaScript)',
 'tog-numberheadings' => 'Numerar automáticamente los encabezados',
 'tog-showtoolbar' => 'Mostrar la barra de edición (requiere JavaScript)',
 'tog-editondblclick' => 'Editar páginas con doble clic (requiere JavaScript)',
@@ -365,15 +367,15 @@ $messages = array(
 'tog-previewontop' => 'Mostrar previsualización antes del cuadro de edición',
 'tog-previewonfirst' => 'Mostrar previsualización en la primera edición',
 'tog-nocache' => 'Desactivar la caché de páginas del navegador',
-'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando una página en mi lista de seguimiento sea modificada',
-'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando mi página de discusión sea modificada',
+'tog-enotifwatchlistpages' => 'Enviarme un correo electrónico cuando se modifique una página en mi lista de seguimiento',
+'tog-enotifusertalkpages' => 'Enviarme un correo electrónico cuando se modifique mi página de discusión',
 'tog-enotifminoredits' => 'Notificarme también los cambios menores de páginas',
 'tog-enotifrevealaddr' => 'Revelar mi dirección de correo electrónico en los correos de notificación',
 'tog-shownumberswatching' => 'Mostrar el número de usuarios que la vigilan',
 'tog-oldsig' => 'Firma actual:',
 'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
-'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos pues necesitas ajustes especiales en tu ordenador. [//www.mediawiki.org/wiki/Manual:External_editors Más información.])',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => 'Utilizar diff externo por defecto (sólo para expertos, pues necesitas ajustes especiales en tu ordenador; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
 'tog-showjumplinks' => 'Habilitar enlaces de accesibilidad «saltar a»',
 'tog-uselivepreview' => 'Usar live preview (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Alertar al grabar sin resumen de edición.',
@@ -461,7 +463,7 @@ $messages = array(
 'category-empty' => "''La categoría no contiene actualmente ningún artículo o archivo multimedia.''",
 'hidden-categories' => '{{PLURAL:$1|Categoría escondida|Categorías escondidas}}',
 'hidden-category-category' => 'Categorías ocultas',
-'category-subcat-count' => '{{PLURAL:$2|Esta categoría comprende solamente la siguiente categoría.|Esta categoría incluye {{PLURAL:$1|la siguiente categorías|las siguientes $1 subcategorías}}, de un total de $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|Esta categoría solo contiene la siguiente subcategoría.|Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}, de un total de $2.}}',
 'category-subcat-count-limited' => 'Esta categoría contiene {{PLURAL:$1|la siguiente subcategoría|las siguientes $1 subcategorías}}.',
 'category-article-count' => '{{PLURAL:$2|Esta categoría incluye solamente la siguiente página.|{{PLURAL:$1|La siguiente página página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría, de un total de $2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|La siguiente página pertenece|Las siguientes $1 páginas pertenecen}} a esta categoría.',
@@ -469,12 +471,12 @@ $messages = array(
 'category-file-count-limited' => '{{PLURAL:$1|El siguiente fichero pertenece|Los siguientes $1 ficheros pertenecen}} a esta categoría.',
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
-'noindex-category' => 'Páginas no indizadas',
+'noindex-category' => 'Páginas no indexadas',
 'broken-file-category' => 'Páginas con enlaces rotos a archivos',
 
 'about' => 'Acerca de',
 'article' => 'Artículo',
-'newwindow' => '(Se abre en una ventana nueva)',
+'newwindow' => '(se abre en una ventana nueva)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Más...',
 'mypage' => 'Mi página',
@@ -729,6 +731,10 @@ $2',
 El motivo dado fue: "\'\'$2\'\'".',
 'filereadonlyerror' => 'No se puede modificar el archivo "$1" porque el repositorio de archivos "$2" está en modo de sólo lectura.
 El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
+'invalidtitle-knownnamespace' => 'Título no válido con el espacio de nombres "$2" y el texto "$3"',
+'invalidtitle-unknownnamespace' => 'Título no válido con número de espacio de nombres desconocido  $1  y el texto "$2"',
+'exception-nologin' => 'No has iniciado sesión',
+'exception-nologin-text' => 'Esta página o acción requiere que inicies sesión en este wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Error de configuración: Antivirus desconocido: ''$1''",
@@ -834,10 +840,10 @@ Puedes ignorar este mensaje si esta cuenta fue creada por error.',
 'login-throttled' => 'Has intentado demasiadas veces iniciar sesión. Por favor espera antes de intentarlo nuevamente.',
 'login-abort-generic' => 'Tu inicio de sesión no fue exitoso - Cancelado',
 'loginlanguagelabel' => 'Idioma: $1',
-'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada debido a que parece que ésta ha sido enviada desde un navegador defectuoso o un proxy caché.',
+'suspicious-userlogout' => 'Tu solicitud de desconexión ha sido denegada, pues parece haber sido enviada desde un navegador defectuoso o un proxy caché.',
 
 # E-mail sending
-'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP',
+'php-mail-error-unknown' => 'Error desconocido en la función mail() de PHP.',
 'user-mail-no-addy' => 'Se ha intentado enviar correo electrónico sin una dirección de correo electrónico.',
 
 # Change password dialog
@@ -942,7 +948,7 @@ Contraseña temporal: $2',
 Tu dirección IP se almacenará en el historial de ediciones de la página.",
 'anonpreviewwarning' => "''No has iniciado sesión con una cuenta de usuario. Al guardar los cambios se almacenará tu dirección IP en el historial de edición de la página.''",
 'missingsummary' => "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «{{int:savearticle}}» tu edición se grabará sin él.",
-'missingcommenttext' => 'Por favor introduce texto debajo.',
+'missingcommenttext' => 'Por favor, introduce un texto debajo.',
 'missingcommentheader' => "'''Recordatorio:''' No has escrito un título para este comentario. Si haces clic nuevamente en \"{{int:savearticle}}\" tu edición se grabará sin él.",
 'summary-preview' => 'Previsualización del resumen:',
 'subject-preview' => 'Previsualización del tema/título:',
@@ -1025,7 +1031,8 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
-¡Tus cambios aún no se ha guardado! [[#editform|→ Continuar editando]]",
+¡Tus cambios aún no se ha guardado!",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.',
 'session_fail_preview' => "'''Lo sentimos, no pudimos procesar la edición debido a una pérdida de los datos de sesión.'''
 Por favor, inténtalo de nuevo.
@@ -1096,7 +1103,7 @@ El registro de borrado y traslados para esta página están provistos aquí por
 El registro de borrados y traslados para la página están provistos debajo como referencia.',
 'log-fulllog' => 'Ver el registro completo',
 'edit-hook-aborted' => 'Edición cancelada por la extensión.
-No dió explicaciones.',
+No se aportaron explicaciones.',
 'edit-gone-missing' => 'No se pudo actualizar la página.
 Parece que ha sido borrada.',
 'edit-conflict' => 'Conflicto de edición.',
@@ -1119,6 +1126,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Se ha detectado un bucle "unstrip"',
+'parser-unstrip-recursion-limit' => 'Se ha superado el límite de recursión de "unstrip" ($1)',
 
 # "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.',
@@ -1262,8 +1275,8 @@ No tiene acceso a él.',
 
 # Suppression log
 'suppressionlog' => 'Registro de supresiones',
-'suppressionlogtext' => 'Debajo hay una lista con los borrados y bloqueos recientes cuyo contenido se encuentra oculto para administradores.
-Mire la [[Special:BlockList|lista de bloqueos activos]] para ver la lista de bloqueos actualmente operativos.',
+'suppressionlogtext' => 'A continuación hay una lista con los borrados y bloqueos cuyo contenido se encuentra oculto para los administradores.
+Ver la [[Special:BlockList|lista de bloqueos]] que incluye las prohibiciones y bloqueos actualmente operativos.',
 
 # History merging
 'mergehistory' => 'Fusionar historiales de páginas',
@@ -1298,7 +1311,8 @@ Nota que usar los enlaces de navegación borrará las selecciones de esta column
 
 # Diffs
 'history-title' => 'Historial de revisiones para «$1»',
-'difference' => '(Diferencias entre revisiones)',
+'difference-title' => 'Diferencia entre revisiones de «$1»',
+'difference-title-multipage' => 'Diferencia entre las páginas «$1» y «$2»',
 'difference-multipage' => '(Diferencia entre las páginas)',
 'lineno' => 'Línea $1:',
 'compareselectedversions' => 'Comparar versiones seleccionadas',
@@ -1395,6 +1409,7 @@ Mientras tanto puedes buscar mediante Google, pero ten en cuenta que sus índice
 'prefs-beta' => 'Características de prueba',
 'prefs-datetime' => 'Fecha y hora',
 'prefs-labs' => 'Características de los laboratorios',
+'prefs-user-pages' => 'Páginas de usuario',
 'prefs-personal' => 'Perfil de usuario',
 'prefs-rc' => 'Cambios recientes',
 'prefs-watchlist' => 'Seguimiento',
@@ -1510,10 +1525,10 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'saveusergroups' => 'Guardar grupos de usuarios',
 'userrights-groupsmember' => 'Miembro de:',
 'userrights-groupsmember-auto' => 'Miembro implícito de:',
-'userrights-groups-help' => 'Puedes modificar los grupos a los que pertenece este usuario:
-* Un recuadro marcado significa que el usuario está en ese grupo.
-* Un recuadro no marcado significa que el usuario no está en ese grupo.
-* Un * indica que no podrás retirar el grupo una vez que lo concedas, o viceversa.',
+'userrights-groups-help' => 'Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:
+* Un recuadro marcado significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.
+* Un recuadro no marcado significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.
+* Un * indica que no podrás eliminar el grupo una vez que lo agregues, o viceversa.',
 'userrights-reason' => 'Motivo:',
 'userrights-no-interwiki' => 'No tienes permiso para editar los grupos a los que pertenece un usuario en otros wikis.',
 'userrights-nodatabase' => 'La base de datos $1 no existe o no es local.',
@@ -1655,7 +1670,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
 'recentchanges' => 'Cambios recientes',
 'recentchanges-legend' => 'Opciones sobre cambios recientes',
-'recentchangestext' => 'Realiza un seguimiento de los cambios más recientes en el wiki en esta página.',
+'recentchanges-summary' => 'Sigue los cambios más recientes de la wiki en esta página.',
 'recentchanges-feed-description' => 'Realiza un seguimiento de los cambios más recientes en el wiki en este canal.',
 'recentchanges-label-newpage' => 'Esta edición creó una nueva página',
 'recentchanges-label-minor' => 'Esta es una edición menor',
@@ -1698,7 +1713,7 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'recentchangeslinked-to' => 'Muestra los cambios recientes en lugar de la página indicada',
 
 # Upload
-'upload' => 'Subir archivo',
+'upload' => 'Subir un archivo',
 'uploadbtn' => 'Subir un archivo',
 'reuploaddesc' => 'Regresar al formulario para subir.',
 'upload-tryagain' => 'Envíe la descripción del archivo modificado',
@@ -1808,6 +1823,20 @@ No se permite subir archivos Java, porque pueden causar que se puedan saltar res
 'filename-bad-prefix' => "El nombre del archivo que estás subiendo comienza por '''«$1»''', un nombre nada descriptivo de su contenido. Es un típico nombre de los que asignan automáticamente las cámaras digitales.
 
 Por favor, elige un nombre más descriptivo.",
+'filename-prefix-blacklist' => ' #<!-- deja esta línea exactamente como está --> <pre>
+# La sintaxis de esta página es la siguiente:
+#   * Todo texto que se encuentre después del carácter "#" hasta el final de la línea se tratará como un comentario y será ignorado
+#   * Cualquier línea que no esté en blanco será interpretada como un prefijo típico en nombres de archivo que suelen asignar automáticamente las cámaras digitales
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # algunos teléfonos móviles / celulares
+IMG # genérico
+JD # Jenoptik
+MGP # Pentax
+PICT # misc.
+ #</pre> <!-- deja esta línea exactamente como está -->',
 'upload-success-subj' => 'Subida con éxito',
 'upload-success-msg' => 'Tu carga de [$2] fue exitosa. Está disponible aquí: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Problema en la carga',
@@ -1844,14 +1873,15 @@ $1',
 'backend-fail-writetemp' => 'No se pudo escribir en el archivo temporal.',
 'backend-fail-closetemp' => 'No se pudo cerrar el archivo temporal.',
 'backend-fail-read' => 'No se pudo leer el archivo «$1».',
-'backend-fail-create' => 'No se pudo crear el archivo «$1».',
-'backend-fail-maxsize' => 'No se pudo crear el archivo  $1  porque es mayor de {{PLURAL:$2|$2 bytes|$2 bytes}}.',
+'backend-fail-create' => 'No se pudo escribir el archivo $1.',
+'backend-fail-maxsize' => 'No se pudo escribir el archivo $1 porque es mayor de {{PLURAL:$2|un byte|$2 bytes}}.',
 'backend-fail-readonly' => 'El servidor (back-end) de almacenamiento "$1" está actualmente en estado de sólo lectura. La razón aducida fue: "$2"',
 'backend-fail-synced' => 'El archivo "$1" se encuentra en un estado incoherente dentro de los servidores (backends) de almacenamiento interno',
 'backend-fail-connect' => 'No se pudo conectar al servidor (backend) de almacenamiento "$1".',
 'backend-fail-internal' => 'Se ha producido un error desconocido en el servidor (backend) de almacenamiento "$1".',
 'backend-fail-contenttype' => 'No se pudo determinar el tipo de contenido del archivo a guardar en " $1 ".',
 'backend-fail-batchsize' => 'El servidor (back-end) de almacenamiento ha suministrado un lote de $1 {{PLURAL:$1|operación|operaciones}} de archivo; el límite es de $2 {{PLURAL:$2|operación|operaciones}}.',
+'backend-fail-usable' => 'No se pudo escribir el archivo $1 debido a permisos insuficientes o directorios/contenedores desaparecidos.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'No se pudo conectar a la base de datos del registro del sistema de almacenamiento "$1".',
@@ -1984,6 +2014,7 @@ Tal vez desee editar la descripción de su [$2 página de descripción del archi
 'uploadnewversion-linktext' => 'Subir una nueva versión de este archivo',
 'shared-repo-from' => 'de $1',
 'shared-repo' => 'un repositorio compartido',
+'filepage.css' => '/* Los estilos CSS colocados aquí se incluirán en las páginas de descripción de archivos, incluso en los wikis externos que incluyan estas páginas */',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -2172,6 +2203,7 @@ Por favor note que otros sitios web pueden vincular a un archivo con un URL dire
 Puedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario o la página afectada. Se distinguen mayúsculas de minúsculas.',
 'logempty' => 'No hay elementos en el registro con esas condiciones.',
 'log-title-wildcard' => 'Buscar títulos que empiecen con este texto',
+'showhideselectedlogentries' => 'Mostrar u ocultar las entradas del registro seleccionado',
 
 # Special:AllPages
 'allpages' => 'Todas las páginas',
@@ -2191,6 +2223,11 @@ Puedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario
 'allpages-bad-ns' => '{{SITENAME}} no tiene un espacio de nombres llamado «$1».',
 'allpages-hide-redirects' => 'Ocultar redirecciones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Usted está viendo una versión en caché de esta página, que puede tener hasta  $1 días de antigüedad.',
+'cachedspecial-viewing-cached-ts' => 'Está viendo una versión en caché de esta página, que puede no estar completamente actualizada.',
+'cachedspecial-refresh-now' => 'Ver lo más reciente.',
+
 # Special:Categories
 'categories' => 'Categorías',
 'categoriespagetext' => 'Las siguientes {{PLURAL:$1|categoría contiene|categorías contienen}} páginas o medios.
@@ -2325,7 +2362,7 @@ La dirección electrónica que indicaste en [[Special:Preferences|tus preferenci
 'watcherrortext' => 'Ocurrió un error al cambiar la configuración de tu lista de seguimiento para «$1».',
 
 'enotif_mailer' => 'Notificación por correo de {{SITENAME}}',
-'enotif_reset' => 'Marcar todas las páginas visitadas',
+'enotif_reset' => 'Marcar todas las páginas como visitadas',
 'enotif_newpagetext' => 'Se trata de una nueva página.',
 'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
 'changed' => 'modificada',
@@ -2675,9 +2712,9 @@ Véase la [[Special:BlockList|lista de bloqueos]] para revisarlo.',
 'blocklog-showsuppresslog' => 'Este usuario ha sido bloqueado y ocultado. Se provee el registro de supresiones para más detalle:',
 'blocklogentry' => 'bloqueó a [[$1]] $3 durante un plazo de $2',
 'reblock-logentry' => 'cambió el bloqueo para  [[$1]] con una caducidad de $2 $3',
-'blocklogtext' => 'Esto es un registro de bloqueos y desbloqueos de usuarios.
-Las direcciones bloqueadas automáticamente no aparecen aquí.
-Consulte la [[Special:BlockList|lista de direcciones IP bloqueadas]] para ver la lista de bloqueos vigente.',
+'blocklogtext' => 'Esto es un registro de acciones de bloqueo y desbloqueo de usuarios.
+Las direcciones IP bloqueadas automáticamente no aparecen aquí.
+Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueos y prohibiciones de operar en vigor.',
 'unblocklogentry' => 'desbloqueó a $1',
 'block-log-flags-anononly' => 'sólo anónimos',
 'block-log-flags-nocreate' => 'desactivada la creación de cuentas',
@@ -3025,6 +3062,11 @@ Permite añadir una razón al resumen de edición.',
 'vector.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Vector */',
 'print.css' => '/* Los estilos CSS colocados aquí afectarán la impresión */',
 'handheld.css' => '/* Los estilos CSS colocados aquí afectarán a los dispositivos móviles basados en las pieles configuradas en $wgHandheldStyle */',
+'noscript.css' => '/* Los estilos CSS colocados aquí se aplicarán a los usuarios que hayan desactivado el JavaScript en su navegador */',
+'group-autoconfirmed.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Usuarios autoconfirmados */',
+'group-bot.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Bots */',
+'group-sysop.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */',
+'group-bureaucrat.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */',
 
 # Scripts
 'common.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */',
@@ -3037,6 +3079,10 @@ Permite añadir una razón al resumen de edición.',
 'simple.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Simple */',
 'modern.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Moderna */',
 'vector.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios que usen la piel Vector */',
+'group-autoconfirmed.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */',
+'group-bot.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Bots */',
+'group-sysop.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Administradores */',
+'group-bureaucrat.js' => '/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Burócratas */',
 
 # Metadata
 'notacceptable' => 'El servidor wiki no puede proveer los datos en un formato que su cliente (navegador) pueda entender.',
@@ -3061,6 +3107,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'spambot_username' => 'Limpieza de spam de MediaWiki',
 'spam_reverting' => 'Revirtiendo a la última versión que no contenga enlaces a $1',
 'spam_blanking' => 'Todas las revisiones contienen enlaces a $1, blanqueando',
+'spam_deleting' => 'Todas las revisiones que contienen enlaces a $1, en proceso de eliminación',
 
 # Info page
 'pageinfo-title' => 'Información para «$1»',
@@ -3122,6 +3169,7 @@ $1',
 Ejecutarlo podría comprometer la seguridad de su equipo.",
 'imagemaxsize' => "Límite de tamaño de imagen:<br />''(para páginas de descripción de archivo)''",
 'thumbsize' => 'Tamaño de las vistas en miniatura:',
+'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:|página|páginas}}',
 'file-info' => 'tamaño de archivo: $1; tipo MIME: $2',
 'file-info-size' => '$1 × $2 píxeles; tamaño de archivo: $3; tipo MIME: $4',
@@ -3151,8 +3199,10 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'sp-newimages-showfrom' => 'Mostrar nuevas imágenes empezando por $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1s',
 'minutes-abbrev' => '$1m',
 'hours-abbrev' => '$1h',
+'days-abbrev' => '$1d',
 'seconds' => '{{PLURAL:$1|un segundo|$1 segundos}}',
 'minutes' => '{{PLURAL:$1|un minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
@@ -3769,6 +3819,11 @@ Has recibido [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia de la Licencia Pública
 'version-software' => 'Software instalado',
 'version-software-product' => 'Producto',
 'version-software-version' => 'Versión',
+'version-entrypoints' => 'URL del punto de entrada',
+'version-entrypoints-header-entrypoint' => 'Punto de entrada',
+'version-entrypoints-header-url' => 'Dirección URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Ruta del artículo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta de la secuencia de comandos (script)]',
 
 # Special:FilePath
 'filepath' => 'Ruta de archivo',
@@ -3879,7 +3934,7 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-delete-revision' => '$1 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
 'logentry-delete-revision-legacy' => '$1 modificó la visibilidad de las ediciones en la página $3',
-'logentry-suppress-delete' => '$1 borró la página $3',
+'logentry-suppress-delete' => '$1 borró (restricciones para administradores aplicadas) la página $3',
 'logentry-suppress-event' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
 'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
@@ -3959,4 +4014,17 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'api-error-uploaddisabled' => 'Las subidas están desactivadas en este wiki.',
 'api-error-verification-error' => 'Este archivo puede estar dañado, o tiene una extensión incorrecta.',
 
+# 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|día|días}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|semanas}}',
+'duration-years' => '$1 {{PLURAL: $1|año|años}}',
+'duration-decades' => '$1 {{PLURAL:$1|década|décadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'No se pudieron obtener bloqueos en el servidor $1.',
 );
index 1da6573..2f2e77e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Estonian (Eesti)
+/** Estonian (eesti)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -68,6 +68,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Kustutatud_kaastöö' ),
        'Disambiguations'           => array( 'Täpsustusleheküljed' ),
        'DoubleRedirects'           => array( 'Kahekordsed_ümbersuunamised' ),
+       'EditWatchlist'             => array( 'Jälgimisloendi_redigeerimine' ),
        'Emailuser'                 => array( 'E-kirja_saatmine' ),
        'Export'                    => array( 'Lehekülgede_eksport' ),
        'Fewestrevisions'           => array( 'Vähim_muudatusi' ),
@@ -75,6 +76,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Failitee' ),
        'Import'                    => array( 'Lehekülgede_import' ),
        'Invalidateemail'           => array( 'E-posti_kinnituse_tühistamine', 'Tühista_e-posti_kinnitus' ),
+       'JavaScriptTest'            => array( 'JavaScripti_katsetamine' ),
        'BlockList'                 => array( 'Blokeerimisloend' ),
        'LinkSearch'                => array( 'Välislinkide_otsimine', 'Otsi_välislinke' ),
        'Listadmins'                => array( 'Ülemaloend' ),
@@ -99,6 +101,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Minu_kaastöö' ),
        'Mypage'                    => array( 'Minu_lehekülg' ),
        'Mytalk'                    => array( 'Minu_aruteluleht' ),
+       'Myuploads'                 => array( 'Minu_üleslaaditu' ),
        'Newimages'                 => array( 'Uued_failid' ),
        'Newpages'                  => array( 'Uued_leheküljed' ),
        'PasswordReset'             => array( 'Parooli_lähtestamine' ),
@@ -117,6 +120,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'Erileheküljed' ),
        'Statistics'                => array( 'Arvandmestik' ),
        'Tags'                      => array( 'Märgised' ),
+       'Unblock'                   => array( 'Blokeerimise_eemaldamine' ),
        'Uncategorizedcategories'   => array( 'Kategoriseerimata_kategooriad' ),
        'Uncategorizedimages'       => array( 'Kategoriseerimata_failid' ),
        'Uncategorizedpages'        => array( 'Kategoriseerimata_leheküljed' ),
@@ -128,6 +132,7 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'Kasutamata_mallid' ),
        'Unwatchedpages'            => array( 'Jälgimata_leheküljed' ),
        'Upload'                    => array( 'Faili_üleslaadimine' ),
+       'UploadStash'               => array( 'Üleslaaditu_alghoidla' ),
        'Userlogin'                 => array( 'Sisselogimine' ),
        'Userlogout'                => array( 'Väljalogimine' ),
        'Userrights'                => array( 'Kasutaja_õigused' ),
@@ -670,6 +675,8 @@ $2',
 'filereadonlyerror' => 'Faili "$1" ei saa muuta, sest hoidla "$2" on kirjutuskaitstud.
 
 Administraator lukustas selle järgmisel põhjusel: "$3".',
+'invalidtitle-knownnamespace' => 'Vigane pealkiri nimeruumis "$2" tekstiga "$3"',
+'invalidtitle-unknownnamespace' => 'Vigane pealkiri nimeruuminumbriga $1 ja tekstiga "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Viga konfiguratsioonis: tundmatu viirusetõrje: ''$1''",
@@ -952,7 +959,8 @@ Allpool on toodud viimane blokeerimislogi sissekanne:',
 'updated' => '(Värskendatud)',
 'note' => "'''Meeldetuletus:'''",
 'previewnote' => "'''Ära unusta, et see on kõigest eelvaade!'''
-Sinu muudatused pole veel salvestatud! [[#editform|→ Jätka redigeerimist]]",
+Sinu muudatused pole veel salvestatud!",
+'continue-editing' => 'Jätka redigeerimist',
 'previewconflict' => 'See eelvaade näitab, kuidas ülemises toimetuskastis olev tekst hakkab välja nägema, kui otsustate salvestada.',
 'session_fail_preview' => "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''
 Palun proovi uuesti.
@@ -1187,7 +1195,7 @@ Palun vaata logisid.',
 # Suppression log
 'suppressionlog' => 'Varjamislogi',
 'suppressionlogtext' => 'Allpool on nimekiri kustutamistest ja blokeeringutest, millega kaasneb administraatorite eest sisu varjamine.
-Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeeritud IP-aadresside loendist]].',
+Jõus olevad keelud ja blokeeringud leiad [[Special:BlockList|blokeerimisnimekirja]].',
 
 # History merging
 'mergehistory' => 'Ühenda lehtede ajalood',
@@ -1222,7 +1230,8 @@ Navigeerimislinkide kasutamine tühistab redaktsioonide valiku.',
 
 # Diffs
 'history-title' => 'Lehekülje "$1" muudatuste ajalugu',
-'difference' => '(Erinevused redaktsioonide vahel)',
+'difference-title' => 'Erinevus lehekülje "$1" redaktsioonide vahel',
+'difference-title-multipage' => 'Erinevus lehekülgede "$1" ja "$2" vahel',
 'difference-multipage' => '(Lehekülgede erinevus)',
 'lineno' => 'Rida $1:',
 'compareselectedversions' => 'Võrdle valitud redaktsioone',
@@ -1321,6 +1330,7 @@ Pane tähele, et Google'is talletatud {{GRAMMAR:genitive|{{SITENAME}}}} sisu võ
 'prefs-beta' => 'Beetafunktsioonid',
 'prefs-datetime' => 'Kuupäev ja kellaaeg',
 'prefs-labs' => 'Katsefunktsioonid',
+'prefs-user-pages' => 'Kasutajaleheküljed',
 'prefs-personal' => 'Kasutaja andmed',
 'prefs-rc' => 'Viimased muudatused',
 'prefs-watchlist' => 'Jälgimisloend',
@@ -1583,7 +1593,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'nchanges' => '$1 {{PLURAL:$1|muudatus|muudatust}}',
 'recentchanges' => 'Viimased muudatused',
 'recentchanges-legend' => 'Viimaste muudatuste seaded',
-'recentchangestext' => 'Jälgi sellel leheküljel viimaseid muudatusi.',
+'recentchanges-summary' => 'Jälgi sellel leheküljel viimaseid muudatusi.',
 'recentchanges-feed-description' => 'Jälgi vikisse tehtud viimaseid muudatusi.',
 'recentchanges-label-newpage' => 'See muudatus lõi uue lehekülje',
 'recentchanges-label-minor' => 'See on pisiparandus',
@@ -1613,6 +1623,7 @@ See ei tohi olla pikem kui $1 {{PLURAL:$1|sümbol|sümbolit}}.',
 'newsectionsummary' => '/* $1 */ uus alajaotus',
 'rc-enhanced-expand' => 'Näita üksikasju (nõuab JavaScripti)',
 'rc-enhanced-hide' => 'Peida üksikasjad',
+'rc-old-title' => 'alustatud pealkirja "$1" all',
 
 # Recent changes linked
 'recentchangeslinked' => 'Seotud muudatused',
@@ -1779,9 +1790,10 @@ Kui probleem ei kao, võta ühendust [[Special:ListUsers/sysop|administraatoriga
 'backend-fail-writetemp' => 'Ajutist faili ei saa kirjutada.',
 'backend-fail-closetemp' => 'Ajutist faili ei saa sulgeda.',
 'backend-fail-read' => 'Faili $1 ei saa lugeda.',
-'backend-fail-create' => 'Faili $1 ei saa luua.',
-'backend-fail-maxsize' => 'Faili $1 ei saa luua, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.',
+'backend-fail-create' => 'Faili $1 ei saa kirjutada.',
+'backend-fail-maxsize' => 'Faili $1 ei saa kirjutada, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.',
 'backend-fail-contenttype' => 'Faili, mida soovitakse talletada asukohas "$1", sisutüüpi saanud kindlaks teha.',
+'backend-fail-usable' => 'Faili $1 ei saa ebapiisavate õiguste või puuduvate kataloogide/konteinerite tõttu kirjutada.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Rada "$1" ei saa lukust lahti teha, sest see pole lukus.',
@@ -1928,7 +1940,7 @@ Võib-olla tahad redigeerida selle faili [$2 sealset kirjelduslehekülge].',
 'filedelete-otherreason' => 'Muu või täiendav põhjus:',
 'filedelete-reason-otherlist' => 'Muu põhjus',
 'filedelete-reason-dropdown' => '*Harilikud kustutamise põhjused
-** Autoriõiguste rikkumine
+** Autoriõiguse rikkumine
 ** Duplikaat',
 'filedelete-edit-reasonlist' => 'Redigeeri kustutamise põhjuseid',
 'filedelete-maintenance' => 'Failide kustutamine ja taastamine on hoolduse ajaks keelatud.',
@@ -2111,6 +2123,11 @@ See võib sisaldada üht või enamat märki, mida ei saa pealkirjades kasutada.'
 'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimeruumi "$1".',
 'allpages-hide-redirects' => 'Peida ümbersuunamised',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Vaata vahemälus olevat lehekülje versiooni, mis võib olla kuni $1 vanune.',
+'cachedspecial-viewing-cached-ts' => 'Vaatad vahemälus olevat lehekülje versiooni, mis ei pruugi olla täiesti ajakohane.',
+'cachedspecial-refresh-now' => 'Vaata uusimat versiooni.',
+
 # Special:Categories
 'categories' => 'Kategooriad',
 'categoriespagetext' => 'Vikis on {{PLURAL:$1|järgmine kategooria|järgmised kategooriad}}.
@@ -2423,7 +2440,7 @@ Sellisel juhul tuleb uusima kustutatud redaktsiooni juurest linnuke eemaldada v
 'undeletehistorynoadmin' => 'See lehekülg on kustutatud.
 Kustutamise põhjus ning selle lehekülje kustutamiseelne redigeerimislugu on näha allolevas kokkuvõttes.
 Lehekülje kustutamiseelsed redaktsioonid on kättesaadavad ainult administraatoritele.',
-'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioonid, mille autor on $3, seisuga $4 kell $5.',
+'undelete-revision' => 'Lehekülje $1 kustutatud redaktsioon, mille autor on $3, seisuga $4, kell $5.',
 'undeleterevision-missing' => 'Vigane või puuduv redaktsioon.
 Link võib olla kõlbmatu või redaktsioon võib olla taastatud või arhiivist eemaldatud.',
 'undelete-nodiff' => 'Varasemat redaktsiooni ei leidunud.',
@@ -2551,7 +2568,7 @@ Täida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.',
 'badipaddress' => 'Vigane IP-aadress',
 'blockipsuccesssub' => 'Blokeerimine õnnestus',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] on blokeeritud.<br />
-Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
+Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeerimisnimekirjast]].',
 'ipb-blockingself' => 'Sa blokeerid iseenda! Kas tahad tõesti seda teha?',
 'ipb-confirmhideuser' => 'Avaldasid soovi kasutaja blokeerida ja peita. Kasutaja nimi peidetakse kõigist loenditest ja logisissekannetest. Kas oled kindel, et soovid seda teha?',
 'ipb-edit-dropdown' => 'Muuda blokeeringu põhjuseid',
@@ -2601,7 +2618,9 @@ Kehtivaid blokeeringuid vaata [[Special:BlockList|blokeeringute loendist]].',
 'blocklog-showsuppresslog' => 'See kasutaja on varem blokeeritud ja peidetud. Allpool on toodud varjamislogi:',
 'blocklogentry' => 'blokeeris kasutaja [[$1]]. Blokeeringu aegumistähtaeg on $2 $3',
 'reblock-logentry' => 'muutis kasutaja või IP-aadressi [[$1]] blokeeringu sätteid. Blokeering aegumistähtaeg: $2. Põhjus: $3',
-'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste nimekiri. Automaatselt blokeeritud IP aadresse siin ei näidata. Hetkel aktiivsete blokeeringute ja redigeerimiskeeldude nimekirja vaata [[Special:BlockList|IP blokeeringute nimekirja]] leheküljelt.',
+'blocklogtext' => 'See on kasutajate blokeerimiste ja blokeeringute eemaldamiste logi.
+Automaatselt blokeeritud IP-aadresse siin ei näidata.
+Praegu jõus olevad blokeeringud ja redigeerimiskeelud leiad [[Special:BlockList|blokeerimisnimekirjast]].',
 'unblocklogentry' => 'eemaldas kasutaja $1 blokeeringu',
 'block-log-flags-anononly' => 'ainult anonüümsed kasutajad',
 'block-log-flags-nocreate' => 'kontode loomine on blokeeritud',
@@ -3265,7 +3284,7 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 # EXIF attributes
 'exif-compression-1' => 'Pakkimata',
 
-'exif-copyrighted-true' => 'Autoriõigustega kaitstud',
+'exif-copyrighted-true' => 'Kaitstud',
 'exif-copyrighted-false' => 'Avalikus omandis',
 
 'exif-unknowndate' => 'Kuupäev teadmata',
@@ -3328,11 +3347,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',
 
@@ -3423,6 +3442,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',
@@ -3644,6 +3666,9 @@ GNU Üldise Avaliku Litsentsi [{{SERVER}}{{SCRIPTPATH}}/COPYING eksemplar] peaks
 'version-software' => 'Paigaldatud tarkvara',
 'version-software-product' => 'Toode',
 'version-software-version' => 'Versioon',
+'version-entrypoints' => 'Sisendpunktide internetiaadressid',
+'version-entrypoints-header-entrypoint' => 'Sisendpunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Failitee',
@@ -3832,4 +3857,15 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'api-error-uploaddisabled' => 'Üleslaadimine on selles vikis keelatud.',
 'api-error-verification-error' => 'See fail võib olla rikutud või vale laiendiga.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekundi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunni}}',
+'duration-days' => '$1 {{PLURAL:$1|päeva}}',
+'duration-weeks' => '$1 {{PLURAL:$1|nädala}}',
+'duration-years' => '$1 {{PLURAL:$1|aasta}}',
+'duration-decades' => '$1 {{PLURAL:$1|kümnendi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sajandi}}',
+'duration-millennia' => '$1 {{PLURAL:$1|aastatuhande}}',
+
 );
index 61b9cff..d9478bf 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Basque (Euskara)
+/** Basque (euskara)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -753,7 +753,8 @@ Azken blokeoaren erregistroa ageri da behean, erreferentzia gisa:',
 'userinvalidcssjstitle' => "'''Oharra:''' Ez da \"\$1\" itxura existitzen. Kontuan izan .css eta .js fitxategi pertsonalizatuen izenak letra xehez idatzi behar direla; adibidez, {{ns:user}}:Adibide/vector.css, eta ez {{ns:user}}:Adibide/Vector.css.",
 'updated' => '(Eguneratua)',
 'note' => "'''Oharra:'''",
-'previewnote' => "'''Gogoratu hau aurreikusketa bat dela, beraz gorde egin beharko duzu!'''",
+'previewnote' => "'''Gogoratu hau aurrikuspen bat dela.'''
+Zure aldaketak ez dira oraindik gorde!",
 'previewconflict' => 'Aurreikuspenak aldaketen koadroan idatzitako testua erakusten du, gorde ondoren agertuko den bezala.',
 'session_fail_preview' => "'''Sentitzen dugu! Ezin izan da zure aldaketa prozesatu, saioko datu batzuen galera dela-eta. Mesedez, saiatu berriz. Arazoak jarraitzen badu, saiatu saioa amaitu eta berriz hasten.'''",
 'session_fail_preview_html' => "'''Sentitzen dugu! Ezin izan dugu zure aldaketa burutu, saio datu galera bat medio.'''
@@ -1016,8 +1017,7 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'mergelogpagetext' => 'Jarraian dagoen zerrendak orrialde baten historiatik beste batera egindako azken bateratzeak erakusten ditu.',
 
 # Diffs
-'history-title' => '"$1" orrialdearen historia laburpena',
-'difference' => '(Bertsioen arteko ezberdintasunak)',
+'history-title' => '"$1" orrialdearen historia berrikuspena',
 'difference-multipage' => '(Orrialdeen arteko ezberdintasunak)',
 'lineno' => '$1. lerroa:',
 'compareselectedversions' => 'Hautatutako bertsioak alderatu',
@@ -1360,7 +1360,7 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'nchanges' => '{{PLURAL:$1|aldaketa 1|$1 aldaketa}}',
 'recentchanges' => 'Aldaketa berriak',
 'recentchanges-legend' => 'Azken aldaketen aukerak',
-'recentchangestext' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
+'recentchanges-summary' => 'Orrialde honetan wiki honetan egindako azken aldaketak erakusten dira.',
 'recentchanges-feed-description' => 'Sindikazio honetan wikian eginiko azkeneko aldaketak jarrai daitezke.',
 'recentchanges-label-newpage' => 'Aldaketa honek orrialde berri bat sortu du',
 'recentchanges-label-minor' => 'Hau aldaketa txikia da',
@@ -1600,6 +1600,8 @@ Ondorengo zerrendak fitxategira dauden {{PLURAL:$1|lehen lotura|lehen $1 loturak
 'linkstoimage-redirect' => '$1 (fitxategi birzuzenketa) $2',
 'duplicatesoffile' => 'Ondorengo fitxategi {{PLURAL:$1|hau beste honen berdina da|$1 hauek beste honen berdinak dira}} ([[Special:FileDuplicateSearch/$2|zehaztasun gehiago]]):',
 'sharedupload' => 'Elkarbanatutako fitxategi hau $1-(e)ko igoera bat da eta beste proiektuek ere erabil dezakete.',
+'sharedupload-desc-here' => 'Fitxategi hau $1-(e)koa da eta beste proeiktuetan erabilia izan liteke.
+Bere [$2 fitxategiaren deskribapen orrialdea] behean dago.',
 'filepage-nofile' => 'Izen horrekin ez dago fitxategirik.',
 'uploadnewversion-linktext' => 'Fitxategi honen bertsio berri bat igo',
 'shared-repo-from' => '$1-tik',
index 4366ff1..15e16c9 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Extremaduran (Estremeñu)
+/** Extremaduran (estremeñu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -752,7 +752,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 
 # Diffs
 'history-title' => 'Estorial de revisionis de "$1"',
-'difference' => '(Deferéncias entri las revisionis)',
 'lineno' => 'Línia $1:',
 'compareselectedversions' => 'Comparal velsionis aseñalás',
 'editundo' => 'esjazel',
@@ -985,7 +984,7 @@ Amás premiti qu'otrus ussuárius contatin contigu pol mé la tu página d'ussu
 'nchanges' => '$1 {{PLURAL:$1|chambu|chambus}}',
 'recentchanges' => 'Úrtimus chambus',
 'recentchanges-legend' => 'Ocionis enos úrtimus chambus',
-'recentchangestext' => 'Sigui los úrtimus chambus d´esti güiqui nesta páhina.',
+'recentchanges-summary' => 'Sigui los úrtimus chambus d´esti güiqui nesta páhina.',
 'recentchanges-feed-description' => 'Sigui los úrtimus chambus nel güiqui nesti feed.',
 'rcnote' => "Embahu se {{PLURAL:$1|muestra '''1''' chambu|muestran los úrtimus '''$1''' chambus}} {{PLURAL:$2|dendi ayel|enus úrtimus '''$2''' dias}}, de $4 a las $5.",
 'rcnotefrom' => "Embahu se muestran los chambus hechus dendi el '''$2''' (hata el '''$1''').",
index bdba52b..734b00c 100644 (file)
@@ -78,10 +78,10 @@ $specialPageAliases = array(
        'Booksources'               => array( 'منابع_کتاب' ),
        'BrokenRedirects'           => array( 'تغییرمسیرهای_خراب' ),
        'Categories'                => array( 'رده‌ها' ),
-       'ChangeEmail'               => array( 'تغییر_پست_الکترونیکی' ),
+       'ChangeEmail'               => array( 'تغییر_رایانامه' ),
        'ChangePassword'            => array( 'از_نو_کردن_گذرواژه' ),
        'ComparePages'              => array( 'مقایسه_صفحات' ),
-       'Confirmemail'              => array( 'تایید_پست_الکترونیکی' ),
+       'Confirmemail'              => array( 'تایید_رایانامه' ),
        'Contributions'             => array( 'مشارکت‌ها' ),
        'CreateAccount'             => array( 'ایجاد_حساب_کاربری' ),
        'Deadendpages'              => array( 'صفحه‌های_بن‌بست' ),
@@ -95,7 +95,7 @@ $specialPageAliases = array(
        'FileDuplicateSearch'       => array( 'جستجوی_پرونده_تکراری' ),
        'Filepath'                  => array( 'مسیر_پرونده' ),
        'Import'                    => array( 'درون_ریزی_صفحه' ),
-       'Invalidateemail'           => array( 'باطل_کردن_پست_الکترونیکی' ),
+       'Invalidateemail'           => array( 'باطل_کردن_رایانامه' ),
        'BlockList'                 => array( 'فهرست_بستن_نشانی_آی‌پی' ),
        'LinkSearch'                => array( 'جستجوی_پیوند' ),
        'Listadmins'                => array( 'فهرست_مدیران' ),
@@ -254,18 +254,17 @@ $dateFormats = array(
        'persian date' => '‏xij xiF xiY',
        'persian both' => '‏xij xiF xiY، ساعت H:i',
 
-    'hebrew time' => '‏H:i',
+       'hebrew time' => '‏H:i',
        'hebrew date' => '‏xij xjF xjY',
        'hebrew both' => '‏H:i, xij xjF xjY',
 
-
        'ISO 8601 time' => 'xnH:xni:xns',
        'ISO 8601 date' => 'xnY-xnm-xnd',
        'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#تغییرمسیر', '#REDIRECT' ),
+       'redirect'                => array( '0', '#تغییر_مسیر', '#تغییرمسیر', '#REDIRECT' ),
        'notoc'                   => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
        'nogallery'               => array( '0', '__بی‌نگارخانه__', '__NOGALLERY__' ),
        'forcetoc'                => array( '0', '__بافهرست__', '__FORCETOC__' ),
@@ -305,6 +304,7 @@ $magicWords = array(
        'pagenamee'               => array( '1', 'نام‌صفحه‌کد', 'نام_صفحه_کد', 'PAGENAMEE' ),
        'namespace'               => array( '1', 'فضای‌نام', 'فضای_نام', 'NAMESPACE' ),
        'namespacee'              => array( '1', 'فضای‌نام‌کد', 'فضای_نام_کد', 'NAMESPACEE' ),
+       'namespacenumber'         => array( '1', 'شماره_فضای_نام', 'شماره‌فضای‌نام', 'NAMESPACENUMBER' ),
        'talkspace'               => array( '1', 'فضای‌بحث', 'فضای_بحث', 'TALKSPACE' ),
        'talkspacee'              => array( '1', 'فضای‌بحث‌کد', 'فضای_بحث_کد', 'TALKSPACEE' ),
        'subjectspace'            => array( '1', 'فضای‌موضوع', 'فضای‌مقاله', 'فضای_موضوع', 'فضای_مقاله', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -375,6 +375,7 @@ $magicWords = array(
        'plural'                  => array( '0', 'جمع:', 'PLURAL:' ),
        'fullurl'                 => array( '0', 'نشانی‌کامل:', 'نشانی_کامل:', 'FULLURL:' ),
        'fullurle'                => array( '0', 'نشانی‌کامل‌کد:', 'نشانی_کامل_کد:', 'FULLURLE:' ),
+       'canonicalurl'            => array( '0', 'نشانی_استاندارد:', 'نشانی‌استاندارد:', 'CANONICALURL:' ),
        'lcfirst'                 => array( '0', 'ابتداکوچک:', 'ابتدا_کوچک:', 'LCFIRST:' ),
        'ucfirst'                 => array( '0', 'ابتدابزرگ:', 'ابتدا_بزرگ:', 'UCFIRST:' ),
        'lc'                      => array( '0', 'ک:', 'LC:' ),
@@ -413,8 +414,8 @@ $magicWords = array(
        'url_path'                => array( '0', 'مسیر', 'PATH' ),
        'url_wiki'                => array( '0', 'ویکی', 'WIKI' ),
        'url_query'               => array( '0', 'دستور', 'QUERY' ),
-       'defaultsort_noerror'     => array( '0', 'بدون‌خطا', 'noerror' ),
-       'defaultsort_noreplace'   => array( '0', 'جایگزین‌نکن', 'noreplace' ),
+       'defaultsort_noerror'     => array( '0', 'بدون‌خطا', 'بدون_خطا', 'noerror' ),
+       'defaultsort_noreplace'   => array( '0', 'جایگزین‌نکن', 'جایگزین_نکن', 'noreplace' ),
 );
 
 # Harakat are intentionally not included in the linkTrail. Their addition should
@@ -444,7 +445,7 @@ $messages = array(
 'tog-editsection' => 'ویرایش بخش‌ها از طریق پیوندهای [ویرایش] فعال باشد',
 'tog-editsectiononrightclick' => 'ویرایش بخش‌ها با کلیک راست روی عناوین قسمت‌ها فعال باشد (نیازمند جاوااسکریپت)',
 'tog-showtoc' => 'فهرست مندرجات نمایش یابد (برای صفحه‌های دارای بیش از ۳ عنوان)',
-'tog-rememberpassword' => 'گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\86 (تا Ø­Ø¯Ø§Ú©Ø«Ø± $1 {{PLURAL:$1|رÙ\88ز|رÙ\88ز}}) در این مرورگر به خاطر سپرده شود',
+'tog-rememberpassword' => 'گذرÙ\88اÚ\98Ù\87Ù\94 Ù\85Ù\86 (حداکثر $1 Ø±Ù\88ز) در این مرورگر به خاطر سپرده شود',
 'tog-watchcreations' => 'صفحه‌هایی که می‌سازم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-watchdefault' => 'صفحه‌هایی که ویرایش می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
 'tog-watchmoves' => 'صفحه‌هایی که منتقل می‌کنم به فهرست پی‌گیری‌هایم افزوده شود',
@@ -453,10 +454,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 +473,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود',
 'tog-watchlisthidepatrolled' => 'ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود',
 'tog-nolangconversion' => 'تبدیل گویش‌ها غیرفعال شود',
-'tog-ccmeonemails' => 'رونوشتی از نامه‌های الکترونیکی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
+'tog-ccmeonemails' => 'رونوشتی از نامه‌ای که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود',
 'tog-diffonly' => 'محتوای صفحه، زیر تفاوت نمایش داده نشود',
 'tog-showhiddencats' => 'رده‌های پنهان نمایش داده شود',
 'tog-noconvertlink' => 'تبدیل عنوان پیوند غیرفعال شود',
@@ -827,7 +828,9 @@ $2',
 دلیل ارائه‌شده این است: «''$2''».",
 'filereadonlyerror' => "تغییر پرونده «$1» ممکن نیست چون مخزن پرونده «$2» در حالت فقط خواندنی قرار دارد.
 
-دلیل ارائه شده چنین است: «''$3''».",
+مدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  ''$3''.",
+'invalidtitle-knownnamespace' => 'عنوان نامعتبر با فضای نام «$2» و متن «$3»',
+'invalidtitle-unknownnamespace' => 'عنوان نامعتبر با فضای نام ناشناختهٔ شمارهٔ $1 و متن «$2»',
 
 # Virus scanner
 'virus-badscanner' => "پیکربندی بد: پویشگر ویروس ناشناخته: ''$1''",
@@ -863,7 +866,7 @@ $2',
 'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
 'gotaccountlink' => 'وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
-'createaccountmail' => 'با پست الکترونیکی',
+'createaccountmail' => 'با رایانامه',
 'createaccountreason' => 'دلیل:',
 'badretype' => 'گذرواژه‌هایی که وارد کرده‌اید یکسان نیستند.',
 'userexists' => 'نام کاربری‌ای که وارد کردید قبلاً استفاده شده‌است.
@@ -896,7 +899,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 +907,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 +944,7 @@ $2',
 
 # E-mail sending
 'php-mail-error-unknown' => 'خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی',
-'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس پست الکترونیک.',
+'user-mail-no-addy' => 'تلاش برای ارسال نامه بدون یک آدرس رایانامه.',
 
 # Change password dialog
 'resetpass' => 'تغییر گذرواژه',
@@ -971,9 +974,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 +994,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 +1059,7 @@ $2
 * کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
 
 شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمی‌توانید از ویژگی «فرستادن پست الکترونیکی به این کاربر» استفاده کنید مگر آنکه نشانی پست الکترونیکی معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]‌تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
 نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
 لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'autoblockedtext' => "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.
@@ -1070,13 +1073,13 @@ $2
 
 شما می‌توانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
 
-توجه کنید که برای ارسال پست الکترونیکی در ویکی، باید پست الکترونیکی خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
+توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
 
 نشانی آی‌پی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
 لطفاً این شماره را در هر درخواستی که در این باره مطرح می‌کنید ذکر کنید.",
 'blockednoreason' => 'دلیلی مشخص نشده‌است',
 'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
-'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی پست الکترونیکی خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
+'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
 'nosuchsectiontitle' => 'چنین بخشی پیدا نشد',
 'nosuchsectiontext' => 'شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.
 ممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.',
@@ -1129,6 +1132,7 @@ $2
 'note' => "'''نکته:'''",
 'previewnote' => "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''
 تغییرات شما هنوز ذخیره نشده‌است!",
+'continue-editing' => 'ادامهٔ ویرایش',
 'previewconflict' => 'این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.',
 'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''
 لطفاً دوباره سعی کنید.
@@ -1179,8 +1183,8 @@ $2
 'semiprotectedpagewarning' => "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن‌ باشند.
 آخرین موارد سیاهه در زیر آمده‌است:",
 'cascadeprotectedwarning' => "'''هشدار:''' این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
-'titleprotectedwarning' => "'''هشدار: این صفحه قفل شده‌است به شکلی که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''
-ٱحرین موارد سیاهه در زیر آمده است:",
+'titleprotectedwarning' => "'''هشدار: این صفحه به شکلی قفل شده‌است که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''
+آخرین موارد سیاهه در زیر آمده است:",
 'templatesused' => '{{PLURAL:$1|الگوی|الگوهای}} به‌کاررفته در این صفحه:',
 'templatesusedpreview' => '{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این پیش‌نمایش:',
 'templatesusedsection' => '{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این بخش:',
@@ -1228,6 +1232,12 @@ $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' => 'صفحه حداکثر عمق بسط دادن تجاوز کرد',
+'parser-unstrip-loop-warning' => 'حلقه در دستور unstrip پیدا شد',
+'parser-unstrip-recursion-limit' => 'از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)',
 
 # "Undo" feature
 'undo-success' => 'این ویرایش را می‌توان خنثی کرد.
@@ -1370,7 +1380,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'سیاههٔ فرونشانی',
 'suppressionlogtext' => 'در زیر فهرستی از آخرین حذف‌ها و قطع دسترسی‌هایی که حاوی محتوایی هستند که از مدیران پنهان شده‌اند را می‌بینید.
-برای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|IP block list]] را ببینید.',
+برای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.',
 
 # History merging
 'mergehistory' => 'ادغام تاریخچه صفحه‌ها',
@@ -1404,8 +1414,9 @@ $1",
 'mergelogpagetext' => 'در زیر سیاهه آخرین موارد ادغام تاریخچه یک صفحه در صفحه‌ای دیگر را می‌بینید.',
 
 # Diffs
-'history-title' => 'تاریخچهٔ ویرایش‌های «$1»',
-'difference' => '(تفاوت بین نسخه‌ها)',
+'history-title' => '$1: تاریخچهٔ ویرایش‌ها',
+'difference-title' => '$1: تفاوت بین نسخه‌ها',
+'difference-title-multipage' => '$1 و $2: تفاوت بین صفحه‌ها',
 'difference-multipage' => '(تفاوت بین صفحه‌ها)',
 'lineno' => 'سطر $1:',
 'compareselectedversions' => 'مقایسهٔ نسخه‌های انتخاب‌شده',
@@ -1503,6 +1514,7 @@ $1",
 'prefs-beta' => 'ابزارهای کارآمد',
 'prefs-datetime' => 'تاریخ و زمان',
 'prefs-labs' => 'قسمت‌های آزمایشی',
+'prefs-user-pages' => 'صفحه‌های کاربری',
 'prefs-personal' => 'داده‌های کاربر',
 'prefs-rc' => 'تغییرات اخیر',
 'prefs-watchlist' => 'فهرست پی‌گیری‌ها',
@@ -1513,9 +1525,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' => 'صفرکردن ترجیحات',
@@ -1553,7 +1565,7 @@ $1",
 'timezoneregion-europe' => 'اروپا',
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
-'allowemail' => 'امکان دریافت پست الکترونیکی از دیگر کاربران',
+'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
 'prefs-searchoptions' => 'گزینه‌های جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
@@ -1564,9 +1576,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|گروه|گروه‌ها}}:',
@@ -1587,13 +1599,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' => 'امضا',
@@ -1610,8 +1622,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' => 'مدیریت اختیارات کاربر',
@@ -1692,7 +1704,7 @@ $1",
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
-'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال پست الکترونیکی',
+'right-blockemail' => 'قطع دسترسی دیگر کاربران برای ارسال رایانامه',
 'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
 'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای',
 'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها',
@@ -1717,7 +1729,7 @@ $1",
 'right-userrights-interwiki' => 'ویرایش اختیارات کاربرهای ویکی‌های دیگر',
 'right-siteadmin' => 'قفل کردن و باز کردن پایگاه داده',
 'right-override-export-depth' => 'برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵',
-'right-sendemail' => 'ارسال نامه الکترونیکی به دیگر کاربران',
+'right-sendemail' => 'ارسال رایانامه به دیگر کاربران',
 'right-passwordreset' => 'مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه',
 
 # User rights log
@@ -1750,7 +1762,7 @@ $1",
 'action-undelete' => 'احیای این صفحه',
 'action-suppressrevision' => 'مشاهده و احیای ویرایش‌های حذف شده',
 'action-suppressionlog' => 'مشاهدهٔ این سیاههٔ خصوصی',
-'action-block' => 'قطع دسترسی ویرایش این کاربر',
+'action-block' => 'قطع دسترسی این کاربر از ویرایش کردن',
 'action-protect' => 'تغییر سطح محافظت این صفحه',
 'action-rollback' => 'واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است',
 'action-import' => 'وارد کردن این صفحه از یک ویکی دیگر',
@@ -1768,7 +1780,7 @@ $1",
 'nchanges' => '$1 تغییر',
 'recentchanges' => 'تغییرات اخیر',
 'recentchanges-legend' => 'گزینه‌های تغییرات اخیر',
-'recentchangestext' => 'آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.',
+'recentchanges-summary' => 'آخرین تغییرات ویکی را در این صفحه پی‌گیری کنید.',
 'recentchanges-feed-description' => 'آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.',
 'recentchanges-label-newpage' => 'این ویرایش صفحه‌ای جدید ایجاد کرد',
 'recentchanges-label-minor' => 'این ویرایش جزئی‌است',
@@ -1971,14 +1983,19 @@ $1',
 'backend-fail-writetemp' => 'امکان نوشتن بر روی پروندهٔ موقتی وجود ندارد.',
 'backend-fail-closetemp' => 'نمی‌توان پروندهٔ موقتی را بست.',
 'backend-fail-read' => 'نمی‌توان پروندهٔ $1 را خواند.',
-'backend-fail-create' => 'نمی‌توان پروندهٔ $1 را ایجاد کرد.',
-'backend-fail-maxsize' => 'نمی‌توان پروندهٔ $1 را ایجاد کرد چون بزرگتر از {{PLURAL:$2|یک بایت|$2 بایت}} است.',
+'backend-fail-create' => 'نمی‌توان بر روی پروندهٔ $1 اطلاعات نوشت.',
+'backend-fail-maxsize' => 'نمی‌توان بر روی پروندهٔ $1 اطلاعات نوشت چون بزرگتر از {{PLURAL:$2|یک بایت|$2 بایت}} است.',
 'backend-fail-readonly' => 'پشتیبان «$1» درحال حاضر در وضیت فقط خواندنی است. دلیل ارائه شده چنین است: «$2»',
 'backend-fail-synced' => 'پرونده «$1» در پشتیبان‌های ذخیره داخلی در وضعیتی ناپایدار قرار دارد',
 'backend-fail-connect' => 'ارتباط با پشیبان ذخیره «$1» برقرار نشد.',
 'backend-fail-internal' => 'خطایی نامعلوم در پشتیبان ذخیره «$1» رخ داد.',
 'backend-fail-contenttype' => 'تعیین نوع محتوای پرونده برای ذخیره در «$1» ناموفق بود.',
 'backend-fail-batchsize' => 'دسته‌ای مشتمل بر $1 {{PLURAL:$1|عملکرد|عملکرد}} پرونده به پشتیبان ذخیره داده شد؛ حداکثر مجاز $2 {{PLURAL:$2|عملکرد|عملکرد}} است.',
+'backend-fail-usable' => 'امکان نوشتن در پروندهٔ $1 وجود نداشت چرا که سطح دسترسی کافی نیست یا شاخه مورد نظر وجود ندارد.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'امکان وصل شدن به پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.',
+'filejournal-fail-dbquery' => 'امکان به روز کردن پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.',
 
 # Lock manager
 'lockmanager-notlocked' => 'نمی‌توان قفل «$1» را گشود؛ چون قفل نشده‌است.',
@@ -2090,7 +2107,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'linkstoimage-more' => 'بیش از $1 صفحه به این پرونده پیوند {{PLURAL:$1|دارد|دارند}}.
 فهرست زیر تنها {{PLURAL:$1|اولین پیوند|اولین $1 پیوند}} به این صفحه را نشان می‌دهد.
 [[Special:WhatLinksHere/$2|فهرست کامل]] نیز موجود است.',
-'nolinkstoimage' => 'هیچ صفحه‌ای به این تصویر پیوند ندارد.',
+'nolinkstoimage' => 'این پرونده در هیچ صفحه‌ای به کار نرفته‌است.',
 'morelinkstoimage' => '[[Special:WhatLinksHere/$1|پیوندهای دیگر]] به این پرونده را ببینید.',
 'linkstoimage-redirect' => '$1 (تغییرمسیر پرونده) $2',
 'duplicatesoffile' => '{{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر نسخهٔ تکراری این پرونده {{PLURAL:$1|است|هستند}} ([[Special:FileDuplicateSearch/$2|اطلاعات بیشتر]]):',
@@ -2099,6 +2116,10 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 برای اطلاعات بیشتر لطفاً [$2 صفحهٔ توضیحات پرونده] را ببینید.',
 'sharedupload-desc-here' => 'این پرونده در $1 قرار دارد و ممکن است در پروژه‌های دیگر هم استفاده شود.
 توضیحات موجود در [$2 صفحهٔ توضیحات پرونده در آنجا]، در زیر نشان داده شده‌است.',
+'sharedupload-desc-edit' => 'این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.
+اگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.',
+'sharedupload-desc-create' => 'این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.
+اگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.',
 'filepage-nofile' => 'پرونده‌ای با این نام وجود ندارد.',
 'filepage-nofile-link' => 'پرونده‌ای با این نام وجود ندارد، اما شما می‌توانید آن را [$1 بارگذاری کنید].',
 'uploadnewversion-linktext' => 'بارگذاری نسخهٔ جدیدی از پرونده',
@@ -2295,6 +2316,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 می‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.',
 'logempty' => 'مورد منطبق با منظور شما در سیاهه یافت نشد.',
 'log-title-wildcard' => 'صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود',
+'showhideselectedlogentries' => 'نمایش/نهفتن موارد انتخابی در سیاهه',
 
 # Special:AllPages
 'allpages' => 'همهٔ صفحه‌ها',
@@ -2314,6 +2336,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 '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|ردهٔ|رده‌های}} زیر دارای صفحه‌ها یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.
@@ -2379,24 +2406,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' => 'عنوان:',
@@ -2404,9 +2431,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' => 'گذاشتن پیغام سامانه.',
@@ -2433,13 +2460,13 @@ 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' => 'بررسی صفحه‌های مورد پی‌گیری برای ویرایش‌های اخیر',
 'watchlistcontains' => 'فهرست پی‌گیری‌های شما حاوی $1 {{PLURAL:$1|صفحه|صفحه}} است.',
 'iteminvalidname' => 'مشکل با مورد «$1»، نام نامعتبر است...',
-'wlnote' => "در زیر {{PLURAL:$1|تغییری|'''$1''' تغییری}} که در {{PLURAL:$2|ساعت|'''$2''' ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
+'wlnote' => 'در زیر {{PLURAL:$1|تغییری|$1 تغییری}} که در {{PLURAL:$2|ساعت|$2 ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4',
 'wlshowlast' => 'نمایش آخرین $1 ساعت $2 روز $3',
 'watchlist-options' => 'گزینه‌های پیگیری',
 
@@ -2448,7 +2475,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}}',
@@ -2744,7 +2771,7 @@ $1',
 **نام کاربری نامناسب',
 'ipb-hardblock' => 'جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی',
 'ipbcreateaccount' => 'جلوگیری از ایجاد حساب',
-'ipbemailban' => 'جلوگیری از ارسال پست الکترونیکی',
+'ipbemailban' => 'جلوگیری از ارسال رایانامه',
 'ipbenableautoblock' => 'بستن  خودکار آخرین نشانی آی‌پی استفاده شده توسط کاربر و نشانی‌های دیگری که از آن‌ها برای ویرایش تلاش می‌کند',
 'ipbsubmit' => 'این کاربر بسته شود',
 'ipbother' => 'زمانی دیگر',
@@ -2759,7 +2786,7 @@ $1',
 'badipaddress' => 'نشانی آی‌‍ی غیر مجاز',
 'blockipsuccesssub' => 'بستن با موفقیت انجام شد',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بسته شد.<br />
-براÛ\8c Ø¨Ø±Ø±Ø³Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\86â\80\8cÙ\87ا [[Special:BlockList|Ù\81Ù\87رست Ù\86شاÙ\86Û\8câ\80\8cÙ\87اÛ\8c Ø¢Û\8câ\80\8cÙ¾Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87]] را ببینید.',
+براÛ\8c Ø¨Ø±Ø±Ø³Û\8c Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87â\80\8cÙ\87ا [[Special:BlockList|Ù\81Ù\87رست Ø¨Ø³ØªÙ\87â\80\8cشدÙ\87â\80\8cÙ\87ا]] را ببینید.',
 'ipb-blockingself' => 'شما در حال بستن خودتان هستید!  آیا مطمئن هستید که می‌خواهید چنین کاری انجام دهید؟',
 'ipb-confirmhideuser' => 'شما در حال بستن یک کاربر هستید که «پنهان‌سازی کاربر» برایش فعال شد‌ه‌است. این کار نام کاربر را از همهٔ فهرست‌ها و سیاهه‌ها مخفی می‌کند. آیا مطمئن هستید که می‌خواهید آن را انجام دهید؟',
 'ipb-edit-dropdown' => 'ویرایش دلایل قطع‌دسترسی',
@@ -2794,7 +2821,7 @@ $1',
 'anononlyblock' => 'فقط کاربران گمنام',
 'noautoblockblock' => 'بستن خودکار غیرفعال است',
 'createaccountblock' => 'امکان ایجاد حساب مسدود است',
-'emailblock' => 'پست الکترونیکی مسدود شد',
+'emailblock' => 'رایانامه مسدود شد',
 'blocklist-nousertalk' => 'نمی تواند صفحهٔ بحث خود را ویرایش کند',
 'ipblocklist-empty' => 'فهرست بسته‌شدن‌ها خالی‌است.',
 'ipblocklist-no-results' => 'دسترسی حساب کاربری یا نشانی آی‌پی مورد نظر قطع نیست.',
@@ -2802,7 +2829,7 @@ $1',
 'unblocklink' => 'باز شود',
 'change-blocklink' => 'تغییر قطع دسترسی',
 'contribslink' => 'مشارکت‌ها',
-'emaillink' => 'ارسال پست الکترونیکی',
+'emaillink' => 'ارسال رایانامه',
 'autoblocker' => 'به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.
 دلیل قطع دسترسی $1 چنین است: «$2»',
 'blocklogpage' => 'سیاههٔ بسته‌شدن‌ها',
@@ -2812,14 +2839,14 @@ $1',
 سیاههٔ قطع دسترسی در زیر نمایش یافته است:',
 'blocklogentry' => '«[[$1]]» را تا $2 بست $3',
 'reblock-logentry' => 'تنظیمات قطع دسترسی [[$1]] را تغییر داد به پایان قطع دسترسی در $2 $3',
-'blocklogtext' => 'اÛ\8cÙ\86 Ø³Û\8cاÙ\87Ù\87â\80\8cاÛ\8c Ø§Ø² Ø§Ø¹Ù\85اÙ\84 Ø¨Ø³ØªÙ\86 Ù\88 Ø¨Ø§Ø² Ú©Ø±Ø¯Ù\86 Ú©Ø§Ø±Ø¨Ø±Ù\87ا Ø§Ø³Øª.
+'blocklogtext' => 'این سیاهه‌ای از بستن و باز کردن کاربرها است.
 نشانی‌های آی‌پی که به طور خودکار بسته شده‌اند فهرست نشده‌اند.
-برای فهرست محرومیت‌ها و بسته‌شدن‌های فعال در لحظهٔ حاضر، به [[Special:BlockList|فهرست آی‌پی‌های بسته]] مراجعه کنید.',
+برای فهرست محرومیت‌ها و بسته‌شدن‌های حال حاضر به [[Special:BlockList|فهرست بسته‌شده‌ها]] مراجعه کنید.',
 'unblocklogentry' => '$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' => 'نام کاربری پنهان',
@@ -3096,7 +3123,7 @@ $1',
 'tooltip-pt-login' => 'توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست',
 'tooltip-pt-anonlogin' => 'توصیه می‌شود که به سامانه وارد شوید، لیکن اجباری نیست',
 'tooltip-pt-logout' => 'خروج از سامانه',
-'tooltip-ca-talk' => 'گفتگو پیرامون صفحهٔ محتوا',
+'tooltip-ca-talk' => 'گفتگو پیرامون محتوای صفحه',
 'tooltip-ca-edit' => 'شما می‌توانید این صفحه را ویرایش کنید. لطفاً پیش از ذخیره از دکمهٔ پیش‌نمایش استفاده کنید.',
 'tooltip-ca-addsection' => 'بخشی جدید ایجاد کنید',
 'tooltip-ca-viewsource' => 'این صفحه محافظت‌شده‌است.
@@ -3125,7 +3152,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' => 'نسخهٔ قابل چاپ این صفحه',
@@ -3182,6 +3209,7 @@ $1',
 'spambot_username' => 'هرزه‌تمیزکارِ مدیاویکی',
 'spam_reverting' => 'واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.',
 'spam_blanking' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن',
+'spam_deleting' => 'تمام نسخه‌ها حاوی پیوند به $1 بود، در حال حذف',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
@@ -3710,63 +3738,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' => '[تراگنجانش بین‌ویکیانه فعال نیست]',
@@ -3956,6 +3984,11 @@ $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 مسیر اسکریپت]',
 
 # Special:FilePath
 'filepath' => 'مسیر پرونده',
@@ -4086,8 +4119,8 @@ $5
 'logentry-newusers-newusers' => '$1 یک حساب کاربری ایجاد کرد',
 'logentry-newusers-create' => '$1 یک حساب کاربری ایجاد کرد',
 'logentry-newusers-create2' => '$1 یک حساب کاربری ایجاد کرد $3',
-'logentry-newusers-autocreate' => 'کاروری حساب $1  بساتن به شکل خودکار',
-'newuserlog-byemail' => 'گذرواژه با پست الکترونیکی ارسال شد',
+'logentry-newusers-autocreate' => 'حساب $1  به شکل خودکار ساخته شد',
+'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
 
 # Feedback
 'feedback-bugornote' => 'اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$2 $3]» افزوده خواهد شد.',
@@ -4142,4 +4175,17 @@ $5
 'api-error-uploaddisabled' => 'بارگذاری در این ویکی غیرفعال است.',
 'api-error-verification-error' => 'ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.',
 
+# Durations
+'duration-seconds' => '$1 ثانیه',
+'duration-minutes' => '$1 دقیقه',
+'duration-hours' => '$1 ساعت',
+'duration-days' => '$1 روز',
+'duration-weeks' => '$1 هفته',
+'duration-years' => '$1 سال',
+'duration-decades' => '$1 دهه',
+'duration-centuries' => '$1 قرن',
+'duration-millennia' => '{{PLURAL:$1|هزار سال |$1 هزار سال}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'امکان گرفتن قفل‌های سرور $1 وجود ندارد.',
 );
index e67a909..13f27ce 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Finnish (Suomi)
+/** Finnish (suomi)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -16,6 +16,8 @@
  * @author Jack Phoenix
  * @author Jafeluv
  * @author Kaganer
+ * @author Kulmalukko
+ * @author Linnea
  * @author Mobe
  * @author Nedergard
  * @author Nike
@@ -687,7 +689,13 @@ $2',
 'customcssprotected' => 'Sinulla ei ole oikeutta muuttaa tätä CSS-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'customjsprotected' => 'Sinulla ei ole oikeutta muuttaa tätä JavaScript-sivua, koska se sisältää toisen käyttäjän henkilökohtaisia asetuksia.',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
-'titleprotected' => "Käyttäjä [[User:$1|$1]] on asettanut tämän sivun luontikieltoon: ''$2''.",
+'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
+Syynä on: ''$2''.",
+'filereadonlyerror' => 'Tiedostoa "$1" ei voi muuttaa, koska jaettu mediavarasto "$2" on "vain luku" -tilassa.
+
+Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: "$3".',
+'invalidtitle-knownnamespace' => 'Virheellinen sivunimi, nimiavaruus "$2" ja teksti "$3"',
+'invalidtitle-unknownnamespace' => 'Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti $2',
 
 # Virus scanner
 'virus-badscanner' => "Virheellinen asetus: Tuntematon virustutka: ''$1''",
@@ -764,6 +772,7 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
 'emailconfirmlink' => 'Varmenna sähköpostiosoite',
 'invalidemailaddress' => 'Sähköpostiosoitetta ei voida hyväksyä, koska se ei ole oikeassa muodossa. Ole hyvä ja anna oikea sähköpostiosoite tai jätä kenttä tyhjäksi.',
 'cannotchangeemail' => 'Tunnuksien sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
+'emaildisabled' => 'Tältä sivustolta ei voi lähettää sähköpostia.',
 'accountcreated' => 'Käyttäjätunnus luotiin',
 'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
 'createaccount-title' => 'Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}',
@@ -960,7 +969,8 @@ Alla on viimeisin estolokin tapahtuma:',
 'userinvalidcssjstitle' => "'''Varoitus:''' Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
 'updated' => '(Päivitetty)',
 'note' => "'''Huomautus:'''",
-'previewnote' => "'''Tämä on vasta sivun esikatselu. Sivua ei ole vielä tallennettu!'''",
+'previewnote' => "'''Tämä on vasta sivun esikatselu. Tekemiäsi muokkauksia ei ole vielä tallennettu!'''",
+'continue-editing' => 'Jatka muokkaamista',
 'previewconflict' => 'Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.',
 'session_fail_preview' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.''' Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
 'session_fail_preview_html' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''
@@ -971,6 +981,7 @@ Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ul
 'token_suffix_mismatch' => "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
 'edit_form_incomplete' => "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
 'editing' => 'Muokataan sivua $1',
+'creating' => 'Luodaan sivu $1',
 'editingsection' => 'Muokataan osiota sivusta $1',
 'editingcomment' => 'Muokataan uutta osiota sivulla $1',
 'editconflict' => 'Päällekkäinen muokkaus: $1',
@@ -986,7 +997,7 @@ Sinun täytyy yhdistää muutoksesi olemassa olevaan tekstiin.
 'yourdiff' => 'Eroavaisuudet',
 'copyrightwarning' => "'''Muutoksesi astuvat voimaan välittömästi.''' Kaikki {{GRAMMAR:illative|{{SITENAME}}}} tehtävät tuotokset katsotaan julkaistuksi $2 -lisenssin mukaisesti ($1). Jos et halua, että kirjoitustasi muokataan armottomasti ja uudelleenkäytetään vapaasti, älä tallenna kirjoitustasi. Tallentamalla muutoksesi lupaat, että kirjoitit tekstisi itse, tai kopioit sen jostain vapaasta lähteestä. '''ÄLÄ KÄYTÄ TEKIJÄNOIKEUDEN ALAISTA MATERIAALIA ILMAN LUPAA!'''",
 'copyrightwarning2' => "Huomaa, että kuka tahansa voi muokata, muuttaa ja poistaa kaikkia sivustolle tekemiäsi lisäyksiä ja muutoksia. Muokkaamalla sivustoa luovutat sivuston käyttäjille tämän oikeuden ja takaat, että lisäämäsi aineisto on joko itse kirjoittamaasi tai peräisin jostain vapaasta lähteestä. Lisätietoja sivulla $1. '''TEKIJÄNOIKEUDEN ALAISEN MATERIAALIN KÄYTTÄMINEN ILMAN LUPAA ON EHDOTTOMASTI KIELLETTYÄ!'''",
-'longpageerror' => "'''Sivun koko on $1 binäärikilotavua. Sivua ei voida tallentaa, koska enimmäiskoko on $2 binäärikilotavua.'''",
+'longpageerror' => "'''Virhe: Lähettämäsi tekstin pituus on {{PLURAL:$1|kilotavu|$1 kilotavua}}. Tekstiä ei voida tallentaa, koska se on pitempi kuin sallittu enimmäispituus {{PLURAL:$2|yksi kilotavu|$2 kilotavua}}.'''",
 'readonlywarning' => "'''Varoitus: Tietokanta on lukittu huoltoa varten, joten et pysty tallentamaan muokkauksiasi juuri nyt.'''
 Saattaa olla paras leikata ja liimata tekstisi omaan tekstitiedostoosi ja tallentaa se tänne myöhemmin.
 
@@ -996,7 +1007,7 @@ Alla on viimeisin lokitapahtuma:",
 'semiprotectedpagewarning' => 'Tämä sivu on lukittu siten, että vain rekisteröityneet käyttäjät voivat muokata sitä.
 Alla on viimeisin lokitapahtuma:',
 'cascadeprotectedwarning' => '<strong>Vain ylläpitäjät voivat muokata tätä sivua, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}</strong>:',
-'titleprotectedwarning' => "'''Tämä sivun luominen on rajoitettu vain osalle käyttäjistä [[Special:ListGroupRights|tietyillä oikeuksilla]].'''
+'titleprotectedwarning' => "'''Varoitus: Tämä sivunimi on suojattu niin, että sivun luomiseen tarvitaan [[Special:ListGroupRights|erityisiä oikeuksia]].'''
 Alla on viimeisin lokitapahtuma:",
 'templatesused' => 'Tällä sivulla {{PLURAL:$1|käytetty malline|käytetyt mallineet}}:',
 'templatesusedpreview' => 'Esikatselussa mukana {{PLURAL:$1|oleva malline|olevat mallineet}}:',
@@ -1025,6 +1036,7 @@ Se on ilmeisesti poistettu.',
 'edit-no-change' => 'Muokkauksesi sivuutettiin, koska tekstiin ei tehty mitään muutoksia.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
+'defaultmessagetext' => 'Viestin oletusteksti',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
@@ -1039,6 +1051,10 @@ Nämä muuttujat on jätetty käsittelemättä.",
 'parser-template-loop-warning' => 'Mallinesilmukka havaittu: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Mallineen rekursioraja ylittyi ($1)',
 'language-converter-depth-warning' => 'Kielimuuntimen syvyysraja ylittyi ($1)',
+'node-count-exceeded-category' => 'Sivut, joissa solmumäärä on ylitetty',
+'node-count-exceeded-warning' => 'Sivu ylitti solmumäärän',
+'expansion-depth-exceeded-category' => 'Sivut, joissa laajentamissyvyys on ylitetty',
+'expansion-depth-exceeded-warning' => 'Sivu ylitti laajentamissyvyyden.',
 
 # "Undo" feature
 'undo-success' => 'Kumoaminen onnistui. Valitse <em>tallenna</em> toteuttaaksesi muutokset.',
@@ -1125,25 +1141,25 @@ Voit silti nähdä tämän muutoksen. Lisätietoja löytyy [{{fullurl:{{#Special
 'revdelete-no-file' => 'Määritettyä tiedostoa ei ole olemassa.',
 'revdelete-show-file-confirm' => 'Haluatko varmasti nähdä poistetun version tiedostosta <nowiki>$1</nowiki>, joka on tallennettu $2 kello $3?',
 'revdelete-show-file-submit' => 'Kyllä',
-'revdelete-selected' => "'''{{PLURAL:$2|Valittu versio|Valitut versiot}} sivusta '''$1:''''''",
+'revdelete-selected' => "'''{{PLURAL:$2|Valittu versio|Valitut versiot}} sivusta [[:$1]]'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Valittu lokimerkintä|Valitut lokimerkinnät}}:'''",
-'revdelete-text' => "'''Poistetut versiot näkyvät sivun historiassa, mutta niiden sisältö ei ole julkisesti saatavilla.'''
-Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti lukea piilotetun sisällön ja he voivat palauttaa sen tämän käyttöliittymän kautta, ellei sitä ole rajoitettu.",
+'revdelete-text' => "'''Poistetut versiot ja lokitapahtumat näkyvät edelleen sivun historiassa ja lokeissa, mutta osa niiden sisällöstä ei ole julkisesti saatavilla.'''
+Muut ylläpitäjät {{GRAMMAR:inessive|{{SITENAME}}}} voivat silti tarkastella piilotettua sisältöä, ja he voivat palauttaa sen näkyviin tämän käyttöliittymän kautta, ellei tätä ole erikseen rajoitettu.",
 'revdelete-confirm' => 'Varmista, että haluat tehdä tämän – ymmärrät seuraukset ja teet tämän [[{{MediaWiki:Policy-url}}|käytäntöjen]] mukaisesti.',
 'revdelete-suppress-text' => "Häivytystä pitäisi käyttää '''vain''' seuraavissa tapauksissa:
 * Sopimattomat henkilötiedot
 *: ''kotiosoitteet, puhelinnumerot, sosiaaliturvatunnukset ja muut.''",
-'revdelete-legend' => 'Version rajoitukset',
-'revdelete-hide-text' => 'Piilota version sisältö',
+'revdelete-legend' => 'Aseta version näkyvyyden rajoitukset',
+'revdelete-hide-text' => 'Piilota version tekstisisältö',
 'revdelete-hide-image' => 'Piilota tiedoston sisältö',
 'revdelete-hide-name' => 'Piilota toiminto ja kohde',
 'revdelete-hide-comment' => 'Piilota yhteenveto',
 'revdelete-hide-user' => 'Piilota tekijän tunnus tai IP-osoite',
-'revdelete-hide-restricted' => 'Piilota tiedot ylläpitäjiltä kuten muilta',
+'revdelete-hide-restricted' => 'Häivytä tiedot sekä ylläpitäjien että muiden käyttäjien näkyviltä',
 'revdelete-radio-same' => '(älä muuta)',
 'revdelete-radio-set' => 'Kyllä',
 'revdelete-radio-unset' => 'Ei',
-'revdelete-suppress' => 'Piilota myös ylläpitäjiltä',
+'revdelete-suppress' => 'Häivytä tiedot myös ylläpitäjien näkyviltä samalla kun piilotat ne muilta käyttäjiltä',
 'revdelete-unsuppress' => 'Poista rajoitukset palautetuilta versiolta',
 'revdelete-log' => 'Syy',
 'revdelete-submit' => 'Toteuta {{PLURAL:$1|valittuun versioon|valittuihin versioihin}}',
@@ -1176,8 +1192,8 @@ Sinulla ei ole oikeutta siihen.',
 
 # Suppression log
 'suppressionlog' => 'Häivytysloki',
-'suppressionlogtext' => 'Alla on lista uusimmista poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
-[[Special:BlockList|Muokkausestolistassa]] on tämänhetkiset muokkausestot.',
+'suppressionlogtext' => 'Alla on luettelo poistoista ja muokkausestoista, jotka sisältävät ylläpitäjiltä piilotettua materiaalia.
+[[Special:BlockList|Estolistassa]] on lueteltu voimassa olevat muokkauskiellot ja muokkausestot.',
 
 # History merging
 'mergehistory' => 'Yhdistä muutoshistoriat',
@@ -1209,8 +1225,9 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'mergelogpagetext' => 'Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.',
 
 # Diffs
-'history-title' => 'Sivun $1 muutoshistoria',
-'difference' => 'Versioiden väliset erot',
+'history-title' => 'Sivun "$1" muutoshistoria',
+'difference-title' => 'Ero sivun "$1" versioiden välillä',
+'difference-title-multipage' => 'Erot sivujen "$1" ja "$2" välillä',
 'difference-multipage' => '(Sivujen välinen eroavaisuus)',
 'lineno' => 'Rivi $1:',
 'compareselectedversions' => 'Vertaile valittuja versioita',
@@ -1239,7 +1256,7 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 
 $1 {{int:pipe-separator}} $2',
 'searchmenu-legend' => 'Hakuasetukset',
-'searchmenu-exists' => "'''Sivu [[:$1]] löytyy tästä wikistä.'''",
+'searchmenu-exists' => "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
 'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähän wikiin.'''",
 'searchhelp-url' => 'Help:Sisällys',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Selaa sivuja tällä etuliitteellä]]',
@@ -1280,9 +1297,9 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-ns' => 'Hae nimiavaruuksista:',
 'powersearch-redir' => 'Luettele ohjaukset',
 'powersearch-field' => 'Etsi',
-'powersearch-togglelabel' => 'Muuta valinta',
+'powersearch-togglelabel' => 'Muuta valintaa',
 'powersearch-toggleall' => 'Valitse kaikki',
-'powersearch-togglenone' => 'Poista kaikki',
+'powersearch-togglenone' => 'Valitse ei mitään',
 'search-external' => 'Ulkoinen haku',
 'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
 
@@ -1308,6 +1325,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'prefs-beta' => 'Beta-ominaisuudet',
 'prefs-datetime' => 'Aika ja päiväys',
 'prefs-labs' => 'Kokeelliset ominaisuudet',
+'prefs-user-pages' => 'Käyttäjäsivut',
 'prefs-personal' => 'Käyttäjätiedot',
 'prefs-rc' => 'Tuoreet muutokset',
 'prefs-watchlist' => 'Tarkkailulista',
@@ -1461,7 +1479,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 # Rights
 'right-read' => 'Lukea sivuja',
 'right-edit' => 'Muokata sivuja',
-'right-createpage' => 'Luoda sivuja pois lukien keskustelusivut',
+'right-createpage' => 'Luoda sivuja (jotka eivät ole keskustelusivuja)',
 'right-createtalk' => 'Luoda keskustelusivuja',
 'right-createaccount' => 'Luoda uusia käyttäjätunnuksia',
 'right-minoredit' => 'Merkitä muokkauksensa pieniksi',
@@ -1567,7 +1585,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
 'recentchanges' => 'Tuoreet muutokset',
 'recentchanges-legend' => 'Tuoreiden muutosten asetukset',
-'recentchangestext' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
+'recentchanges-summary' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
 'recentchanges-feed-description' => 'Tällä sivulla voi seurata tuoreita {{GRAMMAR:illative|{{SITENAME}}}} tehtyjä muutoksia.',
 'recentchanges-label-newpage' => 'Tämä muutos loi uuden sivun',
 'recentchanges-label-minor' => 'Tämä on pieni muutos',
@@ -1597,6 +1615,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'newsectionsummary' => '/* $1 */ uusi osio',
 'rc-enhanced-expand' => 'Näytä yksityiskohdat (JavaScript)',
 'rc-enhanced-hide' => 'Piilota yksityiskohdat',
+'rc-old-title' => 'alun perin luotu nimellä "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Linkitettyjen sivujen muutokset',
@@ -1743,6 +1762,7 @@ $1',
 'upload-too-many-redirects' => 'URL sisälsi liian monta ohjausta',
 'upload-unknown-size' => 'Tuntematon koko',
 'upload-http-error' => 'HTTP-virhe: $1',
+'upload-copy-upload-invalid-domain' => 'Tiedostojen tallentamista tästä verkko-osoitteesta ei ole sallittu.',
 
 # File backend
 'backend-fail-stream' => 'Tiedoston $1 virtauttaminen epäonnistui.',
@@ -1761,6 +1781,10 @@ $1',
 'backend-fail-closetemp' => 'Väliaikaista tiedostoa ei voitu sulkea.',
 'backend-fail-read' => 'Tiedostoa $1 ei voitu lukea.',
 'backend-fail-create' => 'Tiedostoa $1 ei voitu luoda.',
+'backend-fail-maxsize' => 'Tiedostoa $1 ei voitu luoda, koska se on suurempi kuin {{PLURAL:$2|yksi tavu|$2 tavua}}.',
+'backend-fail-connect' => 'Varastojärjestelmään "$1" ei saada yhteyttä.',
+'backend-fail-contenttype' => 'Tiedostoa ei voitu tallentaa kohteeseen $1, koska tiedostomuotoa ei voitu määrittää.',
+'backend-fail-usable' => 'Ei voitu luoda tiedostoa $1, koska käyttöoikeudet eivät riittäneet tai hakemisto puuttuu.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.',
@@ -1878,6 +1902,10 @@ Seuraava lista näyttää {{PLURAL:$1|ensimmäisen linkittävän sivun|$1 ensimm
 Katso [$2 tiedoston kuvaussivulta] lisätietoja.',
 'sharedupload-desc-here' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä.
 Tiedot [$2 tiedoston kuvaussivulta] näkyvät alla.',
+'sharedupload-desc-edit' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä. 
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
+'sharedupload-desc-create' => 'Tämä tiedosto on jaettu kohteesta $1 ja muut projektit saattavat käyttää sitä. 
+Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'filepage-nofile' => 'Tämän nimistä tiedostoa ei ole olemassa.',
 'filepage-nofile-link' => 'Tämän nimistä tiedostoa ei ole olemassa, mutta voit [$1 tallentaa sen].',
 'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
@@ -2007,6 +2035,8 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'wantedpages' => 'Halutut sivut',
 'wantedpages-badtitle' => 'Virheellinen otsikko tuloksissa: $1',
 'wantedfiles' => 'Halutut tiedostot',
+'wantedfiletext-cat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del>. Lisäksi sellaiset sivut, joihin on sisällytetty tiedostoja, jotka eivät ole olemassa, on luetteloitu [[:$1|täällä]].',
+'wantedfiletext-nocat' => 'Seuraavia tiedostoja käytetään, mutta niitä ei ole olemassa. Ulkopuolissa mediavarastoissa olevat tiedostot voivat näkyä tällä listalla, vaikka ne ovat olemassa. Tällaiset väärät merkinnät on <del>yliviivattu</del.>',
 'wantedtemplates' => 'Halutut mallineet',
 'mostlinked' => 'Viitatuimmat sivut',
 'mostlinkedcategories' => 'Viitatuimmat luokat',
@@ -2024,7 +2054,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'protectedpages-indef' => 'Vain ikuisesti suojatut',
 'protectedpages-cascade' => 'Vain laajennetusti suojatut',
 'protectedpagestext' => 'Seuraavat sivut ovat suojattuja siirtämiseltä tai muutoksilta',
-'protectedpagesempty' => 'Ei suojattu sivuja.',
+'protectedpagesempty' => 'Mitään sivuja ei ole tällä hetkellä suojattu näillä asetuksilla.',
 'protectedtitles' => 'Suojatut sivunimet',
 'protectedtitlestext' => 'Seuraavien sivujen luonti on estetty.',
 'protectedtitlesempty' => 'Ei suojattuja sivunimiä näillä hakuehdoilla.',
@@ -2067,6 +2097,7 @@ Huomaa, että muut verkkosivut saattavat viitata tiedostoon suoran URL:n avulla,
 Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.',
 'logempty' => 'Ei tapahtumia lokissa.',
 'log-title-wildcard' => 'Kohde alkaa merkkijonolla',
+'showhideselectedlogentries' => 'Näytä tai piilota valitut lokimerkinnät',
 
 # Special:AllPages
 'allpages' => 'Kaikki sivut',
@@ -2084,6 +2115,12 @@ Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muut
 'allpagesprefix' => 'Katkaisuhaku',
 'allpagesbadtitle' => 'Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.',
 'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimiavaruutta ”$1”.',
+'allpages-hide-redirects' => 'Piilota ohjaussivut',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Katselet arkistoitua versiota tästä sivusta, joka voi olla jopa $1 vanha.',
+'cachedspecial-viewing-cached-ts' => 'Katselet arkistoitua versiota tästä sivusta, joka ei välttämättä ole sivun viimeisin versio.',
+'cachedspecial-refresh-now' => 'Näytä uusin versio.',
 
 # Special:Categories
 'categories' => 'Luokat',
@@ -2203,7 +2240,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}}.',
@@ -2218,7 +2255,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',
@@ -2368,16 +2405,18 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 
 # Undelete
 'undelete' => 'Palauta poistettuja sivuja',
-'undeletepage' => 'Poistettujen sivujen selaus',
+'undeletepage' => 'Katsele ja palauta poistettuja sivuja',
 'undeletepagetitle' => "'''Poistetut versiot sivusta [[:$1]]'''.",
 'viewdeletedpage' => 'Poistettujen sivujen selaus',
 'undeletepagetext' => '{{PLURAL:$1|Seuraava sivu|Seuraavat sivut}} on poistettu, mutta {{PLURAL:$1|se löytyy|ne löytyvät}} vielä arkistosta, joten {{PLURAL:$1|se on|ne ovat}} palautettavissa. Arkisto saatetaan tyhjentää aika ajoin.',
 'undelete-fieldset-title' => 'Palauta versiot',
-'undeleteextrahelp' => "Palauttaaksesi sivun koko muutoshistorian, jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.
-Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
+'undeleteextrahelp' => "Palauttaaksesi sivun koko muutoshistorian jätä kaikki valintalaatikot tyhjiksi ja napsauta '''''{{int:undeletebtn}}'''''.
+Voit palauttaa versioita valikoivasti valitsemalla vain niiden versioiden valintalaatikot, jotka haluat palauttaa.",
 'undeleterevisions' => '{{PLURAL:$1|Versio|$1 versiota}} arkistoitu.',
 'undeletehistory' => 'Jos palautat sivun, kaikki versiot lisätään sivun historiaan. Jos uusi sivu samalla nimellä on luotu poistamisen jälkeen, palautetut versiot lisätään sen historiaan.',
-'undeleterevdel' => 'Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain poistettu. Tässä tilanteessa poista uusimman poistettavan version piilotus. Tiedostoversioita, joihin sinulla ei ole katseluoikeutta ei palauteta.',
+'undeleterevdel' => "Palautusta ei tehdä, jos sen seurauksena sivun uusin versio olisi osittain piilotettu. 
+Tässä tilanteessa älä valitse palautettavaksi näkyviin viimeisintä poistettua versiota tai poista version piilotus.<br />
+Tiedostoversioita, joihin sinulla ei ole katseluoikeutta (''häivytetyt versiot''), ei palauteta.",
 'undeletehistorynoadmin' => 'Tämä sivu on poistettu. Syy sivun poistamiseen näkyy yhteenvedossa, jossa on myös tiedot, ketkä ovat muokanneet tätä sivua ennen poistamista. Sivujen varsinainen sisältö on vain ylläpitäjien luettavissa.',
 'undelete-revision' => 'Poistettu sivu $1 hetkellä $4 kello $5. Tekijä: $3.',
 'undeleterevision-missing' => 'Virheellinen tai puuttuva versio. Se on saatettu palauttaa tai poistaa arkistosta.',
@@ -2391,7 +2430,7 @@ Voit palauttaa versiota valikoivasti valitsemalla vain niiden versioiden valinta
 'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
 'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
 'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
-'cannotundelete' => 'Palauttaminen epäonnistui.',
+'cannotundelete' => 'Palauttaminen epäonnistui; joku muu on voinut jo palauttaa sivun.',
 'undeletedpage' => "'''$1 on palautettu.'''
 
 [[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
@@ -2504,7 +2543,7 @@ Alla on viimeisin estolokin tapahtuma:',
 'badipaddress' => 'IP-osoite on väärin muotoiltu.',
 'blockipsuccesssub' => 'Esto onnistui',
 'blockipsuccesstext' => 'Käyttäjä tai IP-osoite [[Special:Contributions/$1|$1]] on estetty.<br />
-Nykyiset estot löytyvät [[Special:BlockList|estolistalta]].',
+Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'ipb-blockingself' => 'Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?',
 'ipb-confirmhideuser' => 'Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa.  Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa.  Oletko varma, että haluat tehdä näin?',
 'ipb-edit-dropdown' => 'Muokkaa estosyitä',
@@ -2557,7 +2596,7 @@ Alla on ote estolokista.',
 Alla on ote häivytyslokista.',
 'blocklogentry' => 'esti käyttäjän tai IP-osoitteen [[$1]]. Eston kesto $2 $3',
 'reblock-logentry' => 'muutti käyttäjän tai IP-osoitteen [[$1]] eston asetuksia. Eston kesto $2 $3',
-'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi listan tällä hetkellä voimassa olevista estoista.',
+'blocklogtext' => 'Tämä on loki muokkausestoista ja niiden purkamisista. Automaattisesti estettyjä IP-osoitteita ei kirjata. Tutustu [[Special:BlockList|estolistaan]] nähdäksesi luettelon tällä hetkellä voimassa olevista estoista.',
 'unblocklogentry' => 'poisti käyttäjältä $1 muokkauseston',
 'block-log-flags-anononly' => 'vain kirjautumattomat käyttäjät estetty',
 'block-log-flags-nocreate' => 'tunnusten luonti estetty',
@@ -2785,6 +2824,9 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'import-invalid-interwiki' => 'Määritellystä wikistä ei voi tuoda.',
 'import-error-edit' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta muokata sitä.',
 'import-error-create' => 'Sivua $1 ei tuotu, koska sinulla ei ole oikeutta luoda sitä.',
+'import-error-interwiki' => 'Sivua $1 ei voitu tuoda, koska sen nimi on varattu ulkoisen linkittämisen (interwiki).',
+'import-error-special' => 'Sivua $1 ei tuoda, koska se kuuluu nimitilaan, joka ei salli sivuja.',
+'import-error-invalid' => 'Sivua $1 ei tuoda, koska sen nimi ei kelpaa.',
 
 # Import log
 'importlogpage' => 'Tuontiloki',
@@ -2796,7 +2838,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptin testaus',
-'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä.',
+'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä tässä wikissä.',
 'javascripttest-title' => 'Suoritetaan $1-testejä.',
 'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
 'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
@@ -2865,6 +2907,7 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'tooltip-diff' => 'Näytä tehdyt muutokset',
 'tooltip-compareselectedversions' => 'Vertaile valittuja versioita',
 'tooltip-watch' => 'Lisää tämä sivu tarkkailulistaan',
+'tooltip-watchlistedit-normal-submit' => 'Poista sivut',
 'tooltip-watchlistedit-raw-submit' => 'Päivitä tarkkailulista',
 'tooltip-recreate' => 'Luo sivu uudelleen',
 'tooltip-upload' => 'Aloita tallennus',
@@ -3635,6 +3678,9 @@ Sinun olisi pitänyt saada [{{SERVER}}{{SCRIPTPATH}}/COPYING kopio GNU General P
 'version-software' => 'Asennettu ohjelmisto',
 'version-software-product' => 'Tuote',
 'version-software-version' => 'Versio',
+'version-entrypoints' => 'Aloituskohtien URL-osoitteet',
+'version-entrypoints-header-entrypoint' => 'Aloituskohta',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Tiedoston osoite',
@@ -3793,6 +3839,7 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-duplicate-archive-popup-title' => 'Tiedostolla on {{PLURAL:$1|poistettu kaksoiskappale|poistettuja kaksoiskappaleita}}',
 'api-error-duplicate-popup-title' => 'Tiedoston {{PLURAL:$1|kaksoiskappale|kaksoiskappaleet}}',
 'api-error-empty-file' => 'Määrittämäsi tiedosto on tyhjä.',
+'api-error-emptypage' => 'Ei ole sallittua luoda uutta, tyhjää sivua.',
 'api-error-fetchfileerror' => 'Sisäinen virhe: jotakin meni pieleen tiedoston haussa.',
 'api-error-file-too-large' => 'Määrittämäsi tiedosto on liian iso.',
 'api-error-filename-tooshort' => 'Tiedoston nimi on liian lyhyt.',
@@ -3821,4 +3868,15 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'api-error-uploaddisabled' => 'Tiedostojen tallentaminen ei ole käytössä.',
 'api-error-verification-error' => 'Tiedosto voi olla vioittunut, tai sillä saattaa olla väärä tiedostopääte.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunti|sekuntia}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuutti|minuuttia}}',
+'duration-hours' => '$1 {{PLURAL:$1|tunti|tuntia}}',
+'duration-days' => '$1 {{PLURAL:$1|päivä|päivää}}',
+'duration-weeks' => '$1 {{PLURAL:$1|viikko|viikkoa}}',
+'duration-years' => '$1 {{PLURAL:$1|vuosi|vuotta}}',
+'duration-decades' => '$1 {{PLURAL:$1|vuosikymmen|vuosikymmentä}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vuosisata|vuosisataa}}',
+'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
+
 );
diff --git a/languages/messages/MessagesFit.php b/languages/messages/MessagesFit.php
new file mode 100644 (file)
index 0000000..a20078a
--- /dev/null
@@ -0,0 +1,714 @@
+<?php
+/** meänkieli (meänkieli)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Kaganer
+ * @author Mestos
+ */
+
+$fallback = 'fi';
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Linkitten alleviivaus',
+'tog-justify' => 'Tassaa kappalheet',
+'tog-hideminor' => 'Piilota pienet muutokset vereksen muutoksitten listasta',
+'tog-hidepatrolled' => 'Piilota tarkastetut muutokset vereksen muutoksitten listasta',
+'tog-newpageshidepatrolled' => 'Piilota tarkastetut sivut uusitten sivuitten listalta',
+'tog-extendwatchlist' => 'Laajena valvontalistaa näyttämhään kaikki tehtyt muutokset eikä vain viimisimät.',
+'tog-usenewrc' => 'Käytä avanseerattu verekset muutokset (vaatii JavaScript)',
+'tog-numberheadings' => 'Nymreeraa rypriikit',
+'tog-showtoolbar' => 'Näytä työneuvopalkki (JavaScript)',
+'tog-editondblclick' => 'Mookkaa sivuja kaksoisknapituksella (JavaScript)',
+'tog-editsection' => 'Aktiveeraa seksuuni mookkaus [mookkaus]-linkilä',
+'tog-editsectiononrightclick' => 'Aktiveeraa seksuuni mookkaus oikeapuolen klikkauksella seksuuni tittelhiin (JavaScript)',
+'tog-showtoc' => 'Näytä sisältölista (sivuile, joila on yli 3 rypriikkiä)',
+'tog-rememberpassword' => 'Muista minun lokkauksen tässä weppilukijassa (eninthään $1 {{PLURAL:$1|päivä|päivää}})',
+'tog-watchcreations' => 'Lissää sivut mitä luon valvontasivule',
+'tog-watchdefault' => 'Lissää sivut mitä mie mookkaan valvontasivule',
+'tog-watchmoves' => 'Lissää sivut mitä mie siirän minun valvontasivule',
+'tog-watchdeletion' => 'Lissää sivut mitä otan poies valvontasivule',
+'tog-minordefault' => 'Markeeraa auttomaattisesti kaikki muutokset pieneks',
+'tog-previewontop' => 'Näytä esitarkastelu mookkauspaikan yläpuolela',
+'tog-previewonfirst' => 'Näytä esitarkastelu kun mookkaus alethaan',
+'tog-nocache' => 'Älä säästä sivuja weppilukijan välimuisthiin',
+'tog-enotifwatchlistpages' => 'Lähätä e-postipreivi mulle kun sivu minun valvontalistala on muutettu',
+'tog-enotifusertalkpages' => 'Lähätä sähköposti, kun käyttäjäsivun keskustelusivu muuttuu',
+'tog-enotifminoredits' => 'Lähätä epostieto pienistäki muutoksista',
+'tog-enotifrevealaddr' => 'Näytä minun eposti atressin muile lähetetyissä ilmoituksissa',
+'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
+'tog-oldsig' => 'Nykynen allekirjotus',
+'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
+'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
+
+# Dates
+'sunday' => 'pyhä',
+'monday' => 'maanantai',
+'tuesday' => 'tiistai',
+'wednesday' => 'keskiviikko',
+'thursday' => 'tuorestai',
+'friday' => 'perjantai',
+'saturday' => 'lauantai',
+'sun' => 'py',
+'mon' => 'ma',
+'tue' => 'ti',
+'wed' => 'ke',
+'thu' => 'tuo',
+'fri' => 'pe',
+'sat' => 'la',
+'january' => 'tammikuu',
+'february' => 'helmikuu',
+'march' => 'maaliskuu',
+'april' => 'huhtikuu',
+'may_long' => 'toukokuu',
+'june' => 'kesäkuu',
+'july' => 'heinäkuu',
+'august' => 'elokuu',
+'september' => 'syyskuu',
+'october' => 'lokakuu',
+'november' => 'marraskuu',
+'december' => 'joulukuu',
+'january-gen' => 'tammikuun',
+'february-gen' => 'helmikuun',
+'march-gen' => 'maaliskuun',
+'april-gen' => 'huhtikuun',
+'may-gen' => 'toukokuun',
+'june-gen' => 'kesäkuun',
+'july-gen' => 'heinäkuun',
+'august-gen' => 'elokuun',
+'september-gen' => 'syyskuun',
+'october-gen' => 'lokakuun',
+'november-gen' => 'marraskuun',
+'december-gen' => 'joulukuun',
+'jan' => 'tammikuu',
+'feb' => 'helmikuu',
+'mar' => 'maaliskuu',
+'apr' => 'huhtikuu',
+'may' => 'toukokuu',
+'jun' => 'kesäkuu',
+'jul' => 'heinäkuu',
+'aug' => 'elokuu',
+'sep' => 'syyskuu',
+'oct' => 'lokakuu',
+'nov' => 'marraskuu',
+'dec' => 'joulukuu',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Katekuurit|Katekuurit}}',
+'category_header' => 'Sivut, jokka on katekuurissa "$1"',
+'subcategories' => 'Alakatekuurit',
+'category-media-header' => 'Katekuurin ”$1” sisältämät fiilit',
+'category-empty' => "''Tässä katekuuriassa ei ole sivuja eikä fiiliä.''",
+'hidden-categories' => '{{PLURAL:$1|Piilotettu katekuuri|Piilotetut katekuurit}}',
+'category-subcat-count' => '{{PLURAL:$2|Tässä katekuurissa on vain seuraava alakatekuuri.|{{PLURAL:$1|Seuraava alakatekuuri kuuluu|Seuraavat $1 alakatekuuria kuuluvat}} tähhään katekuurihaan. Alakatekuuritten kokonaismäärä katekuurissa on $2.}}',
+'category-article-count' => '{{PLURAL:$2|Tässä katekuurissa on vain seuraava sivu.|Seuraava {{PLURAL:$1|sivu on|$1 sivut on}} tässä katekuurissa, kahen joukosta $2 }}',
+'category-file-count' => '{{PLURAL:$2|Tässä katekuurissa on vain seuraava sivu.|Seuraava {{PLURAL:$1|fiili|$1 fiilit}} (kaikkians $2) on tässä katekuurissa.}}',
+'listingcontinuesabbrev' => 'jatkuu',
+'noindex-category' => 'Ei-indekseerattuja sivuja',
+
+'about' => 'Tietoja',
+'newwindow' => '(aukasee uuessa klasissa)',
+'cancel' => 'Lopeta',
+'mytalk' => 'Minun keskustelu',
+'navigation' => 'Navikeerinki',
+
+# Cologne Blue skin
+'qbedit' => 'Mookkaa',
+'qbpageoptions' => 'Tämä sivu',
+'qbpageinfo' => 'Sisältö',
+'qbmyoptions' => 'Minun inställninkit',
+'qbspecialpages' => 'Spesiaali sivut',
+'faq' => 'Useasti kysytyt kysymykset',
+'faqpage' => 'Project:Useasti kysytyt kysymykset',
+
+# Vector skin
+'vector-action-addsection' => 'Lissää aine',
+'vector-action-delete' => 'Ota poies',
+'vector-action-move' => 'Siirä',
+'vector-action-protect' => 'Suojaa',
+'vector-action-undelete' => 'Pane takashiin',
+'vector-action-unprotect' => 'Muuta suojaa',
+'vector-simplesearch-preference' => 'Ota käythöön paranetut hakuehotukset (vain Vector-ulkoasu)',
+'vector-view-create' => 'Luo',
+'vector-view-edit' => 'Mookkaa',
+'vector-view-history' => 'Näytä histuuria',
+'vector-view-view' => 'Lue',
+'vector-view-viewsource' => 'Näytä lähekooti',
+'actions' => 'Toiminat',
+'namespaces' => 'Nimityhjyyet',
+'variants' => 'Varianttia',
+
+'errorpagetitle' => 'Virhe',
+'returnto' => 'Takashiin sivule $1.',
+'tagline' => 'Asiasta {{SITENAME}}',
+'help' => 'Apua',
+'search' => 'Haku',
+'searchbutton' => 'Hae',
+'searcharticle' => 'Mene',
+'history' => 'Sivun histuuria',
+'history_short' => 'Histuuria',
+'printableversion' => 'Printtausmaholinen versuuni',
+'permalink' => 'Ikunen linkki',
+'edit' => 'Mookkaa',
+'create' => 'Luo sivu',
+'delete' => 'Ota poies',
+'protect' => 'Suojaa',
+'protect_change' => 'muuta',
+'newpage' => 'Uusi sivu',
+'talkpagelinktext' => 'Keskustelu',
+'personaltools' => 'Henkilökohtaiset työneuvot',
+'talk' => 'Keskustelu',
+'views' => 'Näyttöjä',
+'toolbox' => 'Työneuvot',
+'otherlanguages' => 'Muila kielilä',
+'redirectedfrom' => '(Ohjattu sivulta $1)',
+'lastmodifiedat' => 'Sivua on viimeksi muutettu $1 kello $2.',
+'jumpto' => 'Hyppää:',
+'jumptonavigation' => 'Navikeerinki',
+'jumptosearch' => 'Hae',
+
+# 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' => 'Asiasta {{GRAMMAR:elative|{{SITENAME}}}}',
+'aboutpage' => 'Project: Tioista',
+'copyrightpage' => '{{ns:project}}:Tekijänoikeuet',
+'currentevents' => 'Vereksiä tapahtumia',
+'currentevents-url' => 'Project: Vereksiä tapahtumia',
+'disclaimers' => 'Vastuuvaphaus',
+'disclaimerpage' => 'Project: Ylheinen varoitus',
+'edithelp' => 'Mookkausapua',
+'edithelppage' => 'Help: Kuinka sivuja mookathaan',
+'helppage' => 'Help: Sisältö',
+'mainpage' => 'Alkusivu',
+'mainpage-description' => 'Alkusivu',
+'portal' => 'Kaikitten purthaali',
+'portal-url' => 'Project: Kaikitten purthaali',
+'privacy' => 'Tietosuojakäytäntö',
+'privacypage' => 'Project: Intekriteettisääntö',
+
+'retrievedfrom' => 'Nouettu osoitheesta $1',
+'youhavenewmessages' => 'Sulla on $1 ($2).',
+'newmessageslink' => 'uusia meiliä',
+'newmessagesdifflink' => 'viiminen muutos',
+'editsection' => 'mookkaa',
+'editold' => 'mookkaa',
+'viewsourceold' => 'näytä lähekooti',
+'editlink' => 'mookkaa',
+'viewsourcelink' => 'näytä lähekooti',
+'editsectionhint' => 'Mookkaa seksuunia $1',
+'toc' => 'Sisältö',
+'site-atom-feed' => '$1-Atom-syöttö',
+'page-atom-feed' => '$1 (Atom-syöttö)',
+'red-link-title' => '$1 (sivua ei ole)',
+
+# Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Sivu',
+'nstab-user' => 'Käyttäjäsivu',
+'nstab-special' => 'Spesiaali sivut',
+'nstab-project' => 'Prujektisivu',
+'nstab-image' => 'Fiili',
+'nstab-template' => 'Malli',
+'nstab-category' => 'Katekuuri',
+
+# General errors
+'missing-article' => 'Sivun sisältöä ei löytyny taattapaasista: $1 $2.
+
+Useimiten tämä johtuu vanhentuneesta vertailu- tai histuuriasivulinkistä poistethuun sivhuun.
+
+Jos kysheessä ei ole poistettu sivu, olet piian löytäny virheen ohjelmassa.
+Ilmota tämän sivun atressi wikin [[Special:ListUsers/sysop|atministratöörile]].',
+'missingarticle-rev' => '(versuuni: $1)',
+'badtitle' => 'Virheelinen titteli',
+'badtitletext' => 'Pyytämästi sivurypriikki oli virheelinen, tyhjä eli titteli on väärin linkitetty muusta wikistä. Se saattaa sisältää yhen eli monta sympoolia, joita ei saa käyttää sivutittelissä.',
+'viewsource' => 'Näytä lähekooti',
+
+# Login and logout pages
+'yourname' => 'Käyttäjänimi',
+'yourpassword' => 'Salasana',
+'yourpasswordagain' => 'Salasana uuesti',
+'remembermypassword' => 'Muista minun lokkauksen tässä taattorissa (korkeinthaans $1 {{PLURAL:$1|päivä|päivää}})',
+'login' => 'Lokkaa sisäle',
+'nav-login-createaccount' => 'Lokkaa sisäle / luo konttu',
+'loginprompt' => 'Lokkauksheen tähhään {{SITENAME}} tarvithaan ette olet aktiveeranu kuukit .',
+'userlogin' => 'Lokkaa sisäle/ luo konttu',
+'userlogout' => 'Lokkaa ulos',
+'nologin' => "Eikos sulla ole käyttäjäkonttua, '''$1'''.",
+'nologinlink' => 'Luo käyttäjäkonttu',
+'createaccount' => 'Luo käyttäjäkonttu',
+'gotaccount' => "Jos sulla on käyttäjäkonttu,  voit '''$1'''.",
+'gotaccountlink' => 'Lokkaa sisäle',
+'userlogin-resetlink' => 'Unhoutitko sinun salasanan?',
+'mailmypassword' => 'Lähätä e-postissa uusi salasana',
+'loginlanguagelabel' => 'Kieli: $1',
+
+# Edit page toolbar
+'bold_sample' => 'Lihava teksti',
+'bold_tip' => 'Lihava teksti',
+'italic_sample' => 'Kyrsiveerattu teksti',
+'italic_tip' => 'Kyrsiveerattu',
+'link_sample' => 'linkin nimi',
+'link_tip' => 'Sisäinen linkki',
+'extlink_sample' => 'http://www.example.com linkin rypriikki',
+'extlink_tip' => 'Eksterni linkki (muista http:// eessä)',
+'headline_sample' => 'Rypriikkiteksti',
+'headline_tip' => 'Aste 2 rypriikki',
+'nowiki_sample' => 'Lissää muotoilematon teksti tähhään',
+'nowiki_tip' => 'Iknureeraa wiki formateerinkin',
+'image_tip' => 'Piilotettu fiili',
+'media_tip' => 'Linkki fiilhiin',
+'sig_tip' => 'Allekirjotus aikaleimala',
+'hr_tip' => 'Horisontaali linja (käytethään säästävästi)',
+
+# Edit pages
+'summary' => 'Yhteenveto',
+'minoredit' => 'Tämä on pieni muutos',
+'watchthis' => 'Valvo tätä sivua',
+'savearticle' => 'Säästä sivu',
+'preview' => 'Etukätheen katto',
+'showpreview' => 'Näytä esikuvvaus',
+'showdiff' => 'Näytä muutokset',
+'anoneditwarning' => "'''Varotus:''' Et ole lokanu sisäle.
+IP-atressi säästethään tämän sivun muutoshistuuriassa.",
+'newarticle' => '(Uusi)',
+'newarticletext' => 'Linkki vei sinun sivule, joka ei vielä ole.
+Saatat luoa sivun kirjottamalla alla olehvaan kenthään (katto [[{{MediaWiki:Helppage}}|apusivu]] lisää tietoja).
+Jos et halua luoa sivua, käytä browserin "takashiin" knappia.',
+'noarticletext' => 'Tällä hetkellä tällä sivulla ei ole tekstiä.
+Tällä hetkelä tällä sivula ei ole tekstiä.
+Saatat [[Special:Search/{{PAGENAME}}|hakea sivun nimelä]] muilta sivuilta,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheesheen liittyviä lokkia]
+eli [{{fullurl:{{FULLPAGENAME}}|action=edit}} mookata tätä sivua]</span>.',
+'noarticletext-nopermission' => 'Tällä hetkelä tällä sivula ei ole tekstiä.
+Saatat [[Special:Search/{{PAGENAME}}|hakea sivun nimelä]] muilta sivuilta,
+eli <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea relevantista lokista]
+eli [{{fullurl:{{FULLPAGENAME}}|action=edit}} mookata tätä sivua]</span>.',
+'previewnote' => "'''Tämä on vasta sivun etukattelu. Sivua ei ole vielä säästetty!'''",
+'editing' => 'Mookathaan sivua $1',
+'editingsection' => 'Mookathaan $1 (seksuuni)',
+'templatesused' => 'Tällä sivula {{PLURAL:$1|käytetty malli|käytetyt mallit}}:',
+'template-protected' => '(suojattu)',
+'template-semiprotected' => '(osittain suojattu)',
+'hiddencategories' => 'Tämä sivu kuuluu {{PLURAL:$1|seuraavhaan piilotethuun katekuurihaan|seuraavhiin piilotethuin katekuurhiin}}:',
+'permissionserrorstext-withaction' => 'Sulla ei ole luppaa {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}} johtuen:',
+'recreate-moveddeleted-warn' => "''Varotus: Olet luomassa sivua, joka on vasta otettu poies.'''",
+'moveddeleted-notice' => 'Tämä sivu on otettu poies. Alla on tämän sivun poistotieto ja lokkaushistuuria referensinä',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Varotus: Tämä sivu sisältää liian suurta mallikootia.
+Joitakin mallia ei tulta säästämhään.',
+'post-expand-template-inclusion-category' => 'Sivut missä mallikootin sisältö on liian suuri',
+'post-expand-template-argument-warning' => 'Varotus: Tällä sivula on ainaki yks malliparameetteri, jonka koko on liian suuri ekspansuunissa.
+Nämät parameetterit on poistettu.',
+'post-expand-template-argument-category' => 'Sivut missä on poistettuja malliparameetteria',
+
+# History pages
+'viewpagelogs' => 'Näytä tämän sivun lokit',
+'currentrev-asof' => 'Nykynen versuuni $1',
+'revisionasof' => 'Versuuni $1',
+'revision-info' => 'Versuuni hetkelä $1 – tehny $2',
+'previousrevision' => 'Vanheempi versuuni',
+'nextrevision' => 'Uuempi versuuni',
+'currentrevisionlink' => 'Nykynen versuuni',
+'cur' => 'nyk.',
+'last' => 'eel.',
+'histlegend' => 'Eron valinta: markkeeraa klikkiruuissa ette pääset vertaamhaan versuunia, ja paina enter eli knaphiin kaikhiin alla. 
+Merkinät: (nyk.) = eroavaisuuet nykyisheen versuunhiin, (eel.) = eroavaisuuet eelisheen versuunhiin, <span class="minor">p</span> = pieni muutos',
+'history-fieldset-title' => 'Plaavaa muutoshistuuriaa',
+'history-show-deleted' => 'Vain poistetut',
+'histfirst' => 'Ensimäiset',
+'histlast' => 'Viimisimät',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 ($2)',
+
+# Revision deletion
+'rev-delundel' => 'näytä/piilota',
+'revdel-restore' => 'muuta näkyvyyttä',
+'revdel-restore-deleted' => 'poistetut muutokset',
+'revdel-restore-visible' => 'Näkyvät muutokset',
+
+# Merge log
+'revertmerge' => 'Pane takashiin yhistäminen',
+
+# Diffs
+'history-title' => 'Sivun $1 muutoshistuuria',
+'lineno' => 'Rivi $1:',
+'compareselectedversions' => 'Vertaile valittuja sivu versuunia',
+'editundo' => 'kumota',
+'diff-multi' => '(Näytetyitten versuunitten välissä on {{PLURAL:$1|yks mookkaus|$1 versuunit, jokka on {{PLURAL:$2|yhen käyttäjän tekemiä|$2 eri käyttäjän tekemiä}}}}.)',
+
+# Search results
+'searchresults' => 'Hakutulokset',
+'searchresults-title' => 'Hakutulokset hakusanale ”$1”',
+'prevn' => 'eelinen {{PLURAL:$1|$1}}',
+'nextn' => '{{PLURAL:$1|seuraava|$1 seuraavaa}} →',
+'prevn-title' => 'eelinen$1 {{PLURAL:$1|resyltaatit|resyltaatit}}',
+'nextn-title' => 'eelinen$1 {{PLURAL:$1|resyltaatit|resyltaatit}}',
+'shown-title' => 'Näytä $1 {{PLURAL:$1|resyltaatti|resyltaatti}} sivu sivulta',
+'viewprevnext' => 'Näytä ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Sivu [[:$1]] löytyy tästä wikistä.'''",
+'searchmenu-new' => "'''Luo sivu ''[[:$1]]'' tähhaän wikhiin.'''",
+'searchprofile-articles' => 'Sisältösivut',
+'searchprofile-project' => 'Apu ja prujektisivut',
+'searchprofile-images' => 'Mylttimeetia',
+'searchprofile-everything' => 'Kaikki',
+'searchprofile-advanced' => 'Avanseerattu',
+'searchprofile-articles-tooltip' => 'Hae nimityhjyyestä $1',
+'searchprofile-project-tooltip' => 'Hae nimityhjyyestä $1',
+'searchprofile-images-tooltip' => 'Hae fiiliä',
+'searchprofile-everything-tooltip' => 'Hae kaikesta (keskustelusivut kans)',
+'searchprofile-advanced-tooltip' => 'Hae tietyissä nimityhjyissä',
+'search-result-size' => '$1 ({{PLURAL:$2|1 sana|$2 sannaa}})',
+'search-result-category-size' => '{{PLURAL:$1|1 jäsen|$1 jäsentä}} ({{PLURAL:$2|1 alakatekuuria|$2 alakatekuuriaa}}, {{PLURAL:$3|1 fiili|$3 fiiliä}})',
+'search-redirect' => '(ohjaus $1)',
+'search-section' => '(seksuuni $1)',
+'search-suggest' => 'Tarkoititko: $1',
+'searchrelated' => 'relateerattu',
+'searchall' => 'kaikki',
+'showingresultsheader' => "{{PLURAL:$5|Resyltaatit'''$1'''–'''$3'''|Resyltaatit'''$1'''–'''$2''' kaiken joukosta '''$3''' }} haule '''$4'''",
+'search-nonefound' => 'Ei yhtään resyltaattia sinun kysymyksheen',
+
+# Preferences page
+'mypreferences' => 'Omat inställninkit',
+'youremail' => 'E-posti:',
+'yourrealname' => 'Oikea nimi',
+'prefs-help-email' => 'E-postin atressi on vapa, mutta tekkee maholiseks ette lähättää sulle salasanan meilissä, jos unhoutat sen.',
+'prefs-help-email-others' => 'Saatat kans antaa muitten käyttäjitten ottaa ottaa yhteyttä sinhuun sähköpostila. Sin atressi ei näy toisen käyttäjän ottaessa sinhuun yhteyttä.',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'mookkaa tätä sivua',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1|muutos|muutosta}}',
+'recentchanges' => 'Verekset muutokset',
+'recentchanges-legend' => 'Vereksitten muutoksitten inställninkit',
+'recentchanges-summary' => 'Seuraa viimiset muutokset wikin tällä sivula',
+'recentchanges-feed-description' => 'Tällä sivula saatat seurata wikin vereksiä muutoksia',
+'recentchanges-label-newpage' => 'Tämä mookkaus loi uuen sivun',
+'recentchanges-label-minor' => 'Tämä on pieni muutos',
+'recentchanges-label-bot' => 'Tämän muutoksen teki botti',
+'recentchanges-label-unpatrolled' => 'Tätä muutosta ei ole vielä tarkistettu',
+'rcnote' => 'Alla on {{PLURAL:$1|yks muutos|$1 vereksimät muutokset}} {{PLURAL:$2|yhen päivän|$2 viimi päivän}} ajalta $4 kello $5 asti.',
+'rcnotefrom' => "Alla on muutokset '''$2'''lähtien. (korkeinthaans '''$1''' näytethään).",
+'rclistfrom' => 'Näytä uuet muutokset jälkhiin $1',
+'rcshowhideminor' => '$1 pienet muutokset',
+'rcshowhidebots' => '$1 ropootit',
+'rcshowhideliu' => '
+$1 sisäle lokaattuja käyttäjiä',
+'rcshowhideanons' => '$1 anonyymit käyttäjät',
+'rcshowhidepatr' => '$1 tarkistetut muutokset',
+'rcshowhidemine' => '$1 omat muutokset',
+'rclinks' => 'Näytä $1 verestä muutosta viimisitten $2 päivitten aikana.<br />$3',
+'diff' => 'ero',
+'hist' => 'histuuria',
+'hide' => 'Piilota',
+'show' => 'Näytä',
+'minoreditletter' => 'p',
+'newpageletter' => 'U',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Näytä detaljit (JavaScript)',
+'rc-enhanced-hide' => 'Piilota detaljit',
+
+# Recent changes linked
+'recentchangeslinked' => 'Relateerattuja muutoksia',
+'recentchangeslinked-toolbox' => 'Relateerattuja muutoksia',
+'recentchangeslinked-title' => 'Muutokset relatterattuja "$1"',
+'recentchangeslinked-noresult' => 'Ei muutoksia linkathuin sivhuin annetulla aikakauela',
+'recentchangeslinked-summary' => 'Tämä on lista vereksistä muutoksista sivhuin, joihin on linkattu erikoiselta sivulta. Sivut sinun  [[Special:Watchlist|valvontalistala]] on markeerattu lihavala tyylilä',
+'recentchangeslinked-page' => 'Sivun nimi',
+'recentchangeslinked-to' => 'Näytä muutokset sivhuin, jolla sen eestä on linkki annethuun sivhuun',
+
+# Upload
+'upload' => 'Lattaa ylös fiili',
+'uploadlogpage' => 'Ylöslattauksen loki',
+'filedesc' => 'Yhteenveto',
+'uploadedimage' => 'lattasi ylös [[$1]]',
+
+'license' => 'Lisensi',
+'license-header' => 'Lisensi',
+
+# File description page
+'file-anchor-link' => 'Fiili',
+'filehist' => 'Fiilin histuuria',
+'filehist-help' => 'Klikkaa taattymia/aikaa niin näet fiilin kuinka se oli siihen aikhaan',
+'filehist-revert' => 'pane takashiin',
+'filehist-current' => 'nykynen',
+'filehist-datetime' => 'Päivä/Aika',
+'filehist-thumb' => 'Peukalokuva',
+'filehist-thumbtext' => 'Peukalokuva säästetystä versuunista  $1',
+'filehist-user' => 'Käyttäjä',
+'filehist-dimensions' => 'Timensuunit',
+'filehist-comment' => 'Komentti',
+'imagelinks' => 'Fiilin käyttö',
+'linkstoimage' => 'Seuraava {{PLURAL:$1|sivu |$1 sivut }} länkkaavat tähhään fiilhiin:',
+'nolinkstoimage' => 'Ei ole yhtään sivua joka linkkaa tähhään fiilhiin.',
+'sharedupload-desc-here' => 'Tämä fiili on jaettu kohtheesta $1 ja muut prujektit saattavat käyttää sitä.
+Tiot [$2 fiilin kuvvaussivulta] näkyvät tässä alla.',
+
+# Random page
+'randompage' => 'Satunhainen sivu',
+
+# Statistics
+'statistics' => 'Statistiikkaa',
+
+'disambiguationspage' => 'Template:Haarainsivu',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|tavu|tavua}}',
+'nmembers' => '$1 {{PLURAL:$1|jäsen|jäsentä}}',
+'prefixindex' => 'Kaikki sivut prefiksilä',
+'usercreated' => 'Luottu $1 $2',
+'newpages' => 'Uuet sivut',
+'move' => 'Siirä',
+'pager-newer-n' => '← {{PLURAL:$1|1 uuempi|$1 uuempaa}}',
+'pager-older-n' => '{{PLURAL:$1|1 vanheempi|$1 vanheempaa}} →',
+
+# Book sources
+'booksources' => 'Kirjalähteet',
+'booksources-search-legend' => 'Hae kirjalähtheitä',
+'booksources-go' => 'Mene',
+
+# Special:Log
+'log' => 'Lokit',
+
+# Special:AllPages
+'allpages' => 'Kaikki sivut',
+'alphaindexline' => '$1…$2',
+'allarticles' => 'Kaikki sivut',
+'allpagessubmit' => 'Mene',
+
+# Special:Categories
+'categories' => 'Katekuurit',
+
+# Special:LinkSearch
+'linksearch-line' => '$1 on linkattu sivulta $2',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Uuitten käyttäjitten loki',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(jäsenlista)',
+
+# E-mail user
+'emailuser' => 'Lähätä e-posti tälle käyttäjälle',
+
+# Watchlist
+'watchlist' => 'Valvontalista',
+'mywatchlist' => 'Minun valvontasivu',
+'watchlistfor2' => 'Käyttäjälle $1 $2',
+'watch' => 'Valvo',
+'unwatch' => 'Lopeta valvonta',
+'watchlist-details' => 'Valvontalistala on {{PLURAL:$1|$1 sivu|$1 sivua}} (keskustelusivuja mukhaan laskematta)',
+'wlshowlast' => 'Näytä viimiset $1 tiimat eli $2 päivät$3',
+'watchlist-options' => 'Valvontalistan altternatiivit',
+
+# Delete
+'actioncomplete' => 'Tehty',
+'actionfailed' => 'Tehty epäonnistui',
+'dellogpage' => 'Poistoloki',
+
+# Rollback
+'rollbacklink' => 'rullaa takashiin',
+
+# Protect
+'protectlogpage' => 'Suojausloki',
+'protectedarticle' => 'suojasi sivun [[$1]]',
+
+# Undelete
+'undeletelink' => 'näytä/ota takashiin',
+'undeleteviewlink' => 'näytä',
+
+# Namespace form on various pages
+'namespace' => 'Nimityhjyys:',
+'invert' => 'Jätä pois valinta',
+'blanknamespace' => '(Päätyhjyys)',
+
+# Contributions
+'contributions' => 'Omat mookkaukset',
+'contributions-title' => 'Käyttäjän $1 mookkaukset',
+'mycontris' => 'Omat mookkaukset',
+'contribsub2' => 'Käyttäjän $1 ($2) mookkaukset',
+'uctop' => '(viiminen)',
+'month' => 'Kuukauesta (ja aiemin)',
+'year' => 'Vuoesta (ja aiemin)',
+
+'sp-contributions-newbies' => 'Näytä uusitten tulokhaitten muutokset',
+'sp-contributions-blocklog' => 'blokeerinkiloki',
+'sp-contributions-uploads' => 'Ylöslattauksia',
+'sp-contributions-logs' => 'lokit',
+'sp-contributions-talk' => 'keskustelu',
+'sp-contributions-search' => 'Hae käyttäjitten bitraakia',
+'sp-contributions-username' => 'IP-atressi eli käyttäjänimi',
+'sp-contributions-toponly' => 'Näytä vain mookkaukset, jokka on vasta tehtyjä versuunia',
+'sp-contributions-submit' => 'Hae',
+
+# What links here
+'whatlinkshere' => 'Mitä linkkaa tänne',
+'whatlinkshere-title' => 'Sivut jokka länkathaan "$1"',
+'whatlinkshere-page' => 'Sivu',
+'linkshere' => 'Seuraavila sivuila on linkki sivule <strong>[[:$1]]</strong>:',
+'nolinkshere' => "Sivule \"'[[:\$1]]''' ei ole linkkiä.",
+'isredirect' => 'ohjaussivu',
+'istemplate' => 'sisäletty mallina',
+'isimage' => 'linkki fiilhiin',
+'whatlinkshere-prev' => '← {{PLURAL:$1|eelinen sivu|$1 eelistä sivua}}',
+'whatlinkshere-next' => '{{PLURAL:$1|seuraava sivu|$1 seuraava sivu}} →',
+'whatlinkshere-links' => 'linkit',
+'whatlinkshere-hideredirs' => '$1 ohjaukset',
+'whatlinkshere-hidetrans' => '$1 mallin inklyteerinkiä',
+'whatlinkshere-hidelinks' => '$1 linkit',
+'whatlinkshere-hideimages' => '$1 fiililinkit',
+'whatlinkshere-filters' => 'Filtterit',
+
+# Block/unblock
+'ipboptions' => '2 tiimaa:2 hours,1 päivä:1 day,3 päivää:3 days,1 viikko:1 week,2 viikkoa:2 weeks,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year,ikunen:infinite',
+'ipblocklist' => 'Plokeeratut käyttäjät',
+'blocklink' => 'blokeeraa',
+'unblocklink' => 'ota poies blokeerinki',
+'change-blocklink' => 'muuta blokeerinki',
+'contribslink' => 'mookkaukset',
+'blocklogpage' => 'Blokeerinki lokkaus',
+'blocklogentry' => 'blokeerattu [[$1]] blokeerausaika $2 $3',
+'block-log-flags-nocreate' => 'toppaa kontturejistreerinkiä',
+
+# Move page
+'movelogpage' => 'Siirtoloki',
+'revertmove' => 'siirä takashiin',
+
+# Export
+'export' => 'Eksporteeraa sivuja',
+
+# Namespace 8 related
+'allmessagesname' => 'Nimi',
+'allmessagesdefault' => 'Stantartiteksti',
+
+# Thumbnails
+'thumbnail-more' => 'Isona',
+'thumbnail_error' => 'Pienoiskuvan luominen epäonnistui: $1',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Oma käyttäjäsivu',
+'tooltip-pt-mytalk' => 'Oma keskustelusivu',
+'tooltip-pt-preferences' => 'Omat inställninkit',
+'tooltip-pt-watchlist' => 'Lista sivuista, joitten mookkauksia valvot',
+'tooltip-pt-mycontris' => 'Lista omista mookkauksista',
+'tooltip-pt-login' => 'Lokkaa mielelhään sisäle, mutta ei ole pakko',
+'tooltip-pt-logout' => 'Lokkaa ulos',
+'tooltip-ca-talk' => 'Keskustelu sisälöstä',
+'tooltip-ca-edit' => 'Voit mookata tätä sivua, mutta käytä esitarkastusknappia ennen kun säästät',
+'tooltip-ca-addsection' => 'Alota keskustelu uuesta asiasta',
+'tooltip-ca-viewsource' => 'Tämä sivu on suojattu. Saatat nähhä lähekootin',
+'tooltip-ca-history' => 'Sivun aiemat versuunit',
+'tooltip-ca-protect' => 'Suojaa tämä sivu',
+'tooltip-ca-delete' => 'Ota poies tämä sivu',
+'tooltip-ca-move' => 'Siirä tämä sivu',
+'tooltip-ca-watch' => 'Lissää tämä sivu sinun valvontalistale',
+'tooltip-ca-unwatch' => 'Ota poies tämä sivu sinun valvontalistasta',
+'tooltip-search' => 'Hae {{GRAMMAR:elative|{{SITENAME}}}}',
+'tooltip-search-go' => 'Siiry sivule joka on justhiins tällä nimelä',
+'tooltip-search-fulltext' => 'Hae sivuja tälle tekstile',
+'tooltip-p-logo' => 'Alkusivu',
+'tooltip-n-mainpage' => 'Mene alkusivule',
+'tooltip-n-mainpage-description' => 'Mene alkusivule',
+'tooltip-n-portal' => 'Keskustelua projektista',
+'tooltip-n-currentevents' => 'Löyä taustatietoja vereksistä tapahtumisista',
+'tooltip-n-recentchanges' => 'Lista vereksistä muutoksista',
+'tooltip-n-randompage' => 'Aukase satunhaisen sivun',
+'tooltip-n-help' => 'Apua ja informasuunia',
+'tooltip-t-whatlinkshere' => 'Lista wikisivuista jokka on länkattu tänne',
+'tooltip-t-recentchangeslinked' => 'Verekset mookkaukset sivuissa, jokka on länkattu tästä sivusta',
+'tooltip-feed-atom' => 'Atom-syöte tälle sivule',
+'tooltip-t-contributions' => 'Näytä lista tämän käyttäjän mookkauksista',
+'tooltip-t-emailuser' => 'Lähätä sähköposti tälle käyttäjälle',
+'tooltip-t-upload' => 'Lattaa ylös fiiliä',
+'tooltip-t-specialpages' => 'Lista kaikista spesiaalisivuista',
+'tooltip-t-print' => 'Printtausmaholinen versuuni',
+'tooltip-t-permalink' => 'Ikunen linkki tämän sivun  versuunhiin',
+'tooltip-ca-nstab-main' => 'Näytä sisältösivu',
+'tooltip-ca-nstab-user' => 'Näytä käyttäjäsivu',
+'tooltip-ca-nstab-special' => 'Tämä on spesiaalisivu; sie et saata mookata itteä sivua',
+'tooltip-ca-nstab-project' => 'Näytä prujektisivu',
+'tooltip-ca-nstab-image' => 'Näytä fiilisivu',
+'tooltip-ca-nstab-template' => 'Näytä mallia',
+'tooltip-ca-nstab-category' => 'Näytä katekuurisivu',
+'tooltip-minoredit' => 'Merkitte tämä pieneksi muutokseksi',
+'tooltip-save' => 'Säästä mookkaukset',
+'tooltip-preview' => 'Esikuvvaa sinun muutokset, käytä tätä ennen kun säästät',
+'tooltip-diff' => 'Näytä sinun muutokset tekstistä',
+'tooltip-compareselectedversions' => 'Vertaile valitut sivuversuunit',
+'tooltip-watch' => 'Lissää tämä sivu sinun valvontalistale',
+'tooltip-rollback' => '"Rullaa takashiin" kaataa yhelä klikilä viimisen mookkaajan muutokset',
+'tooltip-undo' => '"Kumota" palauttaa tämän muutoksen ja aukasee artikkelin mookkausruutun esitarkastuksen kansa. Antaa maholisuuen kirjottaa mutiveerinkin mookkaajan yhteenvethoon',
+'tooltip-summary' => 'Kirjota lyhy yhteenveto',
+
+# Browsing diffs
+'previousdiff' => 'Vanheempi muutos',
+'nextdiff' => 'Uuempi muutos',
+
+# Media information
+'file-info-size' => '$1 × $2 pikseliä, fiilin koko: $3, MIME-tyyppi: $4',
+'file-nohires' => 'Tarkempaa kuvvaa ei ole saatavissa.',
+'svg-long-desc' => 'SVG-fiili; peruskoko $1 × $2 pikseliä, fiilikoko: $3',
+'show-big-image' => 'Korkearesulusuuni versuuni',
+
+# Bad image list
+'bad_image_list' => 'Listan muoto on seuraava:
+
+Vain *-merkilä alkavat rivit otethaan huomihoon.
+Rivin ensimäinen linkki häätyy mennä kehnoon fiilhiin.
+Kaikki muut linkit samala rivilä.käsitelthään poikkeuksena, eli toisin sanoen sivuja missä fiilin saapi käyttää.',
+
+# Metadata
+'metadata' => 'Meettataatta',
+'metadata-help' => 'Tämä fiili sisältää lisätietoja esimerkiks kuvanlukijan, eli kuvakäsittelyprukrammin lisätietoja. Kaikki tiot ei en´nää välttämättä vastaa toelisuutheen, jos kuvvaa on mookattu sen alkuperäisen luomisen jälkhiin.',
+'metadata-fields' => 'Seuraavaa meettataatta kentät listattu tässä informasuunissa, sisälethään näkyvänä kuvasivussa, kun meettataatta taulukko kolapsaa. Muut piilotethaan stantartina.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# External editor support
+'edit-externally' => 'Mookkaa tätä fiiliä käyttämällä eksterniä aplikasuunia',
+'edit-externally-help' => '(Katto [//www.mediawiki.org/wiki/Manual:External_editors ohjeet], jos haluat lissää tietoja.)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'kaikki',
+'namespacesall' => 'kaikki',
+'monthsall' => 'kaikki',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Näytä muutokset',
+'watchlisttools-edit' => 'Näytä ja mookkaa valvontalistaa',
+'watchlisttools-raw' => 'Mookkaa valvontalistaa raakamuoossa',
+
+# Core parser functions
+'duplicate-defaultsort' => 'Varotus: Stantartisortteerausavvain ”$2” korvaa aieman stantartisortteerausavvaimen”$1”.',
+
+# Special:SpecialPages
+'specialpages' => 'Spesiaali sivut',
+
+# External image whitelist
+'external_image_whitelist' => '#Älä muuta tätä riviä ollenkhaan.<pre>
+#Kirjota rekyljääri frakmentitten meininkit (vain osa, joka mennee //-merkkitten välhiin) tähhään alle
+#Niitä verrathaan ulkoisitten (suoralinkitetyitten) kuvitten URLhin
+#Net jokka sopivat, näytethään kuvina, muuten kuvhiin näytethään vain linkit
+#Rivit, jokka alkavat #-merkilä on komentaaria
+#Tämä on riippumaton puukstavitten kokosta',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Merkki]] filtteri:',
+
+);
index 0e6080f..e50f273 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Faroese (Føroyskt)
+/** Faroese (føroyskt)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -974,7 +974,6 @@ Hon kann ikki fjalast.',
 
 # Diffs
 'history-title' => 'Versjónssøgan hjá "$1"',
-'difference' => '(Munur millum endurskoðanir)',
 'difference-multipage' => '(Munur millum síður)',
 'lineno' => 'Linja $1:',
 'compareselectedversions' => 'Bera saman valdar útgávur',
@@ -1248,7 +1247,7 @@ Tín t-post adressa verður ikki avdúkað, tá aðrir brúkarir seta seg í sam
 'nchanges' => '$1 {{PLURAL:$1|broyting|broytingar}}',
 'recentchanges' => 'Seinastu broytingar',
 'recentchanges-legend' => 'Nýligar broytingar møguleikar',
-'recentchangestext' => 'Á hesi síðu kanst tú fylgja teimum nýggjastu broytingunum á hesi wiki.',
+'recentchanges-summary' => 'Á hesi síðu kanst tú fylgja teimum nýggjastu broytingunum á hesi wiki.',
 'recentchanges-feed-description' => "Við hesum feed'inum kanst tú fylgja teimum seinastu broytingunum á hesi wiki'ini.",
 'recentchanges-label-newpage' => 'Henda rætting upprættaði eina nýggja síðu',
 'recentchanges-label-minor' => 'Hetta er ein lítil rætting',
index 6c85fa8..75da985 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** French (Français)
+/** French (français)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Tpt
  * @author Urhixidur
  * @author Verdy p
+ * @author WikiEoFrEn
  * @author Wyz
  * @author Yumeki
  * @author Zebulon84
  * @author Zetud
+ * @author Zolo
  * @author Горан Анђелковић
  * @author לערי ריינהארט
  */
@@ -263,6 +265,7 @@ $magicWords = array(
        'staticredirect'          => array( '1', '__REDIRECTIONSTATIQUE__', '__STATICREDIRECT__' ),
        'protectionlevel'         => array( '1', 'NIVEAUDEPROTECTION', 'PROTECTIONLEVEL' ),
        'url_path'                => array( '0', 'CHEMIN', 'PATH' ),
+       'url_query'               => array( '0', 'QUESTION', 'QUERY' ),
 );
 
 $specialPageAliases = array(
@@ -364,16 +367,16 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Souligner les liens :',
 'tog-justify' => 'Justifier les paragraphes',
-'tog-hideminor' => 'Masquer les modifications mineures parmi les modifications récentes',
-'tog-hidepatrolled' => 'Masquer les modifications surveillées parmi les modifications récentes',
+'tog-hideminor' => 'Masquer les modifications mineures dans les modifications récentes',
+'tog-hidepatrolled' => 'Masquer les modifications surveillées dans les modifications récentes',
 'tog-newpageshidepatrolled' => 'Masquer les pages surveillées parmi les nouvelles pages',
 'tog-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et non seulement les plus récentes',
-'tog-usenewrc' => 'Utiliser les modifications récentes améliorées (nécessite JavaScript)',
+'tog-usenewrc' => 'Grouper les changements dans les modifications récentes et la liste de suivi (nécessite JavaScript)',
 'tog-numberheadings' => 'Numéroter automatiquement les titres de section',
-'tog-showtoolbar' => 'Montrer la barre de menu de modification (nécessite JavaScript)',
-'tog-editondblclick' => 'Double-cliquer permet de modifier une page (nécessite JavaScript)',
+'tog-showtoolbar' => "Montrer la barre d'outils de modification (nécessite JavaScript)",
+'tog-editondblclick' => 'Modifier des pages sur double-clic (nécessite JavaScript)',
 'tog-editsection' => 'Activer les modifications de sections grâce aux liens « [modifier] »',
-'tog-editsectiononrightclick' => 'Un clic droit sur un titre de section permet de modifier celle-ci (nécessite JavaScript)',
+'tog-editsectiononrightclick' => 'Activer la modification de sections par clic droit sur leurs titres (nécessite JavaScript)',
 'tog-showtoc' => 'Afficher la table des matières (pour les pages ayant plus de 3 sections)',
 'tog-rememberpassword' => 'Se souvenir de mon identification avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
 'tog-watchcreations' => 'Ajouter les pages que je crée à ma liste de suivi',
@@ -384,18 +387,18 @@ $messages = array(
 'tog-previewontop' => 'Afficher la prévisualisation au-dessus de la zone de modification',
 'tog-previewonfirst' => 'Afficher la prévisualisation lors de la première modification',
 'tog-nocache' => 'Désactiver le cache des pages par le navigateur',
-'tog-enotifwatchlistpages' => "M'avertir par courriel lorsqu'une page de ma liste de suivi est modifiée",
-'tog-enotifusertalkpages' => "M'avertir par courriel si ma page de discussion est modifiée",
+'tog-enotifwatchlistpages' => 'M’avertir par courriel lorsqu’une page de ma liste de suivi est modifiée',
+'tog-enotifusertalkpages' => 'M’avertir par courriel si ma page de discussion est modifiée',
 'tog-enotifminoredits' => "M'avertir par courriel même en cas de modifications mineures des pages",
 'tog-enotifrevealaddr' => 'Afficher mon adresse de courriel dans les courriels de notification',
-'tog-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent cette page",
+'tog-shownumberswatching' => 'Afficher le nombre d’utilisateurs qui suivent cette page',
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
-'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
+'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
+'tog-externaldiff' => 'Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
-'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
-'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
+'tog-uselivepreview' => 'Utiliser l’aperçu rapide (nécessite JavaScript) (expérimental)',
+'tog-forceeditsummary' => 'M’avertir lorsque je n’ai pas spécifié de résumé de modification',
 'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
 'tog-watchlisthidebots' => 'Masquer les modifications faites par des robots dans la liste de suivi',
 'tog-watchlisthideminor' => 'Masquer les modifications mineures dans la liste de suivi',
@@ -403,18 +406,18 @@ $messages = array(
 'tog-watchlisthideanons' => 'Masquer les modifications anonymes dans la liste de suivi',
 'tog-watchlisthidepatrolled' => 'Masquer les modifications surveillées dans la liste de suivi',
 'tog-nolangconversion' => 'Désactiver la conversion des variantes linguistiques',
-'tog-ccmeonemails' => "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
+'tog-ccmeonemails' => 'M’envoyer une copie des courriels que j’envoie aux autres utilisateurs',
 'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
-'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
+'tog-norollbackdiff' => 'Ne pas afficher le diff lors d’une révocation',
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
 'underline-default' => 'Valeur par défaut du navigateur',
 
 # Font style option in Special:Preferences
-'editfont-style' => "Style de police de la zone d'édition :",
+'editfont-style' => 'Style de police de la zone d’édition :',
 'editfont-default' => 'Celui par défaut du navigateur',
 'editfont-monospace' => 'Police de chasse fixe',
 'editfont-sansserif' => 'Police sans empattement',
@@ -460,7 +463,7 @@ $messages = array(
 'november-gen' => 'novembre',
 'december-gen' => 'décembre',
 'jan' => 'janv',
-'feb' => 'févr',
+'feb' => 'fév',
 'mar' => 'mars',
 'apr' => 'avr',
 'may' => 'mai',
@@ -523,7 +526,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Activer les suggestions de recherche améliorées (seulement pour Vector)',
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Modifier',
-'vector-view-history' => "Afficher l'historique",
+'vector-view-history' => 'Afficher l’historique',
 'vector-view-view' => 'Lire',
 'vector-view-viewsource' => 'Voir la source',
 'actions' => 'Actions',
@@ -532,7 +535,7 @@ $messages = array(
 
 'errorpagetitle' => 'Erreur',
 'returnto' => 'Revenir à la page $1.',
-'tagline' => 'De {{SITENAME}}.',
+'tagline' => 'De {{SITENAME}}',
 'help' => 'Aide',
 'search' => 'Rechercher',
 'searchbutton' => 'Rechercher',
@@ -573,7 +576,7 @@ $messages = array(
 'imagepage' => 'Voir la page du fichier',
 'mediawikipage' => 'Voir la page du message',
 'templatepage' => 'Voir la page du modèle',
-'viewhelppage' => "Voir la page d'aide",
+'viewhelppage' => 'Voir la page d’aide',
 'categorypage' => 'Voir la page de catégorie',
 'viewtalkpage' => 'Page de discussion',
 'otherlanguages' => 'Autres langues',
@@ -585,12 +588,12 @@ $messages = array(
 'jumpto' => 'Aller à :',
 'jumptonavigation' => 'Navigation',
 'jumptosearch' => 'rechercher',
-'view-pool-error' => "Désolé, les serveurs sont surchargés en ce moment.
-Trop d'utilisateurs cherchent à consulter cette page.
-Veuillez attendre un moment avant de retenter l'accès à cette page.
+'view-pool-error' => 'Désolé, les serveurs sont surchargés en ce moment.
+Trop dutilisateurs cherchent à consulter cette page.
+Veuillez attendre un moment avant de retenter laccès à cette page.
 
-$1",
-'pool-timeout' => "Délai dépassé durant l'attente du verrou",
+$1',
+'pool-timeout' => 'Délai dépassé durant l’attente du verrou',
 'pool-queuefull' => 'La file de travail est pleine',
 'pool-errorunknown' => 'Erreur inconnue',
 
@@ -615,8 +618,8 @@ $1",
 'privacypage' => 'Project:Confidentialité',
 
 'badaccess' => 'Erreur de permission',
-'badaccess-group0' => "Vous n'avez pas les droits suffisants pour réaliser l'action demandée.",
-'badaccess-groups' => "L'action que vous essayez de réaliser n'est accessible qu'aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.",
+'badaccess-group0' => 'Vous n’avez pas les droits suffisants pour réaliser l’action demandée.',
+'badaccess-groups' => 'L’action que vous essayez de réaliser n’est accessible qu’aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.',
 
 'versionrequired' => 'Version $1 de MediaWiki nécessaire',
 'versionrequiredtext' => 'La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]]',
@@ -641,7 +644,7 @@ $1",
 'thisisdeleted' => 'Désirez-vous afficher ou restaurer $1 ?',
 'viewdeleted' => 'Voir $1 ?',
 'restorelink' => '{{PLURAL:$1|la modification effacée|les $1 modifications effacées}}',
-'feedlinks' => 'Flux',
+'feedlinks' => 'Flux :',
 'feed-invalid' => 'Type de flux invalide.',
 'feed-unavailable' => 'Les flux de syndication ne sont pas disponibles',
 'site-rss-feed' => 'Flux RSS de $1',
@@ -666,61 +669,61 @@ $1",
 
 # Main script and global functions
 'nosuchaction' => 'Action inconnue',
-'nosuchactiontext' => "L'action spécifiée dans l'URL est invalide.
-Vous avez peut-être mal entré l'URL ou suivi un lien erroné.
-Il peut également s'agir d'un bogue dans le logiciel utilisé par {{SITENAME}}.",
+'nosuchactiontext' => 'L’action spécifiée dans l’URL est invalide.
+Vous avez peut-être mal entré lURL ou suivi un lien erroné.
+Il peut également s’agir d’un bogue dans le logiciel utilisé par {{SITENAME}}.',
 'nosuchspecialpage' => 'Page spéciale inexistante',
-'nospecialpagetext' => "<strong>Vous avez demandé une page spéciale qui n'existe pas.</strong>
+'nospecialpagetext' => '<strong>Vous avez demandé une page spéciale qui n’existe pas.</strong>
 
-Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].",
+Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Erreur',
 'databaseerror' => 'Erreur de la base de données',
-'dberrortext' => "Une erreur de syntaxe de la requête dans la base de données est survenue.
+'dberrortext' => 'Une erreur de syntaxe de la requête dans la base de données est survenue.
 Ceci peut indiquer un bogue dans le logiciel.
 La dernière requête traitée par la base de données était :
 <blockquote><tt>$1</tt></blockquote>
 depuis la fonction « <tt>$2</tt> ».
-La base de données a renvoyé l'erreur « <tt>$3 : $4</tt> ».",
-'dberrortextcl' => "Une requête dans la base de données comporte une erreur de syntaxe.
+La base de données a renvoyé l’erreur « <tt>$3 : $4</tt> ».',
+'dberrortextcl' => 'Une requête dans la base de données comporte une erreur de syntaxe.
 La dernière requête émise était :
 « $1 »
 dans la fonction « $2 ».
-La base de données a renvoyé l'erreur « $3 : $4 ».",
+La base de données a renvoyé l’erreur « $3 : $4 ».',
 'laggedslavemode' => 'Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées',
 'readonly' => 'Base de données verrouillée',
-'enterlockreason' => "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
-'readonlytext' => "Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l'ordre.
+'enterlockreason' => 'Indiquez la raison du verrouillage ainsi qu’une estimation de sa durée',
+'readonlytext' => 'Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l’ordre.
 
-L'administrateur ayant verrouillé la base de données a fourni l'explication suivante :<br />$1",
-'missing-article' => "La base de données n'a pas trouvé le texte d'une page qu'elle aurait dû trouver, intitulée « $1 » $2.
+L’administrateur ayant verrouillé la base de données a fourni l’explication suivante :<br />$1',
+'missing-article' => "La base de données n’a pas trouvé le texte d'une page qu’elle aurait dû trouver, intitulée « $1 » $2.
 
-Généralement, cela survient en suivant un lien vers un diff périmé ou vers l'historique d'une page supprimée.
+Généralement, cela survient en suivant un lien vers un diff périmé ou vers lhistorique d'une page supprimée.
 
-Si ce n'est pas le cas, il peut s'agir d'un bogue dans le programme.
-Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l'URL du lien.",
+Si ce n’est pas le cas, il peut s’agir d'un bogue dans le programme.
+Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer lURL du lien.",
 'missingarticle-rev' => '(numéro de version : $1)',
 'missingarticle-diff' => '(diff : $1, $2)',
 'readonly_lag' => 'La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.',
 'internalerror' => 'Erreur interne',
 'internalerror_info' => 'Erreur interne : $1',
-'fileappenderrorread' => "Impossible de lire « $1 » lors de l'insertion",
-'fileappenderror' => "Impossible d'ajouter « $1 » à « $2 ».",
+'fileappenderrorread' => 'Impossible de lire « $1 » lors de l’insertion',
+'fileappenderror' => 'Impossible d’ajouter « $1 » à « $2 ».',
 'filecopyerror' => 'Impossible de copier le fichier « $1 » vers « $2 ».',
 'filerenameerror' => 'Impossible de renommer le fichier « $1 » en « $2 ».',
 'filedeleteerror' => 'Impossible de supprimer le fichier « $1 ».',
 'directorycreateerror' => 'Impossible de créer le dossier « $1 ».',
 'filenotfound' => 'Impossible de trouver le fichier « $1 ».',
-'fileexistserror' => "Impossible d'écrire dans le dossier « $1 » : le fichier existe",
+'fileexistserror' => 'Impossible d’écrire le fichier « $1 » : le fichier existe.',
 'unexpected' => 'Valeur inattendue : « $1 » = « $2 ».',
-'formerror' => 'Erreur : Impossible de soumettre le formulaire',
+'formerror' => 'Erreur : Impossible de soumettre le formulaire.',
 'badarticleerror' => 'Cette action ne peut pas être effectuée sur cette page.',
-'cannotdelete' => "Impossible de supprimer la page ou le fichier « $1 ».
-La suppression a peut-être déjà été effectuée par quelqu'un d'autre.",
+'cannotdelete' => 'Impossible de supprimer la page ou le fichier « $1 ».
+La suppression a peut-être déjà été effectuée par quelqu’un d’autre.',
 'cannotdelete-title' => 'Impossible de supprimer la page « $1 »',
 'badtitle' => 'Mauvais titre',
-'badtitletext' => "Le titre de la page demandée est invalide, vide, ou il s'agit d'un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.",
+'badtitletext' => 'Le titre de la page demandée est invalide, vide, ou il s’agit d’un titre inter-langue ou inter-projet mal lié. Il contient peut-être un ou plusieurs caractères qui ne peuvent pas être utilisés dans les titres.',
 'perfcached' => 'Les données suivantes sont en cache et peuvent ne pas être à jour. Un maximum de {{PLURAL:$1|un résultat|$1 résultats}} est disponible dans le cache.',
 'perfcachedts' => 'Les données suivantes sont en cache et ont été mises à jour pour la dernière fois à $1. Un maximum de {{PLURAL:$4|un résultat|$4 résultats}} est disponible dans le cache.',
 'querypage-no-updates' => 'Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.',
@@ -730,25 +733,29 @@ Requête : $2',
 'viewsource' => 'Voir le texte source',
 'viewsource-title' => 'Voir la source de $1',
 'actionthrottled' => 'Action limitée',
-'actionthrottledtext' => "Pour lutter contre les pourriels, l'utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s'avère que vous avez dépassé cette limite.
-Essayez à nouveau dans quelques minutes.",
+'actionthrottledtext' => 'Pour lutter contre les pourriels, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.
+Essayez à nouveau dans quelques minutes.',
 'protectedpagetext' => 'Cette page a été protégée pour empêcher sa modification.',
 'viewsourcetext' => 'Vous pouvez voir et copier le contenu de la page :',
 'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
-'protectedinterface' => "Cette page fournit du texte d'interface pour le logiciel et est protégée pour éviter les abus.",
-'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l'interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d'internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
+'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel et est protégée pour éviter les abus.',
+'editinginterface' => "'''Attention :''' vous êtes en train de modifier une page utilisée pour créer le texte de l’interface du logiciel. Les changements se répercuteront, selon le contexte, sur toutes ou certaines pages visibles par les autres utilisateurs. Pour les traductions, nous vous invitons à utiliser le projet MediaWiki d’internationalisation des messages [//translatewiki.net/wiki/Main_Page?setlang=fr translatewiki.net].",
 'sqlhidden' => '(Requête SQL cachée)',
-'cascadeprotected' => "Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée :
-$2",
-'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
-'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
-'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
+$2',
+'namespaceprotected' => "Vous n’avez pas la permission de modifier les pages de l’espace de noms « '''$1''' ».",
+'customcssprotected' => 'Vous n’avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d’un autre utilisateur.',
+'customjsprotected' => 'Vous n’avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d’un autre utilisateur.',
 'ns-specialprotected' => 'Les pages dans l’espace de noms « {{ns:special}} » ne peuvent pas être modifiées.',
 'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
 Le motif avancé est « ''$2'' ».",
-'filereadonlyerror' => 'Impossible de modifier le fichier "$1" parce que le répertoire de fichiers "$2" est en lecture seule.
+'filereadonlyerror' => 'Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
 
-L\'administrateur qui l\'a verrouillé a fourni ce motif: "$3".',
+L’administrateur qui l’a verrouillé a fourni ce motif: « $3 ».',
+'invalidtitle-knownnamespace' => 'Titre invalide avec l’espace de noms « $2 » et l’intitulé « $3 »',
+'invalidtitle-unknownnamespace' => 'Titre invalide avec le numéro d’espace de noms $1 et l’intitulé « $2 » inconnus',
+'exception-nologin' => 'Non connecté',
+'exception-nologin-text' => "Cette page ou cette action nécessite d'être connecté sur ce wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Mauvaise configuration : scanneur de virus inconnu : ''$1''",
@@ -760,17 +767,17 @@ L\'administrateur qui l\'a verrouillé a fourni ce motif: "$3".',
 
 Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, [[Special:UserLogin|vous reconnecter]] sous le même nom ou un autre.
 Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu’à ce que vous effaciez le cache de votre navigateur.",
-'welcomecreation' => "== Bienvenue, $1 ! ==
+'welcomecreation' => '== Bienvenue, $1 ! ==
 
 Votre compte a été créé.
-N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].",
-'yourname' => "Nom d'utilisateur :",
+N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].',
+'yourname' => 'Nom d’utilisateur :',
 'yourpassword' => 'Mot de passe :',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
 'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1 {{PLURAL:$1|jour|jours}})',
 'securelogin-stick-https' => 'Rester connecté en HTTPS après la connexion',
-'yourdomainname' => 'Votre domaine',
-'externaldberror' => "Une erreur s'est produite avec la base de données d'authentification externe, ou bien vous n'êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.",
+'yourdomainname' => 'Votre domaine :',
+'externaldberror' => 'Une erreur s’est produite avec la base de données d’authentification externe, ou bien vous n’êtes pas autorisé{{GENDER:||e|(e)}} à mettre à jour votre compte externe.',
 'login' => 'Connexion',
 'nav-login-createaccount' => 'Créer un compte ou se connecter',
 'loginprompt' => "Vous devez activer les témoins (''cookies'') pour vous connecter à {{SITENAME}}.",
@@ -779,7 +786,7 @@ N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SIT
 'logout' => 'Se déconnecter',
 'userlogout' => 'Déconnexion',
 'notloggedin' => 'Non connecté',
-'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
+'nologin' => 'Vous n’êtes pas encore inscrit ? $1.',
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
@@ -788,46 +795,46 @@ N'oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SIT
 'createaccountmail' => 'par courriel',
 'createaccountreason' => 'Motif :',
 'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
-'userexists' => "Nom d'utilisateur entré déjà utilisé.
-Veuillez choisir un nom différent.",
+'userexists' => 'Nom d’utilisateur entré déjà utilisé.
+Veuillez choisir un nom différent.',
 'loginerror' => 'Erreur de connexion',
 'createaccounterror' => 'Impossible de créer le compte : $1',
-'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
+'nocookiesnew' => "Le compte utilisateur a été créé, mais vous nêtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
 'nocookieslogin' => "{{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.",
-'nocookiesfornew' => "Le compte utilisateur n'a pas été créé, car nous n'avons pas pu identifier son origine.
-Vérifiez que vous avez activé les cookies, rechargez la page et rééssayez.",
-'noname' => "Vous n'avez pas saisi un nom d'utilisateur valide.",
+'nocookiesfornew' => 'Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.
+Vérifiez que vous avez activé les cookies, rechargez la page et réessayez.',
+'noname' => 'Vous n’avez pas saisi un nom d’utilisateur valide.',
 'loginsuccesstitle' => 'Connexion réussie',
 'loginsuccess' => 'Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».',
-'nosuchuser' => "L'utilisateur « $1 » n'existe pas.
-Les noms d'utilisateurs sont sensibles à la casse.
-Vérifiez l'orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
-'nosuchusershort' => "Il n'y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l'orthographe.",
-'nouserspecified' => "Vous devez saisir un nom d'utilisateur.",
+'nosuchuser' => 'L’utilisateur « $1 » n’existe pas.
+Les noms dutilisateurs sont sensibles à la casse.
+Vérifiez l’orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].',
+'nosuchusershort' => 'Il n’y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l’orthographe.',
+'nouserspecified' => 'Vous devez saisir un nom d’utilisateur.',
 'login-userblocked' => 'Cet utilisateur est bloqué. Connexion non autorisée.',
 'wrongpassword' => 'Le mot de passe est incorrect. Veuillez essayer à nouveau.',
-'wrongpasswordempty' => "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
+'wrongpasswordempty' => 'Vous n’avez pas entré de mot de passe. Veuillez essayer à nouveau.',
 'passwordtooshort' => 'Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.',
-'password-name-match' => "Votre mot de passe doit être différent de votre nom d'utilisateur.",
-'password-login-forbidden' => "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
+'password-name-match' => 'Votre mot de passe doit être différent de votre nom d’utilisateur.',
+'password-login-forbidden' => "Lutilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
 'mailmypassword' => 'Recevoir un nouveau mot de passe par courriel',
 'passwordremindertitle' => 'Nouveau mot de passe temporaire pour {{SITENAME}}',
-'passwordremindertext' => "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de
+'passwordremindertext' => 'Quelqu’un (probablement vous, ayant l’adresse IP $1) a demandé un nouveau mot de
 passe pour {{SITENAME}} ($4 ). Un mot de passe temporaire a été créé pour
-l'utilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
+lutilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
 vous connecter et choisir un nouveau mot de passe.
 Votre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.
 
-Si vous n'êtes pas l'auteur de cette demande, ou si vous vous souvenez à présent
+Si vous n’êtes pas l’auteur de cette demande, ou si vous vous souvenez à présent
 de votre ancien mot de passe et que vous ne souhaitez plus en changer, vous
-pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
-'noemail' => "Aucune adresse de courriel n'a été enregistrée pour l'utilisateur « $1 ».",
+pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
+'noemail' => "Aucune adresse de courriel na été enregistrée pour l'utilisateur « $1 ».",
 'noemailcreate' => 'Vous devez fournir une adresse de courriel valide',
-'passwordsent' => "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
+'passwordsent' => 'Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ». Veuillez vous reconnecter après l’avoir reçu.',
 'blocked-mailpassword' => 'Votre adresse IP est bloquée en écriture, la fonction de rappel du mot de passe est donc désactivée pour éviter les abus.',
-'eauthentsent' => "Un courriel de confirmation a été envoyé à l'adresse indiquée.
-Avant qu'un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.",
-'throttled-mailpassword' => "Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d'éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.",
+'eauthentsent' => 'Un courriel de confirmation a été envoyé à l’adresse indiquée.
+Avant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.',
+'throttled-mailpassword' => 'Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d’éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.',
 'mailerror' => 'Erreur lors de l’envoi du courriel : $1',
 'acct_creation_throttle_hit' => 'Quelqu’un utilisant votre adresse IP a créé {{PLURAL:$1|un compte|$1 comptes}} au cours des dernières 24 heures, ce qui constitue la limite autorisée dans cet intervalle de temps.
 Par conséquent, la création de compte a été temporairement désactivée pour cette adresse IP.',
@@ -1029,8 +1036,9 @@ La dernière entrée du registre des blocages est indiquée ci-dessous à titre
 'userinvalidcssjstitle' => "'''Attention :''' il n’existe pas d’habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Mis à jour)',
 'note' => "'''Note :'''",
-'previewnote' => "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''
-Vos modifications n'ont pas encore été enregistrées! [[#editform|→ Continuer la modification]]",
+'previewnote' => "'''Rappelez-vous que ce n’est qu’une prévisualisation.'''
+Vos modifications n’ont pas encore été enregistrées !",
+'continue-editing' => 'Continuer la modification',
 'previewconflict' => 'Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.',
 'session_fail_preview' => "'''Nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.'''
 Veuillez réessayer.
@@ -1044,7 +1052,7 @@ Si cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis recon
 'token_suffix_mismatch' => "'''Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.'''
 Ce rejet est nécessaire pour empêcher la corruption du texte de la page.
 Ce problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
-'edit_form_incomplete' => "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
+'edit_form_incomplete' => "'''Certaines parties du formulaire de modification nont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
 'editing' => 'Modification de $1',
 'creating' => 'Création de $1',
 'editingsection' => 'Modification de $1 (section)',
@@ -1121,6 +1129,12 @@ 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",
+'parser-unstrip-loop-warning' => 'Boucle non démontable détectée',
+'parser-unstrip-recursion-limit' => 'Limite de récursion non démontable dépassée ($1)',
 
 # "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.',
@@ -1166,7 +1180,7 @@ Elle a peut-être été effacée ou renommée.
 Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.',
 
 # Revision deletion
-'rev-deleted-comment' => "(résumé d'édition enlevé)",
+'rev-deleted-comment' => '(résumé d’édition enlevé)',
 'rev-deleted-user' => '(nom d’utilisateur supprimé)',
 'rev-deleted-event' => '(entrée supprimée)',
 'rev-deleted-user-contribs' => '[nom d’utilisateur ou adresse IP supprimée - modification cachée sur les contributions]',
@@ -1263,7 +1277,7 @@ Vérifiez les journaux.',
 # Suppression log
 'suppressionlog' => 'Journal des suppressions',
 'suppressionlogtext' => 'Voici la liste des suppressions et des blocages qui portent sur du contenu caché aux administrateurs.
-Voir la [[Special:BlockList|liste des adresses IP et utilisateurs bloqués]] pour la liste des bannissements et des blocages actuellement opérationnels.',
+Voir la [[Special:BlockList|liste des blocages]] pour la liste des bannissements et des blocages actuellement opérationnels.',
 
 # History merging
 'mergehistory' => 'Fusionner les historiques des pages',
@@ -1295,15 +1309,16 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'mergelogpagetext' => 'Voici la liste des fusions de l’historique d’une page dans celui d’une autre les plus récentes.',
 
 # Diffs
-'history-title' => 'Historique des versions de «&nbsp;$1&nbsp;»',
-'difference' => '(Différences entre les versions)',
+'history-title' => '$1 : Historique des versions',
+'difference-title' => '$1 : Différence entre versions',
+'difference-title-multipage' => 'Différences entre les pages « $1 » et « $2 »',
 'difference-multipage' => '(Différence entre les pages)',
 'lineno' => 'Ligne $1 :',
 'compareselectedversions' => 'Comparer les versions sélectionnées',
 'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
 'editundo' => 'défaire',
 'diff-multi' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par {{PLURAL:$2|un utilisateur|$2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
-'diff-multi-manyusers' => "({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d'un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})",
+'diff-multi-manyusers' => '({{PLURAL:$1|Une révision intermédiaire|$1 révisions intermédiaires}} par plus {{PLURAL:$2|d’un utilisateur|de $2 utilisateurs}} {{PLURAL:$1|est masquée|sont masquées}})',
 
 # Search results
 'searchresults' => 'Résultats de la recherche',
@@ -1328,7 +1343,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',
@@ -1392,6 +1407,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'prefs-beta' => 'Fonctionnalités bêta',
 'prefs-datetime' => 'Date et heure',
 'prefs-labs' => 'Fonctionnalités « labs »',
+'prefs-user-pages' => 'Pages utilisateur',
 'prefs-personal' => 'Informations personnelles',
 'prefs-rc' => 'Modifications récentes',
 'prefs-watchlist' => 'Liste de suivi',
@@ -1510,7 +1526,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'userrights-groupsmember-auto' => 'Membre implicite de :',
 'userrights-groups-help' => 'Vous pouvez modifier les groupes auxquels appartient cet utilisateur:
 * Une case cochée signifie que l’utilisateur se trouve dans ce groupe.
-* Une case non cochée signifie qu’il ne s’y trouve pas.
+* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.
 * Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.',
 'userrights-reason' => 'Motif :',
 'userrights-no-interwiki' => 'Vous n’avez pas la permission de modifier des droits d’utilisateurs sur d’autres wikis.',
@@ -1653,7 +1669,7 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'nchanges' => '$1 modification{{PLURAL:$1||s}}',
 'recentchanges' => 'Modifications récentes',
 'recentchanges-legend' => 'Options des modifications récentes',
-'recentchangestext' => 'Piste les changements les plus récents du wiki sur cette page.',
+'recentchanges-summary' => 'Piste les changements les plus récents du wiki sur cette page.',
 'recentchanges-feed-description' => 'Suivre les dernières modifications de ce wiki dans un flux.',
 'recentchanges-label-newpage' => 'Cette modification a créé une nouvelle page',
 'recentchanges-label-minor' => 'Cette modification est mineure',
@@ -1698,18 +1714,18 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 # Upload
 'upload' => 'Importer un fichier',
 'uploadbtn' => 'Importer le fichier',
-'reuploaddesc' => "Annuler et retourner au formulaire d'import",
+'reuploaddesc' => 'Annuler et retourner au formulaire d’import',
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
 'uploadnologin' => 'Non connecté(e)',
 'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté(e)]] pour importer des fichiers sur le serveur.',
-'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.",
-'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.",
-'uploaderror' => "Erreur lors de l'import",
+'upload_directory_missing' => 'Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.',
+'upload_directory_read_only' => 'Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.',
+'uploaderror' => 'Erreur lors de l’import',
 'upload-recreate-warning' => "'''Attention : Un fichier portant ce nom a été supprimé ou déplacé.'''
 
 Le journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
 'uploadtext' => "Utilisez ce formulaire pour importer des fichiers sur le serveur.
-Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L'import est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
+Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. Limport est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
 
 Pour inclure un fichier dans une page, utilisez un lien de la forme :
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d’une image) ;
@@ -1718,7 +1734,7 @@ Pour inclure un fichier dans une page, utilisez un lien de la forme :
 'upload-permitted' => 'Formats de fichiers autorisés : $1.',
 'upload-preferred' => 'Formats de fichiers préférés : $1.',
 'upload-prohibited' => 'Formats de fichiers interdits : $1.',
-'uploadlog' => "Journal d'import de fichiers",
+'uploadlog' => 'Journal d’import de fichiers',
 'uploadlogpage' => "Journal d'import de fichiers",
 'uploadlogpagetext' => 'Voici la liste des derniers fichiers importés sur le serveur.
 Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.',
@@ -1860,14 +1876,15 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 'backend-fail-writetemp' => "Impossible d'écrire dans le fichier temporaire.",
 'backend-fail-closetemp' => 'Impossible de fermer le fichier temporaire.',
 'backend-fail-read' => 'Impossible de lire le fichier $1.',
-'backend-fail-create' => 'Impossible de créer le fichier $1.',
-'backend-fail-maxsize' => "Impossible de créer le fichier $1 parce qu'il est plus grand que  {{PLURAL:$2|$2 octet| $2 octets}}.",
+'backend-fail-create' => 'Impossible d’écrire le fichier $1.',
+'backend-fail-maxsize' => "Impossible d’écrire le fichier $1 parce qu'il est plus grand {{PLURAL:$2|qu'un octet|que $2 octets}}.",
 'backend-fail-readonly' => 'Le support de stockage "$1" est actuellement en lecture seule. La raison indiquée est: "$2"',
 'backend-fail-synced' => 'Le fichier "$1" est dans un état incohérent dans les supports de stockage internes',
 'backend-fail-connect' => 'Impossible de se connecter au support de stockage "$1".',
 'backend-fail-internal' => 'Une erreur inconnue s\'est produite dans le support de stockage "$1".',
 'backend-fail-contenttype' => 'Impossible de déterminer le type de contenu du fichier à stocker en "$1".',
 'backend-fail-batchsize' => 'Le support de stockage a fourni un lot de $1 {{PLURAL:$1|opération|opérations}} de fichier; la limite est $2 {{PLURAL:$2|opération|opérations}}.',
+'backend-fail-usable' => 'Impossible d’écrire le fichier $1 en raison de droits insuffisants ou répertoires/conteneurs manquants.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Impossible de se connecter à la base de données du journal pour le terminal de stockage "$1".',
@@ -1923,7 +1940,7 @@ Pour une sécurité optimale, img_auth.php est désactivé.',
 
 # HTTP errors
 'http-invalid-url' => 'URL incorrecte : $1',
-'http-invalid-scheme' => 'Les URLs avec le schéma « $1 » ne sont pas supportées',
+'http-invalid-scheme' => 'Les URL avec le schéma « $1 » ne sont pas supportées.',
 'http-request-error' => 'Erreur inconnue lors de l’envoi de la requête.',
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
@@ -1938,7 +1955,7 @@ Pour une sécurité optimale, img_auth.php est désactivé.',
 'upload-curl-error28-text' => 'Le site a mis trop longtemps à répondre. Vérifiez que le site est en ligne, attendez un peu et réessayez. Vous pouvez aussi réessayer à une heure de moindre affluence.',
 
 'license' => 'Licence',
-'license-header' => 'Publié sous licence(s)',
+'license-header' => "Conditions d'utilisation",
 'nolicense' => 'Aucune licence sélectionnée',
 'license-nopreview' => '(Prévisualisation non disponible)',
 'upload_source_url' => ' (une URL valide et accessible publiquement)',
@@ -1999,6 +2016,7 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'shared-repo-from' => 'de : $1',
 'shared-repo' => 'un dépôt partagé',
 'shared-repo-name-wikimediacommons' => 'Wikimédia Commons',
+'filepage.css' => '/* Les styles CSS placés ici sont inclus dans la page de description du fichier, également incluse sur les clients wikis étrangers */',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2189,6 +2207,7 @@ Veuillez noter que d’autres sites peuvent avoir un lien direct vers un fichier
 Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le nom d’utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).',
 'logempty' => 'Aucune opération correspondante dans les journaux.',
 'log-title-wildcard' => 'Chercher parmi les titres commençant par ce texte',
+'showhideselectedlogentries' => 'Afficher/masquer les entrées de journal sélectionnées',
 
 # Special:AllPages
 'allpages' => 'Toutes les pages',
@@ -2208,6 +2227,11 @@ Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le
 'allpages-bad-ns' => '{{SITENAME}} n’a pas d’espace de noms « $1 ».',
 'allpages-hide-redirects' => 'Masquer les redirections',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Vous visualisez une version de cette page mise en cache, qui peut être dater d'au plus $1.",
+'cachedspecial-viewing-cached-ts' => 'Vous visualisez une version de cette page mise en cache, qui pourrait ne pas être complètement à jour.',
+'cachedspecial-refresh-now' => 'Voir le plus récent.',
+
 # Special:Categories
 'categories' => 'Liste des catégories',
 'categoriespagetext' => '{{PLURAL:$1|La catégorie suivante est utilisée|Les catégories suivantes sont utilisées}} par des pages ou fichiers.
@@ -2567,8 +2591,8 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => "Contributions de l'utilisateur",
-'contributions-title' => "Liste des contributions de l'utilisateur $1",
+'contributions' => 'Contributions de l’utilisateur',
+'contributions-title' => 'Liste des contributions de l’utilisateur $1',
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour $1 ($2)',
 'nocontribs' => 'Aucune modification correspondant à ces critères n’a été trouvée.',
@@ -2651,7 +2675,7 @@ Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont ét
 'badipaddress' => 'Adresse IP incorrecte',
 'blockipsuccesssub' => 'Blocage réussi',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e|}}.<br />
-Consultez la [[Special:BlockList|liste des adresses IP et comptes bloqués]] pour revoir les blocages.',
+Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.',
 'ipb-blockingself' => 'Vous êtes sur le point de bloquer votre propre compte ! Êtes-vous certain de vouloir faire cela ?',
 'ipb-confirmhideuser' => 'Vous êtes sur le point de bloquer un utilisateur avec « cacher l’utilisateur » activé. Cela supprime le nom de l’utilisateur dans toutes les listes et les entrées du journal. Êtes-vous sûr de vouloir le faire ?',
 'ipb-edit-dropdown' => 'Modifier les motifs de blocage par défaut',
@@ -2704,7 +2728,7 @@ Le motif fourni pour le blocage de $1 est : « $2 ».',
 'reblock-logentry' => 'a modifié les paramètres du blocage de [[$1]] avec une expiration au $2 $3',
 'blocklogtext' => 'Ceci est le journal des actions de blocages et déblocages d’utilisateurs.
 Les adresses IP automatiquement bloquées ne sont pas listées.
-Consultez la [[Special:BlockList|liste des IP bloquées]] pour voir les bannissements et blocages effectivement en cours.',
+Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.',
 'unblocklogentry' => 'a débloqué $1',
 'block-log-flags-anononly' => 'utilisateurs anonymes seulement',
 'block-log-flags-nocreate' => 'création de compte interdite',
@@ -3048,9 +3072,14 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'chick.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Chick. */',
 'simple.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Simple. */',
 'modern.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Modern. */',
+'vector.css' => '/* Le CSS placé ici affectera les utilisateurs de l’habillage Vector. */',
 'print.css' => '/* Le CSS placé ici affectera les impressions */',
 'handheld.css' => '/* Le CSS placé ici affectera les appareils mobiles en fonction de l\'habillage configuré $wgHandheldStyle */',
+'noscript.css' => '/* Le CSS placé ici affectera les utilisateurs ayant désactivé Javascript. */',
+'group-autoconfirmed.css' => '/* Le CSS placé ici affectera les utilisateurs auto-confirmés seulement. */',
+'group-bot.css' => '/* Le CSS placé ici affectera les robots seulement. */',
 'group-sysop.css' => '/* Le CSS inclus ici n’affectera que les administrateurs */',
+'group-bureaucrat.css' => '/* Le CSS inclus ici n’affectera que les bureaucrates */',
 
 # Scripts
 'common.js' => '/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */',
@@ -3087,6 +3116,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'spambot_username' => 'Nettoyage de pourriels par MediaWiki',
 'spam_reverting' => 'Rétablissement de la dernière version ne contenant pas de lien vers $1',
 'spam_blanking' => 'Toutes les versions contenant des liens vers $1 sont blanchies',
+'spam_deleting' => 'Toutes les versions contenaient des liens vers $1, suppression',
 
 # Info page
 'pageinfo-title' => 'Informations pour « $1 »',
@@ -3821,6 +3851,11 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-software' => 'Logiciels installés',
 'version-software-product' => 'Produit',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL de point d’entrée',
+'version-entrypoints-header-entrypoint' => "Point d'entrée",
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d\'article]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
 
 # Special:FilePath
 'filepath' => 'Chemin d’accès du fichier',
@@ -3845,7 +3880,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'specialpages-note' => '----
 * Pages spéciales normales.
 * <span class="mw-specialpagerestricted">Pages spéciales restreintes.</span>
-* <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être obsolètes).</span>',
+* <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être désuètes).</span>',
 'specialpages-group-maintenance' => 'Rapports de maintenance',
 'specialpages-group-other' => 'Autres pages spéciales',
 'specialpages-group-login' => 'S’identifier / s’inscrire',
@@ -3866,7 +3901,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 # External image whitelist
 'external_image_whitelist' => ' #Laisser cette ligne exactement telle quelle.<pre>
 #Indiquer les fragments d’expressions rationnelles (juste la partie indiquée entre les //) ci-dessous.
-#Ils correspondront avec les URLs des images externes.
+#Ils correspondront avec les URL des images externes.
 #Celles qui correspondent s’afficheront comme des images, sinon seul un lien vers l’image sera affiché.
 #Les lignes commençant par un # seront considérées comme des commentaires.
 #Cette liste n’est pas sensible à la casse.
@@ -4009,4 +4044,17 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-uploaddisabled' => 'Le versement est désactivé sur ce wiki.',
 'api-error-verification-error' => 'Ce fichier peut être corrompu, ou son extension est incorrecte.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|seconde|secondes}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minute|minutes}}',
+'duration-hours' => '$1 {{PLURAL:$1|heure|heures}}',
+'duration-days' => '$1 {{PLURAL:$1|jour|jours}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semaine|semaines}}',
+'duration-years' => '$1 {{PLURAL:$1|année|années}}',
+'duration-decades' => '$1 {{PLURAL:$1|décennie|décennies}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siècle|siècles}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millénaire|millénaires}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => "Impossible d'acquérir des verrous sur le serveur $1.",
 );
index ed0053a..768dad1 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Franco-Provençal (Arpetan)
+/** Franco-Provençal (arpetan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -26,8 +26,8 @@ $namespaceNames = array(
        NS_MEDIA            => 'Mèdia',
        NS_SPECIAL          => 'Spèciâl',
        NS_TALK             => 'Discussion',
-       NS_USER             => 'Usanciér',
-       NS_USER_TALK        => 'Discussion_usanciér',
+       NS_USER             => 'Utilisator',
+       NS_USER_TALK        => 'Discussion_utilisator',
        NS_PROJECT_TALK     => 'Discussion_$1',
        NS_FILE             => 'Fichiér',
        NS_FILE_TALK        => 'Discussion_fichiér',
@@ -43,8 +43,8 @@ $namespaceNames = array(
 
 $namespaceAliases = array(
        'Discutar'              => NS_TALK,
-       'Utilisator'            => NS_USER,
-       'Discussion_Utilisator' => NS_USER_TALK,
+       'Usanciér'              => NS_USER,
+       'Discussion_usanciér'   => NS_USER_TALK,
        'Émâge'                 => NS_FILE,
        'Discussion_Émâge'      => NS_FILE_TALK,
        'Discussion_Modèlo'     => NS_TEMPLATE_TALK,
@@ -1287,7 +1287,6 @@ Notâd bien que l’usâjo des lims de navigacion tornerat inicialisar cela colo
 
 # Diffs
 'history-title' => 'Historico de les vèrsions de « $1 »',
-'difference' => '(Difèrences entre les vèrsions)',
 'difference-multipage' => '(Difèrences entre les pâges)',
 'lineno' => 'Legne $1 :',
 'compareselectedversions' => 'Comparar les vèrsions chouèsies',
@@ -1648,7 +1647,7 @@ Ceta enformacion serat publica.',
 'nchanges' => '$1 changement{{PLURAL:$1||s}}',
 'recentchanges' => 'Dèrriérs changements',
 'recentchanges-legend' => 'Chouèx des dèrriérs changements',
-'recentchangestext' => 'Siude los dèrriérs changements du vouiqui sur ceta pâge.',
+'recentchanges-summary' => 'Siude los dèrriérs changements du vouiqui sur ceta pâge.',
 'recentchanges-feed-description' => 'Siude los dèrriérs changements du vouiqui dens ceti flux.',
 'recentchanges-label-newpage' => 'Ceti changement at fêt una pâge novèla.',
 'recentchanges-label-minor' => 'Ceti changement est petiôt.',
index 4467afb..d7b129f 100644 (file)
@@ -25,7 +25,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Latje änringe fersteege',
 'tog-newpageshidepatrolled' => 'Kontroliirde side aw e list "Naie side" fersteege',
 'tog-extendwatchlist' => 'Ütwidede wåchelist tun wisen foon åle änringe',
-'tog-usenewrc' => 'Ütwidede deerstaling foon da "Leeste Änringe" (brükt JavaScript)',
+'tog-usenewrc' => "Ütwidede deerstaling foon da ''Leeste Änringe'' än aw da ''Eefterkiikliste'' (brükt JavaScript)",
 'tog-numberheadings' => 'Ouerschrafte automatisch numeriire',
 'tog-showtoolbar' => 'Beårbe-wärktjüch wise',
 'tog-editondblclick' => 'Side ma dööweltklik beårbe (brükt JavaScript)',
@@ -262,7 +262,7 @@ $1',
 'edithelp' => 'Beårbingsheelp',
 'edithelppage' => 'Help:Beårbe',
 'helppage' => 'Help:Inhåltsfertiiknis',
-'mainpage' => 'Hoodsid',
+'mainpage' => 'Wikipedia:Hoodsid',
 'mainpage-description' => 'Hoodsid',
 'policy-url' => 'Project:Ruchtliinje',
 'portal' => 'Gemiinschaps-portåål',
@@ -281,6 +281,7 @@ Sii jü [[Special:Version|Färsjoonssid]]',
 'ok' => 'OK',
 'pagetitle' => '$1 – {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
+'backlinksubtitle' => '← $1',
 'retrievedfrom' => 'Foon „$1“',
 'youhavenewmessages' => 'Dü hääst $1 aw din diskusjoonssid ($2).',
 'newmessageslink' => 'naie tisinge',
@@ -392,11 +393,10 @@ Ouffrååch: $2',
 'actionthrottledtext' => 'Dü hääst jüdeer aksjoon tu oofding bane en kort tidrüm ütfjard. Wees sü gödj än täiw en påår minuute än fersäk dåt et dan foon naien.',
 'protectedpagetext' => 'Jüdeer sid as for dåt beårben späred.',
 'viewsourcetext' => 'Dü koost jü kwäle foon jüdeer sid bekiike än kopiire.',
-'viewyourtext' => "Dü könst di code faan '''din feranerang''' faan detheer sidj uunluke an kopiare:",
+'viewyourtext' => "Dü könst di code faan '''din feranrang''' faan detdiar sidj uunluke an kopiare:",
 'protectedinterface' => 'Jüdeer sid önjthålt takst for ju brükerouerfläche foon e software än as späred, am masbrük tu ferhanern.',
-'editinginterface' => "'''Woorschauing:''' Jüdeer sid önjthålt foon jü MesiaWiki-software bënjüteden takst.
-Änringe wirke jam aw jü brükerouerfläche üt.
-For ouerseetinge tånk deeram, jü önj di  [//translatewiki.net/wiki/Main_Page?setlang=frr Translatewiki], dåt MediaWiki lokalisiiringsprojekt, döörtufäären.",
+'editinginterface' => "'''Paase üüb:''' Üüb detdiar sidj stäänt tekst, diar faan't MediaWiki software brükt woort. Wan dü diar wat feranerst, feranerst dü di skak faan't Nuurdfresk Wikipedia.
+Wan dü wat auersaat wel, maage det mä [//translatewiki.net/wiki/Main_Page?setlang=frr Translatewiki], det as det MediaWiki lokalisiarangsprojekt.",
 'sqlhidden' => 'SCL-ouffrååg ferstäägen',
 'cascadeprotected' => 'Jüdeer sid as for beårbing spärd. Jü as önj {{PLURAL:$1|e füliende sid|da füliende side}}
 önjbünen, {{PLURAL:$1|jü|da}} madels e kaskaadespäropsjoon önj febading hüüljen {{PLURAL:$1|as|san}}:
@@ -407,9 +407,10 @@ $2',
 'ns-specialprotected' => 'Spetsjåålside koone ai beårbed wårde.',
 'titleprotected' => 'En sid ma dideer noome koon ai önjläid wårde.
 Jü späre wörd döör [[User:$1|$1]] ma grün "$2" inruchted.',
-'filereadonlyerror' => "Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluat leesen wurd koon.
-
-Di grünj as „''$3''“.",
+'filereadonlyerror' => 'Det datei „$1“ koon ei feranert wurd, auer uun det fertiaknis „$2“ bluas leesen wurd koon.
+Di grünj faan di administraator as: „$3“.',
+'invalidtitle-knownnamespace' => 'Ferkiard auerskraft uun di nöömrüm „$2“ an tekst „$3“',
+'invalidtitle-unknownnamespace' => 'Ferkiard auerskraft uun di ünbekäänd nöömrüm „$1“ an tekst „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Hiinje konfigurasjoon: ünbekånde fiirusscanner: ''$1''",
@@ -502,6 +503,7 @@ Besäkere, da iüheer IP-adräse brüke, koone tu jü tutids niinj benutserkonte
 'invalidemailaddress' => 'Jü E-mail adräs wörd ai aksäptiird, ouerdåt jü en üngülti formoot (ewentuäl üngültie tiikne) tu heewen scheent.
 Wees sü gödj än jeef en koräkt adräs önj unti mäág dåt fäalj lääsi.',
 'cannotchangeemail' => 'E-mail-adresen kön uun detheer wiki ei feranert wurd.',
+'emaildisabled' => 'Fann detdiar sidj kön nian E-Mails fersjüürd wurd',
 'accountcreated' => 'Benjüterkonto mååged',
 'accountcreatedtext' => 'Dåt benjüteraccount for $1 as mååged wörden.',
 'createaccount-title' => 'Måågen foon en benjüterkonto for {{SITENAME}}',
@@ -568,14 +570,14 @@ Tidwis paasuurd: $2',
 'passwordreset-emailerror-capture' => 'Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei ufsjüürd wurd: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Feranere det E-Mail-adres',
-'changeemail-header' => 'Feranere det E-Mail-adres',
-'changeemail-text' => 'Fal detheer formulaar hialandaal ütj, am din E-Mail-adres tu feranerin. Diarför skel dü din paaswurd uundu.',
+'changeemail' => 'Feranre det E-Mail-adres',
+'changeemail-header' => 'Feranre det E-Mail-adres',
+'changeemail-text' => 'Fal detdiar formulaar hialandaal ütj, am din E-Mail-adres tu feranrin. Diarför skel dü din paaswurd uundu.',
 'changeemail-no-info' => 'Dü möist önjmälded weese am ju sid diräkt tu tu gripen.',
 'changeemail-oldemail' => 'Aktuel e-mail adres',
 'changeemail-newemail' => 'Nei e-mail adres',
 'changeemail-none' => '(niin)',
-'changeemail-submit' => 'E-mail adres feranere',
+'changeemail-submit' => 'E-mail adres feranre',
 'changeemail-cancel' => 'Ufbreeg',
 
 # Edit page toolbar
@@ -601,11 +603,11 @@ Tidwis paasuurd: $2',
 'subject' => 'Bedrååwet:',
 'minoredit' => 'Bloot kleenihäide wörden feränred',
 'watchthis' => 'Kiike eefter jüdeer sid',
-'savearticle' => 'Sid spikre',
-'preview' => 'Forlök',
-'showpreview' => 'Forlök wise',
-'showlivepreview' => 'Live-forkiik',
-'showdiff' => 'Änringe wise',
+'savearticle' => 'Sidj seekre',
+'preview' => 'Iarst ans luke',
+'showpreview' => 'Iarst ans luke',
+'showlivepreview' => 'Glik uunluke',
+'showdiff' => 'Feranrangen wise',
 'anoneditwarning' => "Dü beårbest jüdeer sid ünönjmälded. Wan dü spikerst, wård din aktuäle IP-adräs önj e fesjoonshistoori aptiikned än as deerma for åltens '''ålgemiin''' sichtboor.",
 'anonpreviewwarning' => "''Dü bast ai önjmälded. Bai t spiikern wårt din IP-adräs önj e fersjoonshistoori awtiikned.''",
 'missingsummary' => "'''Haanewising:\"' Dü heest niinj tuhuupefooting önjjääwen.
@@ -671,12 +673,12 @@ Dü koost dideere tiitel aw da ouder side [[Special:Search/{{PAGENAME}}|säke]],
 'noarticletext-nopermission' => 'Jüdeer sid önjhålt uugenblaklik nuch nån täkst.
 Dü koost dideere tiitel aw da oudre side [[Special:Search/{{PAGENAME}}|säke]],
 unti<span class="plainlinks">önj da deertuhiirende [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} logböke säke] </span>.',
-'userpage-userdoesnotexist' => 'Dåt benjüterkonto "<nowiki>$1</nowiki>" as ai deer.
-Wees sü gödj än präif, weer dü jüdeer sid wörklik mååge/beårbe wååt.',
+'userpage-userdoesnotexist' => "Det brükerkonto ''$1'' as ei diar.
+Wel dü detdiar sidj würelk maage/bewerke?",
 'userpage-userdoesnotexist-view' => 'Benjüterkonto "$1" bestoont ai.',
 'blocked-notice-logextract' => 'Dideer benjüter as tutids spärd.
 For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
-'clearyourcache' => "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranerangen sä wel.
+'clearyourcache' => "'''Beaachte:''' Maage di cache faan dan browser leesag, wan dü a feranrangen sä wel.
 * '''Firefox / Safari:''' Hual ''Shift'' bi't aktualisiarin, of trak ''Strg an F5'' of ''Strg an R'' (''⌘an R'' üüb en Mac)
 * '''Google Chrome:''' Trak ''Strg an Shift an R'' (''⌘an Shift an R'' üüb en Mac)
 * '''Internet Explorer:''' Hual ''Strg'' bi't aktualisiarin, of trak ''Strg an F5''
@@ -695,12 +697,14 @@ For informasjoon füliet di leeste üttooch üt dåt benjüterspär-logbök:',
 'userinvalidcssjstitle' => "''Woorschauing:''' Skin \"\$1\"jeeft dåt ai. Betånk, dåt brükerspetsiifische .css- än .js-side ma en latj bökstääw önjfånge mönje, ålsü biispelswise ''{{ns:user}}:Münsterkjarl/vector.css'' önj stää foon ''{{ns:user}}:Münsterkjarl/Vector.css''.",
 'updated' => '(Änred)',
 'note' => "'''Påås aw:'''",
-'previewnote' => "'''Dåtheer as bloot en forlök, jü sid wörd nuch ai spikred!'''",
+'previewnote' => "'''Heer könst dü sä, hü det sidj wurd skal.'''
+Det sidj as oober noch ei seekert!",
+'continue-editing' => 'Widjer bewerke',
 'previewconflict' => 'Dideer forbekiik jeeft di inhålt foon dåt boowerst takstfälj wider. Sü wårt jü sid ütsiinj, wan dü nü spiikerst.',
 'session_fail_preview' => "'''Din werk küd ei ufseekert wurd, diar as wat skiaf gingen.'''
 Fersjük det man noch ans an trak do üüb ''Sid spiikre''.
 Wan't do imer noch ei loket, [[Special:UserLogout|melde di uf]] an weder uun.",
-'session_fail_preview_html' => "'''Din werk küd ei seekerd wurd. Diar as wat skiaf gingen.'''
+'session_fail_preview_html' => "'''Din werk küd ei seekert wurd. Diar as wat skiaf gingen.'''
 
 ''Uun {{SITENAME}} as HTML aktiwiaret, an diaram as JavaScript deaktiwiaret wurden.''
 
@@ -712,12 +716,13 @@ Det komt flooksis föör, wan Dan anonym Proxy-siinst ei rocht werket.",
 'edit_form_incomplete' => "'''Enkelt dialen faan det formulaar san ei rocht uunkimen.'''
 Wees so gud an kontroliare ales noch ans.",
 'editing' => 'Beårbe foon $1',
+'creating' => 'Maage $1',
 'editingsection' => 'Beårben foon $1 (oufsnaas)',
 'editingcomment' => 'Beårben foon $1 (naien oufsnaas)',
 'editconflict' => 'Beårbingskonflikt: $1',
 'explainconflict' => "Hoker ööders hää detheer sidj feranert, üs dü jüst diarmä uun a gang wiarst.
-Boowen könst dü di aktuel stant sä. Oner stun din fernanerangen.
-Bluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranerangen boowen iin.
+Boowen könst dü di aktuel stant sä. Oner stun din fernanrangen.
+Bluas wat '''boowen''' stäänt, woort seekert. Diaram kopiare din feranrangen boowen iin.
 An do trak „{{int:savearticle}}“.",
 'yourtext' => 'Din täkst',
 'storedversion' => 'Spiikerd färsjoon',
@@ -737,20 +742,20 @@ Wan dü heer wat iinskrafst, do beest dü diarmä iinferstenen an seekerst tu, d
 Wees sü gödj än sääkre di täkst lokool aw din kompjuuter än fersäk tu n lääsern tidpunkt, da änringe tu ouerdreegen.'''.
 
 Grün for jü späre: $1",
-'protectedpagewarning' => "'''PÅÅS AW: Jüheer sid wörd spärd. Bloot benjütere ma adminstrasjoonsruchte koone jü sid beårbe.'''
-For informasjoon füliet di aktuäle logbökönjdråch:",
-'semiprotectedpagewarning' => "'''PÅÅS AW: Jüheer sid wörd spärd. Bloot benjütere ma adminstrasjoonsruchte koone jü sid beårbe.'''
-For informasjoon füliet di aktuäle logbökönjdråch:",
-'cascadeprotectedwarning' => "'''Woorschauing:''' Jüheer sid wörd sü önj ferbading hülen, dåt jü bloot döör benjütere ma administraator-ruchte beårbed wårde koon. Jü as önj {{PLURAL:$1|jü füliend sid|da füliende side}} önjbünen, da döör jü kaskaadespäropsjoon önj ferbading hülen {{PLURAL:$1|wårt|wårde}}:",
-'titleprotectedwarning' => "'''PÅÅS AW: \"Dåt måågen foon side wörd spärd. Bloot benjütere ma [[Special:ListGroupRights|spetsjäle ruchte]] koone da side mååge.'''
-For informasjoon füliet jü leest logbök-önjdråch:",
+'protectedpagewarning' => "'''Paase üüb: Detdiar sidj as speret wurden. Bluas administratooren kön det bewerke.'''
+Uun't logbuk stäänt muar diartu:",
+'semiprotectedpagewarning' => "'''Paase üüb: Detdiar sidj as dialwiis tu't bewerkin speret wurden. Bluas gudkäänd brükern kön det bewerke.'''
+Uun't logbuk stäänt muar diartu:",
+'cascadeprotectedwarning' => "'''Paase üüb:''' Detdiar sidj koon bluas faan administratooren bewerket wurd. Hat as uun {{PLURAL:$1|detdiar ööder sidj|jodiar ööder sidjen}} iinbünjen, diar troch en kaskaaden-optsjuun seekert {{PLURAL:$1|as|san}}:",
+'titleprotectedwarning' => "'''Paase üüb: \"Detdiar sidj mä didiar nööm koon ei faan arken bewerket wurd. Bluas enkelt brükern mä [[Special:ListGroupRights|was brükerrochten]] kön detdiar sidj nei maage of bewerke.'''
+Uun't logbuk stäänt muar diartu:",
 'templatesused' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon jüdeer sid ferwånd:',
 'templatesusedpreview' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon diheere sideforlök ferwånd:',
 'templatesusedsection' => '{{PLURAL:$1|Jü füliend forlååg wårt|Da füliende forlååge wårde}} foon dideer oufsnaas ferwånd:',
-'template-protected' => '(önj ferbading hülen iinj schriwen)',
-'template-semiprotected' => '(schriwschütsed for ünönjmäldede än naie brükere)',
+'template-protected' => '(seekert)',
+'template-semiprotected' => '(hualew-seekert)',
 'hiddencategories' => 'Jüdeer sid as lasmoot foon {{PLURAL:$1|1 ferstäägen kategorii|$1 ferstäägene kategoriie}}:',
-'nocreatetitle' => 'Dåt måågeb foon naie side as begränsed.',
+'nocreatetitle' => 'Det maagin faan nei sidjen as ei saner aanj mögelk.',
 'nocreatetext' => 'Aw {{SITENAME}} wörd dåt måågen foon naie side begränsed.
 Dü koost bestönjene side änre unti de [[Special:UserLogin|önjmälde unti mååg en account]].',
 'nocreate-loggedin' => 'Dü heest niinj beruchtiging, naie side tu måågen.',
@@ -761,8 +766,8 @@ Dü koost bestönjene side änre unti de [[Special:UserLogin|önjmälde unti må
 'permissionserrorstext-withaction' => 'Dü bast ai beruchtit, $2.
 {{PLURAL:$1|grün|grüne}}:',
 'recreate-moveddeleted-warn' => "'''Paase üüb: Dü wel en artiikel maage, diar iar al ans stregen wurden as.'''
-
-Auerlei di det gud, amdat dü niks ferkiard maagest. At logbuk faan diheer artiikel stäänt diar:",
+Auerlei di det gud, amdat dü niks ferkiard maagest.
+Uun't logbuk stäänt muar diartu:",
 'moveddeleted-notice' => 'Jüheer sid wörd sleeked. Deer füliet en üttooch üt dåt sleek- än ferschüwingslogbök for jüheer sid.',
 'log-fulllog' => 'Åle logbük-önjdrååge önjkiike',
 'edit-hook-aborted' => 'Jü beårbing wörd suner ferklååring döör en snaasstää oufbräägen.',
@@ -772,6 +777,7 @@ Jü wörd önjscheened sleeked.',
 'edit-no-change' => 'Din beårbing wörd ignoriird, deer niinj änring an e täkst fornümen wörd.',
 'edit-already-exists' => 'Köö niinj nai sid mååge.
 Dåt bestöö ål.',
+'defaultmessagetext' => 'Standard tekst',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Woorschauing: Jüdeer sid önjthålt tu fool apteele foon widluftie parserfunksjoone.
@@ -785,10 +791,16 @@ Deer {{PLURAL:$2|mötj ai mör ås 1 apteel|mönje ai mör ås $1 apteele}} wees
 'parser-template-loop-warning' => 'Forlåågesloif önjtdäkt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Forloagerekursjoonsdiipgränse ouerschran ($1)',
 'language-converter-depth-warning' => 'Spräkekonwärsjoonsdiipdegränse ouerschren ($1)',
+'node-count-exceeded-category' => 'Jodiar sidjen haa tuföl ferbinjangen (nodes)',
+'node-count-exceeded-warning' => 'Detdiar sidj hää tuföl ferbinjangen (nodes)',
+'expansion-depth-exceeded-category' => 'Jodiar sidjen haa tuföl ütjwidjangen (expansion)',
+'expansion-depth-exceeded-warning' => 'Detdiar sidj hää tuföl ütjwidjangen (expansion)',
+'parser-unstrip-loop-warning' => 'Diar as en jinsidjag ferwisang',
+'parser-unstrip-recursion-limit' => 'Tuföl jinsidjag ferwisangen bi $1',
 
 # "Undo" feature
-'undo-success' => 'Detheer feranerang koon turag nimen wurd. 
-Luke oner, of dü det uk würelk du wel, an do seekre din feranerangen.',
+'undo-success' => 'Detdiar feranrang koon turag nimen wurd. 
+Luke oner, of dü det uk würelk du wel, an do seekre din feranrangen.',
 'undo-failure' => 'Jü änring köö ai tunintemååged wårde, deer di bedrååwede oufsnaas intwasche feränred wörd.',
 'undo-norev' => 'Jü beårbing köö ai tunintemååged wårde, deer jü ai bestoont unti sleeked wörd.',
 'undo-summary' => 'Änring $1 foon [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskusjoon]]) tunintemååged.',
@@ -914,7 +926,7 @@ Dü heest deeraw nåån tugraawe.',
 'revdelete-modify-missing' => "Bi't bewerkin faan ID $1 as wat skiaf gingen: At waant uun a dootenbeenk!",
 'revdelete-no-change' => "'''Waarskau:''' Di iindrach faan di $1, am a klook $2 hää al jodiar iinstelangen.",
 'revdelete-concurrent-change' => "Bi't bewerkin faan di iindrach di $1, am a klook $2 as wat skiaf gingen: At sjocht so ütj, üs wan hoker ööders det bewerket hää, iar dü det bewerke wulst. Luke iin uun a logbuken.",
-'revdelete-only-restricted' => "Bi't fersteegen faan di iindrach di $1, am a klook $2 as wat skiaf gingen: Dü könst di iindrach ei föör administratooren fersteeg, saner ööder iinstelangen tu feranerin.",
+'revdelete-only-restricted' => "Bi't fersteegen faan di iindrach di $1, am a klook $2 as wat skiaf gingen: Dü könst di iindrach ei föör administratooren fersteeg, saner ööder iinstelangen tu feranrin.",
 'revdelete-reason-dropdown' => "*Grünjer för't striken san miast
 ** Copyright woort ei iinhäälen
 ** Persöönelk informatsjuunen, diar näämen wat uungung",
@@ -926,7 +938,7 @@ Dü heest deeraw nåån tugraawe.',
 # Suppression log
 'suppressionlog' => 'Oversight-logbök',
 'suppressionlogtext' => 'Detheer as det logbuk faan oversighter aktsjuunen.
-Luke bi [[Special:BlockList|List faan speret IP-adresen an brükernöömer]] för aktuel informatsjuunen.',
+Luke bi [[Special:BlockList|List faan speret IP-adresen an brükernöömer]] för aktuel sperangen.',
 
 # History merging
 'mergehistory' => 'Fersjoonshistoorie feriine',
@@ -960,8 +972,9 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'mergelogpagetext' => 'Dåtheer as dåt logbök foon da feriinde färsjoonshistoorie.',
 
 # Diffs
-'history-title' => 'Färsjoonshistoori foon "$1"',
-'difference' => '(Ferschääl twasche Färsjoone)',
+'history-title' => '$1: Ferluup faan a wersjuunen',
+'difference-title' => 'Ferskeel tesken a wersjuunen faan "$1"',
+'difference-title-multipage' => 'Ferskeel tesken a sidjen "$1" an "$2"',
 'difference-multipage' => '(Ferschääl twasche side)',
 'lineno' => 'Ra $1:',
 'compareselectedversions' => 'Wäälde färsjoone ferglike',
@@ -1035,23 +1048,66 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'searchdisabled' => 'Jü {{SITENAME}}-säkj as deaktiviird. Dü koost intwasche ma Google säke. Betånk, dåt di säkindäks for {{SITENAME}} ferüüljet weese koon.',
 
 # Quickbar
+'qbsettings' => 'Sidjenliist',
 'qbsettings-none' => 'Niinj',
+'qbsettings-fixedleft' => 'Lachts, fääst',
+'qbsettings-fixedright' => 'Rochts, fääst',
+'qbsettings-floatingleft' => 'Lachts, auergung',
+'qbsettings-floatingright' => 'Rochts, auergung',
+'qbsettings-directionality' => 'Fääst, hinget faan di skriiwwai faan det spriak uf',
 
 # Preferences page
 'preferences' => 'Önjstalinge',
 'mypreferences' => 'Önjstalinge',
+'prefs-edits' => 'Taal faan feranrangen:',
 'prefsnologin' => 'Ai önjmälded',
+'prefsnologintext' => 'Dü skel <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} uunmeldet]</span> wees, am din iinstelangen tu feranrin.',
 'changepassword' => 'Pååsuurd änre',
+'prefs-skin' => 'Skak',
 'skin-preview' => 'Forlök',
 'datedefault' => 'Foor-önjstaling',
+'prefs-beta' => 'Beta mögelkhaiden',
+'prefs-datetime' => 'Dai an klooktidj',
+'prefs-labs' => 'Alpha mögelkhaiden',
+'prefs-user-pages' => 'Brükersidjen',
 'prefs-personal' => 'Brüker dooten',
 'prefs-rc' => 'Leeste änringe',
+'prefs-watchlist' => "Uun't uug behual",
+'prefs-watchlist-days' => "So föl daar uun't uug behual:",
 'prefs-watchlist-days-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
+'prefs-watchlist-edits' => 'Ei muar feranrangen üs:',
 'prefs-watchlist-edits-max' => 'Ai mör as 1000',
+'prefs-watchlist-token' => "Token för uun't uug behualen:",
 'prefs-misc' => 'Dit än dat',
 'prefs-resetpass' => 'Pååsuurd änre',
+'prefs-changeemail' => 'Feranre det E-Mail-adres',
+'prefs-setemail' => 'E-Mail-adres fäästlei:',
+'prefs-email' => 'E-Mail iinstelangen',
+'prefs-rendering' => 'Skak',
 'saveprefs' => 'Önjstalinge sääkere',
+'resetprefs' => 'Wech diarmä',
+'restoreprefs' => 'Normool iinstelangen weder haale',
+'prefs-editing' => 'Bewerke',
+'prefs-edit-boxsize' => "Grate faan't wönang tu't bewerkin:",
+'rows' => 'Räen:',
+'columns' => 'Spleder:',
+'searchresultshead' => 'Sjük',
+'resultsperpage' => 'So fölsis komt det föör per sidj:',
+'stub-threshold' => 'Formatiarang faan links <a href="#" class="stub">för letj sidjen</a> (uun Byte):',
+'stub-threshold-disabled' => 'Ufsteld',
+'recentchangesdays' => 'Soföl daar skel a „leetst feranrangen“ uunwise:',
+'recentchangesdays-max' => 'Ei muar üs {{PLURAL:$1|ään dai|$1 daar}}',
+'recentchangescount' => 'Soföl feranrangen skel uunwiset wurd:',
+'prefs-help-recentchangescount' => 'Det san a leetst feranrangen, wersjuunen an logbuken.',
+'prefs-help-watchlist-token' => "Wan dü detdiar fial mä en hiamelken code ütjfalst, woort en RSS-feed iinracht. Arken mä didiar code koon do sä, wat dü uun't uug behual wel. Diaram skul hi ei so ianfach wees, nem dach didiar: $1",
+'savedprefs' => 'Din iinstelangen san seekert wurden.',
+'timezonelegend' => 'Tidjsoon:',
 'localtime' => 'lokaal tid',
+'timezoneuseserverdefault' => 'Wiki standard tidj brük ($1)',
+'timezoneuseoffset' => 'Öödern (ferskeel uundu)',
+'timezoneoffset' => 'Ferskeel¹:',
+'servertime' => 'Server klooktidj:',
+'guesstimezone' => 'Faan a browser auernem',
 'timezoneregion-africa' => 'Afrikaa',
 'timezoneregion-america' => 'Ameerikaa',
 'timezoneregion-antarctica' => 'Antarktikaa',
@@ -1068,48 +1124,127 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'defaultns' => 'Ouers säk önj jüheer noomerüme:',
 'default' => 'Forinstaling',
 'prefs-files' => 'Dååtäie',
+'prefs-custom-css' => 'Salew maaget CSS',
+'prefs-custom-js' => 'Salew maaget JavaScript',
+'prefs-common-css-js' => 'CSS / JavaScript för arke skak:',
+'prefs-reset-intro' => 'Üüb detdiar sidj könst dü weder a normool iinstelangen iinracht.
+Do san jo ual iinstelangen wech.',
+'prefs-emailconfirm-label' => 'E-Mail gudkäänd:',
+'prefs-textboxsize' => "Grate faan't wönang tu bewerkin",
 'youremail' => 'E-mail:',
 'username' => 'Brükernoome:',
+'uid' => 'Brüker ID:',
+'prefs-memberingroups' => 'Lasmoot faan {{PLURAL:$1|brükerskööl|brükersköölen}}:',
+'prefs-registration' => 'Uunmelde-tidj',
 'yourrealname' => 'Rocht nööm:',
 'yourlanguage' => 'Spräke:',
+'yourvariant' => 'Spriak:',
+'prefs-help-variant' => 'Uun hün skriiwwiis skel a sidjen uunwiset wurd:',
 'yournick' => 'Nai signatuur:',
+'prefs-help-signature' => 'Wees so gud an onerskriiw üüb diskusjuunssidjen mä „<nowiki>~~~~</nowiki>“. Diar komt do dan brükernööm an det klooktidj bi ütj.',
+'badsig' => "Diar stemet wat ei mä't signatuur. Preewe at HTML.",
+'badsiglength' => 'Din signatuur mut ei muar üs $1 {{PLURAL:$1|tiaken|tiakens}} haa.',
+'yourgender' => 'Slach:',
+'gender-unknown' => 'Ei bekäänd',
+'gender-male' => 'Maan',
+'gender-female' => 'Wüf',
+'prefs-help-gender' => "Stäänt tu wool: Det woort brükt för't paasin uunspreegen faan maaner an wüfen. Arken koon det lees.",
 'email' => 'E-mail',
+'prefs-help-realname' => 'Stäänt tu wool. Wan dü dan rochten nööm uundääst, koon hi mä din bewerkangen ferbünjen wurd.',
 'prefs-help-email' => 'Dü säärst din e-mail-adres ei uundu, oober do könst dü uk nian mädialangen fu, wan dü ans din paaswurd ferjiden heest.',
 'prefs-help-email-others' => 'Mä ööder brükern könst dü uk auer hör an din brükersidj kontakt apnem. Diarför woort din e-mail-adres ei brükt.',
+'prefs-help-email-required' => 'Du en rocht E-Mail-adres uun.',
+'prefs-info' => 'Baasisdooten',
 'prefs-i18n' => 'Spriak',
 'prefs-signature' => 'Signatuur',
+'prefs-dateformat' => "Formaat faan't dootem",
+'prefs-timeoffset' => 'Ferskeel faan a klooktidj',
 'prefs-advancedediting' => 'Ütwided möölikhäide',
 'prefs-advancedrc' => 'Ütwided möölikhäide',
 'prefs-advancedrendering' => 'Ütwided möölikhäide',
 'prefs-advancedsearchoptions' => 'Ütwided möölikhäide',
 'prefs-advancedwatchlist' => 'Ütwided möölikhäide',
+'prefs-displayrc' => "Mögelkhaiden för't uunwisin",
+'prefs-displaysearchoptions' => "Mögelkhaiden för't uunwisin",
+'prefs-displaywatchlist' => "Mögelkhaiden för't uunwisin",
+'prefs-diffs' => 'Ferskeel',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'Detdiar E-Mail-adres schocht gud ütj.',
+'email-address-validity-invalid' => 'Du en echt E-Mail-adres uun.',
 
 # User rights
-'userrights-user-editname' => 'Brükernoome:',
+'userrights' => 'Brükerrochten bewerke',
+'userrights-lookup-user' => 'Brükersköölen bewerke',
+'userrights-user-editname' => 'Brükernööm:',
+'editusergroup' => 'Brükersköölen bewerke',
+'editinguser' => "Brükerrochten faan '''[[User:$1|$1]]''' $2 feranre",
+'userrights-editusergroup' => 'Lasmootskap tu brükersköölen bewerke',
+'saveusergroups' => 'Brükersköölen seekre',
+'userrights-groupsmember' => 'Lasmoot faan:',
+'userrights-groupsmember-auto' => 'Faan salew lasmoot faan:',
+'userrights-groups-help' => 'Dü könst feranre, tu hün brükerskööl di brüker hiirt:
+* En uunkrüsagt kasche ment, di brüker hiirt diartu.
+* En ei uunkrüsagt kasche ment, di brüker hiart ei diartu.
+* En * ment, dat dü det brükerrocht ei weder wechnem könst (of amkiard).',
+'userrights-reason' => 'Grünj:',
+'userrights-no-interwiki' => 'Dü heest ei det rocht, am brükerrochten uun ööder wikis tu feranrin.',
+'userrights-nodatabase' => 'Det dootenbeenk $1 jaft at ei, tumanst ei lokaal.',
+'userrights-nologin' => 'Dü mutst di mä en administraator-brükerkonto [[Special:UserLogin|uunmelde]], wan dü brükerrochten feranre wel.',
+'userrights-notallowed' => 'Dü heest ei det rocht, am brükerrochten tu feranrin.',
+'userrights-changeable-col' => 'Lasmootskapen, diar dü feranre könst',
+'userrights-unchangeable-col' => 'Lasmootskapen, diar dü ei feranre könst',
 
 # Groups
-'group-user' => 'Brükere',
-'group-autoconfirmed' => 'Registriirde brükere',
+'group' => 'Skööl:',
+'group-user' => 'Brükern',
+'group-autoconfirmed' => 'Registriaret brükern',
 'group-bot' => 'Bots',
-'group-sysop' => 'Administratoore',
-'group-bureaucrat' => 'Bürokraate',
+'group-sysop' => 'Administratooren',
+'group-bureaucrat' => 'Bürokraaten',
 'group-suppress' => 'Oversighter',
+'group-all' => '(aaltumaal)',
 
 'group-user-member' => '{{GENDER:$1|brüker}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|gudkäänd brüker}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|registriaret brüker}}',
 'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => '{{GENDER:$1|administraator}}',
 'group-bureaucrat-member' => '{{GENDER:$1|bürokraat}}',
 'group-suppress-member' => '{{GENDER:$1|oversighter}}',
 
-'grouppage-user' => '{{ns:project}}:Brükere',
-'grouppage-autoconfirmed' => '{{ns:project}}:Registriirde brükere',
+'grouppage-user' => '{{ns:project}}:Brükern',
+'grouppage-autoconfirmed' => '{{ns:project}}:Registriaret brükern',
 'grouppage-bot' => '{{ns:project}}:Bots',
-'grouppage-sysop' => '{{ns:project}}:Administratoore',
-'grouppage-bureaucrat' => '{{ns:project}}:Bürokraate',
+'grouppage-sysop' => '{{ns:project}}:Administratooren',
+'grouppage-bureaucrat' => '{{ns:project}}:Bürokraaten',
 'grouppage-suppress' => '{{ns:project}}:Oversighter',
 
 # Rights
+'right-read' => 'Sidjen lees',
+'right-edit' => 'Sidjen bewerke',
+'right-createpage' => 'Sidjen maage (saner diskusjuunssidjen)',
+'right-createtalk' => 'Diskusjuunssidjen maage',
+'right-createaccount' => 'Brükerkonto iinracht',
+'right-minoredit' => 'Feranrangen üs letj kääntiakne',
+'right-move' => 'Sidjen fersküüw',
+'right-move-subpages' => 'Sidjen mä onersidjen fersküüw',
+'right-move-rootuserpages' => 'Hood-brükersidj fersküüw',
+'right-movefile' => 'Dateien fersküüw',
+'right-suppressredirect' => "Bi't fersküüwen nian widjerfeerang iinracht",
+'right-upload' => 'Dateien huuchsjüür',
+'right-reupload' => 'Dateien auerskriiw',
+'right-reupload-own' => 'En datei auerskriiw, diar dü salew huuchsjüürd heest',
+'right-reupload-shared' => 'En datei auerskriiw, diar uun en gemiansoom archiif leit',
+'right-upload_by_url' => 'Dateien faan en URL-adress huuchsjüür',
+'right-purge' => 'Sidjen-cache leesag maage saner efterfraagin',
+'right-autoconfirmed' => 'Hualew-seekert sidjen bewerke',
+'right-bot' => 'Automatisiaret bewerke',
+'right-nominornewtalk' => 'Letj feranrangen üüb diskusjuunssidjen wurd ei üs „nei noorachten“ uunwiset.',
+'right-apihighlimits' => 'Huuger taalen für API-uunfraagen brük',
+'right-writeapi' => 'Write-API brük',
+'right-delete' => 'Sidjen strik',
+'right-bigdelete' => 'Sidjen mä föl wersjuunen strik',
+'right-deleterevision' => 'Enkelt wersjuunen faan en sidj strik of turaghaale',
 'right-sendemail' => 'E-mails tu oudere brükere schake',
 
 # User rights log
@@ -1121,6 +1256,7 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'action-createpage' => 'side mååge',
 'action-createtalk' => 'diskusjoonside mååge',
 'action-createaccount' => 'jüdeer brükerkonto mååge',
+'action-minoredit' => 'detdiar feranrang üs letj kääntiakne',
 'action-move' => 'jüdeer sid ferschüwe',
 'action-move-subpages' => 'jüdeer sid än unerside ferschüwe',
 'action-movefile' => 'jüdeer sid ferschüwe',
@@ -1129,20 +1265,20 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'nchanges' => '$1 {{PLURAL:$1|änring|änringe}}',
 'recentchanges' => 'Leeste änringe',
 'recentchanges-legend' => 'Wis-opsjoone',
-'recentchangestext' => "Üüb detheer sidj könst dü a leetst feranerangen faan '''{{SITENAME}}''' ferfulge.",
+'recentchanges-summary' => "Üüb detdiar sidj könst dü a leetst feranrangen faan't Nuurdfresk Wikipedia ferfulge.",
 'recentchanges-feed-description' => 'Ferfülie ma dåtheer feed da leeste änringe önj {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Nei sidj uunlaanj',
-'recentchanges-label-minor' => 'Letj feranerang',
-'recentchanges-label-bot' => 'Feranerang faan en bot',
-'recentchanges-label-unpatrolled' => 'Detheer feranerang as noch ei efterluket wurden',
+'recentchanges-label-minor' => 'Letj feranrang',
+'recentchanges-label-bot' => 'Feranrang faan en bot',
+'recentchanges-label-unpatrolled' => 'Detdiar feranrang as noch ei efterluket wurden',
 'rcnote' => "Wised {{PLURAL:\$1|wård '''1''' änring|wårde da leeste '''\$''' änringe}} {{PLURAL:\$2|foon e leest däi|foon da leeste '''\$2''' deege}}. Stånd: \$4, am e klook \$5.",
-'rcnotefrom' => "Diar wurd a feranerangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranerangen).",
+'rcnotefrom' => "Diar wurd a feranrangen sant '''$2'''uunwiset (ei muar üs '''$1''' feranrangen).",
 'rclistfrom' => 'Bloot änringe sunt $1 wise.',
 'rcshowhideminor' => 'Latje änringe $1',
 'rcshowhidebots' => 'Bots $1',
 'rcshowhideliu' => 'Önjmäldede brükere $1',
 'rcshowhideanons' => 'Anonymen brüker $1',
-'rcshowhidepatr' => '$1 efterluket feranerangen',
+'rcshowhidepatr' => '$1 efterluket feranrangen',
 'rcshowhidemine' => 'Äine tujeefte $1',
 'rclinks' => 'Wis da leeste $1 änringe foon da leeste $2 deege.<br />$3',
 'diff' => 'ferschääl',
@@ -1151,15 +1287,17 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'show' => 'önjbläne',
 'minoreditletter' => 'L',
 'newpageletter' => 'N',
-'boteditletter' => 'b',
+'boteditletter' => 'B',
 'rc-enhanced-expand' => 'Detaile wise (JavaScript as nüsi)',
 'rc-enhanced-hide' => 'Detaile fersteege',
+'rc-old-title' => 'tuiarst maaget üs „$1“',
 
 # Recent changes linked
-'recentchangeslinked' => 'Änringe bai ferlinkte side',
-'recentchangeslinked-toolbox' => 'Feranerangen bi ferlinkt sidjen',
-'recentchangeslinked-title' => 'Änringe bai side, da foon "$1" ferlinked san',
-'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferwiset sidjen ei feranert wurden.',
+'recentchangeslinked' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-feed' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-toolbox' => 'Feranrangen bi ferlinket sidjen',
+'recentchangeslinked-title' => 'Feranrangen bi sidjen, diar faan "$1" ferlinket san',
+'recentchangeslinked-noresult' => 'Uun detdiar tidj san jo ferlinket sidjen ei feranert wurden.',
 'recentchangeslinked-summary' => "Jüdeer speetsjoolsid listet da leeste änringe bai da ferlinked side ap (btw. bai kategoriie tu da lasmoote foon jüdeer kategorii). Side aw din [[Special:Watchlist|eefterkiikliste]] san '''fåt''' deerstald.",
 'recentchangeslinked-page' => 'Sid:',
 'recentchangeslinked-to' => 'Wis änringe aw side, da heerjurt ferlinke',
@@ -1206,7 +1344,7 @@ Det beskriiwang faan't [$2 beskriiwangssidj] woort oner uunwiset.",
 'randompage' => 'Tufali sid',
 
 # Statistics
-'statistics' => 'Statistiik',
+'statistics' => 'Statistik',
 
 'disambiguationspage' => 'Template:Muardüüdag artiikel',
 
@@ -1288,15 +1426,28 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
 
 # Delete
 'deletepage' => 'Sid tunintemååge',
+'exblank' => 'sidj wiar leesag',
+'delete-confirm' => 'Strik "$1"',
 'delete-legend' => 'Strike',
+'historywarning' => "'''Paase üüb:''' Det sidj, wat dü strik wel, hää amanbi $1 {{PLURAL:$1|wersjuun|wersjuunen}}:",
 'confirmdeletetext' => 'Dü bast deerbai, en sid ma åle tuhiirende ålere färsjoone tuninte tu måågen. Bestääsie hål deertu, dåt dü de foon da konsekwänse bewust bast, än dåt dü önj oueriinjstiming ma da [[{{MediaWiki:Policy-url}}|ruchtliinjen]] hoonelst.',
 'actioncomplete' => 'Aksjoon beånd',
 'actionfailed' => 'Diar ging wat skiaf',
 'deletedtext' => '„$1“ wörd tunintemååged. In e $2 fanst dü en list foon da tuleest tunintemåågede side.',
 'dellogpage' => 'Tunintemååg-Logbök',
+'dellogpagetext' => 'Diar stun a leetst stregen sidjen an datein.',
+'deletionlog' => "logbuk faan't striken",
+'reverted' => 'Tu en ual wersjuun turagsaat',
 'deletecomment' => 'Grün:',
 'deleteotherreason' => 'Ouderen/tubaikaamenden grün:',
 'deletereasonotherlist' => 'Ouderen grün',
+'deletereason-dropdown' => "*Algemian grünjer för't striken
+** Di skriiwer wul det so
+** Copyright as ei beaachtet
+** Wandaalen onerwais",
+'delete-edit-reasonlist' => "Grünjer för't striken bewerke",
+'delete-toobig' => 'Detdiar sidj hää muar üs $1 {{PLURAL:$1|wersjuun|wersjuunen}} . Sok sidjen kön ei so gau stregen wurd, ööders san a servers plaat.',
+'delete-warning-toobig' => "Detdiar sidj hää muar üs $1 {{PLURAL:$1|wersjuun|wersjuunen}} . Det striken koon komer maage bi't dootenbeenk.",
 
 # Rollback
 'rollbacklink' => 'tubäägseete',
@@ -1305,6 +1456,7 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
 'protectlogpage' => 'Sideschütse-logbök',
 'protectedarticle' => 'schütsed „[[$1]]“',
 'modifiedarticleprotection' => 'änred e schüts for "[[$1]]"',
+'prot_1movedto2' => 'hää „[[$1]]“ efter „[[$2]]“ fersköwen',
 'protectcomment' => 'Grün:',
 'protectexpiry' => 'Spärduur:',
 'protect_expiry_invalid' => 'Jü önjjääwen duur as üngülti.',
@@ -1322,10 +1474,68 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
 'protect-cantedit' => 'Dü koost jü späre foon jüheer sid ai änre, deer dü niinj beruchtiging tu beårben foon jü sid hääst.',
 'restriction-type' => 'Schütsstatus',
 'restriction-level' => 'Schütshöögde',
+'minimum-size' => 'Minimaal grate:',
+'maximum-size' => 'Maksimaal grate:',
+'pagesize' => '(bytes)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Bewerke',
+'restriction-move' => 'Fersküüw',
+'restriction-create' => 'Maage',
+'restriction-upload' => 'Huuchsjüür',
+
+# Restriction levels
+'restriction-level-sysop' => 'seekert (bluas för administratooren)',
+'restriction-level-autoconfirmed' => 'hualew-seekert (bluas för gudkäänd brükern)',
+'restriction-level-all' => 'aaltumaal',
 
 # Undelete
+'undelete' => 'Stregen sidjen uunwise',
+'undeletepage' => 'Stregen sidjen uunwise an weder iinstel',
+'undeletepagetitle' => "'''Detdiar wiset a stregen wersjuunen faan [[:$1|$1]]'''.",
+'viewdeletedpage' => 'Stregen sidjen uunwise',
+'undeletepagetext' => "{{PLURAL:$1|Detdiar sidj as stregen wurden, oober koon|Jodiar $1 sidjen san stregen wurden, oober kön}} faan administratooren weder iinsteld wurd, wan jo noch uun't archiif san.",
+'undelete-fieldset-title' => 'Weder iinstel',
+'undeleteextrahelp' => '* Am det sidj mä aal jo wersjuunen weder iintustelen, sjük nian enkelt wersjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.*
+* Am en was wersjuun weder iintustelen, sjük det wersjuun ütj, du en grünj uun an trak do üüb „{{int:undeletebtn}}“.',
+'undeleterevisions' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} archiwiaret',
+'undeletehistory' => 'Wan dü detdiar sidj weder iinstelst, wurd uk jo ual wersjuunen weder iinsteld. 
+Wan sant det striken en nei sidj mä di salew nööm iinsteld wurden as, wurd jo ual wersjuunen bi det nei sidj mä iinwerket.',
+'undeleterevdel' => 'Det weder iinstelen woort ei maaget, wan det leetst wersjuun ferstäächt as.
+Wan det so as, skal det leetst wersjuun iarst weder üüb normool steld wurd.',
+'undeletehistorynoadmin' => 'Detdiar sidj as stregen wurden.
+Oner könst dü sä, hoker det maaget hää an huaram.
+Di tekst faan det stregen sidj fu bluas administratooren uunwiset.',
+'undelete-revision' => 'Stregen wersjuun faan $1 (di $4 am a klook $5 ), $3:',
+'undeleterevision-missing' => 'Mä detdiar wersjuun stemet wat ei. Ferlicht as di link ferkiard of det wersjuun as ei muar diar.',
+'undelete-nodiff' => 'Nian föörgunger wersjuun diar.',
+'undeletebtn' => 'Weder iinstel',
 'undeletelink' => 'wise/widermååge',
 'undeleteviewlink' => 'Uunluke',
+'undeletereset' => 'Turag saat',
+'undeleteinvert' => 'Ütjwool amdrei',
+'undeletecomment' => 'Grünj:',
+'undeletedrevisions' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} weder iinsteld',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 wersjuun|$1 wersjuunen}} an {{PLURAL:$2|1 datei|$2 datein}} weder iinsteld',
+'undeletedfiles' => '{{PLURAL:$1|1 datei|$1 datein }} weder iinsteld',
+'cannotundelete' => 'Weder iinstelen hää ei loket; ferlicht hää hoker ööders det al weder iinsteld.',
+'undeletedpage' => "'''„$1“''' as weder iinsteld wurden.
+Uun't [[Special:Log/delete|logbuk faan stregen sidjen]] stun a stregen an weder iinsteld sidjen.",
+'undelete-header' => "Luke uun't [[Special:Log/delete|logbuk för stregen sidjen]] efter stregen sidjen faan a leetst tidj.",
+'undelete-search-title' => 'Sjük stregen sidjen',
+'undelete-search-box' => 'Sjük stregen sidjen',
+'undelete-search-prefix' => 'Sjük sidjen, diar began mä:',
+'undelete-search-submit' => 'Sjük',
+'undelete-no-results' => "Uun't archiif wiar nian paasen sidjen.",
+'undelete-filename-mismatch' => 'Det wersjuun faan $1 koon ei weder iinsteld wurd. Di dateinööm paaset ei.',
+'undelete-bad-store-key' => "Det dateiwersjuun faan $1 koon ei weder iinsteld wurd. Det datei wiar al föör't striken ei muar diar.",
+'undelete-error' => "Bi't weder iinstelen faan det sidj as wat skiaf gingen.",
+'undelete-error-short' => "Bi't weder iinstelen faan det datei $1 as wat skiaf gingen.",
+'undelete-error-long' => "Bi't weder iinstelen faan en datei as wat skiaf gingen:
+
+$1",
+'undelete-show-file-confirm' => 'Wel dü würelk det stregen wersjuun faan det datei „<nowiki>$1</nowiki>“ faan di $2, am a klook $3 uunluke?',
+'undelete-show-file-submit' => 'Ja',
 
 # Namespace form on various pages
 'namespace' => 'Noomerüm:',
@@ -1372,6 +1582,7 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
 # Block/unblock
 'blockip' => 'IP-adräs/brüker späre',
 'ipboptions' => '2 stüne:2 hours,1 däi:1 day,3 deege:3 days,1 wääg:1 week,2 wääge:2 weeks,1 moune:1 month,3 moune:3 months,6 moune:6 months,1 iir:1 year,suner iinje:infinite',
+'unblocked-id' => 'Sperang $1 as apheewen',
 'blocklist' => 'Spärd brükere',
 'ipblocklist' => 'Spärd brükere',
 'ipblocklist-legend' => 'Spärd brükere fine',
@@ -1385,9 +1596,9 @@ Wan dü jü sid wider foon din eefterkiikliste wächhååle mååst, klik aw jü
 'blocklogpage' => 'Brükerspär-logbök',
 'blocklogentry' => 'spärd „[[$1]]“ for di tidrüm: $2 $3',
 'reblock-logentry' => 'änerd jü spär for „[[$1]]“ for di tidrüm: $2 $3',
-'blocklogtext' => 'Dåtdeer as dåt logbök ouer späringe än önjtspäringe foon brükere än IP-adräse.
-Automatisch spärd IP-adräse wårde ai footed.
-Sii jü [[Special:BlockList|list foon da spärd IP-adräse än brükernoome]] for ål da aktive späre.',
+'blocklogtext' => "Detdiar as det logbuk auer sperangen an apheewen sperangen faan brükernöömer an IP-adresen.
+Automaatisk sperd IP-adresen wurd ei uunwiset.
+Luke bi't [[Special:BlockList|sperlist]] för aal jo aktuel speren.",
 'unblocklogentry' => 'heet jü späre foon „$1“ aphääwen',
 'block-log-flags-anononly' => 'bloot anonyme',
 'block-log-flags-nocreate' => 'Måågen foon brükerkonte spärd',
@@ -1435,6 +1646,9 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
 'talkexists' => 'Jü sid seelew wörd erfolchrik ferschääwen, ouers jü deertu hiirende diskusjoonssid ai, deer ål iinj ma di nai tiitel bestoont. Glik hål da önjhålte foon hönj ouf.',
 'movedto' => 'ferschääwen eefter',
 'movetalk' => 'Jü diskusjoonssid maferschüwe, wan möölik',
+'movepage-page-moved' => 'Det sidj $1 as efter $2 fersköwen wurden.',
+'movepage-page-unmoved' => 'Det sidj $1 küd ei efter $2 fersköwen wurd.',
+'movepage-max-pages' => 'Diar kön ei muar üs {{PLURAL:$1|sidj|sidjen}} fersköwen wurd. Muar sidjen kön ei automaatisk fersköwen wurd.',
 'movelogpage' => 'Ferschüwingslogbök',
 'movereason' => 'Begrüning:',
 'revertmove' => 'tubääg ferschüwe',
@@ -1505,7 +1719,7 @@ Hål di '''naie''' tiitel uner '''muul''' önjdreege, deeruner jü ambenååming
 'tooltip-ca-nstab-help' => 'Heelpsid wise',
 'tooltip-ca-nstab-category' => 'Kategoriisid wise',
 'tooltip-minoredit' => 'Jüdeer änring as latj markiire.',
-'tooltip-save' => 'Änringe spikre',
+'tooltip-save' => 'Feranerangen seekre',
 'tooltip-preview' => 'Forlök foon da änringe bai jüdeer sid. Hål for dåt spikern brüke!',
 'tooltip-diff' => 'Änringe bai di täkst wise',
 'tooltip-compareselectedversions' => 'Ferschääl twasche tou ütwäälde färsjoone foon jüdeer sid wise.',
@@ -1560,11 +1774,15 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'monthsall' => 'åle',
 'limitall' => 'åle',
 
+# Table pager
+'ascending_abbrev' => 'ap',
+'descending_abbrev' => 'deel',
+
 # Auto-summaries
-'autosumm-blank' => 'Det sidj wurd leesagd.',
-'autosumm-replace' => 'Di iinhual wurd ütjbütjet mä "$1"',
+'autosumm-blank' => 'Det sidj as leesag maaget wurden.',
+'autosumm-replace' => 'Di tekst as ütjbütjet wurden mä "$1"',
 'autoredircomment' => 'Sidj tu [[$1]] widjerfeerd',
-'autosumm-new' => 'Det sidj wurd nei uunlaanj: "$1"',
+'autosumm-new' => 'Det sidj as nei uunlaanj wurden: "$1"',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Eefterkiiklist: änringe',
@@ -1599,9 +1817,35 @@ Deeraw föliende sidelinke önj dåtseelwi ra definiire ütnååme, önj di kont
 'htmlform-selectorother-other' => 'Oudere',
 
 # New logging system
+'logentry-delete-delete' => '$1 hää det sidj $3 stregen',
+'logentry-delete-restore' => '$1 hää det sidj $3 weder iinsteld',
+'logentry-delete-event' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-delete-revision' => '$1 hää det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-delete-event-legacy' => '$1 hää det uunlukin feranert faan logbuk iindracher üüb $3',
+'logentry-delete-revision-legacy' => '$1 hää det uunlukin feranert faan wersjuunen faan det sidj $3',
+'logentry-suppress-delete' => '$1 hää det sidj $3 wechtrakt',
+'logentry-suppress-event' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4',
+'logentry-suppress-revision' => '$1 hää stalswigin det uunlukin feranert faan {{PLURAL:$5|ian wersjuun|$5 wersjuunen}} faan det sidj $3: $4',
+'logentry-suppress-event-legacy' => '$1 hää stalswigin det uunlukin fernanert faan logbuk iindracher üüb $3',
+'logentry-suppress-revision-legacy' => '$1 hää stalswigin det uunlukin feranert faan wersjuunen faan det sidj $3',
 'revdelete-uname-hid' => 'brükernoome ferstäägen',
 'revdelete-uname-unhid' => 'brükernoome frijääwen',
 'revdelete-restricted' => 'gränse jüle uk for administratoore',
 'revdelete-unrestricted' => 'gränse for administratoore wächnümen',
+'logentry-move-move' => '$1 hää det sidj $3 efter $4 fersköwen.',
+'logentry-move-move-noredirect' => '$1 hää det sidj $3 efter $4 saner widjerfeerang fersköwen.',
+'logentry-move-move_redir' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen.',
+'logentry-move-move_redir-noredirect' => '$1 hää det sidj $3 efter $4 fersköwen an diarbi en widjerfeerang auerskrewen saner salew en widjerfeerang uuntuleien.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minüüt|minüüten}}',
+'duration-hours' => '$1 {{PLURAL:$1|stünj|stünjen}}',
+'duration-days' => '$1 {{PLURAL:$1|dai|daar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|weg|wegen}}',
+'duration-years' => '$1 {{PLURAL:$1|juar|juaren}}',
+'duration-decades' => '$1 {{PLURAL:$1|juartjiint|juartjiinten}}',
+'duration-centuries' => '$1 {{PLURAL:$1|juarhunert|juarhunerten}}',
+'duration-millennia' => '$1 {{PLURAL:$1|juardüüsen|juardüüsenen}}',
 
 );
index b35d8dc..2fe2c25 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Friulian (Furlan)
+/** Friulian (furlan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author Klenje
  * @author MF-Warburg
+ * @author Reedy
  * @author Urhixidur
  * @author לערי ריינהארט
  */
@@ -646,7 +647,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 
 # Diffs
 'history-title' => 'Storic dai cambiaments di "$1"',
-'difference' => '(Difarence jenfri des revisions)',
 'lineno' => 'Rie $1:',
 'compareselectedversions' => 'Confronte versions selezionadis',
 'editundo' => 'anule',
@@ -831,7 +831,7 @@ La tô direzion di pueste no ven mostrade cuant che i utents ti contatin.',
 'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
 'recentchanges' => 'Ultins cambiaments',
 'recentchanges-legend' => 'Opzions dai ultins cambiaments',
-'recentchangestext' => 'Cheste pagjine e mostre i plui recents cambiaments inte {{SITENAME}}.',
+'recentchanges-summary' => 'Cheste pagjine e mostre i plui recents cambiaments inte {{SITENAME}}.',
 'recentchanges-feed-description' => 'Chest canâl al ripuarte i cambiaments plui recents ai contignûts di cheste wiki.',
 'recentchanges-label-newpage' => 'Chest cambiament al à creât une gnove pagjine',
 'recentchanges-label-minor' => 'Chest al è un piçul cambiament',
@@ -1350,7 +1350,7 @@ tu âs di cognossi lis conseguencis prime di lâ indevant.",
 In chescj câs, tu varâs di movi o unî a man lis informazions contignudis te pagjine di discussion, se tu lu desideris.",
 'movearticle' => 'Môf la vôs',
 'movenologin' => 'No tu sês jentrât',
-'movenologintext' => 'Tu âs di jessi un utent regjistrât e <a href="{{localurl:Special:UserLogin}}">jentrât</a> par movi une pagjine.',
+'movenologintext' => 'Tu âs di jessi un utent regjistrât e [[Special:UserLogin|jentrât]] par movi une pagjine.',
 'movenotallowed' => 'No tu âs i permès che a coventin par movi lis pagjinis.',
 'newtitle' => 'Al gnûf titul',
 'move-watch' => 'Ten di voli cheste pagjine',
index bf97e2c..8e3c271 100644 (file)
@@ -897,7 +897,6 @@ Tink derom it brûken fan de navigaasjeferwizings dy kolom op'e nij ynstelt.",
 
 # Diffs
 'history-title' => 'Sideskiednis fan "$1"',
-'difference' => '(Ferskil tusken ferzjes)',
 'lineno' => 'Rigel $1:',
 'compareselectedversions' => 'Ferlykje selektearre ferzjes',
 'showhideselectedversions' => 'Oantikke ferzjes wol/net sjen litte',
@@ -1207,7 +1206,7 @@ Jo kinne ek oaren de mûglikheid jaan kontakt mei jo op te nimmen troch in ferwi
 'nchanges' => '$1 {{PLURAL:$1|bewurking|bewurkings}}',
 'recentchanges' => 'Koartlyn feroare',
 'recentchanges-legend' => 'Opsjes foar resinte feroarings',
-'recentchangestext' => 'De lêste feroarings fan de {{SITENAME}}.',
+'recentchanges-summary' => 'De lêste feroarings fan de {{SITENAME}}.',
 'recentchanges-feed-description' => 'Mei dizze feed kinne jo de nijste feroarings yn dizze wiki besjen.',
 'recentchanges-label-newpage' => 'Mei dizze wiziging is in nije side makke',
 'recentchanges-label-minor' => 'Dit is in tekstwiziging',
index 43269f3..3e333dc 100644 (file)
@@ -14,6 +14,7 @@
  * @author Kwekubo
  * @author Moilleadóir
  * @author Moydow
+ * @author Reedy
  * @author Spacebirdy
  * @author Stifle
  * @author Tameamseo
@@ -758,7 +759,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 
 # Diffs
 'history-title' => 'Stair leasú "$1"',
-'difference' => '(Difríochtaí idir leaganacha)',
 'lineno' => 'Líne $1:',
 'compareselectedversions' => 'Cuir na leagain roghnaithe i gcomparáid',
 'editundo' => 'cealaigh',
@@ -955,7 +955,7 @@ do chuid dreachtaí a chur i leith tusa.',
 'nchanges' => '{{PLURAL:$1|Athrú amháin|$1 athruithe}}',
 'recentchanges' => 'Athruithe is déanaí',
 'recentchanges-legend' => 'Roghanna do na hathruithe is déanaí',
-'recentchangestext' => 'Déan faire ar na hathruithe is déanaí sa vicí ar an leathanach seo.',
+'recentchanges-summary' => 'Déan faire ar na hathruithe is déanaí sa vicí ar an leathanach seo.',
 'recentchanges-feed-description' => 'Rianaigh na n-athruite vicí is déanaí sa fotha seo.',
 'recentchanges-label-bot' => 'Chomhlíon róbó an t-athrú seo',
 'rcnote' => "Is {{PLURAL:$1|é seo a leanas <strong>an t-athrú amháin</strong>|iad seo a leanas na <strong>$1</strong> athruithe is déanaí}} {{PLURAL:$2|ar feadh an lae dheireanaigh|ar feadh na '''$2''' lá deireanacha}}, as $5, $4.",
@@ -1590,7 +1590,7 @@ Tá dualgas ort bheith cinnte go rachaidh na naisc chuig an áit is ceart.
 Tabhair faoi deara '''nach''' n-athainmneofar an leathanach má tá leathanach ann cheana féin faoin teideal nua, ach amháin más folamh nó atreorú é nó mura bhfuil aon stair athraithe aige cheana.
 Mar sin, is féidir leathanach a athainmniú ar ais chuig an teideal a raibh air roimhe má tá botún déanta agat, agus ní féidir leathanach atá ann cheana a fhorscríobh.
 
-<font color=\"red\">'''Rabhadh!'''</font>
+'''Rabhadh!'''
 Is féidir gur dianbheart gan choinne é athrú a dhéanamh ar leathanach móréilimh;
 cinntigh go dtuigeann tú na hiarmhairtí go léir roimh dul ar aghaigh.",
 'movepagetalktext' => "Aistreofar an leathanach plé go huathoibríoch '''ach ní tharlófar sin''':
index 5b0aac5..fd490b0 100644 (file)
@@ -310,7 +310,7 @@ $messages = array(
 
 'ok' => 'TAMAN',
 'retrievedfrom' => 'Alındı "$1"dän',
-'youhavenewmessages' => 'Var eni <u>$1</u>. ($2)',
+'youhavenewmessages' => 'Var eni $1 ($2).',
 'newmessageslink' => 'eni mesajlar',
 'newmessagesdifflink' => 'Bitki diişmäk',
 'youhavenewmessagesmulti' => "$1'de eni mesajınız var.",
@@ -498,11 +498,11 @@ Bu başlıı [[Special:Search/{{PAGENAME}}|var nicä aramaa]] übür sayfalarda
 'yourtext' => 'Sizin tekstiniz',
 'storedversion' => 'Saklanmış tekst',
 'yourdiff' => 'Farklar',
-'copyrightwarning' => "'''Bakınız:''' {{SITENAME}} saytına yapılan hepsi eklemäkler hem diişmäkler läazım olsun  <i>$2</i>
+'copyrightwarning' => "'''Bakınız:''' {{SITENAME}} saytına yapılan hepsi eklemäkler hem diişmäkler läazım olsun $2
 lițenziyası şartları içindä (detallar için $1'a bakınız).
 Herliim istemeersiniz ani sizin tekstlär serbest yayılsın hem diiştirilsin übür kullanıcılar tarafınnan, onnarı erleştirmeyniz buraya.<br />
 Hem siz garantiyada bulunêrsiniz ani eklemäklerin avtorusunuz, yaki onnarı kopiya ettiniz kaynaktan angısı izin verer teksti serbest yaymaa hem diiştirmää.<br />
-'''<center>AVTORLUK KORUNMAK HAKKILAN KORUNMAYAN MATERİALLAR EKLEMEYNİZ!</center>'''",
+'''AVTORLUK KORUNMAK HAKKILAN KORUNMAYAN MATERİALLAR EKLEMEYNİZ!'''",
 'templatesused' => 'Bu sayfada kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
 'templatesusedpreview' => '{{PLURAL:$1|Şablon|Şablonnar}} ani bu ön siirdä kullanıldı:',
 'templatesusedsection' => 'Bu bölümde kullanılan {{PLURAL:$1|şablon|şablonlar}}:',
@@ -564,7 +564,6 @@ Nışannar: (bitki) = şindiki versiyalan aradaki fark,
 
 # Diffs
 'history-title' => '"$1" yapraın istoriyası',
-'difference' => '(Versiyalar arası farklar)',
 'lineno' => '$1. liniya:',
 'compareselectedversions' => 'Karşılaştır versiyaları ani seçildi',
 'editundo' => 'geeri al',
index a30eff2..f9ea105 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Simplified Gan script (‪赣语(简体)‬)
+/** Simplified Gan script (‪赣语(简体)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -16,6 +16,7 @@
  * @author Symane
  * @author Urhixidur
  * @author Vipuser
+ * @author Xiaomingyan
  */
 
 $fallback = 'zh-hans';
@@ -724,7 +725,6 @@ $2',
 
 # Diffs
 'history-title' => '历史版本𠮶 "$1"',
-'difference' => '(修改之间差异)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比较拣正𠮶版本',
 'editundo' => '还原',
@@ -888,7 +888,7 @@ $2',
 'nchanges' => '$1道改动',
 'recentchanges' => '最晏𠮶改动',
 'recentchanges-legend' => '个朝子𠮶更改选项',
-'recentchangestext' => '跟到个只wiki上𠮶最新改动。',
+'recentchanges-summary' => '跟到个只wiki上𠮶最新改动。',
 'recentchanges-feed-description' => '跟到个只 wiki 上集合𠮶最后改动。',
 'recentchanges-label-newpage' => '个只编辑会建立只新页',
 'recentchanges-label-minor' => '个系只细修改',
@@ -1075,7 +1075,7 @@ $2',
 ** 档案重复',
 
 # MIME search
-'mimesearch' => 'MIME 搜索',
+'mimesearch' => 'MIME搜索',
 'mimesearch-summary' => '个只页面启用档案MIME类型筛检程式。输入:内容类型/子类型,像 <tt>image/jpeg</tt>。',
 'mimetype' => 'MIME 类型:',
 'download' => '下载',
index 241d7a2..c50da29 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Traditional Gan script (‪贛語(繁體)‬)
+/** Traditional Gan script (‪贛語(繁體)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -747,7 +747,6 @@ $2',
 
 # Diffs
 'history-title' => '歷史版本嗰 "$1"',
-'difference' => '(修改之間差異)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '對比揀正嗰版本',
 'editundo' => '還原',
@@ -911,7 +910,7 @@ $2',
 'nchanges' => '$1道改動',
 'recentchanges' => '最晏嗰改動',
 'recentchanges-legend' => '箇晝子嗰更改選項',
-'recentchangestext' => '跟到箇隻wiki上嗰最新改動。',
+'recentchanges-summary' => '跟到箇隻wiki上嗰最新改動。',
 'recentchanges-feed-description' => '跟到箇隻 wiki 上集合嗰最後改動。',
 'recentchanges-label-newpage' => '箇隻編輯會建立隻新頁',
 'recentchanges-label-minor' => '箇係隻細修改',
index 50f7cd2..8d25e60 100644 (file)
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Meadhan',
+       NS_SPECIAL          => 'Sònraichte',
+       NS_TALK             => 'Deasbaireachd',
+       NS_USER             => 'Cleachdaiche',
+       NS_USER_TALK        => 'Deasbaireachd_a\'_chleachdaiche',
+       NS_PROJECT_TALK     => 'An_deasbaireachd_aig_$1',
+       NS_FILE             => 'Faidhle',
+       NS_FILE_TALK        => 'Deasbaireachd_an_fhaidhle',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Deasbaireachd_MediaWiki',
+       NS_TEMPLATE         => 'Teamplaid',
+       NS_TEMPLATE_TALK    => 'Deasbaireachd_na_teamplaid',
+       NS_HELP             => 'Cobhair',
+       NS_HELP_TALK        => 'Deasbaireachd_na_cobharach',
+       NS_CATEGORY         => 'Roinn-seòrsa',
+       NS_CATEGORY_TALK    => 'Deasbaireachd_na_roinn-seòrsa',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Fo-loidhneadh nan ceanglaichean:',
@@ -599,7 +618,7 @@ no [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</spa
 no <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span>.',
 'updated' => '(Air ùrachadh)',
 'previewnote' => "'''Cuimhnich nach eil ann ach ro-shealladh.'''
-Cha deach na mùthaidhean agad a shàbhaladh fhathast! [[#editform|→ Lean ort a' deasachadh]]",
+Cha deach na mùthaidhean agad a shàbhaladh fhathast!",
 'editing' => "A' deasachadh $1",
 'editingsection' => "A' deasachadh $1 (earrann)",
 'editconflict' => 'Còmhstri deasachaidh: $1',
@@ -677,8 +696,7 @@ Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, ''
 'revertmerge' => 'Dì-aontaich',
 
 # Diffs
-'history-title' => 'Eachdraidh nam mùthaidhean de "$1"',
-'difference' => '(An diofar eadar na mùthaidhean)',
+'history-title' => 'Eachdraidh nam mùthaidhean aig "$1"',
 'lineno' => 'Loidhne $1:',
 'compareselectedversions' => 'Dèan coimeas eadar na mùthaidhean a thagh thu',
 'editundo' => 'neo-dhèan',
@@ -778,7 +796,7 @@ Chan fhaicear an seòladh fhèin nuair a chuireas cuideigin post-dealain thugad.
 'nchanges' => '{{PLURAL:$1|mhùthadh|mhùthadh|mhùthadh|mhùthadh|mùthaidhean|mùthadh}}',
 'recentchanges' => 'Mùthaidhean ùra',
 'recentchanges-legend' => 'Roghainnean nam mùthaidhean ùra',
-'recentchangestext' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.',
+'recentchanges-summary' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici air an duilleag seo.',
 'recentchanges-feed-description' => 'Cum sùil air na mùthaidhean as ùire a nithear air an uici seo san inbhir seo.',
 'recentchanges-label-newpage' => 'Chruthaich thu duilleag ùr leis a sin',
 'recentchanges-label-minor' => 'Seo mùthadh beag',
index 69a717b..5c465c6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Galician (Galego)
+/** Galician (galego)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -167,8 +167,8 @@ $magicWords = array(
        'notoc'                   => array( '0', '__SENÍNDICE__', '__SEMTDC__', '__SEMSUMÁRIO__', '__NOTOC__' ),
        'nogallery'               => array( '0', '__SENGALERÍA__', '__SEMGALERIA__', '__NOGALLERY__' ),
        'forcetoc'                => array( '0', '__FORZAROÍNDICE__', '__FORCARTDC__', '__FORCARSUMARIO__', '__FORÇARTDC__', '__FORÇARSUMÁRIO__', '__FORCETOC__' ),
-       'toc'                     => array( '0', '__ÍNDICE__', '__TDC__', '__SUMÁRIO__', '__TOC__' ),
-       'noeditsection'           => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NOEDITSECTION__' ),
+       'toc'                     => array( '0', '__ÍNDICE__', '__TDC__', '__SUMÁRIO__', '__SUMARIO__', '__TOC__' ),
+       'noeditsection'           => array( '0', '__SECCIÓNSNONEDITABLES__', '__NÃOEDITARSEÇÃO__', '__SEMEDITARSEÇÃO__', '__NAOEDITARSECAO__', '__SEMEDITARSECAO__', '__NOEDITSECTION__' ),
        'noheader'                => array( '0', '___SENCABECEIRA__', '__SEMCABECALHO__', '__SEMCABEÇALHO__', '__SEMTITULO__', '__SEMTÍTULO__', '__NOHEADER__' ),
        'currentmonth'            => array( '1', 'MESACTUAL', 'MESATUAL', 'MESATUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'           => array( '1', 'MESACTUAL1', 'MESATUAL1', 'CURRENTMONTH1' ),
@@ -212,6 +212,7 @@ $magicWords = array(
        'language'                => array( '0', '#LINGUA:', '#IDIOMA:', '#LANGUAGE:' ),
        'numberofadmins'          => array( '1', 'NÚMERODEADMINISTRADORES', 'NUMERODEADMINISTRADORES', 'NUMBEROFADMINS' ),
        'special'                 => array( '0', 'especial', 'special' ),
+       'defaultsort'             => array( '1', 'ORDENAR:', 'ORDENACAOPADRAO', 'ORDENAÇÃOPADRÃO', 'ORDEMPADRAO', 'ORDEMPADRÃO', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'tag'                     => array( '0', 'etiqueta', 'tag' ),
        'hiddencat'               => array( '1', '__CATEGORÍAOCULTA__', '__CATEGORIAOCULTA__', '__CATOCULTA__', '__HIDDENCAT__' ),
        'pagesincategory'         => array( '1', 'PÁXINASNACATEGORÍA', 'PAGINASNACATEGORIA', 'PÁGINASNACATEGORIA', 'PAGINASNACAT', 'PÁGINASNACAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
@@ -228,7 +229,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Agochar as edicións patrulladas nos cambios recentes',
 'tog-newpageshidepatrolled' => 'Agochar as páxinas revisadas da lista de páxinas novas',
 'tog-extendwatchlist' => 'Expandir a lista de vixilancia para mostrar todos os cambios e non só os máis recentes',
-'tog-usenewrc' => 'Usar os cambios recentes avanzados (cómpre JavaScript)',
+'tog-usenewrc' => 'Agrupar as modificacións por páxina nos cambios recentes e na lista de vixilancia (cómpre JavaScript)',
 'tog-numberheadings' => 'Numerar automaticamente as cabeceiras',
 'tog-showtoolbar' => 'Mostrar a caixa de ferramentas de edición (cómpre JavaScript)',
 'tog-editondblclick' => 'Editar as páxinas logo de facer dobre clic (cómpre JavaScript)',
@@ -612,6 +613,10 @@ O motivo achegado é ''$2''.",
 'filereadonlyerror' => 'Non se puido modificar o ficheiro "$1" porque o repositorio "$2" está en modo de só lectura.
 
 O administrador que bloqueou o repositorio achegou este motivo: "$3".',
+'invalidtitle-knownnamespace' => 'Título inválido co espazo de nomes "$2" e o texto "$3"',
+'invalidtitle-unknownnamespace' => 'Título inválido cun número de espazo de nomes, $1, descoñecido e o texto "$2"',
+'exception-nologin' => 'Non accedeu ao sistema',
+'exception-nologin-text' => 'Esta páxina ou acción necesita que vostede acceda ao sistema neste wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Configuración errónea: escáner de virus descoñecido: ''$1''",
@@ -914,7 +919,8 @@ Velaquí está a última entrada do rexistro de bloqueos, por se quere consultal
 Lembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo {{ns:user}}:Foo/vector.css no canto de {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!''' [[#editform|→ Continuar editando]]",
+'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
+'continue-editing' => 'Continuar editando',
 'previewconflict' => 'Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.',
 'session_fail_preview' => "'''O sistema non pode procesar a súa edición porque se perderon os datos de inicio da sesión.
 Por favor, inténteo de novo.
@@ -1010,8 +1016,14 @@ Algúns modelos non se incluirán.",
 Estes argumentos foron omitidos.",
 'post-expand-template-argument-category' => 'Páxinas que conteñen argumentos de modelo 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)',
+'parser-template-recursion-depth-warning' => 'Excedeuse o límite de profundidade de recursión 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',
+'parser-unstrip-loop-warning' => 'Detectouse un bucle inamovible',
+'parser-unstrip-recursion-limit' => 'Excedeuse o límite de recursión inamovible ($1)',
 
 # "Undo" feature
 'undo-success' => 'A edición pódese desfacer.
@@ -1156,7 +1168,7 @@ Por favor, comprobe os rexistros.',
 # Suppression log
 'suppressionlog' => 'Rexistro de supresións',
 'suppressionlogtext' => 'A continuación móstrase unha lista coas eliminacións e cos bloqueos recentes, que inclúen contido oculto dos administradores.
-Vexa a [[Special:BlockList|lista de enderezos IP bloqueados]] para comprobar as prohibicións e os bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
 
 # History merging
 'mergehistory' => 'Fusionar os historiais das páxinas',
@@ -1189,7 +1201,8 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 
 # Diffs
 'history-title' => 'Historial de revisións de "$1"',
-'difference' => '(Diferenzas entre revisións)',
+'difference-title' => 'Diferenzas entre revisións de "$1"',
+'difference-title-multipage' => 'Diferenzas entre as páxinas "$1" e "$2"',
 'difference-multipage' => '(Diferenzas entre páxinas)',
 'lineno' => 'Liña $1:',
 'compareselectedversions' => 'Comparar as versións seleccionadas',
@@ -1211,8 +1224,8 @@ Asegúrese de que esta modificación da páxina mantén a continuidade históric
 'notextmatches' => 'Non se atopou o texto en ningunha páxina',
 'prevn' => '{{PLURAL:$1|$1}} previas',
 'nextn' => '{{PLURAL:$1|$1}} seguintes',
-'prevn-title' => '$1 {{PLURAL:$1|resultado previo|resultados previos}}',
-'nextn-title' => '$1 {{PLURAL:$1|resultado seguinte|resultados seguintes}}',
+'prevn-title' => '{{PLURAL:$1|O resultado anterior|Os anteriores $1 resultados}}',
+'nextn-title' => '{{PLURAL:$1|O seguinte resultado|Os seguintes $1 resultados}}',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por páxina',
 'viewprevnext' => 'Ver as ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Opcións de busca',
@@ -1287,6 +1300,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'prefs-beta' => 'Características en probas',
 'prefs-datetime' => 'Data e hora',
 'prefs-labs' => 'Características experimentais',
+'prefs-user-pages' => 'Páxinas de usuario',
 'prefs-personal' => 'Información do usuario',
 'prefs-rc' => 'Cambios recentes',
 'prefs-watchlist' => 'Lista de vixilancia',
@@ -1297,7 +1311,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'prefs-watchlist-token' => 'Pase para a lista de vixilancia:',
 'prefs-misc' => 'Preferencias varias',
 'prefs-resetpass' => 'Cambiar o contrasinal',
-'prefs-changeemail' => 'Cambiar o correo electrónico',
+'prefs-changeemail' => 'Cambiar o enderezo de correo electrónico',
 'prefs-setemail' => 'Establecer un enderezo de correo electrónico',
 'prefs-email' => 'Opcións de correo electrónico',
 'prefs-rendering' => 'Aparencia',
@@ -1548,8 +1562,8 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'nchanges' => '$1 {{PLURAL:$1|cambio|cambios}}',
 'recentchanges' => 'Cambios recentes',
 'recentchanges-legend' => 'Opcións dos cambios',
-'recentchangestext' => 'Nesta páxina pode seguir os cambios máis recentes no wiki.',
-'recentchanges-feed-description' => 'Nesta fonte de novas pode seguir os cambios máis recentes no wiki.',
+'recentchanges-summary' => 'Nesta páxina pode seguir as modificacións máis recentes feitas no wiki.',
+'recentchanges-feed-description' => 'Nesta fonte de novas pode seguir as modificacións máis recentes feitas no wiki.',
 'recentchanges-label-newpage' => 'Esta edición creou unha nova páxina',
 'recentchanges-label-minor' => 'Esta é unha edición pequena',
 'recentchanges-label-bot' => 'Esta edición foi realizada por un bot',
@@ -1760,14 +1774,15 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
 'backend-fail-writetemp' => 'Non se puido escribir no ficheiro temporal.',
 'backend-fail-closetemp' => 'Non se puido pechar o ficheiro temporal.',
 'backend-fail-read' => 'Non se puido ler o ficheiro "$1".',
-'backend-fail-create' => 'Non se puido crear o ficheiro "$1".',
-'backend-fail-maxsize' => 'Non se puido crear o ficheiro "$1" porque {{PLURAL:$2|é de máis de $2 byte|supera os $2 bytes}}.',
+'backend-fail-create' => 'Non se puido escribir o ficheiro "$1".',
+'backend-fail-maxsize' => 'Non se puido escribir o ficheiro "$1" porque {{PLURAL:$2|é de máis de $2 byte|supera os $2 bytes}}.',
 'backend-fail-readonly' => 'Nestes intres, o sistema de almacenamento "$1" está en modo de só lectura. A razón dada é: "$2"',
 'backend-fail-synced' => 'O ficheiro "$1" está nun estado inconsistente dentro do sistema de almacenamento interno',
 'backend-fail-connect' => 'Non se puido conectar co sistema de almacenamento "$1".',
 'backend-fail-internal' => 'Houbo un erro descoñecido no sistema de almacenamento "$1".',
 'backend-fail-contenttype' => 'Non se puido determinar o tipo de contido do ficheiro a almacenar en "$1".',
 'backend-fail-batchsize' => 'O sistema de almacenamento recibiu un feixe de $1 {{PLURAL:$1|operación|operacións}} de ficheiro; o límite está en $2 {{PLURAL:$2|operación|operacións}}.',
+'backend-fail-usable' => 'Non se puido escribir o ficheiro "$1" debido a que os permisos son insuficientes ou faltan os directorios/contenedores.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non se pode conectar coa base de datos do rexistro do sistema de almacenamento "$1".',
@@ -1926,7 +1941,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.',
@@ -2090,6 +2105,7 @@ Por favor, teña en conta que outras páxinas web poden ligar cara a un ficheiro
 Pode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario ou o título da páxina afectada.',
 'logempty' => 'Non se atopou ningún elemento relacionado no rexistro.',
 'log-title-wildcard' => 'Procurar os títulos que comecen con este texto',
+'showhideselectedlogentries' => 'Mostrar/agochar as entradas do rexistro seleccionadas',
 
 # Special:AllPages
 'allpages' => 'Todas as páxinas',
@@ -2109,6 +2125,11 @@ Pode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario
 'allpages-bad-ns' => '{{SITENAME}} carece do espazo de nomes "$1".',
 'allpages-hide-redirects' => 'Agochar as redireccións',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Está a ver unha versión da páxina gardada na caché, que pode ser de hai $1.',
+'cachedspecial-viewing-cached-ts' => 'Está a ver unha versión da páxina gardada na caché, que pode non estar completamente actualizada.',
+'cachedspecial-refresh-now' => 'Ir á versión máis recente.',
+
 # Special:Categories
 'categories' => 'Categorías',
 'categoriespagetext' => '{{PLURAL:$1|A seguinte categoría contén|As seguintes categorías conteñen}} páxinas ou contidos multimedia.
@@ -2309,8 +2330,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}}.
@@ -2551,8 +2572,8 @@ Explique a razón específica do bloqueo (por exemplo, citando as páxinas concr
 'ipb-confirm' => 'Confirmar o bloqueo',
 'badipaddress' => 'O enderezo IP non é válido',
 'blockipsuccesssub' => 'Bloqueo exitoso',
-'blockipsuccesstext' => 'O enderezo IP [[Special:Contributions/$1|$1]] foi bloqueado.<br />
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] para revisalo.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] foi {{GENDER:$1|bloqueado|bloqueada}}.<br />
+Olle a [[Special:BlockList|lista de bloqueos]] para revisalo.',
 'ipb-blockingself' => 'Está a piques de se bloquear! Está seguro de querer facelo?',
 'ipb-confirmhideuser' => 'Está a piques de bloquear un usuario coa opción "agochar o usuario" activada. Isto suprime o nome de usuario de todas as listas e entradas de rexistro. Está seguro de querer facelo?',
 'ipb-edit-dropdown' => 'Editar os motivos de bloqueo',
@@ -2605,7 +2626,7 @@ O motivo do bloqueo de $1 é: "$2"',
 'reblock-logentry' => 'cambiou as configuracións do bloqueo de "[[$1]]" cunha caducidade de $2 $3',
 'blocklogtext' => 'Este é o rexistro das accións de bloqueo e desbloqueo de usuarios.
 Non se listan os enderezos IP bloqueados automaticamente.
-Olle a [[Special:BlockList|lista de enderezos IP e usuarios bloqueados]] se quere comprobar a lista cos bloqueos vixentes.',
+Olle a [[Special:BlockList|lista de bloqueos]] para comprobar os bloqueos vixentes.',
 'unblocklogentry' => 'desbloqueou a "$1"',
 'block-log-flags-anononly' => 'só os usuarios anónimos',
 'block-log-flags-nocreate' => 'desactivada a creación de contas',
@@ -2829,7 +2850,7 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 'importunknownsource' => 'Fonte de importación descoñecida',
 'importcantopen' => 'Non se pode abrir o ficheiro importado',
 'importbadinterwiki' => 'Ligazón interwiki incorrecta',
-'importnotext' => 'Texto baleiro ou inexistente',
+'importnotext' => 'Baleiro ou sen texto',
 'importsuccess' => 'A importación rematou!',
 'importhistoryconflict' => 'Existe un conflito no historial de revisións (por ter importado esta páxina antes)',
 'importnosources' => 'Non se defininiu ningunha fonte de importación transwiki e os envíos directos dos historiais están desactivados.',
@@ -2839,8 +2860,8 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 'importuploaderrortemp' => 'Fallou o envío do ficheiro de importación. Falta un cartafol temporal.',
 'import-parse-failure' => 'Fallo de análise da importación de XML',
 'import-noarticle' => 'Ningunha páxina para importar!',
-'import-nonewrevisions' => 'Todas as revisións son previamente importadas.',
-'xml-error-string' => '$1 na liña $2, col $3 (byte $4): $5',
+'import-nonewrevisions' => 'Todas as revisións foron importadas previamente.',
+'xml-error-string' => '$1 na liña $2, columna $3 (byte $4): $5',
 'import-upload' => 'Cargar datos XML',
 'import-token-mismatch' => 'Perdéronse os datos da sesión. Por favor, inténteo de novo.',
 'import-invalid-interwiki' => 'Non se pode importar desde o wiki escificado.',
@@ -2995,8 +3016,9 @@ Pode ver o código fonte.',
 Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está na lista negra.',
 'spamprotectionmatch' => 'O seguinte texto foi o que activou o noso filtro de spam: $1',
 'spambot_username' => 'Limpeza de spam de MediaWiki',
-'spam_reverting' => 'Revertida á última edición sen ligazóns a $1',
+'spam_reverting' => 'Revertida á última edición sen ligazóns a "$1"',
 'spam_blanking' => 'Limpáronse todas as revisións con ligazóns a "$1"',
+'spam_deleting' => 'Borráronse todas as revisións con ligazóns a "$1"',
 
 # Info page
 'pageinfo-title' => 'Información sobre "$1"',
@@ -3488,7 +3510,7 @@ Os demais agocharanse por omisión.
 
 'exif-isospeedratings-overflow' => 'Superior a 65535',
 
-'exif-iimcategory-ace' => 'Arte, cultura e entretemento',
+'exif-iimcategory-ace' => 'Arte, cultura e lecer',
 'exif-iimcategory-clj' => 'Crime e dereito',
 'exif-iimcategory-dis' => 'Desastres e accidentes',
 'exif-iimcategory-fin' => 'Economía e negocios',
@@ -3715,6 +3737,11 @@ Debería recibir [{{SERVER}}{{SCRIPTPATH}}/COPYING unha copia da licenza públic
 'version-software' => 'Software instalado',
 'version-software-product' => 'Produto',
 'version-software-version' => 'Versión',
+'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 dos artigos]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Ruta das escrituras]',
 
 # Special:FilePath
 'filepath' => 'Ruta do ficheiro',
@@ -3902,4 +3929,17 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'api-error-uploaddisabled' => 'As cargas están desactivadas neste wiki.',
 'api-error-verification-error' => 'Este ficheiro podería estar corrupto ou ter unha extensión incorrecta.',
 
+# 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|día|días}}',
+'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|milenio|milenios}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Non se puideron obter os peches no servidor $1.',
 );
index 7a564ab..5733ff5 100644 (file)
@@ -31,6 +31,9 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Ñemohenda_myangekõi',
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $messages = array(
 # User preference toggles
 'tog-underline'       => 'Haiguy joajuha',
index 712238d..8abcd89 100644 (file)
@@ -776,7 +776,6 @@ $1",
 
 # Diffs
 'history-title' => 'Αἱ πρότεραι ἐκδόσεις τῆς δέλτου "$1"',
-'difference' => '(Τὰ μεταβεβλημένα)',
 'difference-multipage' => '(Διαφορὰ μεταξὺ δέλτων)',
 'lineno' => 'Γραμμή $1:',
 'compareselectedversions' => 'Συγκρίνειν τὰς ἐπειλεγμένας δέλτους',
@@ -1098,7 +1097,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|μεταβολή|μεταβολαί}}',
 'recentchanges' => 'Αἱ νέαι μεταβολαί',
 'recentchanges-legend' => 'Ἐπιλογαὶ προσφάτων μεταβολῶν',
-'recentchangestext' => 'Ἀνιχνεύσειν τὰς πλείω πρόσφατους ἀλλαγὰς οῦ βίκι ἐν τῇδε τῇ δέλτῳ.',
+'recentchanges-summary' => 'Ἀνιχνεύσειν τὰς πλείω πρόσφατους ἀλλαγὰς οῦ βίκι ἐν τῇδε τῇ δέλτῳ.',
 'recentchanges-feed-description' => 'Παρακολουθεῖν τὰς πλείω προσφάτους ἀλλαγὰς τοῦ βίκι ἐν ταύτῃ περιλήψει.',
 'recentchanges-label-newpage' => 'Ἥδε ἡ μεταγραφὴ ἐποίησεν νέαν δέλτον τινά',
 'recentchanges-label-minor' => 'Ἥδε μικρὰ μεταγραφή ἐστιν',
index c47031a..69f8b78 100644 (file)
 $fallback = 'de';
 
 $specialPageAliases = array(
-       'Allmessages'               => array( 'Alli Nochrichte' ),
-       'Allpages'                  => array( 'Alli Syte' ),
-       'Ancientpages'              => array( 'Veralteti Syte' ),
+       'Allmessages'               => array( 'Alli_Nochrichte' ),
+       'Allpages'                  => array( 'Alli_Syte' ),
+       'Ancientpages'              => array( 'Veralteti_Syte' ),
+       'Badtitle'                  => array( 'Nit-gültige_Sytename' ),
        'Blankpage'                 => array( 'Läärsyte' ),
        'Block'                     => array( 'Sperre' ),
        'Blockme'                   => array( 'Proxy-Sperre' ),
        'Booksources'               => array( 'ISBN-Suech' ),
-       'BrokenRedirects'           => array( 'Kaputti Wyterlaitige' ),
+       'BrokenRedirects'           => array( 'Kaputti_Wyterlaitige' ),
        'Categories'                => array( 'Kategorie' ),
-       'ChangePassword'            => array( 'Passwort ändre' ),
-       'Confirmemail'              => array( 'E-Mail bstetige' ),
+       'ChangeEmail'               => array( 'E-Mai-Adräss_ändere' ),
+       'ChangePassword'            => array( 'Passwort_ändre' ),
+       'ComparePages'              => array( 'Syte_verglyyche' ),
+       'Confirmemail'              => array( 'E-Mail_bstetige' ),
        'Contributions'             => array( 'Byytreeg' ),
-       'CreateAccount'             => array( 'Benutzerchonto aaleege' ),
+       'CreateAccount'             => array( 'Benutzerchonto_aaleege' ),
        'Deadendpages'              => array( 'Sackgassesyte' ),
-       'DeletedContributions'      => array( 'Gleschti Byytreeg' ),
+       'DeletedContributions'      => array( 'Gleschti_Byytreeg' ),
        'Disambiguations'           => array( 'Begriffschlärigsverwyys' ),
-       'DoubleRedirects'           => array( 'Doppleti Wyterlaitige' ),
+       'DoubleRedirects'           => array( 'Doppleti_Wyterlaitige' ),
+       'EditWatchlist'             => array( 'Bearbeitigslischt_bearbeite' ),
        'Emailuser'                 => array( 'E-Mail' ),
        'Export'                    => array( 'Exportiere' ),
-       'Fewestrevisions'           => array( 'Syte wo am wenigschte bearbeitet sin' ),
+       'Fewestrevisions'           => array( 'Syte_wo_am_wenigschte_bearbeitet_sin' ),
        'FileDuplicateSearch'       => array( 'Datei-Duplikat-Suech' ),
        'Filepath'                  => array( 'Dateipfad' ),
        'Import'                    => array( 'Importiere' ),
-       'Invalidateemail'           => array( 'E-Mail nit bstetige' ),
-       'BlockList'                 => array( 'Gsperrti IP' ),
-       'LinkSearch'                => array( 'Suech no Gleicher' ),
+       'Invalidateemail'           => array( 'E-Mail_nit_bstetige' ),
+       'BlockList'                 => array( 'Gsperrti_IP' ),
+       'LinkSearch'                => array( 'Suech_no_Links' ),
        'Listadmins'                => array( 'Ammanne' ),
        'Listbots'                  => array( 'Bötli' ),
        'Listfiles'                 => array( 'Dateie' ),
        'Listgrouprights'           => array( 'Grupperächt' ),
        'Listredirects'             => array( 'Wyterleitige' ),
        'Listusers'                 => array( 'Benutzerlischte' ),
-       'Lockdb'                    => array( 'Datebank sperre' ),
+       'Lockdb'                    => array( 'Datebank_sperre' ),
        'Log'                       => array( 'Logbuech' ),
-       'Lonelypages'               => array( 'Verwaisti Syte' ),
-       'Longpages'                 => array( 'Langi Syte' ),
-       'MergeHistory'              => array( 'Versionsgschichte zämefiere' ),
+       'Lonelypages'               => array( 'Verwaisti_Syte' ),
+       'Longpages'                 => array( 'Langi_Syte' ),
+       'MergeHistory'              => array( 'Versionsgschichte_zämefiere' ),
        'MIMEsearch'                => array( 'MIME-Suech' ),
-       'Mostcategories'            => array( 'Syte wo am meischte kategorisiert sin' ),
-       'Mostimages'                => array( 'Dateie wo am meischte brucht wäre' ),
-       'Mostlinked'                => array( 'Syte wo am meischte vergleicht sin' ),
-       'Mostlinkedcategories'      => array( 'Kategorie wo am meischte brucht wäre' ),
-       'Mostlinkedtemplates'       => array( 'Vorlage wo am meischte brucht wäre' ),
-       'Mostrevisions'             => array( 'Syte wo am meischte bearbeitet sin' ),
+       'Mostcategories'            => array( 'Syte_wo_am_meischte_kategorisiert_sin' ),
+       'Mostimages'                => array( 'Dateie_wo_am_meischte_brucht_wäre' ),
+       'Mostlinked'                => array( 'Syte_wo_am_meischte_druff_verlinkt_isch' ),
+       'Mostlinkedcategories'      => array( 'Kategorie_wo_am_meischte_brucht_wäre' ),
+       'Mostlinkedtemplates'       => array( 'Vorlage_wo_am_meischte_brucht_wäre' ),
+       'Mostrevisions'             => array( 'Syte_wo_am_meischte_bearbeitet_sin' ),
        'Movepage'                  => array( 'Verschiebe' ),
-       'Mycontributions'           => array( 'Myyni Byytreeg' ),
-       'Mypage'                    => array( 'Myyni Benutzersyte' ),
-       'Mytalk'                    => array( 'Myyni Diskussionssyte' ),
-       'Newimages'                 => array( 'Neji Dateie' ),
-       'Newpages'                  => array( 'Neji Syte' ),
-       'Popularpages'              => array( 'Beliebteschti Syte' ),
+       'Mycontributions'           => array( 'Myyni_Byytreeg' ),
+       'Mypage'                    => array( 'Myyni_Benutzersyte' ),
+       'Mytalk'                    => array( 'Myyni_Diskussionssyte' ),
+       'Myuploads'                 => array( 'Dateie_wonni_uffeglade_han' ),
+       'Newimages'                 => array( 'Neji_Dateie' ),
+       'Newpages'                  => array( 'Neji_Syte' ),
+       'PasswordReset'             => array( 'Passwort_zruggsetze' ),
+       'PermanentLink'             => array( 'Permalink' ),
+       'Popularpages'              => array( 'Beliebteschti_Syte' ),
        'Preferences'               => array( 'Ystellige' ),
        'Prefixindex'               => array( 'Vorsilbeverzeichnis' ),
-       'Protectedpages'            => array( 'Gschitzti Syte' ),
-       'Protectedtitles'           => array( 'Gsperrti Titel' ),
-       'Randompage'                => array( 'Zuefelligi Syte' ),
-       'Randomredirect'            => array( 'Zuefelligi Wyterleitig' ),
-       'Recentchanges'             => array( 'Letschti Änderige' ),
-       'Recentchangeslinked'       => array( 'Änderige an vergleichte Syte' ),
+       'Protectedpages'            => array( 'Gschitzti_Syte' ),
+       'Protectedtitles'           => array( 'Gsperrti_Titel' ),
+       'Randompage'                => array( 'Zuefelligi_Syte' ),
+       'Randomredirect'            => array( 'Zuefelligi_Wyterleitig' ),
+       'Recentchanges'             => array( 'Letschti_Änderige' ),
+       'Recentchangeslinked'       => array( 'Änderige_an_verlinkte_Syte' ),
        'Revisiondelete'            => array( 'Versionsleschig' ),
+       'RevisionMove'              => array( 'Version_verschiebe' ),
        'Search'                    => array( 'Suech' ),
-       'Shortpages'                => array( 'Churzi Syte' ),
+       'Shortpages'                => array( 'Churzi_Syte' ),
        'Specialpages'              => array( 'Spezialsyte' ),
        'Statistics'                => array( 'Statischtik' ),
-       'Uncategorizedcategories'   => array( 'Kategorie wo nit kategorisiert sin' ),
-       'Uncategorizedimages'       => array( 'Dateie wo nit kategorisiert sin' ),
-       'Uncategorizedpages'        => array( 'Syte wo nit kategorisiert sin' ),
-       'Uncategorizedtemplates'    => array( 'Vorlage wo nit kategorisiert sin' ),
+       'Tags'                      => array( 'Markierige' ),
+       'Unblock'                   => array( 'Freigee' ),
+       'Uncategorizedcategories'   => array( 'Kategorie_wo_nit_kategorisiert_sin' ),
+       'Uncategorizedimages'       => array( 'Dateie_wo_nit_kategorisiert_sin' ),
+       'Uncategorizedpages'        => array( 'Syte_wo_nit_kategorisiert_sin' ),
+       'Uncategorizedtemplates'    => array( 'Vorlage_wo_nit_kategorisiert_sin' ),
        'Undelete'                  => array( 'Widerhärstelle' ),
-       'Unlockdb'                  => array( 'Sperrig vu dr Datebank ufhebe' ),
-       'Unusedcategories'          => array( 'Kategorie wo nit brucht wäre' ),
-       'Unusedimages'              => array( 'Dateie wo nit brucht wäre' ),
-       'Unusedtemplates'           => array( 'Vorlage wo nit brucht wäre' ),
-       'Unwatchedpages'            => array( 'Syte wu nit beobachtet wäre' ),
+       'Unlockdb'                  => array( 'Sperrig_vu_dr_Datebank_ufhebe' ),
+       'Unusedcategories'          => array( 'Kategorie_wo_nit_brucht_wäre' ),
+       'Unusedimages'              => array( 'Dateie_wo_nit_brucht_wäre' ),
+       'Unusedtemplates'           => array( 'Vorlage_wo_nit_brucht_wäre' ),
+       'Unwatchedpages'            => array( 'Syte_wu_nit_beobachtet_wäre' ),
        'Upload'                    => array( 'Uffelade' ),
        'Userlogin'                 => array( 'Amälde' ),
        'Userlogout'                => array( 'Abmälde' ),
        'Userrights'                => array( 'Benutzerrächt' ),
-       'Wantedcategories'          => array( 'Kategorie wo gwinscht sin' ),
-       'Wantedfiles'               => array( 'Dateie wo fähle' ),
-       'Wantedpages'               => array( 'Syte wo gwinscht sin' ),
-       'Wantedtemplates'           => array( 'Vorlage wo fähle' ),
+       'Wantedcategories'          => array( 'Kategorie_wo_gwinscht_sin' ),
+       'Wantedfiles'               => array( 'Dateie_wo_fähle' ),
+       'Wantedpages'               => array( 'Syte_wo_gwinscht_sin' ),
+       'Wantedtemplates'           => array( 'Vorlage_wo_fähle' ),
        'Watchlist'                 => array( 'Beobachtigslischte' ),
-       'Whatlinkshere'             => array( 'Was gleicht do ane?' ),
-       'Withoutinterwiki'          => array( 'Ohni Interwiki' ),
+       'Whatlinkshere'             => array( 'Was_verwyyst_do_druff?' ),
+       'Withoutinterwiki'          => array( 'Ohni_Interwiki' ),
 );
 
 $magicWords = array(
@@ -252,7 +262,7 @@ $messages = array(
 'noindex-category' => 'Syte wu nit verzeichnet sin',
 'broken-file-category' => 'Syte mit kaputtige Dateilink',
 
-'about' => 'Über',
+'about' => 'Iber',
 'article' => 'Inhaltssyte',
 'newwindow' => '(imene nöie Fänschter)',
 'cancel' => 'Abbräche',
@@ -310,7 +320,7 @@ $messages = array(
 'create' => 'Erstelle',
 'editthispage' => 'Syte bearbeite',
 'create-this-page' => 'Die Syte afange',
-'delete' => 'Lösche',
+'delete' => 'Lesche',
 'deletethispage' => 'Syte lösche',
 'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versione}} widerherstelle',
 'viewdeleted_short' => '{{PLURAL:$1|ei gleschti Änderig|$1 gleschti Ändrige}} aaluege',
@@ -468,7 +478,7 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
 'internalerror_info' => 'Interne Fähler: $1',
 'fileappenderrorread' => '„$1“ het nit chenne gläse wäre bim Aahänke.',
 'fileappenderror' => 'Het „$1“ nit an „$2“ chenne anhänke.',
-'filecopyerror' => 'Datei "$1" het nit noch "$2" kopiert werre kinne.',
+'filecopyerror' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
 'filerenameerror' => 'D Datei "$1" het nit in "$2" umgnennt werre kinne.',
 'filedeleteerror' => 'Datei "$1" het nit glöscht werre kinne.',
 'directorycreateerror' => 'S Verzeichnis „$1“ het nit chenne aaglait wäre.',
@@ -478,20 +488,22 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
 'formerror' => 'Fähler: Ds Formular het nid chönne verarbeitet wärde',
 'badarticleerror' => 'D Aktion konn uf denne Artikel nit ongwendet werre.',
 'cannotdelete' => 'D Syte oder d Datei „$1“ cha nit glescht wäre. Si isch villicht scho vu eber anderem glescht wore.',
+'cannotdelete-title' => 'Syte „$1“ cha nit glescht wäre',
 'badtitle' => 'Ugültiger Titel',
 'badtitletext' => 'Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.',
-'perfcached' => 'Die Informatione chömme us em Zwüschespeicher un sin derwiil villicht nid aktuell. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.
-----',
-'perfcachedts' => 'Die Date stamme us em Cache un sin am $1 s letscht Mol aktualisiert wore. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Die Informatione chemme us em Zwischespycher un sin derwyl villicht nit aktuäll. Maximal {{PLURAL:$1|ei Ergebnis isch|$1 Ergebnis sin}} im Cache verfiegbar.',
+'perfcachedts' => 'Die Date stamme us em Zwischespycher un sin am $1 s letscht Mol aktualisiert wore. Maximal {{PLURAL:$4|ei Ergebnis isch|$4 Ergebnis sin}} im Zwischespycher verfiegbar.',
 'querypage-no-updates' => "'''D Aktualisierigsfunktion fir die Syte isch im Momänt deaktiviert. D Date wäre vorerscht nit ernejert.'''",
 'wrong_wfQuery_params' => 'Falschi Parameter fir wfQuery()<br />
 Funktion: $1<br />
 Abfrog: $2',
 'viewsource' => 'Quelltext aaluege',
+'viewsource-title' => 'Quälltext vu $1 aaluege',
 'actionthrottled' => 'Aktionsaazahl limitiert',
 'actionthrottledtext' => 'As Schutz vor Spam cha die Aktion im e churze Zytabstand nume begränzt durgfiert wäre. Du bisch ebe an die Gränz cho. Bitte versuech s in e paar Minute non emol.',
 'protectedpagetext' => 'Die Syte isch fir s Bearbeite gsperrt.',
 'viewsourcetext' => 'Quelltext vo dere Syte:',
+'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
 'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
 'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
 'sqlhidden' => '(SQL-Abfrog verschteckt)',
@@ -503,6 +515,11 @@ $2',
 'ns-specialprotected' => 'Spezialsyte chenne nid bearbeitet wäre.',
 'titleprotected' => "E Syte mit däm Name cha nid aaglait wäre.
 Die Sperri isch dur [[User:$1|$1]] yygrichtet wore mit dr Begrindig ''„$2“''.",
+'filereadonlyerror' => 'D Datei „$1“ cha nit gänderet wäre, wel uf s Dateirepositorium „$2“ nume Läsezuegriff megli isch.
+
+Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3“.',
+'invalidtitle-knownnamespace' => 'Nit-gültige Titel mit Namensruum „$2“ un Text „$3“',
+'invalidtitle-unknownnamespace' => 'Ungültige Titel mit unbekannte Namensruumnummer $1 un Text „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Fählerhafti Konfiguration: Virescanner, wu nid bekannt isch: ''$1''",
@@ -597,6 +614,7 @@ Fir d Bstätigung muesch em Link nogoh, wu Dir gschickt woren isch. Du chasch au
 'invalidemailaddress' => 'Diä E-Mail-Adress isch nit akzeptiert worre, wil s ä ugültigs Format ghet het.
 Bitte gib ä neiji Adress in nem gültige Format ii, odr tue s Feld leere.',
 'cannotchangeemail' => 'E-Mail-Adrässe chönne in däm Wiki nit gänderet werde.',
+'emaildisabled' => 'Iber die Websyte chenne kei E-Mail verschickt wäre.',
 'accountcreated' => 'S Benutzerkonto isch aagleit wore.',
 'accountcreatedtext' => 'S Benutzerkonto $1 isch aagleit wore.',
 'createaccount-title' => 'Aalege vum e Benutzerkonto fir {{SITENAME}}',
@@ -723,27 +741,21 @@ Du chasch $1 oder e andere [[{{MediaWiki:Grouppage-sysop}}|Ammann]] kontaktiere
 Du chasch d „E-Mail an dää Benutzer“-Funktion nit bruche, solang kei giltigi E-Mail-Adräss in Dyyne [[Special:Preferences|Benutzerkonto-Yystellige]] yydrait isch, oder solang die Funktion fir Di gsperrt isch.
 Dyy aktuälli IP-Adräss isch $3, un d Sperr-ID isch #$5.
 Bitte fieg in jedi Aafrog, wu du stellsch, alli Information yy.",
-'autoblockedtext' => 'Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
+'autoblockedtext' => "Dyyni IP-Adräss isch automatisch gsperrt wore, wel si vu me andere Benutzer brucht woren isch, wu dur $1 gsperrt woren isch.
 As Grund isch aagee wore:
 
-:\'\'$2\'\' (<span class="plainlinks">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbucheintrag]</span>)
+:''$2''
 
-<p style="border-style: solid; border-color: red; border-width: 1px; padding:5px;"><b>E Zuegriff zum Läse isch alno megli,</b>
-nume d Bearbeitig un s Aalege vu Syte in {{SITENAME}} isch gsperrt wore.
-Wänn die Nochricht aazeigt wird, au wänn Du nume zum Läse zuegriffe hesch, bisch eme (rote) Link uf e Syte noogange, wu s nonig git.</p>
+* Aafang vu dr Sperri: $8
+* Änd vu dr Sperri: $6
+* Sperre betrifft: $7
 
 Du chasch $1 oder ein vu dr andre [[{{MediaWiki:Grouppage-sysop}}|Ammanne]] kontaktiere, zum iber die Sperri z diskutiere.
 
-<div style="border-style: solid; border-color: red; border-width: 1px; padding:5px;">
-\'\'\'Bitte gib in jedere Aafrog die Date aa:\'\'\'
-*Ammann, wu gsperrt het: $1
-*Sperrgrund: $2
-*Aafang vu dr Sperri: $8
-*Sperr-Änd: $6
-*IP-Adräss: $3
-*Sperri betrifft: $7
-*Sperr-ID: #$5
-</div>',
+Du chasch d „E-Mail an dää Benutzer“-Funktion nit nutze, solange kei giltigi E-Mail-Adräss in Dyne  [[Special:Preferences|Benutzerkonto-Yystellige]] yytrait isch oder die Funktion fir di gsperrt woren isch.
+
+Dyy aktuäll IP-Adräss isch $3, un d Sperr-ID isch $5.
+Bitte fieg alli Informatione jedere Aafrog zue, wu Du stellsch.",
 'blockednoreason' => 'kei Begrindig aagee',
 'whitelistedittext' => 'Du muesch Di $1 zum Artikel bearbeite.',
 'confirmedittext' => 'Si mien Ihri E-Mail-Adräss zerscht bstätige, voreb Si Syte chenne ändere. Bitte setze Si in [[Special:Preferences|Ihre Iistellige]] Ihri E-Mail-Adräss yy un len Si si priefe.',
@@ -792,7 +804,9 @@ As Information chunnt do ne aktuälle Uuszug us em Benutzersperr-Logbuech:',
 'userinvalidcssjstitle' => "'''Achtig:''' D Skin „$1“ git s nid. Dänk dra, ass benutzerspezifischi .css- und .js-Syte mit eme Chleibuechstabe mien aafange, also z B. ''{{ns:user}}:Mustermann/vector.css'' statt ''{{ns:user}}:Mustermann/Vector.css''.",
 'updated' => '(Gänderet)',
 'note' => "'''Obacht: '''",
-'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''",
+'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''
+Die Syte isch nonig gspycheret wore!",
+'continue-editing' => 'Wyter bearbeite',
 'previewconflict' => 'Die Vorschau zeigt dr Inhalt vum obere Täxtfäld. Eso siht dr Artikel us, wän Du jetz uf Spychere drucksch.',
 'session_fail_preview' => "'''Dyyni Bearbeitig het nid chenne gspycheret wäre, wel Sitzigsdate verlore gange sin.
 Bitte versuech s nomol. Derzue drucksch unter däre Täxtvorschau nomol uf „Syte spychere“.
@@ -808,6 +822,7 @@ Wänn s Problem blybt, [[Special:UserLogout|mäld Di ab]] un derno wider aa.'''"
 S Spichere cha dr Inhalt vu dr Syte hii mache. Des git s e mänkmol, wänn eber e anonyme Proxy-Dienscht brucht, wu Fähler macht.'''",
 'edit_form_incomplete' => "'''Dr Inhalt vum Bearbeitigsformular isch nit vollständig zum Server chuu. Bitte prief Dyy Bearbeitigen uf Vollständigkeit un versuech s nomol.'''",
 'editing' => 'Bearbeite vo «$1»',
+'creating' => 'Am Aalege vu „$1“',
 'editingsection' => 'Bearbeite vo «$1» (Absatz)',
 'editingcomment' => 'Bearbeite vu $1 (Neje Abschnitt)',
 'editconflict' => 'Bearbeitigs-Konflikt: «$1»',
@@ -828,7 +843,7 @@ Hiemit gisch du zue, das du dä Tekscht '''sälber gschribe''' hesch, das der Te
 'copyrightwarning2' => "Dängge Si dra, dass alli Änderige {{GRAMMAR:dativ {{SITENAME}}}} vo andere Benutzer wider gänderet oder glöscht chönne wärde. Wenn Si nit wänn, dass ander Lüt an Ihrem Tekscht ummedoktere denn schicke Si ihn jetz nit ab.<br />
 Si verspräche uns usserdäm, dass Si des alles selber gschribe oder vo nere Quälle kopiert hen, wo Public Domain odr sunscht frei isch (lueg $1 für Details).
 '''SETZE SI DO OHNI ERLAUBNIS KEINI URHEBERRÄCHTLICH GSCHÜTZTI WÄRK INE!'''",
-'longpageerror' => "'''Fähler: Dä Täxt, wu Du spichere wit, isch $1 KB gross. Des isch gresser wie s erlaubt Maximum vu $2 KB – s Spichere isch nid megli.'''",
+'longpageerror' => "'''Fähler: Dä Täxt, wu Du spychere wit, isch {{PLURAL:$1|ei Kilobyte|$1 Kilobyte}} groß. Des isch greßer wie s erlaubt Maximum vu {{PLURAL:$2|eim Kilobyte|$2 Kilobyte}}.''' S Spychere isch nit megli.",
 'readonlywarning' => "'''Achtung: Die Datebank isch fir Wartigsarbete gesperrt. Wäge däm chenne Dyyni Änderige im Momänt nid gspicheret wäre.
 Sichere de Täxt bitte lokal uf Dyynem Computer un versuech speter nomol, d Änderige z ibertrage.'''
 
@@ -869,6 +884,7 @@ Si isch schyns glescht wore.',
 'edit-conflict' => 'Bearbeitigskonflikt.',
 'edit-no-change' => 'Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.',
 'edit-already-exists' => 'Di nej Syte het nid chenne aaglait wäre, wel s si scho git.',
+'defaultmessagetext' => 'Standardtext',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.
@@ -882,6 +898,12 @@ S {{PLURAL:$2|derf nid meh wie ein Ufruef|derfe nid meh wie $1 Ufruef}} gee.',
 'parser-template-loop-warning' => 'Vorlagelätsch entdeckt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Vorlagerekursionstiefegränz iberschritte ($1)',
 'language-converter-depth-warning' => 'Gränz vu dr Sprochkonvertertiefi iberschritte ($1)',
+'node-count-exceeded-category' => 'Syte, wo d Chnotezaal überschritte hen',
+'node-count-exceeded-warning' => 'Die Syte het d Chnotepunktzaal überschritte.',
+'expansion-depth-exceeded-category' => 'Syte, wo d Expansionsdiefi überschritte hen',
+'expansion-depth-exceeded-warning' => 'Die Syte het d Expansionsdiefi überschritte.',
+'parser-unstrip-loop-warning' => 'Zirkelbezug festgstellt',
+'parser-unstrip-recursion-limit' => 'Rekursionsgränz bim Ufflöse überschritte ($1)',
 
 # "Undo" feature
 'undo-success' => 'Zum die Änderig ruckgängig z mache, kontrollier bitte d Bearbeitig in dr Verglichsaasicht un druck derno uf „Syte spichere“.',
@@ -1055,8 +1077,9 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'mergelogpagetext' => 'Des isch e Lischt vu dr letschte Zämefierige vu Versionsgschichte.',
 
 # Diffs
-'history-title' => 'Versionsgschicht vo „$1“',
-'difference' => '(Unterschide zwüsche Versione)',
+'history-title' => '$1: Versionsgschicht',
+'difference-title' => '$1: Unterschid zwüsche de Versione',
+'difference-title-multipage' => '$1 un $2: Unterschid zwüsche de Syte',
 'difference-multipage' => '(Unterschid zwische Syte)',
 'lineno' => 'Zyle $1:',
 'compareselectedversions' => 'Usgwählti Versione verglyche',
@@ -1151,11 +1174,12 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'prefs-beta' => 'Betafunktione',
 'prefs-datetime' => 'Datum un Zyt',
 'prefs-labs' => 'Alphafunktione',
+'prefs-user-pages' => 'Benutzersyte',
 'prefs-personal' => 'Benutzerdate',
 'prefs-rc' => 'Letschti Änderige',
 'prefs-watchlist' => 'Beobachtigslischte',
 'prefs-watchlist-days' => 'Aazahl vu dr Täg, wu d Beobchtigslischt standardmässig soll umfasse:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Maximal {{PLURAL:$1|ei Tag|$1 Täg}}',
 'prefs-watchlist-edits' => 'Maximali Zahl vu dr Yyträg:',
 'prefs-watchlist-edits-max' => 'Maximali Aazahl: 1000',
 'prefs-watchlist-token' => 'Beobachtigslischte-Chännzeiche:',
@@ -1394,6 +1418,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'action-suppressionlog' => 's privat Logbuech aazluege',
 'action-block' => 'dä Benutzer z sperre',
 'action-protect' => 'dr Schutzstatus vu Syte z ändere',
+'action-rollback' => 'd Änderige vum letschte Bearbeiter vun ere bstimmte Syte schnäll zruckzsetze',
 'action-import' => 'Syte us eme andere Wiki z importiere',
 'action-importupload' => 'Syte z importiere iber s Uffelade vun ere Datei',
 'action-patrol' => 'd Bearbeitige vu andere Benutzer as kontrolliert z markiere',
@@ -1403,12 +1428,13 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'action-userrights' => 'Benutzerrächt z ändere',
 'action-userrights-interwiki' => 'd Rächt vu Benutzer in andere Wiki z ändere',
 'action-siteadmin' => 'd Datebank z sperre oder frejzgee',
+'action-sendemail' => 'E-Mail z schicke',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Änderig|Änderige}}',
 'recentchanges' => 'Letschti Änderige',
 'recentchanges-legend' => 'Optione vu dr Aazeig',
-'recentchangestext' => 'Uff däre Syte chönne Si die letschte Änderige in däm Wiki aaluege.',
+'recentchanges-summary' => 'Uff däre Syte chönne Si die letschte Änderige in däm Wiki aaluege.',
 'recentchanges-feed-description' => 'Di letschten Änderige vo {{SITENAME}} i däm Feed abonniere.',
 'recentchanges-label-newpage' => 'Die Bearbeitig het e neji Syte aagleit',
 'recentchanges-label-minor' => 'Des isch e chleini Änderig',
@@ -1434,9 +1460,11 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|Benutzer, wu beobachtet|Benutzer, wu beobachte}}]',
 'rc_categories' => 'Nume Syten us dr Kategorie (trennt mit „|“):',
 'rc_categories_any' => 'Alli',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Byte|Byte}} no dr Änderig',
 'newsectionsummary' => 'Neje Abschnitt /* $1 */',
 'rc-enhanced-expand' => 'Detail aazeige (brucht JavaScript)',
 'rc-enhanced-hide' => 'Detail verstecke',
+'rc-old-title' => 'urspringlig aaglait as „$1“',
 
 # Recent changes linked
 'recentchangeslinked' => 'Verlinktes prüefe',
@@ -1506,7 +1534,7 @@ Lueg au d [[Special:NewFiles|Galerii vu neije Dateie]] fir e visuälle Iberblick
 'illegal-filename' => 'Dr Dateiname isch nit erlaubt.',
 'overwrite' => 'S Iberschryybe vun ere Datei, wu s scho git, isch nit erlaubt.',
 'unknown-error' => 'S het e nit bekannte Fähler gee.',
-'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit.',
+'tmp-create-error' => 'E tämporäri Datei het nit chenne aagleit wäre.',
 'tmp-write-error' => 'Fähler bim Schryybe vu dr tämporäre Datei',
 'large-file' => 'D Dateigressi sott, wänn s goht, nit gresser syy wie $1. Die Datei isch $2 gross.',
 'largefileserver' => 'Die Datei isch gresser wie die vum Server yygstellti Maximalgressi.',
@@ -1581,6 +1609,48 @@ Wänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].',
 'upload-too-many-redirects' => 'In dr URL het s zvyl Wyterleitige',
 'upload-unknown-size' => 'Nit bekannti Greßi',
 'upload-http-error' => 'E HTTP-Fähler isch ufträtte: $1',
+'upload-copy-upload-invalid-domain' => 'As Kopi uffeladbari Dateie sin iber die Domain nit verfiegbar.',
+
+# File backend
+'backend-fail-stream' => 'D Datei $1 het nit chenne ibertrait wäre.',
+'backend-fail-backup' => 'D Datei $1 het nit chenne gsicheret wäre.',
+'backend-fail-notexists' => 'D Datei $1 git s nit.',
+'backend-fail-hashes' => 'D Streiwärt vu dr Datei hän nit zum Verglych chenne abgruefe wäre.',
+'backend-fail-notsame' => 'S git scho ne Datei $1, wu nit idäntisch isch.',
+'backend-fail-invalidpath' => '$1 isch kei giltige Pfad zum Spychere.',
+'backend-fail-delete' => 'D Datei $1 het nit glöscht werre kinne.',
+'backend-fail-alreadyexists' => 'D Datei „$1“ git s scho.',
+'backend-fail-store' => 'D Datei $1 het nit chenne unter em Name $2 gspycheret wäre.',
+'backend-fail-copy' => 'D Datei $1 het nit no $2 chenne kopiert wäre.',
+'backend-fail-move' => 'D Datei $1 het nit no $2 chenne verschobe wäre.',
+'backend-fail-opentemp' => 'Di temporär Datei het nit chenne ufgmacht wäre.',
+'backend-fail-writetemp' => 'Di temporär Datei het nit chenne gschribe wäre.',
+'backend-fail-closetemp' => 'Di temporär Datei het nit chenne zuegmacht wäre.',
+'backend-fail-read' => 'D Datei $1 het nit chenne gläse wäre.',
+'backend-fail-create' => 'D Datei $1 het nit chenne gspyycheret wäre.',
+'backend-fail-maxsize' => 'D Datei $1 het nit chenne gspycheret wäre, wel si greßer isch wie {{PLURAL:$2|ei Byte|$2 Byte}}.',
+'backend-fail-readonly' => 'S Spycher-Backend „$1“ isch zurzyt im Läsemodus. Dr Grund, wu aagee isch, isch: „$2“',
+'backend-fail-synced' => 'D Datei „$1“ isch im intärne Spycher-Backend in eme inkonsischtänte Zuestand.',
+'backend-fail-connect' => 'S het kei Verbindig chenne härgstellt wäre zum Spycher-Backend „$1“.',
+'backend-fail-internal' => 'Im Spycher-Backend „$1“ isch e nit bekannte Fähler ufträtte.',
+'backend-fail-contenttype' => 'Dr Inhaltstyp vu dr Datei, wu im Pfad „$1“ gspycheret soll wäre, het nit chenne bstimmt wäre.',
+'backend-fail-batchsize' => 'E Bygiverarbeitigsdatei, wu s {{PLURAL:$1|ei Operation|$1 Operatione}} din het, isch an s Spycher-Backend gschickt wore. D Gränz lyt aber bi {{PLURAL:$2|eire Operation|$2 Operatione}}.',
+'backend-fail-usable' => 'D Datei $1 het nit chönne gspyycheret werde, entweder wyl kei Verzeichniss vorhande isch oder wyl kei Berächtigung hesch.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'S het kei Verbindig chenne härgstellt würe zue dr Journaldatebank vum Spycher-Backend „$1“.',
+'filejournal-fail-dbquery' => 'D Journaldatebank vum Spycher-Backend „$1“ het nit chenne aktualisiert wäre.',
+
+# Lock manager
+'lockmanager-notlocked' => '„$1“ het nit chenne entsperrt wäre, wel s kei Sperrig git.',
+'lockmanager-fail-closelock' => 'D Sperrdatei fir „$1“ het nit chenne zuegmacht wäre.',
+'lockmanager-fail-deletelock' => 'D Sperrdatei fir „$1“ het nit chenne glescht wäre.',
+'lockmanager-fail-acquirelock' => 'D Sperri fir „$1“ het nit chenne abgruefe wäre.',
+'lockmanager-fail-openlock' => 'D Sperrdatei fir „$1“ het nit chenne ufgmacht wäre.',
+'lockmanager-fail-releaselock' => 'D Sperri fir „$1“ het nit chenne frejgee wäre.',
+'lockmanager-fail-db-bucket' => 'Mit em Sammelabruef $1 hän nit gnue Verbindige zue Sperrdatebanke chenne härgstellt wäre.',
+'lockmanager-fail-db-release' => 'D Sperrine uf dr Datebank $1 hän nit chenne frejgee wäre.',
+'lockmanager-fail-svr-release' => 'D Sperrine uf em Server $1 hän nit chenne frejgee wäre.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'S het e Fähler gee bim Ufmache vu dr Datei fir d ZIP-Iberpriefig.',
@@ -1598,6 +1668,7 @@ Si cha wäge däm nit richtig iberprieft wäre.',
 'uploadstash-badtoken' => 'S Uuseneh vu dr vorab gspycherete Dateien isch fählgschlaa, villicht wel d Sitzigsdaten abglofe sin. Bitte versuech s nomol.',
 'uploadstash-errclear' => 'S Uuseneh vu dr vorab gspycherete Dateie isch fählgschlaa.',
 'uploadstash-refresh' => 'Lischt vu dr Dateie aktualisiere',
+'invalid-chunk-offset' => 'Nit giltige Startpunkt',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Zuegriff verweigeret',
@@ -1683,6 +1754,10 @@ E [[Special:WhatLinksHere/$2|vollständigi Lischt]] isch verfiegbar.',
 'sharedupload' => 'Die Datei isch vu $1. S cha syy, ass si vu andere Projekt brucht wird.',
 'sharedupload-desc-there' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. Lueg uf dr [$2 Dateibschryybigssyte] no wytere Informatione.',
 'sharedupload-desc-here' => 'Die Datei isch vu $1 un derf vu andere Projäkt bruucht wäre. D Bschryybig vu dr [$2 Dateibschryybigssyte] wird unten aazeigt.',
+'sharedupload-desc-edit' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
+'sharedupload-desc-create' => 'Die Datei stammt us $1 un cha uf andere Projäkt brucht wäre.
+Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
 'filepage-nofile' => 'S git kei Datei mit däm Name.',
 'filepage-nofile-link' => 'S git no kei Datei mit däm Name, aber Du chasch [$1 si ufelade].',
 'uploadnewversion-linktext' => 'E nöui Version vo dere Datei ufelade',
@@ -1717,6 +1792,7 @@ E [[Special:WhatLinksHere/$2|vollständigi Lischt]] isch verfiegbar.',
 ** Duplikat',
 'filedelete-edit-reasonlist' => 'Leschgrind bearbeite',
 'filedelete-maintenance' => 'S Leschen un Widerhärstelle vu Dateie isch wäge Wartigsarbete e Zytlang deaktiviert.',
+'filedelete-maintenance-title' => 'D Datei cha nit glescht wäre.',
 
 # MIME search
 'mimesearch' => 'MIME-Suechi',
@@ -1765,7 +1841,7 @@ Iberprief anderi Link zue dr Vorlage, voreb Du die leschesch.',
 'statistics-users-active-desc' => 'Benutzer mit Bearbeitige {{PLURAL:$1|in dr letschte 24 Stund|in dr letschte $1 Täg}}',
 'statistics-mostpopular' => 'Am meischte aagluegti Syte',
 
-'disambiguations' => 'Begriffsklärigssytene',
+'disambiguations' => 'Syte, wu uf Begriffsklärigssyte verlinke',
 'disambiguationspage' => 'Template:Begriffsklärig',
 'disambiguations-text' => 'Die Syte verwyyse uf e Begriffsklärigs-Syte. Sie sotte aber besser uf d Syte verwyyse, wu eigetli gmeint sin.<br />E Syte wird as Begriffsklärigs-Syte behandlet, wänn [[MediaWiki:Disambiguationspage]] uf si verwyyst.<br />Link us Namensryym wäre do nit ufglischtet.',
 
@@ -1812,6 +1888,8 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 'wantedpages' => 'Artikel, wo fähle',
 'wantedpages-badtitle' => 'Nit giltige Titel im Ergebnis: $1',
 'wantedfiles' => 'Dateie, wu fähle',
+'wantedfiletext-cat' => 'Die Dateie wäre brucht, s git si aber nit. Dateie us främde Repositorie chenne einewäg do ufglischtet syy un wäre <del>durgstriche</del> dargstellt. Zuesätzli wäre Syte, wu s die nit vorhande Datei dinne het, in d [[:$1]] yygordnet.',
+'wantedfiletext-nocat' => 'Die Dateie wäre brucht, s git si aber nit. Vorhandeni Dateie us främde Repositorie chenne dp einewäg ufglischtet syy un wäre <del>durgstriche</del> dargstellt.',
 'wantedtemplates' => 'Vorlage, wu fähle',
 'mostlinked' => 'Syte, wo am meischte druff verwyyse wird',
 'mostlinkedcategories' => 'Am meischte verlinkti Kategorië',
@@ -1820,6 +1898,7 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 'mostimages' => 'Am meischte verlinkti Dateie',
 'mostrevisions' => 'Syte mit de meischte Bearbeitige',
 'prefixindex' => 'Alli Syte (mit Präfix)',
+'prefixindex-namespace' => 'Alli Syte mit Präfix (Nameruum $1)',
 'shortpages' => 'Churzi Artikel',
 'longpages' => 'Langi Artikel',
 'deadendpages' => 'Artikel ohni Links («Sackgasse»)',
@@ -1862,8 +1941,8 @@ Bitte gib Acht, ass anderi Netzsyte die Datei mit ere diräkte URL chenne verlin
 'booksources-invalid-isbn' => 'D ISBN isch schyyns falsch. Lueg no Fähler in dr Kopii.',
 
 # Special:Log
-'specialloguserlabel' => 'Benutzer:',
-'speciallogtitlelabel' => 'Titel:',
+'specialloguserlabel' => 'Benutzer, wu des gmacht het:',
+'speciallogtitlelabel' => 'Ziil (Titel oder Benutzer):',
 'log' => 'Logbiecher',
 'all-logs-page' => 'Alli effetligi Logbüecher',
 'alllogstext' => 'Kombinierti Aasicht vu alle in {{SITENAME}} gfierte Protokoll.
@@ -1887,6 +1966,12 @@ D Aazeig cha dur d Uuswahl vun eme Protokoll, eme Benutzername oder eme Sytename
 'allpagesprefix' => 'Alli Sytene mit em Präfix:',
 'allpagesbadtitle' => 'Dr Sytename, wu yygee hesch, isch nit giltig: Er het entwäder e vorgstellt Sproch-, e Interwiki-Chirzel oder s het ei oder meh Zeiche din, wu in eme Sytename nit derfe brucht wäre.',
 'allpages-bad-ns' => 'Dr Namensruum „$1“ isch in {{SITENAME}} nit vorhande.',
+'allpages-hide-redirects' => 'Wyterleitige uusblände',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu bis zue $1 cha alt syy.',
+'cachedspecial-viewing-cached-ts' => 'Du siisch d Zwischespycher-Version vu däre Syte, wu villicht nit aktuäll isch.',
+'cachedspecial-refresh-now' => 'Aktuälli Version aaluege.',
 
 # Special:Categories
 'categories' => 'Kategorie',
@@ -1903,11 +1988,11 @@ Lueg au d Lischt vu dr [[Special:WantedCategories|gwinschte Kategorie]].',
 'sp-deletedcontributions-contribs' => 'Byyträg',
 
 # Special:LinkSearch
-'linksearch' => 'Netzgleicher',
+'linksearch' => 'Weblinksuechi',
 'linksearch-pat' => 'Suechmuschter:',
 'linksearch-ns' => 'Namensruum:',
 'linksearch-ok' => 'Sueche',
-'linksearch-text' => 'S chönne Platzhalter wie "*.wikipedia.org" benutzt werre.<br />Unterschtützti Protokoll: <tt>$1</tt>',
+'linksearch-text' => 'Die Spezialsyte macht d Suechi no Syte megli, wu s bstimmti Weblink din het. Doderby chenne Platzhalter wie zem Byschpel <tt>*.byschpel.de</tt> brucht wäre. S mueß zmindecht ei Top-Level-Domain, z. B. „*.org“. aagee wäre. <br />Unterstitzti Protokoll: <tt>$1</tt> (Die bitte nit bi dr Suechaafrog aagee.)',
 'linksearch-line' => '$1 isch vo $2 verknüpft',
 'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
 
@@ -2013,7 +2098,7 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 'watchmethod-list' => 'Iberpriefe vu dr Beobachtigslischt no letschte Bearbeitige',
 'watchlistcontains' => 'In Dyynere Beobachtigslischt het s $1 {{PLURAL:$1|Syte|Syte}}.',
 'iteminvalidname' => 'Probläm mit em Yytrag „$1“, uugiltige Name.',
-'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}.",
+'wlnote' => "Do {{PLURAL:$1|chunnt di letscht Änderig|chemme di letschte '''$1''' Änderige}} vu dr letschte {{PLURAL:$2|Stund|'''$2''' Stunde}}. Stand: $3, $4 Uhr.",
 'wlshowlast' => 'Zeig di letschte $1 Stunde $2 Tage $3',
 'watchlist-options' => 'Aazeigoptione',
 
@@ -2119,7 +2204,10 @@ Lueg d [[Special:ProtectedPages|Lischt vu dr gschitzte Syte]] fir alli zurzyt gs
 'unprotectedarticle' => 'het dr Schutz vu „[[$1]]“ ufghebt',
 'movedarticleprotection' => 'het dr Syteschutz vu „[[$2]]“ uf „[[$1]]“ ibertrait',
 'protect-title' => 'Schutz vu „$1“ ändere',
+'protect-title-notallowed' => 'Schutz aaluege vu „$1“',
 'prot_1movedto2' => '[[$1]] isch uf [[$2]] verschobe worde.',
+'protect-badnamespace-title' => 'Nit-schitzbare Namensruum',
+'protect-badnamespace-text' => 'Syte in däm Namensruum chenne nit gschitzt wäre.',
 'protect-legend' => 'Syteschutzstatus ändere',
 'protectcomment' => 'Grund:',
 'protectexpiry' => 'Gsperrt bis:',
@@ -2204,6 +2292,7 @@ In däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess
 
 Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
 'undelete-header' => 'Lueg im [[Special:Log/delete|Lesch-Logbuech]] no Syte, wu in dr letschte Zyt glescht wore sin.',
+'undelete-search-title' => 'Gleschti Syte sueche',
 'undelete-search-box' => 'Suech no gleschte Syte',
 'undelete-search-prefix' => 'Zeig d Syte aa, wu aafange mit:',
 'undelete-search-submit' => 'Sueche',
@@ -2212,6 +2301,7 @@ Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un w
 'undelete-bad-store-key' => 'D Dateiversion mit em Zytstämpfel $1 het nit chenne widerhärgstellt wäre: D Datei isch scho vor em Lesche nimmi vorhande gsi.',
 'undelete-cleanup-error' => 'Fähler bim Lesche vu dr nit benutzte Archiv-Version $1.',
 'undelete-missing-filearchive' => 'D Datei mit dr Archiv-ID $1 cha nit widerhärgstellt wäre, wel si nit in dr Datebank vorhanden isch. Villicht isch si scho widerhärgstellt wore.',
+'undelete-error' => 'Bim Widerhärstelle vu dr Syte het s e Fähler gee.',
 'undelete-error-short' => 'Fähler bim Widerhärstelle vu dr Datei $1',
 'undelete-error-long' => 'S sin Fähler bim Widerhärstelle vun ere Datei feschtgstellt wore:
 
@@ -2363,7 +2453,7 @@ Go d Sperri ufhebe lueg d [[Special:BlockList|Lisch vu allene aktive Sperrine]].
 'blocklog-showsuppresslog' => 'Dää Benutzer isch schon emol gsperrt wore un syyni Bearbeitige sin uusblädet wore. S Uusbländigs-Logbuech git s do as Referänz:',
 'blocklogentry' => 'sperrt [[$1]] für d Ziit vo: $2 $3',
 'reblock-logentry' => 'het d Sperri fir „[[$1]]“ gänderet fir dr Zytruum: $2 $3',
-'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|IP-Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
+'blocklogtext' => 'Des isch s Logbuech iber Sperrige un Entsperrige vu Benutzer. Automatisch blockierti IP-Adrässe wäre nit erfasst. Lueg au [[Special:BlockList|Block Lischt]] fir e Lischt vu gsperrte Benutzer.',
 'unblocklogentry' => 'het d Sperri vu „$1“ ufghobe',
 'block-log-flags-anononly' => 'nume Anonymi',
 'block-log-flags-nocreate' => 'Aalege vu Benutzerchonte gsperrt',
@@ -2499,9 +2589,11 @@ Bitte wehl e andre Name.',
 'export' => 'Sytenen exportiere',
 'exporttext' => 'Du chasch dr Text un d Versionsgschicht vu einzelne Syte in ere XML-Datei exportiere. Die Datei cha derno in e ander MediaWiki-Wiki importiert wäre iber [[Special:Import|Importiere]].
 Zum Exportiere trag dr Sytetitel in dr Täxtchaschte unter yy, ei Titel pro Zyyle, un wehl us, eb Du di aktuäll Version mitsamt dr eltere Versione (mit dr Versionsgschicht-Zyyle) oder nume di aktuäll Version mit dr Information iber di letscht Bearbeitig. In däm Fall chasch au e Link fir dr Export verwände, z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d Syte "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Alli Syte exportiere',
 'exportcuronly' => 'Numme d aktuelli Version vo dr Syte exportiere, statt dr ganze Versionsgschicht',
 'exportnohistory' => "----
 '''Hywys:''' S Exportiere vo ganzi Versionsgschichte durch des Formular isch us Gründ vo dr Leischtig vum Syschtem abgschaltet worde",
+'exportlistauthors' => 'Fir jedi Syte di vollständig Lischt vu dr Bearbeiter derzue tue',
 'export-submit' => 'Sytene exportiere',
 'export-addcattext' => 'Syte us dere Kategori dezuefüege',
 'export-addcat' => 'Dezuefüege',
@@ -2514,7 +2606,7 @@ Zum Exportiere trag dr Sytetitel in dr Täxtchaschte unter yy, ei Titel pro Zyyl
 # Namespace 8 related
 'allmessages' => 'Systemnochrichte',
 'allmessagesname' => 'Name',
-'allmessagesdefault' => 'Standard-Tekscht',
+'allmessagesdefault' => 'Standardtext',
 'allmessagescurrent' => 'jetzige Tekscht',
 'allmessagestext' => 'Des isch e Lischt vu allene meglige Syschtemnochrichte us em MediaWiki Namensruum.
 Lueg au uf [//www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//translatewiki.net translatewiki.net], wänn Du zue dr MediaWiki-Lokalisierig wit byytrage.',
@@ -2534,6 +2626,8 @@ Lueg au uf [//www.mediawiki.org/wiki/Localisation MediaWiki Lokalisierig] un [//
 'thumbnail_error' => 'Fähler bir Härstellig vo re Vorschou: $1',
 'djvu_page_error' => 'DjVu-Syte isch uusserhalb vum Sytebereich',
 'djvu_no_xml' => 'XML-Date chönne für d DjVu-Datei nüt abgruefe werde',
+'thumbnail-temp-create' => 'D Datei fir di temporär Miniaturaasicht het nit chenne aagleit wäre.',
+'thumbnail-dest-create' => 'D Miniaturaasicht het nit chenne an däm Ort gspycheret wäre.',
 'thumbnail_invalid_params' => 'Ungültigs Thumbnail-Parameter',
 'thumbnail_dest_directory' => 'S Ziilverzeichnis cha nüt erstellt werde',
 'thumbnail_image-type' => 'Bildtyp wird nit unterstitzt',
@@ -2561,7 +2655,7 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'imported-log-entries' => '$1 {{PLURAL:$1|lLogbuechyytrag|Logbuechyytreg}} importiert.',
 'importfailed' => 'Dr Import isch misslunge: $1',
 'importunknownsource' => 'Importquell isch unbekannt',
-'importcantopen' => 'D Importdatei het nüt chönne geöffnet werde',
+'importcantopen' => 'D Importdatei het nit chenne ufgmacht wäre.',
 'importbadinterwiki' => 'Falscher Interwiki-Link',
 'importnotext' => 'Leer oder kei Teggscht',
 'importsuccess' => 'Dr Import isch abgschlosse.',
@@ -2580,6 +2674,9 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-invalid-interwiki' => 'Us däm Wiki wo du aagää hesch isch kei Import mögli.',
 'import-error-edit' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z bearbeite.',
 'import-error-create' => 'Die Syte „$1“ isch nit importiert worde, wyl du nit dezue berächtigt bisch, si z erstelle.',
+'import-error-interwiki' => 'D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.',
+'import-error-special' => 'D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.',
+'import-error-invalid' => 'Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.',
 
 # Import log
 'importlogpage' => 'Import-Logbuech',
@@ -2589,6 +2686,17 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-logentry-interwiki' => '„$1“ isch importiert worde (Transwiki)',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versione}} vo $2',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript-Tescht',
+'javascripttest-disabled' => 'Die Funktion isch in däm Wiki nit aktiviert wore.',
+'javascripttest-title' => '$1-Tescht wäre durgfiert',
+'javascripttest-pagetext-noframework' => 'Die Syte isch reserviert fir JavaSkript-Tescht.',
+'javascripttest-pagetext-unknownframework' => 'Nit bekannt Framework „$1“.',
+'javascripttest-pagetext-frameworks' => 'Bitte eis vu däne Framework uuswehle: $1',
+'javascripttest-pagetext-skins' => 'Wehl e Benutzeroberflechi uus fir d Durfierig vu dr Tescht:',
+'javascripttest-qunit-intro' => 'Lueg d [$1 Dokumentation zue Tescht] uf mediawiki.org',
+'javascripttest-qunit-heading' => 'MediaWiki-JavaSkript-QUnit-Teschter',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Dyyni Benutzersyte',
 'tooltip-pt-anonuserpage' => 'D Benutzersyte vo der IP-Adress wo du mit schaffsch',
@@ -2649,6 +2757,8 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'tooltip-diff' => 'Zeigt a, was du am Tekscht hesch veränderet.',
 'tooltip-compareselectedversions' => 'Underschide zwüsche zwo usgwählte Versione vo dere Syten azeige.',
 'tooltip-watch' => 'Tue die Syten uf dyni Beobachtigslischte.',
+'tooltip-watchlistedit-normal-submit' => 'Yytreg uuseneh',
+'tooltip-watchlistedit-raw-submit' => 'D Beobachtigslischt aktualisiere',
 'tooltip-recreate' => 'Die Syte nöi erstelle, trotz dass si emool glöscht worren isch.',
 'tooltip-upload' => 'Aafange mit ufelade',
 'tooltip-rollback' => 'Mach alli letschti Ändrige uf dere Syte, wo vo däm Benutzer gmacht worre sin, ruggängig.',
@@ -3372,6 +3482,9 @@ E [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopi vu dr GNU General Public-Lizänz] sott
 'version-software' => 'Installierti Software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'Yygangspunkt-URL',
+'version-entrypoints-header-entrypoint' => 'Yygangspunkt',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dateipfad',
@@ -3506,6 +3619,8 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
 
 # Feedback
+'feedback-bugornote' => 'Wän Du detailliert e tächnisch Probläm witt bschryybe, no mäld bitte [$1 ne Fähler].
+Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit Dyym Benutzername un dr Version vu Dyym Webbrowser un em Betribssyschtem, uf dr Syte „[$3 $2]“ zuegfiegt.',
 'feedback-subject' => 'Beträff:',
 'feedback-message' => 'Noochricht:',
 'feedback-cancel' => 'Abbräche',
@@ -3514,6 +3629,10 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'feedback-error1' => 'Fäälermäldig: Unbekannts Ergebniss vo de API',
 'feedback-error2' => 'Fääler: Bearbeitig fehlgschlo',
 'feedback-error3' => 'Fäälermäldig: Kei Antwort vo de API',
+'feedback-thanks' => 'Dankschen. Dyy Ruckmäldig isch uf dr Syte „[$2 $1]“ gspycheret wore.',
+'feedback-close' => 'Isch gmacht',
+'feedback-bugcheck' => 'Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.',
+'feedback-bugnew' => 'Ich haa s iberprieft. Dr nej Fähler mälde.',
 
 # API errors
 'api-error-badaccess-groups' => 'Du derfsch keini Dateie in des Wiki uffelade.',
@@ -3524,6 +3643,7 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'api-error-duplicate-archive-popup-title' => 'Doppelti {{PLURAL:$1|Datei, wo scho worde isch|Dateie, wo scho glöscht worde sin}}',
 'api-error-duplicate-popup-title' => 'Dopplet vorhandeni {{PLURAL:$1|Datei|Dateie}}',
 'api-error-empty-file' => 'D Datei, wu Du uffeglade hesch, isch läär.',
+'api-error-emptypage' => 'S isch nit erlaubt, neji lääri Syte aazlege.',
 'api-error-fetchfileerror' => 'Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.',
 'api-error-file-too-large' => 'D Datei, wu Du ibertrait hesch, isch z groß.',
 'api-error-filename-tooshort' => 'Dr Dateiname isch z churz.',
@@ -3548,7 +3668,19 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'api-error-unknown-code' => 'Nit bekannte Fähler: „$1“',
 'api-error-unknown-error' => 'Intärne Fähler: E nit bekannte Fähler isch ufträtte bim Uffelade vu dr Datei.',
 'api-error-unknown-warning' => 'Unbekannti Warnig: $1',
+'api-error-unknownerror' => 'Nit bekannte Fähler: „$1“',
 'api-error-uploaddisabled' => 'S Uffelade isch in däm Wiki deaktiviert.',
 'api-error-verification-error' => 'Die Datei isch entwäder fählerhaft oder si het di falsch Dateinameerwyterig.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekund|Sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minut|Minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stund|Stunde}}',
+'duration-days' => '$1 {{PLURAL:$1|Tag|Täg}}',
+'duration-weeks' => '$1 {{PLURAL:$1|Wuche|Wuche}}',
+'duration-years' => '$1 {{PLURAL:$1|Johr|Johr}}',
+'duration-decades' => '$1 {{PLURAL:$1|Johrzehnt|Johrzeht}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Johrhundert|Johrhundert}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Jahrtöusert|Jahrtöusert}}',
+
 );
index 445fcb1..f6d58d5 100644 (file)
@@ -312,9 +312,9 @@ $messages = array(
 'vector-simplesearch-preference' => 'શોધ સંબંધી વિશિષ્ઠ સુઝાવના પર્યાયને સક્રીય  કરો (Vector skin only)',
 'vector-view-create' => 'બનાવો',
 'vector-view-edit' => 'ફેરફાર કરો',
-'vector-view-history' => 'àª\88તિહાસ જુઓ',
+'vector-view-history' => 'àª\87તિહાસ જુઓ',
 'vector-view-view' => 'વાંચો',
-'vector-view-viewsource' => 'સà«\8dતà«\8dરà«\8bત àª\9cà«\81àª\93',
+'vector-view-viewsource' => 'સ્રોત જુઓ',
 'actions' => 'ક્રિયાઓ',
 'namespaces' => 'નામાવકાશો',
 'variants' => 'ભિન્ન રૂપો',
@@ -350,7 +350,7 @@ $messages = array(
 'newpage' => 'નવું પાનું',
 'talkpage' => 'આ પાના વિષે ચર્ચા કરો',
 'talkpagelinktext' => 'ચર્ચા',
-'specialpage' => 'ખાસ પાનુ',
+'specialpage' => 'ખાસ પાનુ',
 'personaltools' => 'વ્યક્તિગત સાધનો',
 'postcomment' => 'નવો વિભાગ',
 'articlepage' => 'લેખનું પાનું જુઓ',
@@ -523,13 +523,13 @@ $1',
 'wrong_wfQuery_params' => 'wfQuery() માટે અયોગ્ય વિકલ્પો<br />
 Function: $1<br />
 Query: $2',
-'viewsource' => 'સà«\8dતà«\8dરà«\8bત àª\9cà«\81àª\93',
-'viewsource-title' => '$1 àª®àª¾àª\9fà«\87 àª¸à«\8dતà«\8dરà«\8bત àª\9cà«\81વàª\91',
+'viewsource' => 'સ્રોત જુઓ',
+'viewsource-title' => '$1 àª®àª¾àª\9fà«\87 àª¸à«\8dરà«\8bત àª\9cà«\81àª\93',
 'actionthrottled' => 'અકાળે અટાકાવી દીધેલી ક્રિયા',
 'actionthrottledtext' => 'સ્પામ નિયંત્રણ તકેદારી રૂપે આ ક્રિયા અમુક મર્યાદામાં જ કરી શકો છો, અને તમે તે મર્યાદા વટાવી દીધી છે. કૃપા કરી થોડાક સમય પછી ફરી પ્રયત્ન કરો.',
 'protectedpagetext' => 'ફેરફારો થતાં રોકવા માટે આ પાનું સુરક્ષિત કરવામાં આવ્યું છે.',
-'viewsourcetext' => 'àª\86પ àª\86 àªªàª¾àª¨àª¾àª¨à«\8b àª®à«\82ળ àª¸à«\8dતà«\8dરà«\8bત àª¨àª¿àª¹àª¾àª³à«\80 àª¶àª\95à«\8b àª\9bà«\8b àª\85નà«\87 àª¤à«\87નà«\80 àª¨àª\95લ (copy) àªªàª£ àª\95રà«\80 àª¶àª\95à«\8b àª\9bà«\8b:',
-'viewyourtext' => "તમà«\87 àª\9cà«\8bવા àª\85નà«\87''સà«\8dતà«\8dરà«\8bત àª¨àª\95લ àª\95રà«\80 àª¶àª\95à«\8b àª\9bà«\8b  àªªàª° àª¤àª®àª¾àª°àª¾ àª¸àª\82પાદનà«\8b'''àª\86 àªªàª¾àª¨àª¾àª\82 àª¨àª\86",
+'viewsourcetext' => 'આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:',
+'viewyourtext' => "àª\86પ àª\86 àªªàª¾àª¨àª¾àª¨àª¾àª\82 '''àª\86પનાàª\82 àª¸àª\82પાદનà«\8b'''નà«\8b àª®à«\82ળ àª¸à«\8dરà«\8bત àª¨àª¿àª¹àª¾àª³à«\80 àª¶àª\95à«\8b àª\9bà«\8b àª\85નà«\87 àª¤à«\87નà«\80 àª¨àª\95લ (copy) àªªàª£ àª\95રà«\80 àª¶àª\95à«\8b àª\9bà«\8b:",
 'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.',
 'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પુરી પાડે છે.
 અહીંનો બદલાવ બીજા સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
@@ -902,7 +902,7 @@ $2
 'nocreatetitle' => 'પાનું બનાવવૌં મર્યાદિત છે',
 'nocreatetext' => '{{SITENAME}}માં નવું પાનુ બનાવવા ઉપર નિયંત્રણ આવી ગયું છે.
 <br />આપ પાછા જઇને હયાત પાનામાં ફેરફાર કરી શકો છો, નહિતર [[Special:UserLogin|પ્રવેશ કરો કે નવું ખાતું ખોલો]].',
-'nocreate-loggedin' => 'તમને નવા પાના રચવાની પરવાનગી નથી.',
+'nocreate-loggedin' => 'તમને નવાં પાનાં બનાવવાની પરવાનગી નથી.',
 'sectioneditnotsupported-title' => 'ખંડીય સંપાદન શક્ય નથી',
 'sectioneditnotsupported-text' => 'આ પાના પર ખંડીય સંપાદન શક્ય નથી',
 'permissionserrors' => 'પરવાનગીની ખામી',
@@ -1088,10 +1088,10 @@ $1",
 
 # History merging
 'mergehistory' => 'પાનાનાં ઇતિહાસોનું વિલીનીકરણ',
-'mergehistory-header' => 'àª\86 àªªàª¾àª¨à«\81àª\82 àª¤àª®àª¨à«\87 àª¸à«\8dતà«\8dરà«\8bત àªªàª¾àª¨àª¾àª¨à«\8b àª\88તિહાસ àª¨àªµàª¾ àªªàª¾àª¨àª¾àª®àª¾àª\82 àªµàª¿àª²àª¿àª¨ àª\95રવા àª®àª¾àª\82 àª®àª¦àª¦ àª\95રà«\87 àª\9bà«\87.
+'mergehistory-header' => 'આ પાનું તમને સ્રોત પાનાનો ઈતિહાસ નવા પાનામાં વિલિન કરવા માં મદદ કરે છે.
 એ વાતનું ધ્યાન રાખશો કે ઇતિહાસ પાનાની સળંગતા જળવાઇ રહે.',
 'mergehistory-box' => 'બે પાનાના ફેરફાર વિલિન કરો',
-'mergehistory-from' => 'સà«\8dતà«\8dરà«\8bત àªªàª¾àª¨à«\81àª\82',
+'mergehistory-from' => 'સ્રોત પાનું',
 'mergehistory-into' => 'લક્ષ્ય પાનું',
 'mergehistory-list' => 'વિલિનીકરણશીલ ફેરફારનો ઈતિહાસ',
 'mergehistory-merge' => '[[:$1]] દ્વારા કરેલ ફેરફારો [[:$2]] માંવિલિન કરી શકાયા.
@@ -1102,13 +1102,13 @@ $1",
 'mergehistory-empty' => 'પુનરાવર્તન સાચવી ન શકાયા',
 'mergehistory-success' => '[[:$1]] ના $3 {{PLURAL:$3|ફેરફાર |ફેરફારો}} ને સફળતા પૂર્વક  [[:$2]] માં વિલિનાકરાયા.',
 'mergehistory-fail' => 'ઇતિહાસ પાના વિલિન ન કરી શકાયા, પાના અને સમય સંબંધી વિકલ્પો ચકાસો.',
-'mergehistory-no-source' => 'સà«\8dતà«\8dરà«\8bત àªªàª¾àª¨à«\81àª\82 $1 àª\89પલબà«\8dધ àª¨àª¥à«\80.',
+'mergehistory-no-source' => 'સ્રોત પાનું $1 ઉપલબ્ધ નથી.',
 'mergehistory-no-destination' => 'લક્ષ્ય પાનું $1 અસ્તિત્વમાં નથી',
-'mergehistory-invalid-source' => 'સà«\8dતà«\8dરà«\8bત àªªàª¾àª¨à«\81àª\82 àªµà«\88ધ àª¶à«\80રà«\8dષàª\95 àª¹à«\8bવà«\81àª\82 àª\9c àª\9cà«\8bàª\88àª\8f',
+'mergehistory-invalid-source' => 'સà«\8dરà«\8bત àªªàª¾àª¨à«\81àª\82 àªµà«\88ધ àª¶à«\80રà«\8dષàª\95 àª¹à«\8bવà«\81àª\82 àª\9c àª\9cà«\8bàª\88àª\8f.',
 'mergehistory-invalid-destination' => 'લક્ષ્ય પાનું એક  વૈધ શીર્ષક હોવું જોઇએ',
 'mergehistory-autocomment' => ' [[:$1]] ને [[:$2]] માં વિલિન કર્યું',
 'mergehistory-comment' => '[[:$1]] ને [[:$2]]: $3  માં વિલિન કર્યું',
-'mergehistory-same-destination' => 'સà«\8dતà«\8dરà«\8bત àª\85નà«\87 àª²àª\95à«\8dષà«\8dય àªªàª¾àª¨àª¾ àª\8fàª\95ાસમાન ના હોઈ શકે',
+'mergehistory-same-destination' => 'સà«\8dરà«\8bત àª\85નà«\87 àª²àª\95à«\8dષà«\8dય àªªàª¾àª¨àª¾ àª\8fàª\95 સમાન ના હોઈ શકે',
 'mergehistory-reason' => 'કારણ:',
 
 # Merge log
@@ -1119,7 +1119,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1"ના ફેરફારોનો ઇતિહાસ',
-'difference' => '(પુનરાવર્તનો વચ્ચેનો તફાવત)',
 'difference-multipage' => '(પાનાઓ વચ્ચેનો ફેરફાર)',
 'lineno' => 'લીટી $1:',
 'compareselectedversions' => 'પસંદ કરેલા સરખાવો',
@@ -1383,7 +1382,7 @@ HTML નાકું ચકાસો',
 'right-move-subpages' => 'પાનાઓને તેમના ઉપ પાના સાથે ખસેડો.',
 'right-move-rootuserpages' => 'મૂળ સભ્ય પાના હટાવો',
 'right-movefile' => 'ફાઈલો હટાવો',
-'right-suppressredirect' => 'પાના àª¹àª\9fાવતà«\80 àªµàª\96તના àª¸àª®àª¯à«\87 àª¸à«\8dતà«\8dરà«\8bત àªªàª¾àª¨àª¾àª®àª¾àª\82થà«\80 àª¦àª¿àª¶àª¾ àª¨àª¿àª°à«\8dદà«\87શ àªµàª°à«\8dàª\9cà«\80ત',
+'right-suppressredirect' => 'પાના હટાવતી વખતના સમયે સ્રોત પાનામાંથી દિશા નિર્દેશ વર્જીત',
 'right-upload' => 'ફાઇલ ચડાવો',
 'right-reupload' => 'વિહરમાન ફાઇલ પર પુનર્લેખન કરો',
 'right-reupload-own' => 'સભ્ય દ્વારા જાતે ચઢાવેલી તાઇલ પર પુનર્લેખન કરો',
@@ -1481,7 +1480,7 @@ HTML નાકું ચકાસો',
 'nchanges' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'recentchanges' => 'તાજા ફેરફારો',
 'recentchanges-legend' => 'હાલમાં થયેલા ફેરફારોના વિકલ્પ',
-'recentchangestext' => 'આ પાના દ્વારા વિકિમાં થયેલા તાજા ફેરફારો પર ધ્યાન રાખો.',
+'recentchanges-summary' => 'વિકિમાં તાજેતરમાં થયેલા ફેરફારો પર અહિંથી નજર રાખો.',
 'recentchanges-feed-description' => 'આ ફીડ દ્વારા વિકિમાં થયેલા તાજા ફેરફારો પર ધ્યાન રાખો.',
 'recentchanges-label-newpage' => 'આ ફેરફાર દ્વારા નવું પાનું નિર્મિત થયું',
 'recentchanges-label-minor' => 'આ એક નાનો સુધારો છે.',
@@ -1554,7 +1553,7 @@ HTML નાકું ચકાસો',
 'fileuploadsummary' => 'સારાંશ:',
 'filereuploadsummary' => 'ફાઈલ ફેરફારો',
 'filestatus' => 'પ્રકાશનાધિકાર સ્થિતિ',
-'filesource' => 'સà«\8dતà«\8dરà«\8bત:',
+'filesource' => 'સ્રોત:',
 'uploadedfiles' => 'ફાઇલ ચડાવો',
 'ignorewarning' => 'ચેતવણીને અવગણી ને પણ ફાઇલ સાચવો',
 'ignorewarnings' => 'કોઇ પણ ચેતવણી અવગણો',
@@ -1630,9 +1629,9 @@ HTML નાકું ચકાસો',
 વિવરણ : $1',
 'uploadjava' => 'આ ફાઇલ એ ZIP ફાઈલ છે જે Java .class ધરાવે છે.
 Java ફાઇલ ચડાવવાની પરવાનગી નથી, કેમકે તેઓ સુરક્ષા તપાસને અવગણી નાખવાની ક્ષમતા ધરાવે છે.',
-'upload-source' => 'સà«\8dતà«\8dરà«\8bત àª«àª¾àª\87લ',
-'sourcefilename' => 'સà«\8dતà«\8dરà«\8bત àª«àª¾àª\87લ àª¨àª¾àª®',
-'sourceurl' => 'સà«\8dતà«\8dરà«\8bત  URL:',
+'upload-source' => 'સ્રોત ફાઇલ',
+'sourcefilename' => 'સà«\8dરà«\8bત àª«àª¾àª\87લ àª¨àª¾àª®:',
+'sourceurl' => 'સ્રોત  URL:',
 'destfilename' => 'લક્ષ્ય ફાઇલ નામ',
 'upload-maxfilesize' => 'મહત્તમ ફાઈલ કદ : $1',
 'upload-description' => 'ફાઇલ માહિતી',
@@ -1663,7 +1662,7 @@ $1',
 'upload-too-many-redirects' => 'URLમાં ઘણાં ઉપ નિર્દેશનો છે.',
 'upload-unknown-size' => 'અજ્ઞાત કદ',
 'upload-http-error' => ' HTTP ત્રુટિ : $1',
-'upload-copy-upload-invalid-domain' => 'આ વેબસાઇટ પર થી ફાયલ નહી ચડાવાય',
+'upload-copy-upload-invalid-domain' => 'આ વેબસાઇટ પરથી ફાઈલ નહીં ચડાવાય.',
 
 # File backend
 'backend-fail-stream' => 'ફાઈલ $1 ને લાવી ન શકાઈ.',
@@ -1681,7 +1680,7 @@ $1',
 'backend-fail-writetemp' => 'હંગામી ફાઇલમાં લખી ન શકાયું.',
 'backend-fail-closetemp' => 'હંગામી ફાઇલ બંધ ન કરી શકાઇ',
 'backend-fail-read' => 'ફાઈલ $1 ને વાંચી ન શકાઈ.',
-'backend-fail-create' => 'ફાàª\88લ $1 àª¨à«\87 àª¬àª¨àª¾àªµà«\80 àª¶àª\95ાàª\88.',
+'backend-fail-create' => 'ફાàª\88લ $1 àª²àª\96à«\80 àª¶àª\95ાàª\88 àª¨àª¹à«\80àª\82.',
 'backend-fail-readonly' => 'સંગ્રહ પાર્શ્વભૂમિ  "$1" એ હાલમાં માત્ર વાંચન સક્ષમ છે. તેનું કારણ આપવામાં આવ્યું હતું: "$2"',
 'backend-fail-synced' => 'ફાઈલ "$1"  અંતરિક સ્ટોરેજ બેકઍંડ માં એક અસંગત સ્થિતિમાં છે',
 'backend-fail-connect' => 'સંગ્રહ પૃષ્ઠભૂમિ "$1" સાથે સંપર્ક સ્થાપી ના શકાયો.',
@@ -1898,7 +1897,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 તેના કરતા તેને યોગ્ય તે વિષ્ય સાથે જોડાયેલા હોવા જોઇએ.<br />
 આ પાનાને સંદિગ્ધ  વાક્યો વાળા પાના ત્યારે કહી શકાય જ્યારે તે [[MediaWiki:Disambiguationspage]] નામના ઢાંચા સાથે જોડાયેલા હોય.",
 
-'doubleredirects' => 'બનણà«\81àª\82 àª¦àª¿àª¶àª¾àª¨àª¿àª°à«\8dદà«\87શિત',
+'doubleredirects' => 'બમણà«\81àª\82 àª¦àª¿àª¶àª¾àª¨àª¿àª°à«\8dદà«\87શન',
 'doubleredirectstext' => 'આ પાનું દિશા નિર્દેશિત પાના પર થયેલા દિશા નિર્દેશિત પાનાની યાદિ બતાવે છે.
 દરેક લિટીમાં પાના પ્રથમ અને દ્વીતીય દિશા નિર્દેશન ક્ડી બતાવે છે, તે સિવાય દ્વીતીય દિશા નિર્દેશનનું લક્ષ્ય પણ બતાવે છે કે મોટે ભાગે મૂળ પાનું હોઇ શકે છેૢ જેના પર પ્રથમ દિશા નિર્દેશન લક્ષિત છે. <del>Crossed out</del> લિટીઓ  નો ઉત્તર મેળવાયો છે.',
 'double-redirect-fixed-move' => '[[$1]] હટાવી દેવાયું છે.
@@ -1969,9 +1968,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'listusers-creationsort' => 'તારીખ અનુસાર ગોઠવો',
 'usereditcount' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'usercreated' => '$1 તારીખે $2 વાગ્યે {{GENDER:$3|બનાવ્યું}}',
-'newpages' => 'નવા પાના',
+'newpages' => 'નવાં પાનાં',
 'newpages-username' => 'સભ્ય નામ:',
-'ancientpages' => 'સૌથી જૂનાં પાના',
+'ancientpages' => 'સૌથી જૂનાં પાના',
 'move' => 'નામ બદલો',
 'movethispage' => 'આ પાનું ખસેડો',
 'unusedimagestext' => 'નીચેની ફાઇલો અસ્તિત્વમાં તો છે પણ કોઇ પાના પર તેનો ઉપયોગ થયેલ નથી.
@@ -1987,12 +1986,12 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'querypage-disabled' => 'કાર્યક્ષમતાના કારણે આ ખાસ પાનું નિષ્ક્રિ કરાયું છે.',
 
 # Book sources
-'booksources' => 'પà«\81સà«\8dતàª\95 àª¸à«\8dતà«\8dરà«\8bત',
-'booksources-search-legend' => 'પà«\81સà«\8dતàª\95 àª¸à«\8dતà«\8dરà«\8bત àª¶à«\8bધà«\8b',
+'booksources' => 'પુસ્તક સ્રોત',
+'booksources-search-legend' => 'પુસ્તક સ્રોત શોધો',
 'booksources-isbn' => 'આઇએસબીએન:',
 'booksources-go' => 'જાઓ',
 'booksources-text' => 'નીચે દર્શાવેલ યાદી એ કડીઓ બતાવે છે જેઓ નવા અને જૂના પુસ્તકો  વેચે છે , અને તમે માંગેલ વસ્તુ સંબંધિ વધુ મહિતી પણ ધરાવી શકે છે.',
-'booksources-invalid-isbn' => 'આપેલ ISBN વૈધ નથી લાગતો. મૂળ સ્ત્રોત થે ચકાસીને ભૂલ શોધી ખરી માહિતી આપો.',
+'booksources-invalid-isbn' => 'આપેલ ISBN વૈધ નથી લાગતો; મૂળ સ્રોતને ચકાસી, ભૂલ શોધી, ખરી માહિતી આપો.',
 
 # Special:Log
 'specialloguserlabel' => 'અભિનય:',
@@ -2003,6 +2002,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 તમે લોગનો પ્રકાર,સભ્ય નામ અથવા અસરગ્રસ્ત પાના આદિ પસંદ કરી તમારી યાદિ ટૂંકાવી શકો.',
 'logempty' => 'લોગમાં આને મળતી કોઇ વસ્તુ નથી',
 'log-title-wildcard' => 'આ શબ્દો દ્વારા શરૂ થનાર શીર્ષકો શોધો',
+'showhideselectedlogentries' => 'પસંદગીની લોગ નોંધણીઓ બતાવો/છૂપાવો',
 
 # Special:AllPages
 'allpages' => 'બધા પાના',
@@ -2017,10 +2017,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'allpagesprev' => 'પહેલાનું',
 'allpagesnext' => 'પછીનું',
 'allpagessubmit' => 'જાઓ',
-'allpagesprefix' => 'પà«\82રà«\8dવરà«\8dàª\97 àª§àª°àª¾àªµàª¤àª¾ àªªàª¾àª¨àª¾ શોધો',
+'allpagesprefix' => 'àª\89પસરà«\8dàª\97 àª§àª°àª¾àªµàª¤àª¾ àªªàª¾àª¨àª¾àª\82 શોધો',
 'allpagesbadtitle' => 'આપનું ઈચ્છિત શીર્ષક અમાન્ય છે, ખાલી છે, અથવાતો અયોગ્ય રીતે આંતર-ભાષિય કે આંતર-વિકિ સાથે જોડાયેલું શીર્ષક છે.
 શક્ય છે કે તેમાં એક કે વધુ એવા અક્ષર કે ચિહ્નો છે કે જે પાનાનાં શીર્ષક માટે અવૈધ છે.',
 'allpages-bad-ns' => '{{SITENAME}} ને નામસ્થળ  "$1" નથી.',
+'allpages-hide-redirects' => 'અન્યત્ર વાળેલાં પાનાંઓ છૂપાવો',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'આધૂનિક બતાવો.',
 
 # Special:Categories
 'categories' => 'શ્રેણીઓ',
@@ -2048,17 +2052,17 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'linksearch-error' => 'યજમાન નામની શરૂઆતમાં જ વાઈલ્ડકાર્ડ પ્રકટ થશે',
 
 # Special:ListUsers
-'listusersfrom' => 'àª\85હà«\80àª\82થà«\80 àª¸àª­à«\8dયà«\8b àª¬àª¤àª¾àªµà«\8b',
+'listusersfrom' => 'àª\86નાથà«\80 àª¶àª°à«\82 àª¥àª¤àª¾ àª¸àª­à«\8dયà«\8b àª¦àª°à«\8dશાવà«\8b:',
 'listusers-submit' => 'બતાવો',
 'listusers-noresult' => 'કોઇ સભ્ય ન મળ્યો',
 'listusers-blocked' => '(પ્રતિબંધિત)',
 
 # Special:ActiveUsers
-'activeusers' => 'સàª\95à«\8dરà«\80યા àª¸àª­à«\8dય àª\9bà«\81પાવà«\8b',
-'activeusers-intro' => 'àª\9bà«\87લà«\8dલા  $1 {{PLURAL:$1|દિવસ|દિવસà«\8b}}માàª\82 àª\9cà«\87 àª¸àª­à«\8dયà«\8bàª\8f àª\95à«\8bàª\87àª\95 àª¯à«\8bàª\97દાન àª\95રà«\8dયà«\81àª\82 àª¹à«\8bય àª¤à«\87મનà«\80 àª¯àª¾àª¦àª¿.',
+'activeusers' => 'સàª\95à«\8dરિય àª¸àª­à«\8dયà«\8bનà«\80 àª¯àª¾àª¦à«\80',
+'activeusers-intro' => 'àª\9bà«\87લà«\8dલા  $1 {{PLURAL:$1|દિવસ|દિવસà«\8b}}માàª\82 àª\9cà«\87 àª¸àª­à«\8dયà«\8bàª\8f àª\95àª\82àª\88àª\95 àª¯à«\8bàª\97દાન àª\95રà«\8dયà«\81àª\82 àª¹à«\8bય àª¤à«\87મનà«\80 àª¯àª¾àª¦à«\80.',
 'activeusers-count' => '$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} છેલ્લા {{PLURAL:$3|દિવસ |$3 દિવસો }}માં',
 'activeusers-from' => 'આનાથી શરૂ થતા સભ્યો દર્શાવો:',
-'activeusers-hidebots' => 'બà«\8bàª\9fનà«\87 àª¸àª\82તાડો',
+'activeusers-hidebots' => 'બà«\8bàª\9fનà«\87 àª\9bà«\81પાવો',
 'activeusers-hidesysops' => 'પ્રબંધકો છુપાવો',
 'activeusers-noresult' => 'કોઇ સક્રીય સભ્ય ન મળ્યો',
 
@@ -2133,7 +2137,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 ભવિષ્યમાં આ પાના અને તેનાં સંલગ્ન ચર્ચાનાં પાનામાં થનારા ફેરફારોની યાદી ત્યાં આપવામાં આવશે અને આ પાનું [[Special:RecentChanges|તાજેતરમાં થયેલા ફેરફારોની યાદી]]માં ઘાટા અક્ષરે જોવા મળશે, જેથી આપ સહેલાઇથી તેને અલગ તારવી શકો.',
 'removewatch' => 'ધ્યાનસૂચિમાંથી કાઢી નાખો',
 'removedwatchtext' => '"[[:$1]]" શીર્ષક હેઠળનું પાનું [[Special:Watchlist|તમારી ધ્યાનસૂચિમાંથી]] કાઢી નાંખવામાં આવ્યું છે.',
-'watch' => 'ધ્યાન માં રાખો',
+'watch' => 'ધ્યાનમાં રાખો',
 'watchthispage' => 'આ પાનું ધ્યાનમાં રાખો',
 'unwatch' => 'ધ્યાનસૂચિમાંથી હટાવો',
 'unwatchthispage' => 'નીરીક્ષણ બંધ કરો',
@@ -2141,7 +2145,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'notvisiblerev' => 'અન્ય સભ્ય દ્વારા થયેલું સંપાદન ભૂંસી નખાયું છે.',
 'watchnochange' => 'તમારા દ્વારા નિરીક્ષિત પાના આપેલ સમય ગાળામાં ફેરફારીત થયા',
 'watchlist-details' => 'ચર્ચાનાં પાનાં ન ગણતા {{PLURAL:$1|$1 પાનું|$1 પાનાં}} ધ્યાનસૂચીમાં છે.',
-'wlheader-enotif' => '*ઈ-મેલા સૂચના પદ્ધતિ સક્રીય કરાઈ',
+'wlheader-enotif' => '*ઈ-મેલ સૂચના પદ્ધતિ સક્રીય કરાઈ.',
 'wlheader-showupdated' => "*તમારી મુલાકાત લીધા પછી બદલાયેલા પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે",
 'watchmethod-recent' => 'હાલમાં ફેરફાર થયેલ પાનાની ચકાસણી જારી',
 'watchmethod-list' => 'હાલમાં થયેલ ફેરફાર માટે નીરીક્ષીત પાના તપાસાય છે',
@@ -2209,7 +2213,7 @@ $UNWATCHURL
 'historywarning' => "'''ચેતવણી:''' જે પાનું તમે હટાવવા જઇ રહ્યાં છો તેને આશરે $1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}નો ઇતિહાસ છે:",
 'confirmdeletetext' => 'આપ આ પાનું તેના ઇતિહાસ (બધાજ પૂર્વ  ફેરફારો) સાથે હટાવી રહ્યાં છો.
 કૃપા કરી મંજૂરી આપો કે, આપ આમ કરવા ચાહો છો, આપ આના સરા-નરસા પરિણામોથી વાકેફ છો, અને આપ આ કૃત્ય [[{{MediaWiki:Policy-url}}|નીતિ]]ને અનુરૂપ જ કરી રહ્યાં છો.',
-'actioncomplete' => 'àª\95ામ àªªà«\82રà«\81àª\82 àª¥àª\88 àª\97યà«\81àª\82',
+'actioncomplete' => 'àª\95ામ àªªà«\82રà«\8dણ',
 'actionfailed' => 'કાર્ય અસફળ',
 'deletedtext' => '"$1" દૂર કરવામાં આવ્યું છે.
 તાજેતરમાં દૂર કરેલા લેખોની વિગત માટે $2 જુઓ.',
@@ -2415,7 +2419,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'sp-contributions-submit' => 'શોધો',
 
 # What links here
-'whatlinkshere' => 'àª\85હિયાàª\82 àª¶à«\81àª\82 àª\9cà«\8bડાય àª\9bà«\87',
+'whatlinkshere' => 'અહિં શું જોડાય છે',
 'whatlinkshere-title' => '"$1" સાથે જોડાયેલાં પાનાં',
 'whatlinkshere-page' => 'પાનું:',
 'linkshere' => "નીચેના પાનાઓ '''[[:$1]]''' સાથે જોડાય છે:",
@@ -2624,7 +2628,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'moveuserpage-warning' => "'''ચેતવણી :''' તમે સભ્યનું પાનું હટાવી રહ્યાં છો.  કૃપયા યાદરાખશો કે માત્ર પાનું જ હટાવીશકાશે અને સભ્ય્ને નૂતન નામ નહીં અપાય.",
 'movenologin' => 'પ્રવેશ કરેલ નથી',
 'movenologintext' => 'કોઇ પાનું હટાવવા માટે તેમે નોંધણી કૃત સભ્ય અને [[Special:UserLogin|logged in]]  હોવા જોઇએ',
-'movenotallowed' => 'તમનà«\87 àª¨àªµàª¾ àªªàª¾àª¨àª¾ ખસેડવાની પરવાનગી નથી.',
+'movenotallowed' => 'તમનà«\87 àªªàª¾àª¨àª¾àª\82 ખસેડવાની પરવાનગી નથી.',
 'movenotallowedfile' => 'તમને ફાઈલ ખસેડવાની પરવાનગી નથી.',
 'cant-move-user-page' => 'તમને સભ્ય પાના હટાવવાની પરવાનગી નથી (ઉપપાના સિવાય).',
 'cant-move-to-user-page' => 'તમને   કોઇ પાનાને સભ્ય પાનામાં ખસેડવાની પ્રવાનગી નથી (સિવાય કે સભ્ય ઉપપાના)',
@@ -2661,7 +2665,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 શું તમે આને હટાવીને સ્થળાંતર કરવાનો માર્ગ મોકળો કરવા માંગો છો?',
 'delete_and_move_confirm' => 'હા, આ પાનું હટાવો',
 'delete_and_move_reason' => 'હટાવવાનું કામ આગળ વધાવવા ભૂંસી દેવાયુ "[[$1]]"',
-'selfmove' => 'સà«\8dતà«\8dરà«\8bત àª¨à«\87 àª²àª\95à«\8dષà«\8dય àª¶à«\80રà«\8dષàª\95à«\8b àª¸àª®àª¾àª¨ àª\9bà«\87.
+'selfmove' => 'સà«\8dરà«\8bત àª¨à«\87 àª²àª\95à«\8dષà«\8dય àª¶à«\80રà«\8dષàª\95à«\8b àª¸àª®àª¾àª¨ àª\9bà«\87;
 પાના ને તેવા જ નામ ધરાવતા પાના પર પુનઃ સ્થાપન નહીં કરી શકાય.',
 'immobile-source-namespace' => '"$1" નામાસ્થળમાં પાના ન ખસેડી શાકાયા',
 'immobile-target-namespace' => '"$1" નામાસ્થળમાં પાના ન ખસેડી શાકાયા',
@@ -2718,7 +2722,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'allmessages-filter-unmodified' => 'અસંપાદિત',
 'allmessages-filter-all' => 'બધા',
 'allmessages-filter-modified' => 'સુધારીત',
-'allmessages-prefix' => 'પà«\82રà«\8dવરà«\8dàª\97 àª¦à«\8dવારા àª\9aાળો',
+'allmessages-prefix' => 'àª\89પસરà«\8dàª\97 àª¦à«\8dવારા àª\85લàª\97 àª¤àª¾àª°àªµો',
 'allmessages-language' => 'ભાષા:',
 'allmessages-filter-submit' => 'કરો',
 
@@ -2742,27 +2746,27 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'import-interwiki-text' => 'આયાત કરવાના વિકિ અને પાનાનું શીર્ષક પસંદ કરો.
 ફેરફરની તારીખ અને લેખકો વિષે ની માહિતી સચવાશે.
 આંતર વિકિ આયાત આદિ [[Special:Log/import|import log]] માં અંકિત થાય છે.',
-'import-interwiki-source' => 'સà«\8dતà«\8dરà«\8bત àªµàª¿àª\95િ/પાનà«\81àª\82',
+'import-interwiki-source' => 'સà«\8dરà«\8bત àªµàª¿àª\95િ/પાનà«\81àª\82:',
 'import-interwiki-history' => 'આ પાના બધા ઐતિહાસીક ફેરફારોની નકલ કરો',
 'import-interwiki-templates' => 'બધા ઢાંચા શામિલ કરો',
 'import-interwiki-submit' => 'આયાત કરો',
 'import-interwiki-namespace' => 'લક્ષ્ય નામ સ્થળ',
 'import-upload-filename' => 'ફાઇલ નામ',
 'import-comment' => 'ટિપ્પણી:',
-'importtext' => 'àª\95à«\83પયા [[Special:Export|export utility]] àªµàª¾àªªàª°à«\80 àªµàª¿àª\95િ àª¸à«\8dતà«\8dરà«\8bત àªªàª°àª¥à«\80 àª«àª¾àª\87લ àª¨àª¿àª\95ાસ àª\95રà«\8b.
-તà«\87નà«\87 àª¤àª®àª¾àª°àª¾ àª¸àª\82àª\97ણàª\95 પર સાચવો અને અહીં ચડાવો.',
+'importtext' => 'કૃપયા [[Special:Export|export utility]] વાપરી વિકિ સ્રોત પરથી ફાઇલ નિકાસ કરો.
+તà«\87નà«\87 àª¤àª®àª¾àª°àª¾ àª\95à«\89મà«\8dપà«\8dયà«\81àª\9fર પર સાચવો અને અહીં ચડાવો.',
 'importstart' => 'આયાત કામ જારી છે....',
 'import-revision-count' => '$1 {{PLURAL:$1|પુનરાવર્તન|પુનરાવર્તનો}}',
 'importnopages' => 'આયાત કરવા માટે કોઇ પાનું નથી!',
 'imported-log-entries' => 'આયાતી $1 {{PLURAL:$1|log entry|log entries}}.',
 'importfailed' => 'આયાત નિષ્ફળ: <nowiki>$1</nowiki>',
-'importunknownsource' => 'àª\85àª\9cà«\8dàª\9eાત àª\86યાતà«\80 àª¸à«\8dતà«\8dરà«\8bત àªªà«\8dરàª\95ાર',
+'importunknownsource' => 'અજ્ઞાત આયાતી સ્રોત પ્રકાર',
 'importcantopen' => 'આયાતી ફાઈલ નાખોલી શકાઈ',
 'importbadinterwiki' => 'ખરાબ આંતરીકા વિકિ કડી',
 'importnotext' => 'ખાલી કે શબ્દ વિહીન',
 'importsuccess' => 'આયાત સંપૂર્ણ',
 'importhistoryconflict' => 'એક બીજાથી વિસંગત ફેરફારો અસ્તિત્વ ધરાવે છે ( કદાક આ પાનું પહેલાં આયાત કરાયું હોય)',
-'importnosources' => 'àª\95à«\8bàª\87 àªªàª£ àª\86àª\82તર àªµàª¿àª\95િ àª¸à«\8dતà«\8dરà«\8bત àª\9cણાવાયા àª¨àª¥à«\80 àª\85નà«\87 àª¸à«\80ધા àª\87તિહાસ àª«àª¾àª\87લ àª\9aડાવવા àªªàª° àª°à«\8bàª\95 àª²àª¾àª\97à«\87લà«\80 àª\9bà«\87.',
+'importnosources' => 'કોઇ પણ આંતર વિકિ સ્રોત જણાવાયા નથી અને સીધા ઇતિહાસ ફાઇલ ચડાવવા પર રોક લાગેલી છે.',
 'importnofile' => 'કોઇ પણ આયાતી ફાઇલ ન ચડાવી શકાઇ',
 'importuploaderrorsize' => 'આયાતી ફાઇલ ચડાવવાનું અસફળ
 મંજૂર કદ કરતા આ ફાઈલાનું કદ મોટું છે.',
@@ -2817,7 +2821,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'tooltip-ca-talk' => 'અનુક્રમણિકાનાં પાના વિષે ચર્ચા',
 'tooltip-ca-edit' => "આપ આ પાનામાં ફેરફાર કરી શકો છો, કાર્ય સુરક્ષિત કરતાં પહેલાં 'ઝલક' બટન ઉપર ક્લિક કરીને જોઇ લેશો",
 'tooltip-ca-addsection' => 'ચર્ચાનો નવો મુદ્દો ઉમેરો.',
-'tooltip-ca-viewsource' => 'àª\86 àªªàª¾àª¨à«\81 àª¸àª\82રàª\95à«\8dષિત àª\9bà«\87, àª¤àª®à«\87 àª¤à«\87નà«\8b àª¸à«\8dતà«\8dરà«\8bત àª\9cà«\8bàª\87 àª¶àª\95à«\8b àª\9bà«\8b',
+'tooltip-ca-viewsource' => 'આ પાનુ સંરક્ષિત છે, તમે તેનો સ્રોત જોઇ શકો છો',
 'tooltip-ca-history' => 'આ પાનાનાં અગાઉનાં ફેરફારો',
 'tooltip-ca-protect' => 'આ પાનું સુરક્ષિત કરો',
 'tooltip-ca-unprotect' => 'આ પાનું રક્ષણ બદલો',
@@ -3064,7 +3068,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-maxaperturevalue' => 'મહત્તમ ભૂમિ છીદ્ર',
 'exif-subjectdistance' => 'વસ્તુનું અંતર',
 'exif-meteringmode' => 'મીટરીંગ ઢબ',
-'exif-lightsource' => 'પ્રકાશા સ્ત્રોત',
+'exif-lightsource' => 'પ્રકાશ સ્રોત',
 'exif-flash' => 'જબકારો (ફ્લેશ)',
 'exif-focallength' => 'કાંચનું કેન્દ્રીય લંબાઇ (ફોકલ લેંથ)',
 'exif-subjectarea' => 'વિષ્યવસ્તુ  ક્ષેત્ર',
@@ -3075,7 +3079,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-subjectlocation' => 'વસ્તુનું સ્થાન',
 'exif-exposureindex' => 'પ્રકાશાગમ અનુક્ર્મ',
 'exif-sensingmethod' => 'સંવેદનાની રીત',
-'exif-filesource' => 'ફાàª\87લ àª¸à«\8dતà«\8dરà«\8bત',
+'exif-filesource' => 'ફાઇલ સ્રોત',
 'exif-scenetype' => 'દ્રશ્ય પ્રકાર',
 'exif-customrendered' => 'સ્થાનીય ચિત્ર પ્રક્રિયા',
 'exif-exposuremode' => 'પ્રકાશાગમ પ્રકાર',
@@ -3138,8 +3142,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-objectname' => 'લઘુ શીર્ષક',
 'exif-specialinstructions' => 'ખાસ સૂચનાઓ',
 'exif-headline' => 'મથાળું',
-'exif-credit' => 'àª\8bણ àª¸à«\8dવà«\80àª\95ાર/સà«\8dતà«\8dરà«\8bત',
-'exif-source' => 'સà«\8dતà«\8dરà«\8bત',
+'exif-credit' => 'ઋણ સ્વીકાર/સ્રોત',
+'exif-source' => 'સ્રોત',
 'exif-editstatus' => 'ચિત્ર સંપાદનની સ્થિતી',
 'exif-urgency' => 'તાત્કાલિકતા',
 'exif-fixtureidentifier' => 'સાધન નામ',
@@ -3250,7 +3254,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-lightsource-18' => 'પ્રમાણભૂત પ્રકાશ B',
 'exif-lightsource-19' => 'પ્રમાણભૂત પ્રકાશ C',
 'exif-lightsource-24' => 'ISO સ્ટુડીયો ટંગસ્ટન',
-'exif-lightsource-255' => 'પà«\8dરàª\95ાશના àª\85નà«\8dય àª¸à«\8dત્રોત',
+'exif-lightsource-255' => 'àª\85નà«\8dય àªªà«\8dરàª\95ાશ àª¸્રોત',
 
 # Flash modes
 'exif-flash-fired-0' => 'પ્રકાશ ઝબકારો ન થયો',
@@ -3367,7 +3371,7 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'exif-dc-publisher' => 'પ્રકાશક',
 'exif-dc-relation' => 'સંબધિત માધ્યમ',
 'exif-dc-rights' => 'હક્કો',
-'exif-dc-source' => 'સà«\8dતà«\8dરà«\8bત àª®àª¾àª§à«\8dયમ',
+'exif-dc-source' => 'સ્રોત માધ્યમ',
 'exif-dc-type' => 'માધ્યમનો પ્રકાર',
 
 'exif-rating-rejected' => 'નામંજૂર',
@@ -3505,7 +3509,7 @@ $5
 'table_pager_next' => 'આગળનું પાનું',
 'table_pager_prev' => 'પાછળનું પાનું',
 'table_pager_first' => 'પહેલું પાનું',
-'table_pager_last' => 'àª\9bà«\87લà«\8dલà«\82ં પાનું',
+'table_pager_last' => 'àª\9bà«\87લà«\8dલà«\81ં પાનું',
 'table_pager_limit' => 'પ્રતિ પાને $1 વસ્તુ બતાવો',
 'table_pager_limit_label' => 'વસ્તિઓ પ્રતિ પાને',
 'table_pager_limit_submit' => 'જાઓ',
@@ -3726,8 +3730,8 @@ $5
 'newuserlog-byemail' => 'ગુપ્ત સંજ્ઞા ઇ-મેલ દ્વારા મોકલાઇ છે.',
 
 # Feedback
-'feedback-bugornote' => 'àª\9cà«\8b àª¤àª®àª¨à«\87 àª¤àª\95નà«\80àª\95à«\80 àªªà«\8dરà«\8bબà«\8dલà«\87મનà«\87 àªµàª°à«\8dણન àª\95રવા àª®àª¾àª\82àª\97તા àª¹à«\8bય àª¤à«\8b  [$1 report a bug] એ બગ અહીં નોંધાવો.
-àª\85નà«\8dયથા, àª¤àª®à«\87 àª¨à«\87àª\9aà«\87 àª\86પà«\87લ àª¸àª°àª³ àª«à«\8bરà«\8dમ àªµàª¾àª\82àª\9aà«\80 àª¶àª\95à«\8b àª\9bà«\8b. àª¤àª®àª¾àª°à«\80 àª\9fિપà«\8dપણà«\80 "[$3 $2]" àªªàª¾àª¨àª¾ àª\95રવા àª®àª¾àª\9fà«\87, àª¤àª®àª¾àª°àª¾ àª¸àª­à«\8dય àª¨àª¾àª® àª\85નà«\87 àª¬à«\8dરાàª\89àª\9dર àªªà«\8dરàª\95ાર àªµàª¾àªªàª«à«\8b àª\9bà«\8b àª¤à«\87નà«\80 àª®àª¾àª¹àª¿àª¤à«\80 àª\86પà«\8b.',
+'feedback-bugornote' => 'àª\9cà«\8b àª¤àª®à«\87 àª¤àª\95નà«\80àª\95à«\80 àª¸àª®àª¸à«\8dયા àªµàª°à«\8dણવવા àª®àª¾àª\82àª\97તા àª¹à«\8bય àª¤à«\8b  àª\95à«\83પયા [$1 report a bug] એ બગ અહીં નોંધાવો.
+àª\85નà«\8dયથા, àª¤àª®à«\87 àª¨à«\80àª\9aà«\87 àª\86પà«\87લ àª¸àª°àª³ àª«à«\8bરà«\8dમ àªµàª¾àªªàª°à«\80 àª¶àª\95à«\8b àª\9bà«\8b. àª¤àª®àª¾àª°àª¾ àª¸àª­à«\8dય àª¨àª¾àª® àª\85નà«\87 àª\95યà«\81àª\82 àª¬à«\8dરાàª\89àª\9dર àªµàª¾àªªàª°à«\8b àª\9bà«\8b àª¤à«\87નà«\80 àª®àª¾àª¹àª¿àª¤à«\80 àª¸àª¾àª¥à«\87, àª¤àª®àª¾àª°à«\80 àª\9fિપà«\8dપણà«\80નà«\8b "[$3 $2]" àªªàª¾àª¨àª¾àª®àª¾àª\82 àª¸àª®àª¾àªµà«\87શ àª\95રાશà«\87.',
 'feedback-subject' => 'વિષય:',
 'feedback-message' => 'સંદેશ',
 'feedback-cancel' => 'રદ કરો',
@@ -3750,7 +3754,7 @@ $5
 'api-error-duplicate-archive-popup-title' => 'ડ્યુપ્લીકેટ {{PLURAL:$1|ફાઈલ|ફાઈલો}} પહેલેથી મોજુદ છે.',
 'api-error-duplicate-popup-title' => 'આબેહુબ અન્ય {{PLURAL:$1|ફાઈલ|ફાઈલો}}.',
 'api-error-empty-file' => 'તમે ચડાવેલ ફાઈલ ખાલી છે',
-'api-error-emptypage' => 'નવા ખાલી પાના રચવાની અપ્રવાનગી નથી',
+'api-error-emptypage' => 'નવા ખાલી પાનાં બનાવવાની પરવાનગી નથી.',
 'api-error-fetchfileerror' => 'આંતરીક ત્રુટી: ફાઈલ લાવતી વખતે અમુક ગડબડ થઈ',
 'api-error-file-too-large' => 'તમે ચડાવેલી ફાઈલ ખૂબ મોટી છે',
 'api-error-filename-tooshort' => 'ફાઇલ નામ ખૂબ ટૂંકું છે',
@@ -3779,4 +3783,11 @@ $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-years' => '$1 {{PLURAL:$1|વર્ષ|વર્ષો}}',
+
 );
index b38c6d7..c7fbd44 100644 (file)
@@ -561,7 +561,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
 
 # Diffs
 'history-title' => 'Shennaghys aavriwnys dy "$1"',
-'difference' => '(Anchaslys eddyr aavriwnyssyn)',
 'lineno' => 'Linney $1:',
 'compareselectedversions' => 'Cosoylaghey ny lhiegganyn reiht',
 'editundo' => 'rassey',
@@ -739,7 +738,7 @@ My bailliu eh y chiarail, bee eh ymmydit son cur gys lieh y chur dhyt er son yn
 'nchanges' => '$1 {{PLURAL:$1|caghlaa|chaghlaa|chaghlaa|caghlaaghyn}}',
 'recentchanges' => "Caghlaaghyn s'noa",
 'recentchanges-legend' => "Reihyssyn da ny caghlaaghyn s'noa",
-'recentchangestext' => "Shirr ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
+'recentchanges-summary' => "Shirrey ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
 'recentchanges-feed-description' => "Shirr ny caghlaaghyn jeianagh er y wiki 'sy scoltey shoh.",
 'recentchanges-label-newpage' => 'Ren y reaghey shoh croo duillag noa',
 'recentchanges-label-minor' => "She myn-arraghey t'ayn",
index 25579d0..d9ffb7e 100644 (file)
@@ -329,7 +329,6 @@ Fasali: '''({{int:cur}})''' = bambanci da zubi na yanzu, '''({{int:last}})''' =
 
 # Diffs
 'history-title' => 'Tarihin sauye-sauyen "$1"',
-'difference' => '(Bambanci tsakanin zubi da zubi)',
 'lineno' => 'Layi $1:',
 'compareselectedversions' => 'Kwatanta zaɓaɓɓun zubi',
 'editundo' => 'Janyewa',
index 6ec9c73..a48bd4f 100644 (file)
@@ -599,7 +599,6 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 
 # Diffs
 'history-title' => '"$1" ke siû-thin li̍t-sṳ́',
-'difference' => '(Siû-thin pán-pún-kiên ke chhâ-yi)',
 'lineno' => 'Thi $1-hàng:',
 'compareselectedversions' => 'Pí-káu sién-thin ke pán-pún',
 'editundo' => 'Chhat-sêu',
@@ -735,7 +734,7 @@ Tshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.',
 'nchanges' => '$1-chhṳ kiên-kói',
 'recentchanges' => 'Chui-khiûn ke kiên-kói',
 'recentchanges-legend' => 'Chui-khiun kiên-kói sién-chet',
-'recentchangestext' => 'Kiên-chiûng liá-ke wiki song ke chui-sîn kiên-kói.',
+'recentchanges-summary' => 'Kiên-chiûng liá-ke wiki song ke chui-sîn kiên-kói.',
 'recentchanges-feed-description' => 'Kiên-chiûng chhṳ-thin chhai wiki song chui-khiûn ke kiên-kói.',
 'rcnote' => "Yî-ha he chhai $3, chui-khiûn '''$2''' thiên-nui ke '''$1'''-chhṳ chui-khiûn ke kiên-kói ki-liu̍k:",
 'rcnotefrom' => "Ha-mien he chhṳ '''$2''' (Chui-tô hién-sṳ '''$1'''):",
index 61d0eb5..3776098 100644 (file)
@@ -7,10 +7,12 @@
  * @ingroup Language
  * @file
  *
+ * @author Bulaisen
  * @author Kalani
  * @author Kolonahe
  * @author Node ue
  * @author Singularity
+ * @author Xqt
  */
 
 $namespaceNames = array(
@@ -253,7 +255,7 @@ $messages = array(
 'jumptosearch' => 'huli',
 
 # 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' => 'No {{SITENAME}}',
+'aboutsite' => 'E pili ana iā {{SITENAME}}',
 'aboutpage' => 'Project:E pili ana',
 'copyrightpage' => '{{ns:project}}:Palapala ho‘okuleana',
 'currentevents' => 'Ka nū hou',
@@ -263,7 +265,7 @@ $messages = array(
 'edithelp' => 'Kōkua me ka ho‘ololi ‘ana',
 'edithelppage' => 'Help:Ho‘ololi',
 'helppage' => 'Help:Papa kuhikuhi',
-'mainpage' => 'Papa kinohi',
+'mainpage' => "Kahua pa'a",
 'mainpage-description' => 'Ka papa kinohi',
 'policy-url' => 'Project:Palapala',
 'portal' => 'Ka hui kaiaulu',
@@ -298,7 +300,7 @@ $messages = array(
 'red-link-title' => '$1 (ʻaʻole i kākau ʻia)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'ʻaoʻao',
+'nstab-main' => 'ʻAoʻao',
 'nstab-user' => 'Inoa mea ho‘ohana',
 'nstab-media' => 'Pāpaho',
 'nstab-special' => 'Papa nui',
@@ -453,7 +455,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'revertmerge' => 'Mai hoʻokuʻi pū',
 
 # Diffs
-'difference' => '(Ka ʻokoʻa ma waena o nā hoʻololi)',
 'lineno' => 'Laina $1:',
 'editundo' => 'hoʻihoʻi mai',
 
@@ -589,6 +590,8 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 # Statistics
 'statistics' => 'Papa helu',
 
+'disambiguationspage' => 'Template:Huaʻōlelo puana like',
+
 'brokenredirects-edit' => 'e ho‘ololi',
 'brokenredirects-delete' => 'e kāpae',
 
index dbe60a0..c4a09ad 100644 (file)
@@ -154,7 +154,6 @@ $magicWords = array(
        'localurl'                => array( '0', 'כתובת יחסית:', 'LOCALURL:' ),
        'localurle'               => array( '0', 'כתובת יחסית מקודד:', 'LOCALURLE:' ),
        'articlepath'             => array( '0', 'נתיב הדפים', 'ARTICLEPATH' ),
-       'pageid'                  => array( '0', 'מזהה הדף', 'PAGEID' ),
        'server'                  => array( '0', 'כתובת השרת', 'שרת', 'SERVER' ),
        'servername'              => array( '0', 'שם השרת', 'SERVERNAME' ),
        'scriptpath'              => array( '0', 'נתיב הקבצים', 'SCRIPTPATH' ),
@@ -360,7 +359,7 @@ $messages = array(
 'tog-hidepatrolled' => 'הסתרת שינויים בדוקים ברשימת השינויים האחרונים',
 'tog-newpageshidepatrolled' => 'הסתרת דפים בדוקים ברשימת הדפים החדשים',
 'tog-extendwatchlist' => 'הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף',
-'tog-usenewrc' => 'ש×\99×\9e×\95ש ×\91רש×\99×\9eת ×©×\99× ×\95×\99×\99×\9d ×\90×\97ר×\95× ×\99×\9d ×\9eש×\95פרת (דרוש JavaScript)',
+'tog-usenewrc' => 'ק×\99×\91×\95×¥ ×\94ש×\99× ×\95×\99×\99×\9d ×\9cפ×\99 ×\93×£ ×\91ש×\99× ×\95×\99×\99×\9d ×\94×\90×\97ר×\95× ×\99×\9d ×\95×\91רש×\99×\9eת ×\94×\9eעק×\91 (דרוש JavaScript)',
 'tog-numberheadings' => 'מספור כותרות אוטומטי',
 'tog-showtoolbar' => 'הצגת סרגל העריכה (דרוש JavaScript)',
 'tog-editondblclick' => 'עריכת דפים בלחיצה כפולה (דרוש JavaScript)',
@@ -420,13 +419,13 @@ $messages = array(
 'thursday' => 'חמישי',
 'friday' => 'שישי',
 'saturday' => 'שבת',
-'sun' => "ר×\90ש'",
-'mon' => 'שני',
-'tue' => "ש×\9c×\99'",
-'wed' => "ר×\91×\99'",
-'thu' => "×\97×\9e×\99'",
-'fri' => "ש×\99ש'",
-'sat' => 'שבת',
+'sun' => "×\90'",
+'mon' => "ב'",
+'tue' => "×\92'",
+'wed' => "×\93'",
+'thu' => "×\94'",
+'fri' => "×\95'",
+'sat' => "ש'",
 'january' => 'ינואר',
 'february' => 'פברואר',
 'march' => 'מרץ',
@@ -745,6 +744,10 @@ $2',
 'filereadonlyerror' => 'לא ניתן לשנות את הקובץ "$1" כיוון שמאגר הקבצים "$2" במצב קריאה בלבד.
 
 מנהל המערכת שנעל את המאגר סיפק את ההסבר הבא: "\'\'\'$3\'\'\'".',
+'invalidtitle-knownnamespace' => 'כותרת בלתי־תקינה עם מרחב השם "$2" ושם דף "$3"',
+'invalidtitle-unknownnamespace' => 'כותרת בלתי־תקינה עם מרחב שם בלתי־ידוע מספר $1 ושם דף "$2"',
+'exception-nologin' => 'לא בחשבון',
+'exception-nologin-text' => 'כדי לראות את הדף הזה או לבצע את הפעולה הזאת צריך להיכנס לחשבון באתר הוויקי הזה.',
 
 # Virus scanner
 'virus-badscanner' => "הגדרות שגויות: סורק הווירוסים אינו ידוע: ''$1''",
@@ -776,7 +779,7 @@ $2',
 'notloggedin' => 'לא בחשבון',
 'nologin' => 'אין לכם חשבון? $1.',
 'nologinlink' => 'הרשמה',
-'createaccount' => '×\99צ×\99רת ×\9eשת×\9eש חדש',
+'createaccount' => '×\99צ×\99רת ×\97ש×\91×\95×\9f חדש',
 'gotaccount' => 'כבר נרשמתם? $1.',
 'gotaccountlink' => 'כניסה לחשבון',
 'userlogin-resetlink' => 'שכחת את פרטי הכניסה?',
@@ -1041,7 +1044,8 @@ $2
 'updated' => '(מעודכן)',
 'note' => "'''הערה:'''",
 'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
-השינויים שלכם טרם נשמרו! [[#editform|← להמשך העריכה]]",
+השינויים שלכם טרם נשמרו!",
+'continue-editing' => 'להמשך העריכה',
 'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.',
 'session_fail_preview' => "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''
 אנא נסו שוב.
@@ -1134,6 +1138,12 @@ $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' => 'עומק ההרחבה בדף גדול מדי',
+'parser-unstrip-loop-warning' => 'נמצאה לולאה בפריסה',
+'parser-unstrip-recursion-limit' => 'עומק הרקורסיה של הפריסה עבר את המגבלה ($1)',
 
 # "Undo" feature
 'undo-success' => 'ניתן לבטל את העריכה. אנא בִדקו את השוואת הגרסאות למטה כדי לוודא שזה מה שאתם רוצים לעשות, ואז שמרו את השינויים למטה כדי לבצע את ביטול העריכה.',
@@ -1276,7 +1286,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'יומן הסתרות',
 'suppressionlogtext' => 'להלן רשימת המחיקות והחסימות הכוללות תוכן המוסתר ממפעילי המערכת.
-ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\9bת×\95×\91×\95ת ×\94Ö¾IP ×\94×\97ס×\95×\9e×\95ת]] לרשימת החסימות הפעילות כעת.',
+ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] לרשימת החסימות הפעילות כעת.',
 
 # History merging
 'mergehistory' => 'מיזוג גרסאות של דפים',
@@ -1310,8 +1320,9 @@ $1",
 'mergelogpagetext' => 'זוהי רשימה של המיזוגים האחרונים של גרסאות מדף אחד לתוך דף שני.',
 
 # Diffs
-'history-title' => 'היסטוריית הגרסאות של $1',
-'difference' => '(הבדלים בין גרסאות)',
+'history-title' => '$1: היסטוריית גרסאות',
+'difference-title' => '$1: הבדלים בין גרסאות',
+'difference-title-multipage' => '$1 ו{{GRAMMAR:תחילית|$2}}: הבדלים בין דפים',
 'difference-multipage' => '(הבדלים בין דפים)',
 'lineno' => 'שורה $1:',
 'compareselectedversions' => 'השוואת הגרסאות שנבחרו',
@@ -1408,6 +1419,7 @@ $1",
 'prefs-beta' => 'אפשרויות בטא',
 'prefs-datetime' => 'תאריך ושעה',
 'prefs-labs' => 'אפשרויות מעבדה',
+'prefs-user-pages' => 'דפי משתמש',
 'prefs-personal' => 'פרטי המשתמש',
 'prefs-rc' => 'שינויים אחרונים',
 'prefs-watchlist' => 'רשימת המעקב',
@@ -1672,7 +1684,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|שינוי אחד|$1 שינויים}}',
 'recentchanges' => 'שינויים אחרונים',
 'recentchanges-legend' => 'אפשרויות בשינויים האחרונים',
-'recentchangestext' => 'ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.',
+'recentchanges-summary' => 'ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.',
 'recentchanges-feed-description' => 'ניתן לעקוב אחרי השינויים האחרונים באתר בדף זה.',
 'recentchanges-label-newpage' => 'בעריכה זו נוצר דף חדש',
 'recentchanges-label-minor' => 'זוהי עריכה משנית',
@@ -1881,14 +1893,15 @@ $1',
 'backend-fail-writetemp' => 'לא הייתה אפשרות לכתוב אל הקובץ הזמני.',
 'backend-fail-closetemp' => 'לא הייתה אפשרות לסגור את הקובץ הזמני.',
 'backend-fail-read' => 'קריאת הקובץ $1 לא הצליחה',
-'backend-fail-create' => '×\99צ×\99רת הקובץ $1 לא הצליחה',
-'backend-fail-maxsize' => '×\99צ×\99רת הקובץ $1 לא הצליחה כיוון שהוא גדול יותר {{PLURAL:$2|מבית אחד|מ־$2 בתים}}.',
+'backend-fail-create' => '×\9bת×\99×\91ת הקובץ $1 לא הצליחה',
+'backend-fail-maxsize' => '×\9bת×\99×\91ת הקובץ $1 לא הצליחה כיוון שהוא גדול יותר {{PLURAL:$2|מבית אחד|מ־$2 בתים}}.',
 'backend-fail-readonly' => 'מאגר האחסון לקבצים "$1" הוא כרגע במצב קריאה בלבד. הסיבה שניתנה לכך היא: "\'\'\'$2\'\'\'"',
 'backend-fail-synced' => 'הקובץ "$1" נמצא במצב לא עקבי בתוך מאגרי אחסון הקבצים הפנימיים',
 'backend-fail-connect' => 'לא ניתן היה להתחבר למאגר אחסון הקבצים הפנימי "$1".',
 'backend-fail-internal' => 'אירעה שגיאה בלתי־ידועה במאגר אחסון הקבצים הפנימי "$1".',
 'backend-fail-contenttype' => 'לא ניתן היה לקבוע את סוג התוכן של הקובץ לאחסון ב־"$1".',
 'backend-fail-batchsize' => 'למאגר אחסון הקבצים הפנימי הועבר אוסף של {{PLURAL:$1|פעולת קובץ אחת|$1 פעולות קובץ}}; המגבלה היא {{PLURAL:$2|פעולה אחת|$2 פעולות}}.',
+'backend-fail-usable' => 'כתיבת הקובץ $1 לא הצליחה כיוון שההרשאות אינן מספיקות או כיוון שהספריות/המכלים חסרים.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'לא ניתן היה להתחבר לבסיס הנתונים של היומן עבור מאגר אחסון הקבצים הפנימי "$1".',
@@ -1901,9 +1914,9 @@ $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',
+'lockmanager-fail-db-bucket' => 'לא הייתה אפשרות לקבל מספיק מסדי נתונים של נעילות בדלי $1.',
+'lockmanager-fail-db-release' => 'לא הייתה אפשרות לשחרר נעילות על מסד הנתונים $1.',
+'lockmanager-fail-svr-release' => 'לא הייתה אפשרות לשחרר נעילות על השרת $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'אירעה שגיאה במהלך פתיחת הקובץ לבדיקות ZIP.',
@@ -2210,6 +2223,7 @@ $1',
 ניתן לצמצם את התצוגה על ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).',
 'logempty' => 'אין פריטים תואמים ביומן.',
 'log-title-wildcard' => 'חיפוש כותרות המתחילות באותיות אלה',
+'showhideselectedlogentries' => 'הצגת/הסתרת פעולות היומן שנבחרו',
 
 # Special:AllPages
 'allpages' => 'כל הדפים',
@@ -2230,6 +2244,11 @@ $1',
 'allpages-bad-ns' => 'אין מרחב שם בשם "$1".',
 'allpages-hide-redirects' => 'הסתרת הפניות',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה להיות בת $1.',
+'cachedspecial-viewing-cached-ts' => 'זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה שלא להיות מעודכנת.',
+'cachedspecial-refresh-now' => 'צפייה באחרון.',
+
 # Special:Categories
 'categories' => 'קטגוריות',
 'categoriespagetext' => '{{PLURAL:$1|הקטגוריה הבאה כוללת|הקטגוריות הבאות כוללות}} דפים או קובצי מדיה.
@@ -2366,7 +2385,7 @@ $1',
 'watcherrortext' => 'אירעה שגיאה בעת שינוי הגדרות רשימת המעקב של "$1".',
 
 'enotif_mailer' => 'הודעות {{SITENAME}}',
-'enotif_reset' => '×\9cס×\9e×\9f ×\90ת כל הדפים כאילו נצפו',
+'enotif_reset' => 'ס×\99×\9e×\95×\9f כל הדפים כאילו נצפו',
 'enotif_newpagetext' => 'זהו דף חדש.',
 'enotif_impersonal_salutation' => 'משתמש של {{SITENAME}}',
 'changed' => 'שונה',
@@ -2667,7 +2686,7 @@ $1',
 'blockipsuccesssub' => 'החסימה הושלמה בהצלחה',
 'blockipsuccesstext' => '{{GENDER:$1|המשתמש|המשתמשת}} [[Special:Contributions/$1|$1]] {{GENDER:$1|נחסם|נחסמה}}.
 
-ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\9bת×\95×\91×\95ת ×\94×\97ס×\95×\9e×\95ת]] כדי לצפות בחסימות.',
+ר×\90×\95 ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] כדי לצפות בחסימות.',
 'ipb-blockingself' => 'אתם עומדים לחסום את עצמכם! האם אתם באמת רוצים לעשות את זה?',
 'ipb-confirmhideuser' => 'אתם עומדים לחסום משתמש עם האפשרות "הסתרת משתמש". פעולה זו תסתיר את שם המשתמש בכל הרשימות ופעולות היומן. האם אתם בטוחים שברצונכם לעשות זאת?',
 'ipb-edit-dropdown' => 'עריכת סיבות החסימה',
@@ -2720,7 +2739,7 @@ $1',
 'reblock-logentry' => 'שינה את הגדרות החסימה של [[$1]] עם זמן פקיעה של $2 $3',
 'blocklogtext' => 'זהו יומן פעולות החסימה והשחרור של משתמשים.
 כתובות IP שנחסמו אוטומטית אינן מופיעות.
-ר×\90×\95 ×\92×\9d ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\9bת×\95×\91×\95ת ×\94×\97ס×\95×\9e×\95ת]] לרשימה של החרמות וחסימות פעילות כעת.',
+ר×\90×\95 ×\92×\9d ×\90ת [[Special:BlockList|רש×\99×\9eת ×\94×\97ס×\95×\9e×\99×\9d]] לרשימה של החרמות וחסימות פעילות כעת.',
 'unblocklogentry' => 'שחרר את $1',
 'block-log-flags-anononly' => 'משתמשים אנונימיים בלבד',
 'block-log-flags-nocreate' => 'יצירת חשבונות נחסמה',
@@ -3114,6 +3133,7 @@ $1',
 'spambot_username' => 'מנקה הספאם של מדיה ויקי',
 'spam_reverting' => 'שחזור לגרסה אחרונה שלא כוללת קישורים ל־$1',
 'spam_blanking' => 'כל הגרסאות כוללות קישורים ל־$1, מרוקן את הדף',
+'spam_deleting' => 'כל הגרסאות כוללות קישורים ל־$1, מוחק את הדף',
 
 # Info page
 'pageinfo-title' => 'מידע על "$1"',
@@ -3213,7 +3233,8 @@ $1',
 # Bad image list
 'bad_image_list' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
 
-רק פריטי רשימה (שורות המתחילות עם *) נחשבים. הקישור הראשון בשורה חייב להיות קישור לקובץ שאין להציג.
+רק פריטי רשימה (שורות המתחילות עם *) נחשבים.
+הקישור הראשון בשורה חייב להיות קישור לקובץ בעייתי.
 כל הקישורים הבאים באותה השורה נחשבים לחריגים, כלומר לדפים שבהם ניתן להציג את הקובץ.',
 
 # Metadata
@@ -3880,12 +3901,15 @@ $5
 'version-poweredby-others' => 'אחרים',
 'version-license-info' => "מדיה־ויקי היא תוכנה חופשית; באפשרותכם להפיץ אותה מחדש ו/או לשנות אותה לפי תנאי הרישיון הציבורי הכללי של גנו המפורסם על ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון זה, או (לפי בחירתכם) כל גרסה מאוחרת יותר.
 
\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\9e×\95פצת ×\91תק×\95×\95×\94 ×©×\94×\99×\90 ×ª×\94×\99×\94 ×©×\99×\9e×\95ש×\99ת, ×\90×\9a '''×\9c×\9c×\90 ×\9b×\9c ×\94×\91×\98×\97×\94 ×\9c×\90×\97ר×\99×\95ת'''; ×\90פ×\99×\9c×\95 ×\9c×\90 ×\90×\97ר×\99×\95ת ×\9eשת×\9eעת ×©×\9c '''×\99×\9b×\95×\9cת ×\9c×\94×\99ס×\97ר''' ×\90×\95 '''×\94ת×\90×\9e×\94 ×\9cר×\99ש×\99×\95×\9f ×\9eס×\95×\99×\9d'''. ראו את הרישיון הציבורי הכללי של גנו לפרטים נוספים.
\9e×\93×\99×\94Ö¾×\95×\99ק×\99 ×\9e×\95פצת ×\91תק×\95×\95×\94 ×©×\94×\99×\90 ×ª×\94×\99×\94 ×©×\99×\9e×\95ש×\99ת, ×\90×\9a '''×\9c×\9c×\90 ×\9b×\9c ×\94×\91×\98×\97×\94 ×\9c×\90×\97ר×\99×\95ת'''; ×\90פ×\99×\9c×\95 ×\9c×\90 ×\90×\97ר×\99×\95ת ×\9eשת×\9eעת ×©×\9c '''×\99×\9b×\95×\9cת ×\9c×\94×\99ס×\97ר''' ×\90×\95 '''×\94ת×\90×\9e×\94 ×\9c×\9e×\98ר×\94 ×\9eס×\95×\99×\9eת'''. ראו את הרישיון הציבורי הכללי של גנו לפרטים נוספים.
 
\94×\99×\99ת×\9d ×¦×¨×\99×\9b×\99×\9d ×\9cק×\91×\9c [{{SERVER}}{{SCRIPTPATH}}/COPYING ×\94עתק ×©×\9c ×\94ר×\99ש×\99×\95×\9f ×\94צ×\99×\91×\95ר×\99 ×\94×\9b×\9c×\9c×\99 ×©×\9c ×\92× ×\95] ×\99×\97×\93 ×¢×\9d ×ª×\95×\9b× ×\94 ×\96×\95; ×\90×\9d ×\9c×\90, ×\9bת×\91×\95 ×\9c×\9e×\95ס×\93 ×\9cת×\95×\9b× ×\94 ×\97×\95פש×\99ת: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ×\90×\95 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ×§ראו אותו ברשת].",
\94×\99×\99ת×\9d ×\90×\9e×\95ר×\99×\9d ×\9cק×\91×\9c [{{SERVER}}{{SCRIPTPATH}}/COPYING ×\94עתק ×©×\9c ×\94ר×\99ש×\99×\95×\9f ×\94צ×\99×\91×\95ר×\99 ×\94×\9b×\9c×\9c×\99 ×©×\9c ×\92× ×\95] ×\99×\97×\93 ×¢×\9d ×ª×\95×\9b× ×\94 ×\96×\95; ×\90×\9d ×\9c×\90, ×\9bִת×\91×\95 ×\9c×\9e×\95ס×\93 ×\9cת×\95×\9b× ×\94 ×\97×\95פש×\99ת: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ×\90×\95 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html ×§Ö´ראו אותו ברשת].",
 'version-software' => 'תוכנות מותקנות',
 'version-software-product' => 'תוכנה',
 'version-software-version' => 'גרסה',
+'version-entrypoints' => 'כתובות של נקודות כניסה',
+'version-entrypoints-header-entrypoint' => 'נקודת כניסה',
+'version-entrypoints-header-url' => 'כתובת',
 
 # Special:FilePath
 'filepath' => 'נתיב לקובץ',
@@ -4073,4 +4097,17 @@ $5
 'api-error-uploaddisabled' => 'ההעלאה מבוטלת באתר הוויקי הזה.',
 'api-error-verification-error' => 'קובץ זה עשוי להיות פגום או בעל סיומת שגויה.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|שנייה|$1 שניות}}',
+'duration-minutes' => '{{PLURAL:$1|דקה|$1 דקות}}',
+'duration-hours' => '{{PLURAL:$1|שעה|$1 שעות|שעתיים}}',
+'duration-days' => '{{PLURAL:$1|יום|$1 ימים|יומיים}}',
+'duration-weeks' => '{{PLURAL:$1|שבוע|$1 שבועות|שבועיים}}',
+'duration-years' => '{{PLURAL:$1|שנה|$1 שנים|שנתיים}}',
+'duration-decades' => '{{PLURAL:$1|עשור|$1 עשורים}}',
+'duration-centuries' => '{{PLURAL:$1|מאה שנה|$1 מאות שנים|מאתיים שנה}}',
+'duration-millennia' => '{{PLURAL:$1|אלף שנה|$1 אלפי שנים|אלפיים שנה}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'לא הייתה אפשרות לבצע נעילות על השרת $1.',
 );
index 087c61e..e9ce52d 100644 (file)
@@ -36,6 +36,7 @@
  * @author Reedy
  * @author Sajeel.irkal
  * @author Sayak Sarkar
+ * @author Shantanoo
  * @author Shrish
  * @author Shyam
  * @author Shyam123.ckp
@@ -69,6 +70,97 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'श्रेणी_वार्ता',
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'सक्रिय_सदस्य' ),
+       'Allmessages'               => array( 'सभी_सन्देश', 'सभी_संदेश' ),
+       'Allpages'                  => array( 'सभी_पृष्ठ', 'सभी_पन्ने' ),
+       'Ancientpages'              => array( 'पुराने_पृष्ठ', 'पुराने_पन्ने' ),
+       'Badtitle'                  => array( 'खराब_शीर्षक' ),
+       'Blankpage'                 => array( 'रिक्त_पृष्ठ', 'खाली_पृष्ठ' ),
+       'Block'                     => array( 'अवरोधन', 'आइ_पी_अवरोधन', 'सदस्य_अवरोधन' ),
+       'Blockme'                   => array( 'स्वावरोधन', 'स्व_अवरोधन', 'मुझे_रोकिये' ),
+       'Booksources'               => array( 'पुस्तक_स्रोत', 'किताब_स्रोत' ),
+       'BrokenRedirects'           => array( 'टूटे_पुनर्निर्देश', 'टूटे_अनुप्रेष' ),
+       'Categories'                => array( 'श्रेणियाँ' ),
+       'ChangeEmail'               => array( 'ईमेल_बदलें' ),
+       'ChangePassword'            => array( 'कूटशब्द_बदलें' ),
+       'ComparePages'              => array( 'पृष्ठ_तुलना' ),
+       'Confirmemail'              => array( 'ईमेल_पुष्टि', 'ईमेल_पुष्टि_करें' ),
+       'Contributions'             => array( 'योगदान' ),
+       'CreateAccount'             => array( 'खाता_बनाएँ', 'खाता_बनायें', 'खाता_खोलें' ),
+       'Deadendpages'              => array( 'बन्द_पृष्ठ', 'बन्द_पन्ने' ),
+       'DeletedContributions'      => array( 'हटाए_गए_योगदान', 'हटाये_गये_योगदान' ),
+       'Disambiguations'           => array( 'बहुविकल्पी_कड़ियाँ', 'बहुविकल्पित' ),
+       'DoubleRedirects'           => array( 'दुगुने_पुनर्निर्देश', 'दुगुने_अनुप्रेष' ),
+       'EditWatchlist'             => array( 'ध्यानसूची_सम्पादन', 'ध्यानसूची_संपादन', 'ध्यानसूची_सम्पादन_करें' ),
+       'Emailuser'                 => array( 'ईमेल_करें', 'सदस्य_को_ईमेल_करें' ),
+       'Export'                    => array( 'निर्यात' ),
+       'Fewestrevisions'           => array( 'न्यूनतम_अवतरण', 'कम_सम्पादित_पृष्ठ' ),
+       'FileDuplicateSearch'       => array( 'फ़ाइल_प्रति_खोज', 'फाइल_प्रति_खोज', 'संचिका_प्रति_खोज' ),
+       'Filepath'                  => array( 'फ़ाइल_पथ', 'फाइल_पथ', 'संचिका_पथ' ),
+       'Import'                    => array( 'आयात' ),
+       'Invalidateemail'           => array( 'अप्रमाणित_ईमेल', 'अमान्य_ईमेल', 'ईमेल_अमान्य_करें' ),
+       'BlockList'                 => array( 'अवरोध_सूची', 'अवरोधित_सदस्य_सूची', 'अवरोधित_आइ_पी_सूची' ),
+       'LinkSearch'                => array( 'बाहरी_कड़ी_खोज' ),
+       'Listadmins'                => array( 'प्रबन्धक_सूची', 'प्रबंधक_सूची' ),
+       'Listbots'                  => array( 'बॉट_सूची', 'बौट_सूची' ),
+       'Listfiles'                 => array( 'फ़ाइल_सूची', 'फाइल_सूची' ),
+       'Listgrouprights'           => array( 'सदस्य_समूह_अधिकार', 'अधिकार_सूची' ),
+       'Listredirects'             => array( 'पुनर्निर्देश_सूची', 'अनुप्रेष_सूची' ),
+       'Listusers'                 => array( 'सदस्य_सूची' ),
+       'Lockdb'                    => array( 'डाटाबेस_पर_ताला_लगाएँ' ),
+       'Log'                       => array( 'लॉग', 'लौग' ),
+       'Lonelypages'               => array( 'एकाकी_पृष्ठ', 'अकेले_पृष्ठ' ),
+       'Longpages'                 => array( 'लम्बे_पृष्ठ', 'लंबे_पृष्ठ' ),
+       'MergeHistory'              => array( 'इतिहास_विलय' ),
+       'MIMEsearch'                => array( 'माइम_खोज' ),
+       'Mostcategories'            => array( 'सर्वाधिक_श्रेणीकृत', 'सर्वाधिक_श्रेणियाँ' ),
+       'Mostimages'                => array( 'सर्वाधिक_प्रयुक्त_फ़ाइलें', 'सर्वाधिक_प्रयुक्त_फाइलें' ),
+       'Mostlinked'                => array( 'सर्वाधिक_जुड़े_पृष्ठ' ),
+       'Mostlinkedcategories'      => array( 'सर्वाधिक_प्रयुक्त_श्रेणियाँ' ),
+       'Mostlinkedtemplates'       => array( 'सर्वाधिक_प्रयुक्त_साँचे' ),
+       'Mostrevisions'             => array( 'सर्वाधिक_अवतरण', 'अधिकतम_सम्पादित_पृष्ठ', 'अधिकतम_संपादित_पृष्ठ' ),
+       'Movepage'                  => array( 'स्थानान्तरण', 'स्थानांतरण', 'नाम_बदलें' ),
+       'Mycontributions'           => array( 'मेरे_योगदान', 'मेरा_योगदान' ),
+       'Mypage'                    => array( 'मेरा_पृष्ठ', 'मेरा_सदस्य_पृष्ठ' ),
+       'Mytalk'                    => array( 'मेरी_वार्ता', 'मेरी_सदस्य_वार्ता' ),
+       'Myuploads'                 => array( 'मेरे_अपलोड' ),
+       'Newimages'                 => array( 'नई_फ़ाइलें', 'नई_फाइलें', 'नये_चित्र' ),
+       'Newpages'                  => array( 'नए_पृष्ठ', 'नए_पन्ने', 'नये_पृष्ठ' ),
+       'PasswordReset'             => array( 'कूटशब्द_पुनर्स्थापन' ),
+       'PermanentLink'             => array( 'स्थाई_कड़ी', 'स्थायी_कड़ी' ),
+       'Preferences'               => array( 'वरीयताएँ' ),
+       'Prefixindex'               => array( 'उपसर्ग_अनुसार_पृष्ठ', 'उपसर्ग_खोज', 'उपसर्ग_सूचकांक' ),
+       'Protectedpages'            => array( 'सुरक्षित_पृष्ठ' ),
+       'Protectedtitles'           => array( 'सुरक्षित_शीर्षक' ),
+       'Search'                    => array( 'खोज', 'खोजें' ),
+       'Shortpages'                => array( 'छोटे_पृष्ठ', 'छोटे_पन्ने' ),
+       'Specialpages'              => array( 'विशेष_पृष्ठ', 'विशेष_पन्ने' ),
+       'Tags'                      => array( 'टैग', 'चिप्पियाँ' ),
+       'Unblock'                   => array( 'अवरोध_हटाएँ', 'अवरोध_हटायें' ),
+       'Uncategorizedcategories'   => array( 'श्रेणीहीन_श्रेणियाँ' ),
+       'Uncategorizedimages'       => array( 'श्रेणीहीन_फ़ाइलें', 'श्रेणीहीन_फाइलें' ),
+       'Uncategorizedpages'        => array( 'श्रेणीहीन_पृष्ठ', 'श्रेणीहीन_पन्ने' ),
+       'Uncategorizedtemplates'    => array( 'श्रेणीहीन_साँचे' ),
+       'Undelete'                  => array( 'पुनर्स्थापन' ),
+       'Unlockdb'                  => array( 'डाटाबेस_से_ताला_हटाएँ' ),
+       'Unusedcategories'          => array( 'अप्रयुक्त_श्रेणियाँ' ),
+       'Unusedimages'              => array( 'अप्रयुक्त_फ़ाइलें', 'अप्रयुक्त_फाइलें' ),
+       'Unusedtemplates'           => array( 'अप्रयुक्त_साँचे' ),
+       'Upload'                    => array( 'अपलोड' ),
+       'Userlogin'                 => array( 'लॉगिन', 'लौगिन', 'सत्रारम्भ', 'सत्रारंभ' ),
+       'Userlogout'                => array( 'सत्रांत', 'लॉग_आउट', 'लौग_आउट' ),
+       'Userrights'                => array( 'सदस्य_अधिकार' ),
+       'Version'                   => array( 'संस्करण', 'वर्ज़न', 'वर्जन' ),
+       'Wantedcategories'          => array( 'वांछित_श्रेणियाँ' ),
+       'Wantedfiles'               => array( 'वांछित_फ़ाइलें', 'वांछित_फाइलें' ),
+       'Wantedpages'               => array( 'वांछित_पृष्ठ', 'वांछित_पन्ने' ),
+       'Wantedtemplates'           => array( 'वांछित_साँचे' ),
+       'Watchlist'                 => array( 'ध्यानसूची' ),
+       'Whatlinkshere'             => array( 'कड़ियाँ', 'यहाँ_की_कड़ियाँ', 'यहाँ_क्या_जुड़ता_है' ),
+       'Withoutinterwiki'          => array( 'अन्तरविकि_रहित', 'अंतरविकि_रहित' ),
+);
+
 $digitTransformTable = array(
        '0' => '०', # &#x0966;
        '1' => '१', # &#x0967;
@@ -474,6 +566,8 @@ $2',
 'ns-specialprotected' => 'विशेष पृष्ठ सम्पादित नहीं किये जा सकते।',
 'titleprotected' => 'सदस्य [[User:$1|$1]] ने इस शीर्षक का पृष्ठ बनाने से सुरक्षित किया हुआ है।
 इसके लिये निम्न कारण दिया गया है: "\'\'$2\'\'"',
+'invalidtitle-knownnamespace' => '"$2" नामस्थान और "$3" नाम वाला गलत शीर्षक',
+'invalidtitle-unknownnamespace' => 'अज्ञात नामस्थान संख्या $1 और नाम "$2" वाला गलत शीर्षक',
 
 # Virus scanner
 'virus-badscanner' => "गलत जमाव: अज्ञात वायरस जाँचक: ''$1''",
@@ -566,6 +660,7 @@ $2',
 'invalidemailaddress' => 'ई-मेल पता नहीं माना जा सकता क्योंकि ये किसी अवैध स्वरूप में है।
 कृपया एक सही तरीके से स्वरूपित ई-मेल पता दें अथवा उस कोष्ठक को रिक्त ही रहने दें।',
 'cannotchangeemail' => 'इस विकी पर सदस्य खाते का ई-मेल पता नहीं बदला जा सकता।',
+'emaildisabled' => 'यह साइट ई-मेल नहीं भेज सकती।',
 'accountcreated' => 'खाता निर्मित',
 'accountcreatedtext' => '$1 के लिये खाता निर्मित कर दिया गया है।',
 'createaccount-title' => '{{SITENAME}} के लिये खाता बनाएँ',
@@ -767,6 +862,7 @@ $2
 'note' => "'''सूचना:'''",
 'previewnote' => "'''याद रखें, यह केवल एक झलक है।'''
 आपके बदलाव अभी तक संजोये नहीं गए हैं!",
+'continue-editing' => 'संपादन जारी रखें',
 'previewconflict' => 'यह झलक ऊपरी पाठ सम्पादन क्षेत्र में हुए बदलाव दिखाती है, और यदि आप अभी संजोते हैं तो यही पाठ संजोया जाएगा।',
 'session_fail_preview' => "'''क्षमा करें! सेशन डाटा के नष्ट होने के कारण आपके बदलाव संजोये नहीं जा सके।'''
 कृपया पुन: यत्न करें।
@@ -782,6 +878,7 @@ $2
 ऐसा तब भी हो सकता है यदि आप कोई खराब वेब-आधारित अनामक प्रौक्सी प्रयोग कर रहे हों।",
 'edit_form_incomplete' => "'''सम्पादन फ़ॉर्म के कुछ भाग सर्वर तक नहीं पहुँच पाए; जाँच लें कि आपके द्वारा किये बदलाव अक्षुण्ण हैं, और सहेजने का पुनः यत्न करें।'''",
 'editing' => '$1 सम्पादन',
+'creating' => '$1 बनाएँ',
 'editingsection' => '$1 सम्पादन (अनुभाग)',
 'editingcomment' => '$1 सम्पादन (नया अनुभाग)',
 'editconflict' => 'संपादन अंतर्विरोध: $1',
@@ -849,11 +946,12 @@ $2
 'edit-no-change' => 'आपने कोई बदलाव ही नहीं किए, अतः आपके इस संपादन को नज़रंदाज़ कर दिया गया है।',
 'edit-already-exists' => 'नया पृष्ठ बनाया नहीं जा सका।
 यह पहले से मौजूद है।',
+'defaultmessagetext' => 'संदेश का डिफ़ॉल्ट पाठ',
 
 # 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:$1|है|हैं}}।",
 'expensive-parserfunction-category' => 'कीमती पार्सर फ़ंक्शनों का अत्यधिक प्रयोग कर रहे पृष्ठ',
 'post-expand-template-inclusion-warning' => "'''चेतावनी:''' साँचे जुड़ने की सीमा पार हो चुकी है।
 कुछ साँचे नहीं जुड़ेंगे।",
@@ -897,7 +995,7 @@ $2
 लिजण्ड: (चालू) = सद्य अवतरण के बीच में अन्तर,
 (आखिरी) = पिछले अवतरण के बीच में अन्तर, छो = छोटा बदलाव।',
 'history-fieldset-title' => 'इतिहास का विचरण करें',
-'history-show-deleted' => 'à¤\87तिहास à¤¶à¥\8b à¤¨à¤·à¥\8dà¤\9f',
+'history-show-deleted' => 'सà¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤\95à¥\87वल à¤\9bà¥\81पाà¤\8f à¤¹à¥\81à¤\8f à¤\85वतरण à¤¦à¤¿à¤\96ाà¤\8fà¤\81',
 'histfirst' => 'सबसे पुराना',
 'histlast' => 'सबसे नया',
 'historysize' => '($1 {{PLURAL:$1|बाइट}})',
@@ -950,7 +1048,7 @@ $2
 'revdelete-nologid-title' => 'अवैध लॉग प्रविष्टि',
 'revdelete-nologid-text' => 'आपने या तो इस कार्यकलाप को करने के लिए लक्ष्यित लॉग प्रसंग नहीं दिया है या यह प्रविष्टि मौजूद नहीं है।',
 'revdelete-no-file' => 'निर्दिष्ट संचिका मौजूद नहीं है।',
-'revdelete-show-file-confirm' => 'क्या आप वाकई "<nowiki>$1</nowiki>" नामक संचिका का $2 के $3 बजे वाले मिटे हुए अवतरण को देखना चाहते हैं?',
+'revdelete-show-file-confirm' => 'क्या आप वाकई फ़ाइल "<nowiki>$1</nowiki>" के $2 को $3 बजे बने, हटाए जा चुके अवतरण को देखना चाहते हैं?',
 'revdelete-show-file-submit' => 'हाँ',
 'revdelete-selected' => "'''[[:$1]] {{PLURAL:$2|का चुना हुआ|के चुने हुए}} अवतरण:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|चुना हुआ|चुने हुए}} लॉग इवेंट:'''",
@@ -1008,7 +1106,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'छुपाने की लॉग',
-'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है। मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|आइ॰पी ब्लॉक सूची]] देखें।',
+'suppressionlogtext' => 'नीचे प्रबंधकों से छुपाये गए ब्लॉक और हटाये गये पृष्ठों की सूची है।
+मौजूदा ब्लॉक एवं बैन देखने के लिये [[Special:BlockList|ब्लॉक सूची]] देखें।',
 
 # History merging
 'mergehistory' => 'पृष्ठ के इतिहास एकत्रित करें',
@@ -1043,7 +1142,7 @@ $1",
 
 # Diffs
 'history-title' => '"$1" का अवतरण इतिहास',
-'difference' => '(अवतरणों में अंतर)',
+'difference-title' => '"$1" के अवतरणों में अंतर',
 'difference-multipage' => '(पृष्ठों के बीच अन्तर)',
 'lineno' => 'पंक्ति $1:',
 'compareselectedversions' => 'चुने हुए अवतरणों की तुलना करें',
@@ -1140,6 +1239,7 @@ $1",
 'prefs-beta' => 'बीटा विशेषताएँ',
 'prefs-datetime' => 'दिनांक तथा समय',
 'prefs-labs' => 'लैब विशेषताएँ',
+'prefs-user-pages' => 'सदस्य पृष्ठ',
 'prefs-personal' => 'सदस्य व्यक्तिरेखा',
 'prefs-rc' => 'हाल में हुए बदलाव',
 'prefs-watchlist' => 'ध्यानसूची',
@@ -1404,7 +1504,7 @@ HTML टैग की जाँच करें।',
 'nchanges' => '$1 {{PLURAL:$1|बदलाव}}',
 'recentchanges' => 'हाल में हुए बदलाव',
 'recentchanges-legend' => 'हाल के परिवर्तन संबंधी विकल्प',
-'recentchangestext' => 'इस विकि पर हाल में हुए बदलाव इस पृष्ठ पर देखे जा सकते हैं।',
+'recentchanges-summary' => 'इस विकिपर हाल में हुए बदलाव इस पन्ने पर देखें जा सकतें हैं।',
 'recentchanges-feed-description' => 'इस विकि पर हाल में हुए बदलाव इस फ़ीड में देखे जा सकते हैं।',
 'recentchanges-label-newpage' => 'इस संपादन से नया पृष्ठ बना',
 'recentchanges-label-minor' => 'यह एक छोटा सम्पादन है',
@@ -1434,6 +1534,7 @@ HTML टैग की जाँच करें।',
 'newsectionsummary' => '/* $1 */ नया अनुभाग',
 'rc-enhanced-expand' => 'विस्तृत जानकारी दिखाएँ (इसके लिए जावास्क्रिप्ट चाहिए)',
 'rc-enhanced-hide' => 'विस्तृत जानकारी छिपाएँ',
+'rc-old-title' => 'मूल रूप से "$1" नाम से बनाया गया था',
 
 # Recent changes linked
 'recentchangeslinked' => 'पृष्ठ से जुड़े बदलाव',
@@ -1624,6 +1725,7 @@ $1',
 'backend-fail-contenttype' => '"$1" पर संजोने के लिये फ़ाइल का प्रकार नहीं निश्चित किया जा सका।',
 'backend-fail-batchsize' => 'भंडारण बैकेंड को $1 फ़ाइल {{PLURAL:$1|कार्य}} दिये गए थे; सीमा {{PLURAL:$2|$2 कार्य|$2 कार्यों}} की है।',
 
+# File journal errors
 'filejournal-fail-dbconnect' => 'भंडारण बैकेंड "$1" के जर्नल डाटाबेस से सम्पर्क नहीं हो पाया।',
 'filejournal-fail-dbquery' => 'भंडारण बैकेंड "$1" के जर्नल डाटाबेस का अद्यतन नहीं किया जा सका।',
 
@@ -1827,7 +1929,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'statistics-views-total-desc' => 'अविद्यमान पृष्ठों और विशेष पृष्ठों के लिए दृश्य सम्मिलित नहीं हैं',
 'statistics-views-peredit' => 'दृष्य प्रति संपादन',
 'statistics-users' => 'पंजीकृत [[Special:ListUsers|सदस्य]]',
-'statistics-users-active' => 'सà¤\95à¥\8dरà¥\80य सदस्य',
+'statistics-users-active' => 'सà¤\95à¥\8dरिय सदस्य',
 'statistics-users-active-desc' => 'पिछले {{PLURAL:$1|एक दिन|$1 दिनों}} में कुछ गतिविधि रखने वाले सदस्य',
 'statistics-mostpopular' => 'सबसे अधिक देखे गए पृष्ठ',
 
@@ -1862,7 +1964,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|पृष्ठ|पृष्ठों}} पर प्रयुक्त',
@@ -1915,7 +2017,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'move' => 'स्थानान्तरण',
 'movethispage' => 'पृष्ठ का नाम बदलें',
 'unusedimagestext' => 'निम्न फ़ाइलें मौजूद हैं, पर किसी भी पृष्ठ में प्रयुक्त नहीं हैं।
-à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¥\87à¤\82 à¤\95ि à¤\85नà¥\8dय à¤µà¥\87ब à¤¸à¤¾à¤\87à¤\9f à¤\8fà¤\95 à¤¸à¥\80धà¥\80 à¤\95ड़à¥\80 à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤¸à¥\87 à¤\9cà¥\81à¥\9cà¥\80 à¤¹à¥\8b à¤¸à¤\95तà¥\80 à¤¹à¥\88à¤\82, à¤\94र à¤¸à¤\95à¥\8dरà¥\80य उपयोग में होने के बावजूद यहाँ दिखाई जा सकती है।',
+à¤\95à¥\83पया à¤§à¥\8dयान à¤¦à¥\87à¤\82 à¤\95ि à¤\85नà¥\8dय à¤µà¥\87ब à¤¸à¤¾à¤\87à¤\9f à¤\8fà¤\95 à¤¸à¥\80धà¥\80 à¤\95ड़à¥\80 à¤¸à¥\87 à¤«à¤¼à¤¾à¤\87ल à¤¸à¥\87 à¤\9cà¥\81ड़à¥\80 à¤¹à¥\8b à¤¸à¤\95तà¥\80 à¤¹à¥\88à¤\82, à¤\94र à¤¸à¤\95à¥\8dरिय उपयोग में होने के बावजूद यहाँ दिखाई जा सकती है।',
 'unusedcategoriestext' => 'निम्नलिखित श्रेणी पृष्ठ मौजूद हैं जबकि कोई भी पृष्ठ या अन्य श्रेणियाँ इनका प्रयोग नहीं करते हैं।',
 'notargettitle' => 'लक्ष्य नहीं',
 'notargettext' => 'इस क्रिया को करने के लिये आपने लक्ष्य पृष्ठ या सदस्य बताया नहीं है।',
@@ -1961,6 +2063,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'allpagesbadtitle' => 'दिया गया शीर्षक अमान्य था या उसमें अंतरभाषीय अथवा अंतरविकी उपसर्ग था।
 इसमें संभवतः एक या एक से अधिक ऐसे कैरैक्टर हैं जो शीर्षकों में प्रयुक्त नहीं हो सकते हैं।',
 'allpages-bad-ns' => '{{SITENAME}} में "$1" नामस्थान नहीं है।',
+'allpages-hide-redirects' => 'पुनर्निर्देश छुपाएँ',
 
 # Special:Categories
 'categories' => 'श्रेणियाँ',
@@ -1994,8 +2097,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 'listusers-blocked' => '(अवरोधित)',
 
 # Special:ActiveUsers
-'activeusers' => 'सà¤\95à¥\8dरà¥\80य सदस्यों की सूची',
-'activeusers-intro' => 'यह à¤¸à¤\95à¥\8dरà¥\80य à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¹à¥\88 à¤\9cिनà¥\8dहà¥\8bà¤\82नà¥\87 à¤ªà¤¿à¤\9bलà¥\87 $1 {{PLURAL:$1|दिन|दिनà¥\8bà¤\82}} à¤®à¥\87à¤\82 à¤\95à¥\81à¤\9b à¤\97तिविधà¥\80 करी है।',
+'activeusers' => 'सà¤\95à¥\8dरिय सदस्यों की सूची',
+'activeusers-intro' => 'यह à¤¸à¤\95à¥\8dरिय à¤¸à¤¦à¤¸à¥\8dयà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¹à¥\88 à¤\9cिनà¥\8dहà¥\8bà¤\82नà¥\87 à¤ªà¤¿à¤\9bलà¥\87 $1 {{PLURAL:$1|दिन|दिनà¥\8bà¤\82}} à¤®à¥\87à¤\82 à¤\95à¥\81à¤\9b à¤\97तिविधि करी है।',
 'activeusers-count' => '$1 {{PLURAL:$1|सम्पादन}} पिछले $3 {{PLURAL:$3|दिन|दिनों}} में',
 'activeusers-from' => 'इस अक्षर से शुरू होने वाले सदस्य दिखाएँ:',
 'activeusers-hidebots' => 'बॉट छुपाएँ',
@@ -2069,10 +2172,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' => 'ध्यान रखें',
@@ -2218,7 +2321,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'protect-text' => "'''$1''' पृष्ठ का सुरक्षा-स्तर आप यहाँ देख सकते हैं और उसे बदल भी सकते हैं।",
 'protect-locked-blocked' => "आप बाधित होने की स्थिति में सुरक्षा स्थर में परिवर्तन नहीं कर सकते।
 पृष्ठ '''$1''' की वर्तमान स्थिति यह है:",
-'protect-locked-dblock' => "डà¥\87à¤\9fाबà¥\87स à¤®à¥\87à¤\82 à¤¸à¤\95à¥\8dरà¥\80य लॉक होने की वजह से सुरक्षा स्तर में कोई परिवर्तन नहीं किया जा सकता।
+'protect-locked-dblock' => "डà¥\87à¤\9fाबà¥\87स à¤®à¥\87à¤\82 à¤¸à¤\95à¥\8dरिय लॉक होने की वजह से सुरक्षा स्तर में कोई परिवर्तन नहीं किया जा सकता।
 पृष्ठ '''$1''' की वर्तमान स्थिति यह है:",
 'protect-locked-access' => "आपको इस पृष्ठ का सुरक्षा-स्तर बदलने की अनुमति नहीं है।
 '''$1''' का वर्तमान सुरक्षा-स्तर यह है:",
@@ -2315,7 +2418,7 @@ $2 द्वारा संपादित अन्तिम अवतरण 
 'undelete-error-long' => 'फ़ाईल पुनर्स्थापित करने में आई हुई समस्याएं:
 
 $1',
-'undelete-show-file-confirm' => 'à¤\95à¥\8dया à¤\86प à¤µà¤¾à¤¸à¥\8dतव à¤®à¥\87à¤\82 à¤¸à¤\82à¤\9aिà¤\95ा "<nowiki>$1</nowiki>" à¤\95à¥\87 $2 à¤\95à¥\8b $3 à¤¬à¤\9cà¥\87 à¤¬à¤¨à¥\87, à¤®à¤¿à¤\9fाà¤\8f à¤\9cा à¤\9aà¥\81à¤\95à¥\87 à¤¸à¤\82सà¥\8dà¤\95रण को देखना चाहते हैं?',
+'undelete-show-file-confirm' => 'à¤\95à¥\8dया à¤\86प à¤µà¤¾à¤\95à¤\88 à¤«à¤¼à¤¾à¤\87ल "<nowiki>$1</nowiki>" à¤\95à¥\87 $2 à¤\95à¥\8b $3 à¤¬à¤\9cà¥\87 à¤¬à¤¨à¥\87, à¤¹à¤\9fाà¤\8f à¤\9cा à¤\9aà¥\81à¤\95à¥\87 à¤\85वतरण को देखना चाहते हैं?',
 'undelete-show-file-submit' => 'हाँ',
 
 # Namespace form on various pages
@@ -2328,7 +2431,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' => 'इन कसौटियों से मिलनेवाले बदलाव मिले नहीं।',
@@ -2362,14 +2465,14 @@ $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' => '← कड़ियाँ',
-'whatlinkshere-hideredirs' => '$1 à¤\85नà¥\81पà¥\8dरà¥\87षितà¥\87à¤\82',
+'whatlinkshere-hideredirs' => '$1 à¤ªà¥\81नरà¥\8dनिरà¥\8dदà¥\87श',
 'whatlinkshere-hidetrans' => '$1 ट्रान्स्क्ल्युजन्स',
-'whatlinkshere-hidelinks' => '$1 à¤\95ड़ियाà¤\82',
-'whatlinkshere-hideimages' => '$1 à¤\9aितà¥\8dर à¤\95ड़ियाà¤\82',
+'whatlinkshere-hidelinks' => '$1 à¤\95ड़ियाà¤\81',
+'whatlinkshere-hideimages' => '$1 à¤\9aितà¥\8dर à¤\95ड़ियाà¤\81',
 'whatlinkshere-filters' => 'छन्ने',
 
 # Block/unblock
@@ -2569,7 +2672,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 'movenologin' => 'लॉग इन नहीं किया',
 'movenologintext' => 'लेख स्थानान्तरित करने के लिये आपका [[Special:UserLogin|लॉग इन]] किया होना आवश्यक हैं।',
 'movenotallowed' => 'आपको पृष्ठ स्थानांतरित करने की अनुमति नहीं है।',
-'movenotallowedfile' => 'à¤\86पà¤\95à¥\8b à¤¸à¤\82à¤\9aिà¤\95ाà¤\8fà¤\81 स्थानांतरित करने की अनुमति नहीं है।',
+'movenotallowedfile' => 'à¤\86पà¤\95à¥\8b à¤«à¤¼à¤¾à¤\87लà¥\87à¤\82 स्थानांतरित करने की अनुमति नहीं है।',
 'cant-move-user-page' => 'आपको सदस्य पृष्ठ स्थानांतरित करने की अनुमति नही है (सिवाय उप पन्नों के)।',
 'cant-move-to-user-page' => 'आपको किसी पन्नो को सदस्य पृष्ठ पर ले जाने की अनुमति नहीं है (सिवाय सदस्य उप पृष्ठ के)',
 'newtitle' => 'नये शीर्षक की ओर:',
@@ -2588,17 +2691,17 @@ $1 को बाध्य करने का कारण है: "$2"',
 'move-subpages' => 'उप पृष्ठ भी ले जाएँ ($1 तक)',
 'move-talk-subpages' => 'वार्ता पृष्ठ के उप पृष्ठ भी ले जाएँ ($1 तक)',
 'movepage-page-exists' => '$1 पृष्ठ पहले से अस्तित्वमें हैं और उसपर अपनेआप पुनर्लेखन नहीं कर सकतें।',
-'movepage-page-moved' => '$1 à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ $2 à¤\87स à¤¨à¤¾à¤®à¤ªà¤° à¤¸à¥\8dथानाà¤\82तरित à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या।',
-'movepage-page-unmoved' => '$1 à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ $2 à¤\87स à¤¨à¤¾à¤®à¤ªà¤° à¤¸à¥\8dथानाà¤\82तरित à¤¨à¤¹à¥\80à¤\82 à¤\95र à¤ªà¤¾à¤¯à¥\87à¤\82।',
-'movepage-max-pages' => 'ज्यादासे ज्यादा $1 पृष्ठ स्थानांतरित कर {{PLURAL:$1|दिया गया है|दिये गये हैं}}, अब और पृष्ठ अपनेआप स्थानांतरित नहीं होंगे।',
-'movelogpage' => 'सà¥\8dथानानà¥\8dतरण à¤¸à¥\82à¤\9aà¥\80',
-'movelogpagetext' => 'नाम à¤¬à¤¦à¤²à¥\87 à¤\97यà¥\87 à¤²à¥\87à¤\96à¥\8bà¤\82à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¨à¥\80à¤\9aà¥\87 à¤¦à¥\80 à¤\97à¤\88 à¤¹à¥\88à¤\82।',
+'movepage-page-moved' => '$1 à¤ªà¥\83षà¥\8dठ $2 à¤¨à¤¾à¤® à¤ªà¤° à¤¸à¥\8dथानाà¤\82तरित à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88।',
+'movepage-page-unmoved' => '$1 à¤ªà¥\83षà¥\8dठ $2 à¤¨à¤¾à¤® à¤ªà¤° à¤¸à¥\8dथानाà¤\82तरित à¤¨à¤¹à¥\80à¤\82 à¤\95िया à¤\9cा à¤¸à¤\95ा।',
+'movepage-max-pages' => '$1 की अधिकतम सीमा तक पृष्ठ स्थानांतरित कर {{PLURAL:$1|दिया गया है|दिये गये हैं}}, अब और पृष्ठ अपने-आप स्थानांतरित नहीं होंगे।',
+'movelogpage' => 'सà¥\8dथानानà¥\8dतरण à¤²à¥\89à¤\97',
+'movelogpagetext' => 'नà¥\80à¤\9aà¥\87 à¤¸à¤­à¥\80 à¤¸à¥\8dथानानà¥\8dतरणà¥\8bà¤\82 à¤\95à¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¦à¥\80 à¤\97à¤\88 à¤¹à¥\88।',
 'movesubpage' => '{{PLURAL:$1|उप पृष्ठ|उप पृष्ठ}}',
 'movesubpagetext' => 'नीचे $1 {{PLURAL:$1|पृष्ठ दिखाया गया है, जो इस पृष्ठ का उप पृष्ठ है|पृष्ठ दिखाया गया है, जो इस पृष्ठ के उप पृष्ठ हैं}}।',
 'movenosubpage' => 'इस पृष्ठ के कोई उपपृष्ठ नहीं हैं।',
 'movereason' => 'कारण:',
 'revertmove' => 'पुराने अवतरण पर ले जाएं',
-'delete_and_move' => 'हà¤\9fाया à¤\94र à¤¨à¤¾à¤® à¤¬à¤¦à¤²à¤¾',
+'delete_and_move' => 'हà¤\9fाà¤\8fà¤\81 à¤\94र à¤¨à¤¾à¤® à¤¬à¤¦à¤²à¥\87à¤\82',
 'delete_and_move_text' => '==हटाने की जरूरत==
 लक्ष्य पृष्ठ "[[:$1]]" पहले से अस्तित्वमें हैं।
 नाम बदलने के लिये क्या आप इसे हटाना चाहतें हैं?',
@@ -2632,6 +2735,7 @@ $1 को बाध्य करने का कारण है: "$2"',
 पृष्ठों को निर्यात करने के लिए, नीचे विषय वस्तु संदूक में शीर्षक प्रवेश करें, एक शीर्षक प्रति पंक्ति, और चुने कि आप वर्त्तमान अवतरण के साथ पुराने अवतरण भी चाहते हैं कि नहीं, या पिछले संपादन के बारे में जानकारी के साथ केवल वर्त्तमान अवतरण चाहते हैं।
 
 बाद वाली स्थिति के लिए आप एक सम्पर्क भी प्रयोग कर सकते हैं, उदाहरण के लिए, "[[{{MediaWiki:Mainpage}}]]" पृष्ठ के लिए [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]।',
+'exportall' => 'सभी पृष्ठ निर्यात करें',
 'exportcuronly' => 'पूरा इतिहास नहीं चाहियें, सिर्फ अभी का अवतरण अंतर्भूत करें',
 'exportnohistory' => "----
 '''सूचना:''' इस फॉर्म का इस्तेमाल कर पृष्ठका पूरा इतिहास निर्यात करना परफॉर्मेन्स के चलते रोक दिया गया हैं।",
@@ -3194,12 +3298,12 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-2' => 'वन चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-4' => 'थ्री चीप कलर एरीया सेन्सर',
 'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
 'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
-'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
+'exif-sensingmethod-8' => 'कलर सिक्वेंशीयल लिनीयर सेन्सर',
 
 'exif-filesource-3' => 'डिजिटल स्टिल कैमरा',
 
@@ -3555,6 +3659,7 @@ $5
 'version-software' => 'इन्स्टॉल की हुई प्रणाली',
 'version-software-product' => 'प्रोडक्ट',
 'version-software-version' => 'अवतरण',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:FilePath
 'filepath' => 'सञ्चिका पथ',
@@ -3685,7 +3790,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
@@ -3742,4 +3847,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 1101e99..80c55df 100644 (file)
@@ -970,7 +970,6 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
 
 # Diffs
 'history-title' => '"$1" ke sansodhan ke itihaas',
-'difference' => '(Badlao me farak)',
 'difference-multipage' => '(Panna ke biich ke antar)',
 'lineno' => 'Rekha $1:',
 'compareselectedversions' => 'Chuna gae version ke compare karo',
@@ -1329,7 +1328,7 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'nchanges' => '$1 {{PLURAL:$1|badlao|badlao}}',
 'recentchanges' => 'Nawaa badlao',
 'recentchanges-legend' => 'Nawaa badlao options',
-'recentchangestext' => 'Wiki me ii panna ke nawaa badlao pe dhyan rakho.',
+'recentchanges-summary' => 'Wiki me ii panna ke nawaa badlao pe dhyan rakho.',
 'recentchanges-feed-description' => 'Abhi haali me bhae ii wiki ke feed me ke track karo.',
 'recentchanges-label-newpage' => 'Ii badlao ek nawaa panna banais hae',
 'recentchanges-label-minor' => 'Ii ek chhota badlao hae',
index 878399c..685779d 100644 (file)
@@ -986,7 +986,6 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 
 # Diffs
 'history-title' => 'Rebisyon sang historya sa "$1"',
-'difference' => '(Naglain sa tunga sang mga rebisyon)',
 'difference-multipage' => '(Kinala-in sang mga panid)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
index 6ecdbda..20a65da 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Croatian (Hrvatski)
+/** Croatian (hrvatski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -15,6 +15,7 @@
  * @author Dnik
  * @author Ex13
  * @author Excaliboor
+ * @author FriedrickMILBarbarossa
  * @author Herr Mlinka
  * @author Kaganer
  * @author Luka Krstulovic
@@ -779,7 +780,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.',
@@ -977,6 +978,7 @@ Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
 'updated' => '(Ažurirano)',
 'note' => "'''Napomena:'''",
 'previewnote' => "'''Ne zaboravite da je ovo samo pregled kako će stranica izgledati i da stranica još nije snimljena!'''",
+'continue-editing' => 'Nastavi uređivati',
 'previewconflict' => 'Ovaj pregled odražava stanje u gornjem polju za unos koje će biti sačuvano
 ako pritisnete "Sačuvaj stranicu".',
 'session_fail_preview' => "'''Ispričavamo se! Nismo mogli obraditi Vašu izmjenu zbog gubitka podataka o prijavi.
@@ -991,6 +993,7 @@ Stoga je uređivanje odbačeno da se spriječi uništavanje teksta stranice.
 To se ponekad događa kad rabite neispravan web-baziran anonimni posrednik (proxy).",
 'edit_form_incomplete' => "'''Neki dijelovi obrasca za uređivanja nisu dostigli do poslužitelja; provjerite jesu li izmjene netaknute i pokušajte ponovno.'''",
 'editing' => 'Uređujete $1',
+'creating' => 'Stvori $1',
 'editingsection' => 'Uređujete $1 (odlomak)',
 'editingcomment' => 'Uređujete $1 (novi odlomak)',
 'editconflict' => 'Istovremeno uređivanje: $1',
@@ -1241,7 +1244,7 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 
 # Diffs
 'history-title' => 'Povijest izmjena stranice "$1"',
-'difference' => '(Usporedba među inačicama)',
+'difference-title' => '$1: Razlika između inačica',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Redak $1:',
 'compareselectedversions' => 'Usporedi odabrane inačice',
@@ -1594,7 +1597,7 @@ Ne smije biti duži od $1 {{PLURAL:$1|znaka|znaka|znakova}}.',
 'nchanges' => '{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}}',
 'recentchanges' => 'Nedavne promjene',
 'recentchanges-legend' => 'Izbornik nedavnih promjena',
-'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
+'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
 'recentchanges-feed-description' => 'Na ovoj stranici možete pratiti nedavne promjene u wikiju.',
 'recentchanges-label-newpage' => 'Ova izmjena stvorila je novu stranicu',
 'recentchanges-label-minor' => 'Ovo je manja izmjena',
@@ -2264,7 +2267,7 @@ Molim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu
 'actionfailed' => 'Radnja nije uspjela',
 'deletedtext' => '"$1" je izbrisana.
 Vidi $2 za evidenciju nedavnih brisanja.',
-'dellogpage' => 'Evidencija_brisanja',
+'dellogpage' => 'Evidencija brisanja',
 'dellogpagetext' => 'Dolje je popis nedavnih brisanja.
 Sva vremena su prema poslužiteljevom vremenu.',
 'deletionlog' => 'evidencija brisanja',
@@ -2620,13 +2623,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!'''
@@ -2636,21 +2639,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.',
@@ -3773,7 +3776,7 @@ Slike se na taj način prikazuju u punoj rezoluciji, a drugi tipovi datoteka se
 'sqlite-no-fts' => '$1 bez podrške pretraživanja cijelog teksta',
 
 # New logging system
-'logentry-delete-delete' => '$1 je obrisao stranicu $3',
+'logentry-delete-delete' => '$1 obrisao je stranicu $3',
 'logentry-delete-restore' => '$1 je vratio stranicu $3',
 'logentry-delete-event' => '$1 je promijenio vidljivost {{PLURAL:$5|zapisa u evidenciji|$5 zapisa u evidenciji}} na $3: $4',
 'logentry-delete-revision' => '$1 je promijenio vidljivost {{PLURAL:$5|uređivanja|$5 uređivanja}} na stranici $3: $4',
index b3da4ff..a0ef469 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Upper Sorbian (Hornjoserbsce)
+/** Upper Sorbian (hornjoserbsce)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -160,7 +160,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Dohladawane změny w aktualnych změnach schować',
 'tog-newpageshidepatrolled' => 'Dohladowane strony z lisćiny nowych stronow schować',
 'tog-extendwatchlist' => 'Lisćinu wobkedźbowankow wočinić, zo by wšě změny widźał, nic jenož najnowše',
-'tog-usenewrc' => 'Rozšěrjenu lisćinu aktualnych změnow (trjeba JavaScript) wužiwać',
+'tog-usenewrc' => 'Skupinske změny po stronje w aktualnych změnach a wobkedźbowankach (trjeba JavaScript)',
 'tog-numberheadings' => 'Nadpisma awtomatisce čisłować',
 'tog-showtoolbar' => 'Gratowu lajstu pokazać (wužaduje sej JavaScript)',
 'tog-editondblclick' => 'Strony z dwójnym kliknjenjom wobdźěłować (wužaduje sej JavaScript)',
@@ -538,6 +538,10 @@ Podata přičina je \'\'"$2"\'\'.',
 'filereadonlyerror' => 'Njeje móžno dataju "$1" změnić, dokelž datajowy repozitorij "$2" je jenož čitajomny.
 
 Administrator, kiž je jón zawrěł, je tule přičinu podał: "$3".',
+'invalidtitle-knownnamespace' => 'Njepłaćiwy titul z mjenowym rumom "$2" a tekstom "$3"',
+'invalidtitle-unknownnamespace' => 'Njepłaćiwy titul z njeznatym mjenowym rumom $1 a tekstom "$2"',
+'exception-nologin' => 'Njejsy přizjewjeny',
+'exception-nologin-text' => 'Tuta strona abo akcija sej wužaduje, zo sy na tutym wikiju přizjewjeny.',
 
 # Virus scanner
 'virus-badscanner' => "Špatna konfiguracija: Njeznaty wirusowy skener: ''$1''",
@@ -803,7 +807,8 @@ Móžeš [[Special:Search/{{PAGENAME}}|tutón titul strony]] na druhich stronach
 'updated' => '(Zaktualizowany)',
 'note' => "'''Kedźbu:'''",
 'previewnote' => "'''Wobmysl, zo to je jenož přehlad.'''
-Twoje změny hišće njejsu składowane! [[#editform|→ Dale wobdźěłaś]]",
+Twoje změny hišće njejsu składowane!",
+'continue-editing' => 'Dale wobdźěłać',
 'previewconflict' => 'Tutón přehlad zwobraznja tekst w hornim tekstowym polu,  kaž so zjewi, jeli jón składuješ.',
 'session_fail_preview' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
 Spytaj prošu hišće raz.
@@ -895,6 +900,12 @@ 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ł',
+'parser-unstrip-loop-warning' => 'Njeskónčna sekla namakana',
+'parser-unstrip-recursion-limit' => 'Rekursiska hranica překročena ($1)',
 
 # "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ł.',
@@ -1036,7 +1047,7 @@ Prošu přepruwuj protokole.',
 # Suppression log
 'suppressionlog' => 'Protokol potłóčenjow',
 'suppressionlogtext' => 'Deleka je lisćina wušmórnjenjow a zablokowanjow, inkluziwnje wobsaha schowaneho wot administratorow.
-Hlej [[Special:BlockList|Lisćina zablokowanych IP-adresow]] za lisćinu tuchwilnych zablokowanjow.',
+Hlej [[Special:BlockList|Lisćinu blokowanjow]] za lisćinu tuchwilnych zablokowanjow.',
 
 # History merging
 'mergehistory' => 'Stawizny stronow zjednoćić',
@@ -1068,8 +1079,9 @@ Zawěsć, zo tuta změna stawiznisku kontinuitu strony wobchowuje.',
 'mergelogpagetext' => 'Deleka je lisćina najaktualnišich zjednoćenjow stawiznow dweju stronow.',
 
 # Diffs
-'history-title' => 'Stawizny wersijow strony „$1“',
-'difference' => '(rozdźěl mjez wersijomaj)',
+'history-title' => '$1: Wersijowe stawizny',
+'difference-title' => '$1: Rozdźěl mjez wersijemi',
+'difference-title-multipage' => '$1 a $2: Rozdźěl mjez stronami',
 'difference-multipage' => '(Rozdźěl mjez stronami)',
 'lineno' => 'Rjadka $1:',
 'compareselectedversions' => 'Wubranej wersiji přirunać',
@@ -1165,6 +1177,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 'prefs-beta' => 'Betafunkcije',
 'prefs-datetime' => 'Datum a čas',
 'prefs-labs' => 'Laborowe funkcije',
+'prefs-user-pages' => 'Wužiwarske strony',
 'prefs-personal' => 'Wužiwarski profil',
 'prefs-rc' => 'Aktualne změny',
 'prefs-watchlist' => 'Wobkedźbowanki',
@@ -1426,7 +1439,7 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'nchanges' => '$1 {{PLURAL:$1|změna|změnje|změny|změnow}}',
 'recentchanges' => 'Aktualne změny',
 'recentchanges-legend' => 'Opcije aktualnych změnow',
-'recentchangestext' => 'Na tutej stronje móžeš najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
+'recentchanges-summary' => 'Na tutej stronje móžeš najaktualniše změny w {{GRAMMAR:lokatiw|{{SITENAME}}}} wobkedźbować.',
 'recentchanges-feed-description' => 'Slěduj najaktualniše změny {{GRAMMAR:genitiw|{{SITENAME}}}} w tutym kanalu.',
 'recentchanges-label-newpage' => 'Tuta změna je nowu stronu wutworiła',
 'recentchanges-label-minor' => 'To je snadna změna',
@@ -1630,14 +1643,15 @@ $1',
 'backend-fail-writetemp' => 'Njeda so do temporerneje dataje pisać.',
 'backend-fail-closetemp' => 'Temporerna dataja njeda so začinić.',
 'backend-fail-read' => 'Dataja $1 njeda so čitać',
-'backend-fail-create' => 'Dataja $1 njeda so wutworić',
-'backend-fail-maxsize' => 'Dataja $1 njeda so wutworić, dokelž je wjetša hač {{PLURAL:$2|$2 bajt|$2 bajtaj|$2 bajty|$2 bajtow}}.',
+'backend-fail-create' => 'Dataja $1 njeda so pisać.',
+'backend-fail-maxsize' => 'Dataja $1 njeda so pisać, dokelž je wjetša hač {{PLURAL:$2|jedyn bajt|$2 bajtaj|$2 bajty|$2 bajtow}}.',
 'backend-fail-readonly' => 'Składowanski backend "$1" da so tuchwilu jenož čitać. Přičina je była: "$2"',
 'backend-fail-synced' => 'Dataja "$1" je znutřka interneho składowanskeho backenda w inkonsistentnym stawje',
 'backend-fail-connect' => 'Zwisk z datajowym składowanskim backendom "$1" móžno njeje.',
 'backend-fail-internal' => 'W składowanskim backendźe "$1" je njeznaty zmylk wustupił.',
 'backend-fail-contenttype' => 'Wobsahowy typ dataje, kotraž ma so na "$1" składować, njeda so zwěsćić.',
 'backend-fail-batchsize' => 'Staplowa dataja, kotraž {{PLURAL:$1|jednu operaciju|$1 operaciji|$1 operacije|$1 operacijow}} wobsahuje,  je so  na składowanski backend pósłała; limit je $2 {{PLURAL:$2|operaciju|operaciji|operacije|operacijow}} .',
+'backend-fail-usable' => 'Dataja $1 njeda so njedosahacych prawow  dla abo falowacych zapisow dla pisać.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Njeje žadyn zwisk ze žurnalowej datowej banku za składowanski backend "$1" móžno.',
@@ -1949,6 +1963,7 @@ Prošu wobkedźbuj, zo druhe websydła móža na dataju z direktnym URL wotkazow
 'alllogstext' => 'Kombinowane zwobraznjenje wšěch k dispozicij stejacych protokolow w {{GRAMMAR:lokatiw|{{SITENAME}}}}. Móžeš napohlad wobmjezować, wuběrajo typ protokola, wužiwarske mjeno (dźiwajo na wulkopisanje) abo potrjechu stronu (tež dźiwajo na wulkopisanje).',
 'logempty' => 'Žane wotpowědowace zapiski w protokolu.',
 'log-title-wildcard' => 'Titul započina so z …',
+'showhideselectedlogentries' => 'Wubrane protokolowe zapiski pokazać/schować',
 
 # Special:AllPages
 'allpages' => 'Wšě nastawki',
@@ -1968,6 +1983,11 @@ Prošu wobkedźbuj, zo druhe websydła móža na dataju z direktnym URL wotkazow
 'allpages-bad-ns' => 'Mjenowy rum „$1" w {{grammar:lokatiw|{{SITENAME}}}} njeeksistuje.',
 'allpages-hide-redirects' => 'Dalesposrědkowanja schować',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Wobhladuješ sej pufrowanu wersiju tuteje strony, kotraž móže do $1 stara być.',
+'cachedspecial-viewing-cached-ts' => 'Wobhladuješ sej pufrowanu wersiju tuteje strony, kotraž móhła njeaktualna być.',
+'cachedspecial-refresh-now' => 'Aktualnu wersiju sej wobhladać.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slědowaca kategorija wobsahuje|Slědowacej kategoriji wobsahujetej|Slědowace kategorije wobsahuja|Slědowace kategorije wobsahuja}} strony abo medije.
@@ -2396,8 +2416,8 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'ipb-confirm' => 'Blokowanje wobkrućić',
 'badipaddress' => 'Njepłaćiwa IP-adresa',
 'blockipsuccesssub' => 'Zablokowanje wuspěšne',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bu zablokowany.
-<br />Hlej [[Special:BlockList|lisćinu blokowanjow IP]], zo by zablokowanjow pruwował.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] bu {{GENDER:$1|zablokowany|zablokowana}}.<br />
+Hlej [[Special:BlockList|lisćinu blokowanjow]], zo by zablokowanjow pruwował.',
 'ipb-blockingself' => 'Chceš samoho blokować! Chceš to woprawdźe činić?',
 'ipb-confirmhideuser' => 'Chceš runje wužiwarja z nastajenjom "wužiwarja schować" blokować. To k tomu dowjedźe, zo mjeno wužiwarja so we wšch lisćinach a protokolowych zapiskach potłóči. Chceš to woprawdźe činić?',
 'ipb-edit-dropdown' => 'přičiny zablokowanjow wobdźěłać',
@@ -2447,7 +2467,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'blocklog-showsuppresslog' => 'Tutón wužiwar bu prjedy zablokowany a schowany. Protokol potłóčenjow  so deleka jako referenca podawa:',
 'blocklogentry' => 'je wužiwarja [[$1]] zablokował z časom spadnjenja $2 $3',
 'reblock-logentry' => 'změni blokowanske nastajenja za [[$1]] z časom spadnjenja $2 $3',
-'blocklogtext' => 'To je protokol blokowanja a wotblokowanja wužiwarjow. Awtomatisce blokowane IP-adresy so njenalistuja. Hlej [[Special:BlockList|lisćinu zablokowanych IP-adresow]] za lisćinu tuchwilnych wuhnaćow a zablokowanjow.',
+'blocklogtext' => 'To je protokol blokowanja a wotblokowanja wužiwarjow. Awtomatisce blokowane IP-adresy so njenalistuja. Hlej [[Special:BlockList|lisćinu blokowanjow]] za lisćinu tuchwilnych wuhnaćow a zablokowanjow.',
 'unblocklogentry' => 'zablokowanje wužiwarja $1 bu zběhnjene',
 'block-log-flags-anononly' => 'jenož anonymnych',
 'block-log-flags-nocreate' => 'wutworjenje wužiwarskich kontow znjemóžnjene',
@@ -2793,7 +2813,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'spamprotectionmatch' => 'Sćěhowacy tekst je naš spamowy filter wotpokazał: $1',
 'spambot_username' => 'MediaWiki čisćenje wot spama',
 'spam_reverting' => 'wróćo na poslednju wersiju, kotraž wotkazy na $1 njewobsahuje',
-'spam_blanking' => 'Wšě wersije wobsahowachu wotkazy na $1, wučisćene.',
+'spam_blanking' => 'Wšě wersije z wotkazami do $1 so porjedźeja',
+'spam_deleting' => 'Wšě wersije z wotkazami do $1 so zhašeja',
 
 # Info page
 'pageinfo-title' => 'Informacije za stronu "$1"',
@@ -3495,6 +3516,9 @@ Ty měł [{{SERVER}}{{SCRIPTPATH}}/COPYING kopiju licency GNU General Public Lic
 'version-software' => 'Instalowana software',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Wersija',
+'version-entrypoints' => 'URL zastupneho dypka',
+'version-entrypoints-header-entrypoint' => 'Zastupny dypk',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Datajowy puć',
@@ -3683,4 +3707,17 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'api-error-uploaddisabled' => 'Nahraća su na tutym wikiju znjemóžnjene.',
 'api-error-verification-error' => 'Tuta dataja móhła wobkškodźena być abo wopačny sufiks měć.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundźe|sekundy|sekundow}}',
+'duration-minutes' => '$1 {{PLURAL:$1|mjeńšina|mjeńšinje|mjeńšiny|mjeńšin}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodźina|hodźinje|hodźiny|hodźin}}',
+'duration-days' => '$1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}}',
+'duration-weeks' => '$1 {{PLURAL: $1|tydźeń|njedźeli|njedźele|njedźel}}',
+'duration-years' => '$1 {{PLURAL: $1|lěto|lěće|lěta|lět}}',
+'duration-decades' => '$1 {{PLURAL:$1|lětdźesatk|lětdźesatkaj|lětdźesatki|lětdźesatkow}}',
+'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
+'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Zawěry na serwer $1 njehodźa so wotwołać.',
 );
index 60d1fa4..a2a5394 100644 (file)
@@ -880,7 +880,6 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
 
 # Diffs
 'history-title' => 'Istorik pou vèsyon « $1 » yo',
-'difference' => '(Diferans ant vèsyon yo)',
 'lineno' => 'Liy $1 :',
 'compareselectedversions' => 'Konpare vèsyon ki seleksyone yo',
 'editundo' => 'Revoke',
index 00e1fc5..f71379d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Hungarian (Magyar)
+/** Hungarian (magyar)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -29,6 +29,7 @@
  * @author R-Joe
  * @author Samat
  * @author Sucy
+ * @author TK-999
  * @author Terik
  * @author Tgr
  * @author Xbspiro
@@ -318,7 +319,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Az ellenőrzött szerkesztések elrejtése a friss változtatások lapon',
 'tog-newpageshidepatrolled' => 'Ellenőrzött lapok elrejtése az új lapok listájáról',
 'tog-extendwatchlist' => 'A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó',
-'tog-usenewrc' => 'Fejlettebb friss változások listája (JavaScript-alapú)',
+'tog-usenewrc' => 'Fejlettebb friss változások használata (JavaScript-alapú)',
 'tog-numberheadings' => 'Fejezetcímek automatikus számozása',
 'tog-showtoolbar' => 'Szerkesztőeszközsor megjelenítése (JavaScript-alapú)',
 'tog-editondblclick' => 'A lapok szerkesztése dupla kattintásra (JavaScript-alapú)',
@@ -784,6 +785,7 @@ A visszaélések elkerülése végett {{PLURAL:$1|egy|$1}} óránként csak egy
 'emailconfirmlink' => 'E-mail cím megerősítése',
 'invalidemailaddress' => 'A megadott e-mail cím érvénytelen formátumú. Kérlek, adj meg egy érvényes e-mail címet vagy hagyd üresen azt a mezőt.',
 'cannotchangeemail' => 'Ezen a wikin nem módosítható a fiókhoz tartozó e-mail cím.',
+'emaildisabled' => 'Ezen az oldalon nem lehet küldeni e-mailek.',
 'accountcreated' => 'Felhasználói fiók létrehozva',
 'accountcreatedtext' => '$1 felhasználói fiókja sikeresen létrejött.',
 'createaccount-title' => 'Új {{SITENAME}}-azonosító létrehozása',
@@ -976,7 +978,8 @@ A blokkolási napló legutóbbi ide vonatkozó bejegyzése a következő:',
 'userinvalidcssjstitle' => "'''Figyelem:''' Nincs „$1” nevű felület. A felületekhez tartozó .css/.js oldalak kisbetűvel kezdődnek, például ''{{ns:user}}:Gipsz Jakab/vector.css'' és nem ''{{ns:user}}:Gipsz Jakab/Vector.css''.",
 'updated' => '(frissítve)',
 'note' => "'''Megjegyzés:'''",
-'previewnote' => "'''Ne feledd, hogy ez csak előnézet, a változtatásaid még nincsenek elmentve!'''",
+'previewnote' => "'''Ne feledd, hogy ez csak egy előnézet.''' A változtatásaid még nincsenek elmentve!",
+'continue-editing' => 'Szerkesztés folytatása',
 'previewconflict' => 'Ez az előnézet a felső szerkesztődobozban levő szöveg mentés utáni megfelelőjét mutatja.',
 'session_fail_preview' => "'''Az elveszett munkamenetadatok miatt sajnos nem tudtuk feldolgozni a szerkesztésedet.
 Kérjük próbálkozz újra!
@@ -991,6 +994,7 @@ a szerkesztési tokenben. A szerkesztés azért lett visszautasítva, hogy megel
 Ez a probléma akkor fordulhat elő, ha hibás, web-alapú proxyszolgáltatást használsz.'''",
 'edit_form_incomplete' => "'''A szerkesztési űrlap egyes részei nem érkeztek meg a szerverre; ellenőrizd újra, hogy a szerkesztés sértetlen-e, majd próbáld újra.'''",
 'editing' => '$1 szerkesztése',
+'creating' => '$1 létrehozása',
 'editingsection' => '$1 szerkesztése (szakasz)',
 'editingcomment' => '$1 szerkesztése (új szakasz)',
 'editconflict' => 'Szerkesztési ütközés: $1',
@@ -1054,6 +1058,7 @@ Nem lett magyarázat csatolva.',
 'edit-no-change' => 'A szerkesztésed figyelmen kívül lett hagyva, mivel nem változtattál a lap szövegén.',
 'edit-already-exists' => 'Az új lap nem készíthető el.
 Már létezik.',
+'defaultmessagetext' => 'Alapértelmezett szöveg',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Figyelem: ezen a lapon túl sok erőforrásigényes elemzőfüggvény-hívás található.
@@ -1208,7 +1213,7 @@ Ellenőrizd a naplókat.',
 
 # Suppression log
 'suppressionlog' => 'Adatvédelmibiztos-napló',
-'suppressionlogtext' => 'Lenn látható az adminisztrátorok elől legutóbb elrejtett törlések és blokkok listája. Lásd a [[Special:BlockList|blokkolt IP-címek listája]] lapot a jelenleg érvényben lévő kitiltásokhoz és blokkokhoz.',
+'suppressionlogtext' => 'Lenn látható az adminisztrátorok elől legutóbb elrejtett törlések és blokkok listája. Lásd a [[Special:BlockList|blokkok listája]] lapot a jelenleg érvényben lévő kitiltásokhoz és blokkokhoz.',
 
 # History merging
 'mergehistory' => 'Laptörténetek egyesítése',
@@ -1241,7 +1246,8 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 
 # Diffs
 'history-title' => 'A(z) „$1” laptörténete',
-'difference' => '(Változatok közti eltérés)',
+'difference-title' => '„$1” változatai közötti eltérés',
+'difference-title-multipage' => 'Oldalak közötti különbség " $1 "és" $2 "',
 'difference-multipage' => '(Lapok közti eltérés)',
 'lineno' => '$1. sor:',
 'compareselectedversions' => 'Kiválasztott változatok összehasonlítása',
@@ -1336,6 +1342,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'prefs-beta' => 'Béta funkciók',
 'prefs-datetime' => 'Dátum és idő',
 'prefs-labs' => 'Kísérleti funkciók',
+'prefs-user-pages' => 'Felhasználói lapok',
 'prefs-personal' => 'Felhasználói adatok',
 'prefs-rc' => 'Friss változtatások',
 'prefs-watchlist' => 'Figyelőlista',
@@ -1466,7 +1473,7 @@ A műveletet nem lehet visszavonni.',
 # Groups
 'group' => 'Csoport:',
 'group-user' => 'szerkesztők',
-'group-autoconfirmed' => 'automatikusan megerősített felhasználók',
+'group-autoconfirmed' => 'automatikusan megerősített szerkesztők',
 'group-bot' => 'botok',
 'group-sysop' => 'adminisztrátorok',
 'group-bureaucrat' => 'bürokraták',
@@ -1481,7 +1488,7 @@ A műveletet nem lehet visszavonni.',
 'group-suppress-member' => '{{GENDER:$1|adatvédelmi biztos}}',
 
 'grouppage-user' => '{{ns:project}}:Felhasználók',
-'grouppage-autoconfirmed' => '{{ns:project}}:Automatikusan megerősített felhasználók',
+'grouppage-autoconfirmed' => '{{ns:project}}:Munkatársak#Automatikusan megerősített szerkesztők',
 'grouppage-bot' => '{{ns:project}}:Botok',
 'grouppage-sysop' => '{{ns:project}}:Adminisztrátorok',
 'grouppage-bureaucrat' => '{{ns:project}}:Bürokraták',
@@ -1596,7 +1603,7 @@ A műveletet nem lehet visszavonni.',
 'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
 'recentchanges' => 'Friss változtatások',
 'recentchanges-legend' => 'A friss változások beállításai',
-'recentchangestext' => 'Ezen a lapon a wikiben történt legutóbbi változásokat lehet nyomonkövetni.',
+'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
 'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
 'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
 'recentchanges-label-minor' => 'Ez egy apró szerkesztés',
@@ -1799,7 +1806,8 @@ Kérjük, hogy lépj kapcsolatba egy  [[Special:ListUsers/sysop|adminisztrátorr
 'backend-fail-writetemp' => 'Nem lehet írni az ideiglenes fájlba.',
 'backend-fail-closetemp' => 'Nem lehet lezárni az ideiglenes fájlt.',
 'backend-fail-read' => 'Nem sikerült olvasni ebből a fájlból: $1.',
-'backend-fail-create' => 'Nem sikerült létrehozni ezt a fájlt: $1.',
+'backend-fail-create' => 'Nem sikerült írni ebbe a fájlba: $1.',
+'backend-fail-maxsize' => 'Nem lehet írni ezt a fájlt: $1, mert a mérete nagyobb, mint $2 bájt.',
 'backend-fail-readonly' => 'A(z) „$1” tárolórendszer jelenleg csak olvasható. Ennek oka a következő: „$2”',
 'backend-fail-synced' => 'A(z) „$1” fájl inkonzisztens állapotban van a tárolórendszerek között',
 'backend-fail-connect' => 'Nem sikerült csatlakozni a(z) „$1” tárolórendszerhez.',
@@ -2134,6 +2142,12 @@ 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',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'A lap tárolt változatát látod, aminek utolsó frissítése ennyi ideje volt:  $1',
+'cachedspecial-viewing-cached-ts' => 'Az oldal tárolt változatát látod, ami eltérhet az aktuálistól.',
+'cachedspecial-refresh-now' => 'A legfrissebb változat megjelenítése.',
 
 # Special:Categories
 'categories' => 'Kategóriák',
@@ -2625,7 +2639,7 @@ Add meg a blokkolás okát is (például idézd a blokkolandó személy által v
 'blocklog-showsuppresslog' => 'Ez a felhasználó korábban blokkot kapott, és a naplóbejegyzés el lett rejtve. Az elrejtési napló alább látható tájékoztatásként:',
 'blocklogentry' => '„[[$1]]” blokkolva $2 $3 időtartamra',
 'reblock-logentry' => 'megváltoztatta [[$1]] blokkjának beállításait, a blokk lejárta: $2 $3',
-'blocklogtext' => 'Ez a felhasználókra helyezett blokkoknak és azok feloldásának listája. Az IP-autoblokkok nem szerepelnek a listában. Lásd még [[Special:BlockList|a jelenleg életben lévő blokkok listáját]].',
+'blocklogtext' => 'Ez a felhasználókra helyezett blokkoknak és azok feloldásának listája. Az automatikus blokkolt IP címek nem szerepelnek a listában. Lásd még [[Special:BlockList|a jelenleg életben lévő blokkok listáját]].',
 'unblocklogentry' => '„$1” blokkolása feloldva',
 'block-log-flags-anononly' => 'csak anonok',
 'block-log-flags-nocreate' => 'nem hozhat létre új fiókot',
@@ -3189,15 +3203,15 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 'exif-subsectimedigitized' => 'DateTimeDigitized almásodpercek',
 'exif-exposuretime' => 'Expozíciós idő',
 'exif-exposuretime-format' => '$1 mp. ($2)',
-'exif-fnumber' => 'F szám',
+'exif-fnumber' => 'Rekesznyílás',
 'exif-exposureprogram' => 'Expozíciós program',
 'exif-spectralsensitivity' => 'Színkép érzékenysége',
-'exif-isospeedratings' => 'ISO érzékenység minősítése',
+'exif-isospeedratings' => 'ISO érzékenység értéke',
 'exif-shutterspeedvalue' => 'APEX zársebesség',
 'exif-aperturevalue' => 'APEX lencsenyílás',
 'exif-brightnessvalue' => 'APEX fényerő',
-'exif-exposurebiasvalue' => 'Expozíciós dőltség',
-'exif-maxaperturevalue' => 'Legnagyobb földi lencsenyílás',
+'exif-exposurebiasvalue' => 'Expozíciós eltolás',
+'exif-maxaperturevalue' => 'Legnagyobb rekesznyílás',
 'exif-subjectdistance' => 'Tárgy távolsága',
 'exif-meteringmode' => 'Fénymérési mód',
 'exif-lightsource' => 'Fényforrás',
@@ -3395,7 +3409,7 @@ míg a többi elem a táblázat összecsukása után alapértelmezett esetben re
 'exif-flash-return-2' => 'strobe return light nincs érzékelve',
 'exif-flash-return-3' => 'strobe return light érzékelve',
 'exif-flash-mode-1' => 'Kötelező vaku',
-'exif-flash-mode-2' => 'Kötelező vakuelnyomás',
+'exif-flash-mode-2' => 'Kötelező vakukikapcsolás',
 'exif-flash-mode-3' => 'automatikus mód',
 'exif-flash-function-1' => 'Nincs vakufunkció',
 'exif-flash-redeye-1' => 'Vörös szem eltávolító mód',
@@ -3730,6 +3744,9 @@ A MediaWikit abban a reményben terjesztjük, hogy hasznos lesz, de GARANCIA NÉ
 'version-software' => 'Telepített szoftverek',
 'version-software-product' => 'Termék',
 'version-software-version' => 'Verzió',
+'version-entrypoints' => 'Belépési pont URL-címek',
+'version-entrypoints-header-entrypoint' => 'Belépési pont',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Fájlelérés',
@@ -3916,4 +3933,15 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'api-error-uploaddisabled' => 'A feltöltés le van tiltva ezen a wikin.',
 'api-error-verification-error' => 'A fájl feltehetőleg sérült, vagy hibás a kiterjesztése.',
 
+# Durations
+'duration-seconds' => '{{PLURAL: $1|másodperc|másodperc}}',
+'duration-minutes' => '$1 {{PLURAL: $1|perc|perc}}',
+'duration-hours' => '{{PLURAL:$1|egy|$1}} óra',
+'duration-days' => '{{PLURAL:$1|egy|$1}} nap',
+'duration-weeks' => '$1 {{PLURAL:$1|hét|hét}}',
+'duration-years' => '{{PLURAL: $1|Egy év|$1 év}}',
+'duration-decades' => '{{PLURAL:$1|egy|$1}} évtized',
+'duration-centuries' => '{{PLURAL:$1|egy|$1}} évszázad',
+'duration-millennia' => '{{PLURAL:$1|egy|$1}} évezred',
+
 );
index fc929db..ce350d1 100644 (file)
@@ -877,6 +877,7 @@ $2',
 'updated' => '(Թարմացված)',
 'note' => "'''Ծանուցում.'''",
 'previewnote' => "'''Սա միայն նախադիտումն է. ձեր կատարած փոփոխությունները դեռ չե՛ն հիշվել։'''",
+'continue-editing' => 'Շարունակել խմբագրել',
 'previewconflict' => 'Այս նախադիտումը արտապատկերում է վերևի խմբագրման դաշտում եղած տեքստը այնպես, ինչպես այն կերևա հիշվելուց հետո։',
 'session_fail_preview' => "'''Ցավոք՝ չհաջողվեց հիշել ձեր խմբագրումները սեսիայի տվյալների կորստի պատճառով։
 Խնդրում ենք կրկին փորձել։ Սխալի կրկնման դեպքում՝ փորձեք դուրս գալ, ապա կրկին մտնել համակարգ։'''",
@@ -887,6 +888,7 @@ $2',
 '''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
 'token_suffix_mismatch' => "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
 'editing' => 'Խմբագրում. $1',
+'creating' => 'Ստեղծում $1',
 'editingsection' => 'Խմբագրում. $1 (բաժին)',
 'editingcomment' => 'Խմբագրում $1 (նոր բաժին)',
 'editconflict' => 'Խմբագրման ընդհարում. $1',
@@ -993,6 +995,11 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 Հնարավոր է ջնջման մանրամասնություններ լինեն [{{fullurl:{{ns:special}}:Log/delete|page={{FULLPAGENAMEE}}}} ջնջման տեղեկամատյանում]։",
 'rev-deleted-no-diff' => "Դուք չեք կարող դիտել տարբերությունը, քանի որ խմբագրումների մեկը '''ջնջվել''' է։ Մանրամասները կարող եք գտնել [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ջնջման տեղեկամատյանում]",
 'rev-suppressed-no-diff' => "Դուք չեք կարող դիտել տարբերությունը, քանի որ խմբագրումների մեկը '''ջնջվել''' է։",
+'rev-deleted-unhide-diff' => "Խմբագրումներից մեկը '''ջնջվել''' է։
+Գործողության մանրամասները կարելի է գտնել [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ջնջման տեղեկամատյանում]։
+Դուք կարող եք դիտել [$1 տարբերությունը], եթե ցանկանում եք շարունակել։",
+'rev-deleted-diff-view' => "Խմբագրումներից մեկը '''ջնջվել''' է։
+Գործողության մանրամասները կարելի է գտնել [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ջնջման տեղեկամատյանում]։",
 'rev-delundel' => 'ցույց տալ/թաքցնել',
 'rev-showdeleted' => 'ցույց տալ',
 'revisiondelete' => 'Ջնջել/վերականգնել տարբերակները',
@@ -1020,6 +1027,8 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'revdelete-success' => "'''Տարբերակի տեսանելիությունը բարեհաջող թարմացված է։'''",
 'logdelete-success' => "'''Իրադարձության տեսանելիությունը փոփոխված է։'''",
 'revdel-restore' => 'Փոխել տեսանելիությունը',
+'revdel-restore-deleted' => 'ջնջված խմբագրումներ',
+'revdel-restore-visible' => 'տեսանելի խմբագրումներ',
 'pagehist' => 'Էջի պատմություն',
 'deletedhist' => 'Ջնջումների պատմություն',
 'revdelete-otherreason' => 'Ուրիշ/հավելյալ պատճառ՝',
@@ -1027,14 +1036,20 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'revdelete-edit-reasonlist' => 'Խմբագրել ջնջման պատճառների ցանկը',
 'revdelete-offender' => 'Էջի տարբերակի հեղինակ՝',
 
+# History merging
+'mergehistory-reason' => 'Պատճառ.',
+
 # Merge log
 'revertmerge' => 'Անջատել',
 
 # Diffs
 'history-title' => '«$1» էջի փոփոխումների պատմություն',
-'difference' => '(Խմբագրումների միջև եղած տարբերությունները)',
+'difference-title' => '$1: Խմագրումների տարբերություն',
+'difference-title-multipage' => '$1 և $2: Խմբագրումների տարբերություն',
+'difference-multipage' => '(Էջերի տարերություն)',
 'lineno' => 'Տող  $1.',
 'compareselectedversions' => 'Համեմատել ընտրած տարբերակները',
+'showhideselectedversions' => 'Ցուցադրել/թաքցնել ընտրված խմբագրումները',
 'editundo' => 'հետ շրջել',
 'diff-multi' => '({{PLURAL:$1|$1 միջանկյալ տարբերակ|$1 միջանկյալ տարբերակ}} ցուցադրված չէ։)',
 
@@ -1271,6 +1286,8 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'խմբագրել այս էջը',
+'action-upload' => 'Բեռնել այս ֆայլը',
+'action-upload_by_url' => 'Բեռնել այս ֆայլը URL-ից',
 'action-delete' => 'Ջնջել այս էջը',
 'action-deleterevision' => 'Ջնջել այս փոփոխությունը',
 'action-deletedhistory' => 'Դիտել այս էջի ջնջված պատմությունը',
@@ -1279,7 +1296,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|փոփոխություն|փոփոխություն}}',
 'recentchanges' => 'Վերջին փոփոխություններ',
 'recentchanges-legend' => 'Վերջին փոփոխությունների նախընտրություններ',
-'recentchangestext' => 'Հետևեք վիքիում կատարված վերջին փոփոխություններին այս էջում։',
+'recentchanges-summary' => 'Հետևեք վիքիում կատարված վերջին փոփոխություններին այս էջում։',
 'recentchanges-feed-description' => 'Հետևեք վիքիում կատարված վերջին փոփոխություններին այս սնուցման մեջ։',
 'recentchanges-label-newpage' => 'Այս խմբագրմամբ ստեղծվել է նոր էջ',
 'recentchanges-label-minor' => 'Սա չնչին խմբագրում է',
@@ -2048,8 +2065,8 @@ $1',
 '''ԶԳՈՒՇԱՑՈ՜ՒՄ'''
 Այս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։
 Շարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
-'movepagetalktext' => "Կցված քննարկման էջը ավտոմատիկ կտեղափոխվի էջի հետ՝ '''բացառությամբ դեպքերի, երբ'''.
-*Գոյություն ունի ոչ-դատարկ քքնարկման էջ նոր անվանման տակ
+'movepagetalktext' => "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.
+*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ
 *Դուք հանել եք նշումը ստորև արկղից
 
 Այսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
index 0055cc1..20ab73a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Interlingua (Interlingua)
+/** Interlingua (interlingua)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -149,7 +149,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Celar le modificationes patruliate in le modificationes recente',
 'tog-newpageshidepatrolled' => 'Celar le paginas patruliate del lista de nove paginas',
 'tog-extendwatchlist' => 'Displicar le observatorio pro monstrar tote le modificationes, non solmente les plus recente',
-'tog-usenewrc' => 'Usar le modificationes recente meliorate (require JavaScript)',
+'tog-usenewrc' => 'Gruppar modificationes per pagina in modificationes recente e observatorio (require JavaScript)',
 'tog-numberheadings' => 'Numerar titulos automaticamente',
 'tog-showtoolbar' => 'Monstrar instrumentario de modification (require JavaScript)',
 'tog-editondblclick' => 'Duple clic pro modificar un pagina (require JavaScript)',
@@ -534,6 +534,8 @@ Le motivo specificate es ''$2''.",
 'filereadonlyerror' => 'Impossibile modificar le file "$1" perque le deposito de files "$2" es in modo de lectura sol.
 
 Le administrator qui lo blocava offereva iste explication: "$3".',
+'invalidtitle-knownnamespace' => 'Titulo invalide con spatio de nomines "$2" e texto "$3"',
+'invalidtitle-unknownnamespace' => 'Titulo invalide con spatio de nomines incognite $1 e texto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Configuration incorrecte: programma antivirus non cognoscite: ''$1''",
@@ -797,7 +799,7 @@ Per favor entra e valida tu adresse de e-mail per medio de tu [[Special:Preferen
 'nosuchsectiontitle' => 'Section non trovate',
 'nosuchsectiontext' => 'Tu ha tentate modificar un section que non existe.
 Illo pote haber essite displaciate o delite durante que tu legeva le pagina.',
-'loginreqtitle' => 'Identification requirite',
+'loginreqtitle' => 'Identification necessari',
 'loginreqlink' => 'aperir un session',
 'loginreqpagetext' => 'Tu debe $1 pro poter vider altere paginas.',
 'accmailtitle' => 'Contrasigno inviate.',
@@ -843,7 +845,8 @@ Memora que le paginas .css and .js personalisate usa un titulo in minusculas, p.
 'updated' => '(Actualisate)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Isto es solmente un previsualisation.'''
-Le modificationes non ha ancora essite publicate! [[#editform|→ Continuar le modification]]",
+Le modificationes non ha ancora essite publicate!",
+'continue-editing' => 'Continuar a modificar',
 'previewconflict' => 'Iste previsualisation reflecte le apparentia final del texto in le area de modification superior
 si tu opta pro publicar lo.',
 'session_fail_preview' => "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.
@@ -942,6 +945,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Bucla de "unstrip" detegite',
+'parser-unstrip-recursion-limit' => 'Limite de recursion de "unstrip" excedite ($1)',
 
 # "Undo" feature
 'undo-success' => 'Le modification pote esser disfacite.
@@ -1088,7 +1097,7 @@ Per favor verifica le registros.',
 # Suppression log
 'suppressionlog' => 'Registro de suppressiones',
 'suppressionlogtext' => 'Infra es un lista de deletiones e blocadas que involve contento que es celate de administratores.
-Vide le [[Special:BlockList|lista de blocadas IP]] pro le lista de bannimentos e blocadas actualmente in operation.',
+Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e blocadas actualmente in operation.',
 
 # History merging
 'mergehistory' => 'Fusionar historias del paginas',
@@ -1122,8 +1131,9 @@ Nota que le uso del ligamines de navigation causara le perdita de tote cambios i
 'mergelogpagetext' => 'Infra es un lista del fusiones le plus recente de un historia de pagina in un altere.',
 
 # Diffs
-'history-title' => 'Historia de versiones de "$1"',
-'difference' => '(Differentia inter versiones)',
+'history-title' => '$1: Historia de versiones',
+'difference-title' => '$1: Differentia inter versiones',
+'difference-title-multipage' => '$1 e $2: Differentia inter paginas',
 'difference-multipage' => '(Differentia inter paginas)',
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Comparar versiones seligite',
@@ -1213,7 +1223,7 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'mypreferences' => 'Mi preferentias',
 'prefs-edits' => 'Numero de modificationes:',
 'prefsnologin' => 'Tu non ha aperite un session',
-'prefsnologintext' => 'Tu debe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aperir un session]</span> pro poter configurar tu preferentias.',
+'prefsnologintext' => 'Tu debe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aperir session]</span> pro configurar preferentias de usator.',
 'changepassword' => 'Cambiar contrasigno',
 'prefs-skin' => 'Apparentia',
 'skin-preview' => 'Previsualisation',
@@ -1221,6 +1231,7 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 'prefs-beta' => 'Functiones beta',
 'prefs-datetime' => 'Data e hora',
 'prefs-labs' => 'Functiones experimental',
+'prefs-user-pages' => 'Paginas de usator',
 'prefs-personal' => 'Profilo del usator',
 'prefs-rc' => 'Modificationes recente',
 'prefs-watchlist' => 'Observatorio',
@@ -1483,7 +1494,7 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'nchanges' => '$1 {{PLURAL:$1|modification|modificationes}}',
 'recentchanges' => 'Modificationes recente',
 'recentchanges-legend' => 'Optiones del modificationes recente',
-'recentchangestext' => 'Seque le plus recente modificationes a {{SITENAME}} in iste pagina.',
+'recentchanges-summary' => 'Seque le plus recente modificationes a {{SITENAME}} in iste pagina.',
 'recentchanges-feed-description' => 'Seque le modificationes le plus recente al wiki in iste syndication.',
 'recentchanges-label-newpage' => 'Iste modification creava un nove pagina',
 'recentchanges-label-minor' => 'Isto es un modification minor',
@@ -1695,14 +1706,15 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
 'backend-fail-writetemp' => 'Non poteva scriber in file temporari.',
 'backend-fail-closetemp' => 'Non poteva clauder file temporari.',
 'backend-fail-read' => 'Non poteva leger le file $1',
-'backend-fail-create' => 'Non poteva crear le file $1',
-'backend-fail-maxsize' => 'Impossibile crear le file $1 perque illo es plus grande que {{PLURAL:$2|$2 byte|$2 bytes}}.',
+'backend-fail-create' => 'Non poteva crear le file $1.',
+'backend-fail-maxsize' => 'Impossibile scriber le file $1 perque illo es plus grande que {{PLURAL:$2|un byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Le systema de immagazinage "$1" es actualmente in lectura sol. Le sequente motivo esseva specificate: "$2"',
 'backend-fail-synced' => 'Le file "$1" es in un stato inconsistente inter le systemas interne de immagazinage',
 'backend-fail-connect' => 'Impossibile connecter al systema de immagazinage "$1".',
 'backend-fail-internal' => 'Un error incognite occurreva in le systema de immagazinage "$1".',
 'backend-fail-contenttype' => 'Non poteva determinar le typo de contento del file a immagazinar in "$1".',
 'backend-fail-batchsize' => 'Le systema de immagazinage ha recipite un lot de $1 {{PLURAL:$1|operation|operationes}} de file; le limite es $2 {{PLURAL:$2|operation|operationes}}.',
+'backend-fail-usable' => 'Non poteva scriber le file $1 a causa de permissiones insufficiente o directorios/contentores mancante.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non poteva connecter al base de datos de jornal pro le systema de immagazinage "$1".',
@@ -2026,6 +2038,7 @@ executar iste function.',
 Pro restringer le presentation, selige un typo de registro, le nomine de usator (sensibile al majusculas e minusculas), o le pagina in question (etiam sensibile al majusculas e minusculas).',
 'logempty' => 'Le registro contine nihil pro iste pagina.',
 'log-title-wildcard' => 'Cercar titulos que comencia con iste texto',
+'showhideselectedlogentries' => 'Monstrar/celar le entratas de registro seligite',
 
 # Special:AllPages
 'allpages' => 'Tote le paginas',
@@ -2046,6 +2059,11 @@ Es possibile que illo contine un o plus characteres que non pote esser usate in
 'allpages-bad-ns' => '{{SITENAME}} non ha un spatio e nomines "$1".',
 'allpages-hide-redirects' => 'Celar redirectiones',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tu vide un version in cache de iste pagina, que pote haber usque a $1 de etate.',
+'cachedspecial-viewing-cached-ts' => 'Tu vide un version in cache de iste pagina, que pote non esser completemente actual.',
+'cachedspecial-refresh-now' => 'Vider le plus recente.',
+
 # Special:Categories
 'categories' => 'Categorias',
 'categoriespagetext' => 'Le sequente {{PLURAL:$1|categoria|categorias}} contine paginas o multimedia.
@@ -2503,7 +2521,7 @@ specific que ha essite vandalisate).',
 'badipaddress' => 'Adresse IP mal formate.',
 'blockipsuccesssub' => 'Blocada succedite',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ha essite blocate.<br />
-Vide le [[Special:BlockList|lista de adresses IP blocate]] pro revider le blocadas.',
+Vide le [[Special:BlockList|lista de blocadas]] pro revider le blocadas.',
 'ipb-blockingself' => 'Tu sta super le puncto de blocar te mesme! Es tu secur de voler facer isto?',
 'ipb-confirmhideuser' => 'Tu es super le puncto de blocar un usator con le option "celar usator" activate. Isto supprimera le nomine del usator in tote le listas e entratas de registro. Es tu secur de voler facer isto?',
 'ipb-edit-dropdown' => 'Modificar le motivos pro blocar',
@@ -2557,7 +2575,7 @@ Le motivo specificate pro le blocada de $1 es: "$2"',
 'reblock-logentry' => 'cambiava configurationes de blocada pro [[$1]] con un tempore de expiration de $2 $3',
 'blocklogtext' => 'Isto es un registro de blocadas e disblocadas de usatores.
 Le adresses IP automaticamente blocate non es includite.
-Vide le [[Special:BlockList|lista de blocadas IP]] pro le lista de bannimentos e blocadas actualmente in operation.',
+Vide le [[Special:BlockList|lista de blocadas]] pro le lista de bannimentos e blocadas actualmente in operation.',
 'unblocklogentry' => 'disblocava $1',
 'block-log-flags-anononly' => 'usatores anonyme solmente',
 'block-log-flags-nocreate' => 'creation de contos disactivate',
@@ -2947,7 +2965,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'spamprotectionmatch' => 'Le sequente texto es lo que activava nostre filtro antispam: $1',
 'spambot_username' => 'Nettamento de spam in MediaWiki',
 'spam_reverting' => 'Revertite al ultime version que non contine ligamines a $1',
-'spam_blanking' => 'Tote le versiones contineva ligamines a $1. Le pagina ha essite vacuate.',
+'spam_blanking' => 'Tote le versiones contineva ligamines a $1. Le pagina es vacuate.',
+'spam_deleting' => 'Tote le versiones contineva ligamines a $1. Le pagina es delite.',
 
 # Info page
 'pageinfo-title' => 'Informationes pro "$1"',
@@ -3661,6 +3680,11 @@ Vos deberea haber recipite [{{SERVER}}{{SCRIPTPATH}}/COPYING un exemplar del Lic
 'version-software' => 'Software installate',
 'version-software-product' => 'Producto',
 'version-software-version' => 'Version',
+'version-entrypoints' => 'URL del puncto de entrata',
+'version-entrypoints-header-entrypoint' => 'Puncto de entrata',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cammino al articulo]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cammino al script]',
 
 # Special:FilePath
 'filepath' => 'Cammino del file',
@@ -3849,4 +3873,17 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'api-error-uploaddisabled' => 'Le incargamento es disactivate in iste wiki.',
 'api-error-verification-error' => 'Le file pote esser corrumpite o su nomine pote haber un extension errate.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minutas}}',
+'duration-hours' => '$1 {{PLURAL:$1|hora|horas}}',
+'duration-days' => '$1 {{PLURAL:$1|die|dies}} retro',
+'duration-weeks' => '$1 {{PLURAL:$1|septimana|septimanas}}',
+'duration-years' => '$1 {{PLURAL:$1|anno|annos}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennio|decennios}}',
+'duration-centuries' => '$1 {{PLURAL:$1|seculo|seculos}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennio|millennios}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Non poteva acquirer le serraturas sur le servitor $1.',
 );
index 15f3e51..7394dda 100644 (file)
@@ -693,8 +693,8 @@ Mungkin telah dihapus oleh orang lain.',
 'cannotdelete-title' => 'Tidak dapat menghapus halaman "$1"',
 'badtitle' => 'Judul tidak sah',
 'badtitletext' => 'Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.',
-'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir: A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.',
+'perfcachedts' => 'Data berikut ini diambil dari singgahan dan terakhir diperbarui pada $1. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.',
 'querypage-no-updates' => 'Pemutakhiran dari halaman ini sedang dimatikan. Data yang ada di sini saat ini tidak akan dimuat ulang.',
 'wrong_wfQuery_params' => 'Parameter salah ke wfQuery()<br />Fungsi: $1<br />Permintaan: $2',
 'viewsource' => 'Lihat sumber',
@@ -716,6 +716,11 @@ $2',
 'ns-specialprotected' => 'Halaman pada ruang nama {{ns:special}} tidak dapat disunting.',
 'titleprotected' => "Judul ini dilindungi dari pembuatan oleh [[User:$1|$1]].
 Alasan yang diberikan adalah ''$2''.",
+'filereadonlyerror' => 'Tidak dapat memodifikasi file " $1 " karena file repositori " $2 " adalah pada mode baca-saja.
+
+Administrator yang terkunci menawarkan penjelasan ini: " $3 ".',
+'invalidtitle-knownnamespace' => 'Judul yang tidak sah dengan ruangnama "$2" dan teks "$3"',
+'invalidtitle-unknownnamespace' => 'Judul yang tidak sah dengan nomor ruang nama tidak diketahui $1 dan teks "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Kesalahan konfigurasi: pemindai virus tidak dikenal: ''$1''",
@@ -801,6 +806,7 @@ Karenanya, pengunjung dengan alamat IP ini tidak dapat lagi membuat akun lain un
 'invalidemailaddress' => 'Alamat surel ini tidak dapat diterima karena formatnya tidak sesuai.
 Harap masukkan alamat surel dalam format yang benar atau kosongkan isian tersebut.',
 'cannotchangeemail' => 'Alamat surel akun tidak dapat diubah di wiki ini.',
+'emaildisabled' => 'Situs ini tidak dapat mengirim surel.',
 'accountcreated' => 'Akun dibuat',
 'accountcreatedtext' => 'Akun pengguna untuk $1 telah dibuat.',
 'createaccount-title' => 'Pembuatan akun untuk {{SITENAME}}',
@@ -997,7 +1003,9 @@ Pratayang ini belum disimpan!'''",
 'userinvalidcssjstitle' => "'''Peringatan:''' Kulit \"\$1\" tidak ditemukan. Harap diingat bahwa halaman .css dan .js menggunakan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannya {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Diperbarui)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Ingatlah bahwa ini hanyalah pratayang yang belum disimpan!'''",
+'previewnote' => "'''Ingatlah bahwa ini hanya pratayang.'''
+Perubahan Anda belum disimpan!",
+'continue-editing' => 'Lanjutkan penyuntingan',
 'previewconflict' => 'Pratayang ini mencerminkan teks pada bagian atas kotak suntingan teks sebagaimana akan terlihat bila Anda menyimpannya.',
 'session_fail_preview' => "'''Maaf, kami tidak dapat mengolah suntingan Anda akibat terhapusnya data sesi.
 Silakan coba sekali lagi.
@@ -1013,6 +1021,7 @@ Suntingan tersebut ditolak untuk mencegah kesalahan pada teks halaman.
 Hal ini kadang terjadi jika Anda menggunakan layanan proxy anonim berbasis web yang bermasalah.",
 'edit_form_incomplete' => "'''Beberapa bagian dari formulir suntingan tidak mencapai server; periksa ulang apakah suntingan Anda tetap utuh dan coba lagi.'''",
 'editing' => 'Menyunting $1',
+'creating' => 'Membuat $1',
 'editingsection' => 'Menyunting $1 (bagian)',
 'editingcomment' => 'Menyunting $1 (bagian baru)',
 'editconflict' => 'Konflik penyuntingan: $1',
@@ -1074,6 +1083,7 @@ Halaman kemungkinan telah dihapus.',
 'edit-no-change' => 'Suntingan diabaikan, karena Anda tidak melakukan perubahan atas teks.',
 'edit-already-exists' => 'Tidak dapat membuat halaman baru
 karena telah ada.',
+'defaultmessagetext' => 'Teks baku',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Peringatan: Halaman ini mengandung terlalu banyak panggilan fungsi parser.
@@ -1088,6 +1098,12 @@ Beberapa templat akan diabaikan.',
 'parser-template-loop-warning' => 'Hubungan berulang templat terdeteksi: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limit kedalaman hubungan berulang templat terlampaui ($1)',
 'language-converter-depth-warning' => 'Batas kedalaman pengonversi bahasa terlampaui ($1)',
+'node-count-exceeded-category' => 'Pages where node-count is exceeded',
+'node-count-exceeded-warning' => 'Page exceeded the node-count',
+'expansion-depth-exceeded-category' => 'Pages where expansion depth is exceeded',
+'expansion-depth-exceeded-warning' => 'Page exceeded the expansion depth',
+'parser-unstrip-loop-warning' => 'Unstrip loop detected',
+'parser-unstrip-recursion-limit' => 'Unstrip recursion limit exceeded ($1)',
 
 # "Undo" feature
 'undo-success' => 'Suntingan ini dapat dibatalkan. Tolong cek perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembatalan suntingan.',
@@ -1229,8 +1245,8 @@ Silakan periksa catatan log.',
 
 # Suppression log
 'suppressionlog' => 'Log penyembunyian',
-'suppressionlogtext' => 'Berikut adalah daftar penghapusan dan pemblokiran, termasuk konten yang disembunyikan dari para opsis.
-Lihat [[Special:BlockList|IP block list]] untuk daftar terkininya.',
+'suppressionlogtext' => 'Berikut adalah daftar penghapusan dan pemblokiran, termasuk konten yang disembunyikan dari para pengurus.
+Lihat [[Special:BlockList|daftar pemblokiran]] untuk daftar terkininya.',
 
 # History merging
 'mergehistory' => 'Gabung sejarah halaman',
@@ -1263,7 +1279,8 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
 
 # Diffs
 'history-title' => 'Riwayat revisi dari "$1"',
-'difference' => '(Perbedaan antarrevisi)',
+'difference-title' => '$1: Perbedaan revisi',
+'difference-title-multipage' => 'Perbedaan antara halaman "$1" dan "$2"',
 'difference-multipage' => '(Perbedaan antarhalaman)',
 'lineno' => 'Baris $1:',
 'compareselectedversions' => 'Bandingkan versi terpilih',
@@ -1360,6 +1377,7 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
 'prefs-beta' => 'Fitur Beta',
 'prefs-datetime' => 'Tanggal dan waktu',
 'prefs-labs' => 'Fitur Labs',
+'prefs-user-pages' => 'Halaman pengguna',
 'prefs-personal' => 'Profil',
 'prefs-rc' => 'Perubahan terbaru',
 'prefs-watchlist' => 'Pemantauan',
@@ -1621,7 +1639,7 @@ Jika Anda memberikannya, nama asli Anda akan digunakan untuk memberi pengenalan
 'nchanges' => '$1 {{PLURAL:$1|perubahan|perubahan}}',
 'recentchanges' => 'Perubahan terbaru',
 'recentchanges-legend' => 'Opsi perubahan terbaru',
-'recentchangestext' => "Temukan perubahan terbaru dalam wiki di halaman ini. Keterangan: (beda) = perubahan, (versi) = sejarah revisi, '''B''' = halaman baru, '''k''' = suntingan kecil, '''b''' = suntingan bot, (± ''bita'') = jumlah penambahan/pengurangan isi, → = suntingan bagian, ← = ringkasan otomatis.
+'recentchanges-summary' => "Temukan perubahan terbaru dalam wiki di halaman ini. Keterangan: (beda) = perubahan, (versi) = sejarah revisi, '''B''' = halaman baru, '''k''' = suntingan kecil, '''b''' = suntingan bot, (± ''bita'') = jumlah penambahan/pengurangan isi, → = suntingan bagian, ← = ringkasan otomatis.
 ----",
 'recentchanges-feed-description' => 'Temukan perubahan terbaru dalam wiki di umpan ini.',
 'recentchanges-label-newpage' => 'Suntingan ini membuat halaman baru',
@@ -1809,13 +1827,27 @@ Silakan hubungi salah seorang [[Special:ListUsers/sysop|pengurus]].',
 'backend-fail-closetemp' => 'Tidak dapat menutup berkas sementara.',
 'backend-fail-read' => 'Tidak dapat membaca berkas $1.',
 'backend-fail-create' => 'Tidak dapat membuat berkas $1.',
-'backend-fail-maxsize' => 'Tidak dapat membuat berkas $1 karena ukurannya lebih besar dari {{PLURAL:$2|$2 bita|$2 bita}}.',
+'backend-fail-maxsize' => 'Tidak dapat membuat berkas $1 karena ukurannya lebih besar dari {{PLURAL:$2||}}$2 bita.',
+'backend-fail-readonly' => 'Backend penyimpanan "$1" ini saat ini hanya bisa dibaca. Alasan yang diberikan adalah: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Berkas "$1" dalam keadaan yang tidak konsisten dalam backends penyimpanan internal',
+'backend-fail-connect' => 'Tidak dapat menyambung ke penyimpanan backend "$1".',
+'backend-fail-internal' => 'Kesalahan yang tidak dikenal terjadi di backend penyimpanan "$1".',
+'backend-fail-contenttype' => 'Tidak dapat menentukan tipe konten dari berkas yang disimpan di "$1".',
+'backend-fail-batchsize' => 'Penyimpanan backend diberikan batch $1 berkas {{PLURAL:$1||}}operasi; batasnya adalah $2 {{PLURAL:$2||}}operasi.',
+'backend-fail-usable' => 'Tidak dapat membuat berkas $1 karena izin tidak memadai atau direktori/kontainer yang hilang.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Tidak dapat menyambung ke database jurnal untuk penyimpanan backend "$1".',
+'filejournal-fail-dbquery' => 'Tidak bisa update database jurnal untuk penyimpanan backend "$1".',
 
 # Lock manager
+'lockmanager-notlocked' => 'Tidak bisa membuka kunci "$1" karena "$1" tidak terkunci.',
 'lockmanager-fail-closelock' => 'Tidak dapat menutup penguncian berkas untuk "$1".',
 'lockmanager-fail-deletelock' => 'Tidak dapat menghapus penguncian berkas untuk "$1".',
 'lockmanager-fail-acquirelock' => 'Tidak dapat mendapatkan penguncian untuk "$1"',
 'lockmanager-fail-openlock' => 'Tidak dapat membuka penguncian berkas untuk "$1".',
+'lockmanager-fail-releaselock' => 'Tidak dapat melepaskan penguncian untuk "$1"',
+'lockmanager-fail-db-bucket' => 'Tidak bisa menghubungi database kunci yang mencukupi dalam ember $1.',
 'lockmanager-fail-db-release' => 'Tidak dapat melepaskan penguncian pada basis data $1.',
 'lockmanager-fail-svr-release' => 'Tidak dapat melepaskan penguncian pada server $1.',
 
@@ -1924,6 +1956,10 @@ Juga tersedia [[Special:WhatLinksHere/$2|daftar selengkapnya]].',
 Silakan lihat [$2 halaman deskripsi berkas] untuk informasi lebih lanjut.',
 'sharedupload-desc-here' => 'Berkas ini berasal dari $1 dan mungkin digunakan oleh proyek-proyek lain.
 Deskripsi dari [$2 halaman deskripsinya] ditunjukkan di bawah ini.',
+'sharedupload-desc-edit' => 'Berkas ini berasal dari $1 dan mungkin digunakan oleh proyek lain.
+Mungkin Anda ingin menyunting keterangan pada [$2 halaman deskripsi berkas] di sana.',
+'sharedupload-desc-create' => 'Berkas ini berasal dari $1 dan mungkin digunakan oleh proyek lain.
+Mungkin Anda ingin menyunting keterangan pada [$2 halaman deskripsi berkas] di sana.',
 'filepage-nofile' => 'Tidak ada berkas dengan nama ini.',
 'filepage-nofile-link' => 'Tidak ada berkas dengan nama ini, tetapi Anda dapat [$1 mengunggahnya].',
 'uploadnewversion-linktext' => 'Muatkan versi yang lebih baru dari berkas ini',
@@ -2057,6 +2093,8 @@ Nama yang telah <del>dicoret</del> berarti telah dibetulkan.',
 'wantedpages' => 'Halaman yang diinginkan',
 'wantedpages-badtitle' => 'Judul tak valid dalam himpunan hasil: $1',
 'wantedfiles' => 'Berkas yang diinginkan',
+'wantedfiletext-cat' => 'Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap "false positive" akan <del>dicoret</del>. Selain itu, halaman yang menggunakan berkas yang tidak ada eksis akan dicantumkan dalam [[:$1]].',
+'wantedfiletext-nocat' => 'Berkas-berkas berikut digunakan tetapi tidak ada. Berkas dari repositori asing mungkin tercantum meskipun ada. Setiap "false positive" akan <del>dicoret</del>.',
 'wantedtemplates' => 'Templat yang diinginkan',
 'mostlinked' => 'Halaman yang tersering dituju',
 'mostlinkedcategories' => 'Kategori yang tersering digunakan',
@@ -2109,13 +2147,14 @@ Harap perhatikan bahwa situs web lain mungkin memiliki pranala ke suatu berkas d
 
 # Special:Log
 'specialloguserlabel' => 'Pengguna:',
-'speciallogtitlelabel' => 'Taget (judul atau pengguna):',
+'speciallogtitlelabel' => 'Target (judul atau pengguna):',
 'log' => 'Log',
 'all-logs-page' => 'Semua log publik',
 'alllogstext' => 'Gabungan tampilan semua log yang tersedia di {{SITENAME}}.
-Anda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna (sensitif kapital), atau judul halaman (juga sensitif kapital).',
+Anda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna (sensitif kapitalisasi), atau judul halaman (juga sensitif kapitalisasi).',
 'logempty' => 'Tidak ditemukan entri log yang sesuai.',
 'log-title-wildcard' => 'Cari judul yang diawali dengan teks tersebut',
+'showhideselectedlogentries' => 'Tampilkan/sembunyikan entri log terpilih',
 
 # Special:AllPages
 'allpages' => 'Semua halaman',
@@ -2133,6 +2172,12 @@ Anda dapat melakukan pembatasan tampilan dengan memilih jenis log, nama pengguna
 'allpagesprefix' => 'Tampilkan halaman dengan awalan:',
 'allpagesbadtitle' => 'Judul halaman yang diberikan tidak sah atau memiliki awalan antar-bahasa atau antar-wiki. Judul tersebut mungkin juga mengandung satu atau lebih aksara yang tidak dapat digunakan dalam judul.',
 'allpages-bad-ns' => '{{SITENAME}} tidak memiliki ruang nama "$1".',
+'allpages-hide-redirects' => 'Sembunyikan pengalihan',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Anda melihat versi tembolok halaman ini, yang mungkin sudah berumur $1.',
+'cachedspecial-viewing-cached-ts' => 'Anda melihat versi tembolok halaman ini, yang mungkin tidak akan benar-benar aktual.',
+'cachedspecial-refresh-now' => 'Lihat versi terbaru.',
 
 # Special:Categories
 'categories' => 'Kategori',
@@ -2370,6 +2415,8 @@ Lihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlind
 'protect-title' => 'Melindungi "$1"',
 'protect-title-notallowed' => 'Lihat tingkat perlindungan dari "$1"',
 'prot_1movedto2' => '[[$1]] dipindahkan ke [[$2]]',
+'protect-badnamespace-title' => 'Ruang nama yang tidak dapat dilindungi',
+'protect-badnamespace-text' => 'Halaman dalam ruang nama ini tidak dapat dilindungi.',
 'protect-legend' => 'Konfirmasi pelindungan',
 'protectcomment' => 'Alasan:',
 'protectexpiry' => 'Kedaluwarsa:',
@@ -2563,7 +2610,7 @@ Masukkan alasan Anda di bawah (contoh, menuliskan nama halaman yang telah divand
 'badipaddress' => 'Format alamat IP atau nama pengguna salah.',
 'blockipsuccesssub' => 'Pemblokiran sukses',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] telah diblokir.<br />
-Lihat [[Special:BlockList|Daftar IP]] untuk meninjau kembali pemblokiran.',
+Lihat [[Special:BlockList|daftar pemblokiran]] untuk meninjau kembali pemblokiran.',
 'ipb-blockingself' => 'Anda akan memblokir diri sendiri! Apakah Anda yakin akan melakukannya?',
 'ipb-confirmhideuser' => 'Anda akan memblokir pengguna dengan mengaktifkan "sembunyikan pengguna" diaktifkan. Ini akan menyembunyikan nama pengguna pada semua daftar dan entri log. Apakah Anda yakin ingin melakukannya?',
 'ipb-edit-dropdown' => 'Sunting alasan pemblokiran',
@@ -2583,6 +2630,7 @@ Lihat [[Special:BlockList|Daftar IP]] untuk meninjau kembali pemblokiran.',
 'blocklist-userblocks' => 'Sembunyikan pemblokiran akun',
 'blocklist-tempblocks' => 'Sembunyikan pemblokiran sementara',
 'blocklist-addressblocks' => 'Sembunyikan pemblokiran IP tunggal',
+'blocklist-rangeblocks' => 'Menyembunyikan jangkauan blokir (http://www.mediawiki.org/wiki/Help:Range_blocks)',
 'blocklist-timestamp' => 'Stempel waktu',
 'blocklist-target' => 'Target',
 'blocklist-expiry' => 'Kedaluwarsa',
@@ -2615,7 +2663,7 @@ Alasan yang diberikan untuk pemblokiran $1 adalah: "$2"',
 'reblock-logentry' => 'mengubah pemblokiran [[$1]] dengan waktu kedaluwarsa $2 $3',
 'blocklogtext' => 'Di bawah ini adalah log pemblokiran dan pembukaan blokir terhadap pengguna.
 Alamat IP yang diblokir secara otomatis tidak terdapat di dalam daftar ini.
-Lihat [[Special:BlockList|daftar alamat IP yang diblokir]] untuk daftar pemblokiran terkini.',
+Lihat [[Special:BlockList|daftar pemblokiran]] untuk semua pengguna yang saat ini diblokir.',
 'unblocklogentry' => 'menghilangkan blokir "$1"',
 'block-log-flags-anononly' => 'hanya pengguna anonim',
 'block-log-flags-nocreate' => 'pembuatan akun dimatikan',
@@ -2764,6 +2812,7 @@ Jika Anda hanya ingin mengimpor versi terbaru, Anda melakukannya lebih cepat den
 'exportcuronly' => 'Hanya ekspor revisi sekarang, bukan seluruh versi terdahulu',
 'exportnohistory' => "----
 '''Catatan:''' Mengekspor keseluruhan riwayat suntingan halaman melalui isian ini telah dinon-aktifkan karena alasan kinerja.",
+'exportlistauthors' => 'Termasuk daftar lengkap kontributor untuk setiap halaman',
 'export-submit' => 'Ekspor',
 'export-addcattext' => 'Tambahkan halaman dari kategori:',
 'export-addcat' => 'Tambahkan',
@@ -2796,6 +2845,8 @@ Silakan kunjungi [//www.mediawiki.org/wiki/Localisation Pelokalan MediaWiki] dan
 'thumbnail_error' => 'Gagal membuat miniatur: $1',
 'djvu_page_error' => 'Halaman DjVu di luar rentang',
 'djvu_no_xml' => 'XML untuk berkas DjVu tak dapat diperoleh',
+'thumbnail-temp-create' => 'Tidak dapat membuat berkas kecil temporer',
+'thumbnail-dest-create' => 'Tidak dapat menyimpan berkas kecil ke tujuan',
 'thumbnail_invalid_params' => 'Kesalahan parameter miniatur',
 'thumbnail_dest_directory' => 'Direktori tujuan tak dapat dibuat',
 'thumbnail_image-type' => 'Tipe gambar tidak didukung',
@@ -2842,6 +2893,8 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'import-invalid-interwiki' => 'Tidak dapat mengimpor dari wiki tersebut.',
 'import-error-edit' => 'Halaman "$1" tidak diimpor karena Anda tidak diizinkan untuk menyuntingnya.',
 'import-error-create' => 'Halaman "$1" tidak diimpor karena Anda tidak diizinkan untuk membuatnya.',
+'import-error-interwiki' => 'Halaman " $1 " tidak diimpor karena namanya dicadangkan untuk pranala eksternal (interwiki).',
+'import-error-special' => 'Halaman " $1 " tidak diimpor karena milik ruang nama khusus yang tidak mengizinkan adanya halaman.',
 'import-error-invalid' => 'Halaman "$1" tidak diimpor karena namanya tidak valid.',
 
 # Import log
@@ -2861,6 +2914,7 @@ Simpan ke komputer Anda dan unggah ke sini.',
 'javascripttest-pagetext-frameworks' => 'Silakan pilih satu di antara kerangka kerja pengujian berikut: $1',
 'javascripttest-pagetext-skins' => 'Pilih kulit yang ingin Anda uji:',
 'javascripttest-qunit-intro' => 'Lihat [$1 dokumentasi pengujian] di mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Halaman pengguna Anda',
@@ -2980,6 +3034,7 @@ Ini mungkin disebabkan oleh pranala ke situs luar yang termasuk dalam daftar hit
 'spambot_username' => 'Pembersihan span MediaWiki',
 'spam_reverting' => 'Mengembalikan ke versi terakhir yang tak memiliki pranala ke $1',
 'spam_blanking' => 'Semua revisi yang memiliki pranala ke $1, pengosongan',
+'spam_deleting' => 'Semua revisi yang memiliki pranala ke $1, penghapusan',
 
 # Info page
 'pageinfo-title' => 'Informasi untuk "$1"',
@@ -3725,6 +3780,9 @@ Anda seharusnya telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING salinan Lisensi
 'version-software' => 'Perangkat lunak terinstal',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Versi',
+'version-entrypoints' => 'URL titik entri',
+'version-entrypoints-header-entrypoint' => 'Titik entri',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Lokasi berkas',
@@ -3829,6 +3887,15 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 # New logging system
 'logentry-delete-delete' => '$1 menghapus halaman $3',
 'logentry-delete-restore' => '$1 mengembalikan halaman $3',
+'logentry-delete-event' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
+'logentry-delete-revision' => '$1 mengubah ketertampilan {{PLURAL:$5||}} $5  revisi di halaman $3: $4',
+'logentry-delete-event-legacy' => '$1 mengubah ketertampilan log peristiwa pada $3',
+'logentry-delete-revision-legacy' => '$1 mengubah ketertampilan revisi pada halaman $3',
+'logentry-suppress-delete' => '$1 mensupresi halaman $3',
+'logentry-suppress-event' => '$1 secara diam-diam mengubah ketertampilan  {{PLURAL:$5||}} $5  log peristiwa di $3: $4',
+'logentry-suppress-revision' => '$1 diam-diam mengubah ketertampilan {{PLURAL:$5||}} $5 revisi di halaman $3: $4',
+'logentry-suppress-event-legacy' => '$1 diam-diam mengubah ketertampilan log peristiwa pada $3',
+'logentry-suppress-revision-legacy' => '$1 diam-diam mengubah ketertampilan revisi pada halaman $3',
 'revdelete-content-hid' => 'konten disembunyikan',
 'revdelete-summary-hid' => 'ringkasan suntingan disembunyikan',
 'revdelete-uname-hid' => 'nama pengguna disembunyikan',
@@ -3850,6 +3917,8 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'newuserlog-byemail' => 'kata sandi dikirim melalui surel',
 
 # Feedback
+'feedback-bugornote' => 'Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].
+Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda akan ditambahkan ke halaman "[$3 $2]", bersama dengan nama pengguna Anda dan apa browser yang Anda gunakan.',
 'feedback-subject' => 'Perihal:',
 'feedback-message' => 'Pesan:',
 'feedback-cancel' => 'Batal',
@@ -3858,6 +3927,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'feedback-error1' => 'Galat: Hasil tidak dikenal dari API',
 'feedback-error2' => 'Galat: Penyuntingan gagal',
 'feedback-error3' => 'Error: API tidak merespons',
+'feedback-thanks' => 'Terima kasih! Umpan balik Anda telah diposting ke halaman "[$2 $1]".',
 'feedback-close' => 'Selesai',
 'feedback-bugcheck' => 'Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].',
 'feedback-bugnew' => 'Saya telah memeriksa. Laporkan bug baru',
@@ -3900,4 +3970,15 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'api-error-uploaddisabled' => 'Pengunggahan dinonaktifkan di wiki ini.',
 'api-error-verification-error' => 'Berkas ini mungkin rusak atau memiliki ekstensi yang salah.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1||}}$1 detik',
+'duration-minutes' => '{{PLURAL:$1||}}$1 menit',
+'duration-hours' => '{{PLURAL:$1||}}$1 jam',
+'duration-days' => '{{PLURAL:$1||}}$1 hari',
+'duration-weeks' => '{{PLURAL: $1||}}$1 minggu',
+'duration-years' => '{{PLURAL: $1||}}$1 tahun',
+'duration-decades' => '{{PLURAL:$1||}}$1 dekade',
+'duration-centuries' => '{{PLURAL:$1||}}$1 abad',
+'duration-millennia' => '{{PLURAL:$1||}}$1 milenium',
+
 );
index aa6ad7c..0c21f44 100644 (file)
@@ -612,8 +612,7 @@ Vider li [[Special:IPBlockList|liste de bloc de IP]] por li liste de bloces e ba
 'revertmerge' => 'Desfar fusion',
 
 # Diffs
-'history-title' => 'Revision del historie de "$1"',
-'difference' => '(Diferentie inter revisiones)',
+'history-title' => 'Historic del revision de "$1"',
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Comparar revisiones selectet',
 'editundo' => 'anullar',
@@ -733,7 +732,7 @@ Tui adresse de e-mail ne es revelat quande altri usatores contacter vu.',
 'nchanges' => '$1 {{PLURAL:$1|change|changes}}',
 'recentchanges' => 'Nov changes',
 'recentchanges-legend' => 'Optiones de nov changes',
-'recentchangestext' => 'Seque sur ti-ci págine li ultim modificationes al wiki.',
+'recentchanges-summary' => 'Seque sur ti-ci págine li ultim modificationes al wiki.',
 'recentchanges-feed-description' => 'Monstra li max nov changes to li wiki in ti feed.',
 'recentchanges-label-newpage' => 'Ti redaction creat un nov págine',
 'recentchanges-label-minor' => 'Ti es un redaction minori',
index 8430e6f..282d871 100644 (file)
@@ -691,7 +691,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
 
 # Diffs
 'history-title' => 'Ákíkó mbu màkà orü nọr na élú "$1"',
-'difference' => '(Ihe dị íche na orü ndi á)',
 'lineno' => 'Ahiri $1:',
 'compareselectedversions' => 'Sikwụ orü áká dị',
 'editundo' => 'emekwàlà',
@@ -966,7 +965,7 @@ Ihü nọr na [[Special:Watchlist|ndétu ihe Í ne lé]] di na mkpụrụ edemed
 'filehist-filesize' => 'Ívù usòrò',
 'filehist-comment' => 'Okwu-nokwu',
 'filehist-missing' => 'Usòrò è fwuólé',
-'imagelinks' => 'Jikodo usòrò',
+'imagelinks' => 'Mgbanwe usòrò',
 'linkstoimage' => '{{PLURAL:$1|Ihü nká|Ihü nke $1}} na jikodo gá usòrò nká:',
 'nolinkstoimage' => 'Àdíghị ihü na jikodo usòrò nke.',
 'sharedupload' => 'Ákwúkwó runotu nke shì $1 na ó nwèríkí di na orürü nke ndi ozor.',
@@ -1488,7 +1487,7 @@ Jikodo nke gị byá àzú na áhìrì nke òfu á bu nke nwéríkí gáfè, dí
 Ȯ bụ nà usòrò à gabnwere shí òtù ȯ di nà mgbe mbu, ótù ụmà àgághị è zí ya.',
 'metadata-expand' => 'Zi nkówá di ógólógó',
 'metadata-collapse' => 'Zonari nkówá di ógólógó',
-'metadata-fields' => 'Ómárí nso nke nkeji nke EXIF détùrù na ozi nká gí banyé na nlé ihü nhuunuche mgbè ómárí nso mgbe àgàdà gi dátù.
+'metadata-fields' => 'Ómárí nso nke nkeji nke nhuunuche détùrù na ozi nká gí banyé na nlé ihü nhuunuche mgbè ómárí nso mgbe àgàdà gi dátù.
 Nke ozor gí zonari na áká onwe ha.
 * make
 * model
index 2b5502c..348424a 100644 (file)
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Midia',
+       NS_SPECIAL          => 'Espesial',
+       NS_TALK             => 'Tungtungan',
+       NS_USER             => 'Agar-aramat',
+       NS_USER_TALK        => 'Agar-aramat_tungtungan',
+       NS_PROJECT_TALK     => '$1_tungtungan',
+       NS_FILE             => 'Papeles',
+       NS_FILE_TALK        => 'Papeles_tungtungan',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_tungtungan',
+       NS_TEMPLATE         => 'Plantilia',
+       NS_TEMPLATE_TALK    => 'Plantilia_tungtungan',
+       NS_HELP             => 'Tulong',
+       NS_HELP_TALK        => 'Tulong_tungtungan',
+       NS_CATEGORY         => 'Kategoria',
+       NS_CATEGORY_TALK    => 'Kategoria_tungtungan',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Pinag-ugisan ti silpo:',
 'tog-justify' => 'Limpiaen dagiti parapo',
-'tog-hideminor' => 'Ilemmeng dagiti babassit a panag-urnos idiay kinaudian a sinuk-sukatan',
-'tog-hidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos idiay kinaudian a sinuk-sukatan',
+'tog-hideminor' => 'Ilemmeng dagiti babassit a panag-urnos kadagiti naudi a sinuk-sukatan',
+'tog-hidepatrolled' => 'Ilemmeng dagiti napatruliaan nga inurnos kadagiti naudi a sinuk-sukatan',
 'tog-newpageshidepatrolled' => 'Ilemmeng dagiti napatruliaan a panid idiay baro a listaan ti panid',
-'tog-extendwatchlist' => 'Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, ta saan laeng dagita nabiit',
-'tog-usenewrc' => 'Usaren dagiti napasayaat a kinaudian a sinuk-sukatan (masapul ti JavaScript)',
+'tog-extendwatchlist' => 'Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, tapno saan laeng a dagiti nabiit',
+'tog-usenewrc' => 'Usaren ti napasayaat a kinaudi a sinuk-sukatan (masapul ti JavaScript)',
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
-'tog-showtoolbar' => 'Ipakita ti alikamen ti panag-urnos (masapul ti JavaScript)',
-'tog-editondblclick' => 'Urnosen ti pampanid iti mamindua a panagtakla (masapul ti JavaScript)',
+'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
+'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
 'tog-editsection' => 'Pakabaelan ti panag-urnos iti paset babaen kadagiti [urnosen] a  panilpo',
-'tog-editsectiononrightclick' => 'Ikkan ti pakabaelan ti paset  a panag-urnos no agtakla ti kannawan kadagiti paset a titulo (masapul ti JavaScript)',
-'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga addaan ti ad-adu ngem dagiti 3 a paulo)',
+'tog-editsectiononrightclick' => 'Ikkan ti pakabaelan ti paset  a panag-urnos no agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
+'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga addan ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kaadu nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
 'tog-watchcreations' => 'Inayon dagiti inaramidko a pampanid iti listaan ti bambantayak',
 'tog-watchdefault' => 'Inayon dagiti inurnos ko a pampanid iti listaan ti bambantayak',
@@ -43,7 +62,7 @@ $messages = array(
 'tog-enotifminoredits' => 'E-suratannak met kadagiti bassit a panag-urnos ti pampanid',
 'tog-enotifrevealaddr' => 'Iparang ti pagtaengan ti e-surat ko kadagiti pammalagip ti  e-surat',
 'tog-shownumberswatching' => 'Ipakita ti bilang dagiti agbambantay nga agar-aramat',
-'tog-oldsig' => 'Ti addaan a pirma:',
+'tog-oldsig' => 'Ti adda a pirma:',
 'tog-fancysig' => 'Tratuen ti pirma a kas wikitext (nga awan ti automatiko a panagsilpo)',
 'tog-externaleditor' => 'Isigud ti panag-usar iti ruar a pnag-urnos (para dagiti eksperto laeng, masapul ti nangruna a kasasaad a pinakaikabil idiay komputer mo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
 'tog-externaldiff' => 'Isigud ti panag-usar iti ruar a  sabali (para dagiti eksperto laeng, masapul ti nagruna a kasasaad a pinakaikabil idiay komputer mo. [//www.mediawiki.org/wiki/Manual:External_editors Adu pay a pakaammo.])',
@@ -57,9 +76,9 @@ $messages = array(
 'tog-watchlisthideanons' => 'Ilemmeng idiay listaan ti bambantayan dagiti inurnos ti di am-ammo nga agar-aramat',
 'tog-watchlisthidepatrolled' => 'Ilemmeng idiay listaan ti bambantayan dagiti napatruliaan nga inurnos',
 'tog-ccmeonemails' => 'Patulodandak iti kopia kadagiti e-surat nga ipatulodko kadagiti sabsabali nga agar-aramat',
-'tog-diffonly' => 'Saan nga iparang ti nagyan ti panid iti baba kadagiti sasabali',
+'tog-diffonly' => 'Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan',
 'tog-showhiddencats' => 'Ipakita dagiti nailemmeng a kategoria',
-'tog-norollbackdiff' => 'Laksiden ti sabali a kalpasan ti panagi-subli',
+'tog-norollbackdiff' => 'Laksiden ti paggiddiatan kalpasan ti panagaramid ti panagi-subli',
 
 'underline-always' => 'Kanayon',
 'underline-never' => 'Saan uray kaanoman',
@@ -126,18 +145,18 @@ $messages = array(
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Kategoria|Dagiti kategoria}}',
-'category_header' => 'Dagiti panid iti kategoria  "$1"',
+'category_header' => 'Dagiti panid ti kategoria  "$1"',
 'subcategories' => 'Dagiti apo ti kategoria',
-'category-media-header' => 'Dagiti midia iti kategoria  "$1"',
-'category-empty' => "''Daytoy a kategoria ket awan ti agdama a nagyan na a pampanid wenno midia.''",
-'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Dagiti nailemmeng a kategoria}}',
+'category-media-header' => 'Dagiti midia ti kategoria  "$1"',
+'category-empty' => "''Daytoy a kategoria ket agdama a saan nga aglaon kadagiti panid wenno midia.''",
+'hidden-categories' => '{{PLURAL:$1|Nailemmeng a kategoria|Nailemmeng a katkategoria}}',
 'hidden-category-category' => 'Dagiti nailemmeng a kategoria',
-'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|apo ti kategoria|$1 apo dagiti kategoria}}, manipud iti dagup a $2.}}',
-'category-subcat-count-limited' => 'Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|apo ti kategoria|$1 apo dagiti kategoria}}.',
-'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad a panid.|Ti sumaganad a {{PLURAL:$1|panid|$1 pampanid}} iti daytoy a kategoria, manipud iti dagup a $2.}}',
-'category-article-count-limited' => 'Ti sumaganad a {{PLURAL:$1|panid ket|$1 pampanid ket}} adda iti agdama a kategoria.',
-'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng kadagiti sumaganad a papeles.|Ti sumaganad a {{PLURAL:$1|papeles|$1 pap-papeles}} ket adda ti daytoy a kategoria, iti $2 a dagup.}}',
-'category-file-count-limited' => 'Ti sumaganad {{PLURAL:$1|a papeles|$1 a dagiti papeles}} ket adda ti agdama a kategoria.',
+'category-subcat-count' => '{{PLURAL:$2|Daytoy a kategoria ket adda laeng ti sumaganad nga apo ti kategoria.|Daytoy a kategoria ket adda kadagiti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}, manipud ti dagup nga $2.}}',
+'category-subcat-count-limited' => 'Daytoy a kategoria ket adda ti sumaganad nga {{PLURAL:$1|nga apo ti kategoria|$1 nga apo dagiti kategoria}}.',
+'category-article-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a panid.|Ti sumaganad nga {{PLURAL:$1|a panid|$1 a pampanid}} ket adda iti daytoy a kategoria, manipud ti dagup nga $2.}}',
+'category-article-count-limited' => 'Ti sumaganad nga {{PLURAL:$1|a panid |$1 a pampanid}} ket adda iti agdama a kategoria.',
+'category-file-count' => '{{PLURAL:$2|Daytoy a kategoria ket aglaon laeng ti sumaganad a papeles.|Ti sumaganad nga {{PLURAL:$1| a papeles|$1  a pappapeles}} ket adda iti daytoy a kategoria, ti $2 a dagup.}}',
+'category-file-count-limited' => 'Ti sumaganad nga {{PLURAL:$1|a papeles|$1 a pappapeles}} ket adda iti agdama a kategoria.',
 'listingcontinuesabbrev' => 'tuloy.',
 'index-category' => 'Dagiti pagsurutan a panid',
 'noindex-category' => 'Dagiti saan a pagsurutan a panid',
@@ -203,8 +222,8 @@ $messages = array(
 'create-this-page' => 'Aramidem daytoy a panid',
 'delete' => 'Ikkaten',
 'deletethispage' => 'Ikkaten daytoy a panid',
-'undelete_short' => 'Isubli ti naikkat a {{PLURAL:$1|maysa a naurnos|$1 dagiti naurnos}}',
-'viewdeleted_short' => 'Kitaen {{PLURAL:$1|ti maysa a naikkat a naurnos|$1 digiti naikkat a naurnos}}',
+'undelete_short' => 'Isubli ti naikkat a  {{PLURAL:$1|maysa a naurnos|$1 a naururnos}}',
+'viewdeleted_short' => 'Kitaen {{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}',
 'protect' => 'Salakniban',
 'protect_change' => 'sukatan',
 'protectthispage' => 'Salakniban daytoy a panid',
@@ -214,7 +233,7 @@ $messages = array(
 'talkpage' => 'Pagtungtongan daytoy a panid',
 'talkpagelinktext' => 'Makipatang',
 'specialpage' => 'Espesial a panid',
-'personaltools' => 'Kinabukod a ram-ramit',
+'personaltools' => 'Bukod a ram-ramit',
 'postcomment' => 'Baro a paset',
 'articlepage' => 'Kitaen ti naglaon a panid',
 'talk' => 'Pagtungtongan',
@@ -230,11 +249,11 @@ $messages = array(
 'viewtalkpage' => 'Kitaen ti pagtungtungan',
 'otherlanguages' => 'Dagiti sabali a pagsasao',
 'redirectedfrom' => '(Naibaw-ing manipud idiay $1)',
-'redirectpagesub' => 'Ibaw-ing ti panid',
+'redirectpagesub' => 'Baw-ing a panid',
 'lastmodifiedat' => 'Naudi a nabaliwan daytoy a panid idi $1, ti oras nga $2.',
 'viewcount' => 'Naserrekan daytoy a panid iti {{PLURAL:$1|naminsan|$1 a daras}}.',
 'protectedpage' => 'Nasalakniban a panid',
-'jumpto' => 'Mapan iti:',
+'jumpto' => 'Mapan idiay:',
 'jumptonavigation' => 'pagdaliasatan',
 'jumptosearch' => 'biruken',
 'view-pool-error' => 'Pasensian a, dagiti servers ket nadagsenan unay tattan.
@@ -274,8 +293,8 @@ $1',
 'versionrequiredtext' => 'Masapul ti bersion $1 ti MediaWiki tapno maaramat daytoy a panid. Kitaen ti [[Special:Version|panid ti bersion]].',
 
 'ok' => 'OK',
-'retrievedfrom' => 'Naala manipud iti "$1"',
-'youhavenewmessages' => 'Addaanka iti $1 ($2).',
+'retrievedfrom' => 'Naala manipud idiay "$1"',
+'youhavenewmessages' => 'Addaanka ti $1 ($2).',
 'newmessageslink' => 'dagiti baro a mensahe',
 'newmessagesdifflink' => 'naudi a sinukatan',
 'youhavenewmessagesmulti' => 'Adda dagiti baro a mensahem iti $1',
@@ -292,7 +311,7 @@ $1',
 'collapsible-expand' => 'Palawaen',
 'thisisdeleted' => 'Kitaen wenno isubli ti $1?',
 'viewdeleted' => 'Kitaen ti $1?',
-'restorelink' => '{{PLURAL:$1|maysa a naikkat a naurnos|$1 dagiti naikkat a naurnos}}',
+'restorelink' => '{{PLURAL:$1|ti maysa a naikkat a naurnos|dagiti $1 a naikkat a naurnos}}',
 'feedlinks' => 'Pakan:',
 'feed-invalid' => 'Saan a mabalin a kita ti maalala a pakan.',
 'feed-unavailable' => 'Awan dagiti pakan a sindikasion',
@@ -335,7 +354,7 @@ Ti pinaudi a pinagsapul ti database ket:
 <blockquote><tt>$1</tt></blockquote>
 naggapu ti uneg ti opisio "<tt>$2</tt>".
 Ti database ket nangipatulod ti biddut "<tt>$3: $4</tt>".',
-'dberrortextcl' => 'Adda biddut ti database ti  gramatika a pinagsapul.
+'dberrortextcl' => 'Adda biddut ti database ti  gramatika a panagsapul.
 Ti kinaudi a panagsapul ti database ket:
 "$1"
 naggapu ti uneg ti opisio "$2".
@@ -346,37 +365,37 @@ Ti database ket nangipatulod ti biddut "$3: $4".',
 'readonlytext' => 'Ti database ket naikandado iti baro a panagikabil ken panagbaliw, gapu dagiti kanayon nga pagsimpa, ket no malpas absublin to ti kasla idi.
 
 Ti administrador a nagkandado ket daytoy ti palawag na: $1',
-'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a nabirukan na kuman, ti napanaganan a/nga "$1" $2.
+'missing-article' => 'Ti database ket saan a nakabiruk ti testo ti panid  a nabirukanna kuman, ti napanaganan ti "$1" $2.
 
-Dagiti sumaganad a gapu na daytoy ket ti nagpaso a sabali wenno pakasaritaan ti panilpo ti panid a naikkat.
+Dayoty ket gapu babaen ti sumaganad a baak a paggiddiatan wenno panilpo ti pakasaritaan ti maysa panid a dati a naikkat.
 
 No saan a kasta, baka nakasarak ti kiteb ti "software".
 
-Panngaasim ta ibagam kadagiti [[Special:ListUsers/sysop|administrador]], isurat mo ti pakaammo dayta URL.',
+Panngaasi nga  ibagam kadagiti [[Special:ListUsers/sysop|administrador]], isurat mo ti pakaammo dayta URL.',
 'missingarticle-rev' => '(binaliwan#: $1)',
 'missingarticle-diff' => '(Sabali: $1, $2)',
 'readonly_lag' => 'Automatiko a narikpan ti database kabayatan a dagiti tagabu a database servers ket kumamakam iti agturay',
 'internalerror' => 'Akin-uneg a biddut',
 'internalerror_info' => 'Akin-uneg a biddut: $1',
-'fileappenderrorread' => 'Saan nga mabasa "$1" no agpanayon.',
+'fileappenderrorread' => 'Saan a mabasa ti "$1" idi agpanayon.',
 'fileappenderror' => 'Saan a manayonan ti "$1" iti  "$2".',
-'filecopyerror' => 'Saan a matulad ti papeles "$1" iti "$2".',
-'filerenameerror' => 'Saan a managanan ti papeles "$1" iti "$2".',
-'filedeleteerror' => 'Saan a maikkat ti papeles a "$1".',
-'directorycreateerror' => 'Saan a maaramid ti direktorio a "$1".',
-'filenotfound' => 'Saan a masarakan ti papeles a "$1".',
-'fileexistserror' => 'Di mabalin a maisurat ti papeles a "$1": adda kastan a papeles',
+'filecopyerror' => 'Saan a makopia ti papeles $1 iti $2.',
+'filerenameerror' => 'Saan a managanan ti papeles "$1" iti "$2".',
+'filedeleteerror' => 'Saan a maikkat ti papeles  "$1".',
+'directorycreateerror' => 'Saan a maaramid ti direktorio  "$1".',
+'filenotfound' => 'Saan a masarakan ti papeles  "$1".',
+'fileexistserror' => 'Di mabalin a maisurat ti papeles  "$1": Adda kastan a papeles',
 'unexpected' => 'Di mapakpakadaaan a kuwenta: "$1"="$2".',
 'formerror' => 'Biddut: saan a maited ti nakabuklan.',
 'badarticleerror' => 'Saan a matungpal daytoy nga aramid iti daytoy a panid.',
 'cannotdelete' => 'Ti panid wenno ti papeles "$1" ket saan a maikkat.
 Amangan no addan sabali a nangikkat.',
-'cannotdelete-title' => 'Saan a maikkat ti panid a "$1"',
+'cannotdelete-title' => 'Saan a maikkat ti panid  "$1"',
 'badtitle' => 'Madi a titulo',
 'badtitletext' => 'Ti nakiddaw a titulo ti panid ket imbalido, blanko, wenno saan nga umno a naisilpo a titulo a maki-pagsasao wenno maki-wiki.
 Adda ngata nagyan a maysa wenno ad-adu pay a kababalin a saan a mausar iti titulo.',
-'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro. T kangato a {{PLURAL:$1|maysa a nagbanagan ket|$1 dagiti nagbanagan}} ket magun-od idiay cache.',
-'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1. T kangato a {{PLURAL:$4|maysa a nagbanagan ket|$4 dagiti nagbanagan}} ket magun-od idiay cache.',
+'perfcached' => 'Ti sumaganad a data ket naka-cached ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagant|dagiti $1 a nagbanagan}} ket magun-od idiay cache.',
+'perfcachedts' => 'Ti sumaganad a data ket naka-cached, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay cache.',
 'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. 
 Saan a mipasaradiwa ita dagiti data ditoy.',
 'wrong_wfQuery_params' => 'Kamali a parametro iti wfQuery()<br />
@@ -386,26 +405,28 @@ Panagsapul: $2',
 'viewsource-title' => 'Kitaen ti taudan iti $1',
 'actionthrottled' => 'Napabuntog ti aramid',
 'actionthrottledtext' => 'Para ti pagkontra ti spam, naipatingga ka ti pinagtungpal ti adu unay iti daytoy nga aramid iti nasiket nga oras, ken nalippasamon ti patingga.
-Pangngaasi ta ipadas mo manen no madamdama.',
-'protectedpagetext' => 'Nasalakniban daytoy a panid tapno pawilan ti panag-urnos.',
+Pangngaasi nga ipadas mo manen no madamdama.',
+'protectedpagetext' => 'Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos.',
 'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
-'viewyourtext' => "Mabalin mo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
-'protectedinterface' => 'Daytoy a panid ket mangited ti testo nga interface para iti software, ken nasalakniban tapno pawilan ti panag-abuso.',
-'editinginterface' => "'''Ballaag:''' Ururnosam ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti software.
+'viewyourtext' => "Mabalinmo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
+'protectedinterface' => 'Daytoy a panid ket mangited ti testo nga interface para iti software, ken nasalakniban tapno mapawilan ti panag-abuso.',
+'editinginterface' => "'''Ballaag:''' Ururnosem ti maysa a panid a maar-aramat a mangted iti testo ti interface para iti software.
 Dagiti panagsukat iti daytoy a panid ket maarigan ti langa ti agaramat nga interface dagiti sabali nga agar-aramat.
-Para kadagiti patarus, pangngaasim ta padasem nga aramaten ti [//translatewiki.net/wiki/Main_Page?setlang=ilo translatewiki.net], ti gandat a panagipatarus iti MediaWiki.",
+Para kadagiti panagipatarus, pangngaasim a padasen ti agaramat ti [//translatewiki.net/wiki/Main_Page?setlang=ilo translatewiki.net], ti gandat a panagipatarus ti MediaWiki.",
 'sqlhidden' => '(nakalemmeng ti biniruk a SQL )',
-'cascadeprotected' => 'Daytoy a panid ket nasalakniban ti panag-urnos, ngamin ket nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga|dagiti panid, nga}} nasalakniban iti pagpilian nga "agsariap"  :
+'cascadeprotected' => 'Daytoy a panid ket nasalakniban para iti panag-urnos, ngamin ket nairaman kadagiti sumaganad {{PLURAL:$1|a panid, a|a pampanid, a}} nasalakniban nga adda ti napili nga "agsariap"  :
 $2',
-'namespaceprotected' => "Awananka iti pammalubos nga agurnos kadagiti panid iti '''$1''' a nagan ti lugar.",
-'customcssprotected' => 'Awan ti pammalubos mo ti agurnos ditoy panid ti CSS, ngamin ta adda linaonna a kukua dagiti agar-aramat ti sabali a kasasaad.',
-'customjsprotected' => 'Awan ti pammalubos mo ti agurnos ditoy panid ti JavaScript, ngamin ta adda linaonna a kukua dagiti agar-aramat ti sabali a kasasaad.',
-'ns-specialprotected' => 'Saan a mapaurnos dagiti espesial a panid.',
-'titleprotected' => "Nasalakniban daytoy a titulo manipud iti pianaka-aramid ni [[User:$1|$1]].
+'namespaceprotected' => "Awan ti pammalubosmo nga agurnos kadagiti panid iti '''$1''' a nagan ti lugar.",
+'customcssprotected' => 'Awan ti pammalubosmo nga agurnos ditoy panid ti CSS, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
+'customjsprotected' => 'Awan ti pammalubosmo nga agurnos ditoy panid ti JavaScript, ngamin ket adda linaonna a tagikua dagiti agar-aramat ti sabali a kasasaad.',
+'ns-specialprotected' => 'Saan a mabalin nga urnosen dagiti espesial a panid.',
+'titleprotected' => "Daytoy a titulo ket nasalakniban manipud ti panakapartuat babaen ni [[User:$1|$1]].
 Ti naited a rason ket ''$2''.",
 'filereadonlyerror' => 'Di nabaliwan ti papales "$1" gapu ket ti repositorio ti papeles "$2" ket basaen laeng a moda.
 
-Ti rason a naited ket "\'\'$3\'\'".',
+Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Imbalido a titulo nga adda ti nagan ti lugar "$2" ken testo "$3"',
+'invalidtitle-unknownnamespace' => 'Imbalido a titulo nga adda di-amammo a nagan ti lugar a numero $1 ken testo "$2"',
 
 # Virus scanner
 'virus-badscanner' => 'Madi di panaka-aramidna: Di am-ammo a birus a panagskan: "$1"',
@@ -418,15 +439,15 @@ Ti rason a naited ket "\'\'$3\'\'".',
 Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno [[Special:UserLogin|sumrek ka manen]] iti sigud wenno sabali nga agar-aramat.
 Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakaserrek ka pay laeng, agingga na nga dalusam ti \"cache\" ti panagbasabasam.",
 'welcomecreation' => '== Kablaaw, $1! ==
-Naramiden ti pakabilangam.
+Naaramiden ti pakabilangam.
 Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENAME}} kaykayat]].',
 'yourname' => 'Nagan ti agar-aramat:',
 'yourpassword' => 'Kontrasenias:',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
-'remembermypassword' => 'Laglagipem ti iseserrekko daytoy a pagbasabasa (iti kadakkelan $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
+'remembermypassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (para iti kaadu iti $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}})',
 'securelogin-stick-https' => 'Agyan ka a nakasilpo iti HTTPS no nakastrekka',
 'yourdomainname' => 'Ti bukodmo a pagturayan:',
-'externaldberror' => 'Addaan a biddut ti panakasingked ti database wenno saan mo a mabalin ti agpabaro ti ruar a pakabilangan.',
+'externaldberror' => 'Adda biddut idi ti panakapasingked ti database wenno saanmo a mabalin ti agpabaro ti bukodmo a ruar a pakabilangan.',
 'login' => 'Sumrek',
 'nav-login-createaccount' => 'Sumrek / agaramid ti pakabilangan',
 'loginprompt' => 'Nasken nga adda pakabaelan dagiti "galietas" ti "pagbasabasam" tapno maka-serrek ditoy {{SITENAME}}.',
@@ -454,10 +475,10 @@ Nabaldado dagiti galietas mo.
 Pangngaasi ta pakabaelam ida,  ken sumrek ka nga agusar ti baro a nagan ken kontrasenias.',
 'nocookieslogin' => 'Ti {{SITENAME}} ket agus-usar  kadagiti galietas tapno makastrek dagiti agar-aramat.
 Nabaldado dagiti galietas mo.
-Pangngaasim ta pakabaelam ida ken padasem manen ti sumrek.',
+Pangngaasi a pakabaelam ida ken padasem manen ti sumrek.',
 'nocookiesfornew' => 'Ti pakabilangan ti agar-aramat ket saan a naaramid, saan mi a masingkedan ti naggapuan na.
 Usarem dagita galietas mo, ipadas mo manen daytoy a panid.',
-'noname' => 'Saan mo a nainaganan ti maisu a nagan ti agar-aramat.',
+'noname' => 'Saanmo a nainaganan ti agpayso a nagan ti agar-aramat.',
 'loginsuccesstitle' => 'Balligi ti panagserrek',
 'loginsuccess' => "'''Nakastrekkan iti {{SITENAME}} a kas ni \"\$1\".'''",
 'nosuchuser' => 'Awan ti agar-aramat nga agnagan iti "$1". 
@@ -465,11 +486,11 @@ Usarem dagita galietas mo, ipadas mo manen daytoy a panid.',
 Kitaem ti panangiletra, wenno [[Special:UserLogin/signup|agaramid ka ti baro a pakabilangan]].',
 'nosuchusershort' => 'Awan ti agar-aramat nga addaan iti nagan a "$1".
 Kitaem ti panangiletra.',
-'nouserspecified' => 'Nasken nga inaganam ti nagan ti agar-aramat.',
+'nouserspecified' => 'Nasken nga agikabilka ti nagan ti agar-aramat.',
 'login-userblocked' => 'Naserraan daytoy nga agar-aramat. Maiparit ti sumrek.',
 'wrongpassword' => 'Biddut (wenno awan) ti kontrasenias nga ikabil mo. Padasem koma manen, apo.',
 'wrongpasswordempty' => 'Blanko ti impanmo a kontrasenias. Padasem koma manen apo.',
-'passwordtooshort' => 'Ti kontrasenias ket nasken nga addaan ti {{PLURAL:$1| 1 a karakter|$1 a dagiti karakter}}.',
+'passwordtooshort' => 'Ti kontrasenias ket nasken nga adda  {{PLURAL:$1|iti 1 a karakter|kadagiti $1 a karakter}}.',
 'password-name-match' => 'Masapul a saan nga agpadpada ti  nagan mo nga agar-aramat ken kontrasenias',
 'password-login-forbidden' => 'Maiparit daytoy ususarem a nagan ti agar-aramat ken kontrasenias.',
 'mailmypassword' => 'E-surat ti baro a kontrasenias',
@@ -478,7 +499,7 @@ Kitaem ti panangiletra.',
 a kontrasenias para iti {{SITENAME}} ($4). Ti saan nga agnayon a kontrasenias ti agususar
 "$2" ket naaramiden ken naidisso iti "$3". No kastan ti kinayatmo,
 masapul a sumrek ka ta agpili ka ti baro a kontrasenias.
-Madinton ti saan nga agnayon a kontrasenias iti {{PLURAL:$5|aldaw|$5 al-aldaw}}.
+Ti temporario a bukodmo a kontrasenias ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 
 No sabali ti nagkiddaw, wenno no malagipmo pay ti kontrasenias mo ket dimon kayat a suktan daytoy, mabalin a dimo lattan ikaskaso daytoy a mensahe ket itultuloymo latta nga usaren ti daan a kontrasenias.',
 'noemail' => 'Awan ti nagtaengan ti e-surat  a nairehistro iti agar-aramat a ni "$1".',
@@ -488,19 +509,20 @@ Sumrekka koma manen kalpasan a maawatmo daytoy a baro a kontrasenias.',
 'blocked-mailpassword' => 'Ti IP a pagtaengam ket naserraan iti panagurnos, isu nga saan a mabalin nga agusar ti panagala ti kontrasenias nga opisio tapno mapawilan ti panag-abuso.',
 'eauthentsent' => 'Naipatuloden ti pammasingked nga e-surat iti naited nga e-surat a pagtaengan.
 Sakbay nga ania man nga e-surat ti maipatulod iti pakabilangan, masapul a surotem dagiti maibagbaga iti e-surat, tapno mapasingkedan a ti pakabilangan ket agpayso a kukuam.',
-'throttled-mailpassword' => 'Ti palagip ti kontrasenias ket naipatuloden, iti napalabas nga {{PLURAL:$1|oras|$1 oras}}.
-Tapno maipawilan ti panag-abuso, maysa laeng a palagip ti kontrasenias ti maipatulod iti {{PLURAL:$1|oras|$1 oras}}.',
+'throttled-mailpassword' => 'Ti palagip ti kontrasenias ket naipatuloden, iti napalabas nga {{PLURAL:$1|oras|$1 nga oras}}.
+Tapno maipawilan ti panag-abuso, maysa laeng a palagip ti kontrasenias ti maipatulod ti tunggal maysa nga {{PLURAL:$1|oras|$1 nga oras}}.',
 'mailerror' => 'Biddut iti panagipatulod iti surat: $1',
-'acct_creation_throttle_hit' => 'Dagiti bisita daytoy wiki nga agususar ti IP a pagtaengan ket nakaaramid iti {{PLURAL:$1|1 pakabilangan|$1 dagiti pakabilangan}} ti maysa nga aldaw, dagita laeng ti mabalin a mausar.
-Ti nagbanagan na, dagitoy bisita nga agususar ti IP a pagtaengan ket saan a makaaramid ti pakabilangan tatta.',
+'acct_creation_throttle_hit' => 'Dagiti bisita daytoy wiki nga agususar ti IP a pagtaengan ket nakaaramid {{PLURAL:$1|iti 1 a pakabilangan|kadagiti $1 a pakabilangan}} ti maysa nga aldaw, dagita laeng ti mabalin a mausar.
+Ti nagbanaganna, dagitoy bisita nga agususar ti IP a pagtaengan ket saan a makaaramid ti pakabilangan tatta.',
 'emailauthenticated' => 'Napasingkedan ti e-surat a pagtaengan idi $2 ti oras nga $3.',
 'emailnotauthenticated' => 'Saan pay a napasingkedan ti e-surat mo.
 Awan ti e-surat nga ipatulod para dagitoy a langa.',
 'noemailprefs' => 'Ipanaganan ti e-surat a pagtaengan tapno agbalin dagitoy a langa.',
 'emailconfirmlink' => 'Pasingkedam ti e-surat a pagtaengam',
 'invalidemailaddress' => 'Ti e-surat a pagtaengam ket saan a maawat, ket kasla addaan ti saan a napudno a nakabuklan.
-Pangngaasi ta ikkam ti nasayaat  a  nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
+Pangngaasi nga ikkam ti nasayaat  a  nakabuklan a pagtaengan wenno ikkatem amin dagiti naikabil mo.',
 'cannotchangeemail' => 'Dagiti pakabilangan nga e-surat a pagtaengan ket saan a mabaliwan ditoy a wiki.',
+'emaildisabled' => 'Daytoy a pagsaaadan ket saan a makaipatuod kadagiti e-surat.',
 'accountcreated' => 'Naaramiden ti pakabilangan',
 'accountcreatedtext' => 'Naaramiden ti pakabilangan a pagaramat ni $1.',
 'createaccount-title' => 'Panagaramid iti pakabilangan para iti {{SITENAME}}',
@@ -512,7 +534,7 @@ Saan mo nga ikaskaso daytoy a mensahe, no biddut a naaramid daytoy a pakabilanga
 Pangaasim ta aguray ka sakbay nga agipadas manen.',
 'login-abort-generic' => 'Madi ti panakastrekmo - Napasardeng',
 'loginlanguagelabel' => 'Pagsasao: $1',
-'suspicious-userlogout' => 'Madi ti kiniddaw mo a rummuar, ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
+'suspicious-userlogout' => 'Madi ti kiniddawmo a rummuar, ngamin ket kasla inpatulod ti nadadael a "panagbasabasa" wenno "caching proxy".',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Di am-ammo a biddut ti kukua ti PHP a surat () nga opisio.',
@@ -543,30 +565,30 @@ Baka mabalin a nasukatam metten ti kontrasenias mo wenno nagkiddaw ka ti saan ng
 'passwordreset-text' => 'Lippasem daytoy a kinabuklan tapno maipatulodan ka ti e-surat a palagipan kadagiti dsalaysay ti pakabilangam.',
 'passwordreset-legend' => 'Ipasubli ti kontrasenias',
 'passwordreset-disabled' => 'Naikkat dagiti pagisubli iti kontrasenias daytoy a wiki.',
-'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a bukel ti data dita baba}}',
+'passwordreset-pretext' => '{{PLURAL:$1||Ikabil ti maysa a bukel ti datos dita baba}}',
 'passwordreset-username' => 'Nagan ti agar-aramat:',
 'passwordreset-domain' => 'Pagturayan:',
 'passwordreset-capture' => 'Kayatmo a kitaen ti nagbanagan ti e-surat?',
 'passwordreset-capture-help' => 'No markaam daytoy a kahon, ti e-surat (nga adda saan nga agnayon a kontrasenias) ket maipakita kenka ken maipatulod iti agar-aramat.',
 'passwordreset-email' => 'E-surat a pagtaengan:',
-'passwordreset-emailtitle' => 'Detalye ti pakabilangan iti {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Addaan (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti palagip para
-dagiti detalye ti pakabilangam para iti {{SITNAME}} ($4) . Ti sumaganad {{PLURAL:$3|a pakabilangan|a dadagiti pakabilangan}} ti agar-aramat ket
+'passwordreset-emailtitle' => 'Salaysay ti pakabilangan iti {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti palagip para
+dagiti salaysay ti pakabilangam para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket
 nakairaman iti daytoy nga e-surat a pagtaengan:
 
 $2
 
-{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso iti {{PLURAL:$5|maysa nga aldaw|$5 nga al-aldaw}}.
+{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso  {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
 panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
 agtuloy ka nga agusar ti daan a kontrasenias.',
-'passwordreset-emailtext-user' => 'Daytoy nga  agar-aramat  $1 iti {{SITENAME}} ket nagkiddaw ti palagip para dagiti detalye ti pakabilangan iti {{SITENAME}}
-($4) . Ti sumaganad {{PLURAL:$3|a pakabilangan|kadagiti pakabilangan}}  ti agar-aramat ket
+'passwordreset-emailtext-user' => 'Daytoy nga  agar-aramat  $1 iti {{SITENAME}} ket nagkiddaw ti palagip para dagiti salaysay ti pakabilangan iti {{SITENAME}}
+($4) .  {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilanagn ti agar-aramat ket
 nakairaman iti daytoy nga e-surat a pagtaengan:
 
 $2
 
-{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso iti {{PLURAL:$5|maysa nga aldaw|$5 nga al-aldaw}}.
+{{PLURAL:$3|Daytoy a saan nga agnayon a kontrasenias|Dagitoy a saan nga agnayon a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.
 Sumrekka kuman ta agpili ka ti baro a kontrasenias mo tattan. No adda met sabali a nagaramid daytoy a 
 panagkiddaw, wenno malagip mo ti dati a kontrasenias mo, ket saan mo a kayaten a sukatan, saan mo nga ikaskaso daytoy a mensahe ken 
 agtuloy kan nga agusar ti daan a kontrasenias mo.',
@@ -579,7 +601,7 @@ Saan nga agnayon a kontrasenias: $2',
 # Special:ChangeEmail
 'changeemail' => 'Sukatan ti e-surat a pagtaengan',
 'changeemail-header' => 'Sukatan ti e-surat a pagtaengan ti pakabilangan',
-'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti e-surat a pagtaengam. Masapul mo nga ikabil ti kontrasenias mo tapno mapasingkedan ti panagsukat.',
+'changeemail-text' => 'Lippasem daytoy a kabuklan ti panagsukat ti e-surat a pagtaengam. Nasken nga ikabilmo ti kontrasenias tapno mapasingkedan daytoy a panagsukat.',
 'changeemail-no-info' => 'Masapul a nakastrekka tapno dagus ka a makapan ditoy a panid.',
 'changeemail-oldemail' => 'Agdama nga E-surat a pagtaengam:',
 'changeemail-newemail' => 'Baro nga e-surat a pagtaengam:',
@@ -602,7 +624,7 @@ Saan nga agnayon a kontrasenias: $2',
 'nowiki_tip' => 'Saan nga ikaskaso ti panagbuklan a wiki',
 'image_tip' => 'Naibinggas a papeles',
 'media_tip' => 'Panilpo ti papeles',
-'sig_tip' => 'Ti pirmam nga addaan ti oras ken petsa',
+'sig_tip' => 'Ti pirmam nga adda ti oras ken petsa',
 'hr_tip' => 'Pakuros a linia (manmano laeng nga aramaten)',
 
 # Edit pages
@@ -622,7 +644,7 @@ Mairehistro ti IP a pagtaengam iti pakasaritaan ti panagurnos iti daytoy a panid
 No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnos mo nga awan ti pakabuklan na.",
 'missingcommenttext' => 'Pangngaasim a mangipanka iti komentario dita baba.',
 'missingcommentheader' => "'''Palagip:''' Saanka a nangipan iti suheto/paulo para iti daytoy a komentario.
-No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnos mo nga awan ti pakabuklan na.",
+No agtakla ka ti \"{{int:savearticle}}\" manen, maidulin ti inurnormo nga awan ti pakabuklanna.",
 'summary-preview' => 'Naipadas a  pakabuklan:',
 'subject-preview' => 'Suheto/naipadas a paulo:',
 'blockedtitle' => 'Naseraan ti agar-aramat',
@@ -649,17 +671,17 @@ Ti rason nga inted ket:
 
 Mabalinmo a kontaken ni $1 wenno maysa kadagiti [[{{MediaWiki:Grouppage-sysop}}|administrador]] tapno maipalawag daytoy a panag-serra.
 
-Laglagipem nga saan mo a mabalin nga usaren ti "e-suratam daytoy nga agar-aramat "  ket laeng no addaan ka ti napudno nga e-surat a pagtaengan a nakarehistro idiay [[Special:Preferences|kakaykayatam]] ken saan ka a
+Laglagipem nga saanmo a mabalin nga usaren ti "e-suratam daytoy nga agar-aramat "  ket laeng no addaan ka ti napudno nga e-surat a pagtaengan a nakarehistro idiay [[Special:Preferences|kakaykayatam]] ken saan ka a
 naserraan ti panag-usar na.
 
 Ti tatta nga IP a pagtaengam ket $3, ken ti ID ti naserraan ket #$5.
-Pangaasi nga iraman mo amin dagiti detalye ti amin a panagsaludsod mo.',
+Pangaasi nga iramanmo amin dagiti salaysay ti amin a panagsaludsodmo.',
 'blockednoreason' => 'awan ti naited a rason',
-'whitelistedittext' => 'Masapul a/nga $1 ka tapno makaurnos kadagiti panid.',
+'whitelistedittext' => 'Nasken ti $1 tapno makaurnos kadagiti panid.',
 'confirmedittext' => 'Masapul a pasingkedam ti e-surat sakbay a makaurnos ka kadagiti panid.
 Pangngaasim nga ikabil ken ipapudnom ti e-suratmo idiay [[Special:Preferences|kaykayat dagiti agar-aramat ]].',
 'nosuchsectiontitle' => 'Saan a mabirukan ti kasta a paset',
-'nosuchsectiontext' => 'Pinadasmo nga inurnos ti maysa a paet nga awan pay.
+'nosuchsectiontext' => 'Pinadasmo nga inurnos ti maysa a paset nga awan pay.
 Naiyalis ngatan wenno naikkat idi kitkitaen dayta a panid.',
 'loginreqtitle' => 'Masapul ti sumrek',
 'loginreqlink' => 'sumrek',
@@ -669,14 +691,14 @@ Naiyalis ngatan wenno naikkat idi kitkitaen dayta a panid.',
 
 Ti kontrasenias ti baro a pakabilangan ket masukatan idiay ''[[Special:ChangePassword|pagsukatan ti kontrasenias]]'' a panid no sumrekka.",
 'newarticle' => '(Baro)',
-'newarticletext' => "Nasurotmo ti maysa a panilpo iti saan pay a narugian wenno naaramid a panid. Tapno marugian daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon iti baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). No met nakadanonka ditoy a dimo inggagara wenno gapu iti biddut, agtakla ka laeng ti '''agsubli'' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
+'newarticletext' => "Nasurotmo ti maysa a panilpo ti panid a saan pay a napartuat. Tapno pmapartuat daytoy a panid, rugiamon ti agikur-it wenno agisurat iti pagsuratan a kahon iti baba (kitaen ti [[{{MediaWiki:Helppage}}|panid ti tulong]] para iti ad-adu pay a pakaammo). No met nakadanonka ditoy a dimo inggagara wenno gapu iti biddut, agtakla ka laeng ti '''agsubli'' a buton ti pabasabasam tapno makasublika iti naggapuam a panid.",
 'anontalkpagetext' => "----''Daytoy ti pakitungtungan a panid para iti di am-ammo nga agar-aramat a saan pay a nakaaramid ti pakabilangan, wenno saan na nga us-usaren.
 Dakami ket agusar kami ti numero nga IP a pagtaengan ti panangilasin dagiti lalaki/babai.
 Ti kastoy nga IP a pagtaengan ket us-usaren a bingayan ti adu pay a sabsabali nga agar-aramat.
 No sika ket maysa a di am-ammo nga agar-aramat ken dagiti awan ti kapategan a komentario ket napaitudo kenka, pangngaasi nga [[Special:UserLogin/signup|agaramid ka ti pakabilangam]] wenno [[Special:UserLogin|sumrekka]] 
 tapno maawanan ti pinakaulaw kadagiti sabali a di am-ammo nga agar-aramat.",
-'noarticletext' => 'Awan pay ti  nagyan na daytoy a panid.
-Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] iti sabsabali a pampanid,
+'noarticletext' => 'Awan ti agdama a testo  daytoy a panid.
+Mabalinmo ti [[Special:Search/{{PAGENAME}}|agsapul iti kastoy a titulo ti panid]] kadagiti sabsabali a pampanid,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} agbirukka],
 wenno [{{fullurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} urnosem daytoy a panid].',
 'noarticletext-nopermission' => 'Awan pay ti  nagyan na daytoy a panid.
@@ -686,7 +708,7 @@ wenno <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}
 'userpage-userdoesnotexist' => 'Ti pakabilangan ti agar-aramat "$1" ket saan a nakarehistro. 
 Pangngaasi a kitaem no kayatmo ti agaramid/urnosen daytoy a panid.',
 'userpage-userdoesnotexist-view' => 'Ti pakabilangan ni agar-aramat "$1" ket saan a nakarehistro.',
-'blocked-notice-logextract' => 'Naserraan tatta daytoy nga agar-aramat.
+'blocked-notice-logextract' => 'Agdama a naserraan daytoy nga agar-aramat.
 Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:',
 'clearyourcache' => "'''Pakaammo:''' No nalpas ka nga agidulin, kuma ket masapul nga ipalabas ti cahe ti pinagbasabasam tapno makita dagiti sinukatam.
 * '''Firefox / Safari:''' Tenglen ti ''Sukatan'' bayat nga agtakla ti ''Ikarga manen'', wenno itakla ti ''Ctrl-F5'' wenno''Ctrl-R'' (''⌘-R'' Mac)
@@ -694,42 +716,45 @@ Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:
 * '''Internet Explorer:''' Tenglen ti ''Ctrl'' bayat nga agtakla ti ''Ipasaradiwa'', wenno itakla ti ''Ctrl-F5''
 * '''Konqueror:''' Itakla ti ''Ikarga manen'' wenno itakla ti ''F5''
 * '''Opera:''' Dalusan ti cache iti ''Ramramit → Kakaykayatan''",
-'usercssyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a CSS sakbay nga idulin mo.",
-'userjsyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a JavaScript sakbay nga idulin mo.",
-'usercsspreview' => "'''Laglagipem nga ipadpadas mo laeng daytoy a CSS.'''
+'usercssyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a CSS sakbay nga idulinmo.",
+'userjsyoucanpreview' => "'''Paammo:''' Usaren ti \"{{int:showpreview}}\" buton ti panagsubok ti baro a JavaScript sakbay nga idulinmo.",
+'usercsspreview' => "'''Laglagipem nga ipadpadasmo laeng daytoy a CSS.'''
 '''Saan pay a naidulin!'''",
-'userjspreview' => "'''Laglagipem nga ipadpadas mo laeng daytoy a JavaScript.'''
+'userjspreview' => "'''Laglagipem nga ipadpadasmo laeng daytoy a JavaScript.'''
 '''Saan pay a naidulin!'''",
-'sitecsspreview' => "'''Laglagipem nga ipadpadas mo laeng daytoy a CSS.'''
+'sitecsspreview' => "'''Laglagipem nga ipadpadasmo laeng daytoy a CSS.'''
 '''Saan pay a naidulin!'''",
-'sitejspreview' => "'''Laglagipem nga ipadpadas mo laeng ti kodigo daytoy a JavaScript.'''
+'sitejspreview' => "'''Laglagipem nga ipadpadasmo laeng ti kodigo daytoy a JavaScript.'''
 '''Saan pay nga naidulin!'''",
 'userinvalidcssjstitle' => "'''Ballaag:''' Awan ti kudil a \"\$1\".
 Annawid a .css ken .js dagiti titulo ket agususar ti napababa a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Napabaro)',
 'note' => "'''Paammo:'''",
-'previewnote' => "'''Maysa laeng a pagpadas daytoy; dagiti sinukatam ket saan pay a naidulin!'''",
+'previewnote' => "'''Laglagipem a daytoy ket panagipadas laeng.'''
+Dagiti sinukatam ket saan pay a naidulin!",
+'continue-editing' => 'Agtultuloy nga agurnos',
 'previewconflict' => 'Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.',
-'session_fail_preview' => "'''Pasensian a! Saan mi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
-Pangngaasi ta padasem manen.
+'session_fail_preview' => "'''Pasensian a! Saanmi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
+Pangngaasi a padasem manen.
 No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek ka manen.",
-'session_fail_preview_html' => "'''Pangngaasi! Saan mi a maaramid ti panagurnos mo ngamin ket naawanan ti gimong a datos.'''
+'session_fail_preview_html' => "'''Pangngaasi! Saanmi a maaramid ti panagurnosmo ngamin ket naawanan ti gimong a datos.'''
 
-''Gapu ti {{SITENAME}} ket addaan ti nakilaw a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti pinagraut ti dakes a JavaScript.''
+''Gapu ti {{SITENAME}} ket addaa ti nakilaw a HTML a nakapabaelan, ti panagpadas ket nailemmeng a kas pagan-annadan kadagiti panagraut ti dakes a JavaScript.''
 
-'''No daytoy ket pudno a panagurnos, pangngaasi ta padasem manen.'''
+'''No daytoy ket pudno a panagurnos, pangngaasi a padasem manen.'''
 No saan pay a mabalin, padasem ti [[Special:UserLogout|rummuar]] ken sumrek manen.",
-'token_suffix_mismatch' => "'''Ti panag-urnos mo ket saan a naawat ngamin ket ti klientem ket dinadael na ti kuldit ti kababalin idiay pinagpudno ti panag-urnos.'''
+'token_suffix_mismatch' => "'''Ti panag-urnosmo ket saan a naawat ngamin ket ti klientem ket dinadaelna ti kuldit ti kababalin idiay pinagpudno ti panag-urnos.'''
 Ti panag-urnos ket saan a naawat tapno mapawilan ti panakadadael ti testo ti panid.
-Mapasamak daytoy no agus-usar ka ti saan a nasayaat a naibasta ti sapot a diamammo a proxy a panagserbi.",
-'edit_form_incomplete' => "'''Adda dagiti paset ti panag-urnos a kabuklan a saan a nakadanon dita server; kitkitaen nga dagiti pianag-urnos mo ket saan a naikkatan ken padasem manen.'''",
+Mapasamak daytoy no agus-usarka ti saan a nasayaat a naibasta ti sapot a diamammo a proxy a panagserbi.",
+'edit_form_incomplete' => "'''Adda dagiti paset ti panag-urnos a kabuklan a saan a nakadanon dita server; kitkitaen nga dagiti panag-urnosmo ket saan a naikkatan ken padasem manen.'''",
 'editing' => 'Ururnosen ti $1',
+'creating' => 'Agparpartuat ti $1',
 'editingsection' => 'Ururnosen ti $1 (paset)',
 'editingcomment' => 'Ururnosen ti $1 (baro a paset)',
 'editconflict' => 'Adda kasinnungat ti panag-urnos: $1',
 'explainconflict' => "Adda sabali a nagsukat iti daytoy a panid idi nangrugi ka a nagurnos.
 Ti ngato a lugar ti testo ket adda dagiti nagyanna a testo ti panid a kasla agdama a kita na.
-Ti inurnos mo ket maipakita dita babba a lugar ti testo
+Ti inurnosmo ket maipakita dita babba a lugar ti testo
 Ipatipon mo dagiti sinukatam idiay lugar ti testo.
 '''Iti laeng'' testo dita ngato a lugar ti testo ti maidulin no pesselem ti \"{{int:savearticle}}\".",
 'yourtext' => 'Ti testom',
@@ -737,53 +762,53 @@ Ipatipon mo dagiti sinukatam idiay lugar ti testo.
 'nonunicodebrowser' => "'''Ballaag: Ti  pabasabasam ket saan a kasla unicode .'''
 Adda sabali a mausar tapno makaurnos ka kadagiti panid: Ti saan nga-ASCII a kababalin ket agparang iti pagurnosan a kahon a kas dagiti heksadesimal a kodigo.",
 'editingold' => "'''Ballag: Ururnosem ti daan a panag-baliw iti daytoy a panid.'''
-No idulin mo, mapukaw amin a sinukatam iti daytoy a panag-baliw.",
+No idulinmo, mapukaw amin a sinukatam iti daytoy a panag-baliw.",
 'yourdiff' => 'Dagiti nagdudumaan',
 'copyrightwarning' => "Laglagipenyo koma, apo, nga amin a parawad iti {{SITENAME}} ket maibilang a nairuar iti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). 
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
 Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo ngem iti maysa a nawaya a pagturayan ti publiko wenno pumadmad a libre a pagtaudan.
  '''Saan a mangipan iti addaan a karbengan ti pinagpablaak nga obra no awan ti  pammalubos!'''",
-'copyrightwarning2' => "Pangngaasiyo, apo, ta laglagipen nga amin a parawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.
+'copyrightwarning2' => "Pangngaasiyo, apo, a laglagipen nga amin a parawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
 Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladam ngem iti maysa a nawaya a pagturayan ti publiko wenno pumadmad a libre a pagtaudan (kitaen ti $1 para iti salaysay).
 '''Saan a mangipan iti addaan ti karbengan ti pinagpablaak nga obra no awan ti  pammalubos!'''",
 'longpageerror' => "'''Biddut: Ti testo nga intedmo ket {{PLURAL:$1|maysa a kilobyte|$1 kil-kilobyte}} a katiddog, nga at-atiddog ngem ti kangatuan iti  {{PLURAL:$2|maysa a kilobyte|$2 kil-kilobyte}}.'''
 Isu ti gapuna a saan a maidulin.",
-'readonlywarning' => "'''Ballaag: Narikepan ti database tapno masimpaan, saan mo a mabalin nga idulin dagita inurnos mo tattan.'''
-No kayatmo i \"cut-n-paste\" mo dagiti testo iti testo a papeles ken idulin mo no madamdama.
+'readonlywarning' => "'''Ballaag: Narikepan ti database tapno masimpaan, saan mo a mabalin nga idulin dagita inurnosmo tattan.'''
+No kayatmo i \"cut-n-paste\" mo dagiti testo iti testo a papeles ken idulinmo no madamdama.
 
 Ti administrador a nangrikep ket saan a nangted ti palawag: \$1",
 'protectedpagewarning' => "'''Ballaag:  Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti makaurnos ditoy.'''
 Ti nakaudi a naikabil a listaan ket adda dita baba tapno usarena  reperensia:",
-'semiprotectedpagewarning' => "''Pakaammo:''' Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.
+'semiprotectedpagewarning' => "'''Pakaammo:'''Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaurnos ditoy.
 Ti naudi a naikabil a listaan ket adda dita baba tapno usaren a reperensia:",
 'cascadeprotectedwarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng administrador nga addaan ti  gundaway ti makaurnos, ngamin ket nairaman kadagiti sumaganad a sariap a nasalakniban
-{{PLURAL:$1|panid|dagiti panid}}:",
-'titleprotectedwarning' => "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ti masapul a makaaramid.'''
+{{PLURAL:$1|a panid|a pampanid}}:",
+'titleprotectedwarning' => "'''Ballaag:  Nasalakniban daytoy a panid tapno [[Special:ListGroupRights|dagiti naisangayan a karbengan ]] ket nasken ti agpartuat iti daytoy.'''
 Ti kinaudi a naikabil iti listaan ket naikabil dita baba tapno usaren a reperensia:",
-'templatesused' => '{{PLURAL:$1|Plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:',
-'templatesusedpreview' => '{{PLURAL:$1|Plantilia|Dagiti plantilia}} ti nausar daytoy a pagpadas:',
-'templatesusedsection' => '{{PLURAL:$1|Plantilia|Dagiti plantilia}} a naaramat iti daytoy a paset:',
+'templatesused' => '{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a panid:',
+'templatesusedpreview' => '{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a nausar iti daytoy a panagpadas:',
+'templatesusedsection' => '{{PLURAL:$1|Ti plantilia|Dagiti plantilia}} a naaramat iti daytoy a paset:',
 'template-protected' => '(nasalakniban)',
 'template-semiprotected' => '(nasalakniban-bassit)',
-'hiddencategories' => 'Daytoy a panid ket kameng {{PLURAL:$1|1 ti nakalemmeng a kategoria|$1 dagiti nakalemmeng a kategoria}}:',
+'hiddencategories' => 'Daytoy a panid ket kameng  {{PLURAL:$1|ti 1 a nailemmeng a kategoria|dagiti $1 a nailemmeng a kategoria}}:',
 'nocreatetitle' => 'Napatinggaan ti panagaramid iti panid',
 'nocreatetext' => 'Pinaritan ti {{SITENAME}} ti kabaelan a panagaramid iti kabarbaro a pampanid.
 Mabalinmo ti agsubli ken urnosen ti adda a panid, wenno [[Special:UserLogin|sumrek wenno agaramid ti pakabilangan]].',
-'nocreate-loggedin' => 'Awan ti nangpalubos kenka a mangaramid kadagiti kabarbaro a panid.',
+'nocreate-loggedin' => 'Awan ti pammalubosmo nga agpartuat kadagiti baro a panid.',
 'sectioneditnotsupported-title' => 'Saan a mabalin ti agurnos ti paset',
 'sectioneditnotsupported-text' => 'Saan a mabalin ti panag-urnos ti paset iti daytoy a panid.',
 'permissionserrors' => 'Dagiti biddut ti pammalubos',
-'permissionserrorstext' => 'Awan ti pammalubos mo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|dagiti rason}}:',
-'permissionserrorstext-withaction' => 'Awan ti pammalubos mo nga $2, gapu ti sumaganad {{PLURAL:$1|a rason|dagiti rason}}:',
-'recreate-moveddeleted-warn' => "''Ballaag: Agar-aramidka ti panid a naikkaten iti kallabes.'''
+'permissionserrorstext' => 'Awan ti pammalubosmo nga agaramid iti dayta, gapu ti sumaganad {{PLURAL:$1|a rason|a rasrason}}:',
+'permissionserrorstext-withaction' => 'Awan ti pammalubosmo nga $2, gapu ti sumaganad {{PLURAL:$1|a rason|rasrason}}:',
+'recreate-moveddeleted-warn' => "''Ballaag: Agparpartuatka manen ti naikkat idi a panid.'''
 
 Nasken a siguraduem no maikanatad nga ituloymo a parnuayen manen wenno urnosen daytoy a panid.
 Ti panaka-ikkat ken panka-iyalis a listaan para iti daytoy  a panid ket adda ditoy a pakakitaan:",
 'moveddeleted-notice' => 'Naikkaten daytoy a panid.
 Ti listaan a panaka-ikkat ken panaka-iyalis ti panid ket naikabil dita baba tapno usaren a reperensia.',
 'log-fulllog' => 'Kitaem amin dagita listaan',
-'edit-hook-aborted' => 'Iti panag-urnos ket napasardeng ti kawit.
+'edit-hook-aborted' => 'Ti panag-urnos ket napasardeng ti kawit.
 Awan ti intedna a palawag.',
 'edit-gone-missing' => 'Saan a mapabaro daytoy a panid.
 Kasla met naikkaten.',
@@ -791,25 +816,32 @@ Kasla met naikkaten.',
 'edit-no-change' => 'Ti inurnos mo ket saan a naikaskaso, ngamin ket awan ti nasukatan a testo.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
+'defaultmessagetext' => 'Naisigud a testo ti mensahe',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser nga opisio a pinagtawtawag.
 
-Adda kuman basbasit ngem $2 {{PLURAL:$2|pinagtawtawag|dagiti pinagtawtawag}}, adda {{PLURAL:$1|idiayen a $1 pinagtawtawag|a $1 kadagiti pinagtawtawag}}.",
-'expensive-parserfunction-category' => 'Dagiti panid nga addaan iti adu la unay a nangina a parser nga opisio a pinagtawtawag',
+Adda kuman basbasit ngem $2 {{PLURAL:$2|a panagtawtawag|kadagiti panagtawtawag}}, adda {{PLURAL:$1|tattan $1 a panagtawtawag|tattan kadagiti $1 a panagtawtawag}}.",
+'expensive-parserfunction-category' => 'Dagiti panid nga adda ti adu unay a nangina a parser nga opisio a panagtawtawag',
 'post-expand-template-inclusion-warning' => "'''Ballaag:''' Dakkel unay ti naikabil a plantilia.
 Addan to dagiti plantilia a saan a maikabil.",
 'post-expand-template-inclusion-category' => 'Dagiti pampanid nga ayan dagiti nagsobra ti rukod dagiti naikabil a plantilia',
-'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket adda nagyan na a maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
+'post-expand-template-argument-warning' => "'''Ballaag:''' Daytoy a panid ket adda nagyanna a maysa a panagpalawag a plantilia a dakkel unay ti panagpadakkel na.
 Dagitoy a panagpalawag  ket naikkaten.",
-'post-expand-template-argument-category' => 'Dagiti panid a naglaon iti naikkat kadagiti kasinnungat ti plantilia',
+'post-expand-template-argument-category' => 'Dagiti panid a naglaon ti naikkat a plantilia kadagiti kasinnungat',
 'parser-template-loop-warning' => 'Adda nasarakan a silo ti plantilia: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Ti kinauneg ti pinagdullit ti plantilia ket nagpatingga ti napalabes ($1)',
+'parser-template-recursion-depth-warning' => 'Ti kinauneg ti panagdullit ti plantilia ket nagpatingga ti napalabes ($1)',
 'language-converter-depth-warning' => 'Ti kauneg ti panagaramid ti pagsasao ket napalabes ti agpatingga a ($1)',
+'node-count-exceeded-category' => 'Dagiti panid a simmurok ti bilang ti node',
+'node-count-exceeded-warning' => 'Ti panid ket nasurokanna ti bilang ti node',
+'expansion-depth-exceeded-category' => 'Dagiti panid a nasurokan ti kauneg ti panagpadakkel',
+'expansion-depth-exceeded-warning' => 'Ti panid ket nasurokanna ti kauneg ti panagpadakkel',
+'parser-unstrip-loop-warning' => 'Adda  nakita a di-naukisan a silo',
+'parser-unstrip-recursion-limit' => 'Ti di-naukisan a panagsumro manen a patingga ket nasurokan ($1)',
 
 # "Undo" feature
-'undo-success' => 'Ti panag-urnos ket san a maisubli.
-Pangngaasi ta kitaen ti pinagpada dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.',
+'undo-success' => 'Ti panag-urnos ket saan a maisubli.
+Pangngaasi a kitaen ti pagipadaan dita baba tapno maamuan no agpaypayso ti kayatmo nga aramiden, ken idulin dagiti sinukatan dita baba tapno malpas ti panagsubli ti inurnos.',
 'undo-failure' => 'Ti inurnos ket saan a maipasubli ta adda dagiti nakisinnungat a patingnga a naurnos.',
 'undo-norev' => 'Saan a maibabawi ti naurnos ngamin ket awan met daytoy wenno mabalin a naikkat.',
 'undo-summary' => 'Ibabawi ti binaliwan $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Makipatang]])',
@@ -823,11 +855,11 @@ Ti inted a rason ni $3 ket ''$2''",
 # History pages
 'viewpagelogs' => 'Kitaen dagiti listaan para iti daytoy a panid',
 'nohistory' => 'Awan ti pakasaritaan ti panag-urnos iti daytoy a panid.',
-'currentrev' => 'Kinaudi a panagbaliwan',
-'currentrev-asof' => 'Pinakaudi a panagbalbaliw idi sipud a $1',
-'revisionasof' => 'Panangbalbaliw sipud $1',
-'revision-info' => 'Panangbaliw ni $2 sipud idi $1',
-'previousrevision' => '←Nadadaan a panangbalbaliw',
+'currentrev' => 'Kinaudi a binaliwan',
+'currentrev-asof' => 'Kinaudi a panagbalbaliw manipud idi $1',
+'revisionasof' => 'Panangbalbaliw manipud idi $1',
+'revision-info' => 'Panangbaliw manipud idi $1 babaen ni $2',
+'previousrevision' => '←Daan a panangbalbaliw',
 'nextrevision' => 'Nabarbaro a panangbalbaliw→',
 'currentrevisionlink' => 'kitaen ti agdama a panangbaliw',
 'cur' => 'agdama',
@@ -845,8 +877,8 @@ Sarita: '''({{int:cur}})''' = naggidiatan ti kinaudi a panagbaliw, '''({{int:las
 'historyempty' => '(blanko)',
 
 # Revision feed
-'history-feed-title' => 'Pakasaritaan ti panamalbaliw',
-'history-feed-description' => 'Pakasaritaan ti panamalbaliw para ti panid ditoy a wiki',
+'history-feed-title' => 'Pakasaritaan ti panagbalbaliw',
+'history-feed-description' => 'Pakasaritaan ti panagbalbaliw para iti daytoy a panid ditoy a wiki',
 'history-feed-item-nocomment' => '$1 iti $2',
 'history-feed-empty' => 'Awan ti kiniddaw a panid..
 Baka naikkaten ditoy a wiki, wenno nanaganan.
@@ -861,37 +893,37 @@ Padasem ti [[Special:Search|agbiruk ditoy a wiki]] kadagiti mapaay a baro a pani
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
 'rev-deleted-text-unhide' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].
-Mabalin mo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
+Mabalinmo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
 'rev-suppressed-text-unhide' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].
 Mabalin mo pay a [$1 makita daytoy a panakabaliw] no kayatmo ti agtuloy.",
 'rev-deleted-text-view' => "Ti panakabaliw daytoy a panid ket '''naikkaten'''.
-Mabalin mo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
+Mabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
 'rev-suppressed-text-view' => "Ti panakabaliw daytoy a panid ket '''napasardeng'''.
-Mabalin mo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
-'rev-deleted-no-diff' => "Saan mo a makita daytoy a paggiddiatan ngamin ket maysa a panagbaliwan ket '''naikkat''.
+Mabalinmo a kitaen; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
+'rev-deleted-no-diff' => "Saanmo a makita daytoy a paggiddiatan ngamin ket ti maysa a panagbaliw ket '''naikkat''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-'rev-suppressed-no-diff' => "Saan mo a makita daytoy a paggiddiatan ngamin ket maysa a panagbaliwan ket '''naikkat''.",
-'rev-deleted-unhide-diff' => "Maysa a panagbaliwan iti daytoy a paggiddiatan ket '''naikkaten'''.
+'rev-suppressed-no-diff' => "Saanmo a makita daytoy a paggiddiatan ngamin ket maysa a panagbaliwan ket '''naikkat''.",
+'rev-deleted-unhide-diff' => "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''naikkaten'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].
-Mabalin mo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-'rev-suppressed-unhide-diff' => "Maysa a panagbaliwan iti daytoy a paggiddiatan ket '''napasardeng'''.
+Mabalinmo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+'rev-suppressed-unhide-diff' => "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''napasardeng'''.
 Dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].
-Mabalin mo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
-'rev-deleted-diff-view' => "Maysa a panagbaliwan iti daytoy a paggiddiatan ket '''naikkaten'''.
-Mabalin mo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
-'rev-suppressed-diff-view' => "Maysa a panagbaliwan iti daytoy a paggiddiatan ket '''napasardeng'''.
-Mabalin mo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
+Mabalinmo pay a [$1 makita daytoy a paggiddiatan] no kayatmo ti agtuloy.",
+'rev-deleted-diff-view' => "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''naikkaten'''.
+Mabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti naikkat].",
+'rev-suppressed-diff-view' => "Maysa a panagbaliw iti daytoy a paggiddiatan ket '''napasardeng'''.
+Mabalinmo pay a kitaen daytoy a paggiddiatan; dagiti salaysay ket mabirukan idiay [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} listaan ti napasardeng].",
 'rev-delundel' => 'ipakita/ilemmeng',
 'rev-showdeleted' => 'ipakita',
-'revisiondelete' => 'Naikkat/isubli dagiti naikkat a panagbaliwan',
-'revdelete-nooldid-title' => 'Imbalido ti napuntaan a panagbaliwan',
-'revdelete-nooldid-text' => 'Baka saan mo nga imbaga ti pagpuntaan ti panagbaliwan (dagiti panagbaliwan) ti panagaramid daytoy,
-awan ti naibaga a panagbaliw, wenno padpadasem nga ilemlemmeng ti kadama a panagbaliwan.',
+'revisiondelete' => 'Naikkat/isubli dagiti naikkat a panagbaliw',
+'revdelete-nooldid-title' => 'Imbalido ti napuntaan a panagbaliw',
+'revdelete-nooldid-text' => 'Baka saanmo nga imbaga ti pagpuntaan ti panagbaliw  (dagiti panagbaliwan) ti panagaramid daytoy,
+awan ti naibaga a panagbaliw, wenno padpadasem nga ilemlemmeng ti agdama a panagbaliw.',
 'revdelete-nologtype-title' => 'Awan ti naited a kita ti listaan',
-'revdelete-nologtype-text' => 'Saan mo nga nainaganan ti kita a listaan ti agtungpal daytoy nga aramid.',
+'revdelete-nologtype-text' => 'Saanmo nga nainaganan ti kita a listaan ti agtungpal daytoy nga aramid.',
 'revdelete-nologid-title' => 'Imbalido a panangikabil dita listaan',
-'revdelete-nologid-text' => 'Saan mo a nainaganan ti puntaan ti listaan a paspasamak ti agaramid daytoy a pagusar wenno ti nainaganan nga inkabil ket saan nga adda idiay.',
+'revdelete-nologid-text' => 'Saanmo a nainaganan ti puntaan ti listaan a paspasamak ti agaramid daytoy a pagusar wenno ti nainaganan nga inkabil ket saan nga adda idiay.',
 'revdelete-no-file' => 'Awan dayta ti nainaganan a papeles.',
 'revdelete-show-file-confirm' => 'Segurado a kayatmo ti mangkita ti naikkat a baliwan ti papeles "<nowiki>$1</nowiki>" a naggapu idi $2 ti oras nga $3?',
 'revdelete-show-file-submit' => 'Wen',
@@ -899,11 +931,11 @@ awan ti naibaga a panagbaliw, wenno padpadasem nga ilemlemmeng ti kadama a panag
 'logdelete-selected' => "'''{{PLURAL:$1|Ti napili a listaan ti napasamak|Dagiti napili a listaan ti napasamak}}:'''",
 'revdelete-text' => "'''Dagiti naikkat a binaliwan ken dagiti napasamak ket agparang idiay panid ti pakasaritaan ken dagiti listaan, ngem addaan dagiti paset ti nagyanda a saan a maserrekan ti publiko.'''
 Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalin da a serrekan ti nailemmeng a nagyan ken isubli ti panakaikkat da manen idiay dati nga interface, ngem saan no adda dagiti nainayon a naikabil a panagparit.",
-'revdelete-confirm' => 'Pangngaasi ti pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ket araramidem daytoy a segun iti [[{{MediaWiki:Policy-url}}|ti annuroten]].',
+'revdelete-confirm' => 'Pangngaasi a pasingkedam a kayatmo nga aramiden daytoy, a maawatam dagiti pagbanagan, ket araramidem daytoy a segun iti [[{{MediaWiki:Policy-url}}|ti annuroten]].',
 'revdelete-suppress-text' => "Ti pinagdepdep ket usaren '''laeng''' kadagiti sumaganad;
 * Makapataud a dakes a pakaammo
 * Di maiparbeng a  kabukbukodan a pakaammo
-* : ''dagiti pagtaengan ken numero ti telepono, numero ti social security, ken dadduma pay.''",
+* : ''dagiti pagtaengan ken numero ti telepono, numero ti sosial a seguridad, ken dadduma pay.''",
 'revdelete-legend' => 'Iplastar dagiti pinagparit ti panagkita',
 'revdelete-hide-text' => 'Ilemmeng ti testo ti binaliwan',
 'revdelete-hide-image' => 'Ilemmeng ti linaon ti papeles',
@@ -917,28 +949,28 @@ Dagiti sabsabali nga administrador idiay {{SITENAME}} ket mabalin da a serrekan
 'revdelete-suppress' => 'Depdepen ti data a naggapu kadagiti administrador ken dagiti sabsabali',
 'revdelete-unsuppress' => 'Ikkaten dagiti pannakaiparit kadagiti naisubli a binaliwan',
 'revdelete-log' => 'Rason:',
-'revdelete-submit' => 'Ipakat iti napili {{PLURAL:$1|a panamalbaliw|dagiti panamalbaliw}}',
-'revdelete-success' => "'''Balligi ti pinakabaro ti pinakakita ti pinagbaliwan.'''",
+'revdelete-submit' => 'Ipakat ti napili {{PLURAL:$1|a panagbalbaliw|a dagiti panagbalbaliw}}',
+'revdelete-success' => "'''Balligi ti panagpabaro ti pinakakita ti pinagbaliwan.'''",
 'revdelete-failure' => "'''Saan a napabaro ti pinakakita ti pinagbaliwan.'''
 $1",
 'logdelete-success' => "'''Balligi ti panagikabil ti listaan ti panagkita.'''",
 'logdelete-failure' => "'''Napaay ti panagikabil ti listaan ti panagkita:'''
 $1",
 'revdel-restore' => 'Sukatan ti panagkita',
-'revdel-restore-deleted' => 'naikkat a pinagbaliwan',
-'revdel-restore-visible' => 'makita a pinagbaliwan',
+'revdel-restore-deleted' => 'naikkat a binaliwan',
+'revdel-restore-visible' => 'makita a binaliwan',
 'pagehist' => 'Pakasaritaan ti panid',
 'deletedhist' => 'Naikkat a pakasaritaan',
-'revdelete-hide-current' => 'Biddut ti pinakailemmeng ti banag napetsado a $2, $1: Daytoy ti kinaudian a pinagbaliwan.
-Saan nga mailemmeng.',
+'revdelete-hide-current' => 'Biddut ti panakailemmeng ti banag a napetsado a $2, $1: Daytoy ti kinaudi a panagbaliw
+Saan a mailemmeng.',
 'revdelete-show-no-access' => 'Biddut ti panagpakita ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
 Saan mo a mabalin a serrekan.',
-'revdelete-modify-no-access' => 'Biddut ti pinagpabaro ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
+'revdelete-modify-no-access' => 'Biddut ti panagpabaro ti banag a petsado a $2, $1: Daytoy ket namarkaan a "nakedngan".
 Saan mo a mabalin a serrekan.',
-'revdelete-modify-missing' => 'Biddut ti pinagpabaro daytoy ID $1: Saan a nasarakan idiay database!',
+'revdelete-modify-missing' => 'Biddut ti panagpabaro daytoy ID $1: Saan a nasarakan idiay database!',
 'revdelete-no-change' => "'''Biddut:''' Daytoy a banag a petsado a  $2, $1 ket addaan ti kiniddaw kadagiti pakakita a kasasaad.",
-'revdelete-concurrent-change' => 'Biddut ti pinagpabaro daytoy a banag a petsado a $2, $1: Ti pinakaikabil na ket mabalin a nasuktanen ti sabsabli idi pinadas mo a pinabaro.',
-'revdelete-only-restricted' => 'Biddut pinagilemmeng daytoy banag a petsado a $2, $1: Saan mo a maidepdep dagita iti pinagkita dagiti adminitrador no saan mo a pilian ti maysa kadagiti pinagpili ti panagkita.',
+'revdelete-concurrent-change' => 'Biddut ti panagpabaro daytoy a banag a petsado a $2, $1: Ti panakaikabil na ket mabalin a nasuktanen ti sabsabli idi pinadas mo a pinabaro.',
+'revdelete-only-restricted' => 'Biddut ti panagilemmeng daytoy banag a petsado a $2, $1: Saan mo a maidepdep dagita iti panagkita dagiti adminitrador no saan mo a pilian ti maysa kadagiti pinagpili ti panagkita.',
 'revdelete-reason-dropdown' => '*Dagiti kadawyan a panagikkat
 ** Panaglabsing ti karbengan ti pinagipablaak
 ** Saan a maibagay a kabukbukodan a pakaammo
@@ -950,27 +982,27 @@ Saan mo a mabalin a serrekan.',
 
 # Suppression log
 'suppressionlog' => 'Listaan ti nadepdepan',
-'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken naserraan nga adda nagyanna a nailemmeng kadagiti administrador.
-Kitaen ti [[Special:BlockList|Listaan ti naserraan nga IP]] iti listaan ti agdama a kadagiti operasional a pinagparit ken panagserra',
+'suppressionlogtext' => 'Dita baba ket addaan dagiti listaan ti pinagikkat ken npanagserra a nairaman dagiti linaon a nailemmeng manipud kadagiti administrador.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama nga operasional a pinagparit ken panagserra.',
 
 # History merging
 'mergehistory' => 'Pagtiponen dagiti pakasaritaan ti pampanid',
-'mergehistory-header' => 'Daytoy a panid ket mabalin mo ti agpatipon kadagiti pinagbaliwan ti pakasaritaan iti maysa a taudan idiay barbaro a panid.
-Masapul a saraduem a daytoy a pinagsukat ket agsustento ti pinakaituoy ti pakasaritaan ti panid.',
+'mergehistory-header' => 'Daytoy a panid ket mabalinmo ti agitipon kadagiti pinagbaliwan ti pakasaritaan iti maysa a taudan idiay barbaro a panid.
+Masapul a sigaraduem a daytoy a panagsukat ket agsustento ti panakaituloy ti pakasaritaan ti panid.',
 'mergehistory-box' => 'Pagtiponen dagiti nasukatan iti dua a pampanid:',
 'mergehistory-from' => 'Taudan ti panid:',
 'mergehistory-into' => 'Pangipanan a panid:',
 'mergehistory-list' => 'Mabalin nga itipon ti pakasaritaan ti inurnos',
-'mergehistory-merge' => 'Dagiti sumaganad a pinagbaliw iti [[:$1]] ket mabalin nga itipon iti [[:$2]].
-Usaren ti radio a buton a tukol ti pinagtipon iti laeng pinagbaliw a naaramid idiay ken sakbay ti nainagan nga oras.',
+'mergehistory-merge' => 'Dagiti sumaganad a panagbaliw iti [[:$1]] ket mabalin nga itipon iti [[:$2]].
+Usaren ti radio a buton a tukol ti pinagtipon iti laeng panagbaliw a naaramid idiay ken sakbay ti nainagan nga oras.',
 'mergehistory-go' => 'Ipakita dagiti mabalin a maitipon a panag-urnos',
-'mergehistory-submit' => 'Pagtiponen dagiti panamalbaliw',
+'mergehistory-submit' => 'Pagtitiponen dagiti binalbaliwan',
 'mergehistory-empty' => 'Awan dagiti mabalin nga itipon.',
 'mergehistory-success' => '$3 {{PLURAL:$3|a binaliwan|dagiti binaliwan}} ti [[:$1]] balligi ti pinagtipon idiay [[:$2]].',
-'mergehistory-fail' => 'Saan a nakaaramid ti pinagtipon ti pakasaritaan, pangngaasi ta kitaen ti panid ken parametro ti oras.',
+'mergehistory-fail' => 'Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi ta kitaen ti panid ken parametro ti oras.',
 'mergehistory-no-source' => 'Awan ti taudan ti panid a $1.',
 'mergehistory-no-destination' => 'Awan ti papanan ti panid a $1.',
-'mergehistory-invalid-source' => 'Masapul nga addaan ti umisu a titulo ti taudan ti panid.',
+'mergehistory-invalid-source' => 'Masapul nga adda ti umisu a titulo ti taudan ti panid.',
 'mergehistory-invalid-destination' => 'Ti pangipanan ti panid ket masapul nga umisu a titulo.',
 'mergehistory-autocomment' => 'Naitipon ti [[:$1]] iti [[:$2]]',
 'mergehistory-comment' => 'Naitipon ti [[:$1]] iti [[:$2]]: $3',
@@ -978,61 +1010,62 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng pinagbaliw a naaramid id
 'mergehistory-reason' => 'Rason:',
 
 # Merge log
-'mergelog' => 'Listaan ti pinagtipon',
-'pagemerge-logentry' => 'itipon ti [[$1]] iti [[$2]] (dagiti binaliwan agingga iti $3)',
+'mergelog' => 'Listaan ti panagtipon',
+'pagemerge-logentry' => 'itipon ti [[$1]] iti [[$2]] (dagiti binaliwan aginggana iti $3)',
 'revertmerge' => 'Pagsinaen',
-'mergelogpagetext' => 'Adda dita baba ti listaan dagiti kinaudian a pinagtipon ti maysa a panid ti pakasaritaan iti maysa a sabali.',
+'mergelogpagetext' => 'Adda dita baba ti listaan dagiti kinaudian a panagtipon ti maysa a panid ti pakasaritaan iti maysa a sabali.',
 
 # Diffs
-'history-title' => 'Pakasaritaan ti pannakabalbaliw ti "$1"',
-'difference' => '(Nagdudumaan iti baeten dagiti pannakabalbaliw)',
+'history-title' => 'Panagbalbaliw a pakasaritaan iti "$1"',
+'difference-title' => 'Paggiddiatan a nagbaetan dagiti panagbalbaliw iti "$1"',
+'difference-title-multipage' => 'Paggiddiatan a nagbaetan dagiti panid  "$1" ken "$2"',
 'difference-multipage' => '(Paggiddiatan dagiti panid)',
 'lineno' => 'Linia $1:',
-'compareselectedversions' => 'Paggidiaten dagiti pinili a binaliwan',
+'compareselectedversions' => 'Ipada dagiti pinili a binaliwan',
 'showhideselectedversions' => 'Ipakita/ilemmeng dagiti napili a nabaliwan',
 'editundo' => 'ibabawi',
-'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|$1 dagiti agtennga a panangbalbaliw}} ni {{PLURAL:$2|agararamat|$2 dagidiay agararamat}} ti saan a naipakita)',
-'diff-multi-manyusers' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|$1 dagiti agtengnga a panangbalbaliw}} iti ad-adu nga $2 {{PLURAL:$2|agar-aramat|dagiti agar-aramat}} a saan a naipakita)',
+'diff-multi' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtennga a panangbalbaliw}} babaen {{PLURAL:$2|ti agararamat|dagiti $2 nga agararamat}} ti saan a naipakita)',
+'diff-multi-manyusers' => '({{PLURAL:$1|Maysa nga agtengnga a panangbalbaliw|Dagiti $1 nga agtengnga a panangbalbaliw}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} a saan a naipakita)',
 
 # Search results
 'searchresults' => 'Dagiti nagbanagan ti panagbiruk',
 'searchresults-title' => 'Dagiti nabirukan a nagbanagan ti "$1"',
 'searchresulttext' => 'Ti adu pay a pakaammo ti pinagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Nagbiruk ka  iti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|amin a panid aguna iti "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|amin a panid nga agsilpo iti "$1"]])',
-'searchsubtitleinvalid' => "Nagbiruk ka  iti '''$1'''",
-'toomanymatches' => 'Adu unay ti napasubli  nga agpapada, pangngaasim a padasen ti sabali a pinagsapul',
+'searchsubtitle' => 'Nagbiruk ka  para iti \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|amin a panid a mangrugi iti "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|amin a panid nga agsilpo iti "$1"]])',
+'searchsubtitleinvalid' => "Nagbiruk ka para  iti '''$1'''",
+'toomanymatches' => 'Adu unay ti napasubli  nga agpapada, pangngaasi a padasem ti sabali a panagsapul',
 'titlematches' => 'Dagiti kapadpada a titulo ti panid',
 'notitlematches' => 'Awan dagiti kapadpada a titulo ti panid',
 'textmatches' => 'Dagiti agpapada a testo ti panid',
 'notextmatches' => 'Awan dagiti kapadpada a teksto ti panid',
 'prevn' => 'napalabas {{PLURAL:$1|$1}}',
 'nextn' => 'sumaruno {{PLURAL:$1|$1}}',
-'prevn-title' => 'Napalabas $1 {{PLURAL:$1|a nagbanagan|dagiti nagbanagan}}',
-'nextn-title' => 'Sumaruno $1 {{PLURAL:$1|a nagbanagan|dagiti nagbanagan}}',
-'shown-title' => 'Ipakita $1 {{PLURAL:$1|a nagbanagan|dagiti nagbanagan}}  tunggal maysa a panid',
+'prevn-title' => 'Napalabas a $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}',
+'nextn-title' => 'Sumaruno a $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}',
+'shown-title' => 'Ipakita ti $1 {{PLURAL:$1|a nagbanagan|kadagiti nagbanagan}}  ti tunggal maysa a panid',
 'viewprevnext' => 'Kitaen ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Pagpilian ti panagbiruk',
-'searchmenu-exists' => "'''Adda nagan ti panid nga \"[[:\$1]]\" daytoy a wiki.'''",
-'searchmenu-new' => "'''Aramidem ti panid nga \"[[:\$1]]\" daytoy a wiki!'''",
+'searchmenu-exists' => "'''Adda panid a nanaganan ti \"[[:\$1]]\" iti daytoy a wiki.'''",
+'searchmenu-new' => "'''Partuaten ti panid ti \"[[:\$1]]\" iti daytoy a wiki!'''",
 'searchhelp-url' => 'Help:Dagiti linaon',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kitaem dagiti panid nga adda naipasaruno na a kastoy]]',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Kitaem dagiti panid nga adda kastoy a naipasaruno]]',
 'searchprofile-articles' => 'Dagiti naglaon a panid',
 'searchprofile-project' => 'Tulong ken Gandat a pam-panid',
 'searchprofile-images' => 'Sabsabali a midia',
 'searchprofile-everything' => 'Amin amin',
-'searchprofile-advanced' => 'Antenamo',
+'searchprofile-advanced' => 'Napasayaat',
 'searchprofile-articles-tooltip' => 'Agbiruk ka idiay $1',
 'searchprofile-project-tooltip' => 'Agbiruk ka idiay $1',
 'searchprofile-images-tooltip' => 'Agbiruk ka iti papeles',
 'searchprofile-everything-tooltip' => 'Birukem amin a linaon (uray dagiti makipatangan a panid)',
 'searchprofile-advanced-tooltip' => 'Agbiruk ka kadagiti naiduma a "nagan ti lugar"',
-'search-result-size' => '$1 ({{PLURAL:$2|1 a balikas|$2 dagiti balikas}})',
-'search-result-category-size' => '{{PLURAL:$1|1 kameng|$1 dagiti kameng}} ({{PLURAL:$2|1 apo ti kategoria|$2 dagiti apo ti kategoria}}, {{PLURAL:$3|1 papeles|$3 dagiti papeles}})',
+'search-result-size' => '$1 ({{PLURAL:$2|iti 1 a balikas|kadagiti $2 a balikas}})',
+'search-result-category-size' => '{{PLURAL:$1|1 a kameng| dagiti $1 a kameng}} ({{PLURAL:$2|1 nga apo ti kategoria|dagiti $2  nga apo ti kategoria}}, {{PLURAL:$3|1 a papeles|dagiti $3 a papeles}})',
 'search-result-score' => 'Kapategan: $1%',
 'search-redirect' => '(ibaw-ing ti $1)',
 'search-section' => '(paset $1)',
 'search-suggest' => 'Daytoy kadi: $1',
-'search-interwiki-caption' => 'Dagiti agkakabsat a gandat',
+'search-interwiki-caption' => 'Dagiti kakabsat a gandat',
 'search-interwiki-default' => '$1 dagiti nagbanagan:',
 'search-interwiki-more' => '(adu pay)',
 'search-mwsuggest-enabled' => 'addaan ti singasing',
@@ -1042,24 +1075,24 @@ Usaren ti radio a buton a tukol ti pinagtipon iti laeng pinagbaliw a naaramid id
 'searcheverything-enable' => 'Agbiruk ka kadagiti amin a nagan ti lugar',
 'searchrelated' => 'mainaig',
 'searchall' => 'amin',
-'showingresults' => "Maiparang iti baba ti agingga iti {{PLURAL:$1|'''1''' a nagbanagan|'''$1''' dagiti nagbanagan}} a mangrugi iti #'''$2'''.",
-'showingresultsnum' => "Makita iti baba ti {{PLURAL:$3|'''1''' a nagbanagan|'''$3''' dagiti nagbanagan}} a mangrugi iti #'''$2'''.",
-'showingresultsheader' => "{{PLURAL:$5|Nagbanagan '''$1''' of '''$3'''|Dagiti Nagbanagan '''$1 - $2''' of '''$3'''}} ti '''$4'''",
+'showingresults' => "Maiparang iti baba ti agingga {{PLURAL:$1|iti '''1''' a nagbanagan|dagiti '''$1''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+'showingresultsnum' => "Makita dita baba  {{PLURAL:$3|iti '''1''' a nagbanagan|dagiti '''$3''' a nagbanagan}} a mangrugi iti #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Nagbanagan a '''$1''' iti '''$3'''|Dagiti Nagbanagan a '''$1 - $2''' iti '''$3'''}} para iti '''$4'''",
 'nonefound' => "'''Palagip'': Adda laeng bassit dagita nagan ti lugar a masigud a biruken.
-Padasem a  pasarunuan ti pinagbiruk mo ti ''all:'' tapno birukem amin a nagyan (mairaman ti kapatangan a pampanid, dagiti plantilia, ken dadduma pay), wenno usarem nga ipasaruno ti kayatmo a nagan ti lugar.",
+Padasem a  pasarunuan ti panagbiruk mo ti ''all:'' tapno birukem amin a nagyan (mairaman ti kapatangan a pampanid, dagiti plantilia, ken dadduma pay), wenno usarem nga ipasaruno ti kayatmo a nagan ti lugar.",
 'search-nonefound' => 'Awan ti nagbanagan a kapadpada ti sinapul.',
 'powersearch' => 'Napasayat a panagbiruk',
 'powersearch-legend' => 'Napasayat a panagbiruk',
 'powersearch-ns' => 'Agbiruk ka kadagiti nagan ti lugar:',
-'powersearch-redir' => 'Ilista dagiti panagibaw-ing',
+'powersearch-redir' => 'Ilista dagiti baw-ing',
 'powersearch-field' => 'Biruken iti',
 'powersearch-togglelabel' => 'Markaan:',
 'powersearch-toggleall' => 'Amin',
 'powersearch-togglenone' => 'Awan',
 'search-external' => 'Akinruar a panagbiruk',
-'searchdisabled' => 'Ti pinagbiruk iti {{SITENAME}} ket nabaldado.
+'searchdisabled' => 'Ti panagbiruk iti {{SITENAME}} ket nabaldado.
 Mabalin mo ti agbiruk idiay Google tattan.
-Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
+Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 
 # Quickbar
 'qbsettings' => 'Quickbar',
@@ -1068,7 +1101,7 @@ Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
 'qbsettings-fixedright' => 'Agyan latta iti kanawan',
 'qbsettings-floatingleft' => 'Tumpaw ti kanigid',
 'qbsettings-floatingright' => 'Tumpaw ti kanawan',
-'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti pinagsurat mo ti pagsasaom.',
+'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti panagsurat ti pagsasaom',
 
 # Preferences page
 'preferences' => 'Kaykayatan',
@@ -1083,13 +1116,14 @@ Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
 'prefs-beta' => 'Dagiti beta a langa',
 'prefs-datetime' => 'Petsa ken oras',
 'prefs-labs' => 'Dagiti subokan a langa',
+'prefs-user-pages' => 'Dagiti panid ti agar-aramat',
 'prefs-personal' => 'Bariweswes ti agar-aramat',
-'prefs-rc' => 'Kaudian a balbaliw',
+'prefs-rc' => 'Kinaudi a binalbaliwan',
 'prefs-watchlist' => 'Listaan ti bambantayan',
-'prefs-watchlist-days' => 'Manu nga aldaw nga agparang iti listaan ti bambantayan:',
-'prefs-watchlist-days-max' => 'Pinakangato nga $1 {{PLURAL:$1|aldaw|al-aldaw}}',
-'prefs-watchlist-edits' => 'Pinakangato a bilang ti ipakita kadagiti sinukatan a napadakkel a bambantayan:',
-'prefs-watchlist-edits-max' => 'Pinakangato a bilang: 1000',
+'prefs-watchlist-days' => 'Manu nga aldaw nga agparang ti listaan iti bambantayan:',
+'prefs-watchlist-days-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
+'prefs-watchlist-edits' => 'Kaadu a bilang ti ipakita kadagiti sinukatan iti napadakkel a bambantayan:',
+'prefs-watchlist-edits-max' => 'Kaadu a bilang: 1000',
 'prefs-watchlist-token' => 'Tandaan ti bambantayan:',
 'prefs-misc' => 'Sabsabali',
 'prefs-resetpass' => 'Sukatan ti kontrasenias',
@@ -1098,7 +1132,7 @@ Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
 'prefs-email' => 'Pagpilian ti e-surat',
 'prefs-rendering' => 'Tabas',
 'saveprefs' => 'Idulin',
-'resetprefs' => 'Dalusan dagiti saan a naidulin a panamalbaliw',
+'resetprefs' => 'Dalusan dagiti saan a naidulin a sinuksukatan',
 'restoreprefs' => 'Isublim amin dagiti kinasigud a kasasaad',
 'prefs-editing' => 'Ururnosen',
 'prefs-edit-boxsize' => 'Kadakkel ti tawa ti panag-urnos.',
@@ -1108,20 +1142,20 @@ Laglagipem laeng a dagiti listaan da a nagyan ti {{SITENAME}} saan a barbaro.',
 'resultsperpage' => 'Nabirukan ti tunggal maysa a panid:',
 'stub-threshold' => 'Pangruggian ti <a href="#" class="stub">pungol a panilpo</a>pinagbukel (bytes):',
 'stub-threshold-disabled' => 'Nabaldado',
-'recentchangesdays' => 'Mano nga aldaw nga ipakita dagiti kaudian a balbaliw:',
-'recentchangesdays-max' => 'Pinakangato $1 {{PLURAL:$1\\aldaw|al-aldaw}}',
+'recentchangesdays' => 'Mano nga aldaw nga ipakita dagiti kinaudi a binalbaliwan:',
+'recentchangesdays-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'recentchangescount' => 'Dagiti bilang dagiti naurnos a kinasigud a maiparang:',
 'prefs-help-recentchangescount' => 'Nairaman dagiti kinaudian a baliwan, dagiti pakasaritaan ti panid, ken dagiti listaan.',
 'prefs-help-watchlist-token' => 'No ikkam daytoy pagikabilan ti sekreto a tulbek, agaramid ti pakan a RSS para ti binambantayam.
 No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpili ka ti kuwenta a seguridad.
 
-Adda ditoy ti pugto a kuwenta a mausar mo: $1',
+Adda ditoy ti pugto a kuwenta a mausarmo: $1',
 'savedprefs' => 'Naidulin dagitoy kaykayatmon.',
 'timezonelegend' => 'Sona ti oras:',
 'localtime' => 'Lokal nga oras:',
 'timezoneuseserverdefault' => 'Usaren ti wiki a kinasigud ($1)',
-'timezoneuseoffset' => 'Sabsabali (ibaga ti supli)',
-'timezoneoffset' => 'Supli¹:',
+'timezoneuseoffset' => 'Sabsabali (inaganan ti tangdan)',
+'timezoneoffset' => 'Tangda¹:',
 'servertime' => 'Oras ti server:',
 'guesstimezone' => 'Ikabil idiay pabasabasam',
 'timezoneregion-africa' => 'Aprika',
@@ -1143,25 +1177,25 @@ Adda ditoy ti pugto a kuwenta a mausar mo: $1',
 'prefs-custom-css' => 'Naiduma a CSS',
 'prefs-custom-js' => 'Naiduma a JavaScript',
 'prefs-common-css-js' => 'Bingay a CSS/JavaScript dagiti amin a kudil:',
-'prefs-reset-intro' => 'Mabalin mo nga usaren daytoy a panid tapno maisublim dagita kaykayat mo iti kinasigud daytoy a wiki.
+'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kaykayatmo iti kinasigud daytoy a wiki.
 Ngem saanto a mabalinen nga ipasubli.',
 'prefs-emailconfirm-label' => 'Pagsingkedan ti e-surat:',
-'prefs-textboxsize' => 'Ti kadakkel ti pamalbaliw a tawa',
+'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
 'youremail' => 'E-surat:',
 'username' => 'Nagan ti agar-aramat:',
 'uid' => 'ID ti agar-aramat:',
-'prefs-memberingroups' => 'Kameng {{PLURAL:$1| bunggoy| dagiti bunggoy}}:',
+'prefs-memberingroups' => 'Kameng iti {{PLURAL:$1|a bunggoy| a bungbunggoy}}:',
 'prefs-registration' => 'Oras a nagrehistro:',
 'yourrealname' => 'Pudno a nagan:',
 'yourlanguage' => 'Pagsasao:',
 'yourvariant' => 'Linaon ti sabali a pagsasao:',
-'prefs-help-variant' => 'Ti kaykayat mo a sabsabali a pinagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.',
+'prefs-help-variant' => 'Ti kaykayatmo a sabsabali a panagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.',
 'yournick' => 'Baro a pirma:',
 'prefs-help-signature' => 'Komentario kadagiti  pakipatangan a panid ket  mapirmaan koma iti "<nowiki>~~~~</nowiki>" nga agpabalin ti pirmam ken ti petsa.',
 'badsig' => 'Saan a pudno a kilaw a pirma.
 Ikur-it dagiti HTML nga etiketa.',
 'badsiglength' => 'Atiddog unay ti pirmam.
-Masapul a nababbaba ngem $1 {{PLURAL:$1| a kabalinan|dagiti kabalinan}} ti kaatiddog na.',
+Masapul a nababbaba ngem $1 {{PLURAL:$1| a karakter|kadagiti karakter}} ti kaatiddog na.',
 'yourgender' => 'Lalaki wenno Babai:',
 'gender-unknown' => 'Saan a naibagbaga',
 'gender-male' => 'Lalaki',
@@ -1172,14 +1206,14 @@ Daytoy a pakaammo ket makita ti publiko.',
 'prefs-help-realname' => 'Saan a nasken ti pudno a nagan.
 Ngem no kayatmo nga ited, maaramat daytoy a kas pammadayaw ken pangpatalged iti obram.',
 'prefs-help-email' => 'Ti e-surat a pagtaengan ket saan a masapul, ngem masapul no agsukat ka ti kontrasenias, no baka malipatam ti kontrasenias mo.',
-'prefs-help-email-others' => 'Mabalin mo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma e-suratandaka idiay panagsilpo ti panidmo wenno ti panid ti kapatangam.
+'prefs-help-email-others' => 'Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma e-suratandaka idiay panagsilpo ti panidmo wenno ti panid ti kapatangam.
 Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak kenka.',
 'prefs-help-email-required' => 'Masapul ti e-surat a pagtaengan.',
 'prefs-info' => 'Kangrunaan a pakaammuan',
 'prefs-i18n' => 'Internasionalisasion',
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Kita ti petsa',
-'prefs-timeoffset' => 'Supli ti oras',
+'prefs-timeoffset' => 'Tangda ti oras',
 'prefs-advancedediting' => 'Dagiti nangato a pagpilian',
 'prefs-advancedrc' => 'Dagiti nangato a pagpilian',
 'prefs-advancedrendering' => 'Dagiti nangato a pagpilian',
@@ -1209,7 +1243,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 * Ti saan a nakur-it a kahon ket kayatna a saoen nga awan ti agar-aramat dita a bunggoy.
 * A * ti kunana ket saan mo a maikkat ti bunggoy no nainayonmon, wenno pagbalittaden.',
 'userrights-reason' => 'Rason:',
-'userrights-no-interwiki' => 'Awananka iti pammalubos nga agbaliw ti karkarbengan ti agar-aramat kadagiti sabali a wiki.',
+'userrights-no-interwiki' => 'Awan ti pammalubosmo nga agbaliw ti karbengan ti agar-aramat kadagiti sabali a wiki.',
 'userrights-nodatabase' => 'Awan ti database a $1 wenno baka saan a lokal.',
 'userrights-nologin' => 'Masapul a [[Special:UserLogin|sumrekka]] nga adda pakabilangan nga administrador ti magted kadagiti karbengan ti agar-aramat.',
 'userrights-notallowed' => 'Awan ti pammalubos ti pakabilangam a mangted iti kakaberngan ti agar-aramat.',
@@ -1242,7 +1276,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 
 # Rights
 'right-read' => 'Basaen dagiti panid',
-'right-edit' => 'Urnosen dagiti pampanid',
+'right-edit' => 'Agurnos kadagiti pampanid',
 'right-createpage' => 'Agaramid kadagiti panid (saan a pagtutungtongan a pampanid)',
 'right-createtalk' => 'Agaramid ti pagtungtungan a pampanid',
 'right-createaccount' => 'Agaramid kadagiti baro a pakabilangan ti agar-aramat',
@@ -1260,14 +1294,14 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-purge' => 'Pasariwaam ti cache ti pagsaadan a ti panid ket awan ti pasingkedan na.',
 'right-autoconfirmed' => 'Urnosen dagiti nasalakniban-bassit a panid',
 'right-bot' => 'Matrato a kas automatiko a panagaramid',
-'right-nominornewtalk' => 'Nga awanan ti bassit a pinagurnos dagiti tungtungan a panid ti mangkalbit dagiti agpakabil ti baro a mensahe',
+'right-nominornewtalk' => 'Nga awanan ti bassit a panagurnos dagiti tungtungan a panid ti mangkalbit dagiti agpakabil ti baro a mensahe',
 'right-apihighlimits' => 'Agusar ti nangatngato a patingga kadagiti pinagsapul ti API.',
-'right-writeapi' => 'Pinagusar ti pagsurat ti API',
+'right-writeapi' => 'Panagusar ti panagsurat nga API',
 'right-delete' => 'Ikkaten dagiti panid',
-'right-bigdelete' => 'Ikkaten dagiti panid nga addaan ti dadakkel a pakasaritaan',
+'right-bigdelete' => 'Ikkaten dagiti panid nga adda dagiti dakkel a pakasaritaanna',
 'right-deleterevision' => 'Ikkaten ken ipasubli dagiti nainagan a pinagbaliwan ti panid',
 'right-deletedhistory' => 'Kitaen dagiti naikabil a pakasaritaan, nga awan kaniada kadagiti nairaman a testo',
-'right-deletedtext' => 'Kitaen dagiti naikkat a testo ken dagiti nasukatan a baet ti pinagbaliwan',
+'right-deletedtext' => 'Kitaen dagiti naikkat a testo ken dagiti nasukatan a nagbaetan dagiti binaliwan',
 'right-browsearchive' => 'Biruken dagiti naikkat a panid',
 'right-undelete' => 'Isubli ti naikkat a panid',
 'right-suppressrevision' => 'Kitaen ken ipasubli dagiti binaliwan a nailemmeng kadagiti administrador',
@@ -1277,7 +1311,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-hideuser' => 'Serraan ti maysa a nagan ti agar-aramat, ilemmeng manipud ti publiko',
 'right-ipblock-exempt' => 'Labsan dagiti IP a serra, dagiti automatiko a serra ken dagiti nasakup a serra.',
 'right-proxyunbannable' => 'Labsan dagiti automatiko a serra dagiti proxie',
-'right-unblockself' => 'Ikkaten ti panaka-serra da',
+'right-unblockself' => 'Ikkaten ti panaka-serra kaniada',
 'right-protect' => 'Sukatan dagiti lessaad ti salaknib ken dagiti panid a nasalakniban ti panag-urnos',
 'right-editprotected' => 'Urnosen dagiti nasalakniban a panid (nga awan ti sariap a salaknib")',
 'right-editinterface' => 'Urnosen ti "interface" ti agar-aramat',
@@ -1290,7 +1324,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'right-import' => 'Agala ti pampanid manipud kadagiti sabsabali a wiki',
 'right-importupload' => 'Agala kadagiti panid a naggapu iti papeles ti pinag-ipan',
 'right-patrol' => 'Markaan a kas napatruliaan dagiti inurnos ti dadduma',
-'right-autopatrol' => 'Dagiti inurnos mo ket mamarkaan nga automatiko a napatruliaan',
+'right-autopatrol' => 'Dagiti inurnosmo ket mamarkaan nga automatiko a kas napatruliaan',
 'right-patrolmarks' => 'Kitaen dagiti kinaudian a binaliwan a  napatruliaan a marka',
 'right-unwatchedpages' => 'Kitaen ti listaan dagiti saan a nabambantayan a panid',
 'right-mergehistory' => 'Pagtitiponen ti pakasaritaan dagiti panid',
@@ -1304,42 +1338,42 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 # User rights log
 'rightslog' => 'Listaan dagiti karbengan ti agar-aramat',
 'rightslogtext' => 'Listaan daytoy kadagiti sinukatan a karbengan ti agararamat.',
-'rightslogentry' => 'Nasukatan ti panagkameng iti bunggoy ti $1 manipud $2 iti $3',
+'rightslogentry' => 'sinukatan ti panagkameng iti bunggoy ti $1 manipud $2 iti $3',
 'rightslogentry-autopromote' => 'na automatiko a naipangato a naggapo iti $2 idiay $3',
 'rightsnone' => '(awan)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'basaem datoy a panid',
-'action-edit' => 'baliwam datoy a panid',
-'action-createpage' => 'Agaramid ka kadagiti panid',
+'action-edit' => 'agurnos iti datoy a panid',
+'action-createpage' => 'agpartuat kadagiti panid',
 'action-createtalk' => 'agaramid kadagiti pagtungtungan a panid',
-'action-createaccount' => 'Aramiden ti pakabilangan daytoy nga agar-aramat',
+'action-createaccount' => 'agpartuat ti pakabilangan daytoy nga agar-aramat',
 'action-minoredit' => 'markaam a bassit nga urnos daytoy',
-'action-move' => 'Iyalis daytoy a panid',
+'action-move' => 'iyalis daytoy a panid',
 'action-move-subpages' => 'iyalis daytoy a panid, ken dagiti apo na a panid',
 'action-move-rootuserpages' => 'iyalis dagiti ramut a panid ti agar-aramat',
-'action-movefile' => 'Iyalis daytoy a papeles',
+'action-movefile' => 'iyalis daytoy a papeles',
 'action-upload' => 'ipapan daytoy a papeles',
 'action-reupload' => 'suratam manen dagiti adda a papeles',
 'action-reupload-shared' => 'paawanen daytoy a papeles idiay pagbingayan a nagikabilan',
 'action-upload_by_url' => 'ipag-ipan daytoy a papeles a naggapu ti URL',
-'action-writeapi' => 'usaren ti pinagsurat ti API',
+'action-writeapi' => 'usaren ti panagsurat ti API',
 'action-delete' => 'ikkaten daytoy a panid',
 'action-deleterevision' => 'ikkaten daytoy a binaliwan',
 'action-deletedhistory' => 'kitaen dagiti naikkat a pakasaritaan daytoy a panid',
-'action-browsearchive' => 'Birukem dagiti naikkat a panid',
-'action-undelete' => 'isublim ti pinakaikkat daytoy a panid',
-'action-suppressrevision' => 'kitaen ken ipasubli daytoy nailemmeng a pinagbaliw',
+'action-browsearchive' => 'birukem dagiti naikkat a panid',
+'action-undelete' => 'isublim ti panakaikkat daytoy a panid',
+'action-suppressrevision' => 'kitaen ken ipasubli daytoy nailemmeng a panagbaliw',
 'action-suppressionlog' => 'kitaen ti listaan a pribado',
 'action-block' => 'serraan daytoy nga agar-aramat manipud ti panag-urnos',
 'action-protect' => 'sukatan dagiti lessaad ti salaknib iti daytoy a panid',
-'action-rollback' => 'pardasan nga ipasubli dagiti inurnos ti kinaudi nga agar-aramat a nagurnos ti kaskasta a panid',
+'action-rollback' => 'pardasan nga ipasubli dagiti inurnos ti kinaudi nga agar-aramat a nagurnos ti naisangsangayan a panid',
 'action-import' => 'agala ka ti panid iti sabali a wiki',
 'action-importupload' => 'alaem daytoy a panid idiay naipan a papeles',
-'action-patrol' => 'Markaan a kas napatruliaan dagiti inurnos ti dadduma',
+'action-patrol' => 'markaan a kas napatruliaan dagiti inurnos ti dadduma',
 'action-autopatrol' => 'markaam dagiti napatruliam nga inurnos',
 'action-unwatchedpages' => 'kitaen ti listaan dagiti saan a nabambantayan a panid',
-'action-mergehistory' => 'Pagtitiponen ti pakasaritaan daytoy a panid',
+'action-mergehistory' => 'pagtitiponen ti pakasaritaan daytoy a panid',
 'action-userrights' => 'urnosen amin dagiti karbengan ti agar-aramat',
 'action-userrights-interwiki' => 'urnosen dagiti karbengan ti agar-aramat iti agar-aramat kadagiti sabsabali a wiki',
 'action-siteadmin' => 'kandaduan wenno lukatan daytoy "database"',
@@ -1349,15 +1383,15 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'nchanges' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
 'recentchanges' => 'Kaudian a balbaliw',
 'recentchanges-legend' => 'Pagpilian kadagiti kaudian a balbaliw',
-'recentchangestext' => 'Bantayan daytoy a panid dagiti kaudian a panakabalbaliw ti wiki.',
-'recentchanges-feed-description' => 'Siputen dagiti kakaudian a panamalbaliw iti wiki iti daytoy a pakan.',
-'recentchanges-label-newpage' => 'Daytoy nga inurnos ket nakaaramid ti baro a panid',
-'recentchanges-label-minor' => 'Bassit a panag-urnos laeng daytoy',
-'recentchanges-label-bot' => 'Daytoy a panag-urnos ket inaramid ti bot',
-'recentchanges-label-unpatrolled' => 'Saan pay a napatrulian daytoy a panag-urnos',
+'recentchanges-summary' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a panid.',
+'recentchanges-feed-description' => 'Siputen dagiti kinaudi a panagbalbaliw ti wiki iti daytoy a pakan.',
+'recentchanges-label-newpage' => 'Daytoy a panag-urnos ket nakapartuat ti baro a panid',
+'recentchanges-label-minor' => 'Daytoy ket bassit a panag-urnos',
+'recentchanges-label-bot' => 'Daytoy a panag-urnos ket inaramid babaen ti maysa a bot',
+'recentchanges-label-unpatrolled' => 'Daytoy a panag-urnos ket saan pay a naptruliaan',
 'rcnote' => "Adda dita baba {{PLURAL:$1|ti '''1''' sinukatan|dagiti naudi '''$1''' a sinukatan}} iti naudi nga {{PLURAL:$2|aldaw|'''$2''' al-aldaw}}, sipud iti $5, $4.",
 'rcnotefrom' => "Makita dita baba dagiti sinukatan manipud idi '''$2''' (agingga iti '''$1''' ti naipakita).",
-'rclistfrom' => 'Ipakita dagiti kabarbaro a sinukatan mangrugi idi $1',
+'rclistfrom' => 'Ipakita dagiti kabarbaro a sinukatan a mangrugi manipud idi $1',
 'rcshowhideminor' => '$1 dagiti bassit a panag-urnos',
 'rcshowhidebots' => '$1 dagiti bots',
 'rcshowhideliu' => '$1 dagiti nakastrek nga agar-aramat',
@@ -1378,7 +1412,7 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} kalpasan ti panag-sukat',
 'newsectionsummary' => '/* $1 */ baro a paset',
 'rc-enhanced-expand' => 'Ipakita dagiti salaysay (masapul ti JavaScript)',
-'rc-enhanced-hide' => 'Illemmeng dagiti salaysay',
+'rc-enhanced-hide' => 'Ilemmeng dagiti salaysay',
 'rc-old-title' => 'kasisigud nga inaramid a kas ti "$1"',
 
 # Recent changes linked
@@ -1396,7 +1430,7 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
 'upload' => 'Mangipan iti papeles',
 'uploadbtn' => 'Mangipan iti papeles',
 'reuploaddesc' => 'Ukasen ti pag-ipan ken absubli idiay kabuklan ti pag-ipan',
-'upload-tryagain' => 'Ited ti napabaro a pinagipalawag ti papeles',
+'upload-tryagain' => 'Ited ti napabaro a panagipalawag ti papeles',
 'uploadnologin' => 'Saan a nakastrek',
 'uploadnologintext' => 'Masapul a [[Special:UserLogin|nakaserrekka]] tapno makaipanka iti papeles.',
 'upload_directory_missing' => 'Ti direktorio ti pag-ipan ($1) ket napukaw ken saan a mabalin nga aramiden iti webserver.',
@@ -1406,12 +1440,12 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
 
 Ti listaan ti panagikkat ken panagiyalis daytoy a panid ket adda ditoy tapno makitam:",
 'uploadtext' => "Usaren ti kabuklan dita baba ti pinag-ipan ti papeles.
-Ti panagkita wenno panagbiruk ti napalubos a pinag-ipan ti papeles mapan ka idiay [[Special:FileList|listaan dagiti napag-ipan a papeles]], dagiti pinag-ipan wenno pinag-ipan manen ket nakalista pay idiay [[Special:Log/upload|listaan ti pinag-ipan]], dagiti pinagikkat ket idiay [[Special:Log/delete|listaan ti pinagikkat]].
+Ti panagkita wenno panagbiruk ti napalubos a pinag-ipan ti papeles mapan ka idiay [[Special:FileList|listaan dagiti napag-ipan a papeles]], dagiti pinag-ipan wenno pinag-ipan manen ket nakalista pay idiay [[Special:Log/upload|listaan ti pinag-ipan]], dagiti panagikkat ket idiay [[Special:Log/delete|listaan ti panagikkat]].
 
 Ti panagikabil ti papeles iti panid, usaren ti panilpo a kas dagiti sumaganad a kabuklan:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' ti panag-usar ti dakkel a bersion ti papeles
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' ti agusar ti 200 pixel a kaakaba  a pinagparang iti kahon idiay kannigid nga adda 'sabali a testo' ti pinagipalpalawag
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ti dagus a panagsilpo idiay papeles nga awan ti pinagparang ti papeles",
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></tt>''' ti agusar ti 200 pixel a kaakaba  a panagparang iti kahon idiay kannigid nga adda 'sabali a testo' ti panagipalpalawag
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' ti dagus a panagsilpo idiay papeles nga awan ti panagparang ti papeles",
 'upload-permitted' => 'Dagiti mapalubosan a kita ti papeles: $1.',
 'upload-preferred' => 'Dagiti mabalbalin a kita ti papeles: $1.',
 'upload-prohibited' => 'Dagiti maiparit a kita ti papeles: $1.',
@@ -1437,56 +1471,56 @@ Pangngaasi ta naganan manen ti papeles ken padasen manen nga ipapan.',
 'filetype-badmime' => 'Dagiti papeles a kas MIME a kita "$1" ket saan a mapalubosan a maipan.',
 'filetype-bad-ie-mime' => 'Saan a makapag-ipan ti papeles ngamin ket masarakan ti Internet Explorer a kas "$1", a saan a mabalin ken makapataud a dakes a kita ti papeles.',
 'filetype-unwanted-type' => "'''\".\$1\"''' ti saan a mapalubusan a kita ti papeles.
-Mapalubusan a {{PLURAL:\$3|kita ti papeles ket|kadagiti kita ti papeles ket}} \$2.",
-'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|saan a mapalubusan a kita ti papeles|dagiti saan a mapalubusan a kita ti papeles}}.
-Mapalubusan a {{PLURAL:$3|kita ti papeles ket|dagiti kita ti papeles ket}} $2.',
+Ti mapalubusan  {{PLURAL:\$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} \$2.",
+'filetype-banned-type' => 'Ti \'\'\'".$1"\'\'\' {{PLURAL:$4|ket saan a mapalubusan a kita ti papeles|ket dagiti saan a mapalubusan a kita ti papeles}}.
+Ti mapalubusan{{PLURAL:$3|a kita ti papeles ket|kadagiti kita ti papeles ket}} $2.',
 'filetype-missing' => 'Daytoy a papeles ket awan ti kita na a (kasla ".jpg").',
 'empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
 'file-too-large' => 'Ti papeles nga intedmo ket dakkel unay.',
 'filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
 'filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
 'verification-error' => 'Daytoy a papeles ket saan a nakapasa ti pagsingkedan.',
-'hookaborted' => 'Ti pinagbabaro a pinadas mo ket napasardeng iti pangpa-atiddog a kawit.',
+'hookaborted' => 'Ti panagbabaro a pinadasmo ket napasardeng babaen ti pangpa-atiddog a kawit.',
 'illegal-filename' => 'Ti nagan daytoy a papeles ket saan a maipalubos.',
 'overwrite' => 'Saan a mabalin a suratan manen iti papeles nga adda ditan.',
 'unknown-error' => 'Adda di amammo a biddut.',
 'tmp-create-error' => 'Saan a makaaramid ti saan nga agnayon a papeles.',
-'tmp-write-error' => 'Biddut ti pinakasurat  dagiti saan nga agnayon a papeles.',
+'tmp-write-error' => 'Biddut ti panakaisurat  dagiti saan nga agnayon a papeles.',
 'large-file' => 'Ti maipatalked a papeles ket saan koma a dakdakkel ngem $1;
 daytoy a papeles ket $2.',
 'largefileserver' => 'Daytoy a papeles ket dakdakel ngem ti naaramid a mabalin para iti server.',
-'emptyfile' => 'Ti papeles nga impapan mo ket kasla awan ti nagyan na.
+'emptyfile' => 'Ti papeles nga ipanmo ket kasla awan ti nagyan na.
 Baka daytoy ket gapu ti kamali ti inkabil a nagan ti papeles.
 Pangngaasi ta kitaem no kayatmo latta nga ipapan daytoy a papeles.',
-'windows-nonascii-filename' => 'Daytoy a wiki ket saan na a tapayaen dagiti nagan ti papeles nga addaan ti kangrunaan a kababalin',
-'fileexists' => "Addaan ti nagan ti papeles a kastoy, pangngaasi ta kitaem '''<tt>[[:$1]]</tt>''' no saan ka a sigurado ti agpasukat.
+'windows-nonascii-filename' => 'Daytoy a wiki ket saanna a tapayaen dagiti nagan ti papeles nga adda ti kangrunaan a kababalin',
+'fileexists' => "Adda ti papeles nga agnagan ti kastoy, pangngaasi a kitaemti  '''<tt>[[:$1]]</tt>''' no saanka a sigurado a mangsukat.
 [[$1|thumb]]",
-'filepageexists' => "Ti pinagipalpalawag a panid ti daytoy a papeles ket naaramiden idiay '''<tt>[[:$1]]</tt>''', mgem awan ti papeles a kastoy ti addaan ti nagan na.
-Ti pakabuklan nga inkabil mo ket saan nga agparang idiay panid ti pinagipalpalawag.
+'filepageexists' => "Ti panangipalpalawag a panid ti daytoy a papeles ket naaramiden idiay '''<tt>[[:$1]]</tt>''', mgem awan ti agnagan ti katoy a papeles.
+Ti pakabuklan nga inkabilmo ket saan nga agparang idiay panid ti panangipalpalawag.
 Tapno ti pakabuklan ket agparang idiay, masapul  a baliwam idiay.
 [[$1|thumb]]",
-'fileexists-extension' => "Addaan ti papeles a kastoy ti nagan na: [[$2|thumb]]
+'fileexists-extension' => "Adda papeles nga agnagan ti kastoy: [[$2|thumb]]
 * Nagan ti naipapan a papeles: '''<tt>[[:$1]]</tt>'''
-* Nagan ti addaan a papeles: '''<tt>[[:$2]]</tt>'''
-Pangngaasi ka nga agpili ti sabali a nagan.",
+* Nagan ti adda a papeles: '''<tt>[[:$2]]</tt>'''
+Pangngaasi nga agpili ti sabali a nagan.",
 'fileexists-thumbnail-yes' => "Daytoy a papeles ket kasla imahen a napabassit ''(thumbnail)''.
 [[$1|thumb]]
-Pangngaasi ta kitaem ti papeles a '''<tt>[[:$1]]</tt>'''.
-No ti nakitam a papeles ket isu met laeng dayta dati a kadakkel, saan kan a mang-ipan iti sabali pay a napabassit nga imahen.",
+Pangngaasi a kitaem ti papeles a '''<tt>[[:$1]]</tt>'''.
+No ti nakitam a papeles ket isu met laeng dayta dati a kadakkel, saanka a mang-ipan iti sabali pay a napabassit nga imahen.",
 'file-thumbnail-no' => "Ti nagan ti papeles ket mangrugi ti '''<tt>$1</tt>'''.
 Kasla imahen a napabassit ''(thumbnail)''.
 No addaan ka ti dakkel a resolusion daytoy nga imahen ipag-ipan daytoy, no saan ket pangngaasi ta sukatam ti nagan ti papeles.",
-'fileexists-forbidden' => 'Daytoy a nagan ti papeles ket addaan dita, ken saan a mabalin a masuratan manen.
+'fileexists-forbidden' => 'Daytoy a nagan ti papeles ket adda dita, ken saan a mabalin a masuratan manen.
 No ket kayatmo latta nga agipan ti papeles, pangngaasi ta agsubli ka ken usarem ti baro a nagan.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'Daytoy a nagan ti papeles ket addaan dita pagbingayan a nagikabilan ti papeles.
+'fileexists-shared-forbidden' => 'Daytoy a nagan ti papeles ket adda dita pagbingayan a nagikabilan ti papeles.
 No ket kayatmo latta nga agipan ti papeles, pangngaasi ta agsubli ka ken usarem ti baro a nagan.
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'Daytoy a papeles ket duplikado kadagiti sumaganad a {{PLURAL:$1|papeles|dagiti papeles}}:',
-'file-deleted-duplicate' => 'Addaan ti papeles a kastoy ([[:$1]]) a naikkat idin.
-Kitaem kuma ti pakasaritaan a pinakaikkat ti papeles sakbay a mangirugi ka ti pinag-ipan.',
+'file-exists-duplicate' => 'Daytoy a papeles ket duplikado kadagiti sumaganad a {{PLURAL:$1|papeles|pappapeles}}:',
+'file-deleted-duplicate' => 'Ti papeles a kapadpada ti papeles a ([[:$1]]) ket naikkat idin.
+Kitaem kuma ti pakasaritaan a panakaikkat ti papeles sakbay a mangirugi ka ti pinag-ipan.',
 'uploadwarning' => 'Ballaag iti pinag-ipan',
-'uploadwarning-text' => 'Pangngaasi ta baliwam ti deskripsion ti papeles ken padasem manen.',
+'uploadwarning-text' => 'Pangngaasi a baliwam ti deskripsion ti papeles ken padasem manen.',
 'savefile' => 'Idulin ti papeles',
 'uploadedimage' => 'naipanen ti "[[$1]]"',
 'overwroteimage' => 'naipan ti baro a bersion ti "[[$1]]"',
@@ -1494,9 +1528,9 @@ Kitaem kuma ti pakasaritaan a pinakaikkat ti papeles sakbay a mangirugi ka ti pi
 'copyuploaddisabled' => 'Naiddep ti pinag-ipan iti URL.',
 'uploadfromurl-queued' => 'Dagiti pinag-ipan mo ket naikabil ti pinagurayan.',
 'uploaddisabledtext' => 'Napawilan ti pinag-ipan iti papeles.',
-'php-uploaddisabledtext' => 'Ti pag-ipan ti papeles ket naiddep idiay PHP.
-Panngaasi ta kitaem ti pannakaikabil ti pag-ipan ti papeles.',
-'uploadscripted' => 'Daytoy a papeles ket adda nagyan na a HTML wenno panagsurat a kodigo na baka agpakamali ti pinagbasa ti sapot a  pagbasabasa.',
+'php-uploaddisabledtext' => 'Ti pinag-ipan ti papeles ket naiddep idiay PHP.
+Panngaasi a kitaem ti pannakaikabil ti pinag-ipan ti papeles.',
+'uploadscripted' => 'Daytoy a papeles ket adda nagyan na a HTML wenno panagsurat a kodigo a mabalin nga agpakamali ti panagbasa ti sapot a  pagbasabasa.',
 'uploadvirus' => 'Addaan ti birus daytoy a papeles! Salaysay: $1',
 'uploadjava' => 'Daytoy a papeles ket ZIP a papeles nga adda nagyan na a Java .a kita ti papeles.
 Saan a mabalin ti pinag-ipan ti Java a papeles, ngamin ket palabsan da dagiti seguridad a pangrestrikto.',
@@ -1504,8 +1538,8 @@ Saan a mabalin ti pinag-ipan ti Java a papeles, ngamin ket palabsan da dagiti se
 'sourcefilename' => 'Taudan a nagan ti papeles:',
 'sourceurl' => 'Taudan ti URL:',
 'destfilename' => 'Pangipanan ti nagan ti papeles:',
-'upload-maxfilesize' => 'Pinakangato ti kadakkel ti papeles: $1',
-'upload-description' => 'Pinagipalpalawag ti papeles',
+'upload-maxfilesize' => 'Kadakkel a rukod ti papeles: $1',
+'upload-description' => 'Panagipalpalawag ti papeles',
 'upload-options' => 'Pagpilian ti pinag-ipan',
 'watchthisupload' => 'Bantayan daytoy a papeles',
 'filewasdeleted' => 'Ti papeles a nanaganan ti kastoy ket naipapan idin ken napaikkaten.
@@ -1528,10 +1562,10 @@ $1',
 Pangngaasi a kontaken ti [[Special:ListUsers/sysop|administrador]]',
 'upload-misc-error' => 'Di ammo a biddut ti panag-ipan',
 'upload-misc-error-text' => 'Adda saan nga ammo a biddut ti napasamak idi agdama a nag-ipan.
-Pangngaasinga a  kitaen ti URL ket umisu  ken maserrekan ken padasem manen.
+Pangngaasi a  kitaen ti URL ket umisu  ken maserrekan ken padasem manen.
 No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administrador]].',
 'upload-too-many-redirects' => 'Adu unay ti baw-ing daytoy nga URL',
-'upload-unknown-size' => 'Di ammo ti kadakkel na',
+'upload-unknown-size' => 'Di amammo ti kadakkelna',
 'upload-http-error' => 'Naka-adda ti biddut ti HTTP: $1',
 'upload-copy-upload-invalid-domain' => 'Ti kopia a panagipan ket saan a magun-od manipud iti daytoy a pagturayan.',
 
@@ -1539,11 +1573,11 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-stream' => 'Saan a maiwaig ti papeles $1.',
 'backend-fail-backup' => 'Saan a maidulin ti papeles $1.',
 'backend-fail-notexists' => 'Ti papeles a $1 ket awanen.',
-'backend-fail-hashes' => 'Saana maala dagiti papeles a hash tapno maipada.',
+'backend-fail-hashes' => 'Saan a maala dagiti papeles a hash tapno maipada.',
 'backend-fail-notsame' => 'Addaan ti saan a kapada tipapeles idiay $1.',
 'backend-fail-invalidpath' => '$1 ket imbalido a pagnaan ti pagidulinan.',
 'backend-fail-delete' => 'Saan a maikkat ti papeles $1.',
-'backend-fail-alreadyexists' => 'Ti papeles $1 ket aaddanen.',
+'backend-fail-alreadyexists' => 'Ti papeles $1 ket addan.',
 'backend-fail-store' => 'Saan a maidulin ti papeles $1 idiay $2.',
 'backend-fail-copy' => 'Saan a makopia ti papeles $1 idiay $2.',
 'backend-fail-move' => 'Saan a maiyalis ti papeles $1 idiay $2.',
@@ -1551,13 +1585,14 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-writetemp' => 'Saan a masuratan ti temporario a papeles.',
 'backend-fail-closetemp' => 'Saan a marikpan ti temporario a papeles.',
 'backend-fail-read' => 'Saan a mabasa ti papeles $1.',
-'backend-fail-create' => 'Saan a maaramid ti papeles $1.',
-'backend-fail-maxsize' => 'Saan a naaramid ti papeles $1 gapu ket dakdakkel ngem {{PLURAL:$2|maysa a byte|$2 a dagiti bytes}}.',
+'backend-fail-create' => 'Saan a masuratan ti papeles $1.',
+'backend-fail-maxsize' => 'Saan a masuratan ti papeles $1 gapu ta dakdakkel ngem {{PLURAL:$2|maysa a byte|dagiti $2 a bytes}}.',
 'backend-fail-readonly' => 'Ti pagidulinan a kalikudan ti "$1" ket agdama a mabasa laeng. Ti rason a naited idi ket: "$2"',
 'backend-fail-synced' => 'Ti papeles "$1" ket bangking ti kasasaad na  iti kinauneg a pagidulinan ti kalikudan',
 'backend-fail-connect' => 'Saan a makaikapet idiay pagidulinan a kalikudan  "$1".',
 'backend-fail-internal' => 'Adda di amammo a biddut ti napasamak idiay pagidulinan a kalikudan "$1".',
 'backend-fail-contenttype' => 'Saan a maammoan ti kita ti linaon ti papeles nga idulin idiay "$1".',
+'backend-fail-usable' => 'Saan a masuratan ti papeles $1 gapu ta awan ti makaanay a pammalubos wenno awan dagiti direktorio/pangikabilan.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Saan a malukatan ti "$1"; saan a nakandaduan.',
@@ -1583,8 +1618,8 @@ Saan a matutup ti pinagkita ti seguridad na.',
 'uploadstash-summary' => 'Daytoy a panid ket mangted ti panagserrek ti papeles a napag-ipan (wenno nairugi nga ipan) ngem saan pay na naipablaak dita wiki. Dagitoy a papeles ket saan a makita ti sabsabali ngem laeng ti agar-aramat a nag-ipan kaniada.',
 'uploadstash-clear' => 'Dalusan dagiti na stash a papeles',
 'uploadstash-nofiles' => 'Awan ti na stash a papeles mo.',
-'uploadstash-badtoken' => 'Ti pinag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talek mo ti panag-urnos ket nagpaso. Padasem manen.',
-'uploadstash-errclear' => 'Ti pinagdalus kadagiti papeles ket napaay.',
+'uploadstash-badtoken' => 'Ti panag-tungpal dayta nga aramid ket napaay, ngamin ta dagiti talek mo ti panag-urnos ket nagpaso. Padasem manen.',
+'uploadstash-errclear' => 'Ti panagdalus kadagiti papeles ket napaay.',
 'uploadstash-refresh' => 'Pasadiwaam dagiti listaan ti papeles',
 'invalid-chunk-offset' => 'Imbalido ti maysa a supli',
 
@@ -1597,10 +1632,10 @@ Kitaen ti https://www.mediawiki.org/wiki/Manual:Image_Authorization .',
 'img-auth-badtitle' => 'Saan a makaaramid ti umisu a titulo a naggapu idiay "$1".',
 'img-auth-nologinnWL' => 'Saan ka a nakastrek ken ti "$1" ket awan idiay mabalin a listaan.',
 'img-auth-nofile' => 'Ti papeles "$1" ket awan dita.',
-'img-auth-isdir' => 'Agserserrek ka ti direktorio ti papeles "$1".
+'img-auth-isdir' => 'Agserserrekka ti direktorio ti papeles "$1".
 Ti iseserrek ti papeles ti mabalin laeng.',
 'img-auth-streaming' => 'Agwaig "$1".',
-'img-auth-public' => 'Ti opisio ti img_auth.php ket mangiruar kadagiti papeles manipud ti pribado a wiki.
+'img-auth-public' => 'Ti pamay-an ti img_auth.php ket mangiruar kadagiti papeles manipud ti pribado a wiki.
 Daytoy a wiki naipabalin a kas publiko a wiki.
 Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'img-auth-noread' => 'Ti agar-aramat ket awan ti pammalubos na nga agbasa "$1".',
@@ -1664,14 +1699,14 @@ No sagaten ti agar-aramat, dagiti laeng papeles a pinag-ipan ti agar-aramat ti k
 'filehist-comment' => 'Komentario',
 'filehist-missing' => 'Mapukpukaw ti papeles',
 'imagelinks' => 'Panagusar iti daytoy a papeles',
-'linkstoimage' => 'Ti sumaganad {{PLURAL:$1|a silpo ti panid|$1 a dagiti silpo ti panid}} ditoy a papeles:',
-'linkstoimage-more' => 'Adadu a $1 {{PLURAL:$1|paninillpo ti panid|panilpo ti pampanid}} ditoy a papeles.
-Dagiti sumaganad a listaan ket ipakita na ti {{PLURAL:$1|umona a panilpo ti panid|umuna a $1 paninilpo ti panid}} ditoy a papeles laeng.
+'linkstoimage' => 'Ti sumaganad {{PLURAL:$1|a silpo ti panid|kadagiti $1 a silpo ti panid}} ditoy a papeles:',
+'linkstoimage-more' => 'Adadu ngem $1 {{PLURAL:$1|a paninillpo ti panid|kadagiti panilpo ti pampanid}} ditoy a papeles.
+Ti sumaganad a listaan ket ipakita na {{PLURAL:$1|ti umona a panilpo ti panid|dagiti umuna a $1 panilpo ti panid}} ditoy a papeles laeng.
 Ti [[Special:WhatLinksHere/$2|kompleto a listaan]] ket addaan.',
 'nolinkstoimage' => 'Awan ti pampanid a nakasilpo iti daytoy a papeles.',
 'morelinkstoimage' => 'Kitaen ti [[Special:WhatLinksHere/$1|ad-adu pay a panilpo]] iti daytoy a papeles.',
 'linkstoimage-redirect' => '$1 (baw-ing ti papeles) $2',
-'duplicatesoffile' => 'Ti sumaganad a {{PLURAL:$1|papeles ket duplikado|$1 kadagiti papeles ket duplikado}} daytoy a papeles ([[Special:FileDuplicateSearch/$2|adu pay a salaysay]]):',
+'duplicatesoffile' => 'Ti sumaganad a {{PLURAL:$1|papeles ket duplikado|kadagiti $1 papeles ket duplikado}} daytoy a papeles ([[Special:FileDuplicateSearch/$2|adu pay a salaysay]]):',
 'sharedupload' => 'Daytoy a papeles ket naggapu idiay $1 ken mabalin a mausar kadagiti sabsabali a gandat.',
 'sharedupload-desc-there' => 'Daytoy a papeles ket naggapu idiay $1 ken mabalin a mausar kadagiti sabsabali a gandat.
 Pangngaasim a kitaem ti [$2 pagipalpalawag ti panid] ti adu pay a pakaammo.',
@@ -1690,28 +1725,28 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 # File reversion
 'filerevert' => 'Isubli ti $1',
 'filerevert-legend' => 'Isubli ti papeles',
-'filerevert-intro' => "Mangmangrugi ka ti agpasubli ti papeles '''[[Media:$1|$1]]''' iti [$4 bersion ti oras ket petsa nga $3, $2].",
+'filerevert-intro' => "Mangrugrugika nga agipasubli ti papeles '''[[Media:$1|$1]]''' iti [$4 bersion ti oras ket petsa nga $3, $2].",
 'filerevert-comment' => 'Rason:',
-'filerevert-defaultcomment' => 'Naisubli ti bersion sipud iti $2, $1',
+'filerevert-defaultcomment' => 'Naisubli ti bersion manipud idi $2, $1',
 'filerevert-submit' => 'Isubli',
-'filerevert-success' => "'''[[Media:$1|$1]]''' ket naipasubli idiay [$4 bersion ti oras ken petsa $3, $2].",
+'filerevert-success' => "Ti '''[[Media:$1|$1]]''' ket naipasubli idiay [$4 bersion ti oras ken petsa $3, $2].",
 'filerevert-badversion' => 'Awan ti napalubos a lokal a bersion daytoy a papeles nga adda naikkan dayta nga oras ken petsa.',
 
 # File deletion
 'filedelete' => 'Ikkaten ti $1',
 'filedelete-legend' => 'ikkaten ti papeles',
-'filedelete-intro' => "Makarugi ka ti agikkat ti '''[[Media:$1|$1]]''' ken dagiti amin a pakasaritaan na.",
-'filedelete-intro-old' => "Ikikatem ti bersion daytoy '''[[Media:$1|$1]]''' nangrugi idi [$4 $3, $2].",
+'filedelete-intro' => "Mangrugrugika nga agikkat ti '''[[Media:$1|$1]]''' ken mairaman amin a pakasaritaanna.",
+'filedelete-intro-old' => "Ikikatem ti bersion iti '''[[Media:$1|$1]]''' manipud idi [$4 $3, $2].",
 'filedelete-comment' => 'Rason:',
 'filedelete-submit' => 'Ikkaten',
 'filedelete-success' => "Naikkaten ti '''$1'''.",
-'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' nakarugi idi $3, $2 ket naikkaten.",
+'filedelete-success-old' => "Ti bersion iti '''[[Media:$1|$1]]''' manipud idi $3, $2 ket naikkaten.",
 'filedelete-nofile' => "awan ti '''$1''' .",
 'filedelete-nofile-old' => "Awan ti nailebbeng a bersion ti '''$1''' nga addaan ti naited a kakitkita na.",
 'filedelete-otherreason' => 'Sabali/nayon a rason:',
 'filedelete-reason-otherlist' => 'Sabali a rason',
 'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
-** Panagsalungasing iti karbengan ti pianagtulad
+** Panagsalungasing iti karbengan ti panagkopia
 ** Nadoble a papeles',
 'filedelete-edit-reasonlist' => 'Unosen ti rason ti panagikkat',
 'filedelete-maintenance' => 'Saan nga agnayon a naibaldado ti pinagikkat ken pinagisubli dagiti papeles iti dagdama a pinagsimpa.',
@@ -1728,13 +1763,13 @@ Ikabil: kita ti nagyan/apo a kita, e.g. <tt>image/jpeg</tt>.',
 'unwatchedpages' => 'Di mabambantayan a pampanid',
 
 # List redirects
-'listredirects' => 'Listaan dagiti panangibaw-ing',
+'listredirects' => 'Listaan dagiti baw-ing',
 
 # Unused templates
 'unusedtemplates' => 'Dagiti saan a nausar a plantilia',
-'unusedtemplatestext' => 'Daytoy a panid ket ilista na dagiti panid idiay {{ns:template}} a nagan ti lugar a saan a nairaman iti sabali a panid.
-Palagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkatem ida.',
-'unusedtemplateswlh' => 'sabali pay a panpanilpo',
+'unusedtemplatestext' => 'Daytoy a panid ket ilistana dagiti panid idiay {{ns:template}} a nagan ti lugar a saan a nairaman iti sabali a panid.
+Laglagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkatem ida.',
+'unusedtemplateswlh' => 'dagiti sabali pay a panilpo',
 
 # Random page
 'randompage' => 'Pugto a panid',
@@ -1742,7 +1777,7 @@ Palagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkatem
 
 # Random redirect
 'randomredirect' => 'Pugto a baw-ing',
-'randomredirect-nopages' => 'Awan ti bawbaw-ing iti daytoy a nagan ti lugar "$1".',
+'randomredirect-nopages' => 'Awan dagiti baw-ing iti daytoy a nagan ti lugar "$1".',
 
 # Statistics
 'statistics' => 'Estadistika',
@@ -1753,13 +1788,13 @@ Palagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkatem
 'statistics-header-hooks' => 'Estadistika a sabsabali',
 'statistics-articles' => 'Dagiti naglaon a panid',
 'statistics-pages' => 'Pampanid',
-'statistics-pages-desc' => 'Dagiti panid ti wiki, nairaman dagitoy kapatangan a panid, dagitoy baw-ing, ken dadduma pay',
+'statistics-pages-desc' => 'Dagiti amin a panid ti wiki, a mairaman dagiti tungtungan a panid, dagiti baw-ing, ken dadduma pay',
 'statistics-files' => 'Ti naipapan a papeles',
 'statistics-edits' => 'Dagit naurnos a panid manipud idi nairugi ti {{SITENAME}}',
-'statistics-edits-average' => 'Napipia nga urnos tungal maysa a panid',
+'statistics-edits-average' => 'Pagtengngaan nga urnos tungal maysa a panid',
 'statistics-views-total' => 'Dagiti dagup ti panagkita',
-'statistics-views-total-desc' => 'Saan a naikabil ti pagkita dagiti awan a panid ken dagiti espesial a panid',
-'statistics-views-peredit' => 'Mano a pagkita tunggal ti maysa nga urnos',
+'statistics-views-total-desc' => 'Saan a naikabil ti panagkita dagiti awan a panid ken dagiti espesial a panid',
+'statistics-views-peredit' => 'Mano a panagkita tunggal maysa nga urnos',
 'statistics-users' => 'Dagiti nakarehistro nga [[Special:ListUsers|agar-aramat]]',
 'statistics-users-active' => 'Dagiti nasiglat nga agar-aramat',
 'statistics-users-active-desc' => 'Dagiti agar-aramat a nagtungpal iti aramid idi napalubos nga {{PLURAL:$1|aldaw|$1 al-aldaw}}',
@@ -1771,36 +1806,36 @@ Palagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkatem
 Ngem agpasilpo da kuma ti husto a topiko.<br />
 Ti panid ket matrato a kas panangilawlawag a panid no agusar ti plantilia a nakasilpo idiay [[MediaWiki:Disambiguationspage]]",
 
-'doubleredirects' => 'Dagiti naminduan a panangbaw-ing',
-'doubleredirectstext' => 'Daytoy a panid ket ilista na dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
-Iti maysanga aray ket adda nagyan na kadagiti panilpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti "pudno" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudo na.
+'doubleredirects' => 'Dagiti namindua a naibaw-ing',
+'doubleredirectstext' => 'Daytoy a panid ket ilistana dagiti panid nga agbaw-ing kadagiti sabsabali a baw-ing a pampanid.
+Iti tunggal maysa nga aray ket adda nagyanna kadagiti panilpo iti umuna ken maikadua a baw-ing, ken iti puntaan iti maikadua a baw-ing, nga isu ti "pudno" a puntaan ti panid, nga ti umuna a baw-ing ket isu ti ipatudona.
 <del>Nakurosan</del> dagita naikabil ket napadtuan.',
 'double-redirect-fixed-move' => 'Ti [[$1]] ket naiyalisen.
 Tattan ket naibaw-ing idiay [[$2]].',
 'double-redirect-fixed-maintenance' => 'Simsimpaen dagiti namindua a naibaw-ing a naggapo idiay [[$1]] nga ipan idiay [[$2]].',
-'double-redirect-fixer' => 'Pagsimpa ti baw-ing',
+'double-redirect-fixer' => 'Panagsimpa ti baw-ing',
 
-'brokenredirects' => 'Dagiti naputed a panangbaw-ing',
+'brokenredirects' => 'Dagiti naputed a baw-ing',
 'brokenredirectstext' => 'Dagitoy sumaganad a baw-ing ket napasilpo kadagiti awan a panid:',
 'brokenredirects-edit' => 'urnosen',
 'brokenredirects-delete' => 'ikkaten',
 
-'withoutinterwiki' => 'Dagiti panid nga awanan ti panilpo a pagsasao',
+'withoutinterwiki' => 'Dagiti panid nga awan ti silpona ti pagsasao',
 'withoutinterwiki-summary' => 'Dagitoy a pampanid ket saan a nakasilpo ti sabali a bersion ti pagsasao.',
 'withoutinterwiki-legend' => 'Pagpasaruno',
 'withoutinterwiki-submit' => 'Ipakita',
 
-'fewestrevisions' => 'Dagiti panid nga addaan ti kababassitan a panangbalbaliw',
+'fewestrevisions' => 'Dagiti panid nga adda kadagiti kabassitan a panangbalbaliw',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|a byte|a bytes}}',
-'ncategories' => '$1 {{PLURAL:$1|kategoria|dagiti kategoria}}',
-'nlinks' => '$1 {{PLURAL:$1|panilpo|pampanilpo}}',
-'nmembers' => '$1 {{PLURAL:$1|kameng|kamkameng}}',
-'nrevisions' => '$1 {{PLURAL:$1|a pinagbaliwan|dagiti pinagbaliwan}}',
-'nviews' => '$1 {{PLURAL:$1|a panangkita|dagiti panangkita}}',
-'nimagelinks' => 'Inusar idiay $1 {{PLURAL:$1|panid|pampanid}}',
-'ntransclusions' => 'inusar idiay $1 {{PLURAL:$1|panid|pampanid}}',
+'nbytes' => '$1 {{PLURAL:$1|a byte|kadagiti byte}}',
+'ncategories' => '$1 {{PLURAL:$1|a kategoria|kadagiti kategoria}}',
+'nlinks' => '$1 {{PLURAL:$1|a panilpo|kadagiti panilpo}}',
+'nmembers' => '$1 {{PLURAL:$1|a kameng|kadagiti kameng}}',
+'nrevisions' => '$1 {{PLURAL:$1|a panagbalbaliw|kadagiti panagbalbaliw}}',
+'nviews' => '$1 {{PLURAL:$1|a panangkita|kadagiti panangkita}}',
+'nimagelinks' => 'Inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}',
+'ntransclusions' => 'inusar idiay $1 {{PLURAL:$1|a panid|a pampanid}}',
 'specialpage-empty' => 'Awan dagiti nagbanagan na daytoy a padamag.',
 'lonelypages' => 'Dagiti naulila a panid',
 'lonelypagestext' => 'Dagiti sumaganad a panid ket saan a nakasilpo idiay wenno naipakita kadagiti sabali a panid idiay {{SITENAME}}.',
@@ -1810,7 +1845,7 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'uncategorizedtemplates' => 'Dagiti saan a nakategoria a plantilia',
 'unusedcategories' => 'Dagiti saan a nausar a kategoria',
 'unusedimages' => 'Dagiti saan a nausar a papeles',
-'popularpages' => 'Dagiti nalatak a panid',
+'popularpages' => 'Dagiti nadayeg a panid',
 'wantedcategories' => 'Dagiti makidkiddaw a kategoria',
 'wantedpages' => 'Dagiti makidkiddaw a panid',
 'wantedpages-badtitle' => 'Saan nga umisu a titulo idiay naikabil a pagbanagan: $1',
@@ -1839,26 +1874,26 @@ Tattan ket naibaw-ing idiay [[$2]].',
 'protectedtitlestext' => 'Dagitoy a titulo ket nasalakniban ti panakaaramid',
 'protectedtitlesempty' => 'Awan dagiti titulo a madama a nasalakniban iti dagitoy a parametro.',
 'listusers' => 'Listaan dagiti agar-aramat',
-'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnos na',
+'listusers-editsonly' => 'Ipakita laeng dagiti agar-aramat nga adda inurnosda',
 'listusers-creationsort' => 'Ilasin no ania a petsa ti panakaaramid',
-'usereditcount' => '$1 {{PLURAL:$1|inurnos|dagiti inurnos}}',
+'usereditcount' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}}',
 'usercreated' => '{{GENDER:$3|Inaramid}} idi $1 ti oras nga $2',
 'newpages' => 'Baro a pampanid',
 'newpages-username' => 'Nagan ti agar-aramat:',
 'ancientpages' => 'Dagiti kadaanan a panid',
 'move' => 'Iyalis',
 'movethispage' => 'Iyalis daytoy a panid',
-'unusedimagestext' => 'Dagiti sumaganad a papeles ket addaan ngem saanda a naikabil iti ania man a panid.
-Pangngaasi a laglagipen a dagiti sabali a pagsaadan ti apot ket makapanilpo ti papeles iti dagus a URL, ken isu pay a nailista da ditoy uray no saan da a naus-usar iti agdama.',
+'unusedimagestext' => 'Adda dagiti sumaganad a papeles ngem saanda a naikabil iti ania man a panid.
+Pangngaasi a laglagipen a dagiti sabali a sapot ti pagsaadan  ket makasilpoda ti papeles iti dagus a URL, ken isu pay a nailista da ditoy uray no saan da a naus-usar iti agdama.',
 'unusedcategoriestext' => 'Adda dagiti sumaganad a kategoria a panid, ngem awan ti sabali a panid wenno kategoria ti agus-usar kaniada.',
 'notargettitle' => 'Awan ti napuntaan',
-'notargettext' => 'Saan mo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal daytoy nga opisio.',
+'notargettext' => 'Saanmo a nainagan ti puntaan a panid wenno agar-aramat ti mangtungpal daytoy nga opisio.',
 'nopagetitle' => 'Awan ti kasta a puntaan a panid',
 'nopagetext' => 'Awan ti puntaan a panid a nainaganam.',
 'pager-newer-n' => '{{PLURAL:$1|nabarbaro 1|dagiti nabarbaro $1}}',
 'pager-older-n' => '{{PLURAL:$1|nadadaan 1|nadadaan $1}}',
 'suppress' => 'Pakapansin',
-'querypage-disabled' => 'Daytoy a nangruna a panid ket nabaldado gapu kadagiti rason a pinagtungpal.',
+'querypage-disabled' => 'Daytoy a nangruna a panid ket nabaldado gapu kadagiti rason a panagtungpal.',
 
 # Book sources
 'booksources' => 'Nagtaudan ti liblibro',
@@ -1876,6 +1911,7 @@ Pangngaasi a laglagipen a dagiti sabali a pagsaadan ti apot ket makapanilpo ti p
 Mapabassit mo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti gar-aramat (sensitibo ti kadakkel ti letra), wenno ti naapektaran a panid (ket sensitibo met ti kadakkel ti letra).',
 'logempty' => 'Awan ti agpada a bagay dita listaan.',
 'log-title-wildcard' => 'Agsapul kadagiti titulo nga agrugi iti daytoy a testo',
+'showhideselectedlogentries' => 'Ipakita/ilemmeng dagiti napili a naikabil ti listaan',
 
 # Special:AllPages
 'allpages' => 'Amin a panid',
@@ -1895,18 +1931,23 @@ Mapabassit mo ti pinagpakita no piliam ti kita ti listaan, ti nagan ti gar-arama
 'allpages-bad-ns' => 'Awan ti {{SITENAME}} iti nagan ti lugar a "$1".',
 'allpages-hide-redirects' => 'Ilemmeng dagiti baw-ing',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Kitkitaem ti naidulin a bersion iti daytoy a panid, nga addan ti kadaanan a $1.',
+'cachedspecial-viewing-cached-ts' => 'Kitkitaem ti maysa a naidulin a bersion iti daytoy a panid, a baka daytoy ket saan a kompleto nga agpayso.',
+'cachedspecial-refresh-now' => 'Kitaen ti kinaudian.',
+
 # Special:Categories
 'categories' => 'Dagiti kategoria',
-'categoriespagetext' => 'Dagiti sumaganad a {{PLURAL:$1|nagyan ti kategoria|dagiti nagyan ti kategoria}} pampanid wenno midia.
-[[Special:UnusedCategories|Saan nga nausar nga kategoria]] ket saan nga maiparang ditoy.
-Kitaen met ti [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
+'categoriespagetext' => 'Ti sumaganad a {{PLURAL:$1|kategoria ket aglaon|katkategoria ket aglaon}} kadagiti panid wenno midia.
+[[Special:UnusedCategories|Dagiti saan a nausar a kategoria]] ket saan a maiparang ditoy.
+Kitaen met [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
 'categoriesfrom' => 'Ipakita dagiti kategoria a mangrugi iti:',
 'special-categories-sort-count' => 'paglalasinen babaen ti bilang',
 'special-categories-sort-abc' => 'paglalasinen a pang-abesedario',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Dagiti naikkat nga inararamid ti agar-aramat',
-'deletedcontributions-title' => 'Dagiti naikkat nga inararamid iti agar-aramat',
+'deletedcontributions-title' => 'Dagiti naikkat nga inararamid ti agar-aramat',
 'sp-deletedcontributions-contribs' => 'dagiti parawad',
 
 # Special:LinkSearch
@@ -1916,8 +1957,8 @@ Kitaen met ti [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
 'linksearch-ok' => 'Biruken',
 'linksearch-text' => 'Ti naataap a tarheta a kas "*.wikipedia.org" ket mabalin nga usaren.
 Masapul ti kangatuan a pagturayan, a kaspagarigan "*.org".<br />
-Natapayaen a protokol: <tt>$1</tt> (saan mo nga inayun dagitoy iti panagbiruk mo) .',
-'linksearch-line' => '$1 ket nakasilpo idiay $2',
+Natapayaen a protokol: <tt>$1</tt> (saanmo nga inayon dagitoy iti panagbirukmo) .',
+'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
 'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
 
 # Special:ListUsers
@@ -1928,9 +1969,9 @@ Natapayaen a protokol: <tt>$1</tt> (saan mo nga inayun dagitoy iti panagbiruk mo
 
 # Special:ActiveUsers
 'activeusers' => 'Listaan dagiti nasiglat nga agar-aramat',
-'activeusers-intro' => 'Daytoy ti listaan dagiti agar-aramat nga adda inararamidda idi napalabas $1 {{PLURAL:$1|nga aldaw|nga dagiti aldaw}}.',
-'activeusers-count' => '$1 {{PLURAL:$1|inurnos|dagiti inurnos}} idi kalpasan {{PLURAL:$3|nga aldaw|$3 dagiti aldaw}}',
-'activeusers-from' => 'Iparang dagiti agar-aramat mangrugi iti:',
+'activeusers-intro' => 'Daytoy ti listaan dagiti agar-aramat nga adda inararamidda kadagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga alaldaw}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|nga inurnos|kadagiti inurnos}} idi kalpasan ti  {{PLURAL:$3|nga aldaw|$3 nga alaldaw}}',
+'activeusers-from' => 'Iparang dagiti agar-aramat mangrugi iti:',
 'activeusers-hidebots' => 'Ilemmeng dagiti bots',
 'activeusers-hidesysops' => 'Ilemmeng dagiti administrador',
 'activeusers-noresult' => 'Awan ti nasarakan nga agar-aramat.',
@@ -1941,34 +1982,34 @@ Natapayaen a protokol: <tt>$1</tt> (saan mo nga inayun dagitoy iti panagbiruk mo
 
 # Special:ListGroupRights
 'listgrouprights' => 'Dagiti karbengan ti bunggoy ti agar-aramat',
-'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrek da.
-Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a maipapan kadagiti kabukbukod da a karbengan.',
+'listgrouprights-summary' => 'Dagiti sumaganad a listaan ti bunggoy ti agar-aramat a naipalawag iti daytoy a wiki, a nairaman dagiti karbengan ti panagserrekda.
+Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a maipapan kadagiti kabukbukodda a karbengan.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Naikkan ti karbengan</span>
 * <span class="listgrouprights-revoked">Naikkat ti karbengan</span>',
 'listgrouprights-group' => 'Bunggoy',
 'listgrouprights-rights' => 'Dagiti karbengan',
 'listgrouprights-helppage' => 'Help:Karbengan ti bunggoy',
 'listgrouprights-members' => '(listaan dagiti kameng)',
-'listgrouprights-addgroup' => 'Inayon {{PLURAL:$2|bunggoy|dagiti bunggoy}} : $1',
+'listgrouprights-addgroup' => 'Inayon {{PLURAL:$2|ti bunggoy|dagiti bunggoy}} : $1',
 'listgrouprights-removegroup' => 'Ikkaten {{PLURAL:$2|ti bunggoy|dagiti bunggoy}}: $1',
 'listgrouprights-addgroup-all' => 'Inayon amin dagiti bunggoy',
 'listgrouprights-removegroup-all' => 'Ikkatem amin dagiti bunggoy',
-'listgrouprights-addgroup-self' => 'Inayon {{PLURAL:$2|ti bunggoy|dagiti bunggoy}} ti bukod da a pakabilangan: $1',
-'listgrouprights-removegroup-self' => 'Ikkaten {{PLURAL:$2|ti bunggoy|dagiti bungoy}} ti bukod da a pakabilangan: $1',
-'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukod mo a pakabilangan',
+'listgrouprights-addgroup-self' => 'Inayon {{PLURAL:$2|ti bunggoy|dagiti bunggoy}} ti bukodda a pakabilangan: $1',
+'listgrouprights-removegroup-self' => 'Ikkaten {{PLURAL:$2|ti bunggoy|dagiti bungoy}} ti bukodda a pakabilangan: $1',
+'listgrouprights-addgroup-self-all' => 'Inayon amin dagiti bunggoy ti bukodmo a pakabilangan',
 'listgrouprights-removegroup-self-all' => 'Ikkatem amin dagiti bunggoy ti bukod a pakabilangan',
 
 # E-mail user
-'mailnologin' => 'Awan pagipatulodan a pagtaengan',
+'mailnologin' => 'Awan ti pagipatulodan a pagtaengan',
 'mailnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] ken adda umisu nga e-surat a pagtaengan idiay [[Special:Preferences|kaykayatmo]] ti agipatulod ti e-surat kadagiti sabsabali nga agar-aramat.',
 'emailuser' => 'E-suratan daytoy nga agar-aramat',
 'emailpage' => 'E-suratan ti agar-aramat',
-'emailpagetext' => 'Mabalin mo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe daytoy nga agar-aramat.
-Ti e-surat nga inkabil mo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
+'emailpagetext' => 'Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe daytoy nga agar-aramat.
+Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
 'usermailererror' => 'Kita ti surat ket nangisubli ti biddut:',
 'defemailsubject' => '{{SITENAME}} e-surat naggapo ken ni "$1"',
-'usermaildisabled' => 'Saan mo a mabalin ti agipatulod ti e-surat',
-'usermaildisabledtext' => 'Saan mo a mabalin ti agipatulod ti e-surat kadagiti sabali nga agar-aramat ditoy a wiki',
+'usermaildisabled' => 'Saanmo a mabalin ti agipatulod ti e-surat',
+'usermaildisabledtext' => 'Saanmo a mabalin ti agipatulod ti e-surat kadagiti sabali nga agar-aramat ditoy a wiki',
 'noemailtitle' => 'Awan ti e-surat a pagtaengan',
 'noemailtext' => 'Ti agar-aramat ket saan a nagikabil ti umisu nga e-surat a pagtaengan.',
 'nowikiemailtitle' => 'Maiparit ti e-surat',
@@ -1978,13 +2019,13 @@ Ti e-surat nga inkabil mo idiay  [[Special:Preferences|kakaykayatam]] ket agpara
 'emailusername' => 'Nagan ti agar-aramat:',
 'emailusernamesubmit' => 'Ited',
 'email-legend' => 'Ipatulod ti e-surat ti sabali a {{SITENAME}} ti agar-aramat',
-'emailfrom' => 'Naggapo ken ni:',
+'emailfrom' => 'Naggapo kenni:',
 'emailto' => 'Para kenni:',
 'emailsubject' => 'Suheto:',
 'emailmessage' => 'Mensahe:',
 'emailsend' => 'Ipatulod',
 'emailccme' => 'E-surat iti kopia ti mensahek.',
-'emailccsubject' => 'Kopya ti mensahem ken ni $1: $2',
+'emailccsubject' => 'Kopia ti mensahem kenni $1: $2',
 'emailsent' => 'Naipatuloden ti e-surat',
 'emailsenttext' => 'Naipatuloden ti e-surat a mensahem.',
 'emailuserfooter' => 'Daytoy nga e-surat ket impatulod ni $1 kenni $2 iti "E-surat" a panagararamid idiay {{SITENAME}}',
@@ -1998,7 +2039,7 @@ Ti e-surat nga inkabil mo idiay  [[Special:Preferences|kakaykayatam]] ket agpara
 'mywatchlist' => 'Bambantayak',
 'watchlistfor2' => 'Para iti $1 $2',
 'nowatchlist' => 'Awan ti banag iti listaan dagiti bambantayam.',
-'watchlistanontext' => 'Pangngaasim ti $1 tapno makitam dagiti inurnos mo dita bambantayam.',
+'watchlistanontext' => 'Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.',
 'watchnologin' => 'Saan a nakastrek',
 'watchnologintext' => 'Masapul a [[Special:UserLogin|nakastrekka]] tapno mabaliwam dagiti bambantayam a panid.',
 'addwatch' => 'Inayon iti bambantayan',
@@ -2015,12 +2056,12 @@ Mailistanto ditoy dagiti pinagsukat daytoy a panid iti masakbayan agraman ti kan
 'watchnochange' => 'Awan dagiti binambantayam ket naurnos dita panawen a naipakita.',
 'watchlist-details' => '{{PLURAL:$1|$1 panid|$1 dagiti panid}} a bambantayam, saan a mairaman dagiti panid ti tungtongan.',
 'wlheader-enotif' => '* Napakabaelan ti pakiammo ti e-surat.',
-'wlheader-showupdated' => "* Dagiti panid a nasukatan idi kinaudi a pinagbisitam ket naipakita iti '''napuskol'''",
+'wlheader-showupdated' => "* Dagiti panid a nasukatan manipud ti kinaudi a panagsarungkarmo ket naipakita iti '''napuskol'''",
 'watchmethod-recent' => 'kitkitaen dagiti kinaudi nga inurnos kadagiti bambantayan a panid',
 'watchmethod-list' => 'kitkitaen dagiti bambantayan a panid kadagiti kinaudi nga inurnos',
-'watchlistcontains' => 'Addaan ti listaan ti bambantayam iti $1 {{PLURAL:$1|a panid|a pampanid}}.',
+'watchlistcontains' => 'Ti listaan ti bambantayam ket aglaon ti $1 {{PLURAL:$1|a panid|a pampanid}}.',
 'iteminvalidname' => "Parikut iti banag '$1', imbalido a nagan...",
-'wlnote' => "Adda dita baba {{PLURAL:$1|ti kaudian a panagsukat|dagiti kaudian '''$1''' a pinagsukat}} iti naudi a {{PLURAL:$2|oras|'''$2''' oras}}, sipud idi $3, $4.",
+'wlnote' => "Adda dita baba {{PLURAL:$1|ti kaudian a panagsukat|dagiti kaudian '''$1''' a panagsukat}} iti naudi  {{PLURAL:$2|nga oras| a '''$2''' nga oras}}, manipud idi $3, $4.",
 'wlshowlast' => 'Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw $3',
 'watchlist-options' => 'Dagiti pagpilian ti listaan a bambantayan',
 
@@ -2036,7 +2077,7 @@ Mailistanto ditoy dagiti pinagsukat daytoy a panid iti masakbayan agraman ti kan
 'changed' => 'nasukatan',
 'created' => 'naaramid',
 'enotif_subject' => 'Ti {{SITENAME}} a panid a $PAGETITLE ket $CHANGEDORCREATED ni $PAGEEDITOR',
-'enotif_lastvisited' => 'Kitaen ti $1 para iti am-amin a pinagsukat sipud ti naudi nga isasarungkarmo.',
+'enotif_lastvisited' => 'Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.',
 'enotif_lastdiff' => 'kitaen ti $1 tapno mabuya daytoy a pinagsukat.',
 'enotif_anon_editor' => 'di am-ammo nga agar-aramat $1',
 'enotif_body' => 'Nadungngo a $WATCHINGUSERNAME,
@@ -2079,7 +2120,7 @@ Ti makunkunam ken no masapulmo pay ti tulong:
 'exblank' => 'blanko ti panid',
 'delete-confirm' => 'Ikkaten ti "$1"',
 'delete-legend' => 'Ikkaten',
-'historywarning' => "'''Ballaag: ''' Ti panid a kayatmo nga ikkaten ket addaan iti pakasaritaan nga adda $1 {{PLURAL:$1|binaliwan|dagiti binaliwan}}:",
+'historywarning' => "'''Ballaag: ''' Ti panid a kayatmo nga ikkaten ket adda pakasaritaanna ti agarup a $1 {{PLURAL:$1|a binaliwan|kadagiti binaliwan}}:",
 'confirmdeletetext' => 'Ikkatemon ti maysa a panid agraman am-amin a pakasaritaanna.
 Pangngaasim ta pasingkedam a talaga a kayatmo nga aramiden daytoy, a maawatam ti bunga ti panangikkatmo, ken aramidem daytoy kas maiyannugot iti [[{{MediaWiki:Policy-url}}|annuroten]].',
 'actioncomplete' => 'Nalpasen a naaramid',
@@ -2089,18 +2130,18 @@ Kitaen ti $2 para iti panakrehistro dagiti naudi a naikkat.',
 'dellogpage' => 'Listaan ti panagikkat',
 'dellogpagetext' => 'Adda dita baba ti listaan dagiti kaudian a panangikkat.',
 'deletionlog' => 'listaan ti panagikkat',
-'reverted' => 'Naisubli iti immun-una a panamalbaliw',
+'reverted' => 'Naisubli iti immuna a panagbalbaliw',
 'deletecomment' => 'Rason:',
 'deleteotherreason' => 'Sabali/dadduma pay a rason:',
 'deletereasonotherlist' => 'Sabali a rason',
 'deletereason-dropdown' => '*Kadawyan a gapgapu dagiti pannakaikkat
 ** Kiddaw ti mannurat
-** Panaglabsing iti karbengan ti pinagpablaak
+** Panaglabsing iti karbengan ti panagipablaak
 ** Bandalismo',
-'delete-edit-reasonlist' => 'Urnosen dagiti rason ti pinagikkat',
-'delete-toobig' => 'Daytoy a panid ket dakkel ti pakasaritaan na, mabalin ket $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}.
+'delete-edit-reasonlist' => 'Urnosen dagiti rason ti panagikkat',
+'delete-toobig' => 'Daytoy a panid ket dakkel ti pakasaritaanna, sumurok  $1 {{PLURAL:a panagbaliwan|dagiti panagbaliwan}}.
 Ti panagikkat ti kastoy a pammpanid ket naparitan tapno mapawilan ti saan nga inkarkaro a panakadadael ti {{SITENAME}}.',
-'delete-warning-toobig' => 'Daytoy a panid ket addaan ti dakkel unay ti pakasaritaan na a panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.
+'delete-warning-toobig' => 'Daytoy a panid ket adda ti dakkel unay a pakasaritaan ti panag-urnos, ti kaadu nga $1 {{PLURAL:$1|panagbaliw|dagiti panagbaliw}}.
 Ti panagikkat ket madisturbo ti panagpataray ti database ti {{SITNAME}};
 agal-aluad ka a mangrugi.',
 
@@ -2109,22 +2150,22 @@ agal-aluad ka a mangrugi.',
 'rollback_short' => 'Isubli',
 'rollbacklink' => 'isubli',
 'rollbackfailed' => 'Napaay ti panangisubli',
-'cantrollback' => 'Saan a maisubli ti pinagurnos;
+'cantrollback' => 'Saan a maisubli ti panagurnos;
 ti naudi a nakaaramid ket iti laeng nagsurat daytoy a panid..',
-'alreadyrolled' => 'Saan a maipasubli ti kinaudi a pinagurnos iti [[:$1]] ni [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
-addaan sabali a naurnos wenno nagipasubli ti panid.
+'alreadyrolled' => 'Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] ni [[User:$2|$2]] ([[User talk:$2|talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+adda sabali a naurnos wenno nagipasubli ti panid.
 
-Ti kinaudi a nagurnos daytoy a panid ket ni [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Ti pinagurnos a pakabuklan ket: \"''\$1''\".",
-'revertpage' => 'Insubli ti pinagurnos ni [[Special:Contributions/$2|$2]] ([[User talk:$2|pagtutungtongan]]), naisubli iti kaudian a pinagbaliw ni [[User:$1|$1]]',
-'revertpage-nouser' => 'Insubli ti pinagurnos ni (naikkat ti nagan ti agar-aramat) iti kinaudi a pinagbaliw ni [[User:$1|$1]]',
+Ti kinaudi a panagurnos daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+'editcomment' => "Ti panagurnos a pakabuklan ket: \"''\$1''\".",
+'revertpage' => 'Insubli ti panagurnos ni [[Special:Contributions/$2|$2]] ([[User talk:$2|pagtutungtongan]]), naisubli ti kinaudi a panagbaliw ni [[User:$1|$1]]',
+'revertpage-nouser' => 'Naisubli ti panagurnos ni (naikkat ti nagan ti agar-aramat) ti kinaudi a panagbaliw ni [[User:$1|$1]]',
 'rollback-success' => 'Naibabawi dagiti panag-urnos ni $1;
-naisubli manen iti naudi a panagbaliw ni $2.',
+naisubli manen ti naudi a panagbaliw ni $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Napaay ti gimong',
-'sessionfailure' => 'Addaan ti parikut ti gimong ti pinagserrek mo;
-daytoy nga aramid ket naibabawi a kas pagpawilan ti pinaghijack ti gimong.
+'sessionfailure' => 'Adda parikut ti gimong ti panagserrekmo;
+daytoy nga aramid ket naibabawi a kas pagpawilan ti panaghijack ti gimong.
 Agsubli ka ti naggapuam a panid, ikargam ti panid ken padasem manen.',
 
 # Protect
@@ -2146,14 +2187,14 @@ Kitaen ti [[Special:ProtectedPages|listaan kadagiti nasalakniban a panid]] ti li
 'protect_expiry_invalid' => 'Imbalido ti oras a panagpaso.',
 'protect_expiry_old' => 'Napalabasen ti oras ti panagpaso.',
 'protect-unchain-permissions' => 'Lukatan dagiti pagpilian ti salaknib',
-'protect-text' => "Mabalinmo a kitaen ken sukatan ti agpang ti saluad ditoy ti panid a '''$1'''.",
-'protect-locked-blocked' => "Saan mo a mabalin a sukatan dagiti kita ti salaknib no naserraan ka.
+'protect-text' => "Mabalinmo a kitaen ken sukatan ti agpang ti salaknib para iti panid ti '''$1'''.",
+'protect-locked-blocked' => "Saanmo a mabalin a sukatan dagiti kita ti salaknib no naserraan ka.
 Adda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
 'protect-locked-dblock' => "Ti kita ti salaknib ket saan a masukatan gapu ti agdama a kandado ti database.
 Adda ditoy kadagiti agdama a kasasaad ti panid '''$1''':",
 'protect-locked-access' => "Awan ti pammalubos ti pakabilangam a mangsukat kadagiti lessaad ti salaknib ti panid.
 Dagitoy dagiti agdama a kasasaad ti panid a '''$1''':",
-'protect-cascadeon' => 'Daytoy a panid ket nasalakniban iti agdama gapu ta nairaman iti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} iti sipapakat a salaknib ti amin-amin.
+'protect-cascadeon' => 'Daytoy a panid ket agdama a  nasalakniban gapu ta nairaman kadagiti sumaganad a {{PLURAL:$1|panid, nga addaan|pampanid, nga addaan}} ti sipapakat a salaknib ti amin-amin.
 Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignayen ti salaknib nga amin-amin.',
 'protect-default' => 'Mabalin amin nga agar-aramat',
 'protect-fallback' => 'Masapul ti "$1" a pammalubos',
@@ -2164,10 +2205,10 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 'protect-expiring-local' => 'agpaso $1',
 'protect-expiry-indefinite' => "inggana't inggana",
 'protect-cascade' => 'Salakniban dagiti pampanid a nairaman iti daytoy a panid (babaen ti sariap a salaknib)',
-'protect-cantedit' => 'Saanmo a masuktan ti lessaad ti salaknib daytoy a panid, ta awananka iti pammalubos nga agurnos',
+'protect-cantedit' => 'Saanmo a masuktan ti lessaad ti salaknib iti daytoy a panid, gapu ta awan ti pammalubosmo nga agurnos iti daytoy.',
 'protect-othertime' => 'Sabali nga oras:',
 'protect-othertime-op' => 'sabali nga oras',
-'protect-existing-expiry' => 'Daytoy agpaso nga oras: $3, $2',
+'protect-existing-expiry' => 'Ti adda a panagpaso ti oras: $3, $2',
 'protect-otherreason' => 'Sabali/dadduma a rason:',
 'protect-otherreason-op' => 'Sabali a rason',
 'protect-dropdown' => '*Kadawyan a rason ti panagsalaknib
@@ -2190,31 +2231,31 @@ Mabalinmo a sukatan ti lessaad ti salaknib daytoy a panid, ngem saanna a tignaye
 'restriction-upload' => 'Pang-ipan',
 
 # Restriction levels
-'restriction-level-sysop' => 'sibubukel a nasalakniban',
+'restriction-level-sysop' => 'napno a nasalakniban',
 'restriction-level-autoconfirmed' => 'nasalakniban bassit',
 'restriction-level-all' => 'ania man a lessaad',
 
 # Undelete
 'undelete' => 'Kitaen dagiti naikkat a pampanid',
 'undeletepage' => 'Kitaen ken isubli dagiti naikkat a panid',
-'undeletepagetitle' => "'''TI sumaganad ket buklen dagiti naikkat a pinagbaliw ti [[:$1|$1]]'''.",
+'undeletepagetitle' => "'''TI sumaganad ket buklen dagiti naikkat a panagbaliw ti [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Kitaen dagiti naikkat a pampanid',
-'undeletepagetext' => 'Dagiti sumaganad {{PLURAL:a panid ket naikkaten ngem|$1 dagiti panid ket naikkaten ngem}} addaan da pay idiay a nailebbeng ken maipasubli pay.
-Ti lebbeng ket mabalin a mapaminsanan a dalusan.',
+'undeletepagetext' => 'Ti sumaganad a {{PLURAL:$1|panid ket naikkaten ngem|$1 pampanid ket naikkaten ngem}} adda pay naarkibo ken mabalin pay a maipasubli .
+Ti arkibo ket mabalin a sagpaminsan a madalusan.',
 'undelete-fieldset-title' => 'Ipasubli dagiti pinagbaliwan',
-'undeleteextrahelp' => "Ti pinagisubli dagiti amin a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken agtakla ti '''''{{int:undeletebtn}}'''''.
+'undeleteextrahelp' => "Ti panagisubli dagiti amin a pakasaritaan ti panid, ibatim a saan nga nakur-itan dagita kahon ken agtakla ti '''''{{int:undeletebtn}}'''''.
 Ti agaramid ti napilian a pagisubli, ikur-it dagita napilim kadagiti kahon ti kayatmo nga ipasubli, ken agtakla ti '''''{{int:undeletebtn}}'''''.",
-'undeleterevisions' => '$1 {{PLURAL:$1|pinagbaliwan|dagiti pinagbaliwan}} ti nailebben',
+'undeleterevisions' => '$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}} ti nailebben',
 'undeletehistory' => 'No ipasublim daytoy a panid, amin dagiti pinagbaliwan ket maipasubli idiay pakasaritaan.
 Ket no adda baro a panid a kanagnagan na a naaramid ti napalabas a pinagikkat, dagiti naipasubli a pinagbaliwan ket agparang idiay napalabas a pakasaritaan.',
-'undeleterevdel' => 'Ti pinagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti pinagbaliwan ti papeles ket maikkatan ti bassit.
+'undeleterevdel' => 'Ti panagikkat ket saan a maaramid no agbanag iti rabaw ti panid, wenno ti pinagbaliwan ti papeles ket maikkatan ti bassit.
 Iti kastoy a kaso, masapul nga ikkatem ti kur-it wenno ikkatem ti lemmeng dagiti kabarbaro a naikkat a pinagbaliwan.',
 'undeletehistorynoadmin' => 'Daytoy a panid ket naikkaten.
-Ti rason ti pinagikkat ket naipakita ti pinakabuklan dita baba, ken dagita detalye ti agar-aramat a nagpabaliw ditoy a panid sakbay a naikkat.
-Ti usto a testo ti nabaliwan a panagbaliw ket adda kadagiti administrador laeng.',
-'undelete-revision' => 'Naikkat ti pinagbaliwan a $1 (sipud $4, iti $5) ni $3:',
-'undeleterevision-missing' => 'Imbalido wenno napukaw a pinagbaliw.
-Addaan ka ngata ti madi a panilpo, wenno ti pinagbaliwan ket naipasubli wenno naikkat manipud idiay nailebbeng.',
+Ti rason ti panagikkat ket naipakita ti pinakabuklan dita baba, ken dagita dsalaysay ti agar-aramat a nagpabaliw ditoy a panid sakbay a naikkat.
+Ti husto a testo ti nabaliwan a panagbaliw ket adda kadagiti administrador laeng.',
+'undelete-revision' => 'Naikkat ti binaliwan a $1 (manipud idi $4, idi $5) babaen ni $3:',
+'undeleterevision-missing' => 'Imbalido wenno napukaw a panagbaliw.
+Addaan ka ngata ti madi a panilpo, wenno ti panagbaliw ket naipasubli wenno naikkat manipud idiay nailebbeng.',
 'undelete-nodiff' => 'Awan ti nasarakan a kallabes a binaliwan.',
 'undeletebtn' => 'Isubli',
 'undeletelink' => 'kitaen/isubli',
@@ -2222,9 +2263,9 @@ Addaan ka ngata ti madi a panilpo, wenno ti pinagbaliwan ket naipasubli wenno na
 'undeletereset' => 'Isubli',
 'undeleteinvert' => 'Baliktaden ti napili',
 'undeletecomment' => 'Rason:',
-'undeletedrevisions' => '{{PLURAL:$1|1 binaliwan|$1 dagiti binaliwan}} ti naisubli',
-'undeletedrevisions-files' => '{{PLURAL:$1|1 binaliwan|$1 dagiti binaliwan}} ken {{PLURAL:$2|1 file|$2 dagiti papeles}} ti naisubli',
-'undeletedfiles' => '{{PLURAL:$1|1 a papeles|$1 a papeles}} ti naisubli',
+'undeletedrevisions' => '{{PLURAL:$1|1 a  binaliwan|dagiti $1 a binaliwan}} ti naisubli',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli',
+'undeletedfiles' => '{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli',
 'cannotundelete' => 'Napaay ti panagikkat;
 adda ngata immuna a nagikkat ti panid.',
 'undeletedpage' => "'''Naisublin ti $1'''
@@ -2243,10 +2284,10 @@ Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti
 Baka laeng ket naikkaten.',
 'undelete-error' => 'Ballaag ti panagisubli ti pinagikkat ti panid',
 'undelete-error-short' => 'Biddut ti panakaikkat ti papeles: $1',
-'undelete-error-long' => 'Adda nasarakan a biddut idi pinasubli ti pinagikkat ti papeles:
+'undelete-error-long' => 'Adda nasarakan a biddut idi pinasubli ti panagikkat ti papeles:
 
 $1',
-'undelete-show-file-confirm' => 'Sigurado ka a kayatmo ti mangkita ti naikkat a baliwan ti papeles "<nowiki>$1</nowiki>" a naggapu idi $2 ti oras nga $3?',
+'undelete-show-file-confirm' => 'Sigurado  a kayatmo ti mangkita ti naikkat a nabaliwan ti papeles "<nowiki>$1</nowiki>" a naggapu idi $2 ti oras nga $3?',
 'undelete-show-file-submit' => 'Wen',
 
 # Namespace form on various pages
@@ -2254,7 +2295,7 @@ $1',
 'invert' => 'Baliktaden ti napili',
 'tooltip-invert' => 'Ikur-it daytoy a kahon ti panagilemmeng kadagiti sinukatan a panid iti uneg ti napili a nagan ti lugar (ken ti nairaman a nagan ti lugar no naikur-it)',
 'namespace_association' => 'Nairaman a nagan ti lugar',
-'tooltip-namespace_association' => 'Ikur-it daytoy a kahon ti pinagiraman ti kapatangan wenno suheto ti nagan ti lugar a nairaman kadagiti napili a nagan ti lugar.',
+'tooltip-namespace_association' => 'Ikur-it daytoy a kahon ti panagiraman ti kapatangan wenno suheto ti nagan ti lugar a nairaman kadagiti napili a nagan ti lugar.',
 'blanknamespace' => '(Umuna)',
 
 # Contributions
@@ -2274,8 +2315,8 @@ $1',
 'sp-contributions-deleted' => 'dagiti naikkat nga inararamid ti agar-aramat',
 'sp-contributions-uploads' => 'dagiti pang-ipan',
 'sp-contributions-logs' => 'listaan',
-'sp-contributions-talk' => 'makipatang',
-'sp-contributions-userrights' => 'mang-iggem dagiti kaberngan ti agar-aramat',
+'sp-contributions-talk' => 'tungtungan',
+'sp-contributions-userrights' => 'panagtaripatu kadagiti kaberngan ti agar-aramat',
 'sp-contributions-blocked-notice' => 'Naserraan tatta daytoy nga agar-aramat.
 Ti naudi a listaan ti panakaserra ket adda dita baba ta usaren a reperensia:',
 'sp-contributions-blocked-notice-anon' => 'Daytoy nga IP a pagtaengan ket naserraan.
@@ -2292,14 +2333,14 @@ Ti naudi a listaan ti panakaserra ket adda dita baba ta usaren a reperensia:',
 'linkshere' => "Nakasilpo ti sumaganad a pampanid iti '''[[:$1]]''':",
 'nolinkshere' => "Awan ti pampanid a nakasilpo iti '''[[:$1]]'''.",
 'nolinkshere-ns' => "Awan dagiti panid a nakasilpo idiay '''[[:$1]]''' iti napili a nagan ti lugar.",
-'isredirect' => 'ibaw-ing ti panid',
+'isredirect' => 'baw-ing a panid',
 'istemplate' => 'mairaman',
 'isimage' => 'panilpo ti papeles',
 'whatlinkshere-prev' => '{{PLURAL:$1|kallabes|kallabes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sumaruno|sumaruno $1}}',
 'whatlinkshere-links' => '← silsilpo',
 'whatlinkshere-hideredirs' => '$1 a panangibaw-ing',
-'whatlinkshere-hidetrans' => '$1 dagiti mairaman',
+'whatlinkshere-hidetrans' => '$1 a mairamraman',
 'whatlinkshere-hidelinks' => '$1 a pampanilpo',
 'whatlinkshere-hideimages' => '$1 a pampanilpo ti imahen',
 'whatlinkshere-filters' => 'Dagiti sagat',
@@ -2327,8 +2368,8 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 ** Ab-abuso kadagiti sabsabali a pakabilangan
 ** Saan a maawat a nagan ti agar-aramat',
 'ipb-hardblock' => 'Iparit kadagiti nakastrek nga agar-aramat ti agpabaliw iti naggapo ditoy nga IP a pagtaengan',
-'ipbcreateaccount' => 'Serraan ti panagparnuay iti pakabilangan',
-'ipbemailban' => 'Serraan ti agar-aramat nga agipatulod ti e-surat',
+'ipbcreateaccount' => 'Pawilan ti panagpartuat iti pakabilangan',
+'ipbemailban' => 'Pawilan ti agar-aramat nga agipatulod ti e-surat',
 'ipbenableautoblock' => 'Automatiko ti serra ti naudi nga IP a pagtaengan nga inusar daytoy nga agar-aramat, ken dagiti sumaruno nga IP a pagtaengan a padasen da nga agpabaliw',
 'ipbsubmit' => 'Serraan daytoy nga agar-aramat',
 'ipbother' => 'Sabali nga oras:',
@@ -2337,15 +2378,15 @@ Ikkan ti nainaganan a rason dita baba (kas pagarigan, dakamaten ti maysa a panid
 'ipbotherreason' => 'Sabali/nayon a rason:',
 'ipbhidename' => 'Ilemmeng ti nagan ti agar-aramat kadagiti listaan ken inurnos',
 'ipbwatchuser' => 'Bantayan ti panid ti agar-ramat ken panid ti tungtongan daytoy nga agar-aramat',
-'ipb-disableusertalk' => 'No naserran da iparit daytoy nga agar-aramat ti agbaliw kadagiti bukodda a kapatangan a panid',
+'ipb-disableusertalk' => 'Pawilan daytoy nga agar-aramat nga agurnos kadagiti bukodda a tungtungan a panid no naserraan',
 'ipb-change-block' => 'Serraan manen ti agar-aramat kadagitoy a disso',
 'ipb-confirm' => 'Pasingkedan ti serra',
 'badipaddress' => 'Imbalido nga IP a pagtaengan',
 'blockipsuccesssub' => 'Balligi ti panangserra',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraan.<br />
-Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra.',
-'ipb-blockingself' => 'Mangrugrugi ka nga agserra kenka! Sigurado nga kayatmo nga aramiden daytoy?',
-'ipb-confirmhideuser' => 'Mangrugrugi ka ti mangserra ti agar-aramat nga addaan ti napabalin na nga "ilemmeng ti agar-aramat". Iddeppen na ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Sigurado ka a kasta ti kayatmo?',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ket naserraanen.<br />
+Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti serra.',
+'ipb-blockingself' => 'Mangrugrugika nga agserra kenka! Sigurado nga kayatmo nga aramiden daytoy?',
+'ipb-confirmhideuser' => 'Mangrugrugika ti mangserra ti agar-aramat nga adda ti napabalinna nga "ilemmeng ti agar-aramat". Iddeppenna ti nagan daytoy nga agar-aramat kadagiti amin a listaan ken dagiti naikabkabil ti listaan. Sigurado ka a kasta ti kayatmo?',
 'ipb-edit-dropdown' => 'Urnosen dagiti rason ti panagserra',
 'ipb-unblock-addr' => 'Lukatan ti serra ni $1',
 'ipb-unblock' => 'Lukatan ti serra ti nagan ti agar-aramat wenno IP a pagtaengan',
@@ -2354,32 +2395,32 @@ Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra
 'unblockip' => 'Lukatan ti serra ti agar-aramat',
 'unblockiptext' => 'Usaren ti kinabuklan dita baba ti pinagisubli ti pinagserrek nga agsurat ti napalubos a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.',
 'ipusubmit' => 'Ikkaten daytoy a serra',
-'unblocked' => 'Naikkat ti panagserra ni [[User:$1|$1]]',
+'unblocked' => 'Naikkat ti panakaserra ni [[User:$1|$1]]',
 'unblocked-range' => '$1 naikkaten ti serra na',
 'unblocked-id' => 'Naikkaten ti serra ni $1',
 'blocklist' => 'Dagiti naserraan nga agar-aramat',
 'ipblocklist' => 'Dagiti naserraan nga agar-aramat',
 'ipblocklist-legend' => 'Biruken ti naserraan nga agar-aramat',
 'blocklist-userblocks' => 'Ilemmeng dagiti serra ti pakabilangan',
-'blocklist-tempblocks' => 'Ilemmeng dagiti saan nga agnanayon a serra',
+'blocklist-tempblocks' => 'Ilemmeng dagiti temporario a serra',
 'blocklist-addressblocks' => 'Ilemmeng ti maysa a serra dagiti IP',
-'blocklist-rangeblocks' => 'Ilemming dagiti nasakup a serra',
+'blocklist-rangeblocks' => 'Ilemmeng dagiti nasakup a serra',
 'blocklist-timestamp' => 'Petsa ken oras',
 'blocklist-target' => 'Puntaan',
 'blocklist-expiry' => 'Agpaso',
-'blocklist-by' => 'Ti naserraan nga admin',
+'blocklist-by' => 'Ti nagserra nga admin',
 'blocklist-params' => 'Parametro ti serra',
 'blocklist-reason' => 'Rason',
 'ipblocklist-submit' => 'Biruken',
 'ipblocklist-localblock' => 'Serra a lokal',
-'ipblocklist-otherblocks' => 'Sabali {{PLURAL:$1|serra|dagiti serra}}',
+'ipblocklist-otherblocks' => 'Sabali {{PLURAL:$1|a serra|kadagiti serra}}',
 'infiniteblock' => "inggana't inggana",
 'expiringblock' => 'agpaso no $1 ti oras nga $2',
 'anononlyblock' => 'di am-ammo laeng',
 'noautoblockblock' => 'nabaldado ti auto a serra',
 'createaccountblock' => 'naserraan ti pannakapartuat ti pakabilangan',
 'emailblock' => 'naserraan ti e-surat',
-'blocklist-nousertalk' => 'saan na a mabalin nga urnosen ti kapatang na a panid',
+'blocklist-nousertalk' => 'saanna a mabalin nga urnosen ti bukod a tungtungan a panid',
 'ipblocklist-empty' => 'Awan nagyan ti listaan ti serra.',
 'ipblocklist-no-results' => 'Ti kiniddaw nga IP a pagtaengan wenno nagan ti agar-aramat ket saan a naserraan',
 'blocklink' => 'serraan',
@@ -2390,21 +2431,21 @@ Kitaen ti [[Special:BlockList|listaan ti IP a naserraan]] ta kitaen dagiti serra
 'autoblocker' => 'Na-auto a serra ngamin ket ti IP a pagtaengan ket damdama nga inusar ni "[[User:$1|$1]]".
 Ti rason nga inted ti $1\'s serra ket: "$2"',
 'blocklogpage' => 'Listaan ti naserraan',
-'blocklog-showlog' => 'Daytoy nga agar-aramat ket naserraan idin.
+'blocklog-showlog' => 'Daytoy nga agar-aramat ket dati a naserraan.
 Ti listaan ti serra ket naikabil dita baba tapno mausar a reperensia:',
-'blocklog-showsuppresslog' => 'Daytoy nga agar-aramat ket naserraan ken nailemmeng idin.
+'blocklog-showsuppresslog' => 'Daytoy nga agar-aramat ket dati a naserraan ken nailemmeng.
 Ti listaan ti napasardeng ket naikabil dita baba tapno mausar a reperensia:',
-'blocklogentry' => 'naserraan ni [[$1]] nga addaan ti oras ti panagpaso nga $2 $3',
-'reblock-logentry' => 'sinukatan ti panakaserra ni [[$1]] ti agtapos nga oras nga $2 $3',
-'blocklogtext' => 'Daytoy ket listaan ti gar-aramat kadagiti pinagserraken panaglukat ti serra
-Dagiti na-automatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
-Kitaen ti [[Special:BlockList|Listaan ti serra ti IP]] ti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
+'blocklogentry' => 'naserraan ni [[$1]] nga adda ti oras a panagpaso iti $2 $3',
+'reblock-logentry' => 'sinukatan ti panakaserra para kenni [[$1]] nga adda ti oras a panagpaso iti  $2 $3',
+'blocklogtext' => 'Daytoy ket listaan ti agar-aramat kadagiti panagserra ken panaglukat ti serra
+Dagiti na-atomatiko a panakaserra ti IP a pagtaengan ket saan a nailista.
+Kitaen ti [[Special:BlockList|Listaan ti lapden nga IP]] para iti listaan kadagiti agdama a naiparit a pagpataray ken dagiti serra.',
 'unblocklogentry' => 'lukatan ti serra ni $1',
 'block-log-flags-anononly' => 'dagiti di am-ammo nga agar-aramat laeng',
-'block-log-flags-nocreate' => 'naisardeng ti pinagaramid iti pakabilangan',
+'block-log-flags-nocreate' => 'nabaldado ti panagpartuat ti pakabilangan',
 'block-log-flags-noautoblock' => 'naiddep ti auto-serra',
 'block-log-flags-noemail' => 'naserraan ti e-surat',
-'block-log-flags-nousertalk' => 'saan na a mabalin nga urnosen ti tungtunganna a panid',
+'block-log-flags-nousertalk' => 'saanna a mabalin nga urnosen ti bukod a tungtungan a panid',
 'block-log-flags-angry-autoblock' => 'napabalin ti napasayaat nga auto-serra',
 'block-log-flags-hiddenname' => 'nailemmeng ti nagan ti agar-aramat',
 'range_block_disabled' => 'Ti abilidad ti administrador nga agaramid ti naabutan a serra ket naiddep.',
@@ -2413,7 +2454,7 @@ Kitaen ti [[Special:BlockList|Listaan ti serra ti IP]] ti listaan kadagiti agdam
 'ipb_hide_invalid' => 'Saan a mapasardeng daytoy a pakabilangan; adda ngata adu unay nga inurnos na.',
 'ipb_already_blocked' => ' "$1" ket naserraan',
 'ipb-needreblock' => '$1 ket naseraan. Kayatmo a sukatan ti serra na?',
-'ipb-otherblocks-header' => 'Sabali {{PLURAL:$1|naserraan|dagiti naserraan}}',
+'ipb-otherblocks-header' => 'Sabali {{PLURAL:$1|a naserraan|kadagiti naserraan}}',
 'unblock-hideuser' => 'Saanmo a maisubli ti serra daytoy nga agar-aramat, nailemmengen ti nagan daytoy nga agar-aramat.',
 'ipb_cant_unblock' => 'Biddut: ID $1 ti serra a nabirukan. Baka nalukatan ti serranan.',
 'ipb_blocked_as_range' => 'Ballag: Ti IP a pagtaengan $1 ket saan a dagus a naserraan ken saan a malukatan ti serra na.
@@ -2422,14 +2463,14 @@ Ngem, naserran a kas paset ti naabutan $2, a mabalin a malukatan ti serra na.',
 'ip_range_toolarge' => 'Dagiti serra a nasakup a dakdakkel ngem /$1 ket saan a maipalubos.',
 'blockme' => 'Serraannak',
 'proxyblocker' => 'Proxy a panagserra',
-'proxyblocker-disabled' => 'Daytoy a pinagaramid ket nabaldado.',
+'proxyblocker-disabled' => 'Daytoy a panagaramid ket nabaldado.',
 'proxyblockreason' => 'Ti IP a pagtaengam ket naserraan ngamin ket daytoy ket nakalukat a proxy.
 Pangngaasi ta kontakem ti agit-ited ti serbisio ti Internet mo wenno teknikal a tapayaen ti kaurnusam ken ibagam kaniada ti nakaro a talinaay a parikut.',
 'proxyblocksuccess' => 'Nalpasen.',
 'sorbsreason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan a proxy" idiay DNSBL nga inusar ti {{SITNAME}}.',
 'sorbs_create_account_reason' => 'Ti IP a pagtaengam ket nakalista a kasla "nalukatan proxy" idiay DNSBL nga inusar ti {{SITNAME}}.
-Saan ka a makaaramid ti pakabilangan',
-'cant-block-while-blocked' => 'Saan mo a maserraan dagiti sabali nga agar-aramat no naserraan ka met.',
+Saanka a makaaramid ti pakabilangan',
+'cant-block-while-blocked' => 'Saanmo a maserraan dagiti sabali nga agar-aramat no naserraan ka met.',
 'cant-see-hidden-user' => 'Ti agar-aramat a kayatmo a serraan ket naserraan ken nailemmeng.
 Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno mabaliwan ti serra ti agar-aramat.',
 'ipbblocked' => 'Saan mo a mabalin ti agserra wenno agikkat ti serra ti sabali nga agar-aramat, ngamin ket naserraan ka met.',
@@ -2440,7 +2481,7 @@ Ket awan met ti karbengam nga agilemming ti agar-aramat, saan mo a makita wenno
 'unlockdb' => 'Lukatan ti database',
 'lockdbtext' => 'Ti panagserra ti database ket makaikkat ti abilidad kadagiti amin nga agar-aramat ti agurnos kadagiti panid, ti panagsukat dagiti kaykayat da, ti panagurnos dagiti bambantayan da, ken dagiti sabsabali pay a masapul ti panagsukat idiay database.
 Pangngaasi ta pasingkedam daytoy a kayatmo nga aramiden, ken luktam dayta database no malpas kan nga agsimpa.',
-'unlockdbtext' => 'Ti pinaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti pinagurnos kadagiti panid, ti pinagsukat dagiti kaykayat da, ti pinagurnos dagiti bambantaya da, ken dagiti amin a makasapul ti pinagsukat idiay database.
+'unlockdbtext' => 'Ti panaglukat ti database ket mangipasubli ti abilidad dagiti amin nga agar-aramat ti panagurnos kadagiti panid, ti panagsukat dagiti kaykayat da, ti panagurnos dagiti bambantayanda, ken dagiti amin a makasapul ti panagsukat idiay database.
 Pangngaasi ta pasingkedam a daytoy ti kayatmo nga aramiden.',
 'lockconfirm' => 'Wen, talaga a kayatko a balunetan ti database.',
 'unlockconfirm' => 'Wen, talaga a kayatko a balunetan ti database.',
@@ -2483,39 +2524,39 @@ Kayat a sawen daytoy a mabalinmo a suktan ti nagan ti maysa a panid manipud iti
 '''Ballaag!'''
 Mabalin a maysa daytoy a nakaro ken saan a bigla a panagbaliw iti maysa a nasikat a panid;
 pangngaasim ta pasingkedam a maawatam ti ibunga daytoy sakbay nga agtuloyka a mangbaliw.",
-'movepagetalktext' => "Ti mainaig a panid-tungtongan ket giddato a maiyalis a karamanna '''malaksid:'''
-*No addan sigud nga adda linaonna a panid-tungtongan iti babaen ti baro a nagan, wenno
+'movepagetalktext' => "Ti mainaig a tungtungan ti panid ket giddato a maiyalis a karamanna '''malaksid:'''
+*No addan sigud nga awan linaonna a tungtungan ti panid babaen ti baro a nagan, wenno
 *No ikkatem ti kur-itna ti kahon iti baba.
 
-Kadagitoy a kaso, masapul nga iyalisr wenno itiponmo a manual ti panid no kayatmo.",
+Kadagitoy a kaso, masapul nga iyalis wenno itiponmo a manual ti panid no kayatmo.",
 'movearticle' => 'Iyalis ti panid:',
 'moveuserpage-warning' => "'''Ballaag:''' Mangrugrugi ka nga agiyalis ti panid ti agar-aramat. Pangngaasi a laglapipen a ti panid ket isu laeng ti mabalin nga iyalis ken ti agar-aramat ket ''saan'' a managanan.",
 'movenologin' => 'Saan a nakastrek',
 'movenologintext' => 'Masapul a nakarehistroka nga agar-aramat ken [[Special:UserLogin|nakastrek]] tapno makaiyalis iti panid.',
-'movenotallowed' => 'Awanka iti pammalubos mo nga agiyalis iti pampanid.',
-'movenotallowedfile' => 'Awanka iti pammalubos mo nga agiyalis iti papeles.',
+'movenotallowed' => 'Awan ti pammalubosmo nga agiyalis kadagiti panid.',
+'movenotallowedfile' => 'Awan ti pammalubosmo nga agiyalis kadagiti papeles.',
 'cant-move-user-page' => 'Awan ti pammalubos mo nga agiyalis kadagiti panid ti agar-aramat (mabalin dagiti apo ti panid).',
 'cant-move-to-user-page' => 'Awan ti pammalubos mo nga agiyalis ti panid idiay panid ti agar-aramat (mabalin dagiti apo ti panid ti agar-aramat).',
 'newtitle' => 'Iti baro a titulo:',
 'move-watch' => 'Bantayan daytoy a panid',
 'movepagebtn' => 'Iyalis ti panid',
-'pagemovedsub' => 'Balligi ti pinangiyalis',
+'pagemovedsub' => 'Balligi ti panangiyalis',
 'movepage-moved' => 'Naiyalis ti \'\'\'"$1" iti "$2"\'\'\'',
-'movepage-moved-redirect' => 'Adda met baw-ing a naramiden.',
-'movepage-moved-noredirect' => 'Ti pinagaramid ti baw-ing ket napasardeng.',
-'articleexists' => 'Addan panid nga addaan iti kasta a nagan, wenno ti nagan a pinilim ket saan a mabalin.
-Pangngaasim ta mangpilika iti sabali a nagan.',
-'cantmove-titleprotected' => 'Saan mo a maiyalis ti panid ditoy nga lugar, ngamin ket ti baro a titulo ket nasalaknibanti pinnakaaramid na.',
+'movepage-moved-redirect' => 'Napartuaten ti maysa a baw-ing.',
+'movepage-moved-noredirect' => 'Ti panagaramid ti baw-ing ket napasardeng.',
+'articleexists' => 'Adda panid nga adda ti kasta a nagan, wenno ti nagan a pinilim ket saan a mabalin.
+Pangngaasim a mangpilika iti sabali a nagan.',
+'cantmove-titleprotected' => 'Saanmo a maiyalis ti panid iti daytoy a lokasion, ngamin ket ti baro a titulo ket nasalakniban para iti panakapartuat.',
 'talkexists' => "'''Sibaballigi a naiyalis ti panid, nupay kasta saan a maiyalis ti panid ti tungtongan gapu ta addan panid-tungtongan iti baro a titulo.
 Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
 'movedto' => 'naiyalis iti',
 'movetalk' => 'Iyalis ti mainaig a panid ti tungtongan',
-'move-subpages' => 'Iyalis dagiti apo ti panid (pangato nga $1)',
-'move-talk-subpages' => 'Iyalis dagiti apo ti panid nga kapatangan a panid (pangato nga $1)',
-'movepage-page-exists' => 'Ti panid a $1 ket addaan ken saan a mautomatiko a suratan manen.',
+'move-subpages' => 'Iyalis dagiti apo ti panid (aginggana ti $1)',
+'move-talk-subpages' => 'Iyalis dagiti apo ti panid iti tungtungan ti panid (aginggana ti $1)',
+'movepage-page-exists' => 'Ti panid ti $1 ket addan ken saan a mautomatiko a suratan manen.',
 'movepage-page-moved' => 'Naiyalis ti panid a $1 iti $2.',
 'movepage-page-unmoved' => 'Saan a maiyalis ti panid $1 iti $2.',
-'movepage-max-pages' => 'Ti kangato ti $1 {{PLURAL:$1|panid|dagiti panid}} ket naiyalis ken awan ti automatiko a maiyalis.',
+'movepage-max-pages' => 'Ti kaadu iti $1 a {{PLURAL:$1|panid|pampanid}} ket naiyalis ken awanen ti automatiko a maiyalis.',
 'movelogpage' => 'Listaan ti naiyalis',
 'movelogpagetext' => 'Adda dita baba ti listaan dagiti naiyalis a pampanid.',
 'movesubpage' => '{{PLURAL:$1|Apo ti panid|Dagiti apo ti panid}}',
@@ -2530,12 +2571,12 @@ Kayatmo nga ikkaten  tapno makaiyalis ka?',
 'delete_and_move_confirm' => 'Wen, ikkatenen ti panid',
 'delete_and_move_reason' => 'Naikkat tapno mawayaan ti panaka-iyalis idiay "[[$1]]"',
 'selfmove' => 'Ti titulo ti taudan ken ti pangipanan ket agpadpada;
-saan mo a maiyalis ti panid ti isu met laeng a panid.',
+saanmo a maiyalis ti panid ti isu met laeng a panid.',
 'immobile-source-namespace' => 'Saan a maiyalis dagiti panid idiay nagan ti lugar  "$1"',
 'immobile-target-namespace' => 'Saan a maiyalis dagiti panid idiay nagan ti lugar "$1"',
 'immobile-target-namespace-iw' => 'Ti panilpo nga interwiki ket saan na mabalin nga iyalis.',
 'immobile-source-page' => 'Saan a mabalin nga iyalis daytoy a panid.',
-'immobile-target-page' => 'Saan a maiyalis dita a papanan na a titulo.',
+'immobile-target-page' => 'Saan a maiyalis dita a papananna a titulo.',
 'imagenocrossnamespace' => 'Saan a maiyalis ti papeles idiay saan a papeles a nagan ti lugar',
 'nonfile-cannot-move-to-file' => 'Saan a maiyalis ti saan a papeles idiay papeles a nagan a lugar',
 'imagetypemismatch' => 'Ti baro a pagpaatiddog ti papeles ket saan nga agpada ti kita na',
@@ -2543,29 +2584,29 @@ saan mo a maiyalis ti panid ti isu met laeng a panid.',
 'fix-double-redirects' => 'Agpabaro ti amin a baw-ing nga agtudtudo ti kasigud a titulo',
 'move-leave-redirect' => 'Mangibati ka ti baw-ing',
 'protectedpagemovewarning' => "'''Ballaag:''' Daytoy a panid ket nasalakniban tapno dagiti laeng agar-aramat nga addaan ti gundaway nga administrador ti  makaiyalis.
-Ti nakaudi a naikabil a listaan ket adda iti baba tapno pag reperensia:",
-'semiprotectedpagemovewarning' => "''Pakaammo:''' Nasaluadan daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis itoy.
-Ti nakaudi a naikabil a listaan ket adda iti baba tapno mausar a reperensia:",
+Ti kinaudi a naikabil ti listaan ket adda dita baba tapno mausar a reperensia:",
+'semiprotectedpagemovewarning' => "'''Pakaammo:''' Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.
+Ti kinaudi a naikabil ti listaan ket adda iti baba tapno mausar a reperensia:",
 'move-over-sharedrepo' => '== Addaan ti papeles ==
-[[:$1]] addaan idiay pagbingayan a nagikabilan. Ti pinagiyalis ti papeles iti titulo nga itoy ket paawanen na ti pagbingayan a papeles.',
+[[:$1]] addaan idiay pagbingayan a nagikabilan. Ti panagiyalis ti papeles iti titulo nga itoy ket paawanen na ti pagbingayan a papeles.',
 'file-exists-sharedrepo' => 'Ti napilim a nagan ti papeles ket naususaren idiay pagbingayan a nagikabilan.
 Pangngaasi ta agpili ka ti sabali a nagan.',
 
 # Export
 'export' => 'Agipan dagiti panid',
-'exporttext' => 'Maipan mo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.
+'exporttext' => 'Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.
 Daytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].
 
 Ti pinagipan ti panid, ikabil ti titulo dita kahon ti teksto dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a pinagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a pinagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a pinagurnos.
 
-No iti kinaudi a kaso mabalin mo nga usaren ti panilpo, a kaspagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid "[[{{MediaWiki:Mainpage}}]]".',
+No iti kinaudi a kaso mabalinmo nga usaren ti panilpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid "[[{{MediaWiki:Mainpage}}]]".',
 'exportall' => 'Ipan amin a pampanid',
-'exportcuronly' => 'Iraman laeng ti agdadama pinagbaliwan, saan a ti amin a pakasaritaan',
+'exportcuronly' => 'Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan',
 'exportnohistory' => "----
 '''Palagip:''' Ti pagipapan dagiti punno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pinakalaing ti pinagandar a rason.",
 'exportlistauthors' => 'Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid',
 'export-submit' => 'Agipan',
-'export-addcattext' => 'Nayunan dagiti panid a naggapu idiay kategoria:',
+'export-addcattext' => 'Agnayon kadagiti panid a naggapu idiay kategoria:',
 'export-addcat' => 'Inayon',
 'export-addnstext' => 'Nayunan dagiti panid a naggapu idiay nagan ti lugar:',
 'export-addns' => 'Inayon',
@@ -2576,10 +2617,10 @@ No iti kinaudi a kaso mabalin mo nga usaren ti panilpo, a kaspagarigan [[{{#Spec
 # Namespace 8 related
 'allmessages' => 'Dagiti mensahe ti sistema',
 'allmessagesname' => 'Nagan',
-'allmessagesdefault' => 'Naisigud a testo ti mensahe',
+'allmessagesdefault' => 'Kasisigud a testo ti mensahe',
 'allmessagescurrent' => 'Agdama a testo ti mensahe',
-'allmessagestext' => 'Daytoy ti listaan dagiti mensahe ti sistema nga addaan idiay MediaWiki nagan ti lugar.
-Pangngaasi ta bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ken [//translatewiki.net translatewiki.net] no kayatmo ti mangted kadagiti pinagpatarus ti MediaWiki.',
+'allmessagestext' => 'Daytoy ti listaan dagiti mensahe ti sistema a magun-od idiay MediaWiki a nagan ti lugar.
+Pangngaasi a bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.',
 'allmessagesnotsupportedDB' => "Saan a mausar daytoy a panid ngamin ket ti '''\$wgUseDatabaseMessages''' ket nabaldado.",
 'allmessages-filter-legend' => 'Sagat',
 'allmessages-filter' => 'Sagaten ti naiduma a estado:',
@@ -2593,7 +2634,7 @@ Pangngaasi ta bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Loca
 # Thumbnails
 'thumbnail-more' => 'Padakkelen',
 'filemissing' => 'Mapukpukaw ti papeles',
-'thumbnail_error' => 'Biddut ti panagaramid iti bassit nga imahen: $1',
+'thumbnail_error' => 'Biddut ti panagaramid ti bassit nga imahen: $1',
 'djvu_page_error' => 'Ti DjVu a panid ket saan a nasakup',
 'djvu_no_xml' => 'Saan a naala ti XML iti DjVu a papeles',
 'thumbnail-temp-create' => 'Saan a makaaramid ti temporario a bassit a papeles',
@@ -2608,7 +2649,7 @@ Pangngaasi ta bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Loca
 'import' => 'Agala dagiti panid',
 'importinterwiki' => 'Agala ti transwiki',
 'import-interwiki-text' => 'Agpili ka ti wiki ken titulo ti panid nga alaem.
-Ti pinagbaliwan dagiti petsa ken dagiti nagan ti mannurat ket maibati a kinasigud.
+Dagit panagbaliw a petsa ken dagiti nagan ti mannurat ket maipreserba.
 Amin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pinagala]].',
 'import-interwiki-source' => 'Taudan ti wiki/panid:',
 'import-interwiki-history' => 'Kopiaen amin dagiti bersion ti pakasaritaan daytoy a panid',
@@ -2617,11 +2658,11 @@ Amin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pi
 'import-interwiki-namespace' => 'Pangipanan ti nagan ti lugar:',
 'import-upload-filename' => 'Nagan ti papeles:',
 'import-comment' => 'Komentario:',
-'importtext' => 'Pangngaasi ta ipanmo ti papeles a naggapu iti nagtaudan a wiki nga agusar ti [[Special:Export|agipan]].',
+'importtext' => 'Pangngaasi nga ipanmo ti papeles a naggapu iti nagtaudan a wiki nga agusar ti [[Special:Export|agipan]].',
 'importstart' => 'Agal-ala dagiti panid...',
-'import-revision-count' => '$1 {{PLURAL:$1|a pinagbaliwan|dagiti pinagbaliwan}}',
+'import-revision-count' => '$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}}',
 'importnopages' => 'Awan dagiti panid ti maala.',
-'imported-log-entries' => 'Naala $1 {{PLURAL:$1|nailista|dagiti nailista}}.',
+'imported-log-entries' => 'Naala ti $1 {{PLURAL:$1|a nailista|kadagiti nailista}}.',
 'importfailed' => 'Napaay ti panagala: <nowiki>$1</nowiki>',
 'importunknownsource' => 'Di amammo a kita ti taudan ti innala',
 'importcantopen' => 'Saan a maluktan ti innala a papeles',
@@ -2639,23 +2680,23 @@ Paset laeng ti papeles ti napag-ipan.',
 Awan ti saan nga agnayon a polder.',
 'import-parse-failure' => 'Napaay ti pinagala ti XML parse',
 'import-noarticle' => 'Awan ti panid a maaala!',
-'import-nonewrevisions' => 'Amin a pinagbaliwan ket naala da idi.',
+'import-nonewrevisions' => 'Amin a panagbalbaliw ket dati a naala.',
 'xml-error-string' => '$1 iti linia $2, tukol $3 (byte $4): $5',
 'import-upload' => 'Ipan ti XML data',
 'import-token-mismatch' => 'Napukaw ti gimong ti data.
 Pangngaasi ta padasem manen.',
 'import-invalid-interwiki' => 'Saan a makaala dita naited a wiki.',
-'import-error-edit' => 'Ti panid a "$1" ket saan a naala ngamin ket saan mo a mabalin nga urnosen.',
-'import-error-create' => 'Ti panid a "$1" ket saan a naala ngamin ket saan mo a mabalin nga aramiden.',
-'import-error-interwiki' => 'Ti panid "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
-'import-error-special' => 'Ti panid "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
-'import-error-invalid' => 'Ti panid "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
+'import-error-edit' => 'Ti panid ti "$1" ket saan a naala ngamin ket saan mo a mabalin nga urnosen.',
+'import-error-create' => 'Ti panid ti "$1" ket saan a naala ngamin ket saan mo a mabalin nga aramiden.',
+'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
+'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
+'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
 
 # Import log
 'importlogpage' => 'Alaen ti listaan',
-'importlogpagetext' => 'Ti taripatuen a pinagala dagiti panid nga addaan ti pakasaritaan na nga urnosen kadagiti sabsabali a wiki.',
+'importlogpagetext' => 'Ti administratibo a panagala dagiti panid nga adda ti pakasaritaanna nga urnos kadagiti sabsabali a wiki.',
 'import-logentry-upload' => 'innala ti [[$1]] iti papeles a pinag-ipan',
-'import-logentry-upload-detail' => '$1 {{PLURAL:$1|pinagbaliwan|dagiti pinagbaliwan}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|a pinagbaliwan|kadagiti pinagbaliwan}}',
 'import-logentry-interwiki' => 'nai-transwiki ti $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|pinagbaliwan|dagiti pinagbaliwan}} manipud iti $2',
 
@@ -2667,7 +2708,7 @@ Pangngaasi ta padasem manen.',
 'javascripttest-pagetext-unknownframework' => 'Di amamo a pagsubsubokan a tabas "$1".',
 'javascripttest-pagetext-frameworks' => 'Pangngaasi nga agpili ti maysa kadagiti sumaganad a pagsubokan a tabas: $1',
 'javascripttest-pagetext-skins' => 'Agpili ti kudil a pangipatarayan ti pagsubokan:',
-'javascripttest-qunit-intro' => 'Kitaen [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.',
+'javascripttest-qunit-intro' => 'Kitaen ti [ $1 dukomentasion ti panagsubok] idiay mediawiki.org.',
 'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
 
 # Tooltip help for the actions
@@ -2678,11 +2719,11 @@ Pangngaasi ta padasem manen.',
 'tooltip-pt-preferences' => 'Dagiti kaykayatmo',
 'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem ti panagsuksutda',
 'tooltip-pt-mycontris' => 'Listaan dagiti naaramidmo',
-'tooltip-pt-login' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
-'tooltip-pt-anonlogin' => 'Maisingasing ti inka koma panag-serrek; nupay kasta ket saan a maipapilit',
+'tooltip-pt-login' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
+'tooltip-pt-anonlogin' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
 'tooltip-pt-logout' => 'Rummuar',
-'tooltip-ca-talk' => 'Pagtutungtongan maipapan iti linaon ti panid',
-'tooltip-ca-edit' => 'Mabalinmo a balbaliwan daytoy a panid. Pangngaasim ta aramaten ti buton ti ipadas sakbay nga idulinmo ti panid.',
+'tooltip-ca-talk' => 'Pagtutungtongan a maipapan ti linaon ti panid',
+'tooltip-ca-edit' => 'Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin',
 'tooltip-ca-addsection' => 'Mangirugi ti baro a paset',
 'tooltip-ca-viewsource' => 'Nasalakniban daytoy a panid.
 Mabalinmo a kitaen ti taudanna.',
@@ -2695,24 +2736,24 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-ca-watch' => 'Inayon daytoy a panid kadagiti bambantayam',
 'tooltip-ca-unwatch' => 'Ikkatem daytoy a panid kadagiti bambantayam',
 'tooltip-search' => 'Biruken idiay {{SITENAME}}',
-'tooltip-search-go' => 'Inka idiay panid no adda kapada na a nagan',
+'tooltip-search-go' => 'Inka idiay panid nga adda kastoy a naganna no adda',
 'tooltip-search-fulltext' => 'Birukem dagiti panid daytoy a testo',
 'tooltip-p-logo' => 'Sarungkaran ti umuna a panid',
 'tooltip-n-mainpage' => 'Sarungkaran ti umuna a panid',
 'tooltip-n-mainpage-description' => 'Sarungkaran ti umuna a panid',
-'tooltip-n-portal' => 'Maipapan iti gandat no ania ti maaramidam, no sadino ti pakasarak kadagiti bambanag',
+'tooltip-n-portal' => 'Maipapan ti gandat, ti aniaman a maaramidam, no sadino ti pagbirukam kadagiti banbanag',
 'tooltip-n-currentevents' => 'Agsapul iti lugar ti likud a pakaammo kadagiti agdama a paspasamak',
 'tooltip-n-recentchanges' => 'Listaan dagiti naudi a sinukatan iti wiki.',
 'tooltip-n-randompage' => 'Mangiparuar iti pugto a panid',
 'tooltip-n-help' => 'Ti lugar a pakasapulan.',
 'tooltip-t-whatlinkshere' => 'Listaan ti am-amin a pampanid ti wiki a nakasilpo ditoy',
 'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan  dagiti panid a nakasilpo ditoy a panid',
-'tooltip-feed-rss' => 'RSS na pakan para iti daytoy a panid',
+'tooltip-feed-rss' => 'RSS a pakan para iti daytoy a panid',
 'tooltip-feed-atom' => 'Atom a pakan para itoy a panid',
 'tooltip-t-contributions' => 'Kitaen ti listaan dagiti naaramidan daytoy nga agar-aramat',
-'tooltip-t-emailuser' => 'Patulodan iti e-surat daytoy nga agar-aramat',
+'tooltip-t-emailuser' => 'Patulodan ti e-surat daytoy nga agar-aramat',
 'tooltip-t-upload' => 'Agipan iti papeles',
-'tooltip-t-specialpages' => 'Listaan ti am-amin nga espesial a pampanid',
+'tooltip-t-specialpages' => 'Listaan ti amin nga espesial a pampanid',
 'tooltip-t-print' => 'Maimaldit a bersion ti panid',
 'tooltip-t-permalink' => 'Permanente a silpo idiay binaliwan daytoy a panid',
 'tooltip-ca-nstab-main' => 'Kitaen ti naglaon a panid',
@@ -2727,13 +2768,13 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-ca-nstab-category' => 'Kitaen ti panid ti kategoria',
 'tooltip-minoredit' => 'Markaan daytoy a kas bassit a panag-urnos',
 'tooltip-save' => 'Idulin dagiti sinukatam',
-'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasim ta usarem daytoy sakbay nga idulinmo ti panid!',
+'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasimnga usarem daytoy sakbay nga idulinmo ti panid!',
 'tooltip-diff' => 'Ipakita no ania dagiti sinukatan nga inaramidmo iti testo',
 'tooltip-compareselectedversions' => 'Kitaen ti naggidiatan dagiti dua a napili a bersion daytoy a panid.',
-'tooltip-watch' => 'Inayon daytoy a panid iti listaan dagiti bambantayam',
+'tooltip-watch' => 'Inayon daytoy a panid idiay listaan dagiti bambantayam',
 'tooltip-watchlistedit-normal-submit' => 'Ikkaten dagiti titulo',
 'tooltip-watchlistedit-raw-submit' => 'Pabaruen ti listaan ti bambantayan',
-'tooltip-recreate' => 'Aramidem ti panid uray no naikkat idin.',
+'tooltip-recreate' => 'Aramidem manen ti panid urayno dati a naikkat.',
 'tooltip-upload' => 'Rugian ti agip-ipan',
 'tooltip-rollback' => '"Baliktaden"   isubli ti inurnos (dagiti inurnos) ti daytoy a panid ti kinaudi a nangaramid iti maysa a takla',
 'tooltip-undo' => '"Ibabawi" ipasubli daytoy nga urnos ken lukatanna ti kinabuklan ti urnos iti panagpadas. Agpabalin daytoy a mangikabil ti rason idiay pinakabuklan.',
@@ -2744,25 +2785,26 @@ Mabalinmo a kitaen ti taudanna.',
 'notacceptable' => 'Ti server ti wiki ket saan a makaited ti data iti kinabuklan a saan a mabasa ti kliente.',
 
 # Attribution
-'anonymous' => 'Di am-ammo nga {{PLURAL:$1|agar-aramat|dagit agar-aramat}} iti {{SITENAME}}',
+'anonymous' => 'Di am-ammo {{PLURAL:$1|nga agar-aramat|kadagiti agar-aramat}} iti {{SITENAME}}',
 'siteuser' => '{{SITENAME}} nga agar-aramat $1',
 'anonuser' => '{{SITENAME}} di amammo nga agar-aramat $1',
 'lastmodifiedatby' => 'Daytoy a panid ket naudi a binalbaliwan idi $2, $1 ni $3.',
 'othercontribs' => 'Naibasar iti obra ni $1.',
 'others' => 'dadduma pay',
-'siteusers' => '!{{SITENAME}}  {{PLURAL:$2|agar-aramat|dagiti agar-aramat}}  $1',
-'anonusers' => '{{SITENAME}} di am-ammo {{PLURAL:$2|agar-aramat|digiti agar-aramat}} $1',
+'siteusers' => '{{SITENAME}}  {{PLURAL:$2|agar-aramat|dagiti agar-aramat}}  $1',
+'anonusers' => '{{SITENAME}} di am-ammo {{PLURAL:$2|nga agar-aramat|a digiti agar-aramat}} $1',
 'creditspage' => 'Dagiti pagdaydayaw ti panid',
 'nocredits' => 'Awan dagiti pakaammo ti pammadayaw nga adda ditoy a panid.',
 
 # Spam protection
 'spamprotectiontitle' => 'Panagsalaknib a sagat  para ti spam',
-'spamprotectiontext' => 'Ti teksto a kayat mo nga idulin ket sinerraan ti sagat ti spam.
-Daytoy ngata ket gapu ti panilpo a naiparit ti akin ruar a pagsaadan.',
+'spamprotectiontext' => 'Ti testo a kayatmo nga idulin ket sinerraan ti sagat ti spam.
+Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaadan.',
 'spamprotectionmatch' => 'Ti sumaganad a testo ti nangirugi ti sagat ti spam: $1',
 'spambot_username' => 'Panagdalus iti MediaWiki spam',
-'spam_reverting' => 'Ipasubli ti kinaudi a pinagbaliwan nga awan dagiti nagyanna a panilpo idiay $1',
-'spam_blanking' => 'Dagiti amin nga pinagbaliw ket adda panilpo na idiay $1, ipina-blanko',
+'spam_reverting' => 'Ipasubli ti kinaudi a panagbaliw nga awan dagiti linaon a panilpo idiay $1',
+'spam_blanking' => 'Dagiti amin a panagbaliw ket aglaon kadagiti panilpo idiay $1, iblanko',
+'spam_deleting' => 'Dagiti amin a panagbaliw ket naglaon kadagiti panilpo idiay $1, ik-ikkaten',
 
 # Info page
 'pageinfo-title' => 'Pakaammo para iti "$1"',
@@ -2770,7 +2812,7 @@ Daytoy ngata ket gapu ti panilpo a naiparit ti akin ruar a pagsaadan.',
 'pageinfo-header-watchlist' => 'Listaan ti bambantayan',
 'pageinfo-header-views' => 'Dagiti pangkitaan',
 'pageinfo-subjectpage' => 'Panid',
-'pageinfo-talkpage' => 'Pakipatangan a panid',
+'pageinfo-talkpage' => 'Tungtungan a panid',
 'pageinfo-watchers' => 'Bilang dagiti agbuybuya',
 'pageinfo-edits' => 'Bilang dagiti inurnos:',
 'pageinfo-authors' => 'Ti bilang dagiti sabsabali a mannurat',
@@ -2781,16 +2823,16 @@ Daytoy ngata ket gapu ti panilpo a naiparit ti akin ruar a pagsaadan.',
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
 'markaspatrolledtext' => 'Markaan daytoy a panid a kas napatruliaan',
 'markedaspatrolled' => 'Markaan a kas napatruliaan',
-'markedaspatrolledtext' => 'Ti napili a pinagbaliw iti [[:$1]] ket namarkaan a kas napatrulian.',
-'rcpatroldisabled' => 'Nabaldado ti pinagpatrulia kadagiti kinaudian a pinagbaliw',
+'markedaspatrolledtext' => 'Ti napili a panagbaliw iti [[:$1]] ket namarkaan a kas napatrulian.',
+'rcpatroldisabled' => 'Nabaldado ti panagpatrulia kadagiti kinaudian a pinagbaliw',
 'rcpatroldisabledtext' => 'Dagiti langa a patrulia ti kinaudi a pinagbaliwan ket agdama a nabaldado',
 'markedaspatrollederror' => 'Madi a mamarkaan a kas napatruliaan',
-'markedaspatrollederrortext' => 'Masapul nga ibagam ti markaan a kas napatruliaan a pinagbaliwan.',
-'markedaspatrollederror-noautopatrol' => 'Saan mo a mabalin a markaan dagita sinukatam a kas napatruliaan.',
+'markedaspatrollederrortext' => 'Nasken a naganam ti maysa a rebision tapno mamarkaan a kas napatruliaan.',
+'markedaspatrollederror-noautopatrol' => 'Saanmo a mabalin a markaan dagita sinukatam a kas napatruliaan.',
 
 # Patrol log
 'patrol-log-page' => 'Listaan ti napatruliaan',
-'patrol-log-header' => 'Daytoy ket listaan dagiti napatruliaan a pinagbaliwan.',
+'patrol-log-header' => 'Daytoy ket listaan dagiti napatruliaan a panagbabaliw.',
 'log-show-hide-patrol' => '$1 listaan ti napatruliaan',
 
 # Image deletion
@@ -2809,8 +2851,8 @@ $1',
 'nextdiff' => 'Sumaruno a naurnos →',
 
 # Media information
-'mediawarning' => "'''Ballaag'': Daytoy a papeles ket adda nagyan na a dakes a kodigo.
-No usarem ket, baka makompromiso ti sistema.",
+'mediawarning' => "'''Ballaag'': Daytoy a papeles ket naglaon ti dakes a kodigo.
+No usarem daytoy, baka makompromiso ti sistema.",
 'imagemaxsize' => "Ti patingga a kadakkel ti papeles:<br />''(para dagiti pagpalpalawag ti papeles a panid)''",
 'thumbsize' => 'Rukod ti imahen:',
 'widthheightpage' => '$1 × $2, $3 a {{PLURAL:$3|panid|pampanid}}',
@@ -2821,18 +2863,18 @@ No usarem ket, baka makompromiso ti sistema.",
 'svg-long-desc' => 'SVG a papeles, babassit ngem $1 × $2 pixels, kadakkel ti papeles: $3',
 'show-big-image' => 'Sibubukel a resolusion',
 'show-big-image-preview' => 'Kadakkel na daytoy a pagpadas: $1.',
-'show-big-image-other' => 'Sabali a {{PLURAL:$2|resolusion|dagiti resolusion}}: $1.',
+'show-big-image-other' => 'Sabali  {{PLURAL:$2|a resolusion|kadagiti resolusion}}: $1.',
 'show-big-image-size' => '$1 × $2 dagiti piksel',
 'file-info-gif-looped' => 'nasiluan',
-'file-info-gif-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}',
 'file-info-png-looped' => 'nasiluan',
-'file-info-png-repeat' => 'pinaayayam $1 {{PLURAL:$1|beses|beses}}',
-'file-info-png-frames' => '$1 {{PLURAL:$1|kuadro| dagiti kuadro}}',
+'file-info-png-repeat' => 'pinaayayam ti $1 {{PLURAL:$1|a beses|a beses}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|a kuadro| kadagiti kuadro}}',
 
 # Special:NewFiles
 'newimages' => 'Galeria dagiti kabarbaro a papeles',
 'imagelisttext' => "Adda dita baba ti listaan ti ''$1''' {{PLURAL:$1|a papeles|dagiti papeles}} a nailasin a kas $2.",
-'newimages-summary' => 'Daytoy nga espesial a panid ket ipakita na ti kinaudi a pinag-ipan kadagiti papeles.',
+'newimages-summary' => 'Daytoy nga espesial a panid ket ipakitana ti kinaudi a pinag-ipan kadagiti papeles.',
 'newimages-legend' => 'Sagat',
 'newimages-label' => 'Nagan ti papeles (wenno paset na) :',
 'showhidebots' => '($1 bots)',
@@ -2857,8 +2899,8 @@ Ania man a sumarsaruno a panpanilpo iti isu met la a linia ket maikonsidera kas
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Addaan daytoy a papeles iti nayon a pakaammo, a mabalin a nainayon manipud iti digital kamera wenno scanner a naaramat a pangpartuat wenno pang-digitize itoy.
-No ti papeles ket saan a nabalbaliwan manipud iti kasisigudna a kasasaad, sumagmamano a detalye ket mabalin a saan a sibubukel a mangipakita iti nabaliwan a papeles.',
+'metadata-help' => 'Daytoy a papeles ket naglaon ti naipatinayon a pakaammo, a mabalin a nainayon manipud ti digital a kamera wenno skanner a naaramat a pangpartuat wenno pang-digitize itoy.
+No ti papeles ket saan a nabalbaliwan manipud iti kasisigud a kasasaad, adda dagiti sumagmamano a salaysay a mabalin a saan a napno a maipakita ti nabaliwan a papeles.',
 'metadata-expand' => 'Ipakita dagiti napaatiddogan a salaysay',
 'metadata-collapse' => 'Ilemmeng dagiti napaatiddogan a salaysay',
 'metadata-fields' => 'Dagiti metadata a pagikabilana nakalista iti daytoy a mensahe ket mairaman iti maipakita a panid ti imahen no ti metadata a lamisaan ket maipabassit.
@@ -2883,7 +2925,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-bitspersample' => 'Bits tunggal maysa a  nagyan',
 'exif-compression' => 'Pekkelen a pamuspusan',
 'exif-photometricinterpretation' => 'Piksel a kabuklan',
-'exif-orientation' => 'Orientation',
+'exif-orientation' => 'Pagturongan',
 'exif-samplesperpixel' => 'Bilang ti nagnagyan',
 'exif-planarconfiguration' => 'Pinakaurnong ti datos',
 'exif-ycbcrsubsampling' => 'Subsampling ratio ti Y iti C',
@@ -2995,9 +3037,9 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-countrycodecreated' => 'Kodigo ti pagilian nga nakaalaan ti litrato',
 'exif-provinceorstatecreated' => 'Probinsia wenno estado nga nakaalaan ti litrato',
 'exif-citycreated' => 'Ti siudad nga nakaalaan ti litrato',
-'exif-sublocationcreated' => 'Sabali pay a lokasion ti ciudad a nakaalaan ti retrato',
+'exif-sublocationcreated' => 'Sabali pay a lokasion ti siudad a nakaalaan ti retrato',
 'exif-worldregiondest' => 'Paset ti lubong a naipakita',
-'exif-countrydest' => 'Naipakita nga pagilian',
+'exif-countrydest' => 'Naipakita a pagilian',
 'exif-countrycodedest' => 'Kodigo ti pagilian a naipakita',
 'exif-provinceorstatedest' => 'Probinsia wenno estado a naipakita',
 'exif-citydest' => 'Naipakita a siudad',
@@ -3007,12 +3049,12 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-headline' => 'Paulo',
 'exif-credit' => 'Pammadayaw/Nangted',
 'exif-source' => 'Taudan',
-'exif-editstatus' => 'Pinagurnos nga estado ti imahen',
+'exif-editstatus' => 'Panagurnos a kasasaad ti imahen',
 'exif-urgency' => 'Ganat',
 'exif-fixtureidentifier' => 'Nagan ti naikabit a banag',
 'exif-locationdest' => 'Lugar a naibaga',
 'exif-locationdestcode' => 'Kodigo ti lugar a naibaga',
-'exif-objectcycle' => 'Oras ti aldaw a maipanggepan iti daytoy a midia',
+'exif-objectcycle' => 'Oras ti aldaw a nairebbeng para iti daytoy a midia',
 'exif-contact' => 'Pakaammo ti pagdamagan',
 'exif-writer' => 'Mannurat',
 'exif-languagecode' => 'Pagsasao',
@@ -3027,7 +3069,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-serialnumber' => 'Agsasaruno a numero ti kamera',
 'exif-cameraownername' => 'Akinkukua ti kamera',
 'exif-label' => 'Etiketa',
-'exif-datetimemetadata' => 'Petsa ti kinaudi a binaliwan ti metadata',
+'exif-datetimemetadata' => 'Petsa ti kinaudi a panagbaliw ti metadata',
 'exif-nickname' => 'Di pormal a nagan ti imahen',
 'exif-rating' => 'Pategan (ti maysa kadagiti  5)',
 'exif-rightscertificate' => 'Paneknek ti panagtaripatu dagiti karbengan',
@@ -3038,8 +3080,8 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-originaldocumentid' => 'Naisangsangyan nga ID iti kinasigud a dokumento',
 'exif-licenseurl' => 'URL iti ti karbengan ti kopia a lisensia',
 'exif-morepermissionsurl' => 'Sabali a pakaammo ti lisensia',
-'exif-attributionurl' => 'No usaren manen daytoy nga obra, pangngaasi ta isilpo idiay',
-'exif-preferredattributionname' => 'No usaren manen daytoy nga obra, pangngaasi ta padayawen ni',
+'exif-attributionurl' => 'No usaren manen daytoy nga obra, pangngaasi nga agisilpo idiay',
+'exif-preferredattributionname' => 'No usaren manen daytoy nga obra, pangngaasi a padayawen ni',
 'exif-pngfilecomment' => 'Komentario ti PNG a papeles',
 'exif-disclaimer' => 'Dagiti karbengan ken rebbeng',
 'exif-contentwarning' => 'Ballaag ti nagyan',
@@ -3073,6 +3115,8 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-planarconfiguration-1' => 'chunky format',
 'exif-planarconfiguration-2' => 'planar format',
 
+'exif-colorspace-65535' => 'Di-nakalibrar',
+
 'exif-componentsconfiguration-0' => 'awan',
 
 'exif-exposureprogram-0' => 'Saan a naipalpalawag',
@@ -3186,8 +3230,8 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-gpslongitude-w' => 'Abagatan a longitude',
 
 # Pseudotags used for GPSAltitudeRef
-'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|metro|metro}} nga nangatngato ngem ti baybay',
-'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|metro|metro}} nga nababbaba ngem ti baybay',
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|a metro|kadagiti metro}} a nangatngato ngem ti baybay',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|a metro|kadagiti metro}} a nababbaba ngem ti baybay',
 
 'exif-gpsstatus-a' => 'Agrukrukoden',
 'exif-gpsstatus-v' => 'Panag-rukod ken pannakabin ti pang-usar ti sabali',
@@ -3239,6 +3283,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-iimcategory-dis' => 'Dagiti disatro ken aksidente',
 'exif-iimcategory-fin' => 'Ekonomia ken negosio',
 'exif-iimcategory-edu' => 'Edukasion',
+'exif-iimcategory-evn' => 'Enbironmento',
 'exif-iimcategory-hth' => 'Salun-at',
 'exif-iimcategory-hum' => 'Kaykayat ti tattao',
 'exif-iimcategory-lab' => 'Trabaho',
@@ -3254,41 +3299,42 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-urgency-normal' => 'Kadawyan ($1)',
 'exif-urgency-low' => 'Nababa ($1)',
 'exif-urgency-high' => 'Nangato ($1)',
+'exif-urgency-other' => 'Inpalawag ti agar-aramat a prioridad ($1)',
 
 # External editor support
 'edit-externally' => 'Baliwan daytoy a papeles babaen ti akinruar nga aplikasion',
 'edit-externally-help' => '(Kitaen ti [//www.mediawiki.org/wiki/Manual:External_editors instruksion iti panangikabil] para iti ad-adu pay a pakaammo).',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'am-amin',
+'watchlistall2' => 'amin',
 'namespacesall' => 'amin',
-'monthsall' => 'am-amin',
+'monthsall' => 'amin',
 'limitall' => 'amin',
 
 # E-mail address confirmation
 'confirmemail' => 'Pasingkedan ti e-surat a pagtaengam',
 'confirmemail_noemail' => 'Awan ti umisu nga e-surat a pagtaengam a naikabil idiay [[Special:Preferences|kaykayat ti agar-aramat]].',
-'confirmemail_text' => '{{SITNAME}} ket masapul na a pasingkedam ti e-surat a pagtaengam sakbay nga agusar ti -surat a langa.
-Ipabalin mo dita baba a buton ti pinagitulod ti pasingkedan a surat dita a pagtaengam.
-Ti surat ket addaan to ti panilpo nga adda nagyan na a kodigo;
-ikabil ti panilpo dita pagbasabasam ta mapasingkedam a ti e-surat a pagtaengam ket umisu.',
+'confirmemail_text' => 'Ti {{SITNAME}} ket masapulna a pasingkedam ti e-surat a pagtaengam sakbay nga agusar ti -surat a langa.
+Ipabalinmo dita baba a buton ti panagitulod ti pasingkedan a surat dita a pagtaengam.
+Ti surat ket mangiraman ti panilpo nga aglaon ti maysa a kodigo;
+ikabil ti panilpo dita pagbasabasam tapno mapasingkedam a ti e-surat a pagtaengam ket umisu.',
 'confirmemail_pending' => 'Ti pasingkedan a kodigo ket naipatulod kenkan:
 no kadamdama ka a nangaramid ti pakabilangam, aguray ka pay ti mano a minutos a sumangpet sakbay ka nga agpadas ti agkiddaw ti baro a kodigo.',
 'confirmemail_send' => 'Agipatulod ti pasingkedan a kodigo',
 'confirmemail_sent' => 'Naipatuloden ti pammasingked nga e-surat.',
 'confirmemail_oncreate' => 'Ti pakasingkedan a kodigo ket naipatulod dita e-surat a pagtaengam.
-Daytoy a kodigo ket saan a masapul ti sumrek, ngem masapul mo nga ited sakbay ka nga agpabalin kadagiti e-surat a langa ti wiki.',
-'confirmemail_sendfailed' => '{{SITENAME}} ket saan a makaipatulod ti pakasingkedan a surat.
-Pangngaasi ta kitaem ti e-surat a pagtaengam kadagiti maisu a kabalinan.
+Daytoy a kodigo ket saan a masapul ti sumrek, ngem masapulmo nga ited sakbay ka nga agpabalin kadagiti e-surat a langa ti wiki.',
+'confirmemail_sendfailed' => 'Ti {{SITENAME}} ket saan a makaipatulod ti pammasingke a surat.
+Pangngaasi a kitaem ti e-surat a pagtaengam para kadagiti imbalido a karakter.
 
 Insubli ti nangisurat: $1',
-'confirmemail_invalid' => 'Saan a mabalin a kodigo ti pammasingked.
-Nalabit a nagpason daytoy a kodigo.',
-'confirmemail_needlogin' => 'Masapulmo nga $1 tapno mapasingkedan ti e-surat a pagtaengam.',
+'confirmemail_invalid' => 'Imbalido a kodigo ti pammasingked.
+Mabalin a nagpaso daytoy a kodigo.',
+'confirmemail_needlogin' => 'Masapulmo ti $1 tapno mapasingkedan ti e-surat a pagtaengam.',
 'confirmemail_success' => 'Napasingkedanen ti e-surat a pagtaengam.
-Mabalinmon [[Special:UserLogin|sumrek]] ken naragsak a panag-wiki.',
+Mabalinmo tattan ti [[Special:UserLogin|sumrek]] ken nanamen ti wiki.',
 'confirmemail_loggedin' => 'Napasingkedanen ti e-surat a pagtaengam.',
-'confirmemail_error' => 'Adda banag a biddut iti panangidulin iti pammasingkedmo.',
+'confirmemail_error' => 'Adda banag a biddut ti panangidulin ti pammasingkedmo.',
 'confirmemail_subject' => 'Pammasingked ti e-surat a pagtaengan ti {{SITENAME}}',
 'confirmemail_body' => 'Addaan, baka sika, ti naggapu ti IP a pagtaengan $1,
 ket nagrehistro ti pakabilangan "$2" iti daytoy nga e-surat a pagtaengan idiay {{SITENAME}}
@@ -3298,12 +3344,12 @@ pinagpabalin ti e-surat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita
 
 $3
 
-No *saanmo* nga inrehistro ti pakabilangam, surutem daytoy a panilpo
+No *saanmo* nga inrehistro ti pakabilangam, surotem daytoy a panilpo
 ta pasardengem ti pinakasingkedan ti e-surat a  pagtaengam:
 
 $5
 
-Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
+Daytoy a pammasingked a kodigo ket agpaso iti $4.',
 'confirmemail_body_changed' => 'Addaan, baka sika, ti naggapu ti IP a apagtaengam $1,
 ket nangsukat ti e-surat a pagtaengan ti pakabilangan "$2" iti daytoy a pagtaengan idiay {{SITENAME}}
 
@@ -3332,8 +3378,8 @@ ta pasardengem ti pinakasingkedan ti e-surat a pagtaengam:
 $5
 
 Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
-'confirmemail_invalidated' => 'Saan a napapasingked ti e-surat a pagtaengam',
-'invalidateemail' => 'Ukasen ti pasingkedan ti e-surat',
+'confirmemail_invalidated' => 'Naukas ti pammasingked ti e-surat a pagtaengam',
+'invalidateemail' => 'Ukasen ti pammasingked ti e-surat',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Nabaldado ti Interwiki pinagiraman]',
@@ -3342,16 +3388,16 @@ Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Ballaag''': Naikkaten daytoy a panid kalpasan a rinugiam nga agurnos!",
-'confirmrecreate' => "Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkat na daytoy a panid idi kalkalpas mo a magirugi ti agurnos nga adda rason:
+'confirmrecreate' => "Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkatna daytoy a panid kalpasan ti panagrugim nga agurnos nga adda rason:
 : ''$2''
-Pangngaasi ta pasingkedam a kayatmo nga aramiden manen daytoy a panid.",
+Pangngaasi a pasingkedam nga agpayso a kayatmo a partuten manen daytoy a panid.",
 'confirmrecreate-noreason' => 'Ti ([[User talk:$1|patungtungan]]) ti agar-aramat [[User:$1|$1]] ket inikkat na daytoy a panid idi kalkalpas mo a magirugi ti agurnos. Pangngaasi ta pasingkedam a kayatmo nga aramiden manen daytoy a panid.',
 'recreate' => 'Partuaten manen',
 
 # action=purge
 'confirm_purge_button' => 'OK',
 'confirm-purge-top' => 'Dalusan ti cache daytoy a panid?',
-'confirm-purge-bottom' => 'Ti pinagpasadiwa ti panid ket ipalabas na ti cache ken pursaran na dagiti agdama a pinagbaliwan ti agparang.',
+'confirm-purge-bottom' => 'Ti panagpurga ti panid ket dalusanna ti cache ken pursaranna nga agparang dagiti kinaudi a panagbaliw.',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'OK',
@@ -3379,70 +3425,71 @@ Pangngaasi ta pasingkedam a kayatmo nga aramiden manen daytoy a panid.",
 
 # Auto-summaries
 'autosumm-blank' => 'Naikkat amin ti linaon ti panid',
-'autosumm-replace' => "Masukatan ti panid iti '$1'",
-'autoredircomment' => 'Maibawbaw-ing iti [[$1]]',
-'autosumm-new' => 'Inaramid ti panid iti "$1"',
+'autosumm-replace' => "Sinukatan ti linaon iti '$1'",
+'autoredircomment' => 'Naibaw-ing ti panid iti [[$1]]',
+'autosumm-new' => 'Pinartuat ti panid iti "$1"',
 
 # Live preview
 'livepreview-loading' => 'Maikarkarga…',
 'livepreview-ready' => 'Maikarkarga… Agsagana!',
-'livepreview-failed' => 'Madi a mabalin ti agdama a pagpadas! Padasem ti normal a pinagpadas.',
+'livepreview-failed' => 'Napaay ti agdama a panagipadas! 
+Padasem ti kadawyan a panagipadas.',
 'livepreview-error' => 'Napaay a sumilpo: $1 "$2". Padasem ti normal a pinagpadas',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|segundo|segundo}} ket mabalin a saan a maiparang itoy a listaan.',
-'lag-warn-high' => 'Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|segundo|segundo}} ket mabalin nga saan nga agparang ditoy nga listaan.',
+'lag-warn-normal' => 'Dagiti panangbalbaliw a nabarbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan a maiparang itoy a listaan.',
+'lag-warn-high' => 'Gapu ti kinabuntog ti database server, dagiti nasukatan a barbaro ngem $1 {{PLURAL:$1|a segundo|kadagiti segundo}} ket mabalin a saan nga agparang ditoy a listaan.',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Addaan ti listaan ti bambantayam iti {{PLURAL:$1|1 titulo|$1 dagiti titulo}}, di mairaman dagiti patungtungan a panid.',
-'watchlistedit-noitems' => 'Awan linaonna dagiti titulo ti listaan ti bambantayam.',
-'watchlistedit-normal-title' => 'Baliwan ti listaan ti bambantayan',
-'watchlistedit-normal-legend' => 'Ikkaten dagiti titulo iti listaan ti bambantayam',
-'watchlistedit-normal-explain' => 'Dagiti titulo ti bambantayam ket naipakita dita baba.
-Ti mangikkat ti titulo, ikur-it ti kaasideg na a kahon, ken agtakla ti "{{int:Watchlistedit-normal-submit}}".
-Mabalin mo met nga [[Special:EditWatchlist/raw|urnosen ti listaan a kilaw]].',
+'watchlistedit-numitems' => 'Addaan ti listaan ti bambantayam  {{PLURAL:$1|iti1 a titulo|kadagiti $1 a titulo}}, a di mairaman dagiti patungtungan a panid.',
+'watchlistedit-noitems' => 'Ti listaan ti banbantayam ket saan a naglaon kadagiti titulo.',
+'watchlistedit-normal-title' => 'Urnosem ti listaan ti bambantayan',
+'watchlistedit-normal-legend' => 'Ikkaten dagiti titulo manipud ti listaan ti bambantayam',
+'watchlistedit-normal-explain' => 'Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba.
+Ti mangikkat ti titulo, ikur-it ti kaaripingna a kahon, ken agtakla ti "{{int:Watchlistedit-normal-submit}}".
+Mabalinmo pay nga [[Special:EditWatchlist/raw|urnosen ti kilaw a listaan]].',
 'watchlistedit-normal-submit' => 'Ikkaten dagiti titulo',
 'watchlistedit-normal-done' => '{{PLURAL:$1|1 ti titulo a|$1 dagiti titulo a}} naikkat iti listaan ti bambantayam:',
-'watchlistedit-raw-title' => 'Urnosen ti kilaw a bambantayan',
-'watchlistedit-raw-legend' => 'Urnosen ti kilaw a bambantayan',
-'watchlistedit-raw-explain' => 'Dagiti titulo ti bambantayam ket naipakita dita baba, ken mabaliwam no nayunam, ken ikkaten idiay listaan;
+'watchlistedit-raw-title' => 'Urnosen ti kilaw a listaan ti bambantayan',
+'watchlistedit-raw-legend' => 'Urnosen ti kilaw a listaan ti bambantayan',
+'watchlistedit-raw-explain' => 'Dagiti titulo ti listaan ti bambantayam ket naipakita dita baba, ken mabaliwam nga urnosen babaen ti panagnayon ken panagkissay manipud ti listaan;
 maysa a titulo tunggal maysa a linia.
-No malpas ka, agtakla ti "{{int:Watchlistedit-raw-submit}}".
-Mabalin mo met nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
+No malpas ka, itakla ti "{{int:Watchlistedit-raw-submit}}".
+Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'watchlistedit-raw-titles' => 'Dagiti titulo:',
 'watchlistedit-raw-submit' => 'Pabaruen ti listaan ti bambantayan',
 'watchlistedit-raw-done' => 'Napabaro ti listaan ti bambantayam.',
-'watchlistedit-raw-added' => '{{PLURAL:$1|1 ti titulo a|$1 dagiti titulo a}} nainayon:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 ti titulo a|$1 dagiti titulo a}} naikkat:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 a titulo ti|dagiti $1 a titulo ti}} nainayon:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 a titulo ti|dagiti $1 dagiti titulo ti}} naikkat:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Kitaen dagiti napatpateg a sinukatan',
-'watchlisttools-edit' => 'Kitaen ken baliwan ti listaan ti bambantayan',
-'watchlisttools-raw' => 'Urnosen ti kilaw a bambantayan',
+'watchlisttools-view' => 'Kitaen dagiti maitunos a sinukatan',
+'watchlisttools-edit' => 'Kitaen ken urnosen ti listaan ti bambantayan',
+'watchlisttools-raw' => 'Urnosen ti kilaw a listaan ti bambantayan',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|patang]])',
 
 # Core parser functions
-'unknown_extension_tag' => 'Di ammo a pagpaatiddog a tag "$1"',
-'duplicate-defaultsort' => '\'\'\'Ballaag:\'\'\' Kinasigud a pinagilasin ti "$2" ket sukatan na ti immuna a kinasigud a pinagilasin "$1".',
+'unknown_extension_tag' => 'Di amammo a pagpaatiddog nga etiketa "$1"',
+'duplicate-defaultsort' => '\'\'\'Ballaag:\'\'\' Kinasigud a panagilasin ti "$2" ket sukatanna ti immuna a kinasigud a panagilasin "$1".',
 
 # Special:Version
 'version' => 'Bersion',
 'version-extensions' => 'Dagiti naikabil a pagpaatiddog',
 'version-specialpages' => 'Espesial a pampanid',
-'version-parserhooks' => 'Parser a kawit',
-'version-variables' => 'Sabsabali',
+'version-parserhooks' => 'Dagiti parser a kawit',
+'version-variables' => 'Nadumaduma a kita',
 'version-antispam' => 'Pawilan ti spam',
 'version-skins' => 'Dagiti Kudil',
 'version-other' => 'Sabali',
-'version-mediahandlers' => 'Agiggem kadagiti media',
+'version-mediahandlers' => 'Agtengtengngel kadagiti midia',
 'version-hooks' => 'Dagiti kawit',
-'version-extension-functions' => 'Pagpaatiddog nga opisio',
-'version-parser-extensiontags' => 'Dagiti pagpaatiddog nga etiketa a parser',
-'version-parser-function-hooks' => 'Parser nga opisio a kawit',
+'version-extension-functions' => 'Dagiti pagpaatiddog a pamay-an',
+'version-parser-extensiontags' => 'Dagiti parser a pagpaatiddog nga etiketa',
+'version-parser-function-hooks' => 'Parser a pamay-an dagiti kawit',
 'version-hook-name' => 'Nagan ti kawit',
-'version-hook-subscribedby' => 'Umanamong ni',
+'version-hook-subscribedby' => 'Umanamong babaen ti',
 'version-version' => '(Bersion $1)',
 'version-license' => 'Lisensia',
 'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
@@ -3455,12 +3502,15 @@ Naka-awat ka kuman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'version-software' => 'Naikabil a software',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Bersion',
+'version-entrypoints' => 'Paserrekan a puntos dagiti URL',
+'version-entrypoints-header-entrypoint' => 'Pagserrekan a puntos',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dalanan ti papeles',
 'filepath-page' => 'Papeles:',
 'filepath-submit' => 'Inkan',
-'filepath-summary' => 'Daytoy nga espesiala panid ket agisubli ti kompleto a dalan ti papeles.
+'filepath-summary' => 'Daytoy nga espesial a panid ket agisubli ti kompleto a dalan ti papeles.
 Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket mangrugi da a idiay nakairamanan da a programa.',
 
 # Special:FileDuplicateSearch
@@ -3470,8 +3520,8 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'fileduplicatesearch-filename' => 'Nagan ti papeles:',
 'fileduplicatesearch-submit' => 'Biruken',
 'fileduplicatesearch-info' => '$1 × $2 pixel<br />Rukod ti papeles: $3<br />Kita ti MIME: $4',
-'fileduplicatesearch-result-1' => 'Awanan iti kapadpada na a duplikado ti papeles a "$1".',
-'fileduplicatesearch-result-n' => 'Ti papeles a "$1" ket addaan {{PLURAL:$2|1 nga agpadpada a duplikado|$2 dagiti agpadpada a duplikado}}.',
+'fileduplicatesearch-result-1' => 'Awan ti kapadpadana a duplikado ti papeles a "$1".',
+'fileduplicatesearch-result-n' => 'Ti papeles a "$1" ket addaan {{PLURAL:$2|1 nga agpadpada a duplikado|dagiti $2  nga agpadpada a duplikado}}.',
 'fileduplicatesearch-noresults' => 'Awan ti nagan ti papeles a "$1" ti nabirukan.',
 
 # Special:SpecialPages
@@ -3486,7 +3536,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'specialpages-group-changes' => 'Kaudian a sinukatan ken listaan',
 'specialpages-group-media' => 'Dagiti padamag ti media ken panag-ipan',
 'specialpages-group-users' => 'Dagiti agar-aramat ken karkarbengan',
-'specialpages-group-highuse' => 'Adu ti panaka-usar na a pampanid',
+'specialpages-group-highuse' => 'Adu ti panaka-usar a pampanid',
 'specialpages-group-pages' => 'Listaan dagiti panid',
 'specialpages-group-pagetools' => 'Dagiti ramramit ti panid',
 'specialpages-group-wiki' => 'Linaon ti wiki ken ramramit',
@@ -3494,8 +3544,8 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'specialpages-group-spam' => 'Ramramit kontra spam',
 
 # Special:BlankPage
-'blankpage' => 'Awan ti nagyan na a panid',
-'intentionallyblankpage' => 'Daytoy a panid  ket naikaro a blanko.',
+'blankpage' => 'Blanko a panid',
+'intentionallyblankpage' => 'Daytoy a panid  ket naigagara a blanko.',
 
 # External image whitelist
 'external_image_whitelist' => ' #Baybayan daytoy a linia a kastoy<pre>
@@ -3515,18 +3565,18 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'tags-intro' => 'Daytoy a panid ket ilista na dagiti etiketa nga usaren ti software nga agmarka ti panag-urnos, ken dagiti kayat da a saoen.',
 'tags-tag' => 'Nagan ti etiketa',
 'tags-display-header' => 'Tabas dagiti listaan ti panagsukat',
-'tags-description-header' => 'Amin a panagipalpalawag ti kayat na a saoen.',
+'tags-description-header' => 'Napno a panangipalpalawag iti kayatna a saoen.',
 'tags-hitcount-header' => 'Dagiti etiketa a sinukatan',
 'tags-edit' => 'urnosen',
-'tags-hitcount' => '$1 {{PLURAL:$1|sinukatan|dagiti sinukatan}}',
+'tags-hitcount' => '$1 {{PLURAL:$1|a sinukatan|kadagiti sinukatan}}',
 
 # Special:ComparePages
 'comparepages' => 'Ipada dagiti panid',
 'compare-selector' => 'Ipada dagiti panagbaliw ti panid',
 'compare-page1' => 'Panid 1',
 'compare-page2' => 'Panid 2',
-'compare-rev1' => 'Pinagbaliw 1',
-'compare-rev2' => 'Pinagbaliw 2',
+'compare-rev1' => 'Panagbaliw 1',
+'compare-rev2' => 'Panagbaliw 2',
 'compare-submit' => 'Ipada',
 'compare-invalid-title' => 'Ti titulo nga intedmo ket imbalido.',
 'compare-title-not-exists' => 'Awan met dayta titulo a nainaganam.',
@@ -3555,21 +3605,21 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'htmlform-selectorother-other' => 'Sabali',
 
 # SQLite database support
-'sqlite-has-fts' => '$1 adda ti suporta amin a teksto ti pinagbiruk',
-'sqlite-no-fts' => '$1 awan ti suporta amin a teksto ti pinagbiruk',
+'sqlite-has-fts' => '$1 adda ti suporta ti napno a teksto ti panagbiruk',
+'sqlite-no-fts' => '$1 awan ti suporta ti napno a teksto ti panagbiruk',
 
 # New logging system
-'logentry-delete-delete' => 'inikkat ni $1 daytoy panid  nga $3',
-'logentry-delete-restore' => 'insubli ni $1 daytoy panid nga $3',
-'logentry-delete-event' => '$1 pinagsukat ti pinagkita iti {{PLURAL:$5|listaan ti pasamak |$5 dagiti listaan ti pasamak }} iti $3: $4',
-'logentry-delete-revision' => '$1 pinagsukat ti pinagkita iti {{PLURAL:$5|pinagbaliw |$5 dagiti pinagbaliw}} iti panid $3: $4',
-'logentry-delete-event-legacy' => '$1 pinagsukat a pinagkita ti listaan dagiti pasamak idiay $3',
-'logentry-delete-revision-legacy' => '$1 pinagsukat a pinagkita dagiti pinagbaliw idiay panid $3',
-'logentry-suppress-delete' => '$1 napasardeng a panid $3',
-'logentry-suppress-event' => '$1 nasekreto pinagsukat ti pinagkita iti {{PLURAL:$5|listaan ti pasamak |$5 dagiti listaan ti pasamak }} iti $3: $4',
-'logentry-suppress-revision' => '$1 nasekreto pinagsukat ti pinagkita iti {{PLURAL:$5|pinagbaliw |$5 dagiti pinagbaliw}} iti panid $3: $4',
-'logentry-suppress-event-legacy' => '$1 nasekreto ti pinagsukat a pinagkita ti listaan dagiti pasamak idiay $3',
-'logentry-suppress-revision-legacy' => '$1 nasekreto ti pinagsukat a pinagkita dagiti pinagbaliw idiay panid $3',
+'logentry-delete-delete' => 'Inikkat ni $1 ti panid  ti $3',
+'logentry-delete-restore' => 'Insubli ni $1 ti panid ti $3',
+'logentry-delete-event' => 'Sinukatan ni $1  ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
+'logentry-delete-revision' => 'Sinukatan ni $1 ti panagkita  {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
+'logentry-delete-event-legacy' => 'Sinukatan ni $1  ti panagkita ti listaan dagiti pasamak idiay $3',
+'logentry-delete-revision-legacy' => 'Sinukatan ni $1 ti panagkita dagiti panagbaliw idiay panid $3',
+'logentry-suppress-delete' => 'Pinasardeng ni $1 ti panid ti $3',
+'logentry-suppress-event' => 'Sekreto a sinukatan ni $1 ti panagkita {{PLURAL:$5|iti listaan ti pasamak |dagiti $5 a listaan ti pasamak }} iti $3: $4',
+'logentry-suppress-revision' => 'Sekreto a sinukatan ni $1 ti panagkita {{PLURAL:$5|iti panagbaliw |dagiti $5 a panagbaliw}} iti panid $3: $4',
+'logentry-suppress-event-legacy' => 'Sekreto a sinukatan ni $1 ti panagkita ti listaan dagiti pasamak idiay $3',
+'logentry-suppress-revision-legacy' => 'Sekreto a sinukatan ni $1  ti panagkita dagiti panagbaliw idiay panid $3',
 'revdelete-content-hid' => 'nailemmeng ti nagyan na',
 'revdelete-summary-hid' => 'nailemmeng ti pakabuklan a naurnos',
 'revdelete-uname-hid' => 'nailemmeng ti nagan ti agar-aramat',
@@ -3578,21 +3628,21 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'revdelete-uname-unhid' => 'saan a nailemmeng ti nagan ti agar-aramat',
 'revdelete-restricted' => 'naipakat dagiti pammarit kadagiti administrador',
 'revdelete-unrestricted' => 'naikkat dagiti pammarit para kadagiti administrador',
-'logentry-move-move' => 'inyalis ni  $1 daytoy panid $3 idiay $4',
-'logentry-move-move-noredirect' => '$1 inyalis ti panid $3 idiay $4 nga awan ti naibati a baw-ing',
-'logentry-move-move_redir' => '$1 inyalis ti panid $3 idiay $4 nga adda baw-ing',
-'logentry-move-move_redir-noredirect' => '$1 iniyalis ti panid $3 idiay $4 nga inikkan ti baw-ing ngem saan a nagibati ti baw-ing',
-'logentry-patrol-patrol' => '$1 markaan ti pinagbaliw $4 ti panid  $3 a napatruliaan',
-'logentry-patrol-patrol-auto' => '$1 automatiko a markaan ti panagbaliw $4 ti panid $3 a napatruliaan',
-'logentry-newusers-newusers' => '$1 nakaaramid ti pakabilangan ti agar-aramat',
-'logentry-newusers-create' => '$1 nakaaramid ti pakabilangan ti agar-aramat',
-'logentry-newusers-create2' => '$1 nakaaramid ti pakabilangan ti agar-aramat $3',
-'logentry-newusers-autocreate' => 'Ti pakabilangan $1 ket  naaramid nga automatiko',
+'logentry-move-move' => 'Inyalis ni  $1 daytoy panid $3 idiay $4',
+'logentry-move-move-noredirect' => 'Inyalis ni $1  ti panid ti $3 idiay $4 a saan a nangibati ti baw-ing',
+'logentry-move-move_redir' => 'Inyalis ni $1 ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing',
+'logentry-move-move_redir-noredirect' => 'Inyalis ni $1 ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
+'logentry-patrol-patrol' => 'Minarkaan ni $1 ti panagbaliw a $4 ti panid ti  $3 a napatruliaan',
+'logentry-patrol-patrol-auto' => 'Automatiko a minarkaan ni $1 ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
+'logentry-newusers-newusers' => 'Nagpartuat ni $1 ti pakabilangan ti  agar-aramat',
+'logentry-newusers-create' => 'Nagpartuat ni $1 ti pakabilangan ti agar-aramat',
+'logentry-newusers-create2' => 'Nagpartuat ni $1 ti pakabilangan ti agar-aramat ti $3',
+'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
 'newuserlog-byemail' => 'naipatulod ti kontrasenias ti e-surat',
 
 # Feedback
-'feedback-bugornote' => 'No agsagana kan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi a [$1 ireporta ti kiteb].
-Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket mainayon iti panid "[$3 $2], a mairaman ti nagan mo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.',
+'feedback-bugornote' => 'No agsagana kan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti kiteb].
+Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mainayon iti panid "[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.',
 'feedback-subject' => 'Suheto:',
 'feedback-message' => 'Mensahe:',
 'feedback-cancel' => 'Ukasen',
@@ -3603,17 +3653,17 @@ Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket m
 'feedback-error3' => 'Biddut: Awan ti sungbat manipud iti API',
 'feedback-thanks' => 'Agyaman! Ti panangparupaam ket naipablaak iti panid "[$2 $1]".',
 'feedback-close' => 'Nalpasen',
-'feedback-bugcheck' => 'Nasayaaten! Kitem tapno met saan a dagita adaanen a [$1 dagiti amammo a kiteb].',
+'feedback-bugcheck' => 'Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga amammo a kitkiteb].',
 'feedback-bugnew' => 'Kinitak. Ireporta ti baro a kiteb',
 
 # API errors
 'api-error-badaccess-groups' => 'Saan mo a mabalin ti agipan kadagiti papeles iti daytoy a wiki.',
 'api-error-badtoken' => 'Kinauneg a biddut: Dakes a tandaan.',
 'api-error-copyuploaddisabled' => 'Ti mangipan babaen ti URL ket nabaldado ditoy a server.',
-'api-error-duplicate' => 'Adda {{PLURAL:$1|ket [$2 sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyan da.',
-'api-error-duplicate-archive' => 'Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabalia papeles]}} nga adda ditoy a pagsaadan nga agpada ti nagyan da, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.',
+'api-error-duplicate' => 'Adda {{PLURAL:$1|ket [$2 sabali a papeles] |dagiti [$2 sabsabali a papeles]}} nga addan ditoy a pagsaadan nga agpada ti nagyan da.',
+'api-error-duplicate-archive' => 'Adda {{PLURAL:$1|idi [$2 sabali a papeles]|dagidi [$2 sabali a papeles]}} nga adda ditoy a pagsaadan nga agpada ti nagyan da, ngem {{PLURAL:$1|daytoy|dagitoy}} ket naikkat.',
 'api-error-duplicate-archive-popup-title' => 'Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}} a naikkaten.',
-'api-error-duplicate-popup-title' => 'Duplikado {{PLURAL:$1|papeles|dagiti papeles}}',
+'api-error-duplicate-popup-title' => 'Duplikado {{PLURAL:$1|ti papeles|dagiti papeles}}.',
 'api-error-empty-file' => 'Ti papeles nga intedmo ket awan ti nagyan na.',
 'api-error-emptypage' => 'Agar-aramid ti baro, dagiti awan ti linaon na a panid ket saan a maipalubos.',
 'api-error-fetchfileerror' => 'Kinauneg a biddut: Addaan ti dakes a napasamak idi agalala ti papeles.',
@@ -3621,7 +3671,7 @@ Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket m
 'api-error-filename-tooshort' => 'Ti nagan daytoy a papeles ket bassit unay.',
 'api-error-filetype-banned' => 'Ti kita daytoy a papeles ket maiparit.',
 'api-error-filetype-missing' => 'Ti papeles ket agkurang ti pagpa-atiddog.',
-'api-error-hookaborted' => 'Ti pinagbabaro a pinadas mo ket napasardeng iti pangpa-atiddog a kawit.',
+'api-error-hookaborted' => 'Ti panagbabaro a pinadasmo ket napasardeng iti pangpa-atiddog a kawit.',
 'api-error-http' => 'Kinauneg a biddut: Saan a makaikabit idiay server.',
 'api-error-illegal-filename' => 'Ti nagan daytoy a papeles ket saan a maipalubos.',
 'api-error-internal-error' => 'Kinauneg a biddut: Addaan ti dakes a napasamak ti panagaramid ti panagipan mo iti daytoy a wiki.',
@@ -3644,4 +3694,15 @@ Nupay kasta, mau-sar mo ti nakabuklan dita baba. Ti komentario nga ited mo ket m
 'api-error-uploaddisabled' => 'Nabaldado ti mangipapan iti daytoy a wiki.',
 'api-error-verification-error' => 'Dakes ngata daytoy a papeles, wenno addaan ti madi a pagpa-atiddog.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|seg-segundo}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|min-minuto}}',
+'duration-hours' => '$1 {{PLURAL:$1|oras|or-oras}}',
+'duration-days' => '$1 {{PLURAL:$1|aldaw|al-aldaw}}',
+'duration-weeks' => '$1 {{PLURAL:$1|lawas|law-lawas}}',
+'duration-years' => '$1 {{PLURAL:$1|tawen|taw-tawen}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekada|dek-dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
+
 );
index 2cef3f3..9720672 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Amire80
+ * @author Reedy
  * @author Sapral Mikail
  * @author Tagir
  */
@@ -399,7 +400,7 @@ $messages = array(
 Шун йийшая, кхыдола йоазувнашкахь [[Special:Search/{{PAGENAME}}|дола цӀерий хаттам корае]] е <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} нийсамий тептара йоазувнаш корае].</span>',
 'note' => "'''ХӀамоалар:'''",
 'previewnote' => "'''Хьалхе б|аргтассам мара бац.'''
-Яздам кха яздаь дац! [[#editform|→ хувцам д|ахьо д|аде]]",
+Яздам кха яздаь дац!",
 'editing' => 'ГӀалатнийсдар: $1',
 'editingsection' => 'ГIалатнийсдар $1 (оагӀувдакъа)',
 'editingcomment' => 'ГӀалатнийсдар $1 (керда декъам)',
@@ -481,7 +482,6 @@ $messages = array(
 
 # Diffs
 'history-title' => '"$1" хувцамий искар',
-'difference' => '(Доржамашкахь юкъера къоастамаш)',
 'lineno' => 'МугI $1:',
 'compareselectedversions' => 'Хьаржа доржамаша тарона тIа хьажа',
 'editundo' => 'юхавала/яла',
@@ -626,7 +626,7 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|хувцам|хувцамаш}}',
 'recentchanges' => 'Керда хувцамаш',
 'recentchanges-legend' => 'Керда хувцамий оттамаш',
-'recentchangestext' => 'КIалхагIа лоарамий доаламе тIехьара оагIувний хувцамаш дIаязадаь да{{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-summary' => 'КIалхагIа лоарамий доаламе тIехьара оагIувний хувцамаш дIаязадаь да{{grammar:genitive|{{SITENAME}}}}.',
 'recentchanges-feed-description' => 'Укх ларамца тIехьара викихувцамашт теркам бе.',
 'recentchanges-label-newpage' => 'Укх хувцамаца керда оагIув даь хиннад',
 'recentchanges-label-minor' => 'ЗIамига хувцам я',
@@ -1135,7 +1135,7 @@ $messages = array(
 #Укх # тамагIалгаца дIадувлаш дола мугIанаш, оалам мо лоархаш да.
 #МугIанаш яздaтакха каьда да
 
-#Каст-каста оаламаш укх мугIа лакхе дIаязаде. Из мугI ший долаш тайпара дита<pre>',
+#Каст-каста оаламаш укх мугIа лакхе дIаязаде. Из мугI ший долаш тайпара дита</pre>',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Йоазоний]] цIенаярг:',
index fbba123..89752bb 100644 (file)
@@ -550,6 +550,7 @@ Voluntez konfirmez se vu volas krear/redaktar ica pagino.',
 Voluntez probar itere.
 Se ol ankore nefuncionas, probez [[Special:UserLogout|ekirar]] e pose enirar.",
 'editing' => 'Vu redaktas $1',
+'creating' => 'Vu kreas $1',
 'editingsection' => 'Vu redaktas $1 (seciono)',
 'editingcomment' => 'Vu redaktas $1 (nova seciono)',
 'editconflict' => 'Redakto-konflikto: $1',
@@ -637,7 +638,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 
 # Diffs
 'history-title' => 'Versionaro di "$1"',
-'difference' => '(Diferi inter versioni)',
 'lineno' => 'Lineo $1:',
 'compareselectedversions' => 'Komparar selektita versioni',
 'editundo' => 'des-facez',
@@ -811,7 +811,7 @@ Ol mustas ne havar plu kam $1 {{PLURAL:$1|litero|literi}}.',
 'nchanges' => '$1 {{PLURAL:$1|chanjo|chanji}}',
 'recentchanges' => 'Recenta chanji',
 'recentchanges-legend' => 'Recenta chanji preferaji',
-'recentchangestext' => 'Regardez la maxim recenta chanji en Wiki per ica pagino.',
+'recentchanges-summary' => 'Regardez la maxim recenta chanji en Wiki per ica pagino.',
 'recentchanges-label-newpage' => 'Ca redaktajo kreis nova pagino',
 'recentchanges-label-minor' => 'Ica es mikra redaktajo',
 'recentchanges-label-bot' => 'Ta chanjo facita da bot',
index a61bf30..62e2fcd 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Icelandic (Ã\8dslenska)
+/** Icelandic (íslenska)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -616,7 +616,7 @@ $2',
 Ástæðan sem gefin var ''$2''.",
 'filereadonlyerror' => 'Ekki var hægt að breyta skránni "$1" því skráin í skráarsafninu "$2" er engöngu hægt að lesa.
 
-Ástæðan fyrir þessu er "\'\'$3\'\'".',
+Möppudýrið sem læsti skránni gaf þessa ástæðu: "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Slæm stilling: óþekktur veiruskannari: ''$1''",
@@ -647,7 +647,7 @@ Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum
 'userlogout' => 'Útskrá',
 'notloggedin' => 'Ekki innskráð(ur)',
 'nologin' => "Ekki með aðgang? '''$1'''.",
-'nologinlink' => 'Stofnaðu til aðgangs',
+'nologinlink' => 'Stofnaðu aðgang',
 'createaccount' => 'Nýskrá',
 'gotaccount' => "Nú þegar með notandanafn? '''$1'''.",
 'gotaccountlink' => 'Skráðu þig inn',
@@ -910,6 +910,7 @@ Síðasta færsla notandans úr bönnunarskrá er sýnd hér fyrir neðan til sk
 'updated' => '(Uppfært)',
 'note' => "'''Athugið:'''",
 'previewnote' => "'''Það sem sést hér er aðeins forskoðun og hefur ekki enn verið vistað!'''",
+'continue-editing' => 'Halda áfram að breyta',
 'previewconflict' => 'Þessi forskoðun endurspeglar textann í efra breytingarsvæði eins og hann myndi líta út ef þú vistar.',
 'session_fail_preview' => "'''Því miður! Gat ekki unnið úr breytingum þínum vegna týndra lotugagna.
 Vinsamlegast reyndu aftur síðar. Ef það virkar ekki heldur skaltu reyna að skrá þig út og inn á ný.'''",
@@ -924,6 +925,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',
@@ -1081,17 +1083,25 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGE
 'revdelete-show-file-submit' => 'Já',
 'revdelete-selected' => "'''{{PLURAL:$2|Valin breyting|Valdar breytingar}} fyrir [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Valin aðgerð|Valdar aðgerðir}}:'''",
+'revdelete-text' => "'''Eyddar útgáfur og breytingar munu birtast áfram í breytingarskrá síðunnar og í aðgerðarskrám, en hluti upplýsingana verða falin almenningi.'''
+Önnur möppudýr á {{SITENAME}} hafa aðgang að földu upplýsingunum og geta endurvakið upplýsingarnar í gegnum sama viðmót, nema sérstakar takmarkanir séu virkar.",
+'revdelete-confirm' => 'Vinsamlegast staðfestu að þú viljir gera þetta, að þú skiljir afleiðingarnar og að þú sért að gera þetta í samræmi við  [[{{MediaWiki:Policy-url}}]].',
+'revdelete-suppress-text' => "Bælingu á '''eingöngu''' að nota í eftirfarandi tilfellum:
+* Mögulegar ærumleiðandi upplýsingar
+* Óviðeigandi persónulegar upplýsingar
+*: ''heimilisfang, símanúmer, kennitala, osfrv.''",
 'revdelete-legend' => 'Setja sjáanlegar hamlanir',
 'revdelete-hide-text' => 'Fela breytingatexta',
 'revdelete-hide-image' => 'Fela efni skráar',
 'revdelete-hide-name' => 'Fela aðgerð og mark',
-'revdelete-hide-comment' => 'Fela breytingaathugasemdir',
+'revdelete-hide-comment' => 'Fela breytingarágrip',
 'revdelete-hide-user' => 'Fela notandanafn/vistfang',
 'revdelete-hide-restricted' => 'Dylja gögn frá stjórnendum og öðrum',
 'revdelete-radio-same' => '(ekki breyta)',
 'revdelete-radio-set' => 'Já',
 'revdelete-radio-unset' => 'Nei',
 'revdelete-suppress' => 'Dylja gögn frá stjórnendum og öðrum',
+'revdelete-unsuppress' => 'Fjarlægja takmarkanir á endurvöktum breytingum',
 'revdelete-log' => 'Ástæða:',
 'revdelete-submit' => 'Setja á {{PLURAL:$1|valda breytingu|valdar breytingar}}',
 'revdel-restore' => 'Breyta sýn',
@@ -1099,8 +1109,23 @@ Frekari upplýsingar eru í [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGE
 'revdel-restore-visible' => 'sýnilegar breytingar',
 'pagehist' => 'Breytingaskrá',
 'deletedhist' => 'Eyðingaskrá',
+'revdelete-hide-current' => 'Mistókst að fela breytingu frá $1 $2: Þetta er núverandi útgáfa síðunnar.
+Ekki er hægt að fela hana.',
+'revdelete-show-no-access' => 'Mistókst að sýna breytingu frá $1 $2: Þessi breyting hefur verið merkt sem "takmörkuð".
+Þú hefur ekki aðgang að henni.',
+'revdelete-no-change' => "'''Viðvörun:''' Breytingin frá $1 $2 hefur þegar umbeðnar sýnileika stillingar.",
+'revdelete-only-restricted' => 'Mistókst að fela breytingu frá $1 $2: Þú getur ekki falið breytingu fyrir möppudýrum án þess að velja eina af hinum sýnileika stillingunum.',
+'revdelete-reason-dropdown' => '*Algengar eyðingarástæður
+** Höfundarréttarbrot
+** Óviðeigandi persónuuplýsingar
+** Mögulega ærumleiðandi upplýsingar',
+'revdelete-otherreason' => 'Aðrar/fleiri ástæður:',
+'revdelete-reasonotherlist' => 'Önnur ástæða',
 'revdelete-edit-reasonlist' => 'Eyðingarástæður',
 
+# Suppression log
+'suppressionlog' => 'Bælingarskrá',
+
 # History merging
 'mergehistory' => 'Sameina breytingaskrár',
 'mergehistory-header' => 'Þessi síða gerir þér kleift að sameina breytingarskrá tveggja síðna.
@@ -1118,8 +1143,9 @@ Sjáðu til þess að þessi breyting sameini breytingarskrárnar samfellt.',
 'mergelogpagetext' => 'Þetta er skrá yfir síðustu sameiningar einnar síðu við aðra.',
 
 # Diffs
-'history-title' => 'Breytingaskrá fyrir "$1"',
-'difference' => '(Munur milli útgáfa)',
+'history-title' => '$1: Breytingaskrá',
+'difference-title' => '$1: Munur á milli útgáfa',
+'difference-title-multipage' => '$1 og $2: Munur á milli síðna',
 'difference-multipage' => '(Munur á milli síðna)',
 'lineno' => 'Lína $1:',
 'compareselectedversions' => 'Bera saman valdar útgáfur',
@@ -1239,7 +1265,7 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 'columns' => 'Dálkar',
 'searchresultshead' => 'Leit',
 'resultsperpage' => 'Niðurstöður á síðu',
-'stub-threshold' => 'Þröskuldur fyrir sniði <a href="#" class="stub">stubbatengla</a> (bæt):',
+'stub-threshold' => 'Þröskuldur fyrir <a href="#" class="stub">stubbatengla</a> (bæt):',
 'stub-threshold-disabled' => 'Óvirkt',
 'recentchangesdays' => 'Fjöldi daga sem nýlegar breytingar ná yfir:',
 'recentchangesdays-max' => '(hámark $1 {{PLURAL:$1|dag|daga}})',
@@ -1478,7 +1504,7 @@ Tölvupóstfang þitt er ekki gefið upp þegar aðrir notendur hafa samband vi
 'nchanges' => '$1 {{PLURAL:$1|breyting|breytingar}}',
 'recentchanges' => 'Nýlegar breytingar',
 'recentchanges-legend' => 'Stillingar nýlegra breytinga',
-'recentchangestext' => 'Hér geturðu fylgst með nýjustu breytingunum.',
+'recentchanges-summary' => 'Hér geturðu fylgst með nýjustu breytingunum.',
 'recentchanges-feed-description' => 'Hér er hægt að fylgjast með nýlegum breytingum á {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Þessi breyting skapaði nýja síðu',
 'recentchanges-label-minor' => 'Þetta er minniháttar breyting',
@@ -2349,7 +2375,7 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Nafnrými:',
 'invert' => 'allt nema valið',
-'tooltip-invert' => 'Hakaðu við þennan kassa til að fela breytingar á síðum innan við ákveðið nafnrými',
+'tooltip-invert' => 'Hakaðu við þennan kassa til að fela breytingar á síðum innan ákveðins nafnrýmis',
 'namespace_association' => 'Tengd nafnrými',
 'tooltip-namespace_association' => 'Hakaðu við þennan kassa til að hafa með spjallsíður eða tengd nafnrými.',
 'blanknamespace' => '(Aðalnafnrýmið)',
@@ -3313,7 +3339,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:
@@ -3627,7 +3653,7 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-filename-tooshort' => 'Skráarnafnið er of stutt',
 'api-error-filetype-banned' => 'Þessi gerð skráar er bönnuð.',
 'api-error-filetype-missing' => 'Skráin hefur enga skráarendingu.',
-'api-error-hookaborted' => 'Hætt var við breytinguna sem þú reyndir að gera af viðbótar haka.',
+'api-error-hookaborted' => 'Hætt var við breytinguna sem þú reyndir að gera með viðbót.',
 'api-error-http' => 'Innri villa: Get ekki tengst vefþjón.',
 'api-error-illegal-filename' => 'Þetta skráarnafn er ekki leyft.',
 'api-error-internal-error' => 'Innri villa: Mistókst að vinna úr upphali þínu.',
@@ -3649,4 +3675,14 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'api-error-uploaddisabled' => 'Ekki er leyft að hlaða inn á þessum wiki.',
 'api-error-verification-error' => 'Þessi skrá gæti verið skemmd, eða með vitlausa skráarendingu.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekúnda|sekúndur}}',
+'duration-minutes' => '$1 {{PLURAL:$1|mínúta|mínútur}}',
+'duration-hours' => '$1 {{PLURAL:$1|klukkustund|klukkustundir}}',
+'duration-days' => '$1 {{PLURAL:$1|dagur|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|vika|vikur}}',
+'duration-years' => '$1 {{PLURAL:$1|ár|ár}}',
+'duration-decades' => '$1 {{PLURAL:$1|áratugur|áratugir}}',
+'duration-centuries' => '$1 {{PLURAL:$1|öld|aldir}}',
+
 );
index 110b994..33f5c56 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Italian (Italiano)
+/** Italian (italiano)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -29,6 +29,7 @@
  * @author FollowTheMedia
  * @author Gianfranco
  * @author HalphaZ
+ * @author Jasonbleinel
  * @author Kaganer
  * @author Klutzy
  * @author Marco 27
@@ -57,6 +58,7 @@
  * @author Una giornata uggiosa '94
  * @author Vajotwo
  * @author Valepert
+ * @author Ximo17
  * @author Xpensive
  * @author ZioNicco
  * @author לערי ריינהארט
@@ -114,16 +116,17 @@ $specialPageAliases = array(
        'Booksources'               => array( 'RicercaISBN' ),
        'BrokenRedirects'           => array( 'RedirectErrati' ),
        'Categories'                => array( 'Categorie' ),
+       'ChangeEmail'               => array( 'CambiaEmail' ),
        'ChangePassword'            => array( 'CambiaPassword' ),
        'ComparePages'              => array( 'ComparaPagine' ),
        'Confirmemail'              => array( 'ConfermaEMail' ),
-       'Contributions'             => array( 'Contributi', 'ContributiUtente' ),
+       'Contributions'             => array( 'Contributi', 'ContributiUtente', 'Edit' ),
        'CreateAccount'             => array( 'CreaAccount' ),
        'Deadendpages'              => array( 'PagineSenzaUscita' ),
        'DeletedContributions'      => array( 'ContributiCancellati' ),
-       'Disambiguations'           => array( 'Disambigua', 'Disambigue' ),
+       'Disambiguations'           => array( 'Disambigua' ),
        'DoubleRedirects'           => array( 'RedirectDoppi' ),
-       'EditWatchlist'             => array( 'ModifcaListaSeguiti' ),
+       'EditWatchlist'             => array( 'ModificaListaSeguiti' ),
        'Emailuser'                 => array( 'InviaEMail' ),
        'Export'                    => array( 'Esporta' ),
        'Fewestrevisions'           => array( 'PagineConMenoRevisioni' ),
@@ -132,11 +135,11 @@ $specialPageAliases = array(
        'Import'                    => array( 'Importa' ),
        'Invalidateemail'           => array( 'InvalidaEMail' ),
        'BlockList'                 => array( 'IPBloccati', 'ElencoBlocchi', 'Blocchi' ),
-       'LinkSearch'                => array( 'CercaCollegamenti' ),
-       'Listadmins'                => array( 'Amministratori', 'ElencoAmministratori', 'Admin' ),
+       'LinkSearch'                => array( 'CercaCollegamenti', 'CercaLink' ),
+       'Listadmins'                => array( 'Amministratori', 'ElencoAmministratori', 'Admin', 'Sysop', 'Cricca' ),
        'Listbots'                  => array( 'Bot', 'ElencoBot' ),
        'Listfiles'                 => array( 'File', 'Immagini' ),
-       'Listgrouprights'           => array( 'ElencoPermessiGruppi' ),
+       'Listgrouprights'           => array( 'ElencoPermessiGruppi', 'Privilegi' ),
        'Listredirects'             => array( 'Redirect', 'ElencoRedirect' ),
        'Listusers'                 => array( 'Utenti', 'ElencoUtenti' ),
        'Lockdb'                    => array( 'BloccaDB' ),
@@ -155,10 +158,11 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'MieiContributi' ),
        'Mypage'                    => array( 'MiaPaginaUtente', 'MiaPagina' ),
        'Mytalk'                    => array( 'MieDiscussioni' ),
-       'Myuploads'                 => array( 'MieiUpload' ),
+       'Myuploads'                 => array( 'MieiUpload', 'MieiEdit' ),
        'Newimages'                 => array( 'ImmaginiRecenti' ),
        'Newpages'                  => array( 'PaginePiùRecenti' ),
        'PasswordReset'             => array( 'ReimpostaPassword' ),
+       'PermanentLink'             => array( 'LinkPermanente' ),
        'Popularpages'              => array( 'PaginePiùVisitate' ),
        'Preferences'               => array( 'Preferenze' ),
        'Prefixindex'               => array( 'Prefissi' ),
@@ -169,11 +173,11 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'UltimeModifiche' ),
        'Recentchangeslinked'       => array( 'ModificheCorrelate' ),
        'Revisiondelete'            => array( 'CancellaRevisione' ),
-       'Search'                    => array( 'Ricerca', 'Cerca' ),
+       'Search'                    => array( 'Ricerca', 'Cerca', 'Trova' ),
        'Shortpages'                => array( 'PaginePiùCorte' ),
        'Specialpages'              => array( 'PagineSpeciali' ),
        'Statistics'                => array( 'Statistiche' ),
-       'Tags'                      => array( 'Etichette' ),
+       'Tags'                      => array( 'Etichette', 'Tag' ),
        'Unblock'                   => array( 'ElencoSblocchi', 'Sblocchi' ),
        'Uncategorizedcategories'   => array( 'CategorieSenzaCategorie' ),
        'Uncategorizedimages'       => array( 'ImmaginiSenzaCategorie' ),
@@ -265,7 +269,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Nascondi le modifiche verificate nelle ultime modifiche',
 'tog-newpageshidepatrolled' => "Nascondi le pagine verificate dall'elenco delle pagine più recenti",
 'tog-extendwatchlist' => "Mostra tutte le modifiche agli osservati speciali, non solo l'ultima",
-'tog-usenewrc' => 'Utilizza le ultime modifiche avanzate (richiede JavaScript)',
+'tog-usenewrc' => 'Raggruppa le modifiche per pagina nelle ultime modifiche e negli osservati speciali (richiede JavaScript)',
 'tog-numberheadings' => 'Numerazione automatica dei titoli di sezione',
 'tog-showtoolbar' => 'Mostra barra degli strumenti di modifica (richiede JavaScript)',
 'tog-editondblclick' => 'Modifica delle pagine tramite doppio clic (richiede JavaScript)',
@@ -291,7 +295,7 @@ $messages = array(
 'tog-externaleditor' => "Usa per default un editor di testi esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-externaldiff' => "Usa per default un programma di diff esterno (solo per utenti esperti, richiede l'uso di impostazioni particolari sul proprio computer. [//www.mediawiki.org/wiki/Manual:External_editors Ulteriori informazioni.])",
 'tog-showjumplinks' => 'Attiva i collegamenti accessibili "vai a"',
-'tog-uselivepreview' => "Attiva la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript; sperimentale)",
+'tog-uselivepreview' => "Abilita la funzione ''Live preview'' (anteprima in diretta - richiede JavaScript; sperimentale)",
 'tog-forceeditsummary' => 'Chiedi conferma se il campo oggetto è vuoto',
 'tog-watchlisthideown' => 'Nascondi le mie modifiche negli osservati speciali',
 'tog-watchlisthidebots' => 'Nascondi le modifiche dei bot negli osservati speciali',
@@ -476,7 +480,7 @@ $messages = array(
 'otherlanguages' => 'Altre lingue',
 'redirectedfrom' => '(Reindirizzamento da <b>$1</b>)',
 'redirectpagesub' => 'Pagina di reindirizzamento',
-'lastmodifiedat' => 'Ultima modifica per la pagina: $2, $1.',
+'lastmodifiedat' => "Questa pagina è stata modificata per l'ultima volta il $1 alle $2.",
 'viewcount' => 'Questa pagina è stata letta {{PLURAL:$1|una volta|$1 volte}}.',
 'protectedpage' => 'Pagina bloccata',
 'jumpto' => 'Vai a:',
@@ -646,6 +650,10 @@ La motivazione è la seguente: ''$2''.",
 'filereadonlyerror' => 'Non è stato possibile modificare il file "$1" poiché il repository di file "$2" è in modalità di sola lettura.
 
 L\'amministratore che lo ha bloccato ha fornito questa motivazione: "$3".',
+'invalidtitle-knownnamespace' => 'Titolo non valido con namespace "$2" e testo "$3"',
+'invalidtitle-unknownnamespace' => 'Titolo non valido con namespace sconosciuto "$1" e testo "$2"',
+'exception-nologin' => 'Accesso non effettuato',
+'exception-nologin-text' => "Questa pagina o azione richiede che tu abbia effettuato l'accesso su questo wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Errore di configurazione: antivirus sconosciuto: ''$1''",
@@ -849,7 +857,7 @@ Password temporanea: $2',
 'summary-preview' => "Anteprima dell'oggetto:",
 'subject-preview' => 'Anteprima oggetto/intestazione:',
 'blockedtitle' => 'Utente bloccato.',
-'blockedtext' => "'''Questo nome utente o indirizzo IP sono stati bloccati.'''
+'blockedtext' => "'''Il tuo nome utente o indirizzo IP è stato bloccato.'''
 
 Il blocco è stato imposto da $1. La motivazione del blocco è la seguente: ''$2''
 
@@ -918,11 +926,12 @@ L'ultimo elemento del registro dei blocchi è riportato di seguito per informazi
 'updated' => '(Aggiornato)',
 'note' => "'''NOTA:'''",
 'previewnote' => "'''Ricorda che questa è solo un'anteprima.'''
-Le tue modifiche NON sono ancora state salvate! [[#editform|→ Continua a modificare]]",
+Le tue modifiche NON sono ancora state salvate!",
+'continue-editing' => 'Continua a modificare',
 'previewconflict' => 'L\'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere "Salva la pagina" in questo momento.',
 'session_fail_preview' => "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.
 Riprovare.
-Se il problema persiste, si può provare a [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
+Se il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso.'''",
 'session_fail_preview_html' => "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.'''
 
 ''Poiché in {{SITENAME}} è abilitato l'uso di HTML senza limitazioni, l'anteprima non viene visualizzata; si tratta di una misura di sicurezza contro gli attacchi JavaScript.''
@@ -1010,6 +1019,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Rilevato ciclo di Unstrip',
+'parser-unstrip-recursion-limit' => 'Superati i limiti di ricorsione di Unstrip ($1)',
 
 # "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.',
@@ -1146,7 +1161,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Log delle soppressioni',
-'suppressionlogtext' => "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori. Vedi l'[[Special:BlockList|elenco degli IP bloccati]] per l'elenco dei blocchi attivi al momento.",
+'suppressionlogtext' => "Di seguito sono elencate le cancellazioni e i blocchi con del contenuto nascosto agli amministratori.
+Vedi l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi e dei blocchi attivi al momento.",
 
 # History merging
 'mergehistory' => 'Unione cronologie',
@@ -1178,8 +1194,9 @@ $1",
 'mergelogpagetext' => 'Di seguito sono elencate le ultime operazioni di unione della cronologia di due pagine.',
 
 # Diffs
-'history-title' => 'Cronologia delle modifiche di "$1"',
-'difference' => '(Differenze fra le revisioni)',
+'history-title' => '$1: cronologia delle modifiche',
+'difference-title' => '$1: differenze tra le versioni',
+'difference-title-multipage' => '$1 e $2: differenze tra le pagine',
 'difference-multipage' => '(Differenze fra le pagine)',
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Confronta le versioni selezionate',
@@ -1274,6 +1291,7 @@ $1",
 'prefs-beta' => 'Funzionalità beta',
 'prefs-datetime' => 'Data e ora',
 'prefs-labs' => 'Funzionalità dei laboratori',
+'prefs-user-pages' => 'Pagine utente',
 'prefs-personal' => 'Profilo utente',
 'prefs-rc' => 'Ultime modifiche',
 'prefs-watchlist' => 'Osservati speciali',
@@ -1281,7 +1299,7 @@ $1",
 'prefs-watchlist-days-max' => 'Massimo $1 {{PLURAL:$1|giorno|giorni}}',
 'prefs-watchlist-edits' => 'Numero di modifiche da mostrare con le funzioni avanzate:',
 'prefs-watchlist-edits-max' => 'Numero massimo: 1000',
-'prefs-watchlist-token' => 'Token Osservati speciali:',
+'prefs-watchlist-token' => 'Token osservati speciali:',
 'prefs-misc' => 'Varie',
 'prefs-resetpass' => 'Cambia password',
 'prefs-changeemail' => 'Modifica e-mail',
@@ -1353,7 +1371,7 @@ L'operazione non può essere annullata.",
 'gender-male' => 'Maschile',
 'gender-female' => 'Femminile',
 'prefs-help-gender' => "Opzionale: consente di adattare i messaggi del software in funzione del genere dell'utente. Questa informazione sarà pubblica.",
-'email' => 'Indirizzo e-mail',
+'email' => 'Indirizzo email',
 'prefs-help-realname' => "L'indicazione del proprio nome vero è opzionale; se si sceglie di inserirlo, verrà utilizzato per attribuire la paternità dei contenuti inviati.",
 'prefs-help-email' => "L'inserimento del proprio indirizzo e-mail è facoltativo, ma permette di ricevere la propria password qualora venisse dimenticata.",
 'prefs-help-email-others' => 'Puoi anche scegliere di lasciare che gli altri ti contattino via posta elettronica con un collegamento dalla tua pagina utente o di discussione.
@@ -1468,7 +1486,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'right-editusercssjs' => 'Modifica i file CSS e JS di altri utenti',
 'right-editusercss' => 'Modifica i file CSS di altri utenti',
 'right-edituserjs' => 'Modifica i file JS di altri utenti',
-'right-rollback' => "Annullamento rapido delle modifiche dell'ultimo utente che ha modificato una particolare pagina",
+'right-rollback' => "Annulla rapidamente le modifiche dell'ultimo utente che ha modificato una particolare pagina",
 'right-markbotedits' => 'Segna le modifiche soggette a rollback come effettuate da bot',
 'right-noratelimit' => 'Non soggetto al limite di azioni',
 'right-import' => 'Importa pagine da altri wiki',
@@ -1517,7 +1535,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'action-suppressionlog' => 'visionare questo log privato',
 'action-block' => 'bloccare questo utente in scrittura',
 'action-protect' => 'modificare i livelli di protezione per questa pagina',
-'action-rollback' => "Annullamento rapido delle modifiche dell'ultimo utente che ha modificato una determinata pagina",
+'action-rollback' => "annullare rapidamente le modifiche dell'ultimo utente che ha modificato una determinata pagina",
 'action-import' => "importare questa pagina da un'altra wiki",
 'action-importupload' => 'importare questa pagina tramite upload da file',
 'action-patrol' => 'segnare le modifiche degli altri utenti come verificate',
@@ -1533,7 +1551,7 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'nchanges' => '$1 {{PLURAL:$1|modifica|modifiche}}',
 'recentchanges' => 'Ultime modifiche',
 'recentchanges-legend' => 'Opzioni ultime modifiche',
-'recentchangestext' => 'Questa pagina presenta le modifiche più recenti ai contenuti del sito.',
+'recentchanges-summary' => 'Questa pagina presenta le modifiche più recenti ai contenuti del sito.',
 'recentchanges-feed-description' => 'Questo feed riporta le modifiche più recenti ai contenuti del sito.',
 'recentchanges-label-newpage' => 'Questa modifica ha creato una nuova pagina',
 'recentchanges-label-minor' => 'Questa è una modifica minore',
@@ -1718,7 +1736,7 @@ $1',
 'backend-fail-hashes' => 'Impossibile ottenere hash dei file per confronto.',
 'backend-fail-notsame' => 'Esiste già un file non identico a  $1 .',
 'backend-fail-invalidpath' => '$1 non è un percorso di archiviazione valido.',
-'backend-fail-delete' => 'Impossibile eliminare il file  $1 .',
+'backend-fail-delete' => 'Impossibile cancellare il file $1.',
 'backend-fail-alreadyexists' => 'Il file $1 esiste già.',
 'backend-fail-store' => 'Impossibilie memorizzare file  $1  in  $2 .',
 'backend-fail-copy' => 'Impossibile copiare il file  $1  in  $2 .',
@@ -1727,7 +1745,7 @@ $1',
 'backend-fail-writetemp' => 'Impossibile creare il file temporaneo.',
 'backend-fail-closetemp' => 'Impossibile chiudere il file temporaneo.',
 'backend-fail-read' => 'Impossibile leggere il file  $1 .',
-'backend-fail-create' => 'Impossibile creare il file  $1 .',
+'backend-fail-create' => 'Impossibile creare il file $1.',
 'backend-fail-maxsize' => 'Impossibile creare il file $1 perché è più grande di {{PLURAL:$2|un|$2}} byte.',
 'backend-fail-readonly' => 'Il backend "$1" è attualmente di sola lettura. La ragione indicata è: "$2"',
 'backend-fail-synced' => 'Il file "$1" è in uno stato non coerente nei backend di memoria interna.',
@@ -1735,6 +1753,11 @@ $1',
 'backend-fail-internal' => 'Si è verificato un errore sconosciuto nel backend di memoria "$1".',
 'backend-fail-contenttype' => 'Impossibile determinare la tipologia del file da archiviare in "$1".',
 'backend-fail-batchsize' => 'Il backend di memoria ha programmato una serie di $1 {{PLURAL:$1|operazione|operazioni}} su file; il limite è di $2 {{PLURAL:$2|operazione|operazioni}}.',
+'backend-fail-usable' => 'Impossibile scrivere il file $1 a causa di autorizzazione insufficienti o directory/recipienti mancanti.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Impossibile connettersi al database journal per l\'archiviazione back-end "$1".',
+'filejournal-fail-dbquery' => 'Impossibile aggiornare il database journal per l\'archiviazione back-end "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Impossibile sbloccare "$1"; non è bloccato.',
@@ -2048,6 +2071,7 @@ Potrebbero essere presenti immagini che sono usate da altri siti con un collegam
 È possibile restringere i criteri di ricerca selezionando il tipo di registro, l'utente che ha eseguito l'azione, e/o la pagina interessata (entrambi i campi sono sensibili al maiuscolo/minuscolo).",
 'logempty' => 'Il registro non contiene elementi corrispondenti alla ricerca.',
 'log-title-wildcard' => 'Ricerca dei titoli che iniziano con',
+'showhideselectedlogentries' => 'Mostra/nascondi le voci di registro selezionate',
 
 # Special:AllPages
 'allpages' => 'Tutte le pagine',
@@ -2067,6 +2091,11 @@ Potrebbero essere presenti immagini che sono usate da altri siti con un collegam
 'allpages-bad-ns' => 'Il namespace "$1" non esiste su {{SITENAME}}.',
 'allpages-hide-redirects' => 'Nascondi redirect',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Stai vedendo una versione di questa pagina memorizzata nella cache, che può essere vecchia al massimo di $1.',
+'cachedspecial-viewing-cached-ts' => 'Stai vedendo una versione di questa pagina memorizzata nella cache, che potrebbe non essere completamente aggiornata.',
+'cachedspecial-refresh-now' => 'Mostra la più recente.',
+
 # Special:Categories
 'categories' => 'Categorie',
 'categoriespagetext' => '{{PLURAL:$1|La categoria indicata di seguito contiene|Le categorie indicate di seguito contengono}} pagine o file multimediali.
@@ -2360,7 +2389,7 @@ Le impostazioni correnti per la pagina sono '''$1''':",
 'undeletepagetitle' => "'''Quanto segue è composto da revisioni cancellate di [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Visualizza le pagine cancellate',
 'undeletepagetext' => "{{PLURAL:$1|La pagina indicata di seguito è stata cancellata, ma è ancora in archivio e pertanto può essere recuperata|Le pagine indicate di seguito sono state cancellate, ma sono ancora in archivio e pertanto possono essere recuperate}}. L'archivio può essere svuotato periodicamente.",
-'undelete-fieldset-title' => 'Recupera revisioni',
+'undelete-fieldset-title' => 'Ripristina versioni',
 'undeleteextrahelp' => "Per recuperare l'intera cronologia della pagina, lasciare tutte le caselle deselezionate e fare clic su '''''{{int:undeletebtn}}'''''.
 Per effettuare un ripristino selettivo, selezionare le caselle corrispondenti alle revisioni da ripristinare e fare clic su '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|Una revisione|$1 revisioni}} in archivio',
@@ -2494,8 +2523,8 @@ Indicare il motivo specifico per il quale si procede al blocco (per esempio, cit
 'ipb-confirm' => 'Conferma il blocco',
 'badipaddress' => 'Indirizzo IP non valido.',
 'blockipsuccesssub' => 'Blocco eseguito',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] è stato bloccato. <br />
-Consultare la [[Special:BlockList|lista degli IP bloccati]] per vedere i blocchi attivi.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] è stato bloccato.<br />
+Consultare la [[Special:BlockList|lista dei blocchi]] per vedere i blocchi attivi.',
 'ipb-blockingself' => 'Stai per bloccare te stesso! Sei sicuro di volerlo fare?',
 'ipb-confirmhideuser' => 'Si sta per bloccare un utente con l\'opzione "Nascondi utente" abilitata.
 In questo modo si evita che il nome utente compaia in tutte le liste e le voci di registro.
@@ -2540,7 +2569,7 @@ Sei sicuro di voler continuare?',
 'unblocklink' => 'sblocca',
 'change-blocklink' => 'cambia blocco',
 'contribslink' => 'contributi',
-'emaillink' => 'invia e-mail',
+'emaillink' => 'invia email',
 'autoblocker' => 'Bloccato automaticamente perché l\'indirizzo IP è condiviso con l\'utente "[[User:$1|$1]]".
 Il blocco dell\'utente $1 è stato imposto per il seguente motivo: "$2".',
 'blocklogpage' => 'Blocchi',
@@ -2548,7 +2577,9 @@ Il blocco dell\'utente $1 è stato imposto per il seguente motivo: "$2".',
 'blocklog-showsuppresslog' => 'Questo utente è stato bloccato e nascosto in precedenza. Il registro delle rimozioni è riportato di seguito per informazione:',
 'blocklogentry' => 'ha bloccato [[$1]] per un periodo di $2 $3',
 'reblock-logentry' => 'ha cambiato le impostazioni del blocco per [[$1]] con una scadenza di $2 $3',
-'blocklogtext' => "Di seguito sono elencate le azioni di blocco e sblocco utenti. Gli indirizzi IP bloccati automaticamente non sono elencati. Consultare l'[[Special:BlockList|elenco IP bloccati]] per l'elenco degli indirizzi e nomi utente il cui blocco è operativo.",
+'blocklogtext' => "Di seguito sono elencate le azioni di blocco e sblocco utenti.
+Gli indirizzi IP bloccati automaticamente non sono elencati.
+Consultare l'[[Special:BlockList|elenco dei blocchi]] per l'elenco dei bandi o blocchi attualmente operativi.",
 'unblocklogentry' => 'ha sbloccato $1',
 'block-log-flags-anononly' => 'solo utenti anonimi',
 'block-log-flags-nocreate' => 'creazione account bloccata',
@@ -2907,7 +2938,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'anonymous' => '{{PLURAL:$1|Utente anonimo|Utenti anonimi}} di {{SITENAME}}',
 'siteuser' => '$1, utente di {{SITENAME}}',
 'anonuser' => '$1, utente anonimo di {{SITENAME}}',
-'lastmodifiedatby' => "Questa pagina è stata modificata per l'ultima volta il $2, $1 da $3.",
+'lastmodifiedatby' => "Questa pagina è stata modificata per l'ultima volta il $1 alle $2 da $3.",
 'othercontribs' => 'Il testo attuale è basato su contributi di $1.',
 'others' => 'altri',
 'siteusers' => '$1, {{PLURAL:$2|utente|utenti}} di {{SITENAME}}',
@@ -2922,6 +2953,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'spambot_username' => 'MediaWiki - sistema di rimozione spam',
 'spam_reverting' => "Ripristinata l'ultima versione priva di collegamenti a $1",
 'spam_blanking' => 'Pagina svuotata, tutte le versioni contenevano collegamenti a $1',
+'spam_deleting' => 'Pagina cancellata, tutte le versioni contenevano collegamenti a $1',
 
 # Info page
 'pageinfo-title' => 'Informazioni per "$1"',
@@ -3627,10 +3659,15 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
 
 MediaWiki è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Si veda la GNU General Public License per maggiori dettagli.
 
-Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia della GNU General Public License]; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [//www.softwarelibero.it/gnudoc/gpl.it.txt leggerla in rete].',
+Questo programma deve essere distribuito assieme ad [{{SERVER}}{{SCRIPTPATH}}/COPYING una copia della GNU General Public License]; in caso contrario, se ne può ottenere una scrivendo alla Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA oppure [http://www.softwarelibero.it/gnudoc/gpl.it.txt leggerla in rete].',
 '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',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Percorso voci]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Percorso script]',
 
 # Special:FilePath
 'filepath' => 'Percorso di un file',
@@ -3818,4 +3855,17 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'api-error-uploaddisabled' => 'Il caricamento è disabilitato su questa wiki.',
 'api-error-verification-error' => "Questo file potrebbe essere danneggiato, o avere l'estensione sbagliata.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secondo|secondi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|minuti}}',
+'duration-hours' => '$1 {{PLURAL:$1|ora|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|giorno|giorni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|settimana|settimane}}',
+'duration-years' => '$1 {{PLURAL:$1|anno|anni}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decadi}}',
+'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Impossibile acquisire blocchi sul server $1.',
 );
index 3cabb47..8f42292 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Akaniji
  * @author Alexsh
+ * @author Ant176
  * @author Aotake
  * @author Aphaia
  * @author Broad-Sky
@@ -166,7 +167,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( '新着ファイル', '新しいファイルの一覧', '新着画像展示室' ),
        'Newpages'                  => array( '新しいページ', '新規項目' ),
        'PasswordReset'             => array( 'パスワード再設定', 'パスワードの再設定', 'パスワードのリセット', 'パスワードリセット' ),
-       'PermanentLink'             => array( '固定リンク' ),
+       'PermanentLink'             => array( '固定リンク', 'パーマリンク' ),
        'Popularpages'              => array( '人気ページ' ),
        'Preferences'               => array( '個人設定', 'オプション' ),
        'Prefixindex'               => array( '前方一致ページ一覧', '始点指定ページ一覧' ),
@@ -188,7 +189,7 @@ $specialPageAliases = array(
        'Uncategorizedimages'       => array( 'カテゴリ未導入のファイル' ),
        'Uncategorizedpages'        => array( 'カテゴリ未導入のページ' ),
        'Uncategorizedtemplates'    => array( 'カテゴリ未導入のテンプレート' ),
-       'Undelete'                  => array( '復帰' ),
+       'Undelete'                  => array( '復å\85\83', '復帰' ),
        'Unlockdb'                  => array( 'データベースロック解除', 'データベース解除' ),
        'Unusedcategories'          => array( '使われていないカテゴリ', '未使用カテゴリ' ),
        'Unusedimages'              => array( '使われていないファイル', '未使用ファイル', '未使用画像' ),
@@ -363,39 +364,39 @@ $magicWords = array(
 $messages = array(
 # User preference toggles
 'tog-underline' => 'リンクの下線:',
-'tog-justify' => '段è\90½ã\82\92å\9d\87ç­\89å\89²ã\82\8aä»\98ã\81\91ã\81\99ã\82\8b',
+'tog-justify' => '段è\90½ã\81«å\9d\87ç­\89å\89²ã\82\8aä»\98ã\81\91ã\82\92設å®\9a',
 'tog-hideminor' => '最近の更新に細部の編集を表示しない',
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
-'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示する',
-'tog-usenewrc' => '最近の更新ページを拡張する(JavaScriptが必要)',
+'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示',
+'tog-usenewrc' => '最近の更新ページを拡張(JavaScriptが必要)',
 'tog-numberheadings' => '自動的に見出しに番号を振る',
-'tog-showtoolbar' => '編集用のツールバーを表示する(JavaScriptが必要)',
-'tog-editondblclick' => 'ダブルクリックで編集する(JavaScriptが必要)',
+'tog-showtoolbar' => '編集用のツールバーを表示(JavaScriptが必要)',
+'tog-editondblclick' => 'ダブルクリックで編集(JavaScriptが必要)',
 'tog-editsection' => '[編集]リンクから節を編集できるようにする',
-'tog-editsectiononrightclick' => '節見出しの右クリックで節編集を行えるようにする(JavaScriptが必要)',
-'tog-showtoc' => '目次を表示する(ページに見出しが4つ以上ある場合)',
-'tog-rememberpassword' => 'ã\81\93ã\81®ã\83\96ã\83©ã\82¦ã\82¶ã\81«ã\83­ã\82°ã\82¤ã\83³æ\83\85å ±ã\82\92è¨\98æ\86¶ã\81\95ã\81\9bã\82\8bï¼\88æ\9c\80大$1{{PLURAL:$1|æ\97¥|日間}})',
-'tog-watchcreations' => '自分が作成したページをウォッチリストに追加する',
-'tog-watchdefault' => '自分が編集したページをウォッチリストに追加する',
-'tog-watchmoves' => '自分が移動したページをウォッチリストに追加する',
-'tog-watchdeletion' => '自分が削除したページをウォッチリストに追加する',
-'tog-minordefault' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\82\92æ\97¢å®\9aã\81§ã\83\81ã\82§ã\83\83ã\82¯ã\81\99る',
-'tog-previewontop' => 'プレビューを編集ボックスの前に配置する',
-'tog-previewonfirst' => '編集開始時にもプレビューを表示する',
-'tog-nocache' => 'ブラウザによるページのキャッシュを無効にする',
-'tog-enotifwatchlistpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81¨ã\81\8dã\81«メールを受け取る',
-'tog-enotifusertalkpages' => 'è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81¨ã\81\8dã\81«メールを受け取る',
+'tog-editsectiononrightclick' => '節見出しの右クリックで節を編集できるようにする(JavaScriptが必要)',
+'tog-showtoc' => '目次を表示(ページに見出しが4つ以上ある場合)',
+'tog-rememberpassword' => 'ã\81\93ã\81®ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81«ã\83­ã\82°ã\82¤ã\83³æ\83\85å ±ã\82\92è¨\98æ\86¶ï¼\88æ\9c\80大 $1 {{PLURAL:$1|日間}})',
+'tog-watchcreations' => '自分が作成したページをウォッチリストに追加',
+'tog-watchdefault' => '自分が編集したページをウォッチリストに追加',
+'tog-watchmoves' => '自分が移動したページをウォッチリストに追加',
+'tog-watchdeletion' => '自分が削除したページをウォッチリストに追加',
+'tog-minordefault' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81«æ\97¢å®\9aã\81§ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cる',
+'tog-previewontop' => 'プレビューを編集ボックスの前に配置',
+'tog-previewonfirst' => '編集開始時にもプレビューを表示',
+'tog-nocache' => 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81«ã\82\88ã\82\8bã\83\9aã\83¼ã\82¸ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ç\84¡å\8a¹ã\81«ã\81\99ã\82\8b',
+'tog-enotifwatchlistpages' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89メールを受け取る',
+'tog-enotifusertalkpages' => 'è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\82\89メールを受け取る',
 'tog-enotifminoredits' => '細部の編集でもメールを受け取る',
-'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示する',
-'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示する',
+'tog-enotifrevealaddr' => '通知メールで自分のメールアドレスを明示',
+'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
-'tog-fancysig' => 'ç½²å\90\8dã\82\92ã\82¦ã\82£ã\82­æ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\81\86ï¼\88è\87ªå\8b\95ã\81§ã\83ªã\83³ã\82¯ã\81\97ã\81ªã\81\84)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-fancysig' => 'ç½²å\90\8dã\82\92ã\82¦ã\82£ã\82­æ\96\87ã\81¨ã\81\97ã\81¦æ\89±ã\81\86ï¼\88è\87ªå\8b\95ã\83ªã\83³ã\82¯ã\81ªã\81\97)',
+'tog-externaleditor' => '既定で編集に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-externaldiff' => '差分表示に外部アプリケーションを使(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
-'tog-uselivepreview' => 'ライブプレビューを使用する(JavaScriptが必要)(試験中の機能)',
-'tog-forceeditsummary' => '要約欄が空欄の場合に警告する',
+'tog-uselivepreview' => 'ライブプレビューを使用(JavaScriptが必要)(開発中)',
+'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
 'tog-watchlisthideown' => 'ウォッチリストに自分の編集を表示しない',
 'tog-watchlisthidebots' => 'ウォッチリストにボットによる編集を表示しない',
 'tog-watchlisthideminor' => 'ウォッチリストに細部の編集を表示しない',
@@ -403,22 +404,22 @@ $messages = array(
 'tog-watchlisthideanons' => 'ウォッチリストに匿名利用者の編集を表示しない',
 'tog-watchlisthidepatrolled' => 'ウォッチリストに巡回済みの編集を表示しない',
 'tog-nolangconversion' => '言語変種変換を無効にする',
-'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送',
-'tog-diffonly' => '差分表示の下にページの内容を表示しない',
-'tog-showhiddencats' => '隠しカテゴリを表示する',
+'tog-ccmeonemails' => '他の利用者に送信したメールの控えを自分にも送',
+'tog-diffonly' => '差分の下にページ内容を表示しない',
+'tog-showhiddencats' => '隠しカテゴリを表示',
 'tog-noconvertlink' => 'リンクタイトル変換を無効にする',
 'tog-norollbackdiff' => '巻き戻し後の差分を表示しない',
 
 'underline-always' => '常に付ける',
 'underline-never' => '常に付けない',
-'underline-default' => 'ブラウザの設定を使用',
+'underline-default' => 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®è¨­å®\9aã\82\92使ç\94¨',
 
 # Font style option in Special:Preferences
 'editfont-style' => '編集エリアのフォントスタイル:',
-'editfont-default' => 'ブラウザの設定を使用',
+'editfont-default' => 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®è¨­å®\9aã\82\92使ç\94¨',
 'editfont-monospace' => '等幅フォント',
-'editfont-sansserif' => 'サンセリフフォント',
-'editfont-serif' => 'セリフフォント',
+'editfont-sansserif' => 'Sans Serif フォント',
+'editfont-serif' => 'Serif フォント',
 
 # Dates
 'sunday' => '日曜日',
@@ -477,15 +478,15 @@ $messages = array(
 'category_header' => 'カテゴリ「$1」にあるページ',
 'subcategories' => '下位カテゴリ',
 'category-media-header' => 'カテゴリ「$1」にあるメディア',
-'category-empty' => "''このカテゴリには、ページまたはメディアがひとつもありません。''",
+'category-empty' => "''このカテゴリには現在、ページやメディアが何もありません。''",
 'hidden-categories' => '{{PLURAL:$1|隠しカテゴリ}}',
 'hidden-category-category' => '隠しカテゴリ',
-'category-subcat-count' => '{{PLURAL:$2|このカテゴリには、次の下位カテゴリのみ含まれています。|このカテゴリには、次の$2下位カテゴリが含まれており、そのうち$1カテゴリが表示されています。}}',
-'category-subcat-count-limited' => 'このカテゴリには、次の{{PLURAL:$1|$1下位カテゴリ}}が含まれています。',
-'category-article-count' => '{{PLURAL:$2|このカテゴリには、次のページのみ含まれています。|以下の$2ページがこのカテゴリに含まれており、そのうち$1ページが表示されています。}}',
-'category-article-count-limited' => '以下のページ{{PLURAL:$1|$1ページ}}が、現在のカテゴリに含まれています。',
-'category-file-count' => '{{PLURAL:$2|このカテゴリには、次のファイルのみが含まれています。|このカテゴリには、$2ファイルが含まれており、そのうち$1ファイルが表示されています。}}',
-'category-file-count-limited' => '以下の{{PLURAL:$1|$1ファイル}}が、現在のカテゴリに含まれています。',
+'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の {{PLURAL:$1|$1 下位カテゴリ}}を表示しています。}}',
+'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ|&#32;$1 下位カテゴリ}}が含まれています。',
+'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の {{PLURAL:$1|$1 ページ}}を表示しています。}}',
+'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ|&#32;$1 ページ}}が含まれています。',
+'category-file-count' => '{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}',
+'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル|&#32;$1 ファイル}}が含まれています。',
 'listingcontinuesabbrev' => 'の続き',
 'index-category' => '検索エンジンに収集されるページ',
 'noindex-category' => '検索エンジンに収集されないページ',
@@ -495,12 +496,12 @@ $messages = array(
 'article' => '本文',
 'newwindow' => '(新しいウィンドウが開きます)',
 'cancel' => '中止',
-'moredotdotdot' => '続き・・・',
+'moredotdotdot' => '続き...',
 'mypage' => '自分のページ',
 'mytalk' => '自分のトーク',
 'anontalk' => 'このIPアドレスのトーク',
 'navigation' => '案内',
-'and' => 'および',
+'and' => '&#32;および&#32;',
 
 # Cologne Blue skin
 'qbfind' => '検索',
@@ -520,12 +521,12 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '復帰',
 'vector-action-unprotect' => '保護再設定',
-'vector-simplesearch-preference' => '検索語の提案機能を拡張する(ベクター外装のみ)',
+'vector-simplesearch-preference' => '検索語の提案機能を拡張(ベクター外装のみ)',
 'vector-view-create' => '作成',
 'vector-view-edit' => '編集',
 'vector-view-history' => '履歴表示',
 'vector-view-view' => '閲覧',
-'vector-view-viewsource' => 'ソース表示',
+'vector-view-viewsource' => 'ソースを閲覧',
 'actions' => '操作',
 'namespaces' => '名前空間',
 'variants' => '変種',
@@ -540,7 +541,7 @@ $messages = array(
 'searcharticle' => '表示',
 'history' => 'ページの履歴',
 'history_short' => '履歴',
-'updatedmarker' => '最後の訪問から更新されています',
+'updatedmarker' => '最後の訪問以降に更新されました',
 'printableversion' => '印刷用バージョン',
 'permalink' => 'この版への固定リンク',
 'print' => '印刷',
@@ -551,8 +552,8 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
-'undelete_short' => '{{PLURAL:$1|$1版}}を復帰',
-'viewdeleted_short' => '削除された$1件の編集を閲覧',
+'undelete_short' => '{{PLURAL:$1|$1 版}}を復帰',
+'viewdeleted_short' => '{{PLURAL:$1|削除された $1 編集}}を閲覧',
 'protect' => '保護',
 'protect_change' => '設定変更',
 'protectthispage' => 'このページを保護',
@@ -570,7 +571,7 @@ $messages = array(
 'toolbox' => 'ツールボックス',
 'userpage' => '利用者ページを表示',
 'projectpage' => 'プロジェクトのページを表示',
-'imagepage' => 'ファイルページを表示',
+'imagepage' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\83\9aã\83¼ã\82¸ã\82\92表示',
 'mediawikipage' => 'メッセージのページを表示',
 'templatepage' => 'テンプレートのページを表示',
 'viewhelppage' => 'ヘルプのページを表示',
@@ -579,13 +580,13 @@ $messages = array(
 'otherlanguages' => '他の言語',
 'redirectedfrom' => '($1から転送)',
 'redirectpagesub' => 'リダイレクトページ',
-'lastmodifiedat' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®æ\9c\80çµ\82æ\9b´æ\96°ã\81¯ $1 $2 ã\81«è¡\8cã\82\8fã\82\8cã\81¾ã\81\97ã\81\9f。',
-'viewcount' => 'このページは{{PLURAL:$1|$1回}}アクセスされました。',
+'lastmodifiedat' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81\8cæ\9c\80å¾\8cã\81«æ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81®ã\81¯ $1 $2 ã\81§ã\81\99。',
+'viewcount' => 'このページは {{PLURAL:$1|$1 回}}アクセスされました。',
 'protectedpage' => '保護されたページ',
 'jumpto' => '移動:',
 'jumptonavigation' => '案内',
 'jumptosearch' => '検索',
-'view-pool-error' => '申し訳ありません、現在サーバーに過大な負荷がかかっています。
+'view-pool-error' => 'ç\94³ã\81\97訳ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\81\8cã\80\81ç\8f¾å\9c¨ã\82µã\83¼ã\83\90ã\83¼ã\81«é\81\8e大ã\81ªè² è\8d·ã\81\8cã\81\8bã\81\8bã\81£ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82
 このページを閲覧しようとする利用者が多すぎます。
 しばらく時間を置いてから、もう一度このページにアクセスしてみてください。
 
@@ -597,7 +598,7 @@ $1',
 # 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:{{SITENAME}}について',
-'copyright' => 'å\86\85容ã\81¯$1ã\81®ã\83©ã\82¤ã\82»ã\83³ã\82¹ã\81§å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82',
+'copyright' => '内容は$1のライセンスで利用できます。',
 'copyrightpage' => '{{ns:project}}:著作権',
 'currentevents' => '最近の出来事',
 'currentevents-url' => 'Project:最近の出来事',
@@ -611,27 +612,28 @@ $1',
 'policy-url' => 'Project:方針',
 'portal' => 'コミュニティ・ポータル',
 'portal-url' => 'Project:コミュニティ・ポータル',
-'privacy' => 'プライバシーポリシー',
-'privacypage' => 'Project:プライバシーポリシー',
+'privacy' => 'プライバシー ポリシー',
+'privacypage' => 'Project:プライバシー ポリシー',
 
 'badaccess' => '権限がありません',
 'badaccess-group0' => '要求した操作を行うことは許可されていません。',
-'badaccess-groups' => 'この操作は、$1{{PLURAL:$2|の|のいずれかの}}グループに属する利用者のみが実行できます。',
+'badaccess-groups' => 'この操作は、以下の{{PLURAL:$2|グループ|グループのいずれか}}に属する利用者のみが実行できます: $1。',
 
-'versionrequired' => 'MediaWikiのバージョン$1が必要',
-'versionrequiredtext' => 'このページの利用にはMediaWikiのバージョン$1が必要です。[[Special:Version|バージョン情報]]を確認してください。',
+'versionrequired' => 'MediaWiki のバージョン $1 が必要',
+'versionrequiredtext' => 'このページの使用にはMediaWiki バージョン $1 が必要です。
+[[Special:Version|バージョン情報]]をご覧ください。',
 
 'ok' => 'OK',
-'retrievedfrom' => 'ã\80\8c$1ã\80\8dã\82\88ã\82\8a取得',
-'youhavenewmessages' => '$1が届いています。($2)',
-'newmessageslink' => '新しいメッセージ',
+'retrievedfrom' => 'ã\80\8c$1ã\80\8dã\81\8bã\82\89取得',
+'youhavenewmessages' => '$1があります($2)。',
+'newmessageslink' => '新メッセージ',
 'newmessagesdifflink' => '最終更新の差分',
-'youhavenewmessagesmulti' => '$1に新しい伝言が届いています',
+'youhavenewmessagesmulti' => '$1に新着メッセージがあります',
 'editsection' => '編集',
 'editold' => '編集',
-'viewsourceold' => 'ソースを表示',
+'viewsourceold' => 'ソースを閲覧',
 'editlink' => '編集',
-'viewsourcelink' => 'ソースを表示',
+'viewsourcelink' => 'ソースを閲覧',
 'editsectionhint' => '節を編集: $1',
 'toc' => '目次',
 'showtoc' => '表示',
@@ -639,11 +641,11 @@ $1',
 'collapsible-collapse' => '折り畳む',
 'collapsible-expand' => '展開する',
 'thisisdeleted' => '$1を閲覧または復帰しますか?',
-'viewdeleted' => '$1を表示しますか?',
-'restorelink' => '削除された$1編集',
+'viewdeleted' => '$1を閲覧しますか?',
+'restorelink' => '{{PLURAL:$1|削除された $1 編集}}',
 'feedlinks' => 'フィード:',
-'feed-invalid' => 'フィード形式の指定が間違っています。',
-'feed-unavailable' => 'ã\83\95ã\82£ã\83¼ã\83\89ã\81®é\85\8dä¿¡ã\81«å¯¾å¿\9cã\81\97ã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82',
+'feed-invalid' => 'フィード形式の指定が正しくありません。',
+'feed-unavailable' => 'ã\83\95ã\82£ã\83¼ã\83\89ã\81®é\85\8dä¿¡ã\81¯å\88©ç\94¨ã\81§ã\81\8dã\81¾ã\81\9bã\82\93',
 'site-rss-feed' => '$1のRSSフィード',
 'site-atom-feed' => '$1のAtomフィード',
 'page-rss-feed' => '「$1」のRSSフィード',
@@ -666,9 +668,9 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'そのような操作はありません',
-'nosuchactiontext' => 'このURLで指定された操作は無効です
-URLを間違って打ったか、正しくないリンクを辿った可能性があります。
-また、{{SITENAME}}が利用するソフトウェアのバグである可能性もあります。',
+'nosuchactiontext' => 'この URL で指定された操作は正しくありません
+URL を間違って入力したか、正しくないリンクをたどった可能性があります。
+{{SITENAME}}が利用するソフトウェアのバグの可能性もあります。',
 'nosuchspecialpage' => 'そのような特別ページはありません',
 'nospecialpagetext' => '<strong>要求された特別ページは存在しません。</strong>
 
@@ -676,27 +678,27 @@ URLを間違って打ったか、正しくないリンクを辿った可能性
 
 # General errors
 'error' => 'エラー',
-'databaseerror' => 'データベースエラー',
-'dberrortext' => 'データベースクエリの構文エラーが発生しました。
+'databaseerror' => 'データベース エラー',
+'dberrortext' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82¯ã\82¨ã\83ªã\83¼ã\81®æ§\8bæ\96\87ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
 ソフトウェアにバグがある可能性があります。
\9c\80å¾\8cã\81«å®\9fè¡\8cã\82\92試ã\81¿ã\81\9fã\82¯ã\82¨ã\83ªã\81¯æ¬¡ã\81®é\80\9aã\82\8aã\81§ã\81\99
-関数「<tt>$2</tt>」内
-<blockquote><tt>$1</tt></blockquote>
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®è¿\94ã\81\97ã\81\9fã\82¨ã\83©ã\83¼ã\80\8c<tt>$3ï¼\9a$4</tt>ã\80\8d',
-'dberrortextcl' => 'データベースクエリの構文エラーが発生しました。
\9c\80å¾\8cã\81«å®\9fè¡\8cã\82\92試ã\81¿ã\81\9fã\82¯ã\82¨ã\83ªã\81¯æ¬¡ã\81®é\80\9aã\82\8aã\81§ã\81\99:
-関数 "$2" 内
-"$1"
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®è¿\94ã\81\97ã\81\9fã\82¨ã\83©ã\83¼ "$3: $4"',
\9c\80å¾\8cã\81«å®\9fè¡\8cã\82\92試ã\81¿ã\81\9fã\82¯ã\82¨ã\83ªã\83¼
+<blockquote><tt>$1</tt></blockquote>
+(関数「<tt>$2</tt>」内)
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81¯ã\82¨ã\83©ã\83¼ã\80\8c<tt>$3ï¼\9a$4</tt>ã\80\8dã\82\92è¿\94ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82',
+'dberrortextcl' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82¯ã\82¨ã\83ªã\83¼ã\81®æ§\8bæ\96\87ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
\9c\80å¾\8cã\81«å®\9fè¡\8cã\82\92試ã\81¿ã\81\9fã\82¯ã\82¨ã\83ªã\83¼ï¼\9a
+「$1」
+(関数「$2」内)。
\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81¯ã\82¨ã\83©ã\83¼ã\80\8c$3ï¼\9a$4ã\80\8dã\82\92è¿\94ã\81\97ã\81¾ã\81\97ã\81\9f',
 'laggedslavemode' => "'''警告:'''ページに最新の編集が反映されていない可能性があります。",
 'readonly' => 'データベースがロックされています',
 'enterlockreason' => 'ロックの理由とロック解除の予定を入力してください',
 'readonlytext' => 'データベースは現在、新しいページの追加や編集を受け付けない「ロック状態」になっています。これはおそらくデータベースの定期メンテナンスのためで、メンテナンス終了後は正常な状態に復帰します。
 
 データベースをロックした管理者による説明は以下の通りです:$1',
-'missing-article' => '「$1」$2というページの本文をデータベース上に見つけることができませんでした。
+'missing-article' => '求められたページ「$1」$2 の本文がデータベース内で見つかりませんでした。
 
-ページの削除された版への古い差分表示や固定リンクをたどった時にこのようなことになります。
+通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。
 
 それ以外の操作でこのメッセージが表示された場合、ソフトウェアのバグである可能性があります。
 [[Special:ListUsers/sysop|管理者]]までそのURLを添えてお知らせください。',
@@ -710,46 +712,49 @@ URLを間違って打ったか、正しくないリンクを辿った可能性
 'filecopyerror' => 'ファイル「$1」を「$2」へ複製できませんでした。',
 'filerenameerror' => 'ファイル名を「$1」から「$2」へ変更できませんでした。',
 'filedeleteerror' => 'ファイル「$1」を削除できませんでした。',
-'directorycreateerror' => 'ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼ã\80\8c$1ã\80\8dã\82\92ä½\9cæ\88\90ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\81§ã\81\97ã\81\9fã\80\82',
+'directorycreateerror' => 'ディレクトリ「$1」を作成できませんでした。',
 'filenotfound' => 'ファイル「$1」が見つかりませんでした。',
-'fileexistserror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¸ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\81\8cã\81§ã\81\8dã\81¾ã\81\9bã\82\93ï¼\9aã\83\95ã\82¡ã\82¤ã\83«ã\81\8cå­\98å\9c¨ã\81\97ã\81¾ã\81\99',
+'fileexistserror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¸ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\81«å¤±æ\95\97ï¼\9aã\83\95ã\82¡ã\82¤ã\83«ã\81\8cå­\98å\9c¨ã\81\97ã\81¾ã\81\99ã\80\82',
 'unexpected' => '予期しない値「$1」=「$2」です。',
-'formerror' => 'エラー:フォームを送信できませんでした',
+'formerror' => 'エラー:フォームを送信できませんでした',
 'badarticleerror' => 'このページでは要求された操作を行えません。',
-'cannotdelete' => '指定されたページあるいはファイル「$1」を削除できませんでした。
-すでに他の人によって削除された可能性があります。',
+'cannotdelete' => 'ページまたはファイル「$1」を削除できませんでした。
+他の人が既に削除した可能性があります。',
 'cannotdelete-title' => '「$1」というページを削除できません',
-'badtitle' => '不正なページ名',
-'badtitletext' => '要求されたページ名は、無効、空、または正しくない言語間リンク・ウィキ間リンクのページ名です。
-ページ名に用できない文字が1つ以上含まれている可能性があります。',
-'perfcached' => '以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81æ\9c\80æ\96°ã\81®ç\8a¶æ\85\8bã\81§ã\81ªã\81\84å\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\9c\80大$1件ã\81¾ã\81§ã\81®çµ\90æ\9e\9cã\81\8cã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81§å\88©ç\94¨å\8f¯è\83½ã\81«ã\81ªã\81£ã\81¦ã\81\84ます。',
-'perfcachedts' => '以下のデータはキャッシュされており、最後に更新された日時は$1です。最大$4件までの結果がキャッシュで利用可能になっています。',
+'badtitle' => '正しくないページ名',
+'badtitletext' => '要求されたページ名は、無効、空、正しくない言語間リンク/ウィキ間リンクのページ名、のいずれかです。
+ページ名に使用できない文字が1つ以上含まれている可能性があります。',
+'perfcached' => '以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81æ\9c\80æ\96°ã\81§ã\81¯ã\81ªã\81\84å\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82æ\9c\80大 $1 {{PLURAL:$1|件ã\81®çµ\90æ\9e\9c}}ã\81\8cã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\95ã\82\8cます。',
+'perfcachedts' => '以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。',
 'querypage-no-updates' => 'ページの更新は無効になっています。
 以下のデータの更新は現在行われていません。',
-'wrong_wfQuery_params' => 'wfQuery()ã\81¸èª¤ã\81£ã\81\9få¼\95æ\95°ã\81\8c渡ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82<br />
+'wrong_wfQuery_params' => 'wfQuery()ã\81«æ­£ã\81\97ã\81\8fã\81ªã\81\84ã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\83¼ã\81\8c渡ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9f<br />
 関数:$1<br />
-クエリ:$2',
+クエリ:$2',
 'viewsource' => 'ソースを表示',
 'viewsource-title' => '$1のソースを表示',
 'actionthrottled' => '操作が速度規制されました',
 'actionthrottledtext' => '短時間にこの操作を大量に行ったため、スパム対策として設定されている制限を超えました。
 少し時間をおいてからもう一度操作してください。',
 'protectedpagetext' => 'このページは編集できないように保護されています。',
-'viewsourcetext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82½ã\83¼ã\82¹ã\82\92é\96²è¦§ã\81\97ã\80\81ã\82³ã\83\94ã\83¼ã\81\99ã\82\8bã\81\93ã\81¨ができます:',
-'viewyourtext' => "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«å¯¾ã\81\99ã\82\8b'''ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86'''ã\81®ã\82½ã\83¼ã\82¹ã\82\92é\96²è¦§ã\81\97ã\80\81ã\82³ã\83\94ã\83¼ã\81\99ã\82\8bã\81\93ã\81¨ができます:",
-'protectedinterface' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼スに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。',
-'editinginterface' => "'''è­¦å\91\8aï¼\9a'''ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\86ã\82­ã\82¹ã\83\88を編集しています。
-このページの変更はすべての利用者のユーザーインタフェースに影響します。
-翻訳ã\82\92ã\81\99ã\82\8bå ´å\90\88ã\80\81MediaWikiã\81®å\9c°å\9f\9få\8c\96ã\83\97ã\83­ã\82¸ã\82§ã\82¯ã\83\88[//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net]ã\81®å\88©用を検討してください。",
-'sqlhidden' => '(SQLクエリ非表示)',
-'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ}}で読み込まれているため、編集できないように保護されています。
+'viewsourcetext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82½ã\83¼ã\82¹ã\81®é\96²è¦§ã\82\84ã\82³ã\83\94ã\83¼ができます:',
+'viewyourtext' => "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¸ã\81®'''ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86'''ã\81®ã\82½ã\83¼ã\82¹ã\81®é\96²è¦§ã\82\84ã\82³ã\83\94ã\83¼ができます:",
+'protectedinterface' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤スに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。',
+'editinginterface' => "'''è­¦å\91\8aï¼\9a'''ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\81®æ\96\87ç« ã\81¨ã\81\97ã\81¦ä½¿ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸を編集しています。
+このページの変更は他の利用者のユーザーインターフェイスの外観に影響します。
+翻訳ã\81\99ã\82\8bå ´å\90\88ã\80\81MediaWiki ã\81®ã\83­ã\83¼ã\82«ã\83©ã\82¤ã\82ºã\83\97ã\83­ã\82¸ã\82§ã\82¯ã\83\88 [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] ã\81®ä½¿用を検討してください。",
+'sqlhidden' => '(SQLクエリ非表示)',
+'cascadeprotected' => 'このページは、「カスケード保護」が指定された状態で保護されている以下の{{PLURAL:$1|ページ|ページ群}}で読み込まれているため、編集できないように保護されています:
 $2',
 'namespaceprotected' => "'''$1'''名前空間にあるページを編集する権限がありません。",
-'customcssprotected' => 'このCSSページはほかのユーザーの個人設定が含まれているため、編集することができません。',
-'customjsprotected' => '他の利用者の個人設定を含むため、このJavaScriptのページを編集する権限がありません。',
+'customcssprotected' => 'このCSSページは他の利用者の個人設定を含むため、あなたには編集する権限がありません。',
+'customjsprotected' => 'このJavaScriptページは他の利用者の個人設定を含むため、あなたには編集する権限がありません。',
 'ns-specialprotected' => '特別ページは編集できません。',
 'titleprotected' => "[[User:$1|$1]]によりこのページ名を持つページの作成は保護されています。
 理由は「''$2''」です。",
+'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。
+
+読み取り専用に設定した管理者からの説明:「$3」',
 
 # Virus scanner
 'virus-badscanner' => "環境設定が不適合です:不明なウイルス検知ソフトウェア:''$1''",
@@ -759,21 +764,21 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ログアウトしました。'''
 
\81\93ã\81®ã\81¾ã\81¾å\8c¿å\90\8dã\81§{{SITENAME}}ã\82\92使ã\81\84ç¶\9aã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82å\90\8cã\81\98ã\81\82ã\82\8bã\81\84ã\81¯å\88¥ã\81®å\88©ç\94¨è\80\85ã\81¨ã\81\97ã\81¦[[Special:UserLogin|ã\82\82ã\81\86ä¸\80度ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8b]]こともできます。
\81ªã\81\8aã\80\81ã\83\9aã\83¼ã\82¸ã\81«ã\82\88ã\81£ã\81¦ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ã\82¯ã\83ªã\82¢ã\81\99ã\82\8bã\81¾ã\81§ã\80\81ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\81®ã\82\88ã\81\86ã\81«è¡¨ç¤ºã\81\95ã\82\8cç¶\9aã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cã\81\82ã\82\8bã\81®ã\81§æ³¨æ\84\8fã\81\97ã\81¦ください。",
-'welcomecreation' => '== ようこそ、$1さん! ==
\81\93ã\81®ã\81¾ã\81¾å\8c¿å\90\8dã\81§{{SITENAME}}ã\81®ä½¿ç\94¨ã\82\92ç¶\9aè¡\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82å\90\8cã\81\98ã\81¾ã\81\9fã\81¯å\88¥ã\81®å\88©ç\94¨è\80\85ã\81¨ã\81\97ã\81¦[[Special:UserLogin|ã\82\82ã\81\86ä¸\80度ã\83­ã\82°ã\82¤ã\83³]]ã\81\99ã\82\8bこともできます。
\81ªã\81\8aã\80\81ã\83\9aã\83¼ã\82¸ã\81«ã\82\88ã\81£ã\81¦ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ã\82¯ã\83ªã\82¢ã\81\99ã\82\8bã\81¾ã\81§ã\80\81ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦ã\81\84ã\82\8bã\81\8bã\81®ã\82\88ã\81\86ã\81«è¡¨ç¤ºã\81\95ã\82\8cç¶\9aã\81\91ã\82\8bå ´å\90\88ã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\81\94注æ\84\8fください。",
+'welcomecreation' => '== ようこそ、$1 さん! ==
 アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
 'yourname' => '利用者名:',
 'yourpassword' => 'パスワード:',
 'yourpasswordagain' => 'パスワード再入力:',
-'remembermypassword' => 'このブラウザーにログイン情報を保存する (最長$1日間)',
+'remembermypassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
 'securelogin-stick-https' => 'ログイン後にHTTPS接続を維持',
 'yourdomainname' => 'ドメイン:',
 'externaldberror' => '外部の認証データベースでエラーが発生したか、または外部アカウント情報の更新が許可されていません。',
 'login' => 'ログイン',
 'nav-login-createaccount' => 'ログインまたはアカウント作成',
-'loginprompt' => '{{SITENAME}}にログインするにはクッキーを有効にする必要があります。',
+'loginprompt' => '{{SITENAME}}にログインするにはCookieを有効にする必要があります。',
 'userlogin' => 'ログインまたはアカウント作成',
 'userloginnocreate' => 'ログイン',
 'logout' => 'ログアウト',
@@ -784,150 +789,153 @@ $2',
 'createaccount' => 'アカウント作成',
 'gotaccount' => '既にアカウントを持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
-'userlogin-resetlink' => 'ログイン情報をå¿\98ã\82\8cã\81\9f',
+'userlogin-resetlink' => 'ログイン情報をã\81\8aå¿\98ã\82\8cã\81§ã\81\99ã\81\8bï¼\9f',
 'createaccountmail' => 'メールで送信',
 'createaccountreason' => '理由:',
 'badretype' => '入力したパスワードが一致しません。',
-'userexists' => '入力された利用者名はすでに使用されています。
-ほかの名前を選んでください。',
+'userexists' => '入力された利用者名はに使用されています。
+の名前を選んでください。',
 'loginerror' => 'ログインのエラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
-'nocookiesnew' => 'å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81\8cä½\9cæ\88\90ã\81\95ã\82\8cましたが、ログインしていません。
-{{SITENAME}}ではログインにクッキーを使用します。
-クッキーが無効になっているようです。
-クッキーを有効にしてから、新しい利用者名とパスワードでログインしてください。',
-'nocookieslogin' => '{{SITENAME}}ではログインにクッキーを使用します。
-クッキーが無効になっているようです。
-クッキーを有効にして、もう一度試してください。',
+'nocookiesnew' => 'å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90ã\81\97ましたが、ログインしていません。
+{{SITENAME}}ではログインにCookieを使用します。
+Cookieを無効にしているようです。
+Cookieを有効にしてから、新しい利用者名とパスワードでログインしてください。',
+'nocookieslogin' => '{{SITENAME}}ではログインにCookieを使用します。
+Cookieを無効にしているようです。
+Cookieを有効にしてから、もう一度試してください。',
 'nocookiesfornew' => '発信元を確認できなかったため、アカウントは作成されませんでした。
-クッキーが有効になっていることを確認の上、このページをリロードしてもう一度行ってください。',
+Cookieを有効にしていることを確認して、このページを再読込してもう一度試してください。',
 'noname' => '利用者名を正しく指定していません。',
 'loginsuccesstitle' => 'ログイン成功',
 'loginsuccess' => "'''{{SITENAME}}に「$1」としてログインしました。'''",
 'nosuchuser' => '「$1」という名前の利用者は見当たりません。
 利用者名では大文字と小文字を区別します。
-綴りが正しいことを確認するか、[[Special:UserLogin/signup|新たにアカウントを作成してください]]。',
-'nosuchusershort' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\88©ç\94¨è\80\85ã\81¯è¦\8bå½\93ã\81\9fã\82\8aません。
-綴ã\82\8aã\81\8cæ­£ã\81\97ã\81\84ã\81\93ã\81¨ã\82\92å\86\8d度確認してください。',
+綴りが正しいことを確認するか、[[Special:UserLogin/signup|新たにアカウントを作成]]してください。',
+'nosuchusershort' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®å\88©ç\94¨è\80\85ã\81¯å­\98å\9c¨ã\81\97ません。
+綴ã\82\8aã\82\92確認してください。',
 'nouserspecified' => '利用者名を指定してください。',
 'login-userblocked' => 'この利用者はブロックされています。ログインは拒否されます。',
 'wrongpassword' => 'パスワードが間違っています。 
 もう一度やり直してください。',
-'wrongpasswordempty' => 'パスワードを空にすることはできません。
+'wrongpasswordempty' => 'パスワードを空欄にはできません。
 もう一度やり直してください。',
-'passwordtooshort' => 'パスワードは{{PLURAL:$1|$1文字}}以上でなければなりません。',
-'password-name-match' => 'パスワードは利用者名と同じであってはいけません。',
-'password-login-forbidden' => 'このã\82\88ã\81\86ã\81ªå\88©ç\94¨è\80\85å\90\8dã\81¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92使ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ç¦\81æ­¢ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82',
-'mailmypassword' => '新しいパスワードを電子メールで送る',
+'passwordtooshort' => 'パスワードは {{PLURAL:$1|$1 文字}}以上にしてください。',
+'password-name-match' => 'パスワードは利用者名とは異なる必要があります。',
+'password-login-forbidden' => 'このå\88©ç\94¨è\80\85å\90\8dã\81¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ä½¿ç\94¨ã\81¯ç¦\81æ­¢ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82',
+'mailmypassword' => '新しいパスワードをメールで送信',
 'passwordremindertitle' => '{{SITENAME}}の仮パスワード通知',
-'passwordremindertext' => '誰かã\81\8cï¼\88ã\81\8aã\81\9dã\82\89ã\81\8fã\81\94è\87ªèº«ã\81\8cã\80\81IPã\82¢ã\83\89ã\83¬ã\82¹$1ã\81\8bã\82\89ï¼\89{{SITENAME}}ï¼\88$4ï¼\89ã\81®ã\83­ã\82°ã\82¤ã\83³ç\94¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\82\92ç\94³è«\8bã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
-ã\80\8c$2ã\80\8dã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81\8cã\80\8c$3ã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82
\82\82ã\81\97ã\81\94è\87ªèº«ã\81§ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ç\99ºè¡\8cã\82\92ç\94³è«\8bしたのであれば、ログインして新しいパスワードを決めてください。
-この仮パスワードは{{PLURAL:$5|$5日間}}で有効期限が切れます。
+'passwordremindertext' => '誰かï¼\88ã\81\8aã\81\9dã\82\89ã\81\8fã\81\82ã\81ªã\81\9fï¼\89ã\81\8cIPã\82¢ã\83\89ã\83¬ã\82¹$1ã\81\8bã\82\89{{SITENAME}}ï¼\88$4ï¼\89ã\81®ã\83­ã\82°ã\82¤ã\83³ç\94¨ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\82\92ç\94³è«\8bã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
+å\88©ç\94¨è\80\85ã\80\8c$2ã\80\8dã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81\8cä½\9cæ\88\90ã\81\95ã\82\8cã\80\8c$3ã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82
\82\82ã\81\97ã\81\82ã\81ªã\81\9fã\81\8cã\81\93ã\81®ç\94³è«\8bã\82\92したのであれば、ログインして新しいパスワードを決めてください。
+この仮パスワードは {{PLURAL:$5|$5 日間}}で有効期限が切れます。
 
-この依頼をしたのが他人である場合、あるいはログイン用パスワードを思い出してパスワード変更の必要がなくなった場合は、このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
+この申請をしたのが他人の場合、あるいはパスワードを思い出してパスワード変更が不要になった場合は、
+このメッセージを無視して、引き続き以前のパスワードを使用し続けることができます。',
 'noemail' => '利用者「$1」のメールアドレスは登録されていません。',
-'noemailcreate' => '有効な電子メールアドレスを入力する必要があります。',
+'noemailcreate' => '有効なメールアドレスを入力する必要があります',
 'passwordsent' => '新しいパスワードを「$1」に登録されたメールアドレスに送信しました。
 メールを受け取ったら、再度ログインしてください。',
-'blocked-mailpassword' => '使用しているIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
+'blocked-mailpassword' => 'ご使用中のIPアドレスからの編集はブロックされており、不正利用防止のため、パスワードの再発行機能は使用できません。',
 'eauthentsent' => '指定されたメールアドレスにアドレス確認のためのメールを送信しました。
-その他のメールがこのアカウント宛に送信される前に、メールの指示に従って、このアカウントが本当に自身のものであるか確認してください。',
-'throttled-mailpassword' => '新しいパスワードは{{PLURAL:$1|$1時間}}以内に送信済みです。
\82ªç\94¨é\98²æ­¢ã\81®ã\81\9fã\82\81ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81¯{{PLURAL:$1|$1æ\99\82é\96\93}}é\96\93é\9a\94ã\81§ã\81®ã\81¿å\86\8dç\99ºè¡\8cå\8f¯è\83½です。',
+その他のメールがこのアカウント宛に送信される前に、メールの指示に従って、このアカウントが本当にあなたのものかご確認ください。',
+'throttled-mailpassword' => '新しいパスワードは過去 {{PLURAL:$1|$1 時間}}に送信済みです。
\82ªç\94¨é\98²æ­¢ã\81®ã\81\9fã\82\81ã\80\81ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®å\86\8dç\99ºè¡\8cã\81¯ {{PLURAL:$1|$1 æ\99\82é\96\93}}ã\81« 1 å\9b\9eã\81®ã\81¿です。',
 'mailerror' => 'メールの送信中にエラーが発生しました:$1',
-'acct_creation_throttle_hit' => '同じIPアドレスでこのウィキへ訪れた人が、直前24時間で{{PLURAL:$1|$1個}}のアカウントを作成しており、これはこの期間中に作成が許可されている最大数です。
-そのため、現在このIPアドレスの利用者はアカウントをこれ以上作成できません。',
-'emailauthenticated' => 'メールアドレスは$2 $3に認証されています。',
+'acct_creation_throttle_hit' => 'あなたと同じ IP アドレスでこのウィキに訪れた人が、最近 24 時間で {{PLURAL:$1|$1 アカウント}}を作成しており、これはこの期間で作成が許可されている最大数です。
+そのため、現在この IP アドレスではアカウントをこれ以上作成できません。',
+'emailauthenticated' => 'メールアドレスは$2 $3に認証済みです。',
 'emailnotauthenticated' => 'メールアドレスが認証されていません。
-確認されるまで以下のいかなるメールも送られません。',
+認証されるまで、以下のいかなる機能でもメールは送信されません。',
 'noemailprefs' => 'これらの機能を有効にするためには個人設定でメールアドレスを登録する必要があります。',
-'emailconfirmlink' => 'ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92確èª\8dã\81\99ã\82\8b',
+'emailconfirmlink' => 'ã\81\82ã\81ªã\81\9fã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92確èª\8d',
 'invalidemailaddress' => '入力されたメールアドレスが正しい形式に従っていないため、受け付けられません。
 正しい形式で入力し直すか、メールアドレス欄を空にしておいてください。',
-'cannotchangeemail' => 'このウィキでは、アカウントの電子メールアドレスを変更できません。',
+'cannotchangeemail' => 'このウィキではアカウントのメールアドレスを変更できません。',
+'emaildisabled' => 'このサイトではメールを送信できません。',
 'accountcreated' => 'アカウントを作成しました',
-'accountcreatedtext' => '利用者アカウント:$1が作成されました。',
+'accountcreatedtext' => '利用者アカウント「$1」を作成しました。',
 'createaccount-title' => '{{SITENAME}}のアカウント作成',
-'createaccount-text' => '{{SITENAME}} ($4) に「$2」という名前のアカウントが、この電子メールアドレスを連絡先として作成されました。パスワードは「$3」です。
-今すぐログインし、パスワードを変更してください。
+'createaccount-text' => '誰か(おそらくあなた)が、{{SITENAME}} ($4) にあなたのメールアドレスのアカウントを作成しました。
+アカウント名「$2」、パスワード「$3」です。
+今すぐログインしてパスワードを変更してください。
 
-何かの手違いでアカウントが作成されたと思う場合、このメッセージは無視してください。',
-'usernamehasherror' => 'å\88©ç\94¨è\80\85å\90\8dã\81«ã\81¯ç\95ªå\8f·è¨\98å\8f·ã\82\92å\90«ã\82\80ことができません',
+このアカウントが何かの手違いで作成された場合は、このメッセージを無視してください。',
+'usernamehasherror' => 'å\88©ç\94¨è\80\85å\90\8dã\81«ã\81¯ç\95ªå\8f·è¨\98å\8f·ã\82\92å\90«ã\82\81ã\82\8bことができません',
 'login-throttled' => 'ログインの失敗が制限回数を超えました。
 しばらく時間をおいてから再度お試しください。',
-'login-abort-generic' => 'ログインに失敗しました。− 中止',
+'login-abort-generic' => 'ログインに失敗しました - 中止',
 'loginlanguagelabel' => '言語: $1',
-'suspicious-userlogout' => 'å£\8aã\82\8cã\81\9fã\83\96ã\83©ã\82¦ã\82¶ã\82\82ã\81\97ã\81\8fã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\83»プロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
+'suspicious-userlogout' => 'å£\8aã\82\8cã\81\9fã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81¾ã\81\9fã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥プロキシによって送信された可能性があるため、ログアウト要求は拒否されました。',
 
 # E-mail sending
-'php-mail-error-unknown' => 'PHPのmail()関数で不明なエラー',
-'user-mail-no-addy' => '電子メールアドレスなしで、電子メールを送信しようとしました。',
+'php-mail-error-unknown' => 'PHPのmail()関数での不明なエラーです。',
+'user-mail-no-addy' => 'メールアドレスなしでメールを送信しようとしました。',
 
 # Change password dialog
 'resetpass' => 'パスワードの変更',
-'resetpass_announce' => '電子メールで送信された仮パスワードでログインしています
\83­ã\82°ã\82¤ã\83³ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81\93ã\81§æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\97ã\81ªã\81\8aã\81\99必要があります:',
+'resetpass_announce' => 'メールでお送りした仮パスワードでログインしました
\83­ã\82°ã\82¤ã\83³ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81\93ã\81§æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\99ã\82\8b必要があります:',
 'resetpass_text' => '<!-- ここに文を挿入 -->',
 'resetpass_header' => 'アカウントのパスワードを変更',
 'oldpassword' => '古いパスワード:',
 'newpassword' => '新しいパスワード:',
 'retypenew' => '新しいパスワードを再入力:',
 'resetpass_submit' => '再設定してログイン',
-'resetpass_success' => 'パスワードの変更に成功しました
-ログインしています',
+'resetpass_success' => 'パスワードの変更に成功しました!
+ログインしています...',
 'resetpass_forbidden' => 'パスワードは変更できません',
 'resetpass-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'resetpass-submit-loggedin' => 'パスワードを変更',
 'resetpass-submit-cancel' => '中止',
-'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが無効です
\81\99ã\81§ã\81«ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89å¤\89æ\9b´ã\82\92è¡\8cã\81£ã\81¦ã\81\84ã\82\8bã\81\8bã\80\81æ\96°ã\81\97ã\81\84ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®ç\99ºè¡\8cã\82\92ä¾\9dé ¼ã\81\97ã\81¦ã\81\84ã\82\8b可能性があります。',
+'resetpass-wrong-oldpass' => '仮パスワードまたは現在のパスワードが正しくありません
\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92æ\97¢ã\81«å¤\89æ\9b´ã\81\97ã\81\9fã\80\81ã\81¾ã\81\9fã\81¯æ\96°ã\81\97ã\81\84ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ä¾\9dé ¼ã\81\97ã\81\9f可能性があります。',
 'resetpass-temp-password' => '仮パスワード:',
 
 # Special:PasswordReset
 'passwordreset' => 'パスワードの再設定',
-'passwordreset-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81«å\9b\9eç­\94ã\81\99ã\82\8bã\81¨ã\80\81ã\81\94è\87ªèº«ã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°ã\81\8cé\9b»å­\90ã\83¡ã\83¼ã\83«ã\81§é\80\9aç\9f¥ã\81\95ã\82\8cます。',
+'passwordreset-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81«å\85¥å\8a\9bã\81\99ã\82\8bã\81¨ã\80\81ã\82¢ã\82«ã\82¦ã\83³ã\83\88詳細ã\81®ã\83ªã\83\9eã\82¤ã\83³ã\83\80ã\83¼ã\82\92ã\83¡ã\83¼ã\83«ã\81§ã\81\8aé\80\81ã\82\8aã\81\97ます。',
 'passwordreset-legend' => 'パスワードの再設定',
 'passwordreset-disabled' => 'パスワードの再設定は、このウィキでは無効になっています。',
-'passwordreset-pretext' => '{{PLURAL:$1||以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81®ã\81\86ã\81¡ã\81®ã\81²ã\81¨ã\81¤ã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82}}',
+'passwordreset-pretext' => '{{PLURAL:$1||ä¸\8bè¨\98ã\81®ã\83\87ã\83¼ã\82¿ã\81®ã\81\84ã\81\9aã\82\8cã\81\8b 1 ã\81¤ã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84}}',
 'passwordreset-username' => '利用者名:',
-'passwordreset-domain' => 'ドメイン:',
-'passwordreset-capture' => '送られるメールの内容を見ますか?',
-'passwordreset-capture-help' => 'ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\83\81ã\82§ã\83\83ã\82¯ã\81\99ã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81«é\80\81ã\82\89ã\82\8cã\82\8bã\83¡ã\83¼ã\83«ã\81®å\86\85容ï¼\88ä¸\80æ\99\82ç\9a\84ã\81ªã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92å\90«ã\82\80ï¼\89ã\82\92ã\81\82ã\81ªã\81\9fã\82\82è¦\8bã\82\8bã\81\93ã\81¨ã\81\8cできます。',
-'passwordreset-email' => '電子メールアドレス:',
+'passwordreset-domain' => 'ドメイン',
+'passwordreset-capture' => '送信されるメールの内容を表示しますか?',
+'passwordreset-capture-help' => 'ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cã\82\8bã\81¨ã\80\81å\88©ç\94¨è\80\85ã\81«é\80\81ä¿¡ã\81\95ã\82\8cã\82\8bã\83¡ã\83¼ã\83«ã\81®å\86\85容ï¼\88ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92å\90«ã\82\80ï¼\89ã\82\92ã\81\82ã\81ªã\81\9fã\82\82é\96²è¦§できます。',
+'passwordreset-email' => 'メールアドレス:',
 'passwordreset-emailtitle' => '{{SITENAME}}上のアカウントの詳細',
-'passwordreset-emailtext-ip' => 'どなたかが(おそらくあなた、IP アドレス $1 )あなたの {{SITENAME}} ($4)
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\95ã\82\8cました。
¸\8bè¨\98ã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88}}がこのメールアドレスと紐付けられています。
+'passwordreset-emailtext-ip' => 'どなたか(おそらくあなた、IP アドレス $1)が {{SITENAME}} ($4) での
\81\82ã\81ªã\81\9fã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\97ました。
»¥ä¸\8bã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88\82¢ã\82«ã\82¦ã\83³ã\83\88群}}がこのメールアドレスと紐付けられています。
 
 $2
 
-{{PLURAL:$3|ã\81\93ã\81®ä¸\80æ\99\82ç\9a\84ã\81ªã\83\91ã\82¹ã\83¯ã\83¼ã\83\89}}ã\81¯{{PLURAL:$5|$5æ\97¥}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\80\81æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ã\81\99ã\81\90ã\81«é\81¸ã\81必要があります。
\81\93ã\81®ç\94³è«\8bã\81\8cä»\96ã\81®ã\81 ã\82\8cã\81\8bã\81«ã\82\88ã\82\8bã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\81\82ã\82\8bã\81\84ã\81¯ã\81\82ã\81ªã\81\9fã\81\8cè\87ªèº«ã\81®å\85\83ã\80\85のパスワードを
-è¦\9aã\81\88ã\81¦ã\81\8aã\82\8aã\80\81å¤\89ã\81\88ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92ç\84¡è¦\96ã\81\97ã\81¦
»¥å\89\8dã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92使ã\81\84続けることができます。',
+{{PLURAL:$3|ã\81\93ã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89\81\93ã\82\8cã\82\89ã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89}}ã\81¯ {{PLURAL:$5|$5 æ\97¥é\96\93}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\81\99ã\81\90ã\81«ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\99ã\82\8b必要があります。
\81\93ã\82\8cã\81\8cä»\96ã\81®èª°ã\81\8bã\81«ã\82\88ã\82\8bç\94³è«\8bã\81§ã\81\82ã\82\8bå ´å\90\88ã\80\81ã\81\82ã\82\8bã\81\84ã\81¯ã\81\82ã\81ªã\81\9fã\81\8cè\87ªå\88\86ã\81®å\85\83のパスワードを
+è¦\9aã\81\88ã\81¦ã\81\84ã\81¦ã\81\9dã\82\8cã\82\92å¤\89æ\9b´ã\81\97ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\82\92ç\84¡è¦\96ã\81\97ã\81¦ä»¥å\89\8dã\81®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92
½¿ç\94¨ã\81\97続けることができます。',
 'passwordreset-emailtext-user' => '{{SITENAME}} の利用者 $1 があなたの {{SITENAME}} ($4)
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\95ã\82\8cました。
¸\8bè¨\98ã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88}}がこのメールアドレスと紐付けられています。
\81«ã\81\8aã\81\91ã\82\8bã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®è©³ç´°æ\83\85å ±ã\82\92é\80\81ä¿¡ã\81\99ã\82\8bã\82\88ã\81\86ç\94³è«\8bã\81\97ました。
»¥ä¸\8bã\81®å\88©ç\94¨è\80\85{{PLURAL:$3|ã\82¢ã\82«ã\82¦ã\83³ã\83\88\82¢ã\82«ã\82¦ã\83³ã\83\88群}}がこのメールアドレスと紐付けられています。
 
 $2
 
-{{PLURAL:$3|ã\81\93ã\81®ä¸\80æ\99\82ç\9a\84ã\81ªパスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\80\81æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92ã\81\99ã\81\90ã\81«é\81¸ã\81必要があります。
-この申請が他のだれかによるものであるか、あるいはあなたが自身の元々のパスワードを
-è¦\9aã\81\88ã\81¦ã\81\8aã\82\8aã\80\81å¤\89ã\81\88ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88ã\81«は、このメッセージを無視して
+{{PLURAL:$3|ã\81\93ã\81®ä»®ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89\81\93ã\82\8cã\82\89ã\81®ä»®パスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。
\81\82ã\81ªã\81\9fã\81¯ã\80\81ã\81\99ã\81\90ã\81«ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦æ\96°ã\81\97ã\81\84ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92設å®\9aã\81\99ã\82\8b必要があります。
+この申請が他の誰かによるものの場合、あるいはあなたが自分の元のパスワードを
+è¦\9aã\81\88ã\81¦ã\81\84ã\81¦ã\80\81å¤\89æ\9b´ã\81\97ã\81\9fã\81\8fã\81ªã\81\84å ´å\90\88は、このメッセージを無視して
 以前のパスワードを使い続けることができます。',
-'passwordreset-emailelement' => '利用者名: $1
-仮パスワード: $2',
-'passwordreset-emailsent' => '確èª\8dã\81®ã\83¡ã\83¼ã\83«ã\81\8cé\80\81ä¿¡ã\81\95ã\82\8cました。',
-'passwordreset-emailsent-capture' => '確認のメールが送信されました。以下に表示します。',
-'passwordreset-emailerror-capture' => '生成された確認メールを以下に表示していますが、利用者への送信には失敗しました: $1',
+'passwordreset-emailelement' => '利用者名:$1
+仮パスワード:$2',
+'passwordreset-emailsent' => '確èª\8dã\83¡ã\83¼ã\83«ã\82\92ã\81\8aé\80\81ã\82\8aã\81\97ました。',
+'passwordreset-emailsent-capture' => '下記の内容の、確認メールをお送りしました。',
+'passwordreset-emailerror-capture' => '下記の内容の確認メールを生成しましたが、利用者への送信に失敗しました:$1',
 
 # Special:ChangeEmail
 'changeemail' => 'メールアドレスの変更',
 'changeemail-header' => 'アカウントのメールアドレスを変更',
-'changeemail-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81¸å\85¥å\8a\9bã\81\99ã\82\8bã\81\93ã\81¨ã\81§ã\80\81ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®å¤\89æ\9b´ã\82\92å®\8cäº\86ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\80\81パスワードを入力する必要があります。',
+'changeemail-text' => 'ã\81\93ã\81®ã\83\95ã\82©ã\83¼ã\83 ã\81§ã\81¯ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92å¤\89æ\9b´ã\81§ã\81\8dã\81¾ã\81\99ã\80\82ã\81\93ã\81®å¤\89æ\9b´ã\82\92確èª\8dã\81\99ã\82\8bã\81\9fã\82\81ã\81«パスワードを入力する必要があります。',
 'changeemail-no-info' => 'このページに直接アクセスするためにはログインしている必要があります。',
 'changeemail-oldemail' => '現在のメールアドレス:',
 'changeemail-newemail' => '新しいメールアドレス:',
@@ -943,7 +951,7 @@ $2
 'link_sample' => 'リンクの名前',
 'link_tip' => '内部リンク',
 'extlink_sample' => 'http://www.example.com リンクの名前',
-'extlink_tip' => '外部リンク (http:// を忘れずにつけてください)',
+'extlink_tip' => '外部リンク(http:// を忘れずに付けてください)',
 'headline_sample' => '見出し文',
 'headline_tip' => '2段目の見出し',
 'nowiki_sample' => 'ここにマークアップを無効にするテキストを入力します',
@@ -952,34 +960,34 @@ $2
 'image_tip' => 'ファイルの埋め込み',
 'media_sample' => 'サンプル.ogg',
 'media_tip' => 'ファイルへのリンク',
-'sig_tip' => '時刻印きの署名',
+'sig_tip' => '時刻印きの署名',
 'hr_tip' => '水平線を挿入(利用は控えめに)',
 
 # Edit pages
 'summary' => '編集内容の要約:',
-'subject' => '題名見出し:',
+'subject' => '題名/見出し:',
 'minoredit' => 'これは細部の編集です',
-'watchthis' => 'このページをウォッチする',
+'watchthis' => 'このページをウォッチ',
 'savearticle' => 'ページを保存',
 'preview' => 'プレビュー',
 'showpreview' => 'プレビューを表示',
 'showlivepreview' => 'ライブプレビュー',
 'showdiff' => '差分を表示',
 'anoneditwarning' => "'''警告:'''ログインしていません。
\81\93ã\81®ã\81¾ã\81¾æ\8a\95稿ã\82\92è¡\8cã\81£ã\81\9få ´å\90\88ã\80\81使用中のIPアドレスがこのページの編集履歴に記録されます。",
-'anonpreviewwarning' => "''ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82æ\8a\95稿ã\82\92ä¿\9då­\98ã\81\99ã\82\8bã\81¨ã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å±¥æ­´ã\81«ä½¿ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8c記録されます。''",
\81\93ã\81®ã\81¾ã\81¾æ\8a\95稿ã\81\97ã\81\9få ´å\90\88ã\80\81ã\81\94使用中のIPアドレスがこのページの編集履歴に記録されます。",
+'anonpreviewwarning' => "''ã\83­ã\82°ã\82¤ã\83³ã\81\97ã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\80\82æ\8a\95稿ã\82\92ä¿\9då­\98ã\81\99ã\82\8bã\81¨ã\80\81ã\81\94使ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å±¥æ­´ã\81«記録されます。''",
 'missingsummary' => "'''注意:'''要約欄が空欄です。
 「{{int:savearticle}}」をもう一度クリックすると、編集は要約なしで保存されます。",
 'missingcommenttext' => '以下にコメントを入力してください。',
-'missingcommentheader' => "'''注意::'' このコメントに対する題名・見出しが空欄です。
+'missingcommentheader' => "'''注意:'''このコメントに対する題名/見出しが空欄です。
 「{{int:savearticle}}」ボタンをもう一度押すと、空のまま編集が保存されます。",
 'summary-preview' => '要約のプレビュー:',
-'subject-preview' => '題名見出しのプレビュー:',
+'subject-preview' => '題名/見出しのプレビュー:',
 'blockedtitle' => '利用者はブロックされています',
 'blockedtext' => "'''この利用者名またはIPアドレスはブロックされています。'''
 
 ブロックは$1によって実施されました。
-ブロックの理由は「$2」です。
+ブロックの理由は ''$2'' です。
 
 * ブロック開始時期:$8
 * ブロック解除予定:$6
@@ -987,9 +995,9 @@ $2
 
 このブロックについて、$1もしくは他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]に問い合わせることができます。
 ただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。
\8f¾å\9c¨ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯$3ã\80\81ã\81\93ã\81®ã\83\96ã\83­ã\83\83ã\82¯IDã\81¯&#x23;$5です。
-問い合わせを行う際には、上記の情報を必ず書いてください。",
-'autoblockedtext' => "用中のIPアドレスは、$1によって投稿をブロックされた利用者によって使用されたために自動的にブロックされています。
\8f¾å\9c¨ã\81\94使ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯$3ã\80\81ã\81\93ã\81®ã\83\96ã\83­ã\83\83ã\82¯IDã\81¯#$5です。
+お問い合わせの際には、上記の情報を必ず書いてください。",
+'autoblockedtext' => "ご使用中のIPアドレスは、$1によって投稿をブロックされた利用者によって使用されたために自動的にブロックされています。
 理由は次の通りです。
 
 :''$2''
@@ -1002,8 +1010,8 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこの件につ
 
 ただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、メール送信機能が使えないことに注意してください。
 
-現在利用中のIPアドレスは$3 、このブロックIDは&#x23;$5です。
-問い合わせを行う際には、この情報を必ず書いてください。",
+現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。
+お問い合わせの際には、この情報を必ず書いてください。",
 'blockednoreason' => '理由が設定されていません',
 'whitelistedittext' => 'このページを編集するには$1する必要があります。',
 'confirmedittext' => 'ページの編集を始める前にメールアドレスの確認をする必要があります。
@@ -1021,22 +1029,22 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこの件につ
 'newarticle' => '(新)',
 'newarticletext' => "まだ存在していないページへのリンクをたどりました。
 このページを新規に作成するには、下のボックスに内容を書き込んでください(詳しくは[[{{MediaWiki:Helppage}}|ヘルプページ]]を参照してください)。
-誤ã\81£ã\81¦ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81\9fã\81©ã\82\8aç\9d\80ã\81\84ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\81®'''æ\88»ã\82\8b'''ã\83\9cã\82¿ã\83³ã\82\92使ã\81£ã\81¦前のページに戻ってください。",
+誤ã\81£ã\81¦ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81\9fã\81©ã\82\8aç\9d\80ã\81\84ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®'''æ\88»ã\82\8b'''ã\83\9cã\82¿ã\83³ã\81§前のページに戻ってください。",
 'anontalkpagetext' => "----''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。
-匿名利用者を識別するために、利用者名のわりにIPアドレスが使用されています。
-IPアドレスは複数の利用者の間で共有されていることがあります。
-もし、自身が匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
+匿名利用者を識別するために、利用者名のわりにIPアドレスが使用されています。
+IP アドレスは複数の利用者で共有されている場合があります。
+もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
 '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' => '「<nowiki>$1</nowiki>」という名前のアカウントは登録されていません。
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cé\81©å\88\87ã\81\8bã\81©ã\81\86ã\81\8b確èª\8dã\81\97ã\81¦ください。',
+他のページ内で[[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」という利用者アカウントは登録されていません。
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä½\9cæ\88\90/ç·¨é\9b\86ã\81\8cé\81©å\88\87ã\81\8bã\81\94確èª\8dください。',
 'userpage-userdoesnotexist-view' => '利用者アカウント「$1」は登録されていません。',
 'blocked-notice-logextract' => 'この利用者は現在ブロックされています。
-参考のために最新のブロック記録を以下に表示します',
-'clearyourcache' => "'''注意:''' 保存後、変更を確認するにはブラウザのキャッシュを消去する必要がある場合があります。
+参考のために最新のブロック記録を以下に表示します',
+'clearyourcache' => "'''注æ\84\8f:''' ä¿\9då­\98å¾\8cã\80\81å¤\89æ\9b´ã\82\92確èª\8dã\81\99ã\82\8bã\81«ã\81¯ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92æ¶\88å\8e»ã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82
 * '''Firefox / Safari:''' ''Shift'' を押しながら ''再読み込み'' をクリックする、もしくは ''Ctrl-F5'' か ''Ctrl-R'' を押してください (Macでは ''&#x2318;-R'' )
 * '''Google Chrome:''' ''Ctrl-Shift-R'' を押してください (Macでは ''&#x2318;-Shift-R'' )
 * '''Internet Explorer:''' ''Ctrl'' を押しながら ''最新の情報に更新'' をクリックする、もしくは ''Ctrl-F5'' を押してください
@@ -1046,33 +1054,35 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'userjsyoucanpreview' => "'''ヒント:''' 「{{int:showpreview}}」ボタンを使うと、保存前に新しいスクリプトを試験できます。",
 'usercsspreview' => "'''利用者CSSをプレビューしています。'''
 '''まだ保存されていません!'''",
-'userjspreview' => "'''利用者JavaScriptを試験プレビューしています。'''
+'userjspreview' => "'''利用者JavaScriptを試験/プレビューしています。'''
 '''まだ保存されていません!'''",
 'sitecsspreview' => "'''ここでは、CSSをプレビューしているだけに過ぎません。'''
 '''まだ保存されていません!'''",
 'sitejspreview' => "'''ここでは、JavaScriptをプレビューしているだけに過ぎません。'''
 '''まだ保存されていません!'''",
 'userinvalidcssjstitle' => "'''警告:'''「$1」という外装はありません。
-.cssと.jsページを編集する際には、ページ名を小文字にすることを忘れないでください(例えば、{{ns:user}}:Hoge/Vector.cssではなく{{ns:user}}:Hoge/vector.cssとなります)。",
+カスタム .css/.js ページではページ名を小文字にしてください。例:{{ns:user}}:Hoge/Vector.css ではなく {{ns:user}}:Hoge/vector.css",
 'updated' => '(更新)',
 'note' => "'''お知らせ:'''",
 'previewnote' => "'''これはプレビューです。'''
-変更箇所はまだ保存されていません! [[#editform|→ 編集を続行]]",
+変更箇所はまだ保存されていません!",
+'continue-editing' => '編集を続行',
 'previewconflict' => 'このプレビューは、上の文章編集エリアの文章を保存した場合にどう見えるようになるかを示すものです。',
-'session_fail_preview' => "'''ç\94³ã\81\97訳ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ï¼\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\81\8cå\88\87æ\96­ã\81\95ã\82\8cたため編集を処理できませんでした。'''
-もう一度やりなおしてください。
+'session_fail_preview' => "'''ç\94³ã\81\97訳ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ï¼\81ã\82»ã\83\83ã\82·ã\83§ã\83³ã\83\87ã\83¼ã\82¿ã\81\8cæ¶\88失ã\81\97たため編集を処理できませんでした。'''
+もう一度やりしてください。
 それでも失敗する場合、[[Special:UserLogout|ログアウト]]してからログインし直してください。",
-'session_fail_preview_html' => "'''申し訳ありません!セッションが切断されたため編集を処理することができませんでした。'''
+'session_fail_preview_html' => "'''申し訳ありません!セッション データが消失したため編集を処理できませんでした。'''
 
 ''{{SITENAME}}では生のHTMLが有効であり、JavaScriptでの攻撃を予防するためにプレビューを表示していません。''
 
-'''この編集が問題ないものであるならば、もう一度保存してください。'''
-それでもうまくいかない際には一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
-'token_suffix_mismatch' => "'''使用中のクライアントが編集トークン内の句読点を正しく処理していないため、編集を受け付けられません。'''
+'''この編集が問題ない場合はもう一度保存してください。'''
+それでもうまくいかない場合は一度[[Special:UserLogout|ログアウト]]して、ログインし直してみてください。",
+'token_suffix_mismatch' => "'''使用中のクライアントが編集トークン内の句読点を正しく処理していないため、編集を受け付けられません。'''
 ページ本文の破損を防ぐため、編集は反映されません。
-これは、問題のある匿名プロキシサービスを利用していると、起こることがあります。",
-'edit_form_incomplete' => "'''一部の編集フォームの値がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。'''",
+問題のある匿名プロキシ サービスを使用していると、これが発生する場合があります。",
+'edit_form_incomplete' => "'''編集フォームの一部がサーバーに届きませんでした。ご確認の上、そのまま再度投稿してください。'''",
 'editing' => '「$1」を編集中',
+'creating' => '「$1」を作成中',
 'editingsection' => '「$1」を編集中 (節単位)',
 'editingcomment' => '「$1」を編集中 (新しい節)',
 'editconflict' => '編集競合:$1',
@@ -1083,38 +1093,38 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 上側のテキスト領域の内容'''だけ'''が、「{{int:savearticle}}」をクリックした時に実際に保存されます。",
 'yourtext' => '編集中の文章',
 'storedversion' => '保存された版',
-'nonunicodebrowser' => "'''警告:使用中のブラウザがUnicodeに対応していません。'''
-å®\89å\85¨ã\81«ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bå\9b\9eé\81¿ç­\96ã\81\8c表示ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ï¼\9aç·¨é\9b\86ã\83\9cã\83\83ã\82¯ã\82¹ä¸­ã\81®é\9d\9eASCIIæ\96\87å­\97ã\81¯16é\80²æ\95°æ\96\87å­\97ã\82³ã\83¼ã\83\89ã\81«ã\82\88ã\81£ã\81¦è¡¨ç\8f¾ã\81\95ã\82\8cます。",
+'nonunicodebrowser' => "'''警告:ご使用中のブラウザーはUnicodeに未対応です。'''
+å®\89å\85¨ã\81«ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bå\9b\9eé\81¿ç­\96ã\82\92表示ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ï¼\9aç·¨é\9b\86ã\83\9cã\83\83ã\82¯ã\82¹å\86\85ã\81®é\9d\9eASCIIæ\96\87å­\97ã\82\9216é\80²æ\95°ã\82³ã\83¼ã\83\89ã\81§è¡¨ç\8f¾ã\81\97ã\81¦ã\81\84ます。",
 'editingold' => "'''警告:このページの古い版を編集しています。'''
 保存すると、この版以降に追加されていた変更がすべて失われます。",
 'yourdiff' => '差分',
-'copyrightwarning' => "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2ï¼\88詳細ã\81¯$1ã\82\92å\8f\82ç\85§ï¼\89ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\95ã\82\8cたと見なされることにご注意ください。
-投稿されたものが、他人によって遠慮なく編集され、自由に配布されることを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\95ã\82\8cã\82\8bã\82\82ã\81®ã\81¯ã\80\81è\87ªèº«ã\81«ã\82\88ã\81£ã\81¦æ\9b¸ã\81\8bã\82\8cã\81\9fã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ã\83»ã\83\89ã\83¡ã\82¤ã\83³ã\80\81またはそれに類するフリーな資料からの複製であることを約束してください。
+'copyrightwarning' => "{{SITENAME}}ã\81¸ã\81®æ\8a\95稿ã\81¯ã\80\81ã\81\99ã\81¹ã\81¦$2ï¼\88詳細ã\81¯$1ã\82\92å\8f\82ç\85§ï¼\89ã\81®ã\82\82ã\81¨ã\81§å\85¬é\96\8bã\81\97たと見なされることにご注意ください。
+あなたが投稿したものを、他人がよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\99ã\82\8bã\81®ã\81¯ã\80\81ã\81\82ã\81ªã\81\9fã\81\8cæ\9b¸ã\81\84ã\81\9fã\82\82ã\81®ã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ ã\83\89ã\83¡ã\82¤ã\83³またはそれに類するフリーな資料からの複製であることを約束してください。
 '''著作権保護されている作品を、許諾なしに投稿しないでください!'''",
-'copyrightwarning2' => "{{SITENAME}}への全ての投稿は、他の利用者によって編集、変更、除去される可能性があります。
-自信の投稿が他人によって遠慮なく編集されることを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\95ã\82\8cã\82\8bã\82\82ã\81®ã\81¯ã\80\81è\87ªèº«ã\81«ã\82\88ã\81£ã\81¦æ\9b¸ã\81\8bã\82\8cã\81\9fã\82\82ã\81®ã\81§ã\81\82ã\82\8bã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ã\83»ã\83\89ã\83¡ã\82¤ã\83³ã\80\81またはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
+'copyrightwarning2' => "{{SITENAME}}へのすべての投稿は、他の利用者が編集、変更、除去する可能性があります。
+あなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />
\81¾ã\81\9fã\80\81æ\8a\95稿ã\81\99ã\82\8bã\81®ã\81¯ã\80\81ã\81\82ã\81ªã\81\9fã\81\8cæ\9b¸ã\81\84ã\81\9fã\82\82ã\81®ã\81\8bã\80\81ã\83\91ã\83\96ã\83ªã\83\83ã\82¯ ã\83\89ã\83¡ã\82¤ã\83³またはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
 '''著作権保護されている作品を、許諾なしに投稿してはいけません!'''",
-'longpageerror' => "'''エラー:投稿された文章は {{PLURAL:$1|1キロバイト|$1キロバイト}}の長さがあります。これは投稿できる最大の長さである{{PLURAL:$2|$2キロバイト|$2キロバイト}}を超えています。'''
+'longpageerror' => "'''エラー:投稿された文章は {{PLURAL:$1|$1 KB}} の長さがあります。これは投稿できる最大の長さ {{PLURAL:$2|$2 KB}} を超えています。'''
 この編集は保存できません。",
-'readonlywarning' => "'''è­¦å\91\8aï¼\9aã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81\8cã\83¡ã\83³ã\83\86ã\83\8aã\83³ã\82¹ã\81®ã\81\9fã\82\81ã\81«ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81、現在は編集を保存できません。'''
-必要であれば文章をカットアンドペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。
+'readonlywarning' => "'''è­¦å\91\8aï¼\9aã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81\8cã\83¡ã\83³ã\83\86ã\83\8aã\83³ã\82¹ã\81®ã\81\9fã\82\81ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8a、現在は編集を保存できません。'''
+必要であれば文章をカット&amp;ペーストしてテキストファイルとして保存し、後ほど保存をやり直してください。
 
 データベースをロックした管理者による説明は以下の通りです:$1",
-'protectedpagewarning' => "'''è­¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\8aã\82\8aã\80\81管ç\90\86è\80\85権é\99\90ã\81®ã\81\82ã\82\8bå\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81ªã\81\84ã\82\88ã\81\86ã\81«ã\81ªã\81£ã\81¦ã\81\84ます。'''
-参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8bç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\9bã\82\93
-参考として以下に一番最後の記録を表示します:",
-'cascadeprotectedwarning' => "'''警告:'''このページはカスケード保護されている以下の{{PLURAL:$1|ページ}}から読み込まれているため、管理者権限を持つ利用者しか編集できないように保護されています。",
+'protectedpagewarning' => "'''è­¦å\91\8aï¼\9aã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81管ç\90\86è\80\85権é\99\90ã\82\92æ\8c\81ã\81¤å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dます。'''
+参考として以下に最後の記録を表示します:",
+'semiprotectedpagewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8cç·¨é\9b\86ã\81§ã\81\8dã\81¾ã\81\99
+参考として以下に最後の記録を表示します:",
+'cascadeprotectedwarning' => "'''警告:'''このページはカスケード保護されている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、管理者権限を持つ利用者のみが編集できるように保護されています:",
 'titleprotectedwarning' => "'''警告:このページは保護されているため、作成には[[Special:ListGroupRights|特定の権限]]が必要です。'''
-参考として以下に一番最後の記録を表示します:",
-'templatesused' => 'このページで使れている{{PLURAL:$1|テンプレート}}:',
-'templatesusedpreview' => 'このプレビューで使れている{{PLURAL:$1|テンプレート}}:',
-'templatesusedsection' => 'この節で使れている{{PLURAL:$1|テンプレート}}:',
+参考として以下に最後の記録を表示します:",
+'templatesused' => 'このページで使用されている{{PLURAL:$1|テンプレート}}:',
+'templatesusedpreview' => 'このプレビューで使用されている{{PLURAL:$1|テンプレート}}:',
+'templatesusedsection' => 'この節で使用されている{{PLURAL:$1|テンプレート}}:',
 'template-protected' => '(保護)',
 'template-semiprotected' => '(半保護)',
-'hiddencategories' => 'このページは$1隠しカテゴリに属しています:',
+'hiddencategories' => 'このページは {{PLURAL:$1|$1 個の隠しカテゴリ}}に属しています:',
 'edittools' => '<!-- ここに書いたテキストは編集及びアップロードのフォームの下に表示されます。 -->',
 'nocreatetitle' => 'ページの作成が制限されています',
 'nocreatetext' => '{{SITENAME}}ではページの新規作成を制限しています。
@@ -1123,15 +1133,15 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'sectioneditnotsupported-title' => '節単位編集はサポートされていません',
 'sectioneditnotsupported-text' => 'このページでは節単位編集はサポートされません。',
 'permissionserrors' => '認証エラー',
-'permissionserrorstext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ç·¨é\9b\86権é\99\90ã\81\8cありません。{{PLURAL:$1|理由}}は以下の通りです:',
-'permissionserrorstext-withaction' => '以下に示された{{PLURAL:$1|理由}}により、$2を行うことができません:',
-'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
+'permissionserrorstext' => 'ã\81\82ã\81ªã\81\9fã\81«ã\81¯ã\81\93ã\81®æ\93\8dä½\9cã\82\92è¡\8cã\81\86権é\99\90ã\81¯ありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
+'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
 
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\97ç¶\9aã\81\91ã\82\8bã\81\93ã\81¨ã\81\8cé\81©å\88\87ã\81§ã\81\82ã\82\8bã\81\8bã\81©ã\81\86ã\81\8b確èª\8dã\81\97ã\81¦ください。
\8f\82è\80\83ã\81¨ã\81\97ã\81¦以下にこのページの削除と移動の記録を表示します:",
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ç·¨é\9b\86ã\82\92ç¶\9aè¡\8cã\81\99ã\82\8bã\81®ã\81\8cé\81©å\88\87ã\81\8bã\81©ã\81\86ã\81\8bã\81\94確èª\8dください。
\8f\82è\80\83ã\81®ã\81\9fã\82\81以下にこのページの削除と移動の記録を表示します:",
 'moveddeleted-notice' => 'このページは削除されています。
 参考のため、このページの削除と移動の記録を以下に表示します。',
-'log-fulllog' => '完全な記録を見る',
+'log-fulllog' => '完全な記録を閲覧',
 'edit-hook-aborted' => 'フックによって編集が破棄されました。
 理由は不明です。',
 'edit-gone-missing' => 'ページを更新できませんでした。
@@ -1139,38 +1149,45 @@ IPアドレスは複数の利用者の間で共有されていることがあり
 'edit-conflict' => '編集が競合。',
 'edit-no-change' => '文章が変更されていないため、編集は無視されました。',
 'edit-already-exists' => '新しいページを作成できませんでした。
-そのページは、すでに存在しています。',
+そのページは既に存在しています。',
+'defaultmessagetext' => '既定のメッセージ文',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
+'expensive-parserfunction-warning' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
 
-呼び出しは{{PLURAL:$2|$2}}回以下である必要があります(現在は{{PLURAL:$1|$1}}回)。",
+{{PLURAL:$2|呼び出しを $2 回}}未満にしてください({{PLURAL:$1|現在は $1 回}})。",
 'expensive-parserfunction-category' => '高負荷な構文解析関数の呼び出しが多過ぎるページ',
 'post-expand-template-inclusion-warning' => "'''警告:'''テンプレートの読み込みサイズが大き過ぎます。
 いくつかのテンプレートは読み込まれません。",
 'post-expand-template-inclusion-category' => 'テンプレート読み込みサイズが制限値を越えているページ',
-'post-expand-template-argument-warning' => "'''è­¦å\91\8aï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯ã\80\81å±\95é\96\8bå¾\8cã\81®ã\82µã\82¤ã\82ºã\81\8c大ã\81\8dã\81\99ã\81\8eã\82\8bå\80¤ã\82\92渡ã\81\97ã\81\9fã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\81\8c\81¤ä»¥ä¸\8aå\90«ã\81¾ã\82\8cã\81¦います。
\81\93ã\82\8cã\82\89ã\81®å\80¤ã\81¯ç\9c\81ç\95¥ã\81\95ã\82\8cました。",
+'post-expand-template-argument-warning' => "'''è­¦å\91\8aï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ã\80\81å±\95é\96\8bå¾\8cã\81®ã\82µã\82¤ã\82ºã\81\8c大ã\81\8dã\81\99ã\81\8eã\82\8bå¼\95æ\95°ã\82\92渡ã\81\97ã\81\9fã\83\86ã\83³ã\83\97ã\83¬ã\83¼ã\83\88ã\82\92å°\91ã\81ªã\81\8fã\81¨ã\82\82\81¤å\90«ã\82\93ã\81§います。
\81\93ã\82\8cã\82\89ã\81®å¼\95æ\95°ã\82\92ç\9c\81ç\95¥ã\81\97ました。",
 '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' => 'ページが展開の深さ制限を超えました',
+'parser-unstrip-loop-warning' => 'Unstrip のループが検出されました',
+'parser-unstrip-recursion-limit' => 'Unstrip の再帰($1)が上限を超えました',
 
 # "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ます。
-ä¸\8bè¨\98ã\81®å·®å\88\86ã\82\92確èª\8dã\81\97ã\80\81æ\9c¬å½\93ã\81«å\8f\96ã\82\8aæ¶\88ã\81\99ã\81¹ã\81\8dã\81 ã\81¨ç¢ºèª\8dã\81\97ã\81¦ã\81\8bã\82\89ã\80\81変更を保存して取り消しを完了してください。',
+'undo-success' => 'ã\81\93ã\81®ç·¨é\9b\86ã\82\92å\8f\96ã\82\8aæ¶\88ã\81\9bます。
+ä¸\8bè¨\98ã\81®å·®å\88\86ã\82\92確èª\8dã\81\97ã\81¦ã\80\81æ\9c¬å½\93ã\81«å\8f\96ã\82\8aæ¶\88ã\81\97ã\81¦ã\81\84ã\81\84ã\81\8bæ¤\9c証ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\82\88ã\82\8dã\81\97ã\81\91ã\82\8cã\81°変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
-'undo-norev' => 'å\8f\96ã\82\8aæ¶\88ã\81\9dã\81\86ã\81¨ã\81\97ã\81\9fç·¨é\9b\86ã\81¯å­\98å\9c¨ã\81\97ã\81ªã\81\84ã\81\8bã\81\99ã\81§ã\81«å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\81\9fã\82\81ã\81«取り消せませんでした。',
+'undo-norev' => 'å\8f\96ã\82\8aæ¶\88ã\81\9dã\81\86ã\81¨ã\81\97ã\81\9fç·¨é\9b\86ã\81\8cå­\98å\9c¨ã\81\97ã\81ªã\81\84ã\81\8bå\89\8aé\99¤æ¸\88ã\81¿ã\81®ã\81\9fã\82\81取り消せませんでした。',
 'undo-summary' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による第$1版を取り消し',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'アカウントを作成できません',
 'cantcreateaccount-text' => "このIPアドレス('''$1''')からのアカウント作成は[[User:$3|$3]]によってブロックされています。
 
-$3が示した理由は ''$2'' です。",
+$3が示した理由:''$2''",
 
 # History pages
-'viewpagelogs' => 'このページに関する記録を表示',
+'viewpagelogs' => 'このページに関する記録を閲覧',
 'nohistory' => 'このページには編集履歴がありません。',
 'currentrev' => '最新版',
 'currentrev-asof' => '$1時点における最新版',
@@ -1184,13 +1201,13 @@ $3が示した理由は ''$2'' です。",
 'last' => '前',
 'page_first' => '先頭',
 'page_last' => '末尾',
-'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、エンターキーを押すか、下部のボタンを押します。<br />
+'histlegend' => "差分の選択:比較したい版のラジオボタンを選択し、Enterキーを押すか、下部のボタンを押します。<br />
 凡例:'''({{int:cur}})'''=最新版との比較、'''({{int:last}})'''=直前の版との比較、'''{{int:minoreditletter}}'''=細部の編集",
 'history-fieldset-title' => '履歴の閲覧',
 'history-show-deleted' => '削除済みのみ',
 'histfirst' => '最古',
 'histlast' => '最新',
-'historysize' => '$1バイト',
+'historysize' => '({{PLURAL:$1|$1バイト}})',
 'historyempty' => '(空)',
 
 # Revision feed
@@ -1210,48 +1227,48 @@ $3が示した理由は ''$2'' です。",
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
 'rev-deleted-text-unhide' => "この版は'''削除されています'''。
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。
-このまま[$1 この版を見る]ことができます。",
+このまま[$1 この版を閲覧]できます。",
 'rev-suppressed-text-unhide' => "この版は'''秘匿されています'''。
 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。
-このまま[$1 この版を見る]ことができます。",
+このまま[$1 この版を閲覧]できます。",
 'rev-deleted-text-view' => "この版は'''削除されています'''。
-内容を見ることができます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
+内容を閲覧できます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
 'rev-suppressed-text-view' => "この版は'''秘匿されています'''。
-内容を見ることができます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
+内容を閲覧できます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
 'rev-deleted-no-diff' => "どちらかの版が'''削除されているため'''、差分表示できません。
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
-'rev-suppressed-no-diff' => "æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få·®å\88\86ã\81¯'''å\89\8aé\99¤ã\81\95ã\82\8cã\81\9f'''ç\89\88ã\82\92å\90«ã\82\93ã\81§ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81é\96²è¦§ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82",
+'rev-suppressed-no-diff' => "指定された差分は'''削除された'''版を含んでいるため、閲覧できません。",
 'rev-deleted-unhide-diff' => "この差分の一方の版は'''削除されています'''。
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。
-このまま[$1 この差分を見る]ことができます。",
+このまま[$1 この差分を閲覧]できます。",
 'rev-suppressed-unhide-diff' => "この差分の一方の版は'''秘匿されています'''。
 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。
-このまま[$1 この差分を見る]ことができます。",
+このまま[$1 この差分を閲覧]できます。",
 'rev-deleted-diff-view' => "この差分の一方の版は'''削除されています'''。
-この差分を見ることができます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
+この差分を閲覧できます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
 'rev-suppressed-diff-view' => "この差分の一方の版は'''秘匿されています'''。
-この差分を見ることができます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
+この差分を閲覧できます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
 'rev-delundel' => '表示/非表示',
 'rev-showdeleted' => '表示',
 'revisiondelete' => '版の削除と復帰',
-'revdelete-nooldid-title' => '不正な対象版',
+'revdelete-nooldid-title' => '無効な対象版',
 'revdelete-nooldid-text' => 'この操作の対象となる版を指定していないか、指定した版が存在していないか、あるいは最新版を非表示しようとしています。',
-'revdelete-nologtype-title' => 'è¨\98é\8c²ã\81®ç¨®é¡\9eã\81\8cæ\8c\87å®\9aã\81\95ã\82\8cていません',
+'revdelete-nologtype-title' => 'è¨\98é\8c²ã\81®ç¨®é¡\9eã\82\92æ\8c\87å®\9aã\81\97ていません',
 'revdelete-nologtype-text' => 'この操作を実行する記録の種類を指定していません。',
-'revdelete-nologid-title' => '不正な記録項目',
+'revdelete-nologid-title' => '無効な記録項目',
 'revdelete-nologid-text' => 'この操作の対象となる記録の項目を指定していないか、あるいは指定した項目が存在しません。',
 'revdelete-no-file' => '指定されたファイルは存在しません。',
 'revdelete-show-file-confirm' => '本当にファイル「<nowiki>$1</nowiki>」の削除された$2$3の版を閲覧しますか?',
 'revdelete-show-file-submit' => 'はい',
-'revdelete-selected' => "'''[[:$1]]の{{PLURAL:$2|選択された版}}:'''",
+'revdelete-selected' => "'''[[:$1]] の{{PLURAL:$2|選択された版}}:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|選択された記録の項目}}:'''",
 'revdelete-text' => "'''削除された版や記録はページの履歴や記録に表示され続けますが、一般の利用者はその内容にアクセスできなくなります。'''
-追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\82\82ã\81\93ã\82\8cã\81¨å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\82\92使ã\81£て隠された内容にアクセスしたり、復元したりできます。",
+追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\82\82ã\81\93ã\82\8cã\81¨å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\82\92使ç\94¨ã\81\97て隠された内容にアクセスしたり、復元したりできます。",
 'revdelete-confirm' => 'この操作を意図して行っていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に沿って行っていることを確認してください。',
 'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
 * 名誉毀損の恐れのある記述
 * 非公開個人情報
-*: ''è\87ªå®\85ã\81®ä½\8fæ\89\80ã\82\84電話番号、社会保障番号など''",
+*: ''è\87ªå®\85ã\81®ä½\8fæ\89\80ã\80\81電話番号、社会保障番号など''",
 'revdelete-legend' => '閲覧レベル制限を設定',
 'revdelete-hide-text' => '版の本文を隠す',
 'revdelete-hide-image' => 'ファイル内容を隠す',
@@ -1265,7 +1282,7 @@ $3が示した理由は ''$2'' です。",
 'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
 'revdelete-unsuppress' => '復元版に対する制限を除去',
 'revdelete-log' => '理由:',
-'revdelete-submit' => 'é\81¸æ\8a\9eã\81\97た{{PLURAL:$1|版}}に適用',
+'revdelete-submit' => 'é\81¸æ\8a\9eã\81\95ã\82\8cた{{PLURAL:$1|版}}に適用',
 'revdelete-success' => "'''版の閲覧レベルを更新しました。'''",
 'revdelete-failure' => "'''版の閲覧レベルを更新できませんでした:'''
 $1",
@@ -1274,20 +1291,20 @@ $1",
 $1",
 'revdel-restore' => '閲覧レベルを変更',
 'revdel-restore-deleted' => '削除された版',
-'revdel-restore-visible' => '閲覧可能な版',
+'revdel-restore-visible' => '閲覧できる版',
 'pagehist' => 'ページの履歴',
 'deletedhist' => '削除された履歴',
 'revdelete-hide-current' => '$1$2の項目の非表示に失敗しました:これは最新版であるため。
\9a ã\81\99ã\81\93ã\81¨はできません。',
-'revdelete-show-no-access' => '$1$2ã\81®é \85ç\9b®ã\81®è¡¨ç¤ºã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9aã\81\93ã\81®é \85ç\9b®ã\81¯ã\80\8cå\88¶é\99\90ä»\98ã\81\8dã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cています。
\9d\9e表示ã\81«はできません。',
+'revdelete-show-no-access' => '$1$2ã\81®é \85ç\9b®ã\81®è¡¨ç¤ºã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9aã\81\93ã\81®é \85ç\9b®ã\81«ã\81¯ã\80\8cå\88¶é\99\90ä»\98ã\81\8dã\80\8dã\81®å\8d°ã\81\8cä»\98ã\81\84ています。
 アクセス権限がありません。',
-'revdelete-modify-no-access' => '$1$2ã\81®é \85ç\9b®ã\81®ä¿®æ­£ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9aã\81\93ã\81®é \85ç\9b®ã\81¯ã\80\8cå\88¶é\99\90ä»\98ã\81\8dã\80\8dã\81«è¨­å®\9aã\81\95ã\82\8cています。
+'revdelete-modify-no-access' => '$1$2ã\81®é \85ç\9b®ã\81®ä¿®æ­£ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9aã\81\93ã\81®é \85ç\9b®ã\81«ã\81¯ã\80\8cå\88¶é\99\90ä»\98ã\81\8dã\80\8dã\81®å\8d°ã\81\8cä»\98ã\81\84ています。
 アクセス権限がありません。',
 'revdelete-modify-missing' => 'ID$1の項目の変更に失敗しました:データベースに見当たりません!',
 'revdelete-no-change' => "'''警告:''' $1$2の項目には要求された閲覧レベルが既に設定されています。",
-'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:変更を加えている間に、他の利用者によって設定が変更されたようです。
+'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:あなたが変更しようとしている間に、他の誰かが変更したようです。
 記録を確認してください。',
-'revdelete-only-restricted' => '$1$2ã\81®é \85ç\9b®ã\81®ç\89\88æ\8c\87å®\9aå\89\8aé\99¤ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9aä»\96ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\81®é\81¸æ\8a\9eè\82¢ã\81®ã\81\86ã\81¡ã\81©ã\82\8cã\81\8bã\82\92ã\81\95ã\82\89ã\81«é\81¸æ\8a\9eã\81\97ã\81ªã\81\91ã\82\8cã\81°ã\80\81管ç\90\86è\80\85ã\81\8bã\82\89é \85ç\9b®ã\82\92ç§\98å\8c¿ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
+'revdelete-only-restricted' => '$1$2の項目の版指定削除に失敗しました:他の閲覧レベルの選択肢のうちどれかをさらに選択しなければ、管理者から項目を秘匿できません。',
 'revdelete-reason-dropdown' => '*よくある削除理由
 ** 著作権侵害
 ** 名誉毀損のおそれ
@@ -1300,49 +1317,50 @@ $1",
 # Suppression log
 'suppressionlog' => '秘匿記録',
 'suppressionlogtext' => '以下は管理者から秘匿された内容を含む削除およびブロックの一覧です。
-現在操作できる追放とブロックの一覧については[[Special:BlockList|IPブロックの一覧]]を参照してください。',
+現在操作できる追放とブロックの一覧については[[Special:BlockList|ブロックの一覧]]を参照してください。',
 
 # History merging
 'mergehistory' => 'ページ履歴の統合',
-'mergehistory-header' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81§ã\81¯ã\80\81ã\81\82ã\82\8bå\85\83ã\83\9aã\83¼ã\82¸ã\81®å±¥æ­´ã\82\92æ\96°ã\81\97ã\81\84ã\83\9aã\83¼ã\82¸ã\81«çµ±å\90\88ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'mergehistory-header' => 'このページでは、ある元ページの履歴を新しいページに統合できます。
 この変更を行ってもページの履歴の連続性が確実に保たれるようにしてください。',
 'mergehistory-box' => '2ページの過去の版を統合する:',
 'mergehistory-from' => '統合元となるページ:',
 'mergehistory-into' => '統合先のページ:',
 'mergehistory-list' => '統合できる編集履歴',
-'mergehistory-merge' => '以下の[[:$1]]の履歴が、[[:$2]]へ統合可能です。
\89¹å®\9aã\81®æ\99\82é\96\93以前に作成された版のみを統合するには、ラジオボタンで版を選択してください。
-案内リンクを使うと、選択が初期化されるので注意してください。',
-'mergehistory-go' => '統合可能な版の表示',
-'mergehistory-submit' => '版を統合する',
+'mergehistory-merge' => '以下の [[:$1]] の履歴を [[:$2]] に統合できます。
\89¹å®\9aã\81®æ\97¥æ\99\82以前に作成された版のみを統合するには、ラジオボタンで版を選択してください。
+案内リンクを使用すると選択が初期化されるためご注意ください。',
+'mergehistory-go' => '統合できる版を表示',
+'mergehistory-submit' => '版を統合',
 'mergehistory-empty' => '統合できる版がありません。',
-'mergehistory-success' => '[[:$1]]の$3{{PLURAL:$3|版}}を[[:$2]]へ統合しました。',
+'mergehistory-success' => '[[:$1]]の $3 {{PLURAL:$3|版}}を[[:$2]]に統合しました。',
 'mergehistory-fail' => '履歴の統合を実行できません。ページと時刻の引数を再確認してください。',
 'mergehistory-no-source' => '統合元ページ「$1」が存在しません。',
-'mergehistory-no-destination' => 'çµ±å\90\88å\85\88ã\81®ã\83\9aã\83¼ã\82¸$1が存在しません。',
+'mergehistory-no-destination' => 'çµ±å\90\88å\85\88ã\83\9aã\83¼ã\82¸ã\80\8c$1ã\80\8dが存在しません。',
 'mergehistory-invalid-source' => '統合元のページは有効な名前でなければなりません。',
 'mergehistory-invalid-destination' => '統合先のページは有効な名前でなければなりません。',
 'mergehistory-autocomment' => '[[:$1]]を[[:$2]]に統合',
 'mergehistory-comment' => '[[:$1]]を[[:$2]]に統合:$3',
-'mergehistory-same-destination' => 'çµ±å\90\88å\85\83ã\81¨çµ±å\90\88å\85\88ã\81«å\90\8cã\81\98ã\83\9aã\83¼ã\82¸ã\82\92設å®\9aã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
+'mergehistory-same-destination' => 'çµ±å\90\88å\85\83ã\81¨çµ±å\90\88å\85\88ã\81®ã\83\9aã\83¼ã\82¸ã\82\92å\90\8cã\81\98ã\81«ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93',
 'mergehistory-reason' => '理由:',
 
 # Merge log
 'mergelog' => '統合記録',
-'pagemerge-logentry' => '[[$1]]ã\82\92[[$2]]ã\81¸çµ±å\90\88ï¼\88$3版まで)',
+'pagemerge-logentry' => '[[$1]]ã\82\92[[$2]]ã\81«çµ±å\90\88ï¼\88$3 版まで)',
 'revertmerge' => '統合解除',
 'mergelogpagetext' => '以下は、最近行われたあるページから別のページへの統合の一覧です。',
 
 # Diffs
 'history-title' => '「$1」の変更履歴',
-'difference' => '(版間での差分)',
+'difference-title' => '$1:版間の差分',
+'difference-title-multipage' => '$1 と $2:ページ間の差分',
 'difference-multipage' => '(ページ間の差分)',
 'lineno' => '$1行:',
 'compareselectedversions' => '選択した版同士を比較',
-'showhideselectedversions' => '選択した版を表示もしくは非表示',
+'showhideselectedversions' => '選択した版を表示/非表示',
 'editundo' => '取り消し',
-'diff-multi' => '($2人の利用者による、間の$1版が非表示)',
-'diff-multi-manyusers' => '($2人以上の利用者による、間の$1版が非表示)',
+'diff-multi' => '({{PLURAL:$2|$2人の利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
+'diff-multi-manyusers' => '({{PLURAL:$2|$2人を超える利用者}}による、{{PLURAL:$1|間の$1版}}が非表示)',
 
 # Search results
 'searchresults' => '検索結果',
@@ -1357,29 +1375,29 @@ $1",
 'notextmatches' => 'どのページ本文とも一致しませんでした',
 'prevn' => '前の$1件',
 'nextn' => '次の$1件',
-'prevn-title' => '前の$1結果',
-'nextn-title' => '次の$1結果',
-'shown-title' => 'ページあたり$1件の結果を表示',
+'prevn-title' => '前の{{PLURAL:$1|$1結果}}',
+'nextn-title' => '次の{{PLURAL:$1|$1結果}}',
+'shown-title' => 'ページあたり{{PLURAL:$1|$1件の結果}}を表示',
 'viewprevnext' => '($1{{int:pipe-separator}}$2)($3)を表示',
 'searchmenu-legend' => '検索オプション',
 'searchmenu-exists' => "'''このウィキには「[[:$1]]」という名前のページがあります'''",
-'searchmenu-new' => "'''このウィキでページ「[[:$1|$1]]」を新規作成する'''",
+'searchmenu-new' => "'''このウィキでページ「[[:$1]]」を新規作成する'''",
 'searchhelp-url' => 'Help:目次',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|この文字列から始まる名前のページを見る]]',
-'searchprofile-articles' => '記事',
+'searchprofile-articles' => '本文ページ',
 'searchprofile-project' => 'ヘルプとプロジェクトページ',
 'searchprofile-images' => 'マルチメディア',
 'searchprofile-everything' => 'すべて',
 'searchprofile-advanced' => '詳細',
 'searchprofile-articles-tooltip' => '$1で検索',
-'searchprofile-project-tooltip' => '$1検索',
+'searchprofile-project-tooltip' => '$1内を検索',
 'searchprofile-images-tooltip' => 'ファイルを検索',
-'searchprofile-everything-tooltip' => '全ページ(トークページ含む)を検索',
-'searchprofile-advanced-tooltip' => '特定の名前空間を検索',
-'search-result-size' => '$1($2単語)',
-'search-result-category-size' => '$1件($2下位カテゴリ、$3ファイル)',
+'searchprofile-everything-tooltip' => '全本文ページ(トークページ含む)を検索',
+'searchprofile-advanced-tooltip' => '特定の名前空間を検索',
+'search-result-size' => '$1({{PLURAL:$2|$2単語}})',
+'search-result-category-size' => '{{PLURAL:$1|$1件}}({{PLURAL:$2|$2下位カテゴリ}}、{{PLURAL:$3|$3ファイル}})',
 'search-result-score' => '関連度:$1%',
-'search-redirect' => 'ï¼\88$1ã\82\92転é\80\81)',
+'search-redirect' => 'ï¼\88$1ã\81\8bã\82\89ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88)',
 'search-section' => '($1の節)',
 'search-suggest' => 'もしかして:$1',
 'search-interwiki-caption' => '姉妹プロジェクト',
@@ -1388,16 +1406,16 @@ $1",
 'search-mwsuggest-enabled' => '検索候補を表示',
 'search-mwsuggest-disabled' => '検索候補を表示しない',
 'search-relatedarticle' => '関連',
-'mwsuggest-disable' => 'AJAXによる検索候補の提示を無効にする',
-'searcheverything-enable' => '全名前空間を検索する',
+'mwsuggest-disable' => 'Ajaxによる検索候補の提示を無効にする',
+'searcheverything-enable' => 'すべての名前空間を検索',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
-'showingresults' => "'''$2'''件目からの'''$1'''件を表示しています。",
-'showingresultsnum' => "'''$2'''件目からの'''$3'''件を表示しています。",
-'showingresultsheader' => "「'''$4'''」に対する{{PLURAL:$5|'''$3'''件中の'''$1'''件|'''$3'''件中の'''$1'''件から'''$2'''件までの}}結果",
-'nonefound' => "'''注æ\84\8f'''ï¼\9aæ\97¢å®\9aã\81§ã\81¯ä¸\80é\83¨ã\81®å\90\8då\89\8d空é\96\93ã\81\97ã\81\8bæ¤\9cç´¢ã\81\95ã\82\8cã\81¾ã\81\9bã\82\93
-''all:''を前につけると、全て(トークページやテンプレートなどを含む)を対象にできます。検索したい名前空間を前につけることもできます。",
-'search-nonefound' => '問い合わせに合致する結果はありませんでした。',
+'showingresults' => "'''$2'''件目以降の{{PLURAL:$1|'''$1'''件の結果}}を表示しています。",
+'showingresultsnum' => "'''$2'''件目以降の{{PLURAL:$3|'''$3'''件の結果}}を表示しています。",
+'showingresultsheader' => "「'''$4'''」に対する{{PLURAL:$5|'''$3'''件中の'''$1'''件の結果|'''$3'''件中の'''$1'''件目から'''$2'''件目の結果}}",
+'nonefound' => "'''注æ\84\8f'''ï¼\9aæ\97¢å®\9aã\81§ã\81¯ä¸\80é\83¨ã\81®å\90\8då\89\8d空é\96\93ã\81®ã\81¿ã\82\92æ¤\9cç´¢ã\81\97ã\81¾ã\81\99
+''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
+'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
 'powersearch-legend' => '高度な検索',
 'powersearch-ns' => '名前空間を指定して検索:',
@@ -1408,8 +1426,8 @@ $1",
 'powersearch-togglenone' => 'すべて外す',
 'search-external' => '外部検索',
 'searchdisabled' => '{{SITENAME}}の検索機能は無効化されています。
\81\95ã\81\97ã\81\82ã\81\9fã\81£ã\81¦ã\81¯Googleã\81ªã\81©ã\81®æ¤\9cç´¢ã\81\8cå\88©ç\94¨できます。
-ただし外部の検索エンジンの索引にある{{SITENAME}}の情報は古い場合があります。',
\81\95ã\81\97ã\81\82ã\81\9fã\81£ã\81¦ã\81¯Googleã\81ªã\81©ã\81§æ¤\9cç´¢できます。
+ただし外部の検索エンジンの索引にある{{SITENAME}}のコンテンツは古い場合があります。',
 
 # Quickbar
 'qbsettings' => 'クイックバー',
@@ -1418,7 +1436,7 @@ $1",
 'qbsettings-fixedright' => '右端',
 'qbsettings-floatingleft' => 'ウィンドウの左上に固定',
 'qbsettings-floatingright' => 'ウィンドウの右上に固定',
-'qbsettings-directionality' => 'あなたの言語のスクリプトの方向に応じて固定',
+'qbsettings-directionality' => 'あなたの言語の文字体系の書字方向に応じて固定',
 
 # Preferences page
 'preferences' => '個人設定',
@@ -1433,12 +1451,13 @@ $1",
 'prefs-beta' => 'ベータ版機能',
 'prefs-datetime' => '日付と時刻',
 'prefs-labs' => 'ラボの機能',
+'prefs-user-pages' => '利用者ページ',
 'prefs-personal' => '利用者情報',
 'prefs-rc' => '最近の更新',
 'prefs-watchlist' => 'ウォッチリスト',
-'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8b日数:',
-'prefs-watchlist-days-max' => '最大$1{{PLURAL:$1|日|日間}}',
-'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\99ã\82\8b件数:',
+'prefs-watchlist-days' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤º日数:',
+'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
+'prefs-watchlist-edits' => 'æ\8b¡å¼µã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81®è¡¨ç¤º件数:',
 'prefs-watchlist-edits-max' => '最大数:1000',
 'prefs-watchlist-token' => 'ウォッチリストのトークン:',
 'prefs-misc' => 'その他',
@@ -1456,23 +1475,23 @@ $1",
 'columns' => '列数:',
 'searchresultshead' => '検索',
 'resultsperpage' => '1ページあたりの表示件数:',
-'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示する閾値(バイト):',
+'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示する閾値 (バイト):',
 'stub-threshold-disabled' => '無効',
 'recentchangesdays' => '最近の更新に表示する日数:',
-'recentchangesdays-max' => '(最大$1{{PLURAL:$1|日|日間}})',
+'recentchangesdays-max' => '(最大 $1 {{PLURAL:$1|日間}})',
 'recentchangescount' => '既定で表示する件数:',
 'prefs-help-recentchangescount' => 'この設定は最近の更新、ページの履歴、および記録に適用されます。',
-'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、自身のウォッチリストのRSSフィードが生成されます。
+'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、あなたのウォッチリストのRSSフィードが生成されます。
 この欄に入力されている鍵を知っている人は誰でもこのウォッチリストを閲覧できるようになるため、他人に分からない値を選んでください。
 乱数によって生成された次の値を使うこともできます:$1',
 'savedprefs' => '個人設定を保存しました。',
-'timezonelegend' => '時間帯:',
-'localtime' => '現地時間:',
-'timezoneuseserverdefault' => '既定を使用 ($1)',
+'timezonelegend' => 'タイムゾーン:',
+'localtime' => 'ローカルの時刻:',
+'timezoneuseserverdefault' => 'ウィキの既定を使用 ($1)',
 'timezoneuseoffset' => 'その他(時差を指定)',
 'timezoneoffset' => '時差¹:',
-'servertime' => 'サーバーの時:',
-'guesstimezone' => 'ブラウザの設定から入力',
+'servertime' => 'サーバーの時:',
+'guesstimezone' => 'ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81®è¨­å®\9aã\81\8bã\82\89å\85¥å\8a\9b',
 'timezoneregion-africa' => 'アフリカ',
 'timezoneregion-america' => 'アメリカ',
 'timezoneregion-antarctica' => '南極',
@@ -1483,20 +1502,20 @@ $1",
 'timezoneregion-europe' => 'ヨーロッパ',
 'timezoneregion-indian' => 'インド洋',
 'timezoneregion-pacific' => '太平洋',
-'allowemail' => '他の利用者からの電子メールの受信を有効化する',
+'allowemail' => '他の利用者からのメールを受け取る',
 'prefs-searchoptions' => '検索設定',
 'prefs-namespaces' => '名前空間',
-'defaultns' => 'ã\81\9dã\81®ä»\96ã\81®å ´å\90\88ã\80\81次ã\81®å\90\8då\89\8d空é\96\93ã\81§ã\81®ã\81¿æ¤\9cç´¢ã\81\99ã\82\8b:',
+'defaultns' => 'ã\81¾ã\81\9fã\81¯æ¬¡ã\81®å\90\8då\89\8d空é\96\93ã\81®ã\81¿ã\82\92æ¤\9cç´¢:',
 'default' => '既定',
 'prefs-files' => 'ファイル',
 'prefs-custom-css' => 'カスタムCSS',
 'prefs-custom-js' => 'カスタムJS',
-'prefs-common-css-js' => 'すべての外装に共通のCSSとJavaScript:',
-'prefs-reset-intro' => 'このページを使うと、自身の個人設定をこのサイトの既定のものに再設定することができます。
\81\93ã\81®æ\93\8dä½\9cã\81¯å\8f\96ã\82\8aæ¶\88ã\81\97ã\81\8cã\81§ã\81\8dません。',
+'prefs-common-css-js' => '外装に共通のCSSとJavaScript:',
+'prefs-reset-intro' => 'このページを使用すると、自分の個人設定をこのサイトの初期設定に戻せます。
\81\93ã\81®æ\93\8dä½\9cã\81¯å\8f\96ã\82\8aæ¶\88ã\81\9bません。',
 'prefs-emailconfirm-label' => 'メール確認:',
 'prefs-textboxsize' => '編集画面の大きさ',
-'youremail' => '電子メール:',
+'youremail' => 'メールアドレス:',
 'username' => '利用者名:',
 'uid' => '利用者ID:',
 'prefs-memberingroups' => '所属する{{PLURAL:$1|グループ}}:',
@@ -1504,23 +1523,25 @@ $1",
 'yourrealname' => '本名:',
 'yourlanguage' => '使用言語:',
 'yourvariant' => 'コンテンツ言語変種:',
-'prefs-help-variant' => 'ã\81\82ã\81ªã\81\9fã\81\8cã\81\93ã\81®ã\82¦ã\82£ã\82­ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\81«è¡¨ç¤ºã\81«ä½¿ã\81\84ã\81\9fã\81\84è¨\80èª\9eå¤\89種ã\81¾ã\81\9fã\81¯æ­£æ\9b¸æ³\95',
+'prefs-help-variant' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\81®ã\82³ã\83³ã\83\86ã\83³ã\83\84ã\81«è¡¨ç¤ºã\81«ä½¿ç\94¨ã\81\97ã\81\9fã\81\84è¨\80èª\9eå¤\89種ã\81¾ã\81\9fã\81¯æ­£æ\9b¸æ³\95ã\80\82',
 'yournick' => '新しい署名:',
-'prefs-help-signature' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ä¸\8aã\81§ã\81®ç\99ºè¨\80ã\81«ã\81¯ã\80\8c<nowiki>~~~~</nowiki>ã\80\8dã\81¨ä»\98ã\81\91ã\81¦ç½²å\90\8dã\81\99ã\82\8bã\81¹ã\81\8dã\81§ã\81\99ã\80\82ã\81\93ã\82\8cã\81¯è\87ªå\88\86ã\81®ç½²å\90\8dã\81«æ\99\82å\88»å\8d°ã\82\92ä»\98å\8a ã\81\97たものに変換されます。',
+'prefs-help-signature' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ä¸\8aã\81§ã\81®ç\99ºè¨\80ã\81«ã\81¯ã\80\8c<nowiki>~~~~</nowiki>ã\80\8dã\81¨ä»\98ã\81\91ã\81¦ç½²å\90\8dã\81\99ã\81¹ã\81\8dã\81§ã\81\99ã\80\82ã\81\93ã\82\8cã\81¯è\87ªå\88\86ã\81®ç½²å\90\8dã\81«æ\99\82å\88»å\8d°ã\82\92ä»\98ã\81\91たものに変換されます。',
 'badsig' => '署名用のソースが正しくありません。
 HTMLタグを見直してください。',
-'badsiglength' => '署名が長すぎます。$1文字以下でなければなりません。',
+'badsiglength' => '署名が長すぎます。
+$1 {{PLURAL:$1|文字}}以下である必要があります。',
 'yourgender' => '性別:',
 'gender-unknown' => '未指定',
 'gender-male' => '男',
 'gender-female' => '女',
-'prefs-help-gender' => '省略可:ソフトウェアによる文法的性の解決に使用されます。
+'prefs-help-gender' => '省略可:ソフトウェアによる文法的性の解決に使用されます。
 この情報は公開されます。',
-'email' => '電子メール',
-'prefs-help-realname' => '本名登録は省略可能です。
-登録した場合、著作物の帰属表示に本名が用いられます。',
-'prefs-help-email' => '電子メールアドレスの設定は省略可能ですが、パスワードを忘れた際に新しいパスワードを電子メールで受け取る場合に必要です。',
-'prefs-help-email-others' => 'あなたの身元を明らかにすることなく、他の利用者に利用者ページやトークページを使って連絡をしてもらうようにすることもできます。',
+'email' => 'メール',
+'prefs-help-realname' => '本名は省略できます。
+入力すると、あなたの著作物の帰属表記に本名を使用します。',
+'prefs-help-email' => 'メールアドレスは省略できますが、パスワードを忘れた際にパスワードをリセットするのに必要です。',
+'prefs-help-email-others' => '利用者ページやトークページ上のリンクを通じて、他の利用者があなたにメールで連絡を取れるようにすることもできます。
+他の利用者が連絡を取る際にあなたのメールアドレスが開示されることはありません。',
 'prefs-help-email-required' => 'メールアドレスが必要です。',
 'prefs-info' => '基本情報',
 'prefs-i18n' => '国際化',
@@ -1538,11 +1559,11 @@ HTMLタグを見直してください。',
 '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' => 'å\88©ç\94¨è\80\85権é\99\90ã\81®管理',
+'userrights' => 'å\88©ç\94¨è\80\85権é\99\90ã\82\92管理',
 'userrights-lookup-user' => '利用者グループを管理',
 'userrights-user-editname' => '利用者名を入力:',
 'editusergroup' => '利用者グループを編集',
@@ -1551,16 +1572,16 @@ HTMLタグを見直してください。',
 'saveusergroups' => '利用者グループを保存',
 'userrights-groupsmember' => '所属グループ:',
 'userrights-groupsmember-auto' => '自動的に付与される権限:',
-'userrights-groups-help' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81\8cå±\9eã\81\99ã\82\8bã\82°ã\83«ã\83¼ã\83\97ã\82\92å¤\89æ\9b´ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'userrights-groups-help' => 'この利用者が属するグループを変更できます。
 * チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
 * チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
-* *は一旦グループへ追加した場合に除去あるいはその逆が不可能であることを示しています。',
+* 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
 'userrights-reason' => '理由:',
 'userrights-no-interwiki' => '他ウィキ上における利用者権限の編集権限はありません。',
 'userrights-nodatabase' => 'データベース$1は存在しないか、ローカル上にありません。',
 'userrights-nologin' => '利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。',
 'userrights-notallowed' => 'あなたのアカウントには利用者権限を追加または除去する権限がありません。',
-'userrights-changeable-col' => '変更可能なグループ',
+'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
 
 # Groups
@@ -1588,65 +1609,65 @@ HTMLタグを見直してください。',
 'grouppage-suppress' => '{{ns:project}}:秘匿者',
 
 # Rights
-'right-read' => 'ã\83\9aã\83¼ã\82¸ã\81®閲覧',
-'right-edit' => 'ã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-createpage' => '(議論ページでない)ページの作成',
-'right-createtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\81®作成',
-'right-createaccount' => 'æ\96°ã\81\97ã\81\84å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\81®作成',
-'right-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\81¥ã\81\91',
+'right-read' => 'ã\83\9aã\83¼ã\82¸ã\82\92閲覧',
+'right-edit' => 'ã\83\9aã\83¼ã\82¸ã\82\92編集',
+'right-createpage' => 'ページ(議論ページ以外)を作成',
+'right-createtalk' => 'è­°è«\96ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'right-createaccount' => 'æ\96°ã\81\97ã\81\84å\88©ç\94¨è\80\85ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92作成',
+'right-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'right-move' => 'ページの移動',
-'right-move-subpages' => 'ä¸\8bä½\8dã\83\9aã\83¼ã\82¸ã\82\92å\90«ã\82\81ã\81\9fã\83\9aã\83¼ã\82¸ã\81®移動',
-'right-move-rootuserpages' => 'å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸æ\9c¬ä½\93ã\81®移動',
+'right-move-subpages' => 'ä¸\8bä½\8dã\83\9aã\83¼ã\82¸ã\82\92å\90«ã\82\81ã\81¦ã\83\9aã\83¼ã\82¸ã\82\92移動',
+'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-suppressredirect' => 'ページの移動の際にのページ名からのリダイレクトを作成しない',
+'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' => 'å\8d\8aä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-bot' => '自動処理として認識',
+'right-autoconfirmed' => 'å\8d\8aä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92編集',
+'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-blockemail' => '利用者のメール送信をブロック',
+'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' => '自分自身に対するブロックを解除',
-'right-protect' => 'ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\81®å¤\89æ\9b´ã\81¨ä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\81®編集',
-'right-editprotected' => '保護ページの編集(カスケード保護を除く)',
-'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\83¼ã\82¹ã\81®編集',
-'right-editusercssjs' => '他利用者のCSSとJavaScriptファイルの編集',
-'right-editusercss' => '他利用者のCSSファイルの編集',
-'right-edituserjs' => '他利用者のJavaScriptファイルの編集',
+'right-protect' => 'ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\80\81ä¿\9dè­·ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸ã\82\92編集',
+'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
+'right-editinterface' => 'ã\83¦ã\83¼ã\82¶ã\83¼ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\82\92編集',
+'right-editusercssjs' => '他の利用者のCSSとJavaScriptファイルを編集',
+'right-editusercss' => '他の利用者のCSSファイルを編集',
+'right-edituserjs' => '他の利用者のJavaScriptファイルを編集',
 'right-rollback' => '特定ページを最後に編集した利用者の編集の即時巻き戻し',
 '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' => 'å\85¨å\88©ç\94¨è\80\85権é\99\90ã\81®編集',
-'right-userrights-interwiki' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81®å\88©ç\94¨è\80\85ã\81®å\88©ç\94¨è\80\85権é\99\90ã\81®編集',
+'right-userrights' => 'å\85¨å\88©ç\94¨è\80\85権é\99\90ã\82\92編集',
+'right-userrights-interwiki' => 'ä»\96ã\81®ã\82¦ã\82£ã\82­ã\81®å\88©ç\94¨è\80\85ã\81®å\88©ç\94¨è\80\85権é\99\90ã\82\92編集',
 'right-siteadmin' => 'データベースのロックおよびロック解除',
 'right-override-export-depth' => 'リンク先ページを5階層まで含めて書き出す',
-'right-sendemail' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81¸é\9b»å­\90ã\83¡ã\83¼ã\83«ã\82\92é\80\81ã\82\8b',
-'right-passwordreset' => 'パスワード再設定メールを閲覧する',
+'right-sendemail' => 'ä»\96ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡',
+'right-passwordreset' => 'パスワード再設定メールを閲覧',
 
 # User rights log
 'rightslog' => '利用者権限変更記録',
@@ -1656,62 +1677,62 @@ HTMLタグを見直してください。',
 'rightsnone' => '(なし)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®閲覧',
-'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®編集',
-'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\81®æ\96°è¦\8f作成',
-'action-createtalk' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81®æ\96°è¦\8f作成',
-'action-createaccount' => 'このアカウントの作成',
-'action-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81¨ã\81\97ã\81¦å\8d°ä»\98ã\81\91',
+'action-read' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92閲覧',
+'action-edit' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92編集',
+'action-createpage' => 'ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'action-createtalk' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\92作成',
+'action-createaccount' => 'この利用者アカウントを作成',
+'action-minoredit' => 'ç´°é\83¨ã\81®ç·¨é\9b\86ã\81®å\8d°ã\82\92ä»\98ã\81\91ã\82\8b',
 'action-move' => 'このページの移動',
 'action-move-subpages' => 'このページと下位ページの移動',
 'action-move-rootuserpages' => '利用者ページ本体の移動',
 'action-movefile' => 'このファイルの移動',
-'action-upload' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81®アップロード',
-'action-reupload' => 'このファイルの上書き',
-'action-reupload-shared' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\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' => 'å\85±æ\9c\89ã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«ã\81\82ã\82\8bã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«上書き',
 'action-upload_by_url' => 'URLからこのファイルをアップロード',
 'action-writeapi' => '書き込みAPIを使用',
-'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®削除',
-'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\81®削除',
-'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\81®表示',
+'action-delete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92削除',
+'action-deleterevision' => 'ã\81\93ã\81®ç\89\88ã\82\92削除',
+'action-deletedhistory' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\89\8aé\99¤å±¥æ­´ã\82\92表示',
 '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' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\81®変更',
-'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\81®即時巻き戻し',
-'action-import' => '他のウィキからのこのページの取り込み',
-'action-importupload' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\8bã\82\89ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å\8f\96ã\82\8aè¾¼ã\81¿',
+'action-protect' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ä¿\9dè­·ã\83¬ã\83\99ã\83«ã\82\92変更',
+'action-rollback' => 'ç\89¹å®\9aã\83\9aã\83¼ã\82¸ã\82\92æ\9c\80å¾\8cã\81«ç·¨é\9b\86ã\81\97ã\81\9få\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92即時巻き戻し',
+'action-import' => 'このページを他のウィキから取り込む',
+'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«å\8f\96ã\82\8aè¾¼ã\82\80',
 '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-mergehistory' => 'このページの履歴統合',
+'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覧ã\82\92表示',
+'action-mergehistory' => 'このページの履歴統合',
 'action-userrights' => '全利用者権限の変更',
 'action-userrights-interwiki' => '他のウィキ上の利用者の利用者権限変更',
-'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\82ã\81\97ã\81\8fはロック解除',
-'action-sendemail' => '電子メールの送信',
+'action-siteadmin' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81¾ã\81\9fはロック解除',
+'action-sendemail' => 'メールを送信',
 
 # Recent changes
-'nchanges' => '$1回の変更',
+'nchanges' => '$1{{PLURAL:$1|回の変更}}',
 'recentchanges' => '最近の更新',
 'recentchanges-legend' => '最近の更新のオプション',
-'recentchangestext' => 'このウィキにおける最近の更新はこのページから確認できます。',
-'recentchanges-feed-description' => 'ã\81\93ã\81®ã\83\95ã\82£ã\83¼ã\83\89ã\81§ã\81\9dã\81®ã\82¦ã\82£ã\82­ã\81¸ã\81®æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\82\92追跡。',
+'recentchanges-summary' => 'このページでは、このウィキでの最近の更新を確認できます。',
+'recentchanges-feed-description' => 'ã\81\93ã\81®ã\83\95ã\82£ã\83¼ã\83\89ã\81§ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\81®æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\82\92追跡ã\81§ã\81\8dã\81¾ã\81\99。',
 'recentchanges-label-newpage' => 'この編集で新しいページが作成されました',
 'recentchanges-label-minor' => 'これは細部の編集です',
 'recentchanges-label-bot' => 'この編集はボットによって行われました',
 'recentchanges-label-unpatrolled' => 'この編集はまだ巡回されていません',
-'rcnote' => "$4 $5までの{{PLURAL:$2|'''1'''日|'''$2'''日間}}になされた'''$1'''件の変更は以下のとおりです。",
+'rcnote' => "$4 $5 までの{{PLURAL:$2|'''$2'''日間}}になされた{{PLURAL:$1|'''$1'''件の変更}}は以下の通りです。",
 'rcnotefrom' => "以下は、'''$2'''以降の更新です(最大'''$1'''件)。",
 'rclistfrom' => '$1以降の更新を表示する',
 'rcshowhideminor' => '細部の編集を$1',
-'rcshowhidebots' => 'ã\83\9cã\83\83ã\83\88ã\81®ç·¨é\9b\86ã\82\92$1',
-'rcshowhideliu' => 'ã\83­ã\82°ã\82¤ã\83³å\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92$1',
-'rcshowhideanons' => 'å\8c¿å\90\8då\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92$1',
+'rcshowhidebots' => 'ボットを$1',
+'rcshowhideliu' => 'ログイン利用者を$1',
+'rcshowhideanons' => '匿名利用者を$1',
 'rcshowhidepatr' => '巡回された編集を$1',
 'rcshowhidemine' => '自分の編集を$1',
-'rclinks' => '最近$2日間の$1件分を表示する<br />$3',
+'rclinks' => '最近$2日間の更新$1件以内を表示<br />$3',
 'diff' => '差分',
 'hist' => '履歴',
 'hide' => '非表示',
@@ -1720,13 +1741,14 @@ HTMLタグを見直してください。',
 'newpageletter' => '新',
 'boteditletter' => 'ボ',
 'unpatrolledletter' => '!',
-'number_of_watching_users_pageview' => '[$1人の利用者がウォッチしています]',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]',
 'rc_categories' => 'カテゴリを限定(「|」で区切る)',
 'rc_categories_any' => 'すべて',
-'rc-change-size-new' => '変更後は$1バイト',
+'rc-change-size-new' => '変更後は $1 {{PLURAL:$1|バイト}}',
 'newsectionsummary' => '/* $1 */ 新しい節',
-'rc-enhanced-expand' => '詳細を表示(JavaScriptが必要)',
+'rc-enhanced-expand' => '詳細を表示(JavaScript が必要)',
 'rc-enhanced-hide' => '詳細を非表示',
+'rc-old-title' => '作成時のページ名は「$1」',
 
 # Recent changes linked
 'recentchangeslinked' => '関連ページの更新状況',
@@ -1734,8 +1756,8 @@ HTMLタグを見直してください。',
 'recentchangeslinked-toolbox' => '関連ページの更新状況',
 'recentchangeslinked-title' => '「$1」と関連する変更',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
-'recentchangeslinked-summary' => "ã\81\93ã\82\8cã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\82\82ã\81\97ã\81\8fã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81«æ\9c\80è¿\91å\8a ã\81\88ã\82\89ã\82\8cã\81\9f変更の一覧です。
-[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81§è¡¨ç¤ºã\81\95ã\82\8cã\81¦ã\81\84ます。",
+'recentchangeslinked-summary' => "ã\81\93ã\82\8cã\81¯ã\80\81æ\8c\87å®\9aã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bï¼\88ã\81¾ã\81\9fã\81¯æ\8c\87å®\9aã\81\97ã\81\9fã\82«ã\83\86ã\82´ã\83ªã\81«å\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\82\8bï¼\89ã\83\9aã\83¼ã\82¸ã\81¸ã\81®æ\9c\80è¿\91ã\81®変更の一覧です。
+[[Special:Watchlist|è\87ªå\88\86ã\81®ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88]]ã\81«ã\81\82ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯'''太å­\97'''ã\81«ã\81ªã\82\8aます。",
 'recentchangeslinked-page' => 'ページ名:',
 'recentchangeslinked-to' => '代わりに、指定したページへのリンク元での変更を表示',
 
@@ -1746,8 +1768,8 @@ HTMLタグを見直してください。',
 'upload-tryagain' => '修正したファイル解説を投稿',
 'uploadnologin' => 'ログインしていません',
 'uploadnologintext' => 'ファイルをアップロードするには[[Special:UserLogin|ログイン]]する必要があります。',
-'upload_directory_missing' => 'アップロード先ディレクトリー($1)が見つからず、ウェブサーバーによって作成できませんでした。',
-'upload_directory_read_only' => 'アップロード先ディレクトリー($1)に、ウェブサーバーが書き込めません。',
+'upload_directory_missing' => 'アップロード先ディレクトリ($1)が見つからないため、ウェブサーバーによる作成ができませんでした。',
+'upload_directory_read_only' => 'アップロード先ディレクトリ($1)には、ウェブサーバーが書き込めません。',
 'uploaderror' => 'アップロードのエラー',
 'upload-recreate-warning' => "'''警告:その名前のファイルは、以前に削除または移動されています。'''
 
@@ -1773,9 +1795,9 @@ HTMLタグを見直してください。',
 'filestatus' => '著作権情報:',
 'filesource' => '出典:',
 'uploadedfiles' => 'アップロードされたファイル',
-'ignorewarning' => 'è­¦å\91\8aã\82\92ç\84¡è¦\96ã\81\97ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ä¿\9då­\98ã\81\97ã\81¦ã\81\97ã\81¾ã\81\86',
+'ignorewarning' => 'è­¦å\91\8aã\82\92ç\84¡è¦\96ã\81\97ã\81¦ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ä¿\9då­\98',
 'ignorewarnings' => '警告を無視',
-'minlength1' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81¯1æ\96\87å­\97以ä¸\8aã\81§ã\81\82ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾す。',
+'minlength1' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81«ã\81¯å°\91ã\81ªã\81\8fã\81¨ã\82\82\96\87å­\97å¿\85è¦\81ã\81§す。',
 'illegalfilename' => 'ファイル名「$1」にページ名として許可されていない文字が含まれています。
 ファイル名を変更してからもう一度アップロードしてください。',
 'filename-toolong' => '240バイトを超えるファイル名は禁止されています。',
@@ -1784,7 +1806,7 @@ HTMLタグを見直してください。',
 'filetype-badmime' => 'MIMEタイプ「$1」のファイルのアップロードは許可されていません。',
 'filetype-bad-ie-mime' => '許可されていない潜在的危険性のあるファイル形式「$1」としてInternet Explorerに認識されてしまうため、このファイルをアップロードできません。',
 'filetype-unwanted-type' => "'''「.$1」'''は好ましくないファイル形式です。
-推奨される{{PLURAL:$3|ファイル形式}}は$2です。",
+推奨される{{PLURAL:$3|ファイル形式}}は $2 です。",
 'filetype-banned-type' => "'''「.$1」''' は許可されていないファイル形式です{{PLURAL:$4|}}。
 許可されているファイル形式{{PLURAL:$3|}}は$2です。",
 'filetype-missing' => 'ファイルに、「.jpg」のような拡張子がありません。',
@@ -1795,18 +1817,18 @@ HTMLタグを見直してください。',
 'verification-error' => 'このファイルは、ファイルの検証システムに合格しませんでした。',
 'hookaborted' => '拡張機能のフックによって、修正が中断されました。',
 'illegal-filename' => 'そのファイル名は許可されていません。',
-'overwrite' => '既存のファイルへ上書きすることは許可されていません。',
+'overwrite' => '既存のファイルへの上書きは許可されていません。',
 'unknown-error' => '不明なエラーが発生しました。',
 'tmp-create-error' => '一時ファイルを作成できませんでした。',
-'tmp-write-error' => '一時ファイルへの書き込みエラー',
-'large-file' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82µã\82¤ã\82ºã\81¯$1ã\83\90ã\82¤ã\83\88ã\82\88ã\82\8a大ã\81\8dã\81\8fã\81\97ã\81ªã\81\84ã\81\93ã\81¨ã\81\8cæ\8e¨å¥¨ã\81\95ã\82\8cã\81¦ã\81\84ます。
-このファイルは$2バイトです。',
+'tmp-write-error' => '一時ファイルへの書き込みエラーです。',
+'large-file' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\82µã\82¤ã\82ºã\82\92 $1 ã\83\90ã\82¤ã\83\88以ä¸\8bã\81«ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92æ\8e¨å¥¨ã\81\97ます。
+このファイルは $2 バイトです。',
 'largefileserver' => 'このファイルは、サーバー設定で許されている最大サイズより大きいです。',
 'emptyfile' => 'アップロードしたファイルは内容が空のようです。
 ファイル名の指定が間違っている可能性があります。
 本当にこのファイルをアップロードしたいのか、確認してください。',
-'windows-nonascii-filename' => 'ã\81\93ã\81®wikiã\81§ã\81¯ã\80\81ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81«ç\89¹æ®\8aæ\96\87å­\97ã\82\92使ã\81\86ã\81\93ã\81¨ã\81\8cできません。',
-'fileexists' => "ã\81\93ã\81®å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯æ\97¢ã\81«å­\98å\9c¨ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82ç½®ã\81\8dæ\8f\9bã\81\88ã\82\8bã\81¹ã\81\8dã\81\8bã\81©ã\81\86ã\81\8b確信ã\81\8cã\82\82てない場合は、'''<tt>[[:$1]]</tt>'''を確認してください。
+'windows-nonascii-filename' => 'ã\81\93ã\81®wikiã\81§ã\81¯ã\83\95ã\82¡ã\82¤ã\83«å\90\8dã\81«ç\89¹æ®\8aæ\96\87å­\97ã\82\92使ç\94¨できません。',
+'fileexists' => "ã\81\93ã\81®å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯æ\97¢ã\81«å­\98å\9c¨ã\81\97ã\81¾ã\81\99ã\80\82ç½®ã\81\8dæ\8f\9bã\81\88ã\81¦ã\81\84ã\81\84ã\81\8bã\81©ã\81\86ã\81\8b確信ã\81\8cæ\8c\81てない場合は、'''<tt>[[:$1]]</tt>'''を確認してください。
 [[$1|thumb]]",
 'filepageexists' => "このファイルのための説明ページは既に'''<tt>[[:$1]]</tt>'''に作成されていますが、現在、ファイルが存在していません。
 入力した概要は説明ページに反映されません。
@@ -1816,26 +1838,26 @@ HTMLタグを見直してください。',
 * アップロード中のファイルの名前:'''<tt>[[:$1]]</tt>'''
 * 既存ファイルの名前:'''<tt>[[:$2]]</tt>'''
 違う名前を選択してください。",
-'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの(サムネイル)のようです。
+'fileexists-thumbnail-yes' => "このファイルは元の画像から縮小されたもの''(サムネイル)''のようです。
 [[$1|thumb]]
 ファイル'''<tt>[[:$1]]</tt>'''を確認してください。
-確認したファイルが同じ画像のもとのサイズの版である場合、サムネイルを個別にアップロードする必要はありません。",
+確認したファイルが同じ画像の元のサイズの版の場合は、サムネイルを別途アップロードする必要はありません。",
 'file-thumbnail-no' => "ファイル名が'''<tt>$1</tt>'''から始まっています。
-他の画像から縮小されたもの(サムネイル)のようです。
\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\80\81ã\81\9dã\81¡ã\82\89ã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\9dã\81\86ã\81§ない場合はファイル名を変更してください。",
+他の画像から縮小されたもの''(サムネイル)''のようです。
\82\88ã\82\8aé«\98精細ã\81ªç\94»å\83\8fã\82\92ã\81\8aæ\8c\81ã\81¡ã\81®å ´å\90\88ã\81¯ã\81\9dã\82\8cã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\8aæ\8c\81ã\81¡ã\81§ã\81¯ない場合はファイル名を変更してください。",
 'fileexists-forbidden' => 'この名前のファイルは既に存在しており、上書きできません。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'この名前のファイルは共有ファイルリポジトリに既に存在しています。
 アップロードを継続したい場合は、前のページに戻り、別のファイル名を使用してください。
 [[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル}}と重複しています:',
+'file-exists-duplicate' => 'このファイルは以下の{{PLURAL:$1|ファイル|ファイル群}}と重複しています:',
 'file-deleted-duplicate' => 'このファイル([[:$1]])と同一のファイルが以前に削除されています。
 再度アップロードをする前に、以前削除されたファイルの削除記録を確認してください。',
 'uploadwarning' => 'アップロード警告',
 'uploadwarning-text' => '下記のファイル解説を修正して再試行してください。',
 'savefile' => 'ファイルを保存',
-'uploadedimage' => '「[[$1]]」をアップロードしました',
+'uploadedimage' => '「[[$1]]」をアップロードしました',
 'overwroteimage' => '「[[$1]]」の新しい版をアップロードしました',
 'uploaddisabled' => 'アップロード機能は無効になっています。',
 'copyuploaddisabled' => 'URLからのアップロードは無効になっています。',
@@ -1843,11 +1865,11 @@ HTMLタグを見直してください。',
 'uploaddisabledtext' => 'ファイルのアップロードは、無効になっています。',
 'php-uploaddisabledtext' => 'ファイルのアップロードがPHPで無効化されています。
 file_uploadsの設定を確認してください。',
-'uploadscripted' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\80\81ã\82¦ã\82§ã\83\96ã\83\96ã\83©ã\82¦ã\82¶ã\81\8c誤ã\81£ã\81¦è§£é\87\88ã\81\97ã\81¦ã\81\97ã\81¾ã\81\86ã\81\8aã\81\9dã\82\8cã\81®あるHTMLまたはスクリプトコードを含んでいます。',
+'uploadscripted' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\80\81ã\82¦ã\82§ã\83\96ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81\8c誤ã\81£ã\81¦è§£é\87\88ã\81\97ã\81¦ã\81\97ã\81¾ã\81\86ã\81\8aã\81\9dã\82\8cã\81\8cあるHTMLまたはスクリプトコードを含んでいます。',
 'uploadvirus' => 'このファイルにはウイルスが含まれています!
 詳細:$1',
 'uploadjava' => 'このファイルは、Javaの.classファイルを含むZIPファイルです。
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81®å\88¶é\99\90ã\82\92å\9b\9eé\81¿ã\81\95ã\82\8cã\82\8bã\81\8aã\81\9dã\82\8cã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\80\81Javaã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\99ã\82\8bã\81\93ã\81¨は許可されていません。',
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81®å\88¶é\99\90ã\82\92å\9b\9eé\81¿ã\81\95ã\82\8cã\82\8bã\81\8aã\81\9dã\82\8cã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\80\81Javaã\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89は許可されていません。',
 'upload-source' => 'アップロード元ファイル',
 'sourcefilename' => 'アップロード元のファイル名:',
 'sourceurl' => 'アップロード元のURL:',
@@ -1861,9 +1883,9 @@ file_uploadsの設定を確認してください。',
 'filename-bad-prefix' => "アップロードしようとしているファイルの名前が'''「$1」'''から始まっていますが、これはデジタルカメラによって自動的に付与されるような具体性を欠いた名前です。
 ファイルの内容をより具体的に説明する名前を使用してください。",
 'filename-prefix-blacklist' => ' #<!-- この行はそのままにしておいてください --> <pre>
-# 構文は以下:
+# 構文は以下の通り:
 #   * "#" 記号から行末まではすべてがコメント
-#   * ç©ºã\81§ã\81ªã\81\84ã\81\99ã\81¹ã\81¦ã\81®è¡\8cã\81¯デジタルカメラによって自動的に付けられる典型的なファイル名の接頭辞
+#   * ç©ºã\81§ã\81¯ã\81ªã\81\84è¡\8cã\81¯ã\81\99ã\81¹ã\81¦デジタルカメラによって自動的に付けられる典型的なファイル名の接頭辞
 CIMG # カシオ
 DSC_ # ニコン
 DSCF # 富士フイルム
@@ -1875,7 +1897,7 @@ MGP # ペンタックス
 PICT # その他
  #</pre> <!-- この行はそのままにしておいてください -->',
 'upload-success-subj' => 'アップロード成功',
-'upload-success-msg' => '[$2]からのアップロードに成功しました。[[:{{ns:file}}:$1]]から利用可能です。',
+'upload-success-msg' => '[$2] からアップロードしました。こちらで利用できます:[[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'アップロードで発生した問題',
 'upload-failure-msg' => '[$2]からのアップロード中に問題が発生しました:
 
@@ -1883,14 +1905,14 @@ $1',
 'upload-warning-subj' => 'アップロードの警告',
 'upload-warning-msg' => '[$2] からアップロードしようとしたデータに問題があります。 [[Special:Upload/stash/$1|アップロードのフォーム]]に戻って問題を修正してください。',
 
-'upload-proto-error' => '不正なプロトコル',
+'upload-proto-error' => '無効なプロトコル',
 'upload-proto-error-text' => '遠隔アップロード機能では、URLが<code>http://</code>か<code>ftp://</code>で始まっている必要があります。',
 'upload-file-error' => '内部エラー',
 'upload-file-error-text' => '内部エラーのため、サーバー上の一時ファイル作成に失敗しました。
 [[Special:ListUsers/sysop|管理者]]に連絡してください。',
 'upload-misc-error' => '不明なアップロードのエラー',
-'upload-misc-error-text' => 'アップロードに不明なエラーが発生しました。
-指定したURLがアクセス可能で有効なものであるかを再度確認してください。
+'upload-misc-error-text' => 'アップロードに不明なエラーが発生しました。
+指定した URL が正しいこととアクセスできることを確認して、もう一度試してください。
 それでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。',
 'upload-too-many-redirects' => 'そのURLに含まれるリダイレクトが多すぎます',
 'upload-unknown-size' => 'サイズ不明',
@@ -1901,10 +1923,11 @@ $1',
 'backend-fail-stream' => 'ファイル $1 をストリームできませんでした。',
 'backend-fail-backup' => 'ファイル $1 をバックアップできませんでした。',
 'backend-fail-notexists' => 'ファイル $1 は存在しません。',
-'backend-fail-notsame' => 'ファイル名 $1 はすでに違うファイルが使用しています。',
-'backend-fail-invalidpath' => '$1 はストレージパスに使用することができません。',
+'backend-fail-hashes' => 'ファイルの比較用のハッシュを取得できませんでした。',
+'backend-fail-notsame' => 'ファイル名 $1 は既に他のファイルが使用しています。',
+'backend-fail-invalidpath' => '$1 はストレージパスに使用できません。',
 'backend-fail-delete' => 'ファイル $1 を削除できませんでした。',
-'backend-fail-alreadyexists' => 'ファイル $1 はすでに存在します。',
+'backend-fail-alreadyexists' => 'ファイル $1 はに存在します。',
 'backend-fail-store' => 'ファイル $1 を $2 に格納できませんでした。',
 'backend-fail-copy' => 'ファイル $1 を $2 にコピーできませんでした。',
 'backend-fail-move' => 'ファイル $1 を $2 に移動できませんでした。',
@@ -1912,51 +1935,70 @@ $1',
 'backend-fail-writetemp' => '一時ファイルに書き込めませんでした。',
 'backend-fail-closetemp' => '一時ファイルを閉じることができませんでした。',
 'backend-fail-read' => 'ファイル $1 を読み込めませんでした。',
-'backend-fail-create' => 'ファイル $1 を作成できませんでした。',
-'backend-fail-readonly' => 'ストレージバックエンド「$1」は現在読み取り専用です。理由:「$2」',
-'backend-fail-synced' => 'ファイル「$1」は、ストレージバックエンド内部において不一致の状態にあります。',
+'backend-fail-create' => 'ファイル $1 に書き込めませんでした。',
+'backend-fail-maxsize' => 'サイズが {{PLURAL:$2|$2 バイト}}を超えているため、ファイル $1 に書き込めませんでした。',
+'backend-fail-readonly' => "ストレージバックエンド「$1」は現在読み取り専用です。理由:「''$2''」",
+'backend-fail-synced' => 'ファイル「$1」は、ストレージバックエンド内部で不一致の状態にあります',
+'backend-fail-connect' => 'ストレージバックエンド「$1」に接続できませんでした。',
+'backend-fail-internal' => 'ストレージバックエンド「$1」内で不明なエラーが発生しました。',
 'backend-fail-contenttype' => '「$1」に保存するコンテンツの種類が判断できませんでした。',
+'backend-fail-batchsize' => 'ストレージバックエンドは $1 件のファイル{{PLURAL:$1|操作}}のバッチを与えられました; 上限は $2 件の{{PLURAL:$2|操作}}です。',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'ストレージバックエンド「$1」のジャーナルデータベースに接続できません。',
+'filejournal-fail-dbquery' => 'ストレージバックエンド「$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のチェックを行った際にエラーが検出されました。',
 'zip-wrong-format' => '指定されたファイルはZIPファイルではありませんでした。',
 'zip-bad' => 'このファイルは破損しているか解読不能のZIPファイルです。
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81«ã\81¤ã\81\84ã\81¦é\81©å\88\87ã\81«æ¤\9cæ\9f»ã\81\99ã\82\8bã\81\93ã\81¨ができません。',
-'zip-unsupported' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯MediaWikiã\81§å\88©ç\94¨ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81ªã\81\84ZIPå½¢å¼\8fを使用したZIPファイルです。
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81«ã\81¤ã\81\84ã\81¦é\81©å\88\87ã\81«æ¤\9cæ\9f»ã\81\99ã\82\8bã\81\93ã\81¨ができません。',
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81«ã\81¤ã\81\84ã\81¦é\81©å\88\87ã\81ªæ¤\9cæ\9f»ができません。',
+'zip-unsupported' => 'ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯MediaWikiã\81\8cæ\9cªå¯¾å¿\9cã\81®ZIPæ©\9fè\83½を使用したZIPファイルです。
\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81«ã\81¤ã\81\84ã\81¦é\81©å\88\87ã\81ªæ¤\9cæ\9f»ができません。',
 
 # Special:UploadStash
 'uploadstash' => '未公開アップロード',
 'uploadstash-summary' => 'このページでは、アップロードされた、もしくはアップロード中の、ウィキ上でまだ公開されていないファイルを表示します。これらのファイルは、アップロードした利用者以外閲覧できません。',
 'uploadstash-clear' => '未公開ファイルを消去',
 'uploadstash-nofiles' => '未公開ファイルはありません。',
-'uploadstash-badtoken' => '実行することができませんでした。これは、編集するための認証が無効になったためである可能性があります。再度お試しください。',
+'uploadstash-badtoken' => '操作を実行できませんでした。編集するための認証の期限切れが原因である可能性があります。再度お試しください。',
 'uploadstash-errclear' => 'ファイルの消去に失敗しました。',
 'uploadstash-refresh' => 'ファイルの一覧を更新',
-'invalid-chunk-offset' => '不正なチャンクオフセット',
+'invalid-chunk-offset' => '無効なチャンクオフセット',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'アクセスが拒否されました',
 'img-auth-nopathinfo' => 'PATH_INFO が見つかりません。
 サーバーが、この情報を渡すように構成されていません。
 CGI ベースであるため、img_auth に対応できない可能性もあります。
-https://www.mediawiki.org/wiki/Manual:Image_Authorization を参照してください。',
-'img-auth-notindir' => '要求されたパスは、設定済みのアップロード用ディレクトリーの中にありません。',
+https://www.mediawiki.org/wiki/Manual:Image_Authorization をご覧ください。',
+'img-auth-notindir' => '要求されたパスは、設定済みのアップロード先ディレクトリ内にありません。',
 'img-auth-badtitle' => '「$1」からは有効なページ名を構築できません。',
 'img-auth-nologinnWL' => 'ログインしておらず、さらに「$1」はホワイトリストに入っていません。',
 'img-auth-nofile' => 'ファイル「$1」は存在しません。',
-'img-auth-isdir' => 'ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\83¼ã\80\8c$1ã\80\8dã\81«ã\82¢ã\82¯ã\82»ã\82¹ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82
+'img-auth-isdir' => 'ディレクトリ「$1」にアクセスしようとしています。
 ファイルへのアクセスのみが許可されています。',
 'img-auth-streaming' => '「$1」を転送中。',
-'img-auth-public' => 'img_auth.phpの機能は非公開ウィキからファイルを出力することです。
+'img-auth-public' => 'img_auth.phpの機能は、非公開ウィキからのファイルの出力です。
 このウィキは公開ウィキとして構成されています。
\9c\80é\81©ã\81ªã\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\83¼ã\81®ã\81\9fã\82\81ã\80\81img_auth.phpã\81¯ç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cています。',
\9c\80é\81©ã\81ªã\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\81®ã\81\9fã\82\81ã\80\81img_auth.phpã\82\92ç\84¡å\8a¹ã\81«ã\81\97ています。',
 'img-auth-noread' => '利用者は「$1」の読み取り権限を持っていません。',
-'img-auth-bad-query-string' => 'URLの中に無効なクエリ文字列があります。',
+'img-auth-bad-query-string' => 'URLの中に無効なクエリ文字列があります。',
 
 # HTTP errors
 'http-invalid-url' => '無効なURL:$1',
-'http-invalid-scheme' => '"$1"のスキームを含むURLはサポートされていません',
+'http-invalid-scheme' => 'スキーム「$1」の URL には未対応です。',
 'http-request-error' => '不明なエラーによりHTTPリクエストに失敗しました。',
 'http-read-error' => 'HTTP読み込みエラー。',
 'http-timed-out' => 'HTTP要求がタイムアウトしました。',
@@ -1978,7 +2020,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'nolicense' => '選択なし',
 'license-nopreview' => '(プレビューはありません)',
 'upload_source_url' => '(有効かつ一般に公開されているURL)',
-'upload_source_file' => '(自身のコンピューター上のファイル)',
+'upload_source_file' => '(あなたのコンピューター上のファイル)',
 
 # Special:ListFiles
 'listfiles-summary' => 'この特別ページでは、アップロードされたすべてのファイルを表示します。
@@ -1997,12 +2039,12 @@ URLが正しいものであり、ウェブサイトが稼働していること
 # File description page
 'file-anchor-link' => 'ファイル',
 'filehist' => 'ファイルの履歴',
-'filehist-help' => '過去の版のファイルを表示するには、表示したい版の日付/時刻をクリックしてください。',
+'filehist-help' => '過去の版のファイルを表示するには、その版の日時をクリックしてください。',
 'filehist-deleteall' => 'すべて削除',
 'filehist-deleteone' => '削除',
 'filehist-revert' => '差し戻す',
 'filehist-current' => '現在の版',
-'filehist-datetime' => '日付/時刻',
+'filehist-datetime' => '日付時刻',
 'filehist-thumb' => 'サムネイル',
 'filehist-thumbtext' => '$1時点における版のサムネイル',
 'filehist-nothumb' => 'サムネイルなし',
@@ -2010,24 +2052,29 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filehist-dimensions' => '解像度',
 'filehist-filesize' => 'ファイルサイズ',
 'filehist-comment' => 'コメント',
-'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません',
+'filehist-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81\82りません',
 'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の{{PLURAL:$1|ページ|$1ページ}}が、このファイルへリンクしています:',
-'linkstoimage-more' => '$1を超える数のページが、このファイルにリンクしています。
-以ä¸\8bã\81®ä¸\80覧ã\81¯ã\80\81ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«ã\83ªã\83³ã\82¯ã\81\97ã\81¦ã\81\84ã\82\8bæ\9c\80å\88\9dã\81®$1ページのみを表示しています。
+'linkstoimage' => '以下の {{PLURAL:$1| ページ|$1 ページ}}が、このファイルへリンクしています:',
+'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
+以ä¸\8bã\81®ä¸\80覧ã\81§ã\81¯ã\81\93ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81«ã\83ªã\83³ã\82¯ã\81\97ã\81¦ã\81\84ã\82\8bæ\9c\80å\88\9dã\81® $1 ページのみを表示しています。
 [[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
 'nolinkstoimage' => 'このファイルへリンクしているページはありません。',
 'morelinkstoimage' => 'このファイルへの[[Special:WhatLinksHere/$1|リンク元を更に]]を表示する。',
 'linkstoimage-redirect' => '$1 (リダイレクト) $2',
-'duplicatesoffile' => '以下の$1ファイルが、このファイルと内容が同一です([[Special:FileDuplicateSearch/$2|詳細]]):',
+'duplicatesoffile' => '以下の $1 {{PLURAL:$1|ファイル}}が、このファイルと重複しています([[Special:FileDuplicateSearch/$2|詳細]]):',
 'sharedupload' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。',
 'sharedupload-desc-there' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。
 詳細は[$2 ファイル解説ページ]を参照してください。',
-'sharedupload-desc-here' => 'このファイルは$1のものであり、他のプロジェクトで使用されている可能性があります。その[$2 ファイル解説ページ]にある説明を以下に表示しています。',
+'sharedupload-desc-here' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を以下に示します。',
+'sharedupload-desc-edit' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
+'sharedupload-desc-create' => 'このファイルは$1から来ており、他のプロジェクトで使用されている可能性があります。
+$1での[$2 ファイル解説ページ]にある説明を編集したほうがいいかもしれません。',
 'filepage-nofile' => 'この名前のファイルは存在しません。',
-'filepage-nofile-link' => 'ã\81\93ã\81®å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯å­\98å\9c¨ã\81\97ã\81¾ã\81\9bã\82\93ã\81\8cã\80\81[$1 ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82',
+'filepage-nofile-link' => 'この名前のファイルは存在しませんが、[$1 アップロード]できます。',
 'uploadnewversion-linktext' => 'このファイルの新しい版をアップロードする',
-'shared-repo-from' => '$1より',
+'shared-repo-from' => '$1 より',
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
@@ -2039,7 +2086,7 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filerevert-comment' => '理由:',
 'filerevert-defaultcomment' => '$1$2の版へ差し戻し',
 'filerevert-submit' => '差し戻す',
-'filerevert-success' => "'''[[Media:$1|$1]]'''は[$4  $2$3の版]に差し戻されました。",
+'filerevert-success' => "'''[[Media:$1|$1]]'''は[$4 $2$3の版]に差し戻されました。",
 'filerevert-badversion' => 'このファイルに指定された時刻印を持つ過去の版はありません。',
 
 # File deletion
@@ -2058,14 +2105,14 @@ URLが正しいものであり、ウェブサイトが稼働していること
 'filedelete-reason-dropdown' => '*よくある削除理由
 ** 著作権侵害
 ** 重複ファイル',
-'filedelete-edit-reasonlist' => '削除理由を編集する',
+'filedelete-edit-reasonlist' => '削除理由を編集',
 'filedelete-maintenance' => 'メンテナンス中のため、ファイルの削除と復帰は一時的に無効化されています。',
 'filedelete-maintenance-title' => 'ファイルを削除できません',
 
 # MIME search
 'mimesearch' => 'MIMEタイプ検索',
-'mimesearch-summary' => '指定したMIMEタイプに合致するファイルを検索します。
-contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</tt>)。',
+'mimesearch-summary' => 'このページでは、ファイルをMIMEタイプで絞り込みます。
+contenttype/subtypeの形式で入力してください(例:<tt>image/jpeg</tt>)。',
 'mimetype' => 'MIMEタイプ:',
 'download' => 'ダウンロード',
 
@@ -2083,7 +2130,7 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 
 # Random page
 'randompage' => 'おまかせ表示',
-'randompage-nopages' => '次の{{PLURAL:$2|名前空間}}:$1には、ページがありません。',
+'randompage-nopages' => '以下の{{PLURAL:$2|名前空間}}にはページがありません:$1。',
 
 # Random redirect
 'randomredirect' => 'おまかせリダイレクト',
@@ -2098,16 +2145,16 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'statistics-header-hooks' => 'その他の統計',
 'statistics-articles' => '記事数',
 'statistics-pages' => '総ページ数',
-'statistics-pages-desc' => 'ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\84ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81ªã\81©ã\82\92å\90«ã\82\93ã\81 ã\81\93ã\81®ã\82¦ã\82£ã\82­å\86\85ã\81®すべてのページです。',
+'statistics-pages-desc' => 'ã\82¦ã\82£ã\82­å\86\85ã\81®ã\80\81ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\80\81ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81ªã\81©ã\82\92å\90«ã\82\80すべてのページです。',
 'statistics-files' => 'アップロードされたファイル数',
-'statistics-edits' => '{{SITENAME}}ã\81\8cé\96\8b設ã\81\95ã\82\8cã\81¦ã\81\8bã\82\89の編集回数の総計',
+'statistics-edits' => '{{SITENAME}}ã\81®é\96\8b設以é\99\8dの編集回数の総計',
 'statistics-edits-average' => '1ページあたりの編集回数',
 'statistics-views-total' => '総閲覧回数',
 'statistics-views-total-desc' => '存在しないページと特別ページに対する閲覧は含まれていません',
 'statistics-views-peredit' => '1編集あたりの閲覧回数',
 'statistics-users' => '[[Special:ListUsers|利用者]]',
 'statistics-users-active' => '活動中の利用者',
-'statistics-users-active-desc' => '過去$1{{PLURAL:$1|日間}}に何らかの操作を行った利用者',
+'statistics-users-active-desc' => '過去 {{PLURAL:$1|$1 日間}}に何らかの操作をした利用者',
 'statistics-mostpopular' => '最も閲覧されているページ',
 
 'disambiguations' => '曖昧さ回避ページにリンクしているページ',
@@ -2118,10 +2165,10 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 
 'doubleredirects' => '二重転送',
 'doubleredirectstext' => 'これは他のリダイレクトページへのリダイレクトの一覧です。
\90\84è¡\8cã\81«ã\81¯ã\80\81æ\9c\80å\88\9dã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81¨ã\80\81ã\81\9dã\81®è»¢é\80\81å\85\88ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\80\81ã\81\9dã\81®ã\81¾ã\81\9f転é\80\81å\85\88へのリンクが表示されています。多くの場合、最終の転送先が正しい転送先であり、最初のリダイレクトは直接最後の転送先に向けるべきです。
-<del>æ\89\93ã\81¡æ¶\88ã\81\97ç·\9a</del>ã\81®ã\81¯ã\81\84ã\81£ã\81\9fé \85ç\9b®ã\81¯æ\97¢ã\81«ä¿®æ­£ã\81\95ã\82\8cています。',
-'double-redirect-fixed-move' => '[[$1]]ã\81\8c移å\8b\95ã\81\95ã\82\8cました。
-これからは[[$2]]に転送されます。',
\90\84è¡\8cã\81«ã\81¯ã\80\81æ\9c\80å\88\9dã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\80\81ã\81\9dã\81®è»¢é\80\81å\85\88ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\80\81ã\81\95ã\82\89ã\81«ã\81\9dã\81®è»¢é\80\81å\85\88ã\80\81ã\81\9dã\82\8cã\81\9eã\82\8cへのリンクが表示されています。多くの場合、最終の転送先が正しい転送先であり、最初のリダイレクトは直接最後の転送先に向けるべきです。
+<del>æ\89\93ã\81¡æ¶\88ã\81\97ç·\9a</del>ã\81\8cå\85¥ã\81£ã\81\9fé \85ç\9b®ã\81¯æ\97¢ã\81«è§£æ±ºã\81\97ています。',
+'double-redirect-fixed-move' => '[[$1]]ã\82\92移å\8b\95ã\81\97ました。
+今後は[[$2]]に転送されます。',
 'double-redirect-fixed-maintenance' => '[[$1]]から[[$2]]への二重転送を修正します。',
 'double-redirect-fixer' => '転送修正係',
 
@@ -2158,8 +2205,10 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'popularpages' => '人気のページ',
 'wantedcategories' => 'カテゴリページが存在しないカテゴリ',
 'wantedpages' => 'ページが存在しないリンク',
-'wantedpages-badtitle' => '結果に不正なページ名が含まれています:$1',
+'wantedpages-badtitle' => '結果に正しくないページ名が含まれています:$1',
 'wantedfiles' => 'ファイル情報ページが存在しないファイル',
+'wantedfiletext-cat' => '以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。さらに、存在しないファイルを埋め込んでいるページは[[:$1]]に列挙されます。',
+'wantedfiletext-nocat' => '以下のファイルは使用されていますが存在しません。外部リポジトリ由来のファイルは、存在していてもここに列挙される場合があります。その場合は<del>取り消し線</del>が付きます。',
 'wantedtemplates' => '呼び出し先が存在しないテンプレート呼び出し',
 'mostlinked' => '被リンク数の多いページ',
 'mostlinkedcategories' => '被リンク数の多いカテゴリ',
@@ -2183,23 +2232,23 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'protectedtitlesempty' => 'これらの引数で現在保護されているページはありません。',
 'listusers' => '利用者の一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
-'listusers-creationsort' => '作成日順に整列',
-'usereditcount' => '$1回の編集',
+'listusers-creationsort' => '作成日順に並べ替え',
+'usereditcount' => '$1{{PLURAL:$1|回の編集}}',
 'usercreated' => '$1 $2 に{{GENDER:$3|作成}}',
 'newpages' => '新しいページ',
 'newpages-username' => '利用者名:',
 'ancientpages' => '最古のページ',
 'move' => '移動',
 'movethispage' => 'このページを移動',
-'unusedimagestext' => '以下のファイルは存在していますが、どのページにも埋め込まれていません。
-ただし、他のウェブサイトが直接URLでファイルにリンクすることがあることに注意してください。以下のファイル一覧には、そのような形で利用中のファイルが含まれていることがあります。',
-'unusedcategoriestext' => '以下のカテゴリはページが存在しますが、他のどのページおよびカテゴリでも使れていません。',
+'unusedimagestext' => '以下のファイルは、存在しますがどのページにも埋め込まれていません。
+ただし、他のウェブサイトがURLでファイルに直接リンクする場合があることに注意してください。以下のファイル一覧には、そのような形で利用中のファイルが含まれている場合があります。',
+'unusedcategoriestext' => '以下のカテゴリはページが存在しますが、他のどのページおよびカテゴリでも使用されていません。',
 'notargettitle' => '対象が存在しません',
 'notargettext' => 'この機能の実行対象となるページまたは利用者が指定されていません。',
 'nopagetitle' => 'そのようなページはありません',
 'nopagetext' => '指定したページは存在しません。',
-'pager-newer-n' => '以後の$1件',
-'pager-older-n' => '以前の$1件',
+'pager-newer-n' => '{{PLURAL:$1|以後の$1件}}',
+'pager-older-n' => '{{PLURAL:$1|以前の$1件}}',
 'suppress' => '秘匿する',
 'querypage-disabled' => 'パフォーマンスに悪影響を与えるおそれがあるため、この特別ページは無効になっています。',
 
@@ -2208,17 +2257,18 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'booksources-search-legend' => '書籍情報源を検索',
 'booksources-go' => '検索',
 'booksources-text' => '以下は、新古本を販売している外部サイトへのリンクの一覧で、検索中の本について、更に詳しい情報が提供されているかもしれません:',
-'booksources-invalid-isbn' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fISBNç\95ªå\8f·ã\81¯æ\9c\89å\8a¹ã\81§ã\81¯ã\81ªã\81\84ã\82\88ã\81\86ã\81§ã\81\99ã\80\82å\8f\82ç\85§ã\81\97ã\81¦ã\81\84ã\82\8bæ\83\85å ±æº\90ã\81\8bã\82\89å\86\99ã\81\97é\96\93é\81\95ã\81\88ã\81¦ã\81\84ã\81¾ã\81\9bã\82\93ã\81\8b。',
+'booksources-invalid-isbn' => 'æ\8c\87å®\9aã\81\97ã\81\9fISBNç\95ªå\8f·ã\81¯æ\9c\89å\8a¹ã\81§ã\81¯ã\81ªã\81\84ã\82\88ã\81\86ã\81§ã\81\99ã\80\82æ\83\85å ±æº\90ã\81\8bã\82\89å\86\99ã\81\97é\96\93é\81\95ã\81\88ã\81¦ã\81\84ã\81ªã\81\84ã\81\8b確èª\8dã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。',
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
 'speciallogtitlelabel' => '対象(ページまたは利用者):',
 'log' => '記録',
 'all-logs-page' => 'すべての公開記録',
-'alllogstext' => '{{SITENAME}}の取得可能な記録がまとめて表示されています。
+'alllogstext' => '{{SITENAME}}の取得できる記録をまとめて表示しています。
 記録の種類、実行した利用者(大文字小文字は区別)、影響を受けたページ(大文字小文字は区別)による絞り込みができます。',
-'logempty' => '該当する記録がみつかりませんでした。',
-'log-title-wildcard' => 'この文字列で始まるページ名を検索する',
+'logempty' => '該当する記録はありません。',
+'log-title-wildcard' => 'この文字列で始まるページ名を検索',
+'showhideselectedlogentries' => '選択した記録の項目を表示/非表示',
 
 # Special:AllPages
 'allpages' => '全ページ',
@@ -2237,15 +2287,21 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'allpagesbadtitle' => '指定したページ名は無効か、言語間またはウィキ間接頭辞を含んでいます。
 ページ名に使用できない文字が1つ以上含まれている可能性があります。',
 '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|カテゴリ}}にはページまたはメディアが存在します。
-[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ã\81®ã\82«ã\83\86ã\82´ã\83ª]]ã\81¯ã\81\93ã\81\93ã\81«ã\81¯è¡¨ç¤ºã\81\95ã\82\8cていません。
+'categoriespagetext' => '以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。
+[[Special:UnusedCategories|æ\9cªä½¿ç\94¨ã\81®ã\82«ã\83\86ã\82´ã\83ª]]ã\81¯ã\81\93ã\81\93ã\81«ã\81¯è¡¨ç¤ºã\81\97ていません。
 [[Special:WantedCategories|望まれるカテゴリ]]も参照してください。',
 'categoriesfrom' => '最初に表示するカテゴリ:',
-'special-categories-sort-count' => '項目数順',
-'special-categories-sort-abc' => 'アルファベット順',
+'special-categories-sort-count' => '項目数順に並べ替え',
+'special-categories-sort-abc' => '辞書順に並べ替え',
 
 # Special:DeletedContributions
 'deletedcontributions' => '利用者の削除された投稿',
@@ -2257,8 +2313,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'linksearch-pat' => '検索パターン:',
 'linksearch-ns' => '名前空間:',
 'linksearch-ok' => '検索',
-'linksearch-text' => '"*.wikipedia.org" のようにワイルドカードを使うことができます。
-少なくとも"*.org" のようなトップレベルドメインが必要です。<br />
+'linksearch-text' => '"*.wikipedia.org" のようにワイルドカードを使できます。
+少なくとも "*.org" のようなトップレベルドメインが必要です。<br />
 対応プロトコル: <tt>$1</tt> (これらを検索に含めないでください)。',
 'linksearch-line' => '$1 が $2 からリンクされています',
 'linksearch-error' => 'ワイルドカードはホスト名の先頭でのみ使用できます。',
@@ -2271,8 +2327,8 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 
 # Special:ActiveUsers
 'activeusers' => '活動中の利用者一覧',
-'activeusers-intro' => 'これは過去$1{{PLURAL:$1|日|日間}}になんらかの活動をした利用者の一覧です。',
-'activeusers-count' => '過去$3{{PLURAL:$3|日|日間}}に$1回の{{PLURAL:$1|編集}}',
+'activeusers-intro' => 'これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。',
+'activeusers-count' => '過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の編集}}',
 'activeusers-from' => '最初に表示する利用者:',
 'activeusers-hidebots' => 'ボットを隠す',
 'activeusers-hidesysops' => '管理者を隠す',
@@ -2294,33 +2350,33 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'listgrouprights-members' => '(該当者一覧)',
 'listgrouprights-addgroup' => '{{PLURAL:$2|グループ}}を追加:$1',
 'listgrouprights-removegroup' => '{{PLURAL:$2|グループ}}を除去:$1',
-'listgrouprights-addgroup-all' => '全グループ追加可能',
-'listgrouprights-removegroup-all' => '全グループ除去可能',
-'listgrouprights-addgroup-self' => '自のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
-'listgrouprights-removegroup-self' => '自のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
-'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
-'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
+'listgrouprights-addgroup-all' => '全グループ追加可能',
+'listgrouprights-removegroup-all' => '全グループ除去可能',
+'listgrouprights-addgroup-self' => '自のアカウントに{{PLURAL:$2|グループ}}を追加:$1',
+'listgrouprights-removegroup-self' => '自のアカウントから{{PLURAL:$2|グループ}}を除去:$1',
+'listgrouprights-addgroup-self-all' => '自のアカウントに全グループを追加可能',
+'listgrouprights-removegroup-self-all' => '自のアカウントから全グループを除去可能',
 
 # E-mail user
 'mailnologin' => '送信アドレスがありません',
 'mailnologintext' => '他の利用者宛にメールを送信するためには、[[Special:UserLogin|ログイン]]し、[[Special:Preferences|個人設定]]で有効なメールアドレスを設定する必要があります。',
 'emailuser' => 'この利用者にメールを送信',
-'emailpage' => '利用者にメール送信',
-'emailpagetext' => 'ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92é\80\9aã\81\98ã\81¦ã\80\81ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ã\82\8bã\81\93ã\81¨ã\81\8cできます。
-受信者が直接返事を出せるよう、[[Special:Preferences|利用者の個人設定]]で登録した電子メールアドレスがメール中で「差出人」アドレスとして表示されます。',
+'emailpage' => '利用者にメール送信',
+'emailpagetext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81«ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡できます。
+「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。',
 'usermailererror' => 'メールが以下のエラーを返しました:',
-'defemailsubject' => '利用者「$1」からの {{SITENAME}} 電子メール',
+'defemailsubject' => '{{SITENAME}} 利用者「$1」からのメール',
 'usermaildisabled' => '利用者メール機能は無効になっています',
-'usermaildisabledtext' => 'このウィキ上で他の利用者へメールを送ることはできません。',
+'usermaildisabledtext' => 'このウィキでは他の利用者にメールを送信できません',
 'noemailtitle' => 'メールアドレスがありません',
 'noemailtext' => 'この利用者は有効なメールアドレスを登録していません。',
-'nowikiemailtitle' => '電子メール不許可',
+'nowikiemailtitle' => 'メールは許可されていません',
 'nowikiemailtext' => 'この利用者は他の利用者からメールを受け取らない設定にしています。',
 'emailnotarget' => '受信者の利用者名が存在しない、あるいは無効です。',
 'emailtarget' => '受信者の利用者名を入力してください',
 'emailusername' => '利用者名:',
 'emailusernamesubmit' => '送信',
-'email-legend' => '{{SITENAME}}の他の利用者に電子メールを送る',
+'email-legend' => '{{SITENAME}} の他の利用者にメールを送信',
 'emailfrom' => '差出人:',
 'emailto' => '宛先:',
 'emailsubject' => '件名:',
@@ -2328,9 +2384,9 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'emailsend' => '送信',
 'emailccme' => '自分宛に控えを送信する。',
 'emailccsubject' => '$1に送信したメールの控え:$2',
-'emailsent' => 'メールを送ました',
-'emailsenttext' => 'ã\83¡ã\83¼ã\83«ã\81¯ç\84¡äº\8bé\80\81ä¿¡ã\81\95ã\82\8cました。',
-'emailuserfooter' => 'この電子メールは$1から$2へ、{{SITENAME}}の「利用者へメールを送信」機能を使って送られました。',
+'emailsent' => 'メールを送信しました',
+'emailsenttext' => 'ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡ã\81\97ました。',
+'emailuserfooter' => 'このメールは {{SITENAME}} の「利用者にメール送信」機能が、「$1」から「$2」に送信したものです。',
 
 # User Messenger
 'usermessage-summary' => 'システムメッセージを残す。',
@@ -2341,35 +2397,35 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'mywatchlist' => 'ウォッチリスト',
 'watchlistfor2' => '利用者: $1 $2',
 'nowatchlist' => 'ウォッチリストに項目がありません。',
-'watchlistanontext' => 'ウォッチリストに入っている項目を表示または編集するには、$1してください。',
+'watchlistanontext' => 'ウォッチリストにある項目を閲覧または編集するには、$1してください。',
 'watchnologin' => 'ログインしていません',
 'watchnologintext' => 'ウォッチリストを変更するためには、[[Special:UserLogin|ログイン]]している必要があります。',
 'addwatch' => 'ウォッチリストに追加',
-'addedwatchtext' => "ページ 「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]に追加しました。
+'addedwatchtext' => "ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]に追加しました。
 このページと付属のトークページに変更があった際には、ウォッチリストに表示されます。また、ウォッチリストに登録されているページは[[Special:RecentChanges|最近の更新の一覧]]に'''太字'''で表示され、見つけやすくなります。",
 'removewatch' => 'ウォッチリストから除去',
 'removedwatchtext' => 'ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]から除去しました。',
 'watch' => 'ウォッチ',
 'watchthispage' => 'このページをウォッチする',
-'unwatch' => 'ウォッチしない',
+'unwatch' => 'ウォッチ解除',
 'unwatchthispage' => 'ウォッチをやめる',
 'notanarticle' => '記事ではありません',
 'notvisiblerev' => '別の利用者による最終版は削除されました',
 'watchnochange' => 'ウォッチリストに登録しているページで、指定期間内に編集されたものはありません。',
-'watchlist-details' => 'ウォッチリストには$1ページが登録されています(トークページは数えません)。',
+'watchlist-details' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています(トークページを除く)。',
 'wlheader-enotif' => '* メール通知が有効になっています',
 'wlheader-showupdated' => "* 最後に訪問したあとに変更されたページは、'''太字'''で表示されます",
 'watchmethod-recent' => '最近の更新内のウォッチされているページを確認中',
 'watchmethod-list' => 'ウォッチされているページ内の最近の更新を確認中',
-'watchlistcontains' => 'ウォッチリストには、$1ページが登録されています。',
-'iteminvalidname' => 'é \85ç\9b®ã\80\8c$1ã\80\8dã\81¯å\95\8fé¡\8cã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\81å\90\8då\89\8dã\81\8cä¸\8dæ­£ã\81§ã\81\99ã\80\82',
-'wlnote' => "$3 $4までの{{PLURAL:$2|'''$2'''時間}}になされた'''$1'''件の変更は以下のとおりです。",
+'watchlistcontains' => 'ウォッチリストには {{PLURAL:$1|$1 ページ}}が登録されています。',
+'iteminvalidname' => 'é \85ç\9b®ã\80\8c$1ã\80\8dã\81«ã\81¯å\95\8fé¡\8cã\81\8cã\81\82ã\82\8aã\81¾ã\81\99ã\80\82å\90\8då\89\8dã\81\8cæ­£ã\81\97ã\81\8fã\81\82ã\82\8aã\81¾ã\81\9bã\82\93...',
+'wlnote' => "$3 $4 までの{{PLURAL:$2|'''$2'''時間}}になされた{{PLURAL:$1|'''$1'''件の変更}}は以下の通りです。",
 'wlshowlast' => '次の期間で表示:$1時間、$2日間、$3',
 'watchlist-options' => 'ウォッチリストのオプション',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'ウォッチリストに追加しています・・・',
-'unwatching' => 'ウォッチリストから除去しています・・・',
+'watching' => 'ウォッチリストに追加中...',
+'unwatching' => 'ウォッチリストから除去中...',
 'watcherrortext' => 'ウォッチリストの「$1」の設定を変更中にエラーが発生しました。',
 
 'enotif_mailer' => '{{SITENAME}} 通知メール',
@@ -2379,34 +2435,34 @@ contenttype/subtypeの形式で指定してください(例:<tt>image/jpeg</
 'changed' => '変更',
 'created' => '作成',
 'enotif_subject' => '{{SITENAME}}のページ「$PAGETITLE」が$PAGEEDITORによって$CHANGEDORCREATEDされました',
-'enotif_lastvisited' => 'æ\9c\80å¾\8cã\81«é\96²è¦§ã\81\97ã\81\9få¾\8cã\81«è¡\8cã\81ªã\82\8fã\82\8cã\81\9få\85¨ã\81¦ã\81®å¤\89æ\9b´ã\81¯ã\80\81 $1 ã\81§è¦\8bã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99。',
+'enotif_lastvisited' => 'æ\9c\80å¾\8cã\81«é\96²è¦§ã\81\97ã\81¦ä»¥é\99\8dã\81®ã\81\99ã\81¹ã\81¦ã\81®å¤\89æ\9b´ã\81¯ $1 ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84。',
 'enotif_lastdiff' => 'この変更内容を表示するには $1 をご覧ください。',
-'enotif_anon_editor' => '匿名利用者:$1',
+'enotif_anon_editor' => '匿名利用者「$1」',
 'enotif_body' => '$WATCHINGUSERNAMEさん
 
-{{SITENAME}}のページ$PAGETITLEが$PAGEEDITDATEに、$PAGEEDITORによって$CHANGEDORCREATEDされました。現在の版を見るには $PAGETITLE_URL をご覧ください。
+{{SITENAME}}のページ「$PAGETITLE」が$PAGEEDITDATEに、$PAGEEDITORによって$CHANGEDORCREATEDされました。現在の版を見るには $PAGETITLE_URL をご覧ください。
 
 $NEWPAGE
 
 編集内容の要約:$PAGESUMMARY($PAGEMINOREDIT)
 
\8a\95稿è\80\85ã\81«é\80£çµ¡
\8a\95稿è\80\85ã\81®é\80£çµ¡å\85\88
 メール:$PAGEEDITOR_EMAIL
 ウィキ:$PAGEEDITOR_WIKI
 
 このページを訪れない限り、これ以上の変更に対する通知は送信されません。
-ウォッチリストからすべての通知を再設定することもできます。
+ウォッチリスト内のすべてのページについて、通知を再設定することもできます。
 
                          {{SITENAME}}通知システム
 
 --
-メール通知の設定は、次のページから変更してください。
+メール通知の設定は、以下のページで変更してください:
 {{canonicalurl:{{#special:Preferences}}}}
 
-ウォッチリストの設定は、次のページから変更して下さい。
+ウォッチリストの設定は、以下のページで変更してください:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-このページは、次のページでウォッチリストから除去することが出来ます。
+このページは、以下のページでウォッチリストから削除できます:
 $UNWATCHURL
 
 ご意見、お問い合わせ:
@@ -2419,13 +2475,13 @@ $UNWATCHURL
 'excontentauthor' => '内容:「$1」(投稿者は「[[Special:Contributions/$2|$2]]」のみ)',
 'exbeforeblank' => '白紙化前の内容:「$1」',
 'exblank' => '白紙ページ',
-'delete-confirm' => 'ã\80\8c$1ã\80\8dã\81®削除',
+'delete-confirm' => 'ã\80\8c$1ã\80\8dã\82\92削除',
 'delete-legend' => '削除',
 'historywarning' => "'''警告:'''削除しようとしているページには、約$1版の履歴があります:",
 'confirmdeletetext' => 'ページをすべての履歴とともに削除しようとしています。
 本当にこの操作を行いたいか、操作の結果を理解しているか、およびこの操作が[[{{MediaWiki:Policy-url}}|方針]]に従っているかどうか、確認をしてください。',
-'actioncomplete' => '完了しました',
-'actionfailed' => '操作失敗',
+'actioncomplete' => '操作を完了しました',
+'actionfailed' => '操作に失敗しました',
 'deletedtext' => '「$1」は削除されました。
 最近の削除に関しては、$2を参照してください。',
 'dellogpage' => '削除記録',
@@ -2439,10 +2495,10 @@ $UNWATCHURL
 ** 投稿者依頼
 ** 著作権侵害
 ** 荒らし',
-'delete-edit-reasonlist' => '削除理由を編集する',
-'delete-toobig' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯ã\80\81$1ç\89\88ã\82\88ã\82\8aå¤\9aã\81\84編集履歴があります。
+'delete-edit-reasonlist' => '削除理由を編集',
+'delete-toobig' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯ã\80\81$1ç\89\88ã\82\92è¶\85ã\81\88ã\82\8b編集履歴があります。
 このようなページの削除は、{{SITENAME}}の偶発的な問題を避けるため、制限されています。',
-'delete-warning-toobig' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯ã\80\81 $1ç\89\88ã\82\88ã\82\8aå¤\9aã\81\84編集履歴があります。
+'delete-warning-toobig' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«ã\81¯ã\80\81 $1ç\89\88ã\82\92è¶\85ã\81\88ã\82\8b編集履歴があります。
 削除すると、{{SITENAME}}のデータベース処理に大きな負荷がかかります。
 十分に注意してください。',
 
@@ -2454,49 +2510,49 @@ $UNWATCHURL
 'cantrollback' => '編集を差し戻せません。
 最後の投稿者が、このページの唯一の作者です。',
 'alreadyrolled' => 'ページ[[:$1]]の[[User:$2|$2]]([[User talk:$2|トーク]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])による編集を巻き戻せません。
-他の利用者が、すでに編集あるいは巻き戻したためです。
+他の利用者が既に編集または巻き戻しを行ったためです。
 
 このページの最後の編集は[[User:$3|$3]]([[User talk:$3|トーク]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])によるものです。',
 'editcomment' => "編集内容の要約:「''$1''」",
 'revertpage' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による編集を[[User:$1|$1]]による直前の版へ差し戻しました',
 'revertpage-nouser' => '(利用者名削除)による編集を[[User:$1|$1]]による最新版へ差し戻しました',
 'rollback-success' => '$1による編集を差し戻しました。
-$2による最後の版へ変更されました。',
+$2による直前の版へ変更されました。',
 
 # Edit tokens
 'sessionfailure-title' => 'セッションの失敗',
 'sessionfailure' => 'ログインのセッションに問題が発生しました。
\82»ã\83\83ã\82·ã\83§ã\83³ä¹\97ã\81£å\8f\96ã\82\8aã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\81«æ\93\8dä½\9cã\81¯å\8f\96ã\82\8aæ¶\88ã\81\95ã\82\8cました。
\82»ã\83\83ã\82·ã\83§ã\83³ä¹\97ã\81£å\8f\96ã\82\8aã\82\92é\98²ã\81\90ã\81\9fã\82\81ã\80\81æ\93\8dä½\9cã\82\92å\8f\96ã\82\8aæ¶\88ã\81\97ました。
 前のページへ戻って再度読み込んだ後に、もう一度試してください。',
 
 # Protect
 'protectlogpage' => '保護記録',
 'protectlogtext' => '以下はページ保護に対する変更の記録です。
 現在、保護レベルを変更できるページについては[[Special:ProtectedPages|保護ページ一覧]]を参照してください。',
-'protectedarticle' => '「[[$1]]」を保護しました',
-'modifiedarticleprotection' => '「[[$1]]」の保護レベルを変更しました',
-'unprotectedarticle' => '「[[$1]]」の保護を解除しました',
-'movedarticleprotection' => '保護の設定を「[[$2]]」から「[[$1]]」へ移動しました',
+'protectedarticle' => ' が「[[$1]]」を保護しました',
+'modifiedarticleprotection' => ' が「[[$1]]」の保護レベルを変更しました',
+'unprotectedarticle' => ' が「[[$1]]」の保護を解除しました',
+'movedarticleprotection' => ' が保護の設定を「[[$2]]」から「[[$1]]」へ移動しました',
 'protect-title' => '「$1」の保護レベルを変更',
 'protect-title-notallowed' => '「$1」の保護レベルを表示',
 'prot_1movedto2' => '[[$1]] を [[$2]] へ移動',
 'protect-badnamespace-title' => '保護不可能な名前空間',
-'protect-badnamespace-text' => 'ã\81\93ã\81®å\90\8då\89\8d空é\96\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
+'protect-badnamespace-text' => 'この名前空間のページは保護できません。',
 'protect-legend' => '保護の確認',
 'protectcomment' => '理由:',
 'protectexpiry' => '有効期限:',
-'protect_expiry_invalid' => '有効期間が不正です。',
+'protect_expiry_invalid' => '有効期間が正しくありません。',
 'protect_expiry_old' => '有効期限が過去の時刻です。',
 'protect-unchain-permissions' => '追加保護オプションをロック解除',
 'protect-text' => "ページ「'''$1'''」に対する保護レベルの表示と操作ができます。",
-'protect-locked-blocked' => "ブロックは、保護レベルを変更できません。
-ページ'''$1'''の現在の状態は以下の通りです:",
+'protect-locked-blocked' => "ブロックされている間は、保護レベルを変更できません。
+ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-locked-dblock' => "データベースのロックが有効なため、保護レベルを変更できません。
-ページ'''$1'''の現在の状態は以下の通りです:",
+ページ「'''$1'''」の現在の状態は以下の通りです:",
 'protect-locked-access' => "アカウントに、ページの保護レベルを変更する権限がありません。
-ページ'''$1'''の現在の状態は以下の通りです:",
-'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ}}から読み込まれているため、保護されています。
-このページの保護制限を変更することは可能ですが、カスケード保護には影響しません。',
+ページ「'''$1'''」の現在の状態は以下の通りです:",
+'protect-cascadeon' => 'このページは現在、カスケード保護が有効になっている以下の{{PLURAL:$1|ページ|ページ群}}から読み込まれているため、保護されています。
+このページの保護レベルを変更できますが、カスケード保護には影響しません。',
 'protect-default' => 'すべての利用者を許可',
 'protect-fallback' => '「$1」権限が必要',
 'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
@@ -2517,7 +2573,7 @@ $2による最後の版へ変更されました。',
 ** 度重なるスパム投稿
 ** 非生産的な編集合戦
 ** 高負荷ページ',
-'protect-edit-reasonlist' => '保護理由を編集する',
+'protect-edit-reasonlist' => '保護理由を編集',
 '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',
 'restriction-type' => '許可:',
 'restriction-level' => '制限レベル:',
@@ -2539,14 +2595,14 @@ $2による最後の版へ変更されました。',
 # Undelete
 'undelete' => '削除されたページを表示',
 'undeletepage' => '削除されたページの表示と復元',
-'undeletepagetitle' => "'''以下は、[[:$1]]の削除された版です'''。",
+'undeletepagetitle' => "'''以下は、[[:$1|$1]]の削除された版です'''。",
 'viewdeletedpage' => '削除されたページを表示',
-'undeletepagetext' => '以下の{{PLURAL:$1|ã\83\9aã\83¼ã\82¸}}ã\81¯å\89\8aé\99¤ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\81\8cã\80\81ä¿\9då­\98ç\89\88ã\81«æ®\8bã\81£ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81復å\85\83ã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'undeletepagetext' => '以下の{{PLURAL:$1|å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸|&#32;$1 ä»¶ã\81®å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fã\83\9aã\83¼ã\82¸}}ã\81¯ã\80\81ä¿\9då­\98ç\89\88ã\81«æ®\8bã\81£ã\81¦ã\81\84ã\82\8bã\81\9fã\82\81復å\85\83ã\81§ã\81\8dã\81¾ã\81\99ã\80\82
 保存版は定期的に消去される可能性があります。',
 'undelete-fieldset-title' => '削除された版の復元',
-'undeleteextrahelp' => "ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\82\92復å\85\83ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\81©ã\82\8cã\82\82é\81¸æ\8a\9eã\81\97ていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
\89¹å®\9aã\81®ç\89\88ã\82\92復帰ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復帰ã\81\99ã\82\8bç\89\88ã\81®ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92é\81¸æ\8a\9eã\81\97た状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
-'undeleterevisions' => '$1版が保存されています',
+'undeleteextrahelp' => "ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\82\92復å\85\83ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\81©ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\82\82ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
\89¹å®\9aã\81®ç\89\88ã\82\92復帰ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復帰ã\81\99ã\82\8bç\89\88ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cた状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
+'undeleterevisions' => '保存版に$1{{PLURAL:$1|版}}あります',
 'undeletehistory' => 'ページの復帰を行うと、すべての版が履歴に復帰します。
 削除されたあとに同じ名前で新しくページが作成されていた場合、復帰した版はそれに先行する履歴として現れます。',
 'undeleterevdel' => '復帰した結果、版指定削除されているページまたはファイルの版が最新となる場合、復帰は実行されません。
@@ -2554,9 +2610,9 @@ $2による最後の版へ変更されました。',
 'undeletehistorynoadmin' => 'このページは削除されています。
 削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。
 管理者以外の利用者には、削除された各版の本文への制限がかけられています。',
-'undelete-revision' => '$3によるページ$1の$4$5の削除版:',
-'undeleterevision-missing' => '不正な、あるいは存在しない版です。
-間違ったリンクを辿ったか、この版は既に復帰されたか、もしくは保存版から除去された可能性があります。',
+'undelete-revision' => 'ページ「$1」の、$3 が $4 $5 に削除した版:',
+'undeleterevision-missing' => '正しくないまたは存在しない版です。
+間違ったリンクをたどったか、この版は既に復帰されたか、もしくは保存版から除去された可能性があります。',
 'undelete-nodiff' => 'これより前の版はありません。',
 'undeletebtn' => '復元',
 'undeletelink' => '閲覧/復元',
@@ -2564,11 +2620,11 @@ $2による最後の版へ変更されました。',
 'undeletereset' => 'リセット',
 'undeleteinvert' => '選択を反転',
 'undeletecomment' => '理由:',
-'undeletedrevisions' => '$1版を復元しました',
-'undeletedrevisions-files' => '$1版と$2ファイルを復元しました',
-'undeletedfiles' => '$1ファイルを復帰しました',
+'undeletedrevisions' => '{{PLURAL:$1|$1版}}を復元しました',
+'undeletedrevisions-files' => '{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました',
+'undeletedfiles' => '{{PLURAL:$1|$1ファイル}}を復帰しました',
 'cannotundelete' => '復帰に失敗しました。
-誰かが、既にこのページを復帰した可能性があります。',
+他の誰かがこのページを既に復帰した可能性があります。',
 'undeletedpage' => "'''$1を復元しました。'''
 
 最近の削除と復帰の記録については[[Special:Log/delete|削除記録]]を参照してください。",
@@ -2578,10 +2634,10 @@ $2による最後の版へ変更されました。',
 'undelete-search-prefix' => '表示を開始するページ名:',
 'undelete-search-submit' => '検索',
 'undelete-no-results' => '削除の保存版に、一致するページが見つかりませんでした。',
-'undelete-filename-mismatch' => '時刻印$1をもつファイルの版を復帰できません:ファイル名が一致しません',
-'undelete-bad-store-key' => '時刻印$1をもつファイルの版を復帰できません:削除前にファイルが失われています。',
+'undelete-filename-mismatch' => 'ファイルの時刻印$1の版を復帰できません:ファイル名が一致しません。',
+'undelete-bad-store-key' => 'ファイルの時刻印$1の版を復帰できません:削除前にファイルが失われています。',
 'undelete-cleanup-error' => '未使用の保存版のファイル「$1」の削除中にエラーが発生しました。',
-'undelete-missing-filearchive' => 'データベースに存在しないため、ID$1を持つファイルの保存版を復元できません。
+'undelete-missing-filearchive' => 'データベースに存在しないため、ID $1を持つファイルの保存版を復元できません。
 既に復帰されている可能性があります。',
 'undelete-error' => 'ページの復帰エラー',
 'undelete-error-short' => 'ファイルの復帰エラー:$1',
@@ -2594,9 +2650,9 @@ $1',
 # Namespace form on various pages
 'namespace' => '名前空間:',
 'invert' => '選択したものを除く',
-'tooltip-invert' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ï¼\88ã\81\8aã\82\88ã\81³ã\80\81ã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\80\81é\96¢é\80£ã\81¥ã\81\91ã\82\89ã\82\8cã\81\9få\90\8då\89\8d空é\96\93ï¼\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¤\89æ\9b´ã\82\92é\9d\9e表示ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\81ã\82§ã\83\83ã\82¯ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\82ªã\83³ã\81«ã\81\97ã\81¾ã\81\99ã\80\82',
+'tooltip-invert' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ï¼\88ã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9få\90\8då\89\8d空é\96\93ã\82\82ï¼\89ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¤\89æ\9b´ã\82\92é\9d\9e表示ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cã\82\8b',
 'namespace_association' => '対応付けられた名前空間',
-'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bã\80\81è­°è«\96ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯å¯¾è±¡ã\81®å\90\8då\89\8d空é\96\93ã\82\82å\90«ã\82\81ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\82\92ã\83\81ã\82§ã\83\83ã\82¯',
+'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯å¯¾è±¡ã\81®å\90\8då\89\8d空é\96\93ã\82\82å\90«ã\82\81ã\82\8bã\81«ã\81¯ã\80\81ã\81\93ã\81®ã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cã\82\8b',
 'blanknamespace' => '(標準)',
 
 # Contributions
@@ -2609,7 +2665,7 @@ $1',
 'month' => 'これ以前の月:',
 'year' => 'これ以前の年:',
 
-'sp-contributions-newbies' => '新規利用者の投稿のみ表示',
+'sp-contributions-newbies' => '新しい利用者からの投稿のみ表示',
 'sp-contributions-newbies-sub' => '新規利用者のみ',
 'sp-contributions-newbies-title' => '新規利用者の投稿記録',
 'sp-contributions-blocklog' => 'ブロック記録',
@@ -2653,7 +2709,7 @@ $1',
 'blockip' => '利用者をブロック',
 'blockip-title' => '利用者のブロック',
 'blockip-legend' => '利用者をブロック',
-'blockiptext' => '以ä¸\8bã\81®ã\83\95ã\82©ã\83¼ã\83 ã\82\92使ç\94¨ã\81\97ã\81¦ã\80\81æ\8c\87å®\9aã\81\97ã\81\9få\88©ç\94¨è\80\85ã\82\84IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8bã\82\89ã\81®æ\9b¸ã\81\8dè¾¼ã\81¿ã\82¢ã\82¯ã\82»ã\82¹ã\82\92ã\83\96ã\83­ã\83\83ã\82¯ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82
+'blockiptext' => '以下のフォームを使用して、指定した利用者やIPアドレスからの書き込みアクセスをブロックできます。
 このような措置は、荒らしからの防御のためにのみ行われるべきで、また[[{{MediaWiki:Policy-url}}|方針]]に沿ったものであるべきです。
 以下にブロックの理由を具体的に書いてください(例えば、荒らされたページへの言及など)。',
 'ipadressorusername' => 'IPアドレスまたは利用者名:',
@@ -2668,8 +2724,8 @@ $1',
 ** 威圧的な態度/嫌がらせ
 ** 複数アカウントの不正利用
 ** 不適切な利用者名',
-'ipb-hardblock' => 'ログインしている利用者によるこのIPアドレスからの編集を不許可',
-'ipbcreateaccount' => 'アカウント作成を禁止する',
+'ipb-hardblock' => 'ログイン利用者によるこのIPアドレスからの編集を不許可',
+'ipbcreateaccount' => 'アカウント作成を禁止',
 'ipbemailban' => 'メール送信を防止',
 'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスと、後に編集しようとしたIPアドレスを自動的にブロック',
 'ipbsubmit' => 'この利用者をブロック',
@@ -2679,38 +2735,38 @@ $1',
 'ipbotherreason' => '他の、または追加の理由:',
 'ipbhidename' => '利用者名を編集履歴や各種一覧から秘匿する',
 'ipbwatchuser' => 'この利用者の利用者ページとトークページをウォッチする',
-'ipb-disableusertalk' => 'この利用者がブロック中に自身のトークページを編集することを不許可',
+'ipb-disableusertalk' => 'この利用者がブロックされている間に自分のトークページを編集するのを不許可',
 'ipb-change-block' => 'これらの設定で、利用者を再びブロック',
 'ipb-confirm' => 'ブロックの確認',
-'badipaddress' => '不正なIPアドレス',
+'badipaddress' => '無効なIPアドレス',
 'blockipsuccesssub' => 'ブロックしました',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]をブロックしました。<br />
-[[Special:BlockList|投稿ブロック中の利用者やIPアドレス]]を参照してください。',
-'ipb-blockingself' => '自分自身をブロックしようとしています。本当に実行しますか。',
-'ipb-confirmhideuser' => '利用者名の秘匿を有効にしてブロックしようとしています。実行すると、すべてのリストやログにおいて利用者名が非表示になります。本当にこれでよろしいですか。',
-'ipb-edit-dropdown' => 'ブロック理由を編集する',
+[[Special:BlockList|ブロックの一覧]]を参照してください。',
+'ipb-blockingself' => '自分自身をブロックしようとしています! 本当に実行しますか?',
+'ipb-confirmhideuser' => '秘匿が有効になっている利用者をブロックしようとしています。実行すると、すべてのリストやログでこの利用者名が表示されません。本当に実行しますか?',
+'ipb-edit-dropdown' => 'ブロック理由を編集',
 'ipb-unblock-addr' => '$1のブロックを解除',
-'ipb-unblock' => '利用者またはIPアドレスのブロックを解除する',
+'ipb-unblock' => '利用者またはIPアドレスのブロックを解除',
 'ipb-blocklist' => '現在有効なブロックを表示',
 'ipb-blocklist-contribs' => '$1の投稿の一覧',
-'unblockip' => 'ブロックを解除する',
+'unblockip' => 'ブロックを解除',
 'unblockiptext' => '以下のフォームで利用者またはIPアドレスの投稿ブロックを解除できます。',
 'ipusubmit' => 'この投稿ブロックを解除',
 'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
 'unblocked-range' => '$1のブロックは解除されています',
 'unblocked-id' => 'ブロック$1は除去されました',
-'blocklist' => 'ブロック中の利用者',
-'ipblocklist' => 'ブロック中の利用者',
-'ipblocklist-legend' => 'ブロック中の利用者を検索',
+'blocklist' => 'ブロックされている利用者',
+'ipblocklist' => 'ブロックされている利用者',
+'ipblocklist-legend' => 'ブロックされている利用者を検索',
 'blocklist-userblocks' => 'アカウントのブロックを非表示',
 'blocklist-tempblocks' => '有期ブロックを非表示',
 'blocklist-addressblocks' => '単一IPのブロックを非表示',
-'blocklist-rangeblocks' => 'レンジブロックを非表示',
-'blocklist-timestamp' => 'タイムスタンプ',
+'blocklist-rangeblocks' => '範囲ブロックを非表示',
+'blocklist-timestamp' => '時刻印',
 'blocklist-target' => '対象',
 'blocklist-expiry' => '期限',
 'blocklist-by' => 'ブロックした管理者',
-'blocklist-params' => 'ブロックのパラメータ',
+'blocklist-params' => 'ブロックのパラメータ',
 'blocklist-reason' => '理由',
 'ipblocklist-submit' => '検索',
 'ipblocklist-localblock' => 'ローカルでのブロック',
@@ -2721,23 +2777,23 @@ $1',
 'noautoblockblock' => '自動ブロック無効',
 'createaccountblock' => 'アカウント作成のブロック',
 'emailblock' => 'メール送信のブロック',
-'blocklist-nousertalk' => '自身のトークページ編集禁止',
+'blocklist-nousertalk' => '自分のトークページの編集禁止',
 'ipblocklist-empty' => 'ブロック一覧は空です。',
 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。',
 'blocklink' => 'ブロック',
-'unblocklink' => 'ブロック解除',
+'unblocklink' => 'ブロック解除',
 'change-blocklink' => '設定を変更',
 'contribslink' => '投稿記録',
-'emaillink' => '電子メールを送る',
-'autoblocker' => '使用中のIPアドレスが「[[User:$1|$1]]」に使用されたため、自動ブロックされています。
-$1のブロックの理由は「$2」です。',
+'emaillink' => 'メールを送信',
+'autoblocker' => "ご使用中のIPアドレスが「[[User:$1|$1]]」に使用されたため、自動ブロックされています。
+$1のブロックの理由は「''$2''」です。",
 'blocklogpage' => 'ブロック記録',
 'blocklog-showlog' => 'この利用者は以前にブロックされたことがあります。
 参考のため、ブロックの記録を以下に示します:',
 'blocklog-showsuppresslog' => 'この利用者は以前にブロックされ、隠されたことがあります。
 参考のため、秘匿記録を以下に示します:',
-'blocklogentry' => '[[$1]] を$2ブロックしました。ブロックの詳細$3',
-'reblock-logentry' => '[[$1]]ブロック設定を$2に変更しました。ブロックの詳細$3',
+'blocklogentry' => ' が [[$1]] を$2ブロックしました。ブロックの詳細:$3',
+'reblock-logentry' => ' が [[$1]] のブロック設定を$2に変更しました。ブロックの詳細:$3',
 'blocklogtext' => 'このページは利用者のブロックと解除の記録です。
 自動的にブロックされたIPアドレスは表示されていません。
 現時点で有効なブロックは[[Special:BlockList|ブロックの一覧]]をご覧ください。',
@@ -2746,91 +2802,90 @@ $1のブロックの理由は「$2」です。',
 'block-log-flags-nocreate' => 'アカウント作成のブロック',
 'block-log-flags-noautoblock' => '自動ブロック無効',
 'block-log-flags-noemail' => 'メール送信のブロック',
-'block-log-flags-nousertalk' => '自のトークページの編集禁止',
+'block-log-flags-nousertalk' => '自のトークページの編集禁止',
 'block-log-flags-angry-autoblock' => '拡張自動ブロック有効',
 'block-log-flags-hiddenname' => '利用者名の秘匿',
 'range_block_disabled' => '範囲ブロックを作成する管理者機能は無効化されています。',
-'ipb_expiry_invalid' => '有効期限が不正です。',
+'ipb_expiry_invalid' => '有効期限が無効です。',
 'ipb_expiry_temp' => '利用者名秘匿のブロックは、無期限ブロックになります。',
 'ipb_hide_invalid' => 'このアカウントを秘匿できません。編集回数が非常に多いためだと思われます。',
 'ipb_already_blocked' => '「$1」は既にブロックされています',
-'ipb-needreblock' => '$1は、すでにブロックされています。
-設定を変更しますか?',
+'ipb-needreblock' => '$1 は既にブロックされています。設定を変更しますか?',
 'ipb-otherblocks-header' => 'その他の{{PLURAL:$1|ブロック}}',
 'unblock-hideuser' => '利用者名が隠されているため、この利用者のブロックを解除できません。',
-'ipb_cant_unblock' => 'エラー:ブロックID$1が見つかりません。
-ブロックが既に解除されている可能性があります。',
-'ipb_blocked_as_range' => 'エラー:IPアドレス$1は直接ブロックされておらず、ブロックを解除できませんでした。
-ただし、$2の範囲でブロックされており、こちらの設定を変更することでブロック解除できます。',
-'ip_range_invalid' => '不正なIP範囲です。',
+'ipb_cant_unblock' => 'エラー:ブロック ID $1 はありません。ブロックが既に解除されている可能性があります。',
+'ipb_blocked_as_range' => 'エラー:IPアドレス$1は直接ブロックされておらず、ブロック解除できませんでした。
+ただし、$2の範囲でブロックされており、こちらのブロックは別途解除できます。',
+'ip_range_invalid' => 'IP範囲が無効です。',
 'ip_range_toolarge' => '/$1よりサイズの広い範囲ブロックは許可されていません。',
 'blockme' => '自分をブロック',
 'proxyblocker' => 'プロキシブロック係',
 'proxyblocker-disabled' => 'この機能は無効になっています。',
-'proxyblockreason' => '使用中のIPアドレスは公開プロキシであるため投稿ブロックされています。
-使ç\94¨ä¸­ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\8dã\83\83ã\83\88ã\82µã\83¼ã\83\93ã\82¹ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\83¼ã\80\81ã\82\82ã\81\97ã\81\8fã\81¯æ\89\80å±\9eçµ\84ç¹\94ã\81®æ\8a\80è¡\93æ\8b\85å½\93è\80\85ã\81«é\80£çµ¡ã\82\92å\8f\96ã\82\8aã\80\81ã\81\93ã\82\8cã\81\8cæ·±å\88»ã\81ªã\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£ã\83¼問題であることを伝えてください。',
+'proxyblockreason' => '使用中のIPアドレスは公開プロキシであるため投稿ブロックされています。
+使ç\94¨ä¸­ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\8dã\83\83ã\83\88ã\82µã\83¼ã\83\93ã\82¹ã\83\97ã\83­ã\83\90ã\82¤ã\83\80ã\83¼ã\80\81ã\81¾ã\81\9fã\81¯æ\89\80å±\9eçµ\84ç¹\94ã\81®æ\8a\80è¡\93æ\8b\85å½\93è\80\85ã\81«é\80£çµ¡ã\81\97ã\81¦ã\80\81ã\81\93ã\82\8cã\81\8cæ·±å\88»ã\81ªã\82»ã\82­ã\83¥ã\83ªã\83\86ã\82£問題であることを伝えてください。',
 'proxyblocksuccess' => '完了。',
-'sorbsreason' => '使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
-'sorbs_create_account_reason' => '使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
-アカウントは作成できません',
-'cant-block-while-blocked' => 'ブロックは、他の利用者をブロックできません。',
+'sorbsreason' => '使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
+'sorbs_create_account_reason' => '使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
+アカウント作成はできません',
+'cant-block-while-blocked' => 'ブロックされている間は、他の利用者をブロックできません。',
 'cant-see-hidden-user' => '投稿ブロックしようとした利用者は、既にブロックされ隠されています。
 hideuser権限を持っていないため、この利用者のブロックを閲覧または編集できません。',
-'ipbblocked' => '自身がブロックされているため、他の利用者のブロックやブロック解除をすることはできません',
-'ipbnounblockself' => 'è\87ªå\88\86è\87ªèº«ã\81«å¯¾ã\81\99ã\82\8bã\83\96ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯できません',
+'ipbblocked' => '自分自身をブロックしているため、他の利用者のブロックやブロック解除はできません',
+'ipbnounblockself' => 'è\87ªå\88\86è\87ªèº«ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\81¯è§£é\99¤できません',
 
 # Developer tools
-'lockdb' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ロック',
+'lockdb' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ロック',
 'unlockdb' => 'データベースのロック解除',
 'lockdbtext' => 'データベースをロックするとすべての利用者はページの編集や、個人設定の変更、ウォッチリストの編集、その他データベースでの変更を要求する作業ができなくなります。
 本当にデータベースをロックしていいかどうか確認し、メンテナンスが終了したらロックを解除してください。',
 'unlockdbtext' => 'データベースのロックを解除すると、すべての利用者がページの編集や、個人設定の変更、ウォッチリストの編集、その他データベースでの変更を要求する作業ができるようになります。
 本当にデータベースのロックを解除していいかどうか確認してください。',
-'lockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81\99ã\82\8b。',
-'unlockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\99ã\82\8b。',
+'lockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81\97ã\81¾ã\81\99。',
+'unlockconfirm' => 'æ\9c¬å½\93ã\81«ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\97ã\81¾ã\81\99。',
 'lockbtn' => 'データベースをロック',
 'unlockbtn' => 'データベースのロックを解除',
-'locknoconfirm' => '確èª\8dã\83\9cã\83\83ã\82¯ã\82¹ã\81\8cã\83\81ã\82§ã\83\83ã\82¯ã\81\95ã\82\8cていません。',
+'locknoconfirm' => '確èª\8dã\83\9cã\83\83ã\82¯ã\82¹ã\81«ã\83\81ã\82§ã\83\83ã\82¯ã\81\8cå\85¥ã\81£ていません。',
 'lockdbsuccesssub' => 'データベースのロックに成功しました',
 'unlockdbsuccesssub' => 'データベースのロックを除去しました',
-'lockdbsuccesstext' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81¯ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cました。<br />
+'lockdbsuccesstext' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\82\92ã\83­ã\83\83ã\82¯ã\81\97ました。<br />
 メンテナンスが完了したら、忘れずに[[Special:UnlockDB|ロックを除去]]してください。',
-'unlockdbsuccesstext' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\81¯è§£é\99¤ã\81\95ã\82\8cました。',
-'lockfilenotwritable' => 'データベースのロックファイルは書き込み不可です。
-データベースをロックまたは解除するには、ウェブサーバーにより書き込み可能である必要があります。',
+'unlockdbsuccesstext' => 'ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\97ました。',
+'lockfilenotwritable' => 'データベースのロック ファイルが書き込み禁止です。
+データベースをロックまたはロック解除するには、ウェブ サーバーがこれに書き込める必要があります。',
 'databasenotlocked' => 'データベースはロックされていません。',
 'lockedbyandtime' => '($1 が $2 $3 から)',
 
 # Move page
 'move-page' => '「$1」の移動',
 'move-page-legend' => 'ページの移動',
-'movepagetext' => "下のフォームを利用すると、ページ名が変更され、その履歴も変更先へ移動します。
-古いページは変更先へのリダイレクトページとなります。
-変更前のページへのリダイレクトは自動的に修正することができます。
-自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。リンクを正しく維持するのはあなたの責任です。
+'movepagetext' => "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。
+移動元のページは移動先への転送ページになります。
+移動元のページへのリダイレクトを自動的に修正できます。
+[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
+リンクを正しく維持するのは移動した人の責任です。
 
-移動先がすでに存在する場合には、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
+移動先が既に存在する場合は、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''注意!'''
\82\88ã\81\8fé\96²è¦§ã\81\95ã\82\8cã\82\8bã\83\9aã\83¼ã\82¸ã\82\84ã\80\81ä»\96ã\81®å¤\9aã\81\8fã\81®ã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\99ã\82\8bã\81¨äº\88æ\9c\9fã\81\9bã\81¬結果が起こるかもしれません。ページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
-'movepagetext-noredirectfixer' => "下のフォームを利用すると、ページ名が変更され、ページの履歴も変更先へ移動します。
-古いページは変更先への転送ページとなります。
\82\88ã\81\8fé\96²è¦§ã\81\95ã\82\8cã\82\8bã\83\9aã\83¼ã\82¸ã\82\84ã\80\81ä»\96ã\81®å¤\9aã\81\8fã\81®ã\83\9aã\83¼ã\82¸ã\81\8bã\82\89ã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\99ã\82\8bã\81¨äº\88æ\9c\9fã\81\97ã\81ªã\81\84結果が起こるかもしれません。ページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
+'movepagetext-noredirectfixer' => "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。
+移動元のページは移動先への転送ページになります。
 自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重リダイレクト]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
 つながるべき場所にリンクがつながるよう維持するのは移動した人の責任です。
 
-移動先がすでに存在する場合には、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。
+移動先が既に存在する場合は、そのページが空またはリダイレクトで、かつ過去の版を持たない場合を除いて移動'''できません'''。
 つまり、間違えてページ名を変更した場合には元に戻せます。また移動によって既存のページを上書きしてしまうことはありません。
 
 '''警告!'''
-å¤\9aã\81\8fé\96²è¦§ã\81\95ã\82\8cã\81\9fã\82\8aã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\99ã\82\8bã\81¨ã\80\81äº\88æ\9c\9fã\81\9bã\81¬å¤§ã\81\8dã\81ªå¤\89å\8c\96ã\81\8cèµ·ã\81\93ã\82\8bã\81\8bã\82\82ã\81\97ã\82\8cã\81¾ã\81\9bã\82\93
+å¤\9aã\81\8fé\96²è¦§ã\81\95ã\82\8cã\82\8bã\83\9aã\83¼ã\82¸ã\82\84å¤\9aã\81\8fã\83ªã\83³ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\99ã\82\8bã\81¨ã\80\81äº\88æ\9c\9fã\81\97ã\81ªã\81\84大ã\81\8dã\81ªå¤\89å\8c\96ã\81\8cèµ·ã\81\93ã\82\8bã\81\8bã\82\82ã\81\97ã\82\8cã\81ªã\81\84ã\81\93ã\81¨ã\81«ã\81\94注æ\84\8fã\81\8fã\81 ã\81\95ã\81\84
 ページの移動に伴う影響をよく考えてから移動してください。",
-'movepagetalktext' => '関連付けられたトークページは、自動的に一緒に移動されます。ただしこれは、以下の場合を除きます。
-* ç©ºã\81§ã\81ªã\81\84ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cæ\96°ã\81\97ã\81\84å\90\8då\89\8dã\81§存在する場合
+'movepagetalktext' => "関連付けられたトークページも一緒に、自動的に移動されます。ただし、'''以下の場合を除きます:'''
+* ç§»å\8b\95å\85\88ã\81«ã\80\81空ã\81§ã\81¯ã\81ªã\81\84ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8c存在する場合
 * 下のボックスのチェックを消した場合
 
-これらの場合、必要に応じて、トークページを移動または統合する必要があります。',
+これらの場合、必要に応じて、トークページを移動または統合する必要があります。",
 'movearticle' => '移動するページ:',
-'moveuserpage-warning' => "'''è­¦å\91\8aï¼\9a'''å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82移å\8b\95ã\82\92è¡\8cã\81£ã\81\9få ´å\90\88ã\80\81ã\83\9aã\83¼ã\82¸ã\81 ã\81\91が移動され、利用者名は''変更されない''点に注意してください。",
+'moveuserpage-warning' => "'''è­¦å\91\8aï¼\9a'''å\88©ç\94¨è\80\85ã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\97ã\82\88ã\81\86ã\81¨ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82移å\8b\95ã\81\97ã\81\9få ´å\90\88ã\80\81ã\83\9aã\83¼ã\82¸ã\81®ã\81¿が移動され、利用者名は''変更されない''点に注意してください。",
 'movenologin' => 'ログインしていません',
 'movenologintext' => 'ページを移動するためには、登録利用者でありかつ、[[Special:UserLogin|ログイン]]している必要があります。',
 'movenotallowed' => 'ページを移動する権限がありません。',
@@ -2846,61 +2901,61 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'movepage-moved-noredirect' => 'リダイレクトは作成されませんでした。',
 'articleexists' => '指定された移動先には既にページが存在するか、名前が不適切です。
 別の名前を選択してください。',
-'cantmove-titleprotected' => '新しいページ名が作成保護されているため、この場所にページを移動できません',
-'talkexists' => "'''ã\83\9aã\83¼ã\82¸è\87ªèº«ã\81¯ç\84¡äº\8bã\81«ç§»å\8b\95ã\81\95ã\82\8cましたが、トークページは移動先のページが存在したため移動できませんでした。
+'cantmove-titleprotected' => '新しいページ名が作成保護されているため、この場所にページを移動できません',
+'talkexists' => "'''ã\83\9aã\83¼ã\82¸è\87ªèº«ã\81¯ç§»å\8b\95ã\81§ã\81\8dましたが、トークページは移動先のページが存在したため移動できませんでした。
 手動で統合してください。'''",
 'movedto' => '移動先:',
 'movetalk' => '付随するトークページも移動',
-'move-subpages' => '下位ページも移動する($1ページまで)',
-'move-talk-subpages' => 'トークページの下位ページも移動する($1個まで)',
-'movepage-page-exists' => 'ページ$1は既に存在するため、自動的に上書きされませんでした。',
-'movepage-page-moved' => 'ページ$1は$2へ移動されました。',
-'movepage-page-unmoved' => 'ページ$1は$2へ移動できませんでした。',
-'movepage-max-pages' => '自動的に移動できる{{PLURAL:$1|ページ}}は $1件までで、それ以上は移動されません。',
+'move-subpages' => '下位ページも移動($1ページまで)',
+'move-talk-subpages' => 'トークページの下位ページも移動($1個まで)',
+'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
+'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
+'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
+'movepage-max-pages' => '自動的に移動できるのは $1 {{PLURAL:$1|ページ}}までで、それ以上は移動されません。',
 'movelogpage' => '移動記録',
-'movelogpagetext' => '以下はてのページ移動の一覧です。',
+'movelogpagetext' => '以下はすべてのページ移動の一覧です。',
 'movesubpage' => '{{PLURAL:$1|下位ページ}}',
-'movesubpagetext' => 'このページには、以下に示す$1下位ページがあります。',
+'movesubpagetext' => 'このページには{{PLURAL:$1|下位ページ}}が以下の $1 件あります。',
 'movenosubpage' => 'このページに下位ページはありません。',
 'movereason' => '理由:',
 'revertmove' => '差し戻し',
-'delete_and_move' => '削除して移動する',
+'delete_and_move' => '削除して移動',
 'delete_and_move_text' => '== 削除が必要です ==
 移動先「[[:$1]]」は既に存在しています。
-移å\8b\95ã\81\99ã\82\8bためにこのページを削除しますか?',
-'delete_and_move_confirm' => 'ページを削除します',
+移å\8b\95ã\81®ためにこのページを削除しますか?',
+'delete_and_move_confirm' => 'ã\81¯ã\81\84ã\80\81ã\83\9aã\83¼ã\82¸ã\82\92å\89\8aé\99¤ã\81\97ã\81¾ã\81\99',
 'delete_and_move_reason' => '「[[$1]]」からの移動のために削除',
 'selfmove' => '移動元と移動先のページ名が同じです。
\87ªå\88\86è\87ªèº«ã\81¸は移動できません。',
-'immobile-source-namespace' => '$1名前空間のページを移動させることはできません。',
-'immobile-target-namespace' => 'ã\80\8c$1ã\80\8då\90\8då\89\8d空é\96\93ã\81¸ã\81¯ã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81\95ã\81\9bã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
-'immobile-target-namespace-iw' => 'ウィキ間リンクは、ページの移動では不正な対象です。',
\87ªå\88\86è\87ªèº«ã\81«は移動できません。',
+'immobile-source-namespace' => '「$1」名前空間のページは移動できません',
+'immobile-target-namespace' => 'ã\80\8c$1ã\80\8då\90\8då\89\8d空é\96\93ã\81«ã\81¯ã\83\9aã\83¼ã\82¸ã\82\92移å\8b\95ã\81§ã\81\8dã\81¾ã\81\9bã\82\93',
+'immobile-target-namespace-iw' => 'ウィキ間リンクは、ページの移動先には指定できません。',
 'immobile-source-page' => 'このページは移動できません。',
-'immobile-target-page' => '目的のページ名へは移動させることができません。',
-'imagenocrossnamespace' => 'ファイル名前空間以外に、ファイルを移動することはできません。',
-'nonfile-cannot-move-to-file' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81§ã\81ªã\81\84ã\82\82ã\81®ã\82\92ã\80\81ã\83\95ã\82¡ã\82¤ã\83«å\90\8då\89\8d空é\96\93ã\81«ç§»å\8b\95ã\81\99ることはできません',
-'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません',
-'imageinvalidfilename' => '対象ファイル名が不正です',
-'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正する',
+'immobile-target-page' => '対象ページ名に移動させることはできません。',
+'imagenocrossnamespace' => 'ファイルを、ファイル名前空間以外に移動させることはできません',
+'nonfile-cannot-move-to-file' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81§ã\81¯ã\81ªã\81\84ã\82\82ã\81®ã\82\92ã\80\81ã\83\95ã\82¡ã\82¤ã\83«å\90\8då\89\8d空é\96\93ã\81«ç§»å\8b\95ã\81\95ã\81\9bることはできません',
+'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません',
+'imageinvalidfilename' => '対象ファイル名が無効です',
+'fix-double-redirects' => 'このページへのリダイレクトがあればそのリダイレクトを修正',
 'move-leave-redirect' => '移動元にリダイレクトを作成する',
-'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限をつ利用者のみが移動できます。
-参考として以下に一番最後の記録を表示します:",
-'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81\97ã\81\8b移å\8b\95ã\81§ã\81\8dã\81¾ã\81\9bã\82\93
-参考として以下に一番最後の記録を表示します:",
+'protectedpagemovewarning' => "'''警告:'''このページは保護されているため、管理者権限をつ利用者のみが移動できます。
+参考として以下に最後の記録を表示します:",
+'semiprotectedpagemovewarning' => "'''注æ\84\8fï¼\9a'''ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\81\9fã\82\81ã\80\81ç\99»é\8c²å\88©ç\94¨è\80\85ã\81®ã\81¿ã\81\8c移å\8b\95ã\81§ã\81\8dã\81¾ã\81\99
+参考として以下に最後の記録を表示します:",
 'move-over-sharedrepo' => '== ファイルが存在します ==
-[[:$1]]は共有リポジトリ上に存在します。ファイルをこの名前に移動すると共有ファイルを上書きします。',
-'file-exists-sharedrepo' => '選ばれたファイル名は既に共有リポジトリー上で使われています。
+[[:$1]]は共有リポジトリ上に存在します。ファイルをこの名前に移動すると共有ファイルを上書きします。',
+'file-exists-sharedrepo' => '選ばれたファイル名は既に共有リポジトリ上で使用されています。
 別の名前を選んでください。',
 
 # Export
 'export' => 'ページの書き出し',
-'exporttext' => 'ã\81\93ã\81\93ã\81§ã\81¯å\8d\98ç\8b¬ã\81\82ã\82\8bã\81\84ã\81¯è¤\87æ\95°ã\81®ã\83\9aã\83¼ã\82¸ã\81®æ\9c¬æ\96\87ã\81¨ç·¨é\9b\86履歴ã\82\92ã\80\81XMLã\81®å½¢ã\81§æ\9b¸ã\81\8då\87ºã\81\99ã\81\93ã\81¨ができます。
-このXMLは、他のMediaWikiを使用しているウィキで[[Special:Import|取り込みページ]]を使って取り込むことができます。
+'exporttext' => 'ã\81\93ã\81\93ã\81§ã\81¯å\8d\98ç\8b¬ã\81\82ã\82\8bã\81\84ã\81¯è¤\87æ\95°ã\81®ã\83\9aã\83¼ã\82¸ã\81®æ\9c¬æ\96\87ã\81¨ç·¨é\9b\86履歴ã\82\92ã\80\81XMLã\81®å½¢ã\81§æ\9b¸ã\81\8då\87ºã\81\97ができます。
+このXMLは、他のMediaWikiを使用しているウィキで[[Special:Import|取り込みページ]]を使用して取り込みができます。
 
 ページを書き出すには、下の入力ボックスに一行に一つずつ書き出したいページの名前を記入してください。また、編集履歴とともにすべての過去版を含めて書き出すのか、最新版のみを書き出すのか選択してください。
 
 後者の場合ではリンクの形で使うこともできます。例えば、[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]はページ「[[{{MediaWiki:Mainpage}}]]」が対象になります。',
-'exportall' => 'すべてのページをエクスポート',
+'exportall' => 'すべてのページを書き出し',
 'exportcuronly' => '完全な履歴は含めず、最新版のみを含める',
 'exportnohistory' => "----
 '''注意:'''負荷上の理由により、このフォームによるページの完全な履歴の書き出しは無効化されています。",
@@ -2911,7 +2966,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
@@ -2919,9 +2974,9 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'allmessagesname' => '名前',
 'allmessagesdefault' => '既定のメッセージ文',
 'allmessagescurrent' => '現在のメッセージ文',
-'allmessagestext' => 'これはMediaWiki名前空間で利用可能なシステムメッセージの一覧です。
-一般的なMediaWikiの地域化に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation MediaWikiの地域化]や[//translatewiki.net?setlang=ja translatewiki.net]を訪れてみてください。',
-'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''ã\81\8cç\84¡å\8a¹ã\81ªã\81®ã\81§ã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92使ã\81\86ã\81\93ã\81¨ã\81¯できません。",
+'allmessagestext' => 'これは MediaWiki 名前空間で利用できるシステム メッセージの一覧です。
+MediaWiki 全般のローカライズ(地域化)に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ] や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。',
+'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''ã\81\8cç\84¡å\8a¹ã\81®ã\81\9fã\82\81ã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92使ç\94¨できません。",
 'allmessages-filter-legend' => '絞り込み',
 'allmessages-filter' => '変更状態により絞り込む:',
 'allmessages-filter-unmodified' => '変更なし',
@@ -2937,7 +2992,9 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'thumbnail_error' => 'サムネイルの作成中にエラーが発生しました:$1',
 'djvu_page_error' => 'DjVuページが範囲外です',
 'djvu_no_xml' => 'DjVuファイルのXMLデータを取得できません',
-'thumbnail_invalid_params' => 'サムネイル引数が不正です',
+'thumbnail-temp-create' => '一時的なサムネイルファイルを作成できません',
+'thumbnail-dest-create' => 'サムネイルを保存先に保存できません',
+'thumbnail_invalid_params' => 'サムネイル引数が無効です',
 'thumbnail_dest_directory' => '出力ディレクトリを作成できません',
 'thumbnail_image-type' => '対応していない画像形式です',
 'thumbnail_gd-library' => 'GDライブラリの構成が不完全です:関数$1が不足',
@@ -2947,32 +3004,32 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'import' => 'ページデータの取り込み',
 'importinterwiki' => 'ウィキ間移動の取り込み',
 'import-interwiki-text' => '取り込むウィキとページ名を選択してください。
-版の日付と編集者ã\81®å\90\8då\89\8dã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82
-全てのウィキ間移動取り込みの操作は[[Special:Log/import|取り込み記録]]に記録されます。',
+版の日付と編集者å\90\8dã\81¯ä¿\9dæ\8c\81ã\81\95ã\82\8cã\81¾ã\81\99ã\80\82
+ウィキ間移動のすべての取り込み操作は[[Special:Log/import|取り込み記録]]に記録されます。',
 'import-interwiki-source' => '取り込み元のウィキ/ページ:',
 'import-interwiki-history' => 'このページのすべての版を複製する',
 'import-interwiki-templates' => 'すべてのテンプレートを含める',
 'import-interwiki-submit' => '取り込み',
 'import-interwiki-namespace' => '目的の名前空間:',
-'import-upload-filename' => 'ファイルã\81®å\90\8då\89\8dï¼\9a',
+'import-upload-filename' => 'ファイルå\90\8dï¼\9a',
 'import-comment' => 'コメント:',
-'importtext' => '元のウィキで[[Special:Export|書き出し機能]]を使てファイルに書き出してください。
+'importtext' => '元のウィキで[[Special:Export|書き出し機能]]を使用してファイルに書き出してください。
 それをコンピューターに保存した後、こちらへアップロードしてください。',
-'importstart' => 'ã\83\9aã\83¼ã\82¸ã\82\92å\8f\96ã\82\8aè¾¼ã\82\93ã\81§ã\81\84ã\81¾ã\81\99ã\83»ã\83»ã\83»',
-'import-revision-count' => '$1',
+'importstart' => 'ã\83\9aã\83¼ã\82¸ã\82\92å\8f\96ã\82\8aè¾¼ã\81¿ä¸­...',
+'import-revision-count' => '$1{{PLURAL:$1|版}}',
 'importnopages' => '取り込むページがありません。',
-'imported-log-entries' => '$1件の{{PLURAL:$1|記録項目}}を取り込みました。',
+'imported-log-entries' => '$1 件の{{PLURAL:$1|記録項目}}を取り込みました。',
 'importfailed' => '取り込みに失敗しました:<nowiki>$1</nowiki>',
 'importunknownsource' => '取り込み元のタイプが不明です',
 'importcantopen' => '取り込みファイルが開けませんでした',
 'importbadinterwiki' => 'ウィキ間リンクが正しくありません',
-'importnotext' => '空かもしくは本文がありません',
+'importnotext' => '内容が空、または本文がありません',
 'importsuccess' => '取り込みが完了しました!',
 'importhistoryconflict' => '取り込み時にいくつかの版が競合しました(以前に同じページが取り込まれているかもしれません)',
 'importnosources' => 'ウィキ間移動の取り込み元が定義されていないため、履歴の直接アップロードは無効になっています。',
-'importnofile' => 'ファイルがアップロードされませんでした',
+'importnofile' => '取り込みファイルはアップロードされませんでした。',
 'importuploaderrorsize' => '取り込みファイルのアップロードに失敗しました。
\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\80\81ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89å\8f¯è\83½ã\81ªサイズを超えています。',
\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\80\81ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81§ã\81\8dã\82\8bサイズを超えています。',
 'importuploaderrorpartial' => '取り込みファイルのアップロードに失敗しました。
 ファイルの一部のみアップロードされました。',
 'importuploaderrortemp' => '取り込みファイルのアップロードに失敗しました。
@@ -2987,18 +3044,28 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'import-invalid-interwiki' => '指定されたウィキから取り込めませんでした。',
 'import-error-edit' => 'あなたにそのページを編集する許可がないため、ページ「$1」は取り込まれませんでした。',
 'import-error-create' => 'あなたにそのページを作成する許可がないため、ページ「$1」は取り込まれませんでした。',
+'import-error-interwiki' => '名前が外部リンク (interwiki) に予約されているため、ページ「$1」を取り込みませんでした。',
+'import-error-special' => 'ページ「$1」は、ページが許可されない特別名前空間に属しているため取り込みません。',
+'import-error-invalid' => '名前が正しくないため、ページ「$1」を取り込みませんでした。',
 
 # Import log
 'importlogpage' => '取り込み記録',
 'importlogpagetext' => '管理された他のウィキから編集履歴を伴ったページ取り込みです。',
 'import-logentry-upload' => 'ファイルのアップロードにより[[$1]]を取り込みました',
-'import-logentry-upload-detail' => '$1',
+'import-logentry-upload-detail' => '$1{{PLURAL:$1|版}}',
 'import-logentry-interwiki' => '$1をウィキ間移動しました',
-'import-logentry-interwiki-detail' => '$2の$1',
+'import-logentry-interwiki-detail' => '$2の$1{{PLURAL:$1|版}}',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
 'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
+'javascripttest-title' => '$1 のテストの実行',
+'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' => '自分の利用者ページ',
@@ -3006,68 +3073,68 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'tooltip-pt-mytalk' => '自分のトークページ',
 'tooltip-pt-anontalk' => 'このIPアドレスからなされた編集についての議論',
 'tooltip-pt-preferences' => '個人設定',
-'tooltip-pt-watchlist' => '変更を監視しているページの一覧',
-'tooltip-pt-mycontris' => '自分の投稿一覧',
-'tooltip-pt-login' => 'ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cæ\8e¨å¥¨ã\81\95ã\82\8cます。ただし、必須ではありません。',
-'tooltip-pt-anonlogin' => 'ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cæ\8e¨å¥¨ã\81\95ã\82\8cます。ただし、必須ではありません。',
+'tooltip-pt-watchlist' => '変更をウォッチしているページの一覧',
+'tooltip-pt-mycontris' => '自分の投稿一覧',
+'tooltip-pt-login' => 'ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92æ\8e¨å¥¨ã\81\97ます。ただし、必須ではありません。',
+'tooltip-pt-anonlogin' => 'ã\83­ã\82°ã\82¤ã\83³ã\81\99ã\82\8bã\81\93ã\81¨ã\82\92æ\8e¨å¥¨ã\81\97ます。ただし、必須ではありません。',
 'tooltip-pt-logout' => 'ログアウト',
-'tooltip-ca-talk' => '記事についての議論',
-'tooltip-ca-edit' => 'このページを編集できます。保存する前にプレビューボタンを使ってください。',
+'tooltip-ca-talk' => '本文ページについての議論',
+'tooltip-ca-edit' => 'このページを編集できます。保存前にプレビューボタンを使用してください。',
 'tooltip-ca-addsection' => '新しい節を開始する',
 'tooltip-ca-viewsource' => 'このページは保護されています。
 ページのソースを閲覧できます。',
 'tooltip-ca-history' => 'このページの過去の版',
-'tooltip-ca-protect' => 'このページを保護',
-'tooltip-ca-unprotect' => 'このページの保護設定を変更',
-'tooltip-ca-delete' => 'このページを削除',
-'tooltip-ca-undelete' => '削除される前になされた編集を復元',
-'tooltip-ca-move' => 'このページを移動',
-'tooltip-ca-watch' => 'このページをウォッチリストに追加',
-'tooltip-ca-unwatch' => 'このページをウォッチリストから除去',
-'tooltip-search' => '{{SITENAME}}内を検索',
-'tooltip-search-go' => 'å\8e³å¯\86ã\81«ä¸\80è\87´ã\81\99ã\82\8bå\90\8då\89\8dã\81®ã\83\9aã\83¼ã\82¸ã\81\8cå­\98å\9c¨ã\81\99ã\82\8cã\81°ã\80\81ã\81\9dã\81®ã\83\9aã\83¼ã\82¸ã\81¸ç§»å\8b\95ã\81\97ã\81¾ã\81\99',
-'tooltip-search-fulltext' => '入力された文字列が含まれるページを検索します',
-'tooltip-p-logo' => 'メインページに移動',
-'tooltip-n-mainpage' => 'メインページに移動',
+'tooltip-ca-protect' => 'このページを保護する',
+'tooltip-ca-unprotect' => 'このページの保護設定を変更する',
+'tooltip-ca-delete' => 'このページを削除する',
+'tooltip-ca-undelete' => '削除される前になされた編集を復元する',
+'tooltip-ca-move' => 'このページを移動する',
+'tooltip-ca-watch' => 'このページをウォッチリストに追加する',
+'tooltip-ca-unwatch' => 'このページをウォッチリストから除去する',
+'tooltip-search' => '{{SITENAME}}内を検索する',
+'tooltip-search-go' => 'å\8e³å¯\86ã\81«ä¸\80è\87´ã\81\99ã\82\8bå\90\8då\89\8dã\81®ã\83\9aã\83¼ã\82¸ã\81\8cå­\98å\9c¨ã\81\99ã\82\8cã\81°ã\80\81ã\81\9dã\81®ã\83\9aã\83¼ã\82¸ã\81¸ç§»å\8b\95ã\81\99ã\82\8b',
+'tooltip-search-fulltext' => 'この文字列が含まれるページを探す',
+'tooltip-p-logo' => 'メインページに移動する',
+'tooltip-n-mainpage' => 'メインページに移動する',
 'tooltip-n-mainpage-description' => 'メインページに移動する',
 'tooltip-n-portal' => 'このプロジェクトについて、できること、情報を入手する場所',
-'tooltip-n-currentevents' => 'æ\9c\80è¿\91ã\81®å\87ºæ\9d¥äº\8bã\81«ã\81¤ã\81\84ã\81¦äº\88å\82\99ç\9f¥è­\98ã\82\92å¾\97る',
+'tooltip-n-currentevents' => 'æ\9c\80è¿\91ã\81®å\87ºæ\9d¥äº\8bã\81®è\83\8cæ\99¯ã\82\92ç\9f¥る',
 'tooltip-n-recentchanges' => 'このウィキにおける最近の更新の一覧',
-'tooltip-n-randompage' => '無作為に抽出されたページの読み込み',
+'tooltip-n-randompage' => '無作為に選択されたページを読み込む',
 'tooltip-n-help' => '情報を得る場所',
 'tooltip-t-whatlinkshere' => 'ここにリンクしている全ウィキページの一覧',
 'tooltip-t-recentchangeslinked' => 'このページからリンクしているページの最近の更新',
 'tooltip-feed-rss' => 'このページのRSSフィード',
 'tooltip-feed-atom' => 'このページのAtomフィード',
-'tooltip-t-contributions' => 'この利用者の投稿の一覧を表示',
-'tooltip-t-emailuser' => 'この利用者に電子メールを送信',
+'tooltip-t-contributions' => 'この利用者の投稿の一覧',
+'tooltip-t-emailuser' => 'この利用者にメールを送信',
 'tooltip-t-upload' => 'ファイルをアップロード',
 'tooltip-t-specialpages' => '特別ページの一覧',
 'tooltip-t-print' => 'このページの印刷用ページ',
 'tooltip-t-permalink' => 'このページのこの版への固定リンク',
-'tooltip-ca-nstab-main' => '本文を表示',
+'tooltip-ca-nstab-main' => '本文を閲覧',
 'tooltip-ca-nstab-user' => '利用者ページを表示',
 'tooltip-ca-nstab-media' => 'メディアページを表示',
-'tooltip-ca-nstab-special' => 'ã\81\93ã\82\8cã\81¯ç\89¹å\88¥ã\83\9aã\83¼ã\82¸ã\81§ã\81\99ã\80\82ç·¨é\9b\86ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
+'tooltip-ca-nstab-special' => 'これは特別ページです。編集はできません。',
 'tooltip-ca-nstab-project' => 'プロジェクトページを表示',
 'tooltip-ca-nstab-image' => 'ファイルページを表示',
 'tooltip-ca-nstab-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-save' => '変更を保存',
+'tooltip-ca-nstab-category' => 'カテゴリページを閲覧',
+'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' => '文章に加えた変更を表示します',
-'tooltip-compareselectedversions' => 'é\81¸æ\8a\9eã\81\95ã\82\8cã\81\9fäº\8cã\81¤ã\81®ç\89\88ã\81®å·®å\88\86ã\82\92表示ã\81\97ã\81¾ã\81\99ã\80\82',
-'tooltip-watch' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81¸è¿½å\8a ã\81\97ã\81¾ã\81\99',
-'tooltip-watchlistedit-normal-submit' => 'ã\82¿ã\82¤ã\83\88ã\83«ã\82\92å\89\8aé\99¤',
-'tooltip-watchlistedit-raw-submit' => 'ウォッチリストを更新',
+'tooltip-diff' => '文章中で変更した箇所を表示する',
+'tooltip-compareselectedversions' => 'é\81¸æ\8a\9eã\81\97ã\81\9f\81¤ã\81®ç\89\88ã\81®å·®å\88\86ã\82\92表示ã\81\99ã\82\8b',
+'tooltip-watch' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ã\81\99ã\82\8b',
+'tooltip-watchlistedit-normal-submit' => 'ã\83\9aã\83¼ã\82¸ã\82\92é\99¤å\8e»ã\81\99ã\82\8b',
+'tooltip-watchlistedit-raw-submit' => 'ウォッチリストを更新する',
 'tooltip-recreate' => '削除されていても、ページを再作成する',
-'tooltip-upload' => 'アップロードを開始',
+'tooltip-upload' => 'アップロードを開始する',
 'tooltip-rollback' => '「巻き戻し」は、このページの最後の編集者によるこのページへの編集を1クリックで差し戻します',
-'tooltip-undo' => '「取り消し」はこの編集を差し戻し、編集画面をプレビューをつけて開きます。要約欄に取り消しの理由を追加することができます。',
-'tooltip-preferences-save' => '設定を保存',
+'tooltip-undo' => '「取り消し」はこの編集を差し戻し、編集画面をプレビューを付けて開きます。要約欄に取り消しの理由を追加できます。',
+'tooltip-preferences-save' => '設定を保存する',
 'tooltip-summary' => '短い要約を入力してください',
 
 # Stylesheets
@@ -3106,16 +3173,16 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'group-bureaucrat.js' => '/* ここにあるすべてのJavaScriptは、ビューロクラットのみに対して読み込まれます */',
 
 # Metadata
-'notacceptable' => 'ウィキサーバーは、使用中のクライアントが読める形式での情報を、提供できません。',
+'notacceptable' => 'ウィキサーバーは、ご使用中のクライアントが読める形式では情報を提供できません。',
 
 # Attribution
 'anonymous' => '{{SITENAME}}の匿名{{PLURAL:$1|利用者}}',
-'siteuser' => '{{SITENAME}}の利用者$1',
-'anonuser' => '{{SITENAME}}の匿名利用者$1',
+'siteuser' => '{{SITENAME}}の利用者 $1',
+'anonuser' => '{{SITENAME}}の匿名利用者 $1',
 'lastmodifiedatby' => 'このページの最終更新は $1 $2 に $3 によって行われました。',
-'othercontribs' => 'また、最終更新前に $1 が編集しました。',
+'othercontribs' => 'また、最終更新より前に $1 が編集しました。',
 'others' => 'その他',
-'siteusers' => '{{SITENAME}}の{{PLURAL:$2|利用者}}$1',
+'siteusers' => '{{SITENAME}}の{{PLURAL:$2|利用者}} $1',
 'anonusers' => '{{SITENAME}}の匿名{{PLURAL:$2|利用者}} $1',
 'creditspage' => 'ページの帰属表示',
 'nocredits' => 'このページに対する帰属情報がありません。',
@@ -3124,10 +3191,11 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'spamprotectiontitle' => 'スパム防御フィルター',
 'spamprotectiontext' => '保存しようとした文章はスパムフィルターによってブロックされました。
 これはおそらく、ブラックリストにある外部サイトへのリンクが原因で発生します。',
-'spamprotectionmatch' => '以ä¸\8bã\81¯ã\80\81ã\82¹ã\83\91ã\83 ã\83\95ã\82£ã\83«ã\82¿ã\83¼ã\81\8cç\99ºå\8b\95ã\81\97ã\81\9fæ\96\87ç« です:$1',
+'spamprotectionmatch' => '以ä¸\8bã\81®æ\96\87ç« ã\81¯ã\82¹ã\83\91ã\83 ã\83\95ã\82£ã\83«ã\82¿ã\83¼ã\81\8cç\99ºå\8b\95ã\81\97ã\81\9fã\82\82ã\81®です:$1',
 'spambot_username' => 'MediaWikiスパム除去',
 'spam_reverting' => '$1へのリンクを含まない最新の版に差し戻し',
 'spam_blanking' => 'すべての版が$1へのリンクを含んでいます。白紙化します。',
+'spam_deleting' => 'すべての版が$1へのリンクを含んでいます。削除します。',
 
 # Info page
 'pageinfo-title' => '「$1」の情報',
@@ -3139,8 +3207,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'pageinfo-watchers' => 'ウォッチリストに入れている利用者数',
 'pageinfo-edits' => '編集回数',
 'pageinfo-authors' => '投稿者数',
-'pageinfo-views' => '閲覧数',
-'pageinfo-viewsperedit' => '閲覧回数に対する編集回数',
+'pageinfo-views' => '閲覧数',
+'pageinfo-viewsperedit' => '1編集あたりの閲覧回数',
 
 # Skin names
 'skinname-standard' => 'クラシック',
@@ -3157,12 +3225,12 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'markaspatrolleddiff' => '巡回済みにする',
 'markaspatrolledtext' => 'このページを巡回済みにする',
 'markedaspatrolled' => '巡回済みにしました',
-'markedaspatrolledtext' => '選択された[[:$1|$1]]の版を巡回済みにしました。',
+'markedaspatrolledtext' => '[[:$1]]の、選択した版を巡回済みにしました。',
 'rcpatroldisabled' => '最近の更新の巡回は無効です',
 'rcpatroldisabledtext' => '最近の更新の巡回機能は現在無効になっています。',
-'markedaspatrollederror' => '巡回済みにできません',
-'markedaspatrollederrortext' => 'å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\81¯ã\81©ã\81®ç\89\88ã\81\8bを指定する必要があります。',
-'markedaspatrollederror-noautopatrol' => '自分自身による編集を巡回済みにする権限がありません。',
+'markedaspatrollederror' => '巡回済みにできません',
+'markedaspatrollederrortext' => 'å·¡å\9b\9eæ¸\88ã\81¿ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81ç\89\88を指定する必要があります。',
+'markedaspatrollederror-noautopatrol' => '自分編集を巡回済みにする権限がありません。',
 
 # Patrol log
 'patrol-log-page' => '巡回記録',
@@ -3175,9 +3243,9 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'filedeleteerror-long' => 'ファイルの削除中にエラーが発生しました:
 
 $1',
-'filedelete-missing' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¯å­\98å\9c¨ã\81\97ã\81ªã\81\84ã\81\9fã\82\81ã\80\81å\89\8aé\99¤ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82',
-'filedelete-old-unregistered' => '指定されたファイルの版「$1」はデータベースにありません。',
-'filedelete-current-unregistered' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¯ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\86\85ã\81«ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82',
+'filedelete-missing' => 'ファイル「$1」は存在しないため、削除できません。',
+'filedelete-old-unregistered' => '指定されたファイルの版「$1」はデータベースにありません。',
+'filedelete-current-unregistered' => '指定されたファイル「$1」はデータベース内にありません。',
 'filedelete-archive-read-only' => '保存版ディレクトリ「$1」は、ウェブサーバーから書き込み不可になっています。',
 
 # Browsing diffs
@@ -3190,28 +3258,28 @@ $1',
 'imagemaxsize' => "画像のサイズ制限:<br />''(ファイルページに対する)''",
 'thumbsize' => 'サムネイルの大きさ:',
 'widthheight' => '$1 × $2',
-'widthheightpage' => '$1×$2、$3ページ',
+'widthheightpage' => '$1 × $2、$3 {{PLURAL:$3|ページ}}',
 'file-info' => 'ファイルサイズ:$1、MIMEタイプ:$2',
-'file-info-size' => '$1×$2ピクセル、ファイルサイズ:$3、MIMEタイプ:$4',
-'file-info-size-pages' => '$1 × $2 ピクセル、ファイルサイズ: $3、MIMEタイプ: $4、$5ページ{{PLURAL:$5}}。',
+'file-info-size' => '$1 × $2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4',
+'file-info-size-pages' => '$1 × $2 ピクセル、ファイルサイズ:$3、MIMEタイプ:$4、$5 {{PLURAL:$5|ページ}}',
 'file-nohires' => '高解像度版はありません。',
-'svg-long-desc' => 'SVGファイル、$1×$2ピクセル、ファイルサイズ:$3',
+'svg-long-desc' => 'SVG ファイル、$1 × $2 ピクセル、ファイルサイズ:$3',
 'show-big-image' => '高解像度での画像',
-'show-big-image-preview' => 'このプレビューのサイズ$1。',
-'show-big-image-other' => 'その他の{{PLURAL:$2|解像度}}$1。',
+'show-big-image-preview' => 'このプレビューのサイズ$1。',
+'show-big-image-other' => 'その他の{{PLURAL:$2|解像度}}$1。',
 'show-big-image-size' => '$1 × $2 ピクセル',
 'file-info-gif-looped' => 'ループします',
-'file-info-gif-frames' => '$1フレーム',
+'file-info-gif-frames' => '$1 {{PLURAL:$1|フレーム}}',
 'file-info-png-looped' => '繰り返し',
-'file-info-png-repeat' => '$1回再生しました',
-'file-info-png-frames' => '$1フレーム',
+'file-info-png-repeat' => '$1 {{PLURAL:$1|回再生しました}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|フレーム}}',
 
 # Special:NewFiles
 'newimages' => '新しいファイルのギャラリー',
-'imagelisttext' => "以下は、$2で並び替えられた'''$1'''ファイルの一覧です。",
-'newimages-summary' => 'この特別ページでは最近、アップロードされたファイルを表示します。',
+'imagelisttext' => "以下は、'''$1'''{{PLURAL:$1|ファイル}}の$2で並べ替えた一覧です。",
+'newimages-summary' => 'この特別ページでは、最近アップロードされたファイルを表示します。',
 'newimages-legend' => '絞り込み',
-'newimages-label' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dï¼\88ã\82\82ã\81\97ã\81\8fはその一部):',
+'newimages-label' => 'ã\83\95ã\82¡ã\82¤ã\83«å\90\8dï¼\88ã\81¾ã\81\9fはその一部):',
 'showhidebots' => '(ボットを$1)',
 'noimages' => '表示できるものがありません。',
 'ilsubmit' => '検索',
@@ -3220,10 +3288,10 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1、 $2 × $3',
-'seconds' => '{{PLURAL:$1|$1秒}}',
-'minutes' => '{{PLURAL:$1|$1分}}',
-'hours' => '{{PLURAL:$1|$1時間}}',
-'days' => '{{PLURAL:$1|$1日}}',
+'seconds' => '{{PLURAL:$1|$1 秒}}',
+'minutes' => '{{PLURAL:$1|$1 分}}',
+'hours' => '{{PLURAL:$1|$1 時間}}',
+'days' => '{{PLURAL:$1|$1 日}}',
 'ago' => '$1前',
 
 # Bad image list
@@ -3231,7 +3299,7 @@ $1',
 
 箇条書き項目(*で始まる行)のみが考慮されます。
 各行最初のリンクは、好ましくないファイルへのリンクとしてください。
\90\8cã\81\98è¡\8cã\81§ã\81\9dã\82\8c以é\99\8dã\81«ã\81\82ã\82\8bã\83ªã\83³ã\82¯ã\81¯ä¾\8bå¤\96ã\80\81ã\81¤ã\81¾ã\82\8aã\82¤ã\83³ã\83©ã\82¤ã\83³æ\8c¿å\85¥ã\81\95ã\82\8cã\81¦ã\82\82ã\82\88ã\81\84ã\83\9aã\83¼ã\82¸ã\81¨ã\81¿なされます。',
\90\8cã\81\98è¡\8cã\81§ã\81\9dã\82\8c以é\99\8dã\81«ã\81\82ã\82\8bã\83ªã\83³ã\82¯ã\81¯ä¾\8bå¤\96ã\80\81ã\81¤ã\81¾ã\82\8aã\82¤ã\83³ã\83©ã\82¤ã\83³æ\8c¿å\85¥ã\81\95ã\82\8cã\81¦ã\82\82ã\81\84ã\81\84ã\83\9aã\83¼ã\82¸ã\81¨è¦\8bなされます。',
 
 /*
 Short names for language variants used for language conversion links.
@@ -3239,20 +3307,20 @@ To disable showing a particular link, set it to 'disable', e.g.
 'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
-'variantname-zh-hans' => '簡体',
-'variantname-zh-hant' => '繁体',
+'variantname-zh-hans' => '中国語(簡体)',
+'variantname-zh-hant' => '中国語(繁体)',
 'variantname-zh-cn' => '中国簡体',
 'variantname-zh-tw' => '台湾正体',
 'variantname-zh-hk' => '香港正体',
-'variantname-zh-mo' => 'マカオ',
+'variantname-zh-mo' => 'マカオ繁体',
 'variantname-zh-sg' => 'シンガポール簡体',
-'variantname-zh-my' => 'マレーシア',
-'variantname-zh' => '中',
+'variantname-zh-my' => 'マレーシア簡体',
+'variantname-zh' => '中国語',
 
 # Variants for Gan language
-'variantname-gan-hans' => 'hans',
-'variantname-gan-hant' => 'hant',
-'variantname-gan' => 'ã\82¬ã\82¬ã\82¦ã\82º語',
+'variantname-gan-hans' => 'カン語(簡体)',
+'variantname-gan-hant' => 'カン語(繁体)',
+'variantname-gan' => 'ã\82«ã\83³語',
 
 # Variants for Serbian language
 'variantname-sr-ec' => 'セルビア語 (キリル文字)',
@@ -3285,11 +3353,11 @@ Variants for Chinese language
 
 # Metadata
 'metadata' => 'メタデータ',
-'metadata-help' => 'このファイルには、追加情報があります(おそらく、作成やデジタル化する際に使われたデジタルカメラやスキャナーによって追加されたものです)。
+'metadata-help' => 'このファイルには、追加情報があります(おそらく、作成やデジタル化する際に使用したデジタルカメラやスキャナーが追加したものです)。
 このファイルが元の状態から変更されている場合、いくつかの項目は、修正されたファイルを完全に反映していないかもしれません。',
 'metadata-expand' => '拡張項目を表示',
 'metadata-collapse' => '拡張項目を非表示',
-'metadata-fields' => 'ã\81\93ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81«ã\81\82ã\82\8bEXIFã\83¡ã\82¿ã\83\87ã\83¼ã\82¿ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81¯ã\80\81ã\83¡ã\82¿ã\83\87ã\83¼ã\82¿è¡¨ã\81\8cæ\8a\98ã\82\8aã\81\9fã\81\9fã\81¾ã\82\8cã\81¦ã\81\84ã\82\8b状態のときに画像ページに読み込まれます。
+'metadata-fields' => 'ã\81\93ã\81®ã\83¡ã\83\83ã\82»ã\83¼ã\82¸ã\81§å\88\97æ\8c\99ã\81\97ã\81¦ã\81\84ã\82\8bç\94»å\83\8fã\83¡ã\82¿ã\83\87ã\83¼ã\82¿ã\83\95ã\82£ã\83¼ã\83«ã\83\89ã\81¯ã\80\81ã\83¡ã\82¿ã\83\87ã\83¼ã\82¿è¡¨ã\82\92æ\8a\98ã\82\8aç\95³ã\82\93ã\81 状態のときに画像ページに読み込まれます。
 他のものは既定では非表示です。
 * make
 * model
@@ -3316,10 +3384,10 @@ Variants for Chinese language
 'exif-planarconfiguration' => '画像データの並び',
 'exif-ycbcrsubsampling' => 'YCCの画素構成 (Cの間引き率)',
 'exif-ycbcrpositioning' => 'YCCの画素構成 (YとCの位置)',
-'exif-xresolution' => '画像の幅の解像度',
-'exif-yresolution' => '画像の高さの解像度',
+'exif-xresolution' => '水平方向の解像度',
+'exif-yresolution' => '垂直方向の解像度',
 'exif-stripoffsets' => '画像データのロケーション',
-'exif-rowsperstrip' => '1ストリップごとの行数',
+'exif-rowsperstrip' => '1ストリップごとの行数',
 'exif-stripbytecounts' => 'ストリップの総バイト数',
 'exif-jpeginterchangeformat' => 'JPEGのSOIへのオフセット',
 'exif-jpeginterchangeformatlength' => 'JPEGデータのバイト数',
@@ -3329,10 +3397,10 @@ Variants for Chinese language
 'exif-referenceblackwhite' => '参照黒色点値と参照白色点値',
 'exif-datetime' => 'ファイル変更日時',
 'exif-imagedescription' => '画像の説明',
-'exif-make' => '画像入力機器のメーカ名',
-'exif-model' => '画像入力機器のモデル名',
+'exif-make' => '撮影機器のメーカー名',
+'exif-model' => '撮影機器のモデル名',
 'exif-software' => '使用ソフトウェア名',
-'exif-artist' => '作者',
+'exif-artist' => '作者',
 'exif-copyright' => '撮影著作権者/編集著作権者',
 'exif-exifversion' => 'Exifバージョン',
 'exif-flashpixversion' => '対応フラッシュピックスバージョン',
@@ -3353,14 +3421,14 @@ Variants for Chinese language
 'exif-fnumber' => 'F値',
 'exif-exposureprogram' => '露出プログラム',
 'exif-spectralsensitivity' => 'スペクトル感度',
-'exif-isospeedratings' => 'ISOスピードレート',
+'exif-isospeedratings' => 'ISO 感度',
 'exif-shutterspeedvalue' => 'シャッタースピード',
 'exif-aperturevalue' => '絞り値',
 'exif-brightnessvalue' => '輝度値',
 'exif-exposurebiasvalue' => '露出補正値',
 'exif-maxaperturevalue' => 'レンズ最小F値',
 'exif-subjectdistance' => '被写体距離',
-'exif-meteringmode' => '測光方式',
+'exif-meteringmode' => '測光モード',
 'exif-lightsource' => '光源',
 'exif-flash' => 'フラッシュ',
 'exif-focallength' => 'レンズ焦点距離',
@@ -3378,7 +3446,7 @@ Variants for Chinese language
 'exif-exposuremode' => '露出モード',
 'exif-whitebalance' => 'ホワイトバランス',
 'exif-digitalzoomratio' => 'デジタルズーム倍率',
-'exif-focallengthin35mmfilm' => '35mm換算レンズ焦点距離',
+'exif-focallengthin35mmfilm' => '35mmフィルム換算焦点距離',
 'exif-scenecapturetype' => '撮影シーンタイプ',
 'exif-gaincontrol' => 'ゲイン制御',
 'exif-contrast' => '撮影コントラスト',
@@ -3394,24 +3462,24 @@ Variants for Chinese language
 'exif-gpslongitude' => '経度',
 'exif-gpsaltituderef' => '高度の基準',
 'exif-gpsaltitude' => '高度',
-'exif-gpstimestamp' => 'GPSæ\99\82é\96\93\8e\9få­\90æ\99\82è¨\88ã\81®æ\99\82é\96\93)',
+'exif-gpstimestamp' => 'GPSæ\97¥æ\99\82ï¼\88å\8e\9få­\90æ\99\82è¨\88ï¼\89',
 'exif-gpssatellites' => '測位に用いた衛星信号',
 'exif-gpsstatus' => 'GPS受信機の状態',
 'exif-gpsmeasuremode' => 'GPSの測位方法',
 'exif-gpsdop' => '測位の信頼性',
 'exif-gpsspeedref' => '速度の単位',
-'exif-gpsspeed' => '速度',
+'exif-gpsspeed' => 'GPS 受信機の速度',
 'exif-gpstrackref' => '進行方向の単位',
 'exif-gpstrack' => '進行方向',
 'exif-gpsimgdirectionref' => '撮影方向の基準',
-'exif-gpsimgdirection' => '撮影した画像の方向',
+'exif-gpsimgdirection' => '画像の方向',
 'exif-gpsmapdatum' => '測位に用いた地図データ',
-'exif-gpsdestlatituderef' => '目的地の北緯または南緯',
+'exif-gpsdestlatituderef' => '目的地の北緯/南緯',
 'exif-gpsdestlatitude' => '目的地の緯度',
-'exif-gpsdestlongituderef' => '目的地の東経または西経',
+'exif-gpsdestlongituderef' => '目的地の東経/西経',
 'exif-gpsdestlongitude' => '目的地の経度',
 'exif-gpsdestbearingref' => '目的地の方角の単位',
-'exif-gpsdestbearing' => '目的の方角',
+'exif-gpsdestbearing' => '目的の方角',
 'exif-gpsdestdistanceref' => '目的地までの距離の単位',
 'exif-gpsdestdistance' => '目的地までの距離',
 'exif-gpsprocessingmethod' => '測位方式の名称',
@@ -3420,18 +3488,18 @@ Variants for Chinese language
 'exif-gpsdifferential' => 'GPS補正測位',
 'exif-jpegfilecomment' => 'JPEGファイルのコメント',
 'exif-keywords' => 'キーワード',
-'exif-worldregioncreated' => 'この写真が撮られた大陸や地域',
-'exif-countrycreated' => 'この写真が撮られた国',
-'exif-countrycodecreated' => 'この写真が撮られた国の国名コード',
-'exif-provinceorstatecreated' => 'この写真が撮られた州や県',
-'exif-citycreated' => 'この写真が撮られた市町村',
-'exif-sublocationcreated' => 'この写真が撮られた町名や通りの名前',
-'exif-worldregiondest' => '写っている大陸地域',
+'exif-worldregioncreated' => '写真が撮影された大陸/地域',
+'exif-countrycreated' => '写真が撮影された国',
+'exif-countrycodecreated' => '写真が撮影された国のコード',
+'exif-provinceorstatecreated' => '写真が撮影された州/県',
+'exif-citycreated' => '写真が撮影された都市',
+'exif-sublocationcreated' => '写真が撮影された町や通りの名前',
+'exif-worldregiondest' => '写っている大陸/地域',
 'exif-countrydest' => '写っている国',
-'exif-countrycodedest' => '写っている国の国名コード',
-'exif-provinceorstatedest' => '写っている州県',
-'exif-citydest' => '写っている市町村',
-'exif-sublocationdest' => '写っている町や通りの名前',
+'exif-countrycodedest' => '写っている国のコード',
+'exif-provinceorstatedest' => '写っている州/県',
+'exif-citydest' => '写っている都市',
+'exif-sublocationdest' => '写っている町や通りの名前',
 'exif-objectname' => '短いタイトル',
 'exif-specialinstructions' => '取扱いに関する特記事項',
 'exif-headline' => '見出し',
@@ -3447,8 +3515,8 @@ Variants for Chinese language
 'exif-writer' => '記入者',
 'exif-languagecode' => '言語',
 'exif-iimversion' => 'IIMバージョン',
-'exif-iimcategory' => 'カテゴリ',
-'exif-iimsupplementalcategory' => '補足カテゴリ',
+'exif-iimcategory' => 'カテゴリ',
+'exif-iimsupplementalcategory' => '補足カテゴリ',
 'exif-datetimeexpires' => '使用期限',
 'exif-datetimereleased' => '初公開日',
 'exif-originaltransmissionref' => '原転送位置コード',
@@ -3465,18 +3533,18 @@ Variants for Chinese language
 'exif-copyrightowner' => '著作権者',
 'exif-usageterms' => '使用条件',
 'exif-webstatement' => 'オンライン上の著作権文',
-'exif-originaldocumentid' => '元文書の一意な識別子',
-'exif-licenseurl' => '著作権ライセンスの URL',
+'exif-originaldocumentid' => '元文書の一意なID',
+'exif-licenseurl' => '著作権ライセンスのURL',
 'exif-morepermissionsurl' => '代替ライセンス情報',
 'exif-attributionurl' => 'この作品を再利用する際に、次のURLにリンクしてください',
-'exif-preferredattributionname' => 'この作品を再利用する際に、次の帰属表示を使てください',
+'exif-preferredattributionname' => 'この作品を再利用する際に、次の帰属表示を使用してください',
 'exif-pngfilecomment' => 'PNGファイルのコメント',
 'exif-disclaimer' => '免責事項',
 'exif-contentwarning' => 'コンテンツに関する警告',
 'exif-giffilecomment' => 'GIFファイルのコメント',
 'exif-intellectualgenre' => '項目の種類',
 'exif-subjectnewscode' => '主題コード',
-'exif-scenecode' => 'IPTC シーンコード',
+'exif-scenecode' => 'IPTCシーンコード',
 'exif-event' => '映っている事象',
 'exif-organisationinimage' => '映っている組織',
 'exif-personinimage' => '映っている人物',
@@ -3499,10 +3567,10 @@ Variants for Chinese language
 'exif-orientation-2' => '左右反転',
 'exif-orientation-3' => '180°回転',
 'exif-orientation-4' => '上下反転',
-'exif-orientation-5' => '反時計回りに90°回転 上下反転',
-'exif-orientation-6' => '90° 回転 CCW',
-'exif-orientation-7' => '時計回りに90°回転 上下反転',
-'exif-orientation-8' => '90° 回転 CW',
+'exif-orientation-5' => '反時計回りに90°回転上下反転',
+'exif-orientation-6' => '反時計回りに90°回転',
+'exif-orientation-7' => '時計回りに90°回転上下反転',
+'exif-orientation-8' => '時計回りに90°回転',
 
 'exif-planarconfiguration-1' => '点順次フォーマット',
 'exif-planarconfiguration-2' => '面順次フォーマット',
@@ -3591,7 +3659,7 @@ Variants for Chinese language
 'exif-scenecapturetype-2' => '人物',
 'exif-scenecapturetype-3' => '夜景',
 
-'exif-gaincontrol-0' => 'し',
+'exif-gaincontrol-0' => 'し',
 'exif-gaincontrol-1' => '弱い増感',
 'exif-gaincontrol-2' => '強い増感',
 'exif-gaincontrol-3' => '弱い減感',
@@ -3624,16 +3692,16 @@ Variants for Chinese language
 
 # Pseudotags used for GPSAltitudeRef
 'exif-gpsaltitude-above-sealevel' => '海抜 $1 {{PLURAL:$1|メートル}}',
-'exif-gpsaltitude-below-sealevel' => 'æµ·æ\8a\9cã\83\9eã\82¤ã\83\8aã\82¹ $1 {{PLURAL:$1|メートル}}',
+'exif-gpsaltitude-below-sealevel' => 'æ°´é\9d¢ä¸\8b $1 {{PLURAL:$1|メートル}}',
 
 'exif-gpsstatus-a' => '測位中',
-'exif-gpsstatus-v' => '未測位(中断中)',
+'exif-gpsstatus-v' => '未測位(中断中)',
 
-'exif-gpsmeasuremode-2' => '2次元測位中',
-'exif-gpsmeasuremode-3' => '3次元測位中',
+'exif-gpsmeasuremode-2' => '2 次元測位中',
+'exif-gpsmeasuremode-3' => '3 次元測位中',
 
 # Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'キロメール/時',
+'exif-gpsspeed-k' => 'ã\82­ã\83­ã\83¡ã\83¼ã\83\88ã\83«/æ\99\82',
 'exif-gpsspeed-m' => 'マイル/時',
 'exif-gpsspeed-n' => 'ノット',
 
@@ -3648,7 +3716,7 @@ Variants for Chinese language
 'exif-gpsdop-fair' => '中程度 ($1)',
 'exif-gpsdop-poor' => '劣悪 ($1)',
 
-'exif-objectcycle-a' => '午前のみ',
+'exif-objectcycle-a' => '午前のみ',
 'exif-objectcycle-p' => '午後のみ',
 'exif-objectcycle-b' => '午後と午前の両方',
 
@@ -3670,11 +3738,11 @@ Variants for Chinese language
 
 'exif-rating-rejected' => '却下',
 
-'exif-isospeedratings-overflow' => '65535 より大きい',
+'exif-isospeedratings-overflow' => '65535より大きい',
 
 'exif-iimcategory-ace' => '芸術、文化、娯楽',
 'exif-iimcategory-clj' => '犯罪と法律',
-'exif-iimcategory-dis' => 'ç\81½å®³ã\83»事故',
+'exif-iimcategory-dis' => 'ç\81½å®³ã\80\81事故',
 'exif-iimcategory-fin' => '経済とビジネス',
 'exif-iimcategory-edu' => '教育',
 'exif-iimcategory-evn' => '環境',
@@ -3691,13 +3759,13 @@ Variants for Chinese language
 'exif-iimcategory-wea' => '天気',
 
 'exif-urgency-normal' => '通常 ($1)',
-'exif-urgency-low' => '低 ($1)',
-'exif-urgency-high' => '高 ($1)',
+'exif-urgency-low' => '低 ($1)',
+'exif-urgency-high' => '高 ($1)',
 'exif-urgency-other' => '利用者定義の優先度 ($1)',
 
 # External editor support
-'edit-externally' => '外部アプリケーションを使ってこのファイルを編集する',
-'edit-externally-help' => 'ï¼\88詳ã\81\97ã\81\84æ\83\85å ±は[//www.mediawiki.org/wiki/Manual:External_editors 設定手順]をご覧ください)',
+'edit-externally' => '外部アプリケーションを使用してこのファイルを編集',
+'edit-externally-help' => 'ï¼\88詳ã\81\97ã\81\8fは[//www.mediawiki.org/wiki/Manual:External_editors 設定手順]をご覧ください)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'すべて',
@@ -3712,14 +3780,14 @@ Variants for Chinese language
 以下のボタンを押すとメールアドレスに確認メールが送られます。
 メールには確認用コードを含むリンクが書かれています。
 そのリンクをブラウザーで読み込んで、メールアドレスの正当性を確認してください。',
-'confirmemail_pending' => '確認メールは既に送信されています
\81\93ã\81®ã\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9fã\81°ã\81\8bã\82\8aã\81§ã\81\82ã\82\8cã\81°ã\80\81ã\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\8fã\81¾ã\81§æ\95°å\88\86ã\81»ã\81©å¾\85ã\81\9fã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\89ã\81ªã\81\84ã\81\8bã\82\82ã\81\97ã\82\8cã\81¾ã\81\9bã\82\93。',
-'confirmemail_send' => '確認用コードを送信する',
+'confirmemail_pending' => '確認用コードをメールで既にお送りしました
\82¢ã\82«ã\82¦ã\83³ã\83\88ã\82\92ä½\9cæ\88\90ã\81\97ã\81\9fã\81°ã\81\8bã\82\8aã\81®å ´å\90\88ã\81¯ã\80\81ã\83¡ã\83¼ã\83«ã\81\8cå±\8aã\81\8fã\81¾ã\81§ã\81\97ã\81°ã\82\89ã\81\8fã\81\8aå¾\85ã\81¡ã\81\8fã\81 ã\81\95ã\81\84ã\80\82å±\8aã\81\8bã\81ªã\81\84å ´å\90\88ã\81¯æ\96°ã\81\97ã\81\84ã\82³ã\83¼ã\83\89ã\82\92å\86\8d度ç\94³è«\8bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。',
+'confirmemail_send' => '確認用コードをメールで送信',
 'confirmemail_sent' => '確認メールを送信しました。',
-'confirmemail_oncreate' => 'ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81®æ­£å½\93æ\80§ã\82\92確èª\8dã\81\99ã\82\8bã\81\9fã\82\81ã\81®ã\82³ã\83¼ã\83\89ã\82\92å\90«ã\82\93ã\81 ã\83¡ã\83¼ã\83«ã\82\92é\80\81ä¿¡しました。
-この確認を行わなくてもログインはできますが、確認するまでメール通知の機能は無効化されます。',
+'confirmemail_oncreate' => 'ã\81\82ã\81ªã\81\9fã\81®ã\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«ç¢ºèª\8dç\94¨ã\82³ã\83¼ã\83\89ã\82\92ã\83¡ã\83¼ã\83«ã\81§ã\81\8aé\80\81ã\82\8aしました。
+この確認をしなくてもログインはできますが、確認するまでウィキ内のメール関連の機能は無効化されます。',
 'confirmemail_sendfailed' => '{{SITENAME}}は確認メールを送信できませんでした。
\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81«ä¸\8dæ­£ã\81ªæ\96\87å­\97ã\81\8cå\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\81ªã\81\84ã\81\8bã\81©ã\81\86ã\81\8b確èª\8dã\81\97ã\81¦ください。
\83¡ã\83¼ã\83«ã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cç\84¡å\8a¹ã\81ªæ\96\87å­\97ã\82\92å\90«ã\82\93ã\81§ã\81\84ã\81ªã\81\84ã\81\8bã\81\94確èª\8dください。
 
 メールサーバーからの返答:$1',
 'confirmemail_invalid' => '確認用コードが正しくありません。
@@ -3744,34 +3812,34 @@ $3
 $5
 
 この確認用コードは、$4に期限切れになります。',
-'confirmemail_body_changed' => 'だれかが、IPアドレス$1から
-{{SITENAME}}でアカウント「$2」の電子メールアドレスをこのアドレスに変更しました。
+'confirmemail_body_changed' => '誰か(おそらくあなた)が IP アドレス $1 から、
+{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに変更しました。
 
-このアカウントが本当に自分のものであるならば
-{{SITENAME}}のメール機能を再び有効化にするために、以下のURLをブラウザーで開いてください:
+このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて
+{{SITENAME}} のメール機能を再び有効にしてください:
 
 $3
 
-もし自分のアカウントでない場合は、
-次のURLをブラウザーで開いて、電子メール確認を中止してください:
+もしあなたのアカウント *ではない* 場合は、
+ブラウザーで以下のリンクを開いて、メールアドレスの確認をキャンセルしてください:
 
 $5
 
-この確認用コードは$4に期限切れになります。',
-'confirmemail_body_set' => 'だれかが、IPアドレス$1から
-{{SITENAME}}でアカウント「$2」の電子メールアドレスをこのアドレスに設定しました。
+この確認コードは $4 に期限切れになります。',
+'confirmemail_body_set' => '誰か(おそらくあなた)が IP アドレス $1 から
+{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。
 
-このアカウントが本当に自分のものであるならば
-{{SITENAME}}のメール機能を再び有効化にするために、以下のURLをブラウザーで開いてください:
+このアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて
+{{SITENAME}} のメール機能を再び有効にしてください。
 
 $3
 
-もし自分のアカウントでない場合は、
-次のURLをブラウザーで開いて、電子メール確認を中止してください:
+もしあなたのアカウントではない場合は、
+次のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:
 
 $5
 
-この確認用コードは$4に期限切れになります。',
+この確認コードは $4 に期限切れになります。',
 'confirmemail_invalidated' => 'メールアドレスの確認が中止されました',
 'invalidateemail' => 'メールアドレスの認証中止',
 
@@ -3784,13 +3852,13 @@ $5
 'deletedwhileediting' => "'''警告:'''このページが、編集開始後に削除されました!",
 'confirmrecreate' => "[[User:$1|$1]]([[User talk:$1|トーク]])が、このページの編集開始後に、このページを、次の理由で削除しました。
 : ''$2''
-本当にこのままこのページを再作成していか確認してください。",
-'confirmrecreate-noreason' => 'ã\81\82ã\81ªã\81\9fã\81®ç·¨é\9b\86ã\82\92é\96\8bå§\8bã\81\97ã\81\9få¾\8cã\80\81ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92[[User:$1|$1]] ([[User talk:$1|ã\83\88ã\83¼ã\82¯]])ã\81\8cå\89\8aé\99¤ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82æ\9c¬å½\93ã\81«ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\82\92å\86\8dä½\9cæ\88\90ã\81\97ã\81¦ã\81\84ã\81\84ã\81®ã\81\8bã\81\94確èª\8dã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
+本当にこのままこのページを再作成していか確認してください。",
+'confirmrecreate-noreason' => 'あなたの編集を開始した後、このページを[[User:$1|$1]] ([[User talk:$1|トーク]])が削除しました。本当にこのページを再作成していいかご確認ください。',
 'recreate' => '再作成する',
 
 # action=purge
-'confirm_purge_button' => 'はい',
-'confirm-purge-top' => 'ã\83\9aã\83¼ã\82¸ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ç ´æ£\84ã\81\97ã\81¾ã\81\99ã\80\82ã\82\88ã\82\8dã\81\97ã\81\84ã\81§すか?',
+'confirm_purge_button' => 'OK',
+'confirm-purge-top' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92ç ´æ£\84ã\81\97ã\81¾すか?',
 'confirm-purge-bottom' => 'ページをパージすると、キャッシュが破棄され、強制的に最新の版が表示されます。',
 
 # action=watch/unwatch
@@ -3805,7 +3873,7 @@ $5
 'colon-separator' => ':',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '',
-'parentheses' => '($1)',
+'parentheses' => '($1)',
 
 # Multipage image navigation
 'imgmultipageprev' => '&larr;前ページ',
@@ -3836,44 +3904,49 @@ $5
 'size-kilobytes' => '$1キロバイト',
 'size-megabytes' => '$1メガバイト',
 'size-gigabytes' => '$1ギガバイト',
+'size-terabytes' => '$1 TB',
+'size-petabytes' => '$1 PB',
+'size-exabytes' => '$1 EB',
+'size-zetabytes' => '$1 ZB',
+'size-yottabytes' => '$1 YB',
 
 # Live preview
-'livepreview-loading' => '読み込み中・・・',
-'livepreview-ready' => '読み込み中・・・完了!',
+'livepreview-loading' => '読み込み中...',
+'livepreview-ready' => '読み込み中...完了!',
 'livepreview-failed' => 'ライブプレビューが失敗しました!
 通常のプレビューを試してください。',
 'livepreview-error' => '接続に失敗しました:$1「$2」。
 通常のプレビューを試してください。',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'この一覧には、$1より前の変更が表示されていない可能性があります。',
-'lag-warn-high' => 'データベースサーバー遅延のため、この一覧には、$1より前の変更が表示されていない可能性があります。',
+'lag-warn-normal' => 'この一覧には、$1 {{PLURAL:$1|秒}}より前の変更が表示されていない可能性があります。',
+'lag-warn-high' => 'データベースサーバー遅延のため、この一覧には、$1 {{PLURAL:$1|秒}}より前の変更が表示されていない可能性があります。',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'ウォッチリストには、$1件のページ名が含まれています(トークページは除く)。',
-'watchlistedit-noitems' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81¯ã\83\9aã\83¼ã\82¸å\90\8dã\81\8c\81¤ã\82\82å\90«ã\81¾れていません。',
+'watchlistedit-numitems' => 'ウォッチリストには {{PLURAL:$1|$1 件のページ}}が登録されています(トークページを除く)。',
+'watchlistedit-noitems' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ã\81¯ã\81©ã\81®ã\83\9aã\83¼ã\82¸ã\82\82ç\99»é\8c²ã\81\95れていません。',
 'watchlistedit-normal-title' => 'ウォッチリストの編集',
 'watchlistedit-normal-legend' => 'ウォッチリストからページ名を除去',
-'watchlistedit-normal-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\81\8c以ä¸\8bã\81«è¡¨ç¤ºã\81\95ã\82\8cています。
-ページ名を除去するには、横にあるボックスにチェックを入れ、「{{int:watchlistedit-normal-submit}}」をクリックしてください。
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\81\9dã\81®ã\81¾ã\81¾ã\81®ä¸\80覧ã\81§ç·¨é\9b\86]]ã\81\99ã\82\8bã\81\93ã\81¨ã\82\82できます。',
-'watchlistedit-normal-submit' => 'ã\83\9aã\83¼ã\82¸ã\81®除去',
-'watchlistedit-normal-done' => 'ウォッチリストから $1{{PLURAL:$1|件}}を削除しました:',
+'watchlistedit-normal-explain' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«å\85¥ã\81£ã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸å\90\8dã\82\92以ä¸\8bã\81«è¡¨ç¤ºã\81\97ています。
+ページを除去するには、隣のボックスにチェックを入れて「{{int:watchlistedit-normal-submit}}」をクリックしてください。
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾ç·¨é\9b\86]]ã\82\82使ç\94¨できます。',
+'watchlistedit-normal-submit' => 'ã\83\9aã\83¼ã\82¸ã\82\92除去',
+'watchlistedit-normal-done' => 'ウォッチリストから {{PLURAL:$1|$1 件のページ}}を削除しました:',
 'watchlistedit-raw-title' => 'ウォッチリストをそのまま編集',
 'watchlistedit-raw-legend' => 'ウォッチリストをそのまま編集',
-'watchlistedit-raw-explain' => 'ウォッチリストに含まれるページ名が以下に表示されており、この一覧から追加や除去できます。
+'watchlistedit-raw-explain' => '以下に、ウォッチリストに含まれるページ名を列挙しています。この一覧で追加や除去ができます。
 1行に1ページ名です。
 完了したら、「{{int:Watchlistedit-raw-submit}}」をクリックしてください。
-[[Special:EditWatchlist|標準の編集ページ]]も用できます。',
+[[Special:EditWatchlist|標準の編集ページ]]も使用できます。',
 'watchlistedit-raw-titles' => 'ページ名:',
 'watchlistedit-raw-submit' => 'ウォッチリストを更新',
 'watchlistedit-raw-done' => 'ウォッチリストを更新しました。',
-'watchlistedit-raw-added' => '$1のページ名が追加されました:',
-'watchlistedit-raw-removed' => '$1件のページ名が除去されました:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|$1 件のページ}}を追加しました:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 件のページ}}を除去しました:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'é\96¢é\80£ã\81\99ã\82\8bå¤\89æ\9b´ã\81®è¡¨ç¤º',
-'watchlisttools-edit' => 'ウォッチリストの表示と編集',
+'watchlisttools-view' => 'é\96¢é\80£ã\81\99ã\82\8bå¤\89æ\9b´ã\82\92é\96²è¦§',
+'watchlisttools-edit' => 'ウォッチリストの閲覧と編集',
 'watchlisttools-raw' => 'ウォッチリストをそのまま編集',
 
 # Iranian month names
@@ -3939,7 +4012,7 @@ $5
 
 # Core parser functions
 'unknown_extension_tag' => '不明な拡張機能タグ「$1」です',
-'duplicate-defaultsort' => "'''警告:'''既定の並ã\81³æ\9b¿ã\81\88ã\82­ã\83¼ã\80\8c$2ã\80\8dã\81\8cã\80\81ã\81\9dã\81®å\89\8dã\81«æ\9b¸ã\81\8bã\82\8cã\81¦ã\81\84ã\82\8bæ\97¢å®\9aã\81®ä¸¦ã\81³æ\9b¿ã\81\88ã\82­ã\83¼ã\80\8c$1ã\80\8dã\82\92ä¸\8aæ\9b¸ã\81\8dã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82",
+'duplicate-defaultsort' => "'''警告:'''既定のã\82½ã\83¼ã\83\88ã\82­ã\83¼ã\80\8c$2ã\80\8dã\81\8cã\80\81ã\81\9dã\81®å\89\8dã\81«æ\9b¸ã\81\8bã\82\8cã\81¦ã\81\84ã\82\8bæ\97¢å®\9aã\81®ã\82½ã\83¼ã\83\88ã\82­ã\83¼ã\80\8c$1ã\80\8dã\82\92ä¸\8aæ\9b¸ã\81\8dã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82",
 
 # Special:Version
 'version' => 'バージョン情報',
@@ -3948,7 +4021,7 @@ $5
 'version-parserhooks' => '構文解析フック',
 'version-variables' => '変数',
 'version-antispam' => 'スパム対策',
-'version-skins' => 'スキン',
+'version-skins' => '外装',
 'version-other' => 'その他',
 'version-mediahandlers' => 'メディアハンドラー',
 'version-hooks' => 'フック',
@@ -3961,14 +4034,19 @@ $5
 'version-license' => 'ライセンス',
 'version-poweredby-credits' => "このウィキは、'''[//www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)で動作しています。",
 'version-poweredby-others' => 'その他',
-'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約にもとづき、このライブラリの再配布や改変をすることができます。
+'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
 
-MediaWikiは、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、GNU一般公衆利用許諾書をご覧さい。
+MediaWikiは、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、GNU一般公衆利用許諾書をご覧ください。
 
-あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(the Free Software Foundation, Inc., 59Temple Place, Suite 330, Boston, MA 02111-1307 USA)まで請求するか、[//www.gnu.org/licenses/old-licenses/gpl-2.0.html オンラインで閲覧]してください。',
+あなたはこのプログラムと共に、[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU一般公衆利用許諾契約書の複製]を受け取ったはずです。もし受け取っていなければ、フリーソフトウェア財団(the 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' => 'エントリーポイントの URL',
+'version-entrypoints-header-entrypoint' => 'エントリーポイント',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath/ja 記事のパス]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath/ja スクリプトパス]',
 
 # Special:FilePath
 'filepath' => 'ファイルパス',
@@ -3983,17 +4061,16 @@ MediaWikiは、有用であることを期待して配布されていますが
 'fileduplicatesearch-legend' => '重複の検索',
 'fileduplicatesearch-filename' => 'ファイル名:',
 'fileduplicatesearch-submit' => '検索',
-'fileduplicatesearch-info' => '$1×$2ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
+'fileduplicatesearch-info' => '$1 × $2 ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
 'fileduplicatesearch-result-1' => 'ファイル「$1」と重複するファイルはありません。',
-'fileduplicatesearch-result-n' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81¯$2件ã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¨é\87\8dè¤\87ã\81\97ã\81¦ã\81\84ます。',
-'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81\8cã\81¿ã\81¤ã\81\8bりません。',
+'fileduplicatesearch-result-n' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\81«ã\81¯ {{PLURAL:$2|$2 ä»¶ã\81®é\87\8dè¤\87ã\83\95ã\82¡ã\82¤ã\83«}}ã\81\8cã\81\82ã\82\8aます。',
+'fileduplicatesearch-noresults' => 'ã\80\8c$1ã\80\8dã\81¨ã\81\84ã\81\86å\90\8då\89\8dã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81¯ã\81\82りません。',
 
 # Special:SpecialPages
 'specialpages' => '特別ページ',
 'specialpages-note' => '----
 * 通常の特別ページ
-* <span class="mw-specialpagerestricted">制限されている特別ページ</span>
-* <span class="mw-specialpagecached">(廃止されたかもしれない)キャッシュされた特別ページ</span>',
+* <span class="mw-specialpagerestricted">制限されている特別ページ</span>',
 'specialpages-group-maintenance' => 'メンテナンス報告',
 'specialpages-group-other' => 'その他の特別ページ',
 'specialpages-group-login' => 'ログイン/利用者登録',
@@ -4012,57 +4089,57 @@ MediaWikiは、有用であることを期待して配布されていますが
 'intentionallyblankpage' => 'このページは意図的に白紙にされています。',
 
 # External image whitelist
-'external_image_whitelist' => '  #ã\81\93ã\81®è¡\8cã\81¯ã\81\9dのままにしておいてください<pre>
-#この下に正規表現(//の間にる記述)を置いてください
+'external_image_whitelist' => '  #ã\81\93ã\81®è¡\8cã\81¯ã\81\93のままにしておいてください<pre>
+#この下に正規表現(//の間にる記述)を置いてください
 #外部の(ホットリンクされている)画像の URL と一致するか検査されます
 #一致する場合は画像として、一致しない場合は画像へのリンクとして表示されます
-#行の頭に # をけるとコメントとして扱われます
+#行の頭に # をけるとコメントとして扱われます
 #大文字と小文字は区別されません
 
-#æ­£è¦\8f表ç\8f¾ã\81¯ã\81\99ã\81¹ã\81¦ã\81\93ã\81®è¡\8cã\81®ä¸\8aã\81«ç½®ã\81\84ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\81®è¡\8cã\82\92å¤\89æ\9b´ã\81\97ã\81ªã\81\84ã\81§ください</pre>',
+#æ­£è¦\8f表ç\8f¾ã\81¯ã\81\99ã\81¹ã\81¦ã\81\93ã\81®è¡\8cã\81®ä¸\8aã\81«ç½®ã\81\84ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\81®è¡\8cã\81¯ã\81\93ã\81®ã\81¾ã\81¾ã\81«ã\81\97ã\81¦ã\81\8aã\81\84ã\81¦ください</pre>',
 
 # Special:Tags
 'tags' => '有効な変更タグ',
 'tag-filter' => '[[Special:Tags|タグ]]絞り込み:',
 'tag-filter-submit' => '絞り込み',
 'tags-title' => 'タグ',
-'tags-intro' => 'このページは、ソフトウェアが編集に対してけるタグとその意味の一覧です。',
+'tags-intro' => 'このページは、ソフトウェアが編集に対してけるタグとその意味の一覧です。',
 'tags-tag' => 'タグ名',
 'tags-display-header' => '変更一覧に表示されるもの',
 'tags-description-header' => '詳細な意味の説明',
 'tags-hitcount-header' => 'タグが付与された変更',
 'tags-edit' => '編集',
-'tags-hitcount' => '$1回の変更',
+'tags-hitcount' => '$1 {{PLURAL:$1|回の変更}}',
 
 # Special:ComparePages
 'comparepages' => 'ページの比較',
 'compare-selector' => 'ページの版を比較',
-'compare-page1' => 'ページ1',
-'compare-page2' => 'ページ2',
-'compare-rev1' => '版1',
-'compare-rev2' => '版2',
-'compare-submit' => '比較する',
+'compare-page1' => 'ページ 1',
+'compare-page2' => 'ページ 2',
+'compare-rev1' => '版 1',
+'compare-rev2' => '版 2',
+'compare-submit' => '比較',
 'compare-invalid-title' => '指定したページ名は使用できません。',
 'compare-title-not-exists' => '指定されたページは存在しません。',
 'compare-revision-not-exists' => '指定された版は存在しません。',
 
 # Database error messages
-'dberr-header' => '問題発生中です',
+'dberr-header' => 'このウィキには問題があります',
 'dberr-problems' => '申し訳ありません!
 このウェブサイトに技術的な問題が発生しています。',
 'dberr-again' => '数分間待った後、もう一度読み込んでください。',
-'dberr-info' => '(データベースサーバー:$1に接続できませんでした。)',
-'dberr-usegoogle' => 'å\85\83ã\81«æ\88»ã\82\8bã\81¾ã\81§ã\80\81Googleã\82\92å\88©ç\94¨ã\81\97ã\81¦æ¤\9cç´¢ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cã\81§ã\81\8dã\81¾ã\81\99ã\80\82',
+'dberr-info' => '(データベースサーバーに接続できませんでした:$1)',
+'dberr-usegoogle' => '元に戻るまで、Googleを利用して検索できます。',
 'dberr-outofdate' => 'それらが収集した内容は古い可能性があることに注意してください。',
 'dberr-cachederror' => 'これは要求されたページをキャッシュした複製であり、古くなっている可能性があります。',
 
 # HTML forms
-'htmlform-invalid-input' => '入力になんらかの問題があります',
-'htmlform-select-badoption' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få\80¤ã\81\8cæ\9c\89å\8a¹ã\81ªã\82\82ã\81®ではありません。',
-'htmlform-int-invalid' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få\80¤ã\81\8c整数ではありません。',
-'htmlform-float-invalid' => 'æ\8c\87å®\9aã\81\95ã\82\8cた値は数値ではありません。',
-'htmlform-int-toolow' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få\80¤ã\81\8c$1の最小値未満です',
-'htmlform-int-toohigh' => 'æ\8c\87å®\9aã\81\95ã\82\8cã\81\9få\80¤ã\81\8c$1の最大値を超えています',
+'htmlform-invalid-input' => '入力にらかの問題があります',
+'htmlform-select-badoption' => 'æ\8c\87å®\9aã\81\97ã\81\9få\80¤ã\81¯æ\9c\89å\8a¹ã\81ªé\81¸æ\8a\9eè\82¢ではありません。',
+'htmlform-int-invalid' => 'æ\8c\87å®\9aã\81\97ã\81\9få\80¤ã\81¯整数ではありません。',
+'htmlform-float-invalid' => 'æ\8c\87å®\9aã\81\97た値は数値ではありません。',
+'htmlform-int-toolow' => 'æ\8c\87å®\9aã\81\97ã\81\9få\80¤ã\81¯$1の最小値未満です',
+'htmlform-int-toohigh' => 'æ\8c\87å®\9aã\81\97ã\81\9få\80¤ã\81¯$1の最大値を超えています',
 'htmlform-required' => 'この値は必要です',
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
@@ -4075,13 +4152,13 @@ MediaWikiは、有用であることを期待して配布されていますが
 # New logging system
 'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
 'logentry-delete-restore' => '$1 がページ「$3」を復帰しました',
-'logentry-delete-event' => '$1 が$3で{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを変更しました: $4',
-'logentry-delete-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81§{{PLURAL:$5|ç\89\88|$5å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9f$4',
-'logentry-delete-event-legacy' => '$1 が$3で記録項目の閲覧レベルを変更しました',
+'logentry-delete-event' => '$1が$3の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを変更しました:$4',
+'logentry-delete-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®{{PLURAL:$5|ç\89\88| $5 å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a$4',
+'logentry-delete-event-legacy' => '$1 が「$3」の記録項目の閲覧レベルを変更しました',
 'logentry-delete-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを変更しました',
 'logentry-suppress-delete' => '$1 がページ「$3」を隠蔽しました',
-'logentry-suppress-event' => '$1 が$3で{{PLURAL:$5|記録項目|$5件の記録項目}}の閲覧レベルを見えない形で変更しました: $4',
-'logentry-suppress-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81§{{PLURAL:$5|ç\89\88|$5å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92è¦\8bã\81\88ã\81ªã\81\84å½¢ã\81§å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9f$4',
+'logentry-suppress-event' => '$1 が「$3」の{{PLURAL:$5|記録項目| $5 件の記録項目}}の閲覧レベルを見えない形で変更しました:$4',
+'logentry-suppress-revision' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\81®{{PLURAL:$5|ç\89\88| $5 å\80\8bã\81®ç\89\88}}ã\81®é\96²è¦§ã\83¬ã\83\99ã\83«ã\82\92è¦\8bã\81\88ã\81ªã\81\84å½¢ã\81§å¤\89æ\9b´ã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a$4',
 'logentry-suppress-event-legacy' => '$1 が$3で記録項目の閲覧レベルを見えない形で変更しました',
 'logentry-suppress-revision-legacy' => '$1 がページ「$3」の版の閲覧レベルを見えない形で変更しました',
 'revdelete-content-hid' => '本文の不可視化',
@@ -4092,41 +4169,42 @@ MediaWikiは、有用であることを期待して配布されていますが
 'revdelete-uname-unhid' => '利用者名の可視化',
 'revdelete-restricted' => '管理者に対する制限の適用',
 'revdelete-unrestricted' => '管理者に対する制限の除去',
-'logentry-move-move' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81¸ã\81¨移動しました',
-'logentry-move-move-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81¸ã\81¨、リダイレクトを残さずに移動しました',
-'logentry-move-move_redir' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81¸ã\81¨移動しました',
-'logentry-move-move_redir-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81¸ã\81¨、リダイレクトを残さずに移動しました',
-'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4をパトロール済みとしました',
-'logentry-patrol-patrol-auto' => '$1 がページ「$3」の版 $4を自動的にパトロール済みとしました',
+'logentry-move-move' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81«移動しました',
+'logentry-move-move-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\80\8c$4ã\80\8dã\81«、リダイレクトを残さずに移動しました',
+'logentry-move-move_redir' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81«移動しました',
+'logentry-move-move_redir-noredirect' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ã\80\8c$4ã\80\8dã\81«、リダイレクトを残さずに移動しました',
+'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' => 'パスワードを電子メールで送信しました',
+'newuserlog-byemail' => 'パスワードをメールでお送りしました',
 
 # Feedback
-'feedback-bugornote' => '技術的な問題の詳細をご説明する準備ができているなら[$1 バグを報告]してください。それ以外の場合、下の簡易フォームを使用すれば、あなたのコメントが"[$3 $2]"にあなたの利用者名と使用中のブラウザ名と共に追加されます。',
+'feedback-bugornote' => '技術的な問題の詳細を説明なさる準備ができている場合は[$1 バグを報告]してください。
+そうではない場合は、下の簡易フォームを使用してください。あなたのコメントがあなたの利用者名とご使用中のブラウザー名と共に、ページ"[$3 $2]"に追加されます。',
 'feedback-subject' => '件名:',
 'feedback-message' => 'メッセージ:',
 'feedback-cancel' => 'キャンセル',
 'feedback-submit' => 'フィードバックを送信',
-'feedback-adding' => 'ã\83\9aã\83¼ã\82¸ã\81¸ã\81®ã\83\95ã\82£ã\83¼ã\83\89ã\83\90ã\83\83ã\82¯ã\82\92追å\8a ã\81\99ã\82\8b...',
+'feedback-adding' => 'ã\83\9aã\83¼ã\82¸ã\81¸ã\81®ã\83\95ã\82£ã\83¼ã\83\89ã\83\90ã\83\83ã\82¯ã\81®è¿½å\8a ...',
 'feedback-error1' => 'エラー:APIから認識されない結果が返ってきました',
 'feedback-error2' => 'エラー:編集に失敗しました',
 'feedback-error3' => 'エラー:APIからの応答がありません',
-'feedback-thanks' => 'ã\81\82ã\82\8aã\81\8cã\81¨ã\81\86ã\81\94ã\81\96ã\81\84ã\81¾ã\81\99ã\80\82ã\81\82ã\81ªã\81\9fã\81®ã\83\95ã\82£ã\83¼ã\83\89ã\83\90ã\83\83ã\82¯ã\81¯ã\80\8c[$2 $1]ã\80\8dã\81®ã\83\9aã\83¼ã\82¸ã\81«æ\8a\95稿ã\81\95ã\82\8cました。',
+'feedback-thanks' => 'ã\81\82ã\82\8aã\81\8cã\81¨ã\81\86ã\81\94ã\81\96ã\81\84ã\81¾ã\81\99ã\80\82ã\83\95ã\82£ã\83¼ã\83\89ã\83\90ã\83\83ã\82¯ã\82\92ã\80\8c[$2 $1]ã\80\8dã\81®ã\83\9aã\83¼ã\82¸ã\81«æ\8a\95稿ã\81\97ました。',
 'feedback-close' => '完了',
-'feedback-bugcheck' => 'Great!  [$1 既出のバグ]にすでに含まれていないかチェックしてください。',
-'feedback-bugnew' => 'チェック済み。バグを報告する。',
+'feedback-bugcheck' => 'Great! [$1 既出のバグ]に既に含まれていないかご確認ください。',
+'feedback-bugnew' => 'チェックしました。バグを報告します。',
 
 # API errors
 'api-error-badaccess-groups' => 'このウィキへのファイルのアップロードが許可されていません。',
-'api-error-badtoken' => '内部エラー:トークンが不正です。',
+'api-error-badtoken' => '内部エラー:トークンが正しくありません。',
 'api-error-copyuploaddisabled' => 'URLによるアップロードはこのサーバーでは無効になっています。',
-'api-error-duplicate' => '当ウェブサイト上には、既に同じ内容の[$2 別ファイル]が存在しています{{PLURAL:$1|}}。',
-'api-error-duplicate-archive' => '同じ内容で既に削除済みの{{PLURAL:$1|[$2 別のファイルが]|[$2 別のファイルがいくつか]}}サイト上にあります。',
-'api-error-duplicate-archive-popup-title' => 'すでに削除された重複{{PLURAL:$1|ファイル|ファイル}}',
-'api-error-duplicate-popup-title' => 'é\87\8dè¤\87ã\83\95ã\82¡ã\82¤ã\83«{{PLURAL:$1|}}',
+'api-error-duplicate' => '当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|[$2 他のファイル]が|[$2 他のファイルがいくつか]}}存在しています。',
+'api-error-duplicate-archive' => 'サイト上に同じ内容の{{PLURAL:$1|[$2 別のファイル]が|[$2 他のファイルがいくつか]}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。',
+'api-error-duplicate-archive-popup-title' => '重複した{{PLURAL:$1|ファイル|ファイル群}}は削除済みです。',
+'api-error-duplicate-popup-title' => 'é\87\8dè¤\87ã\81\97ã\81\9f{{PLURAL:$1|ã\83\95ã\82¡ã\82¤ã\83«|ã\83\95ã\82¡ã\82¤ã\83«ç¾¤}}ã\81§ã\81\99ã\80\82',
 'api-error-empty-file' => '送信されたファイルは空でした。',
 'api-error-emptypage' => '内容がないページの新規作成は許可されていません。',
 'api-error-fetchfileerror' => '内部エラー:ファイルの取得中に問題が発生しました。',
@@ -4139,22 +4217,33 @@ MediaWikiは、有用であることを期待して配布されていますが
 'api-error-illegal-filename' => 'ファイル名が許可されていません。',
 'api-error-internal-error' => '内部エラー:ウィキ上でアップロードを処理する際に問題が発生しました。',
 'api-error-invalid-file-key' => '内部エラー:一時格納場所にファイルが見つかりませんでした。',
-'api-error-missingparam' => '内部エラー:リクエストのパラメータが足りません。',
+'api-error-missingparam' => 'å\86\85é\83¨ã\82¨ã\83©ã\83¼ï¼\9aã\83ªã\82¯ã\82¨ã\82¹ã\83\88ã\81®ã\83\91ã\83©ã\83¡ã\83¼ã\82¿ã\83¼ã\81\8c足ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82',
 'api-error-missingresult' => '内部エラー:複製に成功したか判断できませんでした。',
 'api-error-mustbeloggedin' => 'ファイルをアップロードするにはログインする必要があります。',
-'api-error-mustbeposted' => 'このソフトウェアにバグがありました。適切なHTTPメソッドを使用していません。',
+'api-error-mustbeposted' => '内部エラー:リクエストはHTTP POSTである必要があります。',
 'api-error-noimageinfo' => 'アップロードには成功しましたが、サーバーはファイルに関する情報を返しませんでした。',
 'api-error-nomodule' => '内部エラー:アップロードを処理するモジュールが設定されていません。',
 'api-error-ok-but-empty' => '内部エラー:サーバーからの応答がありません。',
-'api-error-overwrite' => '既存のファイルへ上書きすることは許可されていません。',
+'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-unknown-warning' => '不明な警告:「$1」',
+'api-error-unknownerror' => '不明なエラー:「$1」',
 '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|0 年}}',
+'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
+'duration-millennia' => '$1{{PLURAL:$1|,000 年}}',
+
 );
index b056ed1..00c4950 100644 (file)
@@ -701,7 +701,6 @@ Lejen: '''({{int:cur}})''' = difrans wid lietis rivijan, '''({{int:last}})''' =
 
 # Diffs
 'history-title' => 'Rivijan ischri a "$1"',
-'difference' => '(Difrans bitwiin rivijandem)',
 'lineno' => 'Lain $1:',
 'compareselectedversions' => 'Kompier silektid rivijan',
 'editundo' => 'andu',
index 652abaf..e3e527f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Jutish (Jysk)
+/** Jutish (jysk)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -432,7 +432,6 @@ hersenenge, (førge) = førskel til den førge hersenenge, l = lile til mendre 
 
 # Diffs
 'history-title' => 'Hersengsskigte før "$1"',
-'difference' => '(Førskelle mellem hersenenger)',
 'lineno' => 'Lenje $1:',
 'compareselectedversions' => 'Sammenlign valgte hersenenger',
 'editundo' => 'baĝgøt',
index 82f5a1e..2aa66fb 100644 (file)
@@ -641,6 +641,7 @@ Yèn isih tetep ora kasil, cobanen metu log lan mlebu manèh.'''",
 '''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
 'token_suffix_mismatch' => "'''Suntingan panjenengan ditulak amerga aplikasi klièn panjenengan ngowahi karakter tandha wewacan ing suntingan. Suntingan iku ditulak kanggo untuk menggak kaluputan ing tèks artikel. Prekara iki kadhangkala dumadi yèn panjenengan ngangem dines layanan proxy anonim adhedhasar situs wèb sing duwé masalah.'''",
 'editing' => 'Nyunting $1',
+'creating' => 'Nggawé $1',
 'editingsection' => 'Nyunting $1 (bagian)',
 'editingcomment' => 'Nyunting $1 (bagéyan anyar)',
 'editconflict' => 'Konflik panyuntingan: $1',
@@ -867,7 +868,7 @@ Gunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé
 
 # Diffs
 'history-title' => 'Sajarah revisi saka "$1"',
-'difference' => '(Prabédan antarrevisi)',
+'difference-title' => '$1: Bèntenipun revisi',
 'lineno' => 'Larikan $1:',
 'compareselectedversions' => 'Bandhingna vèrsi kapilih',
 'showhideselectedversions' => 'Tampilaké/dhelikaké révisi kapilih',
@@ -1202,7 +1203,7 @@ Panjenengan uga bisa milih supaya wong liya ngubungi panjenengan liwat jeneng pa
 'nchanges' => '$1 {{PLURAL:$1|pangowahan|owah-owahan}}',
 'recentchanges' => 'Owah-owahan',
 'recentchanges-legend' => 'Pilihan owah-owahan pungkasan',
-'recentchangestext' => 'Runutna owah-owahan pungkasan ing wiki iki ing kaca iki.',
+'recentchanges-summary' => 'Runutna owah-owahan pungkasan ing wiki iki ing kaca iki.',
 'recentchanges-feed-description' => "Urutna owah-owahan anyar ing wiki ing ''feed'' iki.",
 'recentchanges-label-newpage' => 'Suntingan iki gawé kaca anyar',
 'recentchanges-label-minor' => 'Iki suntingan sithik',
index c8bf0cd..e06c3a2 100644 (file)
@@ -60,28 +60,33 @@ $specialPageAliases = array(
        'Activeusers'               => array( 'აქტიური_მომხმარებლები' ),
        'Allmessages'               => array( 'ყველა_შეტყობინება' ),
        'Allpages'                  => array( 'ყველა_გვერდი' ),
-       'Ancientpages'              => array( 'მხცოვანიგვერდები' ),
+       'Ancientpages'              => array( 'მხცოვანი_გვერდები' ),
+       'Badtitle'                  => array( 'ცუდი_სათაური' ),
        'Blankpage'                 => array( 'ცარიელი_გვერდი' ),
        'Block'                     => array( 'დაბლოკვა' ),
        'Blockme'                   => array( 'დამბლოკე' ),
-       'BrokenRedirects'           => array( 'გაწყვეტილიგადამისამართება' ),
+       'BrokenRedirects'           => array( 'გაწყვეტილი_გადამისამართება' ),
        'Categories'                => array( 'კატეგორიები' ),
+       'ChangeEmail'               => array( 'ელ-ფოსტის_შეცვლა' ),
        'ChangePassword'            => array( 'პაროლის_შეცვლა' ),
        'ComparePages'              => array( 'გვერდების_შედარება' ),
        'Confirmemail'              => array( 'ელ-ფოსტის_დადასტურება' ),
        'Contributions'             => array( 'წვლილი' ),
        'CreateAccount'             => array( 'ანგარიშის_შექმნა' ),
        'Disambiguations'           => array( 'მრავალმნიშვნელოვნება' ),
-       'DoubleRedirects'           => array( 'ორმაგიგადამისამართება' ),
+       'DoubleRedirects'           => array( 'ორმაგი_გადამისამართება' ),
+       'EditWatchlist'             => array( 'კონტროლის_სიის_რედაქტირება' ),
        'Emailuser'                 => array( 'მიწერა_მომხმარებელს' ),
        'Export'                    => array( 'ექსპორტი' ),
        'FileDuplicateSearch'       => array( 'ფაილის_დუბლიკატის_ძიება' ),
        'Import'                    => array( 'იმპორტი' ),
        'BlockList'                 => array( 'ბლოკირებების_სია' ),
-       'LinkSearch'                => array( 'á\83\91á\83\9bá\83£á\83\9aá\83\98á\83¡_á\83«á\83\94ება' ),
+       'LinkSearch'                => array( 'á\83\91á\83\9bá\83£á\83\9aá\83\98á\83¡_á\83«á\83\98ება' ),
        'Listadmins'                => array( 'ადმინისტრატორების_სია' ),
        'Listbots'                  => array( 'ბოტების_სია' ),
-       'Listfiles'                 => array( 'სურსია' ),
+       'Listfiles'                 => array( 'ფაილების_სია' ),
+       'Listgrouprights'           => array( 'ჯგუფის_უფლებათა_სია' ),
+       'Listredirects'             => array( 'გადამისამართებების_სია' ),
        'Listusers'                 => array( 'მომხმარებელთა_სია' ),
        'Lonelypages'               => array( 'ობოლიგვერდები' ),
        'Longpages'                 => array( 'გრძელიგვერდები' ),
@@ -130,9 +135,13 @@ $magicWords = array(
        'img_thumbnail'           => array( '1', 'მინიატიურა', 'მინი', 'მინიასლი', 'ცეროდენა', 'thumbnail', 'thumb' ),
        'img_right'               => array( '1', 'მარჯვნივ', 'right' ),
        'img_left'                => array( '1', 'მარცხნივ', 'left' ),
+       'img_none'                => array( '1', 'არა', 'none' ),
        'img_width'               => array( '1', '$1პქ', '$1px' ),
-       'img_center'              => array( '1', 'ცენტრი', 'center', 'centre' ),
+       'img_center'              => array( '1', 'ცენტრი', 'ცენტრში', 'center', 'centre' ),
        'img_border'              => array( '1', 'საზღვარი', 'border' ),
+       'img_top'                 => array( '1', 'ზედა', 'top' ),
+       'img_middle'              => array( '1', 'შუა', 'middle' ),
+       'img_bottom'              => array( '1', 'ქვედა', 'bottom' ),
        'special'                 => array( '0', 'სპეციალური', 'special' ),
 );
 
@@ -147,7 +156,7 @@ $messages = array(
 'tog-hidepatrolled' => 'დამალეთ შესწორებული რედაქტირებები ბოლო ცვლილებებში',
 'tog-newpageshidepatrolled' => 'დამალეთ შემოწმებული გვერდები ახალი გვერდების სიიდან',
 'tog-extendwatchlist' => 'გავრცობილი კონტროლის სია ყველა დაკავშირებული ცვლილების ჩვენების ჩათვლით',
-'tog-usenewrc' => 'á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94 á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83£á\83\99á\83\94á\83\97á\83\94á\83¡á\83\98 á\83¡á\83\98á\83\90 (ჯავასკრიპტი)',
+'tog-usenewrc' => 'á\83\91á\83\9dá\83\9aá\83\9d á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\93á\83\90 á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83¡á\83\98á\83\98á\83¡ á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\93á\83\90á\83¯á\83\92á\83£á\83¤á\83\94á\83\91á\83\90 (á\83¡á\83\90á\83­á\83\98á\83 á\83\9dá\83\90 ჯავასკრიპტი)',
 'tog-numberheadings' => 'ავტომატურად დანომრე ქვესათაურები',
 'tog-showtoolbar' => 'რედაქტირების ინსტრუმენტების ჩვენება (ჯავასკრიპტი)',
 'tog-editondblclick' => 'გვერდების რედაქტირება ორმაგი დაწკაპუნებით (ჯავასკრიპტი)',
@@ -535,6 +544,8 @@ $2',
 'filereadonlyerror' => 'ფაილი "$1" შეცვლა ვერ ხერხდება, რადგანაც ფაილის საცავი "$2" მხოლოდ კითხვის რეჟიმშია.
 
 ადმინისტრატორი რომელმაც ის დაბლოკა მიუთითა შემდეგი მიზეზი: "$3".',
+'invalidtitle-knownnamespace' => 'დაუშვებელი სათაური სახელთა სივრცე "$2" და ტექსტი "$3"-თან',
+'invalidtitle-unknownnamespace' => 'დაუშვებელი სათაური უცნობი სახელთა სივრცის ნომერი $1 და ტექსტი "$2"-ით',
 
 # Virus scanner
 'virus-badscanner' => "შეცდომა. ვირუსთა უცნობი სკანერი: ''$1''",
@@ -838,7 +849,8 @@ $2
 'updated' => '(განახლდა)',
 'note' => "'''შენიშვნა:'''",
 'previewnote' => "'''დაიმახსოვრეთ, ეს მხოლოდ წინასწარი გადახედვაა.'''
-თქვენი ცვლილებები ჯერ არ შენახულა! [[#editform|→ რედაქტირების გაგრძელება]]",
+თქვენი ცვლილებები ჯერ არ შენახულა!",
+'continue-editing' => 'რედაქტირების გაგრძელება',
 'previewconflict' => 'შავი ნიმუში უჩვენებს ტექსტს ზედა რედაქტირების ფანჯარაში, როგორც ის გამოჩნდება თუ თქვენ მას შეინახავთ.',
 'session_fail_preview' => "'''უკაცრავად! ვერ შევძელით თქვენი რედაქტირების შენახვა სესიის მონაცემთა დაკარგვის გამო.
 გთხოვთ ისევ სცადოთ.
@@ -851,7 +863,7 @@ $2
 'token_suffix_mismatch' => "'''თქვენი შესწორება გაუქმდა რადგანაც პროგრამა არასწორედ აღიქვამს პუნქტუაციის ნიშნებს რედაქტირების ფანჯარაში. შესწრება გაუქმდა სტატიის არ გაფუჭების მიზნით. შესაძლოა ეს გამოწვეულია გაფუჭებული ვებ პროქსის გამოყენებით.'''",
 'edit_form_incomplete' => "'''რედაქტირებების ნაწილმა სერვერამდე ვერ მიაღწია; გთხოვთ, შეამოწმეთ თქვენი რედაქტირებების სრულყოფილება და სცადეთ განმეორებით.'''",
 'editing' => 'რედაქტირება: $1',
-'creating' => 'იქმნება $1',
+'creating' => 'იქმნება: „$1“',
 'editingsection' => 'რედაქტირება - $1 (სექცია)',
 'editingcomment' => 'რედაქტირება: $1 (ახალი სექცია)',
 'editconflict' => 'რედაქტირების კონფლიქტი: $1',
@@ -930,6 +942,12 @@ $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' => 'გვერდზე გადამეტებულია ჩადგმების ზღვარი',
+'parser-unstrip-loop-warning' => 'აღმოჩენილია ციკლური ბმული',
+'parser-unstrip-recursion-limit' => 'გადამეტებულია რეკურსიის ზღვარი ($1)',
 
 # "Undo" feature
 'undo-success' => 'რედაქტირების გაუქმება შესაძლებელია. გთხოვთ შეამოწმოთ განსხვავება ქვევით, რათა დარწმუნდეთ, რომ ეს ის არის რაც თქვენ გსურთ, შემდეგ კი შეინახეთ ცვლილებები რათა დაასრულოთ რედაქტირების გაუქმება.',
@@ -1076,7 +1094,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'დამალვათა ჟურნალი',
 'suppressionlogtext' => 'ქვემოთ მოცემულია წაშლისა და ბლოკირებების სია, რომელიც მოიცავს ადმინისტრატორებისაგან დაფარულ მასალებს.
-იხილეთ [[Special:BlockList|IP ბლოკირებების სიაში]] მიმდინარე ბლოკირებები.',
+იხილეთ [[Special:BlockList|ბლოკირებების სიაში]] მიმდინარე ბლოკირებები.',
 
 # History merging
 'mergehistory' => 'გვერდების ისტორიის შერწყმა',
@@ -1107,8 +1125,9 @@ $1",
 'mergelogpagetext' => 'ქვემოთ წარმოდგენილია ამ გვერდის ბოლო გაერთიანებათა სია',
 
 # Diffs
-'history-title' => 'ცვლილებათა ისტორია სტატიაში „$1“',
-'difference' => '(სხვაობა ვერსიებს შორის)',
+'history-title' => '$1: ცვლილებათა ისტორია',
+'difference-title' => '$1: განსხვავება გადახედვებს შორის',
+'difference-title-multipage' => '$1 და $2: განსხვავება გვერდებს შორის',
 'difference-multipage' => '(განსხვავება გვერდებს შორის)',
 'lineno' => 'ხაზი $1:',
 'compareselectedversions' => 'არჩეული ვერსიების შედარება',
@@ -1204,6 +1223,7 @@ $1",
 'prefs-beta' => 'ბეტა შესაძლებლობები',
 'prefs-datetime' => 'თარიღი და დრო',
 'prefs-labs' => 'ექსპერიმენტალური ფუნქციები',
+'prefs-user-pages' => 'მომხმარებლის გვერდები',
 'prefs-personal' => 'მომხმარებლის მონაცემები',
 'prefs-rc' => 'ბოლო ცვლილებები',
 'prefs-watchlist' => 'კონტროლის სია',
@@ -1468,7 +1488,7 @@ $1",
 'nchanges' => '$1 ცვლილება',
 'recentchanges' => 'ბოლო ცვლილებები',
 'recentchanges-legend' => 'ბოლო ცვლილებების პარამეტრები',
-'recentchangestext' => 'უთვალთვალეთ ვიკიში ბოლო ცვლილებებს ამ გვერდზე.',
+'recentchanges-summary' => 'უთვალთვალეთ ვიკიში ბოლო ცვლილებებს ამ გვერდზე.',
 'recentchanges-feed-description' => 'ვიკის უახლესი ცვლილებების მეთვალყურეობა ამ არხში.',
 'recentchanges-label-newpage' => 'ამ რედაქტირებით შეიქმნა ახალი გვერდი',
 'recentchanges-label-minor' => 'ეს არის მცირე შესწორება',
@@ -1660,14 +1680,15 @@ $1',
 'backend-fail-writetemp' => 'დროებითი ფაილის დაწერა ვერ ხერხდება.',
 'backend-fail-closetemp' => 'დროებითი ფაილის დახურვა ვერ ხერხდება.',
 'backend-fail-read' => 'ფაილი $1-ის წაკითხვა ვერ მოხერხდა.',
-'backend-fail-create' => 'á\83¤á\83\90á\83\98á\83\9aá\83\98 $1-á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cა ვერ მოხერხდა.',
-'backend-fail-maxsize' => 'á\83¤á\83\90á\83\98á\83\9aá\83\98 $1-á\83\98á\83¡ á\83¨á\83\94á\83¥á\83\9bá\83\9cá\83\90 á\83\95á\83\94á\83  á\83\9bá\83\9dá\83®á\83\94á\83 á\83®á\83\93á\83\90, á\83 á\83\90á\83\93á\83\92á\83\90á\83\9cá\83\90á\83ª á\83\9bá\83\98á\83¡á\83\98 á\83\96á\83\9dá\83\9bá\83\90 á\83\90á\83­á\83\90á\83 á\83\91á\83\94á\83\91á\83¡ {{PLURAL:$2|$2 ბაიტს|$2 ბაიტს}}.',
+'backend-fail-create' => 'á\83¤á\83\90á\83\98á\83\9aá\83\98 $1-á\83\98á\83¡ á\83©á\83\90á\83¬á\83\94á\83 ა ვერ მოხერხდა.',
+'backend-fail-maxsize' => 'á\83¤á\83\90á\83\98á\83\9aá\83\98 $1-á\83\98á\83¡ á\83©á\83\90á\83¬á\83\94á\83 á\83\90 á\83\95á\83\94á\83  á\83\9bá\83\9dá\83®á\83\94á\83 á\83®á\83\93á\83\90, á\83 á\83\90á\83\93á\83\92á\83\90á\83\9cá\83\90á\83ª á\83\9bá\83\98á\83¡á\83\98 á\83\96á\83\9dá\83\9bá\83\90 á\83\90á\83­á\83\90á\83 á\83\91á\83\94á\83\91á\83¡ {{PLURAL:$2|á\83\94á\83 á\83\97 ბაიტს|$2 ბაიტს}}.',
 'backend-fail-readonly' => 'საცავი "$1" ამჟამად ხელმისაწვდომია მხოლოდ წაკითხვის რეჟიმში. მიზეზი: "$2"',
 'backend-fail-synced' => 'ფაილი "$1" იმყოფება შიდა საცავის შეუთანხმებელ მდგომარეობაში',
 'backend-fail-connect' => '"$1" საცავთან დაკავშირება ვერ მოხერხდა.',
 'backend-fail-internal' => '"$1" საცავში მოხდა დაუდგენელი შეცდომა.',
 'backend-fail-contenttype' => 'ფაილის შემადგენლობის ტიპის დადგენა ვერ მოხერხდა, "$1"-ში შესანახად.',
 'backend-fail-batchsize' => 'საცავმა მიიღო {{PLURAL:$1|ფაილის ოპერაციის|ფაილების ოპერაციების}} ბლოკი $1-დან, შეზღუდვა შეადგენს $2 {{PLURAL:$1|ოპერაციას}}.',
+'backend-fail-usable' => 'Не удалось записать файлფაილი $1 ჩაწერა ვერ მოხერხდა უფლებების უკმარისობის ან საჭირო საქაღალდეების არქონის გამო.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'ჟურნალის მონაცემთა ბაზებთან დაკავშირება "$1" მონაცემთა შესანახად ვერ მოხერხდა.',
@@ -1869,7 +1890,7 @@ $1',
 'statistics-articles' => 'სტატიების',
 'statistics-pages' => 'გვერდები',
 'statistics-pages-desc' => 'ვიკის ყველა გვერდი, განხილვის, გადამისამართების და სხვ. ჩათვლით.',
-'statistics-files' => 'á\83\90á\83\95á\83¢á\83\95á\83\98á\83 á\83\97á\83£á\83\9aá\83\98 á\83¤á\83\90á\83\98á\83\9aá\83\94á\83\91á\83\98',
+'statistics-files' => 'ატვირთული ფაილები',
 'statistics-edits' => 'გვერდის შესწორებები {{SITENAME}}-ის შექმნიდან',
 'statistics-edits-average' => 'რედაქტირების საერთო რაოდენობა გვერდზე',
 'statistics-views-total' => 'სულ ხილვა',
@@ -1993,6 +2014,7 @@ $1',
 შეგიძლიათ გაცხრილოთ იგი ჩანაწერის ტიპის, მომხმარებლის სახელის, ან დაკავშირებული გვერდის შერჩევით.',
 'logempty' => 'შედეგები არ არის სიაში.',
 'log-title-wildcard' => 'სათაურების ძებნა, რომლებიც იწყება ამ ტექსტით',
+'showhideselectedlogentries' => 'არჩეული ჟურნალის ჩანაწერის ჩვენება/დამალვა',
 
 # Special:AllPages
 'allpages' => 'ყველა გვერდი',
@@ -2012,6 +2034,11 @@ $1',
 '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|კატეგორია შეიცავს|კატეგორია შეიცავს}} გვერდს ან მედიას.
@@ -2455,7 +2482,7 @@ $1',
 'badipaddress' => 'არასწორი IP მისამართი',
 'blockipsuccesssub' => 'ბლოკირება შესრულებულია',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ბლოკირებულ იქნა.<br />
\83\98á\83®á\83\98á\83\9aá\83\94á\83\97 [[Special:BlockList|á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 IP á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\94á\83\91á\83\98á\83¡ á\83¡á\83\98á\83\90]].',
+იხილეთ [[Special:BlockList|ბლოკირებების სია]].',
 'ipb-blockingself' => 'თქვენ აპირებთ დაბლოკოთ საკუთარი თავი! დარწმუნებული ხართ, რომ გსურთ ამის გაკეთება?',
 'ipb-confirmhideuser' => 'თქვენ აპირებთ მომხმარებლის დაბლოკვას და ჩართული გაქვთ ოპცია „დამალე მომხმარებელი“. ასეთი ქმედება აღკვეთს მომხმარებლის სახელს ყველა სიიდან და ჟურნალების ჩანაწერებიდან. დარწმუნებული ხართ, რომ ამის გაკეთება გსურთ?',
 'ipb-edit-dropdown' => 'დაბლოკვის მიზეზების რედაქტირება',
@@ -2507,7 +2534,9 @@ $1',
 დაბლოკვათა ჟურნალი ქვემოთ მოყვანილია:',
 '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' => 'ანგარიშის შექმნა გამორთულია',
@@ -2868,6 +2897,7 @@ $1',
 'spambot_username' => 'სპამის გასუფთავება',
 'spam_reverting' => 'დაბრუნება ბოლო ვერსიასთან, რომელიც არ შეიცავს ბმულს $1-თან',
 'spam_blanking' => 'ყველა გვერდი შეიცავს ბმულს $1-გვერდზე. გასუფთავება',
+'spam_deleting' => 'ყველა ვერსია შეიცავდა ბმულს $1-ზე, მიმდინარეობს წაშლა',
 
 # Info page
 'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
@@ -3654,6 +3684,11 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'version-software' => 'დაინსტალირებული პროგრამული უზრუნველყოფა',
 'version-software-product' => 'პროდუქტი',
 'version-software-version' => 'ვერსია',
+'version-entrypoints' => 'შესვლის წერტილის URL-ები',
+'version-entrypoints-header-entrypoint' => 'შესვლის წერტილი',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath გზა სტატიისაკენ]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath გზა სკრიპტისაკენ]',
 
 # Special:FilePath
 'filepath' => 'გზა ფაილისდამი',
@@ -3838,4 +3873,17 @@ 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|ათასწლეული|ათასწლეული}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'ვერ მოხერხდა ბლოკირების მიღება სერვერზე $1.',
 );
index 0f56ab5..1425327 100644 (file)
@@ -744,7 +744,7 @@ $3 keltirilgen sebebi: ''$2''",
 'last' => 'aqır.',
 'page_first' => 'birinshi',
 'page_last' => "aqırg'ı",
-'histlegend' => "Tu'sindirme: salıstırajaq nusqaların'ızdı saylan' ha'mde <Enter> knopkasın yamasa to'mendegi knopkani basın'.<br />
+'histlegend' => "Tu'sindirme: salıstırajaq nusqaların'ızdı saylan' ha'mde Enter knopkasın yamasa to'mendegi knopkani basın'.<br />
 Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 (aqır.) = aldıng'ı nusqasi menen parqı, k = kishi o'zgeris",
 'history-fieldset-title' => 'Tariyxınan izlew',
@@ -811,7 +811,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 
 # Diffs
 'history-title' => '"$1" betinin\' nusqa tariyxı',
-'difference' => "(Nusqalar arasındag'ı ayırmashılıq)",
 'lineno' => 'Qatar No $1:',
 'compareselectedversions' => "Saylang'an nusqalardı salıstırıw",
 'editundo' => 'qaytar',
@@ -1066,7 +1065,7 @@ Barlıq mag'lıwmat tu'rin (sonın' ishinde sa'wbet betlerdi, shablonlardı h.t.
 'nchanges' => "{{PLURAL:$1|1 o'zgeris|$1 o'zgeris}}",
 'recentchanges' => "Aqırg'ı o'zgerisler",
 'recentchanges-legend' => "Aqırg'ı o'zgerisler sazlawları",
-'recentchangestext' => "Bul bette usı wikidegi ha'zirgi o'zgerisler baqlanadı.",
+'recentchanges-summary' => "Bul bette usı wikidegi ha'zirgi o'zgerisler baqlanadı.",
 'recentchanges-feed-description' => "Wikidin' usı ag'ımındag'ı en' aqırg'ı o'zgerislerin baqlaw.",
 'recentchanges-label-newpage' => "Bul o'zgeris arqalı taza bet jaratıldı",
 'recentchanges-label-minor' => "Bul kishi o'zgeris",
index befc719..fe97fb1 100644 (file)
@@ -52,7 +52,7 @@ $messages = array(
 'tog-editsection' => 'Eǧǧ abeddel n umur s yizdayen [beddel]',
 'tog-editsectiononrightclick' => 'Eǧǧ abeddel n umur mi wekkiɣ ɣef uyeffus<br /> ɣef yizwal n umur (JavaScript)',
 'tog-showtoc' => 'Ssken agbur (i isebtar i yesɛan kter n 3 izwalen)',
-'tog-rememberpassword' => 'Cfu ɣef yisem n wemseqdac inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-rememberpassword' => 'Cfu ɣef yisem n umseqdac inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
 'tog-watchcreations' => 'Rnu isebtar i xelqeɣ deg wumuɣ n uɛessi inu',
 'tog-watchdefault' => 'Rnu isebtar i ttbeddileɣ deg wumuɣ n uɛessi inu',
 'tog-watchmoves' => 'Rnu isebtar i smimḍeɣ deg wumuɣ n uɛessi inu',
@@ -60,13 +60,13 @@ $messages = array(
 'tog-minordefault' => 'Rcem akk ibeddlen am ibeddlen ifessasen d ameslugen',
 'tog-previewontop' => 'Ssken pre-timeẓriwt uqbel tankult ubeddel',
 'tog-previewonfirst' => 'Ssken pre-timeẓriwt akk d ubeddel amezwaru',
-'tog-nocache' => 'Kkes lkac n usebter',
+'tog-nocache' => 'Ekkes lkac n usebter',
 'tog-enotifwatchlistpages' => "Azen-iyi-d e-mail m'ara yettubeddel asebter i ttɛassaɣ",
 'tog-enotifusertalkpages' => 'Azen-iyi-d e-mail asmi sɛiɣ izen amaynut',
 'tog-enotifminoredits' => 'Azen-iyi-d e-mail ma llan ibeddlen ifessasen',
 'tog-enotifrevealaddr' => 'Ssken e-mail inu asmi yettwazen email n talɣut',
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
-'tog-fancysig' => 'Eǧǧ azmul am yettili (mebla azday otomatik)',
+'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
 'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
 'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
 'tog-showjumplinks' => 'Eǧǧ izdayen "neggez ar"',
@@ -145,7 +145,10 @@ $messages = array(
 'hidden-category-category' => 'Taggayin yeffren',
 'category-subcat-count' => 'Taggayt agi tesɛa {{PLURAL:$2|adu-taggayt|$2 adu-taggayin, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}}}} ddaw agi.',
 'category-subcat-count-limited' => 'Taggayt agi tesɛa {{PLURAL:$1|adu-taggayt agi|tid $1 adu-taggayin agi}} ddaw-agi.',
-'category-article-count' => 'Taggayt agi tesɛa {{PLURAL:$2|asebter agi|$2 isetar, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-article-count' => 'Taggayt agi tesɛa {{PLURAL:$2|asebter agi|$2 isebtaren, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-file-count' => 'Taggayt agi tesɛa {{PLURAL:$2|afaylu agi|$2 ifuyla, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'listingcontinuesabbrev' => 'asartu',
+'noindex-category' => 'Asebter agi ur d-yerna ara deg umatar',
 
 'about' => 'Awal ɣef...',
 'article' => 'Ayen yella deg usebter',
@@ -169,6 +172,20 @@ $messages = array(
 'faq' => 'Isteqsiyen',
 'faqpage' => 'Project:Isteqsiyen',
 
+# Vector skin
+'vector-action-addsection' => 'Rnud ameggay',
+'vector-action-delete' => 'Mḥu',
+'vector-action-move' => 'Smimeḍ',
+'vector-action-protect' => 'Mmesten',
+'vector-view-create' => 'Snulfu',
+'vector-view-edit' => 'Ẓẓiẓreg',
+'vector-view-history' => 'Ẓeṛ amazray',
+'vector-view-view' => 'Ɣer',
+'vector-view-viewsource' => 'Ẓer aɣbalu',
+'actions' => 'Tigawtin',
+'namespaces' => 'Talluntin n isemawen',
+'variants' => 'Tineḍwa',
+
 'errorpagetitle' => 'Agul',
 'returnto' => 'Uɣal ar $1.',
 'tagline' => 'Seg {{SITENAME}}',
@@ -184,6 +201,7 @@ $messages = array(
 'permalink' => 'Azday ur yettbeddil ara',
 'print' => 'Imprimi',
 'edit' => 'Beddel',
+'create' => 'Snulfu',
 'editthispage' => 'Beddel asebter-agi',
 'delete' => 'Mḥu',
 'deletethispage' => 'Mḥu asebter-agi',
@@ -191,8 +209,8 @@ $messages = array(
 'protect' => 'Ḥrez',
 'protect_change' => 'beddel tiḥḥerzi',
 'protectthispage' => 'Ḥrez asebter-agi',
-'unprotect' => 'fakk tiḥḥerzi',
-'unprotectthispage' => 'Fakk tiḥḥerzi n usebter-agi',
+'unprotect' => 'Beddel amesten',
+'unprotectthispage' => 'Beddel amesten n usebter-agi',
 'newpage' => 'Asebter amaynut',
 'talkpage' => 'Mmeslay ɣef usebter-agi',
 'talkpagelinktext' => 'Mmeslay',
@@ -225,6 +243,7 @@ $messages = array(
 'aboutsite' => 'Awal ɣef {{SITENAME}}',
 'aboutpage' => 'Project:Awal ɣef...',
 'copyright' => 'Tzemreḍ ad twaliḍ ayen yella deg $1.',
+'copyrightpage' => '{{ns:project}}:Izerfanɣel',
 'currentevents' => 'Isallen',
 'currentevents-url' => 'Project:Isallen',
 'disclaimers' => 'Iɣtalen',
@@ -253,6 +272,8 @@ $messages = array(
 'youhavenewmessagesmulti' => 'Tesɛiḍ iznan imaynuten deg $1',
 'editsection' => 'beddel',
 'editold' => 'beddel',
+'viewsourceold' => 'ẓeṛ aɣbalu',
+'editlink' => 'beddel',
 'viewsourcelink' => 'ẓeṛ aɣbalu',
 'editsectionhint' => 'Beddel amur: $1',
 'toc' => 'Agbur',
@@ -263,13 +284,15 @@ $messages = array(
 'restorelink' => '{{PLURAL:$1|Yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}',
 'feedlinks' => 'Asuddem:',
 'feed-invalid' => 'Anaw n usuddem mačči ṣaḥiḥ.',
+'site-atom-feed' => 'Taneflit Atom n $1',
+'page-atom-feed' => 'Taneflit Atom n "$1"',
 'red-link-title' => '$1 (ulac asebter)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Amagrad',
 'nstab-user' => 'Asebter n wemseqdac',
 'nstab-media' => 'Asebter n media',
-'nstab-special' => 'Uslig',
+'nstab-special' => 'Asebter uslig',
 'nstab-project' => 'Awal ɣef...',
 'nstab-image' => 'Afaylu',
 'nstab-mediawiki' => 'Izen',
@@ -303,6 +326,13 @@ MySQL yerra-d agul "$3: $4"',
 'readonlytext' => 'Database d tamsekkert, ahat tettuseggem, qrib ad tuɣal-d.
 
 Win (anedbal) isekker-itt yenna-d: $1',
+'missing-article' => 'Taffa n isefka ur t-ufa ara aḍris n yiwen usebter ilaq at af, s-isem « $1 » $2.
+
+Umata, wagi yeḍra mi neḍfeṛ azday ɣer yiwen diff aqbur naɣ ɣer amazray n usebter yemḥan.
+
+Ma mačči d-tajṛut agi, ihi d-taniwit deg uhil.
+Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem URL n uzday.',
+'missingarticle-rev' => '(uṭṭun n lqem : $1)',
 'readonly_lag' => 'Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen',
 'internalerror' => 'Agul zdaxel',
 'filecopyerror' => 'Ur yezmir ara ad yexdem alsaru n ufaylu "$1" ar "$2".',
@@ -340,7 +370,7 @@ Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{
 'yourname' => 'Isem n wemseqdac',
 'yourpassword' => 'Awal n tbaḍnit',
 'yourpasswordagain' => 'Ɛiwed ssekcem awal n tbaḍnit',
-'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
 'yourdomainname' => 'Taɣult inek',
 'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.',
 'login' => 'Kcem',
@@ -350,11 +380,12 @@ Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{
 'logout' => 'Ffeɣ',
 'userlogout' => 'Ffeɣ',
 'notloggedin' => 'Ur tekcimeḍ ara',
-'nologin' => "Ur tesɛiḍ ara isem n wemseqdac? '''$1'''.",
+'nologin' => "Ur tesɛiḍ ara isem n umseqdac? '''$1'''.",
 'nologinlink' => 'Xleq isem n wemseqdac',
 'createaccount' => 'Xleq isem n wemseqdac',
 'gotaccount' => "Tesɛiḍ yagi isem n wemseqdac? '''$1'''.",
 'gotaccountlink' => 'Kcem',
+'userlogin-resetlink' => 'Ettuḍ tilɣa n tuqqna ?',
 'createaccountmail' => 's e-mail',
 'badretype' => 'Awal n tbaḍnit amezwaru d wis sin mačči d kif-kif.',
 'userexists' => 'Isem n wemseqdac yeddem-as amdan wayeḍ. Fren yiwen nniḍen.',
@@ -469,6 +500,9 @@ Akken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar
 Ma tɣelṭeḍ, wekki kan ɣef tqeffalt "Back/Précédent" n browser/explorateur inek.',
 'anontalkpagetext' => "----''Wagi d asebter n umyennan n wemseqdac adrig. Ihi, yessef ad as nefk ID, nesseqdac tansa IP ines akken a t-neɛqel. Tansa IP nni ahat tettuseqdac sɣur aṭṭas n yimdanen. Lukan ula d kečč aqla-k amseqdac adrig u ur tebɣiḍ ara ad tettwabcreḍ izen am wigini, ihi [[Special:UserLogin|xleq isem n wemseqdac neɣ kcem]].''",
 'noarticletext' => 'Ulac aḍris deg usebter-agi, tzemreḍ ad [[Special:Search/{{PAGENAME}}|tnadiḍ ɣef wezwel n usebter-agi]] deg isebtar wiyaḍ neɣ [{{fullurl:{{FULLPAGENAME}}|action=edit}} tettbeddileḍ asebter-agi].',
+'noarticletext-nopermission' => 'Imira ulac aḍris deg usebter agi.
+Tzemreḍ [[Special:Search/{{PAGENAME}}|ad nadiḍ ɣef azwel agi]] deg isebtaren nniḍen,
+naɣ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAMEE}}}} ad nadiḍ deg iɣmisen iqqenen]</span>.',
 'clearyourcache' => "'''Tamawt:''' Beɛd asmekti, ahat yessefk ad temḥuḍ lkac n browser/explorateur inek akken teẓriḍ ibeddlen. '''Mozilla / Firefox / Safari:''' qqim twekkiḍ ''Shift'' u wekki ɣef ''Reload/Recharger'', neɣ wekki ɣef ''Ctrl-Shift-R'' (''Cmd-Shift-R'' deg Apple Mac); '''IE:''' qqim twekkiḍ ɣef ''Ctrl'' u wekki ɣef ''Refresh/Actualiser'', neɣ wekki ɣef ''Ctrl-F5''; '''Konqueror:''': wekki kan ɣef taqeffalt ''Reload'', neɣ wekki ɣef ''F5''; '''Opera''' yessefk ad tesseqdceḍ ''Tools→Preferences/Outils→Préférences'' akken ad temḥud akk lkac.",
 'usercssyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ CSS amynut inek uqbel ad tesmektiḍ.",
 'userjsyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ JS amynut inek uqbel ad tesmektiḍ.",
@@ -477,7 +511,10 @@ Ma tɣelṭeḍ, wekki kan ɣef tqeffalt "Back/Précédent" n browser/explorateu
 'userinvalidcssjstitle' => '\'\'\'Aɣtal:\'\'\' Aglim "$1" ulac-it. Ur tettuḍ ara belli isebtar ".css" d ".js" i txedmeḍ sseqdacen azwel i yesɛan isekkilen imecṭuḥen, s umedya: {{ns:user}}:Foo/vector.css akk d {{ns:user}}:Foo/Vector.css.',
 'updated' => '(Yettubeddel)',
 'note' => "'''Tamawt:'''",
-'previewnote' => "'''Tagi d pre-timeẓriwt kan, ibeddlen mazal ur ttusmektin ara!'''",
+'previewnote' => "'''Ttagi d azar-timeẓriwt kan, ibeddlen mazal ur ttusmektin ara!'''
+
+'''Cfut, ttagi d azar-timeẓriwt kan.'''
+Ibeddlen mazal ur ttusmektin ara!",
 'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
 'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
 G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
@@ -514,15 +551,27 @@ deg afaylu nniḍen akken tesseqdceḍ-it umbeɛd.'''",
 'protectedpagewarning' => "'''AƔTAL:  Asebter-agi yettwaḥrez, ala inedbalen zemren a t-beddlen'''",
 'semiprotectedpagewarning' => "'''Tamawt:''' Asebter-agi yettwaḥrez, ala imseqdacen i yesɛan isem n wemseqdac zemren a t-beddlen.",
 'cascadeprotectedwarning' => "'''Aɣtal:''' Asebter-agi iɛekkel iwakken ad zemren ala inedbalen a t-beddlen, axaṭer yettwassekcem deg isebtar i yettwaḥerzen agi (acercur):",
-'templatesused' => 'Talɣiwin ttuseqdacen deg usebter-agi:',
+'templatesused' => '{{PLURAL:$1|Talɣa i seqdacen|Tilɣatin i seqdacen}} deg usebter agi :',
 'templatesusedpreview' => 'Talɣiwin ttuseqdacen deg pre-timeẓriwt-agi:',
 'templatesusedsection' => 'Talɣiwin ttuseqdacen deg amur-agi:',
 'template-protected' => '(yettwaḥrez)',
 'template-semiprotected' => '(nnefṣ-yettwaḥrez)',
+'hiddencategories' => 'Asebter agi yella deg {{PLURAL:$1|Taggayt i ffren|Tiggayin i ffren}} agi :',
 'edittools' => '<!-- Aḍris yettbanen-d seddaw talɣa n ubeddil d uzen. -->',
 'nocreatetitle' => 'Axleq n isebtar meḥdud',
 'nocreatetext' => 'Adeg n internet agi iḥedded axleq n isebtar imaynuten.
 Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLogin|tkecmeḍ neɣ ad txelqeḍ isem n wemseqdac]].',
+'permissionserrorstext-withaction' => 'Ur sɛiḍ ara ttesriḥ af $2, i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
+'recreate-moveddeleted-warn' => "'''Ɣur-wet : asebter agi i tebɣam ad snulfum, yetwekkes uqbel.'''
+
+Ilaq ad snulfum asebter agi haca ma i xater. Aɣmis n isebtaren i twekkesen yella ddaw-agi :",
+'moveddeleted-notice' => 'Asebter agi yetwekkes. Aɣmis n isebtaren i twekkesen yella ddaw agi.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Ɣur-wet : Asebter agi yesɛa aṭas tilɣatin. Kra n tilɣatin ur zemrent ara ad seqdacent.',
+'post-expand-template-inclusion-category' => 'Isebtaren i sɛan aṭas tilɣatin',
+'post-expand-template-argument-warning' => "'''Ɣur-wet''' : Asebter agi yesɛa tuccḍa deg aɣewwar n yiwet talɣa.",
+'post-expand-template-argument-category' => 'Isebtaren i sɛan iɣewwaren n talɣa ur skazelen ara',
 
 # "Undo" feature
 'undo-success' => 'Tzemreḍ ad tessefsuḍ abeddil. Ssenqed asidmer akken ad tessneḍ ayen tebɣiḍ ad txdmeḍ d ṣṣeḥ, umbeɛd smekti ibeddlen u tkemmleḍ ad tessefsuḍ abeddil.',
@@ -536,6 +585,7 @@ Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLog
 'viewpagelogs' => 'Ẓer aɣmis n usebter-agi',
 'nohistory' => 'Ulac amezruy n yibeddlen i usebter-agi.',
 'currentrev' => 'Tasiwelt n tura',
+'currentrev-asof' => 'Azmez n lqem taneggarut d  $1',
 'revisionasof' => 'Tasiwelt n wass $1',
 'revision-info' => 'Tasiwelt n wass $1 sɣur $2',
 'previousrevision' => '←Tasiwelt taqdimt',
@@ -549,6 +599,8 @@ Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLog
 'histlegend' => 'Axtiri n umgerrad: rcem tankulin akken ad teẓreḍ imgerraden ger tisiwal u wekki ɣef enter/entrée neɣ ɣef taqeffalt deg ukessar.<br />
 Tabadut: (tura) = amgirred akk d tasiwelt n tura,
 (amgirred) = amgirred akk d tasiwelt ssabeq, M = abeddel afessas.',
+'history-fieldset-title' => 'Inig deg umazray',
+'history-show-deleted' => 'Ekkes kan',
 'histfirst' => 'Tikkin timezwura',
 'histlast' => 'Tikkin tineggura',
 'historysize' => '($1 bytes/octets)',
@@ -594,16 +646,23 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'revdelete-submit' => 'Eg-it i tasiwelt tettwafren',
 'revdelete-success' => "'''Asekkud n tasiwelt yettuxdem.'''",
 'logdelete-success' => "'''Asekkud n tamirt yettuxdem.'''",
+'revdel-restore' => 'beddel timezrit',
+'revdel-restore-deleted' => 'allas iqḍeεen',
+'revdel-restore-visible' => 'allas i nezmer an ẓeṛ',
+
+# Merge log
+'revertmerge' => 'Fru',
 
 # Diffs
-'difference' => '(Imgerraden ger tisiwal)',
+'history-title' => 'Amazray n allasen n "$1"',
 'lineno' => 'Ajerriḍ $1:',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
 'editundo' => 'ssefsu',
-'diff-multi' => '({{PLURAL:$1|Yiwen tasiwelt tabusarit|$1 n tisiwal tibusarin}} ur ttumlalent ara.)',
+'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
 
 # Search results
 'searchresults' => 'Igmad n unadi',
+'searchresults-title' => 'Igmad n unadi i "$1"',
 'searchresulttext' => 'Akken ad tessneḍ amek ara tnadiḍ deg {{SITENAME}}, ẓer [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => "Tnadiḍ ɣef '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Tnadiḍ ɣef '''$1'''",
@@ -613,15 +672,38 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'notextmatches' => 'ulac ayen yecban azwel n usebter',
 'prevn' => '{{PLURAL:$1|$1}} ssabeq',
 'nextn' => '{{PLURAL:$1|$1}} ameḍfir',
+'prevn-title' => '$1 {{PLURAL:$1|agmud n uqbel|igmad n uqbel}}',
+'nextn-title' => '$1 {{PLURAL:$1|agmud n sakin|igmad n sakin}}',
+'shown-title' => 'Beqqeḍ $1 {{PLURAL:$1|agmud|igmad}} s usebter',
 'viewprevnext' => 'Ẓer ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
+'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
 'searchhelp-url' => 'Help:Agbur',
+'searchprofile-articles' => 'Isebtaren n ugbur',
+'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
+'searchprofile-images' => 'Agetmedia',
+'searchprofile-everything' => 'Akk',
+'searchprofile-advanced' => 'Anadi anemhal',
+'searchprofile-articles-tooltip' => 'Nadi deg $1',
+'searchprofile-project-tooltip' => 'Nadi deg $1',
+'searchprofile-images-tooltip' => 'Nadi  ifuyla agetmedia',
+'searchprofile-everything-tooltip' => 'Nadi deg akk usmel (ula deg isebtaren n umyannan)',
+'searchprofile-advanced-tooltip' => 'Fren ideggen n isemawen i unadi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 awal|$2 awalen}})',
+'search-result-category-size' => '$1 {{PLURAL:$1|amseqdac|imseqdacen}} $2 ({{PLURAL:$2|adu-taggayt|adu-tiggayin}}, $3 {{PLURAL:$3|afaylu|ifuyla}})',
+'search-redirect' => '(asemmimeḍ $1)',
+'search-section' => '(tigezmi $1)',
+'search-suggest' => 'D awal $1 i tnadiḍ ?',
+'searchrelated' => 'ineqqes',
+'searchall' => 'akk',
 'showingresults' => "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
 'showingresultsnum' => "Tamuli n {{PLURAL:$3|'''Yiwen''' wegmud|'''$3''' n yigmad}} seg  #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Agmud '''$1'''|Igmad '''$1–$2'''}} n '''$3''' i '''$4'''",
 'nonefound' => "'''Tamawt''': S umata, asmi ur tufiḍ acemma
 d ilmen awalen am \"ala\" and \"seg\",
 awalen-agi mačči deg tasmult, neɣ tefkiḍ kter n yiwen n wawal (ala isebtar
 i yesɛan akk awalen i banen-d).",
+'search-nonefound' => 'Ulac igmad i usuter agi.',
 'powersearch' => 'Nadi',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
 
@@ -677,6 +759,7 @@ i yesɛan akk awalen i banen-d).",
 'badsig' => 'Azmul mačči d ṣaḥiḥ; Ssenqed tags n HTML.',
 'prefs-help-realname' => '* Isem n ṣṣeḥ (am tebɣiḍ): ma textareḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yura tikkin inek.',
 'prefs-help-email' => '* E-mail (am tebɣiḍ): Teǧǧi imseqdacen wiyaḍ a k-aznen email mebla ma ẓren tansa email inek.',
+'prefs-help-email-others' => 'Zemreḍ ad eǧǧeḍ wiyeḍ nniḍen ak(akem) cceqɛen izen deg usebter-ik (im) n umyannan war ad effekeḍ tamagit-ik (im).',
 
 # User rights
 'userrights' => 'Laɛej iserfan n wemseqdac',
@@ -704,15 +787,24 @@ i yesɛan akk awalen i banen-d).",
 'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
 'rightsnone' => '(ulaḥedd)',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'beddel asebter agi',
+
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
 'recentchanges' => 'Ibeddlen imaynuten',
-'recentchangestext' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
+'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
+'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
 'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
-'rcnote' => "Deg ukessar {{PLURAL:$1|yella '''yiwen''' ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|wass aneggaru|'''$2''' wussan ineggura}}, deg uzemz $3.",
+'recentchanges-label-newpage' => 'Abeddel agi ad yesnulfu asebter amaynut',
+'recentchanges-label-minor' => 'Wagi d-abeddel amectuḥ',
+'recentchanges-label-bot' => 'D-arubut id yeseqdacen abeddel agi',
+'recentchanges-label-unpatrolled' => 'Abeddel agi mazal yesɛa aselken.',
+'rcnote' => "Deg ukessar {{PLURAL:$1|yella '''yiwen''' ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|wass aneggaru|'''$2''' wussan ineggura}}, deg uzemz $5 ass n $4.",
 'rcnotefrom' => "Deg ukessar llan ibeddlen seg wasmi '''$2''' (ar '''$1''').",
 'rclistfrom' => 'Ssken ibeddlen imaynuten seg $1',
 'rcshowhideminor' => '$1 ibeddlen ifessasen',
+'rcshowhidebots' => '$1 irubuten',
 'rcshowhideliu' => '$1 n yimseqdacen i ikecmen',
 'rcshowhideanons' => '$1 n yimseqdacen udrigen',
 'rcshowhidepatr' => '$1 n yibeddlen yettwassenqden',
@@ -722,15 +814,24 @@ i yesɛan akk awalen i banen-d).",
 'hist' => 'Amezruy',
 'hide' => 'Ffer',
 'show' => 'Ssken',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 aɛessas/iɛessasen]',
 'rc_categories' => 'Ḥedded i taggayin (ferreq s "|")',
 'rc_categories_any' => 'Ulayɣer',
+'rc-enhanced-expand' => 'Ẓeṛ tilɣa (yeḥwaǧ JavaScript)',
+'rc-enhanced-hide' => 'Ffer tilɣa',
 
 # Recent changes linked
 'recentchangeslinked' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-feed' => 'Ibeddlen imaynuten n isebtar myezdin',
 'recentchangeslinked-toolbox' => 'Ibeddlen imaynuten n isebtar myezdin',
+'recentchangeslinked-title' => 'Tiḍefri n isebtaren iqqenen ar « $1 »',
 'recentchangeslinked-noresult' => 'Ulac abeddel deg isebtar myezdin deg tawala i textareḍ.',
+'recentchangeslinked-summary' => "Asebter uslig agi i sekned ibeddlen imaynuten ɣef isebtaren iqqenen. Isebtaren n [[Special:Watchlist|umuɣ n uḍfar]] llan s '''ufuyan'''.",
+'recentchangeslinked-page' => 'Isen n usebter :',
+'recentchangeslinked-to' => 'Beqqeḍ ibeddilen n isebtareb i sɛan azday ɣer asebter nni wala anemgal',
 
 # Upload
 'upload' => 'Azen afaylu',
@@ -822,12 +923,22 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 
 # File description page
 'file-anchor-link' => 'Afaylu',
+'filehist' => 'Amazray n tugna',
+'filehist-help' => 'Senned ɣef yiwen azmez d usrag iwakken ad ẓṛeḍ afaylu aken yella deg imir nni.',
+'filehist-revert' => 'Uɣal ar tasiwelt ssabeq',
 'filehist-current' => 'Lux a',
+'filehist-datetime' => 'Azmez/Asrag',
+'filehist-thumb' => 'Tugna tamecṭuḥt',
+'filehist-thumbtext' => 'Tugna tamectuḥt i lqem n $1',
 'filehist-user' => 'Amseqdac',
+'filehist-dimensions' => 'Iseggiwen',
+'filehist-comment' => 'Awennit',
 'imagelinks' => 'Izdayen',
-'linkstoimage' => 'isebtar-agi sɛan azday ar afaylu-agi',
+'linkstoimage' => '{{PLURAL:$1|Asebter agi teseqdac|$1 isebtaren agi teseqdacen}} afaylu agi :',
 'nolinkstoimage' => 'Ulaḥedd seg isebtar sɛan azday ar afaylu-agi.',
 'sharedupload' => 'Afaylu-yagi yettuseqdac sɣur wiki tiyaḍ.',
+'sharedupload-desc-here' => 'Afaylu agi yusad seg : $1. Ahat yeseqdec deg isenfaṛen nniḍen.
+Aglam-is ɣef [$2 asebter n aglam] ye beqqeḍ ddaw-agi.',
 'uploadnewversion-linktext' => 'tazneḍ tasiwelt tamaynut n ufaylu-yagi',
 
 # MIME search
@@ -898,7 +1009,7 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'mostcategories' => 'Isebtar i yesɛan aṭṭas taggayin',
 'mostimages' => 'Tugniwin myezdin aṭas',
 'mostrevisions' => 'Isebtar i yettubedlen aṭas',
-'prefixindex' => 'Akk isebtar s yisekkilen imezwura',
+'prefixindex' => 'Akk isebtaren s yisekkilen imezwura',
 'shortpages' => 'isebtar imecṭuḥen',
 'longpages' => 'Isebtar imeqqranen',
 'deadendpages' => 'isebtar mebla izdayen',
@@ -907,6 +1018,7 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'protectedpagestext' => 'isebtar-agi yettwaḥerzen seg ubeddel neɣ asemmimeḍ',
 'protectedpagesempty' => 'isebtar-agi ttwaḥerzen s imsektayen -agi.',
 'listusers' => 'Umuɣ n yimseqdacen',
+'usercreated' => '{{GENDER:$3|Yesnulfu-d}} ass n $1 ar $2',
 'newpages' => 'isebtar imaynuten',
 'newpages-username' => 'Isem n wemseqdac:',
 'ancientpages' => 'isebtar iqdimen',
@@ -916,6 +1028,8 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'unusedcategoriestext' => 'Taggayin-agi weǧden meɛna ulac isebtar neɣ taggayin i sseqdacen-iten.',
 'notargettitle' => 'Ulac nnican',
 'notargettext' => 'Ur textareḍ ara asebter d nnican neɣ asebter n wemseqdac d nnican.',
+'pager-newer-n' => '{{PLURAL:$1|amaynut|$1 imaynuten}}',
+'pager-older-n' => '{{PLURAL:$1|aqbur|$1 iqburen}}',
 
 # Book sources
 'booksources' => 'Iɣbula n yidlisen',
@@ -955,11 +1069,20 @@ Tzemreḍ ad textareḍ cwiṭ seg-sen ma tebɣiḍ.',
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
+# Special:LinkSearch
+'linksearch-line' => '$1 yeqqen seg $2',
+
 # Special:ListUsers
 'listusersfrom' => 'Ssken imseqdacen seg:',
 'listusers-submit' => 'Ssken',
 'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
 
+# Special:Log/newusers
+'newuserlogpage' => 'Aɣmis n isnulfan n  imiḍanen n imseqdacen',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(umuɣ n imseqdacen)',
+
 # E-mail user
 'mailnologin' => 'Ur yufi ḥedd (tansa)',
 'mailnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] u tesɛiḍ tansa e-mail ṭaṣhiḥt deg [[Special:Preferences|isemyifiyen]] inek
@@ -987,6 +1110,7 @@ deg « Expéditeur» n izen inek iwakken amseqdac-nni yezmer a k-yerr.',
 # Watchlist
 'watchlist' => 'Umuɣ n uɛessi inu',
 'mywatchlist' => 'Umuɣ n uɛessi inu',
+'watchlistfor2' => 'I $1 $2',
 'nowatchlist' => 'Umuɣ n uɛessi inek d ilem.',
 'watchlistanontext' => 'G leɛnaya-k $1 iwakken ad twalaḍ neɣ tbeddleḍ iferdas deg wumuɣ n uɛessi inek.',
 'watchnologin' => 'Ur tekcimeḍ ara',
@@ -1003,7 +1127,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'unwatchthispage' => 'Fakk aɛassi',
 'notanarticle' => 'Mačči d amagrad',
 'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
-'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtar}} mebla isebtar "amyannan".',
+'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
 'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
 'wlheader-showupdated' => "* Isebtar ttubeddlen segwasmi tkecmeḍ tikelt taneggarut ttbanen-d s '''uḍris aberbuz'''",
 'watchmethod-recent' => 'yessenqed ibeddlen imaynuten n isebtar i ttɛasseɣ',
@@ -1012,6 +1136,7 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'iteminvalidname' => "Agnu akk d uferdis '$1', isem mačči ṣaḥiḥ...",
 'wlnote' => "Deg ukessar {{PLURAL:$1|yella yiwen ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|saɛa taneggarut|'''$2''' swayeɛ tineggura}}.",
 'wlshowlast' => 'Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura',
+'watchlist-options' => 'Tifranin n umuɣ n uɛessi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ad iɛass...',
@@ -1058,6 +1183,7 @@ Tadhelt:
 'exblank' => 'asebter yella d ilem',
 'historywarning' => 'Aɣtal: Asebter i ara temḥuḍ yesɛa amezruy:',
 'actioncomplete' => 'Axdam yekfa',
+'actionfailed' => 'Tigawt agi texser',
 'deletedtext' => '"$1" yettumḥa.
 Ẓer $2 i aɣmis n yimḥayin imaynuten.',
 'dellogpage' => 'Aɣmis n umḥay',
@@ -1067,6 +1193,7 @@ Tadhelt:
 'deletecomment' => 'Ayɣer',
 
 # Rollback
+'rollbacklink' => 'semmet',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
@@ -1095,6 +1222,8 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Undelete
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
+'undeletelink' => 'ẓeṛ/uɣaled',
+'undeleteviewlink' => 'ẓeṛ',
 'undeletecomment' => 'Awennit:',
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
@@ -1109,42 +1238,63 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 
 # Contributions
 'contributions' => 'Tikkin n wemseqdac',
+'contributions-title' => 'Umuɣ n tikkin n umseqdac $1',
 'mycontris' => 'Tikkin inu',
 'contribsub2' => 'n $1 ($2)',
 'nocontribs' => 'Ur yufi ara abddel i tebɣiḍ.',
 'uctop' => '(taneggarut)',
+'month' => 'Seg uggur (d wid uqbel) :',
+'year' => 'Seg useggwas (d wid uqbel) :',
 
 'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
 'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
 'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
+'sp-contributions-uploads' => 'izdamen',
+'sp-contributions-logs' => 'iɣmisen',
 'sp-contributions-talk' => 'Mmeslay',
-'sp-contributions-userrights' => 'Laɛej iserfan n wemseqdac',
+'sp-contributions-userrights' => 'Laɛej iserfan n umseqdac',
 'sp-contributions-search' => 'Nadi i tikkin',
 'sp-contributions-username' => 'Tansa IP neɣ isem n wemseqdac:',
+'sp-contributions-toponly' => 'Sekned kan imagraden i beddeleɣ nekk d-aneggaru',
 'sp-contributions-submit' => 'Nadi',
 
 # What links here
 'whatlinkshere' => 'Ayen i d-yettawi ɣer da',
+'whatlinkshere-title' => 'Isebtaren i sɛan azday ɣer « $1 »',
+'whatlinkshere-page' => 'Asebter :',
 'linkshere' => "Isebtar-agi sɛan azday ɣer '''[[:$1]]''':",
 'nolinkshere' => "Ulac asebter i yesɛan azday ɣer '''[[:$1]]'''.",
 'nolinkshere-ns' => "Ulac asebter i yesɛan azday ɣer '''[[:$1]]''' deg yisem n taɣult i textareḍ.",
 'isredirect' => 'Asebter n usemmimeḍ',
 'istemplate' => 'asekcam',
+'isimage' => 'azday ɣer afaylu',
 'whatlinkshere-prev' => '{{PLURAL:$1|ssabeq|$1 ssabeq}}',
 'whatlinkshere-next' => '{{PLURAL:$1|ameḍfir|$1 imeḍfiren}}',
 'whatlinkshere-links' => '← izdayen',
+'whatlinkshere-hideredirs' => '$1 aceggeε ɣer',
+'whatlinkshere-hidetrans' => '$1 aseddu',
+'whatlinkshere-hidelinks' => '$1 izdayen',
+'whatlinkshere-hideimages' => '$1 tugniwin i qqenen',
+'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
 'blockip' => 'Ɛekkel amseqdac',
 'ipadressorusername' => 'Tansa IP neɣ isem n wemseqdac',
 'ipbreason' => 'Ayɣer',
 'ipbsubmit' => 'Ɛekkel amseqdac-agi',
+'ipboptions' => '2 isragen:2 hours,1 ass:1 day,3 ussan:3 days,1 imalas:1 week,2  imulas:2 weeks,1 aggur:1 month,3 igguren:3 months,6 igguren:6 months,1 aseggwas:1 year,afdi:infinite',
 'ipbotheroption' => 'nniḍen',
 'badipaddress' => 'Tansa IP mačči d ṣaḥiḥ',
+'ipblocklist' => 'imseqdacen isewḥelen',
 'ipblocklist-submit' => 'Nadi',
 'blocklink' => 'ɛekkel',
+'unblocklink' => 'ekkes asewḥel',
+'change-blocklink' => 'beddel asewḥel',
 'contribslink' => 'tikkin',
+'blocklogpage' => 'Aɣmis n isewḥelen',
+'blocklogentry' => 'yesewḥel [[$1]] ; alama : $2 $3',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
+'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
 'proxyblocksuccess' => 'D ayen.',
 'sorbsreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy" deg DNSBL yettuseqdac da.',
@@ -1209,6 +1359,7 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'allmessagestext' => 'Wagi d umuɣ n izen n system i yellan deg yisem n taɣult.
 Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''\$wgUseDatabaseMessages''' yettwakkes.",
+'allmessages-language' => 'Tutlayt :',
 
 # Thumbnails
 'thumbnail-more' => 'Ssemɣer',
@@ -1243,9 +1394,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'import-logentry-interwiki-detail' => '$1 tasiwelt(tisiwal) seg $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Asebter n wemseqdac inu',
+'tooltip-pt-userpage' => 'Asebter n umseqdac inu',
 'tooltip-pt-anonuserpage' => 'Asebter n wemseqdac n IP wukud tekkiḍ',
-'tooltip-pt-mytalk' => 'Asebter n wemyannan inu',
+'tooltip-pt-mytalk' => 'Asebter n umyannan inu',
 'tooltip-pt-anontalk' => 'Amyannan ɣef yibeddlen n tansa ip-yagi',
 'tooltip-pt-preferences' => 'Isemyifiyen inu',
 'tooltip-pt-watchlist' => 'Umuɣ n uɛessi n isebtar i ttɛessaɣ',
@@ -1265,9 +1416,11 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-ca-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inek',
 'tooltip-ca-unwatch' => 'Kkes asebter-agi seg wumuɣ n uɛessi inek',
 'tooltip-search' => 'Nadi {{SITENAME}}',
+'tooltip-search-go' => 'Ṛuḥ ɣer usebter i sɛan isem agi ma yella.',
 'tooltip-search-fulltext' => 'Nadi isebtar i sɛan aḍris agi',
 'tooltip-p-logo' => 'Asebter amenzawi',
 'tooltip-n-mainpage' => 'Ẓer asebter amenzawi',
+'tooltip-n-mainpage-description' => 'Rzu asebter amenzawi',
 'tooltip-n-portal' => 'Ɣef usenfar, ayen tzemrḍ ad txedmeḍ, anda tafeḍ tiɣawsiwin',
 'tooltip-n-currentevents' => 'Af ayen yeḍran tura',
 'tooltip-n-recentchanges' => 'Umuɣ n yibeddlen imaynuten deg wiki.',
@@ -1281,6 +1434,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-t-emailuser' => 'Azen e-mail i wemseqdac-agi',
 'tooltip-t-upload' => 'Azen ifuyla',
 'tooltip-t-specialpages' => 'Umuɣ n akk isebtar usligen',
+'tooltip-t-print' => 'Lqem tasiggezt n usebter agi',
+'tooltip-t-permalink' => 'Azday ameɣlal ɣer lqem agi n usebter',
 'tooltip-ca-nstab-main' => 'Ẓer ayen yellan deg usebter',
 'tooltip-ca-nstab-user' => 'Ẓer asebter n wemseqdac',
 'tooltip-ca-nstab-media' => 'Ẓer asebter n media',
@@ -1298,6 +1453,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-compareselectedversions' => 'Ẓer amgirred ger snat tisiwlini (i textareḍ) n usebter-agi.',
 'tooltip-watch' => 'Rnu asebter-agi i wumuɣ n uɛessi inu',
 'tooltip-recreate' => 'Ɛiwed xleq asebter ɣas akken yettumḥu',
+'tooltip-rollback' => '« Semmet » yesemmet s-yiwen asenned akk d-acu amseqdac aneggaru yebeddel deg usebter',
+'tooltip-undo' => '« Ssefsu » yesemmet abeddel agi dɣa i ldi asfaylu n ubeddel deg uskar n azaraskan. I ɛemmed an uɣal ar lqem n uqbel dɣa an rnu taɣẓint deg tanaka n ugzul.',
+'tooltip-summary' => 'Sekcem agzul awezzlan',
 
 # Attribution
 'anonymous' => 'Amseqdac udrig (Imseqdacen udrigen) n {{SITENAME}}',
@@ -1344,6 +1502,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
 'file-nohires' => 'Ulac resolution i tameqqrant fell-as.',
+'svg-long-desc' => 'Afaylu SVG, tabadut n $1 × $2 pixel, lqedd : $3',
 'show-big-image' => 'Resolution tameqqrant',
 
 # Special:NewFiles
@@ -1360,6 +1519,24 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 Ala umuɣen n ismiwar (i bdun s *) ddemen s amiḍan. Azday amezwaru n ujerriḍ ilaq ad yilli win n tugna icmeten.
 Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna tezmer at illi.',
 
+# Metadata
+'metadata' => 'Adferisefka',
+'metadata-help' => 'Afaylu agi, yesɛa tilɣa tisutay, ahat d-tamsaknewt id ernan tilɣa agi. Ma afaylu yebeddel seg addad-is amezwaru, ahat kra n tilɣa ur zemrent ara ad illint d-timekdant s-ufaylu amiran.',
+'metadata-fields' => 'Urtan n adferisefka n tugniwin yellan deg umuɣ n izen agi, ad seddun deg usebter n aglam n tugna mi ṭabla n adferisefka at illi tesemẓi. Urtan nniḍen ad illin ffren m-ulac.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
 # EXIF tags
 'exif-imagewidth' => 'Tehri',
 
@@ -1485,10 +1662,27 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'watchlisttools-edit' => 'Ẓer u beddel umuɣ n uɛessi',
 'watchlisttools-raw' => 'Beddel umuɣ n uɛessi (raw)',
 
+# Core parser functions
+'duplicate-defaultsort' => 'Ɣur-wet : tasarut n ufran m-ulac « $2 » atsefεej tasarut n uqbel « $1 ».',
+
 # Special:Version
 'version' => 'Tasiwelt',
+'version-specialpages' => 'isebtar usligen',
 
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
 
+# External image whitelist
+'external_image_whitelist' => ' #Eǧǧ ajeṛṛiḍ agi aken yella.<pre>
+#Inid tifersa n tinfaliyin timeɣẓanin (ala tama yellan gar //) ddaw-agi.
+#Ad qqenen s URL n tugniwin timniriyin.
+#Tid i qqenen ad beqqeḍent am tugniwin, m-ulac ad i beqqeḍ kan azday ɣer tugna.
+#Ijeṛṛiḍen i bdun s yiwen # ad ilin εqelen am iwenniten.
+#Umuɣ agi ur yeseqdac ara aselken n isekkilen.
+
+#Ger akk tifersa n tinfaliyin timeɣẓanin nnig ajeṛṛiḍ  agi. Eǧǧ ajeṛṛiḍ agi aken yella.</pre>',
+
+# Special:Tags
+'tag-filter' => 'Astay n [[Special:Tags|ticraḍ]] :',
+
 );
index dc20444..04f8a7c 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'ТехьэпIэхэр щIэтхъэн:',
-'tog-justify' => 'БгъуагъкIэ напэкIуэцIыр зэгъэзэхуэн',
-'tog-hideminor' => 'ГъэпщкIун: кIуэдкIэ зыхэмылэжьыхьа, щIэуэ яхъуэжа тхылъым',
-'tog-hidepatrolled' => 'ГъэпшкIун гъэтэрэзыгъуэ щIэлъыплъахэм я тхылъ гъэтэрэзыгъуэщIэхэр',
-'tog-newpageshidepatrolled' => 'Ð\93Ñ\8aÑ\8dпÑ\88кIÑ\83н Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86I Ñ\89\8dлÑ\8aÑ\8bплÑ\8aаÑ\85Ñ\8dм Ñ\8f Ñ\82Ñ\85Ñ\8bлÑ\8a Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86I-Ñ\89\8dÑ\85Ñ\8dÑ\80',
+'tog-underline' => 'ТехьэпӀэхэр щӀэтхъэн:',
+'tog-justify' => 'БгъуагъкӀэ напэкӀуэцӀыр зэгъэзэхуэн',
+'tog-hideminor' => 'Гъэтэрэзыгъуэ цӀыкӀухэр гъэпшкӀун, щӀэуэ яхъуэжахэм я тхылъым',
+'tog-hidepatrolled' => 'Гъэтэрэзыгъуэ зыщӀэлъыплъахэр гъэпшкӀун, щӀэуэ яхъуэжахэм я тхылъым',
+'tog-newpageshidepatrolled' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80 Ð·Ñ\8bÑ\89Ó\80Ñ\8dлÑ\8aÑ\8bплÑ\8aаÑ\85Ñ\8dÑ\80 Ð³Ñ\8aÑ\8dпÑ\88кÓ\80Ñ\83н, Ð½Ð°Ð¿Ñ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80 Ñ\89Ó\80Ñ\8dÑ\85Ñ\8dм Ñ\8f Ñ\82Ñ\85Ñ\8bлÑ\8aÑ\8bм',
 'tog-extendwatchlist' => 'ЩӀэлъыплъыгъуэм и тхылъышхуэ, яужырэй къуэдейхэм нэмыщӀу зэхъуэкӀыгъуэ псори хэту',
 'tog-usenewrc' => 'Гъэтэрэзыгъуэ щӀэхэм я тхылъ нэхъыфӀыр къэгъэсэбэпын (JavaScript хуэныкъуэ)',
 'tog-numberheadings' => 'Псалъащхьэхэм автоматику номер ятын',
@@ -143,6 +143,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(кӀэлъыкуэгъуэ)',
 'index-category' => 'Индекс зырат напэкӀуэцӀхэр',
 'noindex-category' => 'НапэкӀуэцӀ индекс зыхуэмыныкуъэхэр',
+'broken-file-category' => 'Файл техьэпӀэхэр здэмылажэ напэкӀуэцӀхэр',
 
 'about' => 'И гугъу',
 'article' => 'Тхыгъэ',
@@ -199,7 +200,7 @@ $messages = array(
 'print' => 'КъыдэгъэкӀын',
 'view' => 'Еплъын',
 'edit' => 'Гъэтэрэзын',
-'create' => 'ЩIын',
+'create' => 'ЩӀын',
 'editthispage' => 'Мы напэкIуэцIыр гъэтэрэзын',
 'create-this-page' => 'Мыбы и напэкӀуэцӀ щӀын',
 'delete' => 'Ихын',
@@ -225,7 +226,7 @@ $messages = array(
 'projectpage' => 'Проэктым и напэкӀуэцӀым еплъын',
 'imagepage' => 'Файлым и напэкIуэцIым еплъын',
 'mediawikipage' => 'Тхыгъэм и напэкIуэцIым еплъын',
-'templatepage' => 'ШаблонÑ\8bм Ð¸ Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86\8bм Ñ\85Ñ\8dплÑ\8aÑ\8dн',
+'templatepage' => 'ЩапÑ\85Ñ\8aÑ\8dм Ð¸ Ð½Ð°Ð¿Ñ\8dкIÑ\83Ñ\8dÑ\86\8bм ÐµÐ¿Ð»Ñ\8aÑ\8bн',
 'viewhelppage' => 'ЩIэупщIэм и напэкIуэцI',
 'categorypage' => 'Категорием и напэкIуэцIым хэплъэн',
 'viewtalkpage' => 'Тепсэлъыхьыгъуэм еплъын',
@@ -302,6 +303,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' => 'Тхыгъэ',
@@ -309,9 +312,9 @@ $1',
 'nstab-media' => 'Медиэ напэкӀуэцӀ',
 'nstab-special' => 'Лэжыгъэ напэкӀуэцӀ',
 'nstab-project' => 'Проэктым теухуауэ',
-'nstab-image' => 'Файл',
+'nstab-image' => 'ТеплÑ\8aÑ\8d',
 'nstab-mediawiki' => 'Тхыгъэ',
-'nstab-template' => 'Шаблон',
+'nstab-template' => 'ЩапÑ\85Ñ\8aÑ\8d',
 'nstab-help' => 'ДэIэпыкъуэгъу',
 'nstab-category' => 'Категориэ',
 
@@ -367,6 +370,7 @@ $1',
 'badarticleerror' => 'А лэжьыгъэр мы напэкӀуэцӀым егъэкӀуэкӀыфынукъым.',
 'cannotdelete' => 'НапэкӀуэцӀыр иэ файл «$1»-р ихыфкъым.
 НэмыщӀ гуэрэм ирихагъэнкӀ хъун.',
+'cannotdelete-title' => 'НапэкӀуэцӀ «$1» ипх хъунукъым',
 'badtitle' => 'ЦӀэр хъунукъым',
 'badtitletext' => 'УзщӀэупщӀэ напэкӀуэцӀым и цӀэр тэрэзкъым, нэщӀ, мытэрэзу интервикир иэ бзэ-зэхуэкур щытщ. И цӀэм дэмыгъэ емыкӀуэалъэ хэтынкӀи хъун.',
 'perfcached' => 'Мы Ӏохугъуэхэр кэшым къыхахэ, яужырей зэхъуэкӀыгъуэхэр химыубыдэнкӀи мэхъу. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -377,11 +381,13 @@ $1',
 Функциэ: $1<br />
 ЩӀэлъэуэгъуэ: $2',
 'viewsource' => 'Хэплъэн',
+'viewsource-title' => 'НапэкӀуэцӀ $1 и япэрей тхыгъэ щытыкӀэм ухуоплъэщ',
 'actionthrottled' => 'ЩӀэхыгъэм убыдыгъэ иӀэ',
 'actionthrottledtext' => 'Анти-спамым пэщытыным шъхьэкӀэ, зэманыгъуэ кӀэщӀым уигугъэр куэду и къэгъэсэбэпыныр теубыдауэ щытщ. 
 Дэкъикъэ зытӀущ тегъэкӀи, иджыри зэ щӀыж.',
 'protectedpagetext' => 'Мы напэкӀуэцӀыр и гъэтэрэзыным теубыдауэ щытщ',
 'viewsourcetext' => 'Мы напэкӀуэцӀым и нэхъыщхьэ тхылъыр мыбдежьым уэплъыфыну, и копиэри ипхыфыну:',
+'viewyourtext' => "Мы напэкӀуэцӀым '''уи гъэтэрызыгъуэхэм''' я тхылъым уеплъыфынущ, тхылъым и копиэри пщӀыфынущ:",
 'protectedinterface' => 'Мы напэкӀуэцӀым интерфейс тхылъ хэтщ, программэтыныгъэм еуэ. Хьэуэйн имыӀэн щхьэкӀэ, и гъэтэрэзыныр теубыдауэ щытщ.',
 'editinginterface' => "'''Гу лъытэ:''' Бгъэтэрэз напэкӀуэцӀым интерфэйс тхылъ хэтщ, программэтыгъэм еуэ.
 И зэхъуэкӀыгъуэм интерфэйсым и сурэтым хэуэну адрей цӀыхухэтхэм щхьэкӀэ.
@@ -533,8 +539,8 @@ $2',
 'headline_tip' => 'ТІуанэ щхьэгъэ псалъащхьэ',
 'nowiki_sample' => 'Формациэ мыщӀа тхыгъэр мыбдеж игъэувэ',
 'nowiki_tip' => 'Вики-форматыр Iухын',
-'image_tip' => 'Файл кӀуэцӀылъу',
-'media_tip' => 'ФайлÑ\8bм и техьэпӀэ',
+'image_tip' => 'ТеплÑ\8aÑ\8d кӀуэцӀылъу',
+'media_tip' => 'ТеплÑ\8aÑ\8dм и техьэпӀэ',
 'sig_tip' => 'Уи ӀэпэщӀэдзымрэ зэман щытехуэмрэ',
 'hr_tip' => 'ЩӀэтхъэгъуэ щӀыхь (куэдрэ къэвмыгъэмэбэп)',
 
@@ -613,10 +619,10 @@ $2',
 'blocked-notice-logextract' => 'Мы цӀыхухэтыр иджыпсту теубыдауэ щытщ.
 ИщӀагъымкӀэ теубыдыгъэ тхылъым и яужырей итхэгъуэр гъэлъэгъуа:',
 'clearyourcache' => "'''Къэохугъуэ:'''Итха яуж зэхъуэкӀыгъу хъуар къэнэн щхьэкӀэ, уи браузэрым и кэшыр гъэкъэбзэн хуэй: '''Mozilla / Firefox''': ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari''': ''Cmd+Shift+R'', '''Konqueror''': ''F5'', '''Opera''': ''Tools→Preferences''-мкӀэ уикӀын хуэй.",
-'usercssyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и CSS-Ñ\84айлÑ\8bм еплъын щхьэкӀэ итхэным ипэкӀэ.",
-'userjsyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и JS-Ñ\84айл щӀэм еплъыным щхьэкӀэ итхэным ипэкӀэ.",
-'usercsspreview' => 'Уигу игъэлъ, мыр иджыри уи CSS-файлым и пыухыкӀа еплъыгъуэкъым , ар иджыри хъумакъым.',
-'userjspreview' => "'''Ð\97Ñ\8bÑ\89Ñ\83мгÑ\8aÑ\8dгÑ\8aÑ\83пÑ\88Ñ\8d, Ð¼Ñ\8bÑ\80 Ñ\8fпÑ\8d-еплÑ\8a ÐºÑ\8aÑ\83Ñ\8dдей Ñ\83и javascript-Ñ\84айлÑ\8bм, иджыри итхауэ щыткъым!'''",
+'usercssyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и CSS-Ñ\82еплÑ\8aÑ\8dм еплъын щхьэкӀэ итхэным ипэкӀэ.",
+'userjsyoucanpreview' => "'''Ð\94Ñ\8dÓ\80Ñ\8dпÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83 Ð¿Ñ\81алÑ\8aÑ\8d.''' Ð¢ÐµÐºÑ\8aÑ\83зÑ\8d Â«{{int:showpreview}}» Ñ\83и JS-Ñ\82еплÑ\8aÑ\8d щӀэм еплъыным щхьэкӀэ итхэным ипэкӀэ.",
+'usercsspreview' => "'''Гу лъытэ, мыр япэ-еплъ къуэдейщ уи CSS-теплъэм, иджыри итхауэ щыткъым!'''",
+'userjspreview' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d, Ð¼Ñ\8bÑ\80 Ñ\8fпÑ\8d-еплÑ\8a ÐºÑ\8aÑ\83Ñ\8dдейÑ\89 Ñ\83и javascript-Ñ\82еплÑ\8aÑ\8dм, иджыри итхауэ щыткъым!'''",
 'sitecsspreview' => "'''Зыщумгъэгъупшэ, мыр япэ-еплъ къуэдеуэ щытщ мы CSS-м.'''
 '''Иджыри итхауэ щыткъым!'''",
 'sitejspreview' => "'''Зыщумгъэгъупшэ, мыр япэ-еплъ къуэдеуэ щытщ мы JavaScript-кодым.'''
@@ -625,6 +631,7 @@ $2',
 'updated' => '(КъэгъэщӀырыщӀащ)',
 'note' => "'''Гулъытыгъуэ:'''",
 'previewnote' => "'''Мыр япэ-еплъ къуэдей, тхылъыр иджыри итхакъым!'''",
+'continue-editing' => 'Гъэтэрэзыгъуэм тегъэзэжьын',
 'previewconflict' => 'Мы япэ-еплъым тхылъыр редакторым и ищхьэ лъэныкъуэм дежь егъэлъыгъуэ зэрщытыным хуэду, иптхэн уигугъэ хъумэ.',
 'session_fail_preview' => "'''Хэукъуэгъуэ къыхэкӀа, серверым у гъэтэрэзыгъуэр къиштэфакъым сессиэм и идентификациэр фӀэкӀуэдри.
 Иджыри зэ щӀыжьи еплъ.
@@ -675,9 +682,9 @@ $2',
 'cascadeprotectedwarning' => "'''Гу лъытэ:''' Мы напэкӀуэцӀыр згъэтэрэзыфынухэр «Тхьэмадэхэр» щыщ гупым хэтхэра, {{PLURAL:$1|напэкӀуэцӀ къыкӀэлъыкӀуэм щхьэкӀэ|напэкӀуэцӀ къыкӀэлъыкӀуэхэм щхьэкӀэ}} каскад хъунэныгъэ зэрателъым теухуауэ:",
 'titleprotectedwarning' => "'''Гу лъытэ. Мы напэкӀуэцӀыр зэхъуэкӀыныгъэхэм щхьэкӀэ ятеубыдауэ щытщ, зэзхъуэкӀыфынухэр [[Special:ListGroupRights|абым теухуа пӀалъэ]] зиӀэ цӀыхухэтхэм.''' 
 ИщӀагъымкӀэ тхыдэтхылъым и яужырей тхыгъэр итщ:",
-'templatesused' => '{{PLURAL:$1|Шаблон|Шаблонхэр}} напэкӀуэцӀым и версиэ екӀуэкӀым хэтхэр:',
-'templatesusedpreview' => '{{PLURAL:$1|Шаблон|Шаблонхэр}} напэкӀуэцӀым и япэ-еплъым хэтхэр:',
-'templatesusedsection' => 'Ð\9cÑ\8b Ð»Ñ\8aÑ\8dнÑ\8bкÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83м {{PLURAL:$1|Шаблон ÐºÑ\8aагÑ\8aÑ\8dÑ\89Ñ\85Ñ\8cÑ\8dпаÑ\80|Шаблон ÐºÑ\8aагъэщхьэпахэр}}:',
+'templatesused' => 'НапэкӀуэцӀым и версиэ екӀуэкӀым {{PLURAL:$1|щапхъэ|щапхъэ}} хэтхахэр:',
+'templatesusedpreview' => 'НапэкӀуэцӀым и япэ-еплъым {{PLURAL:$1|щапхъэ|щапхъэ}} хэтхахэр:',
+'templatesusedsection' => 'Ð\9cÑ\8b ÐºÑ\8aÑ\83дамÑ\8dм {{PLURAL:$1|Ñ\89апÑ\85Ñ\8aÑ\8d ÐºÑ\8aÑ\8dгÑ\8aÑ\8dÑ\89Ñ\85Ñ\8cÑ\8dпаÑ\80\89апÑ\85Ñ\8aÑ\8d ÐºÑ\8aÑ\8dгъэщхьэпахэр}}:',
 'template-protected' => '(теубыдащ)',
 'template-semiprotected' => '(иныкъуэр теубыдащ)',
 'hiddencategories' => 'Мы напэкӀуэцӀыр зхэхьэр $1 {{PLURAL:$1|1 категориэ зэхуэща|$1 категориэ зэхуэщахэр}}:',
@@ -705,21 +712,28 @@ $2',
 'edit-no-change' => 'Уи гъэтэрэзыгъуэр хахыжащ, тхыгъэм зэхъуэкӀыгъуэ зэрхэмыхьэм щхьэкӀэ.',
 'edit-already-exists' => 'НапэкӀуэцӀыщӀэ щӀыфынукъым.
 ЩыӀэщ апхуэдэ.',
+'defaultmessagetext' => 'КъыхигъэкӀа тхыгъэхэр',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Гу лъытэ. Мы напэкӀуэцӀым ресурсышхуэ хэзылъхьэ функциэ куэд хэлъщ.
 
 Хэлъхьэгъуэ хэтыфынур здынэгъэсар $2 {{PLURAL:$2|хэлъхьэгъу|хэлъхьэгъуэху}}, мыбдежым хуэныкъу щӀын хуэйр {{PLURAL:$1|$1 хэлъхьэгъуэ|$1 хэлъхьэгъу}}.',
 'expensive-parserfunction-category' => 'Ресурсышхуэ хэзылъхьэ функциэ куэду зыхэлъ напэкӀуэцӀхэр',
-'post-expand-template-inclusion-warning' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d:''' Ñ\88аблон хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытщ.
¨Ð°Ð±Ð»Ð¾Ð½Ñ\85Ñ\8dм Ñ\8fÑ\89Ñ\8bÑ\89 Ð³Ñ\83Ñ\8dÑ\80Ñ\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8dгÑ\8aÑ\8dкÓ\80Ñ\8bжаÑ\83Ñ\8d ÐºÑ\8aÑ\8dнÑ\8dнÑ\83Ñ\85Ñ\8dщ.",
-'post-expand-template-inclusion-category' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80Ñ\85Ñ\8dÑ\80, Ñ\88аблон я хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытхэр',
-'post-expand-template-argument-warning' => "'''Гу лъытэ:''' Мы напэкӀуэцӀым шаблоным и зы аргумент хэт, зэгъэзэнщӀэным щхьэкӀэ иныщу щыту.
+'post-expand-template-inclusion-warning' => "'''Ð\93Ñ\83 Ð»Ñ\8aÑ\8bÑ\82Ñ\8d:''' Ñ\89апÑ\85Ñ\8aÑ\8d хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытщ.
©Ð°Ð¿Ñ\85Ñ\8aÑ\8dÑ\85Ñ\8dм Ñ\8fÑ\89Ñ\8bÑ\89 Ð³Ñ\83Ñ\8dÑ\80Ñ\8dÑ\85Ñ\8dÑ\80 Ñ\85Ñ\8dмÑ\8bÑ\82Ñ\85аÑ\83Ñ\8d ÐºÑ\8aÑ\8dнÑ\8dнÑ\83щ.",
+'post-expand-template-inclusion-category' => 'Ð\9dапÑ\8dкÓ\80Ñ\83Ñ\8dÑ\86Ó\80Ñ\85Ñ\8dÑ\80, Ñ\89апÑ\85Ñ\8aÑ\8d я хэтхэм я бжыгъэр зэфӀэкӀыгъуэм къехъу щытхэр',
+'post-expand-template-argument-warning' => "'''Гу лъытэ!''' мы напэкӀуэцӀым зы щапхъэ, мынэхъмащӀэу хэтщ, и аргумент зэгъэзэнщӀэныр иныщэу щыту.
 Апхуэдэ аргументхэм гулъытэгъуэ ирамтауэ щытщ.",
-'post-expand-template-argument-category' => 'Шаблонхэм я аргументхэр хэзмыубыда напэкӀуэцӀхэр',
-'parser-template-loop-warning' => 'Ð¥Ñ\8dÑ\83кÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83Ñ\8d ÐºÑ\8aÑ\8bÑ\85Ñ\8dкÓ\80аÑ\89 Ñ\88аблонхэм: [[$1]]',
-'parser-template-recursion-depth-warning' => 'ШаблонÑ\8bм Ð¸ Ñ\80екÑ\83Ñ\80Ñ\81иÑ\8d Ð·Ñ\8dÑ\84Ó\80Ñ\8dкÓ\80Ñ\8bгÑ\8aÑ\83Ñ\8dр къегъэхъуауэ щытщ (1$)',
+'post-expand-template-argument-category' => 'ЩапÑ\85Ñ\8aÑ\8dхэм я аргументхэр хэзмыубыда напэкӀуэцӀхэр',
+'parser-template-loop-warning' => 'Ð¥Ñ\8dÑ\83кÑ\8aÑ\83Ñ\8dгÑ\8aÑ\83Ñ\8d ÐºÑ\8aÑ\8bÑ\85Ñ\8dкÓ\80аÑ\89 Ñ\89апÑ\85Ñ\8aÑ\8dхэм: [[$1]]',
+'parser-template-recursion-depth-warning' => 'ЩапÑ\85Ñ\8aÑ\8d Ñ\80екÑ\83Ñ\80Ñ\81иÑ\8dм Ð¸ ÐºÑ\83Ñ\83агÑ\8aÑ\8bр къегъэхъуауэ щытщ (1$)',
 'language-converter-depth-warning' => 'Бзэ гъэзанщӀэгъуэм и зэфӀэкӀыгъуэр къегъэхъуауэ щытщ (1$)',
+'node-count-exceeded-category' => 'ЗэпхырыкӀыгъуэхэм я бжыгъэр къехъу здэщыт напэкӀуэцӀхэр',
+'node-count-exceeded-warning' => 'НапэкӀуэцӀым зэпхырыкӀыгъуэ хэтым я бжыгъэр къехъу щытщ',
+'expansion-depth-exceeded-category' => 'НапэкӀуэцӀым и зыубгъуэн Ӏувагъыр къехъу щытщ',
+'expansion-depth-exceeded-warning' => 'НапэкӀуэцӀып и зэфӀэгъэкӀыгъуэр къегъэхъуауэ щытщ',
+'parser-unstrip-loop-warning' => 'Зэрыдзэгъуэ зэхуэмыщӀа къыхэкӀащ',
+'parser-unstrip-recursion-limit' => 'Рекурсым и зэфӀэгъэкӀыгъуэр къегъэхъуауэ щытщ ($1)',
 
 # "Undo" feature
 'undo-success' => 'Гъэтэрэзыгъуэр хахыжьыфынущ. Версиэхэм я зэгъэпшыгъуэ егъэкӀуэкӀ, узхуэныкъуэхэрамэ пщӀам еплъи «НапэкӀуэцӀыр итхэн»-ым текъузэ, зэхъуэкӀыгъуэхэр хэхьэным щхьэкӀэ.',
@@ -864,12 +878,14 @@ $1",
 'suppressionlogtext' => 'ИщӀагъымкӀэ гъэлъэгъуауэ щыт яужырей ихыгъуэхэмрэ теубыдэгъуэхэмрэ я тхылъ, тхьэмадэхэм ямгъэлъэгъуа хъыбархэр хэтху.
 Еплъ [[Special:IPBlockList|IP-теубыдыгъуэхэм я тхылъ]], екӀуэкӀ теубыдэгъуэхэр лъагъун щхьэкӀэ.',
 
+# History merging
+'mergehistory' => 'Гъэтэрэзыгъуэхэм я тхыдэ зыуэ зэхэгъэхьа',
+
 # Merge log
 'revertmerge' => 'Зыхэдзын',
 
 # Diffs
 'history-title' => '$1 - зэхъуэкIыныгъэм и тхыдэ',
-'difference' => '(Іэмалхэм я зэрызыщхьэщыкІыгъуэр)',
 'lineno' => 'Сатыр $1:',
 'compareselectedversions' => 'Хэха версиэхэр зэгъэпщэн',
 'editundo' => 'щӀегъуэжын',
@@ -896,12 +912,17 @@ $1",
 'search-interwiki-more' => '(иджыри)',
 'search-mwsuggest-enabled' => 'чэнджэш иӀэу',
 'search-mwsuggest-disabled' => 'чэнджэщыншэу',
-'nonefound' => "'''Гулъытыгъуэ.''' Тэрэзу имытхамэ узхуэныкъуэр, лъыхъуэгъуэр лъэныкъу хъуамкӀи ирегъэкӀуэкӀ. Къэгъэсэбэп ''all:'' пыгъувэгъуэр, зэгъэзэхуэгъуэ иӀэн щхьэкӀэ (хэтхэм я тепсэлъыхьыныгъэр, шаблонхэр, нымыщӀхэр джоуэ хиубыдэным щхьэ), иэ узхуэныкъуэ лъэныкъуэр итхэ.",
+'nonefound' => "'''Гулъытыгъуэ.''' Тэрэзу имытхамэ узхуэныкъуэр, лъыхъуэгъуэр лъэныкъу хъуамкӀи ирегъэкӀуэкӀ. Къэгъэсэбэп ''all:'' пыгъувэгъуэр, зэгъэзэхуэгъуэ иӀэн щхьэкӀэ (хэтхэм я тепсэлъыхьыныгъэр, щапхъэхэр, нымыщӀхэр джоуэ хиубыдэным щхьэ), иэ узхуэныкъуэ лъэныкъуэр итхэ.",
+'search-nonefound' => 'Узлъыхъуэм техуэу щыӀэкъым.',
 'powersearch' => 'Убгъуауэ лъыхъу',
 'powersearch-legend' => 'Убгъуауэ лъыхъу',
 'powersearch-ns' => 'ЦIэзэхэтыгъуэм щылъыхъуэн',
 'powersearch-redir' => 'ЕгъэзэкӀахэри гъэлъэгъуэн',
 'powersearch-field' => 'Лъыхъуэн',
+'powersearch-togglelabel' => 'Къыхэхын:',
+'powersearch-toggleall' => 'Псори',
+'powersearch-togglenone' => 'Зыри/пари',
+'search-external' => 'ХэкӀауэ лъыхъуэн',
 
 # Preferences page
 'preferences' => 'Зэгъэзэхуэпхъэхэр',
index d173f73..69e8cb8 100644 (file)
@@ -591,7 +591,6 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 
 # Diffs
 'history-title' => 'تاریخچہ "$1"',
-'difference' => '(اصلاحاتہ فرق)',
 'lineno' => 'لکیر $1:',
 'compareselectedversions' => 'منتخب متـنو موازنہ',
 'editundo' => 'استرجع',
@@ -684,7 +683,7 @@ HTML tags لوڑے.',",
 'nchanges' => '$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
 'recentchanges' => 'حالیہ تبدیلی',
 'recentchanges-legend' => 'حالیہ تبدیلیان اختیارات',
-'recentchangestext' => 'ھیہ صفحا کھوار ویکیپیڈیا باک تازہ تریں تبدیلیان مشاہدہ کورے',
+'recentchanges-summary' => 'ھیہ صفحا کھوار ویکیپیڈیا باک تازہ تریں تبدیلیان مشاہدہ کورے',
 'recentchanges-feed-description' => 'کھوارا ترجمہ',
 'recentchanges-label-newpage' => 'ھیہ ترمیم نوغ صفحہ تخلیق آریر',
 'recentchanges-label-minor' => 'ھیہ ای معمولی ترمیم شیر',
@@ -775,7 +774,8 @@ HTML tags لوڑے.',",
 'protectedpages' => 'محفوظ شدہ صفحہ',
 'protectedtitles' => 'محفوظ شدہ صفحہ',
 'listusers' => 'فہرست ارکان',
-'usercreated' => 'ساوزینو ھوی $1 at $2',
+'usercreated' => '
+{{GENDER:$3|تخلیق شدہ}}  بتاریخ $1 بوقت $2',
 'newpages' => 'نوغ صفحات',
 'newpages-username' => 'اسمِ رکنیت',
 'move' => 'منتقل',
index a9ce9e3..765ebf6 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Erdemaslancan
  * @author Mirzali
  */
 
@@ -390,9 +391,9 @@ Kerem kerê, deqêna oncia bıcerrebnê.",
 'protectedpagetext' => 'Na pele vurnaisu rê qapan biya.',
 'viewsourcetext' => 'Sıma şikinê çımê na pele bıvênê u kopya kerê:',
 'protectedinterface' => "Na pele ''software'' rê meqalunê caunê bırnau dana, u qapana ke suıstımalu rê engel bo.",
-'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba ''software'' meqalunê caunê bırnau dana, vurnenê.
+'editinginterface' => "'''Teme:''' Sıma hao jü pela ke serba nustê meqalunê caunê bırnau dana, vurnenê.
 Vurnaisê na pele karberunê binu rê serpela karberi kena ke bıasno.
-Serba çarnais, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]yê procê dos-kerdene rê diqet kerê.",
+Serba çarnaişi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=kiu translatewiki.net]i ra procêdoskerdene rê diqet kerê.",
 'sqlhidden' => '(Persê SQLi nımıteo)',
 'cascadeprotected' => 'Na pele esterıtene ra sıtar biya, çıke na zerrê {{PLURAL:$1|pela ke|pelunê ke}} dera/derê be "cascading" opsiyoni kılit biya, $2 de bena ra.',
 'namespaceprotected' => "'''$1''' ''namespace'' de desturê sıma be vurnaisê pelu çino.",
@@ -433,6 +434,7 @@ Vurnaena [[Special:Preferences|melumatanê {{SITENAME}}]] ho vira mekerê.',
 'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê sıma ke esto? '''$1'''.",
 'gotaccountlink' => 'Cı kuye',
+'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
 'createaccountmail' => 'e-poste sera',
 'createaccountreason' => 'Sebeb:',
 'badretype' => 'Parola sıma nêvêrena.',
@@ -549,8 +551,8 @@ Kerem ke, tı ke wazena na pele vırazê/bıvurnê, qontrol ke.',
 Dosyunê ebe namê .css u .js'y de herfa hurdiye bıgurêne, mesela hurêndia {{ns:user}}:Foo/Vector.css'i de {{ns:user}}:Foo/vector.css bınuse.",
 'updated' => '(Bi rozane)',
 'note' => "'''Not:'''",
-'previewnote' => "'''Bıfıkıriye ke no teyna jü verqayto.'''
-Vurnaişê to hona qeyd nêbiyê!",
+'previewnote' => "Teme! ena teyna verqeyda.'''
+Vurnayışê tu hama qeyd nıbiyo!",
 'editing' => 'Tıya $1 vurnena',
 'editingsection' => 'Vurnaena $1 (qısım)',
 'editingcomment' => '$1 vurnino (qısımo newe)',
@@ -569,18 +571,26 @@ Zobina ki ebe ita nustene ra sond wena ke nê iştıraki terefê to ra nuşiyê,
 'hiddencategories' => 'Na pele mensuba {{PLURAL:$1|1 kategoriya nımıtiya|$1 kategoriunê nımıtuna}}:',
 'permissionserrors' => 'Xetê desturi',
 'permissionserrorstext-withaction' => 'Desturê to be $2 çino, serba {{PLURAL:$1|na sebebi|nê sebebu}} ra:',
+'recreate-moveddeleted-warn' => "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''
+
+Diqet bıkeri no vurnayişê şıma re gerek esto:",
+'moveddeleted-notice' => 'Ma ena pele wederna.
+Qe referansi logê wedernayışi bın de mocnayiya.',
 'edit-conflict' => 'Têverabiyaena vurnaişi.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Teme''': Zerrekê şabloni zaf gırso.
 Taê şabloni ilawe nêbenê.",
 'post-expand-template-inclusion-category' => 'Pelê ke tede gırşênia şabloni serde sono',
+'post-expand-template-argument-warning' => 'Hişyari: No pel de tewr tay yew şablono herayi esto.',
+'post-expand-template-argument-category' => 'Pelê ke şablonê eyi qebul niye',
 
 # History pages
 'viewpagelogs' => 'Qeydê ke na pele ra alaqedarê, inu bıasne',
 'currentrev' => 'Çımraviarnaoğo rozane',
 'currentrev-asof' => '$1 ra gore pele be halo nıkaên',
 'revisionasof' => 'Halê roca $1ine',
+'revision-info' => 'Tesdiq kerdışê roca $1ine be terefê $2',
 'previousrevision' => '← Halo khanêr',
 'nextrevision' => 'Tekrardiyaiso newêr →',
 'currentrevisionlink' => 'Halo nıkaên',
@@ -677,8 +687,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'revertmerge' => 'Cia ke',
 
 # Diffs
-'history-title' => 'Viartê pelga "$1"ine',
-'difference' => 'Ferqê wertê vurnaisu',
+'history-title' => 'Rewizyonê $1:',
 'lineno' => 'Rêza $1i:',
 'compareselectedversions' => 'Varyantunê weçinıtun têver sane',
 'editundo' => 'peyser bia',
@@ -698,6 +707,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'nextn-title' => 'Peyên $1 {{PLURAL:$1|netice|neticey}}',
 'shown-title' => 'Zu pele rê $1 {{PLURAL:$1|netice|neticu}} basne',
 'viewprevnext' => 'Bıvêne ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "''Ena 'Wikipediya de ser \"[[:\$1]]\" yew pel esto'''",
 'searchmenu-new' => "'''Nê wiki de pela \"[[:\$1]]\" baferne!'''",
 'searchhelp-url' => 'Help:Tedeestey',
 'searchprofile-articles' => 'Pelê tedeesteu',
@@ -710,7 +720,7 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'searchprofile-images-tooltip' => 'Dosya bıfeteliye',
 'searchprofile-everything-tooltip' => 'Zerreki pêro sae ke (pelunê hurênaişi daxıl)',
 'searchprofile-advanced-tooltip' => 'Caunê namunê xısusiu de cıfeteliye',
-'search-result-size' => '$1 ({{PLURAL:$2|1 çekuye|$2 çekuy}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 kelime|$2 kelimey}})',
 'search-result-category-size' => '{{PLURAL:$1|1 eza|$1 ezey}} ({{PLURAL:$2|1 kategoriya bınêne|$2 kategoriyê bınêni}}, {{PLURAL:$3|1 dosya|$3 dosyey}})',
 'search-redirect' => '(hetêcıraberdene $1)',
 'search-section' => '(qısımo $1)',
@@ -818,6 +828,9 @@ Gunê $1 {{PLURAL:$1|herfe|herfun}} ra senık bo.',
 'email' => 'E-poste',
 'prefs-help-realname' => 'Namo rastıkên serbesto.
 Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
+'prefs-help-email' => 'Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.',
+'prefs-help-email-others' => 'Şıma şenê weçinê ke ê bini be yew gırey pela şımaya karberi ya zi pela werênayışi sera şıma de ebe e-poste irtıbat kewê.
+Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
 'prefs-help-email-required' => 'Adresa emaili lazıma.',
 'prefs-signature' => 'İmza',
 'prefs-diffs' => 'Ferqi',
@@ -852,7 +865,7 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
 
 # Rights
-'right-read' => 'Pelu bıwane',
+'right-read' => 'Pelan bıwanê',
 'right-edit' => 'Pelu bıvurne',
 'right-move' => 'Pelu bere',
 'right-movefile' => 'Dosyu bere',
@@ -882,13 +895,14 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
 'nchanges' => '$1 {{PLURAL:$1|tedil|tedili}}',
 'recentchanges' => 'Vurnaisê peyêni',
 'recentchanges-legend' => 'Alternatifê vurnaisunê peyênu',
-'recentchangestext' => 'Na weiyekerdena wiki de vurnaisê tewrpeyêne ke biyê ine teqib ke.',
+'recentchanges-summary' => 'Na weiyekerdena wiki de vurnaisê tewrpeyêne ke biyê ine teqib ke.',
 'recentchanges-feed-description' => 'Na weiyekerdena wiki de vurnaisê tewrpeyêne ke biyê ine teqib ke.',
 'recentchanges-label-newpage' => 'Nê vurnaişi pelê da newiye afernê.',
 'recentchanges-label-minor' => 'No zu vurnaiso qıckeko',
 'recentchanges-label-bot' => 'No vurnais terefê zu boti ra bi',
 'recentchanges-label-unpatrolled' => 'No vurnais hona çım ra ranêvêrdo',
 'rcnote' => "Cêr {{PLURAL:$1|'''1''' vurnaiso peyên|'''$1''' vurnaisê peyêni}} be {{PLURAL:$2|roza peyêne|'''$2''' rozunê peyênunê}} $5, $4 ra estê.",
+'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
 'rclistfrom' => '$1 ra hata nıka vurnaisunê newu bıasne',
 'rcshowhideminor' => '$1 vurnaisê qızkeki',
 'rcshowhidebots' => 'botê $1i',
@@ -911,6 +925,7 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
 'recentchangeslinked' => 'Ney sero vurnaene',
 'recentchangeslinked-toolbox' => 'Ney sero vurnaene',
 'recentchangeslinked-title' => 'Heqa "$1"i de vurnais',
+'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya ki karberunê kategoriya bêlikerdiye rê) pelunê girêdaoğu de lista de vurnaisê peyênuna.
 [[Special:Watchlist|Lista sımawa şêrkedişi de]] peli be nusto '''qolınd''' bêli kerdê.",
 'recentchangeslinked-page' => 'Namê pele:',
@@ -934,6 +949,7 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
 'filestatus' => 'Halê heqa telifi:',
 'filesource' => 'Çıme:',
 'uploadedfiles' => 'Dosyê barkerdey',
+'empty-file' => 'Dosya ke ti şawit veng biy.',
 'savefile' => 'Dosya qeyd ke',
 'uploadedimage' => '"[[$1]]" bar bi',
 'upload-source' => 'Dosya çımey',
@@ -973,6 +989,7 @@ Sıma ke ney bıgurenê, karê sıma de no namdarêni dano.',
 'filehist-missing' => 'Dosya vindbiyaiya',
 'imagelinks' => 'Gurenaisê dosya',
 'linkstoimage' => 'Ano {{PLURAL:$1|girê pele|$1 girê pelu}} be na dosya:',
+'nolinkstoimage' => 'Pelanê ser ena dosyayê link biyê çin o.',
 'sharedupload' => 'Na dosya depoê $1 rawa u beno ke procunê binu de gurenina.',
 'sharedupload-desc-here' => 'Beno ke depoê na dosya $1 ra be terefê procunê bınu ra gurenino.
 Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
@@ -1030,7 +1047,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 'shortpages' => 'Pelê kılmi',
 'longpages' => 'Pelê dergi',
 'listusers' => 'Lista karberi',
-'usercreated' => 'roca $1 de $2 de vıraciya',
+'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
 'newpages' => 'Pelê newey',
 'newpages-username' => 'Namê karberi:',
 'ancientpages' => 'Pelê khanêri',
@@ -1195,6 +1212,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'undeletereset' => 'Vaz be',
 'undeleteinvert' => 'Weçinıtey ters bıçarne',
 'undeletecomment' => 'Sebeb:',
+'undelete-header' => 'Peleyê ke veror de besterneyayê êna bıvinê: [[Special:Log/delete|qeydê esterneya]].',
 'undelete-search-submit' => 'Cıfeteliye',
 'undelete-show-file-submit' => 'Heya',
 
@@ -1206,7 +1224,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 # Contributions
 'contributions' => 'İştırakê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'İştırakê mı',
+'mycontris' => 'İştıraqê mı',
 'contribsub2' => 'Serba $1 ($2)',
 'uctop' => '(ser)',
 'month' => 'Asme ra (u ravêr):',
@@ -1219,6 +1237,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'sp-contributions-talk' => 'hurênais',
 'sp-contributions-search' => 'Ebe iştıraku cı feteliye',
 'sp-contributions-username' => 'IP ya ki karber:',
+'sp-contributions-toponly' => 'Teyna revizyonanê tewr peniyan bimocne',
 'sp-contributions-submit' => 'Cı feteliye',
 
 # What links here
@@ -1506,6 +1525,9 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 'watchlisttools-edit' => 'Lista şêrkerdene bıvêne u vıraze',
 'watchlisttools-raw' => 'Lista şêrkerdena xame vıraze',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Teme:\'\'\' Tuşê default sort "$2" sero tuşê default sort "$1"î ra şino.',
+
 # Special:FilePath
 'filepath-page' => 'Dosya:',
 'filepath-submit' => 'So',
@@ -1534,6 +1556,16 @@ Eke dosya de peydêna vuriyais biyo ki, beno ke taê melumati gorê vurnaisê ne
 # Special:BlankPage
 'blankpage' => 'Pela thale',
 
+# External image whitelist
+'external_image_whitelist' => '  #no satır zey xo verde/raverde<pre>
+#parçeyê ifadeya rêzbiyayeyani (têna zerreyê ıney de // ) u çıtayo/çiyo zi mende cêr de têare kerê.
+#ney URL ya (hotlink) resmê teberi de hemcıta benî.
+#Ê yê ke hemcıt (eşleşmek-hemçift) biyê zey resımi asenî, eqsê hal de zi zey gıreyê resmi aseno.
+satır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.
+#herfa gırd û qıci ferq nêkeno
+
+#parçeyê ifadeya rêzbiyayeyani bıerzê serê ney satıri. no satır zey xo verde/raverde </pre>',
+
 # Special:Tags
 'tag-filter' => 'Parzünê [[Special:Tags|etiket]]i:',
 
index 8cffc74..6b5676e 100644 (file)
@@ -1106,7 +1106,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 
 # Diffs
 'history-title' => '«$1» — تۇزەتۋ تارىيحى',
-'difference' => '(تۇزەتۋلەر اراسىنداعى ايىرماشىلىق)',
 'lineno' => 'جول ٴنومىرى $1:',
 'compareselectedversions' => 'بولەكتەنگەن نۇسقالاردى سالىستىرۋ',
 'editundo' => 'جوققا شىعارۋ',
@@ -1325,7 +1324,7 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 # Recent changes
 'nchanges' => '$1 وزگەرىس',
 'recentchanges' => 'جۋىقتاعى وزگەرىستەر',
-'recentchangestext' => 'بۇل بەتتە وسى ۋىيكىيدەگى بولعان جۋىقتاعى وزگەرىستەر بايقالادى.',
+'recentchanges-summary' => 'بۇل بەتتە وسى ۋىيكىيدەگى بولعان جۋىقتاعى وزگەرىستەر بايقالادى.',
 'recentchanges-feed-description' => 'بۇل ارنامەنەن ۋىيكىيدەگى ەڭ سوڭعى وزگەرىستەر قاداعالانادى.',
 'rcnote' => "$3 كەزىنە دەيىن — تومەندە سوڭعى {{PLURAL:$2|كۇندەگى|'''$2''' كۇندەگى}}, سوڭعى '''$1''' وزگەرىس كورسەتىلەدى.",
 'rcnotefrom' => "'''$2''' كەزىنەن بەرى — تومەندە '''$1''' جەتكەنشە دەيىن وزگەرىستەر كورسەتىلەدى.",
index e7ee7a2..93ff9dd 100644 (file)
@@ -8,6 +8,8 @@
  * @file
  *
  * @author AlefZet
+ * @author Alibek Kisybay
+ * @author Daniyar
  * @author GaiJin
  * @author Kaztrans
  * @author Urhixidur
@@ -368,35 +370,35 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Тексерілген беттерді жаңа беттер тізімінде көрсетпеу',
 'tog-extendwatchlist' => 'Бақылау тізімді ұлғайту (барлық жарамды өзгерістерді көрсету)',
 'tog-usenewrc' => 'Кеңейтілген жуықтағы өзгерістер (JavaScript)',
-'tog-numberheadings' => 'Ð\91аÑ\81 Ð¶Ð¾Ð»Ð´Ð°Ñ\80дÑ\8b Ó©Ð·Ð´Ñ\96кÑ\82Ñ\96к Ð½Ð¾Ð¼Ñ\96Ñ\80ле',
-'tog-showtoolbar' => 'Өңдеу қуралдар жолағын көрсет (JavaScript)',
+'tog-numberheadings' => 'Ð\9cазмұн Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bпÑ\82аÑ\80Ñ\8bн Ð°Ð²Ñ\82омаÑ\82Ñ\82Ñ\8b Ð½Ó©Ð¼Ñ\96Ñ\80леÑ\83',
+'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' => 'Ò\9aам Ò\9bолÑ\82аңба (өздÑ\96кÑ\82Ñ\96к Ñ\81Ñ\96лÑ\82емеÑ\81Ñ\96з)',
+'tog-fancysig' => 'Ò\9aолÑ\82аңбанÑ\8b Ñ\83икимÓ\99Ñ\82Ñ\96н Ñ\80еÑ\82Ñ\96нде Ò\9bаÑ\80аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83 (авÑ\82омаÑ\82Ñ\82Ñ\8b Ñ\81Ñ\96лÑ\82еме Ò\9bойÑ\8bлмайдÑ\8b)',
 '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' => 'Бақылау тізіміндегі жасырын қатысушылардың өңдеулерін көрсетпеу',
@@ -415,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' => 'Ноқатты қаріп',
 
@@ -498,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
@@ -524,14 +526,14 @@ $messages = array(
 'vector-view-edit' => 'Өңдеу',
 'vector-view-history' => 'Тарихы',
 'vector-view-view' => 'Оқу',
-'vector-view-viewsource' => 'Қайнар көзін қарау',
+'vector-view-viewsource' => 'Қайнарын қарау',
 'actions' => 'Әрекеттер',
-'namespaces' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b',
+'namespaces' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96',
 'variants' => 'Нұсқалар',
 
 'errorpagetitle' => 'Қате',
 'returnto' => '$1 дегенге қайта келу.',
-'tagline' => '{{SITENAME}} жобасынан',
+'tagline' => '{{SITENAME}} жобасынан алынған мәлімет',
 'help' => 'Анықтама',
 'search' => 'Іздеу',
 'searchbutton' => 'Іздеу',
@@ -563,7 +565,7 @@ $messages = array(
 'specialpage' => 'Арнайы бет',
 'personaltools' => 'Жеке құралдар',
 'postcomment' => 'Жаңа бөлім',
-'articlepage' => 'Мағлұмат бетін қарау',
+'articlepage' => 'Мәлімет бетін қарау',
 'talk' => 'Талқылау',
 'views' => 'Көрініс',
 'toolbox' => 'Құралдар',
@@ -584,19 +586,19 @@ $messages = array(
 'jumpto' => 'Мында өту:',
 '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 шартымен жетімді.',
+'copyright' => 'Мәлімет $1 шартымен жетімді.',
 'copyrightpage' => '{{ns:project}}:Авторлық құқықтар',
 'currentevents' => 'Ағымдағы оқиғалар',
 'currentevents-url' => 'Project:Ағымдағы оқиғалар',
@@ -614,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' => 'СÑ\96зге $1 бар ($2).',
-'newmessageslink' => 'жаңа хабарлар',
-'newmessagesdifflink' => 'соңғы өзгерісіне',
-'youhavenewmessagesmulti' => '$1 дегенде жаңа хабарлар бар',
+'youhavenewmessages' => 'СÑ\96зде $1 бар ($2).',
+'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' => 'Арна:',
@@ -655,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па Ð±ÐµÑ\82Ñ\96',
+'nstab-media' => 'Ð\9cедиа',
 'nstab-special' => 'Арнайы бет',
-'nstab-project' => 'Жоба беті',
-'nstab-image' => 'Файл беті',
-'nstab-mediawiki' => 'Хабар',
+'nstab-project' => 'Жоба',
+'nstab-image' => 'Файл',
+'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}}]].',
@@ -687,9 +689,9 @@ $1',
 «$1»
 мына «$2» функциясынан болды .
 Дерекқор "$3: $4" қатесін қайтарды.',
-'laggedslavemode' => 'Құлақтандыру: Бетте жуықтағы жаңалаулар болмауы мүмкін.',
+'laggedslavemode' => "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
 'readonly' => 'Дерекқоры құлыпталған',
-'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз',
+'enterlockreason' => 'Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.',
 'readonlytext' => 'Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.
 
 Құлыптаған әкімші бұны былай түсіндіреді: $1',
@@ -698,13 +700,13 @@ $1',
 Бұл ескірген айырма сілтемесіне немесе жойылған бет тарихы сілтемесіне ергеннен бола береді.
 
 Егер бұл орынды болмаса, бағдарламалық жасақтамадағы қатеге тап болуыңыз мүмкін.
-Бұл туралы нақты URL жайына аңғартпа жасап, әкімшіге баянаттаңыз.',
-'missingarticle-rev' => '(түзету н: $1)',
-'missingarticle-diff' => '(Ð\90йÑ\80м.: $1, $2)',
-'readonly_lag' => 'Жетек дерекқор серверлер басқысымен қадамланғанда осы дерекқор өздіктік құлыпталынған',
+Бұл туралы нақты URL жайына аңғартпа жасап, [[Special:ListUsers/sysop|әкімшіге]] баяндаңыз.',
+'missingarticle-rev' => '(түзету нұсқасы: $1)',
+'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» атауына өзгертілмеді.',
@@ -722,18 +724,18 @@ $1',
 'badtitletext' => 'Сұралған бет тақырыбының аты жарамсыз, бос, тіларалық сілтемесі не уики-аралық тақырып аты бұрыс енгізілген.
 Мында тақырып атында қолдалмайтын бірқатар таңбалар болуы мүмкін.',
 'perfcached' => 'Келесі дерек бүркемеленген, сондықтан толықтай жаңаланбаған болуы мүмкін. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcachedts' => 'Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. Кэште {{PLURAL:$4|жазбалардан}} артық сақталмайды..',
 'querypage-no-updates' => 'Бұл беттің жаңартылуы ағымда өшірілген. Деректері қазір өзгертілмейді.',
 'wrong_wfQuery_params' => 'wfQuery() функциясы үшін бұрыс бапталымдары бар<br />
 Жете: $1<br />
 Сұраным: $2',
-'viewsource' => 'Қайнар көзін қарау',
+'viewsource' => 'Қайнарын қарау',
 'viewsource-title' => '$1 бетінің бастапқы мәтінін қарау',
 'actionthrottled' => 'Әрекет бәсеңдетілді',
 'actionthrottledtext' => 'Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.
 Бірнеше минуттан қайта байқап көріңіз.',
 'protectedpagetext' => 'Өңдеуді қақпайлау үшін бұл бет құлыпталынған.',
-'viewsourcetext' => 'Бұл беттің қайнар көзін қарауыңызға және көшіріп алуыңызға болады:',
+'viewsourcetext' => 'Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:',
 'viewyourtext' => 'Осы бет арқылы "өзіңіз жасаған өңдеулердің" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.',
 'protectedinterface' => 'Бұл бет бағдарламалық жасақтаманың тілдесу мәтінін жетістіреді, сондықтан қиянатты қақпайлау үшін өзгертуі құлыпталған.',
 'editinginterface' => "'''Құлақтандыру:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.
@@ -748,6 +750,8 @@ $2',
 'ns-specialprotected' => '{{ns:special}} есім аясындағы беттер өңделінбейді',
 'titleprotected' => "Бұл тақырып аты бастаудан [[{{ns:user}}:$1|$1]] қорғады.
 Келтірілген себебі: ''$2''.",
+'filereadonlyerror' => "«$2» сақтамасы «тек қана оқу» тәртіптемесінде тұрғасын, «$1» файлын өзгерту мүмкін емес.
+Бұл тәртіптемені қондырған әкімші келесі түсіндірмені қалдырды: «''$3''»",
 
 # Virus scanner
 'virus-badscanner' => 'Баптау қателігі. Белгісіз вирус сканері: $1',
@@ -757,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' => 'Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.',
@@ -777,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» өшірілген.
@@ -796,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 таңба болуы және де қатысушы атыңыздан өзге болуы жөн.',
-'mailmypassword' => 'Құпия сөзімді хатпен жібер',
+'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 мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.',
@@ -825,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з.',
-'emailauthenticated' => 'Е-пошта мекенжайыңыз расталған кезі: $1.',
+'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}} үшін тіркелу',
@@ -841,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' => 'Тіркелгінің құпия сөзін өзгерту',
@@ -853,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' => 'Жуан мәтін',
@@ -866,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-ші деңгейлі бас жол',
@@ -878,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' => "'''Ð\95Ñ\81кеÑ\80Ñ\82пе:''' Ð\91ұл Ð¼Ó\99ндемеге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп/баÑ\81жол Ð¶ÐµÑ\82Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80мепÑ\81Ñ\96з.
-Егер тағы да Сақтау түймесін нұқысаңыз, өңдемеңіз солсыз сақталады.",
+'missingcommentheader' => "'''Ð\95Ñ\81кеÑ\80Ñ\82пе:''' Ð\91ұл Ð¼Ó\99ндемеге Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп/баÑ\81жол Ð¶Ð°Ð·Ð±Ð°Ð¿Ñ\81Ñ\8bз.
+«{{int:savearticle}}» түймесін тағы бассаңыз, өңдемеңіз тақырыпсыз жазылады.",
 'summary-preview' => 'Қысқаша мазмұндамасын қарап шығу:',
 'subject-preview' => 'Тақырыбын/бас жолын қарап шығу:',
 'blockedtitle' => 'Қатысушы бұғатталған',
@@ -909,26 +959,25 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 [[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.
 Ағымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.
 Сұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
-'autoblockedtext' => "$1 деген бұрын өзге қатысушы пайдаланған болғасын осы IP мекенжайыңыз өздіктік бұғатталған.
-Келтірілген себебі:
-
-:''$2''
-
-* Бұғаттау басталғаны: $8
-* Бұғаттау бітетіні: $6
+'autoblockedtext' => "'''Қатысушы атыңыз не IP-мекенжайыңыз бұғатталған.'''
 
-Осы бұғаттауды талқылау үшін $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 болуыңыз жөн.',
@@ -936,15 +985,21 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 'accmailtext' => '$2 жайына «$1» құпия сөзі жөнелтілді.',
 'newarticle' => '(Жаңа)',
 'newarticletext' => 'Сілтемеге еріп әлі басталмаған бетке келіпсіз.
\91еÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өмендегÑ\96 ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек Ð°Ò\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{{{ns:mediawiki}}:helppage}}|анықтама бетін]] қараңыз).
-Егер жаңылғаннан осында келген болсаңыз, шолғышыңыздың «Артқа» деген батырмасын нұқыңыз.',
\91еÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83 Ò¯Ñ\88Ñ\96н, Ñ\82өменгÑ\96 Ñ\82еÑ\80езеде Ð¼Ó\99Ñ\82Ñ\96нÑ\96Ò£Ñ\96здÑ\96 Ñ\82еÑ\80Ñ\96Ò£Ñ\96з (көбÑ\96Ñ\80ек Ð°Ò\9bпаÑ\80аÑ\82 Ò¯Ñ\88Ñ\96н [[{{MediaWiki:Helppage}}|анықтама бетін]] қараңыз).
+Егер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.',
 'anontalkpagetext' => "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.
 Осындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.
 Егер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
-'noarticletext' => 'Бұл бетте ағымда еш мәтін жоқ, дегенмен басқа беттерден [[{{#special:Search}}/{{PAGENAME}}|бұл бет тақырыбы атын іздей]] не [{{fullurl:{{FULLPAGENAME}}|action=edit}} бұл бетті өңдей] аласыз.',
+'noarticletext' => "Ағымда бұл бетте еш мәтін жоқ.
+* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],
+* <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 қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
@@ -953,6 +1008,7 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 'updated' => '(Жаңартылған)',
 'note' => "'''Аңғартпа:'''",
 'previewnote' => "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, өзгерістер әлі сақталған жоқ!",
+'continue-editing' => 'Өңдемені жалғастыру',
 'previewconflict' => 'Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.',
 'session_fail_preview' => "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.
 Қайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
@@ -965,9 +1021,10 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.
 Бұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
 'editing' => 'Өңделуде: $1',
+'creating' => 'Бастау: $1',
 'editingsection' => 'Өңделуде: $1 (бөлімі)',
-'editingcomment' => 'ӨңделÑ\83де: $1 (мÓ\99ндемеÑ\81Ñ\96)',
-'editconflict' => 'Өңдеме қақтығысы: $1',
+'editingcomment' => 'ӨңделÑ\83де: $1 (жаңа Ð±Ó©Ð»Ñ\96м)',
+'editconflict' => 'Өңдемелер қақтығысы: $1',
 'explainconflict' => "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.
 Жоғарғы кірістіру орнында беттің ағымдық мәтіні бар.
 Төменгі кірістіру орнында сіз өзгерткен мәтіні көрсетіледі.
@@ -991,28 +1048,43 @@ IP мекенжайыңыз бұл беттің түзету тарихында
 Бұл сақтай алынбайды.'''",
 'readonlywarning' => "'''ҚҰЛАҚТАНДЫРУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.
 Кейін қолдану үшін мәтәнді қйып алып және қойып, мәтін файлына сақтауңызға болады.'''",
-'protectedpagewarning' => "'''ҚҰЛАҚТАНДЫРУ: Бұл бет қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''",
-'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.",
+'protectedpagewarning' => "'''Ескертпе: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар өңдей алады.'''
+Төменде бет журналының соңғы жазбасы көрсетілген:",
+'semiprotectedpagewarning' => "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.
+Төменде бет журналының соңғы жазбасы көрсетілген:",
 'cascadeprotectedwarning' => "'''Құлақтандыру''': Бұл бет құлыпталған, енді тек әкімші құқықтары бар қатысушылар бұны өңдей алады.Бұның себебі: бұл бет «баулы қорғауы» бар келесі {{PLURAL:$1|беттің|беттердің}} кірікбеті:",
-'titleprotectedwarning' => "'''ҚҰЛАҚТАНДЫРУ:  Бұл бет құлыпталған, сондықтан тек бірқатар қатысушылар бұны бастай алады.'''",
-'templatesused' => 'Бұл бетте қолданылған үлгілер:',
-'templatesusedpreview' => 'Бұны қарап шығуға қолданылған үлгілер:',
-'templatesusedsection' => 'Бұл бөлімде қолданылған үлгілер:',
+'titleprotectedwarning' => "'''Ескертпе: Бұл бет атауы құлыпталған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''
+Төменде бет журналының соңғы жазбасы көрсетілген:",
+'templatesused' => 'Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
+'templatesusedpreview' => 'Беттің қарап шығуында қолданылған {{PLURAL:$1|үлгі|үлгілер}}:',
+'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' => "'''Құлақтандыру: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
+'recreate-moveddeleted-warn' => "'''Назар аудар: Алдында жойылған бетті қайта бастайын деп тұрсыз.'''
 
-Мына бет өңдеуін жалғастыру үшін жарастығын тексеріп шығуыңыз жөн.
-Қолайлы болуы үшін бұл беттің жою журналы келтірілген:",
+Бұл бетті жаңадан бастаудың орынды екеніне көз жеткізіңіз.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:",
+'moveddeleted-notice' => 'Бұл бет жойылған.
+Төменде бұл бетке қатысты жою және жылжыту журналы көрсетілген:',
 'log-fulllog' => 'Толық журналды қарау',
+'edit-hook-aborted' => 'Түзету ілмек арқылы болдырмады.
+Қосымша түсіндірмелер көрсетілмеген.',
+'edit-gone-missing' => 'Бетті жаңарту мүмкін емес.
+Мүмкін, бұл бет жойылған.',
+'edit-conflict' => 'Өңдемелер қақтығысы.',
+'edit-already-exists' => 'Жаңа бет жасау мүмкін емес.
+Ол әлдеқашан бар.',
+'defaultmessagetext' => 'Әдепкі мәтіні',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Құлақтандыру: Бұл бетте тым көп шығыс алатын құрылым талдатқыш жетелерінің қоңырау шалулары бар.
@@ -1075,6 +1147,7 @@ $3 келтірілген себебі: ''$2''",
 'rev-deleted-comment' => '(мәндеме аласталды)',
 'rev-deleted-user' => '(қатысушы аты аласталды)',
 'rev-deleted-event' => '(журнал жазбасы аласталды)',
+'rev-deleted-user-contribs' => '[Қатысушы аты немесе IP-мекенжайы жойылған — өңдемелері қатысушы үлесі бетінен жасырылған]',
 'rev-deleted-text-permission' => 'Бұл беттің түзетуі барша мұрағаттарынан аласталған.
 Мында [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} жою журналында] егжей-тегжей мәліметтері болуы мүмкін.',
 'rev-deleted-text-view' => 'Осы беттің түзетуі барша мұрағаттарынан аласталған.
@@ -1086,6 +1159,8 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-nooldid-title' => 'Нысана түзету жарамсыз',
 'revdelete-nooldid-text' => 'Бұл жетені орындау үшін нысана түзетуін/түзетулерін келтірілмепсіз,
 келтірілген түзету жоқ, не ағымдық түзетуді жасыру үшін әрекеттеніп көрдіңіз.',
+'revdelete-nologtype-title' => 'Журнал түрі көрсетілмеген',
+'revdelete-nologid-title' => 'Журналдағы қате жазба',
 'revdelete-show-file-submit' => 'Иә',
 'revdelete-selected' => "'''[[:$1]] дегеннің бөлектенген {{PLURAL:$2|түзетуі|түзетулері}}:'''",
 'logdelete-selected' => "'''Бөлектенген {{PLURAL:$1|журнал оқиғасы|журнал оқиғалары}}:'''",
@@ -1099,6 +1174,9 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-hide-comment' => 'Өңдеме мәндемесін жасыр',
 'revdelete-hide-user' => 'Өңдеуші атын (IP мекенжайын) жасыр',
 'revdelete-hide-restricted' => 'Осы тиымдарды әкімшілерге қолдану және бұл тілдесуді құлыптау',
+'revdelete-radio-same' => '(өзгертпе)',
+'revdelete-radio-set' => 'Иә',
+'revdelete-radio-unset' => 'Жоқ',
 'revdelete-suppress' => 'Деректерді баршаға ұқсас әкімшілерден де шеттету',
 'revdelete-unsuppress' => 'Қалпына келтірілген түзетулерден тиымдарды аластау',
 'revdelete-log' => 'Себебі:',
@@ -1106,9 +1184,14 @@ $3 келтірілген себебі: ''$2''",
 'revdelete-success' => "'''Түзету көрінісі сәтті қойылды.'''",
 'logdelete-success' => "'''Журнал көрінісі сәтті қойылды.'''",
 'revdel-restore' => 'Көрінісін өзгерту',
+'revdel-restore-deleted' => 'жойылған нұсқалары',
+'revdel-restore-visible' => 'көрінетін нұсқалары',
 'pagehist' => 'Бет тарихы',
 'deletedhist' => 'Жойылған тарихы',
+'revdelete-otherreason' => 'Басқа/қосымша себеп:',
+'revdelete-reasonotherlist' => 'Өзге себеп',
 'revdelete-edit-reasonlist' => 'Жою себептерін өңдеу',
+'revdelete-offender' => 'Аутор нұсқалары:',
 
 # Suppression log
 'suppressionlog' => 'Шеттету журналы',
@@ -1137,6 +1220,8 @@ $3 келтірілген себебі: ''$2''",
 'mergehistory-invalid-destination' => 'Нысана бетінде жарамды тақырып аты болуы жөн.',
 'mergehistory-autocomment' => '[[:$1]] деген [[:$2]] дегенге біріктірілді',
 'mergehistory-comment' => '[[:$1]] деген [[:$2]] дегенге біріктірілді: $3',
+'mergehistory-same-destination' => 'Бастапқы және мақсатты беттер бірдей болмауы керек',
+'mergehistory-reason' => 'Себебі:',
 
 # Merge log
 'mergelog' => 'Біріктіру журналы',
@@ -1145,13 +1230,14 @@ $3 келтірілген себебі: ''$2''",
 'mergelogpagetext' => 'Төменде бір беттің тарихы өзге бетке біріктіру ең соңғы тізімі келтіріледі.',
 
 # Diffs
-'history-title' => '«$1» — түзету тарихы',
-'difference' => '(Түзетулер арасындағы айырмашылық)',
+'history-title' => '«$1» — өңдеу тарихы',
+'difference-title' => 'Нұсқалар арасындағы айырмашылық: "$1"',
+'difference-multipage' => '(Беттер арасындағы айырмашылық)',
 'lineno' => 'Жол нөмірі $1:',
 'compareselectedversions' => 'Таңдалған нұсқаларды салыстыру',
 'showhideselectedversions' => 'Бөлектенген нұсқаларды көрсет/жасыр',
 'editundo' => 'жоққа шығару',
-'diff-multi' => '(Арадағы $1 түзету көрсетілмеген.)',
+'diff-multi' => '($2 қатысушының арадағы $1 түзетуі көрсетілмеген)',
 
 # Search results
 'searchresults' => 'Іздеу нәтижелері',
@@ -1166,11 +1252,24 @@ $3 келтірілген себебі: ''$2''",
 'notextmatches' => 'Еш бет мәтіні сәйкес емес',
 'prevn' => 'алдыңғы {{PLURAL:$1|$1}}',
 'nextn' => 'келесі {{PLURAL:$1|$1}}',
+'prevn-title' => 'Алдыңғы $1 {{PLURAL:$1|жазба|жазбалар}}',
+'nextn-title' => 'Келесі $1 {{PLURAL:$1|жазба|жазбалар}}',
+'shown-title' => 'Осы бетте {{PLURAL:$1|жазба}} көрсету.',
 'viewprevnext' => 'Көрсетілуі: ($1 {{int:pipe-separator}} $2) ($3) жазба',
+'searchmenu-legend' => 'Іздеу бапталымдары',
+'searchmenu-exists' => "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" осындай атпен бетті бастау'''",
 'searchhelp-url' => 'Help:Мазмұны',
+'searchprofile-articles' => 'Негізгі беттер',
+'searchprofile-project' => 'Анықтама және жоба беттері',
+'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Барлық жерде',
+'searchprofile-advanced' => 'Кеңейтілген',
 'searchprofile-articles-tooltip' => '$1 іздеу',
+'searchprofile-project-tooltip' => '$1 іздеу',
+'searchprofile-images-tooltip' => 'Файлдарды іздеу',
+'searchprofile-everything-tooltip' => 'Барлық беттерден іздеу (талқылау беттерін қоса)',
+'searchprofile-advanced-tooltip' => 'Белгіленген есім кеңістігінен іздеу',
 'search-result-size' => '$1 ($2 сөз)',
 'search-result-score' => 'Арақатынастылығы: $1 %',
 'search-redirect' => '(айдағыш $1)',
@@ -1183,17 +1282,21 @@ $3 келтірілген себебі: ''$2''",
 'search-mwsuggest-disabled' => 'ұсынымдарсыз',
 'search-relatedarticle' => 'Қатысты',
 'mwsuggest-disable' => 'AJAX ұсынымдарын өшір',
+'searcheverything-enable' => 'Белгіленген есім кеңістігінен іздеу',
 'searchrelated' => 'қатысты',
 'searchall' => 'барлық',
 'showingresults' => "Төменде нөмір '''$2''' орнынан бастап барынша '''$1''' нәтиже көрсетіледі.",
 'showingresultsnum' => "Төменде нөмір '''$2''' орнынан бастап '''$3''' нәтиже көрсетіледі.",
 'nonefound' => "'''Аңғартпа''': Әдепкіден тек кейбір есім аялардан ізделінеді. Барлық мағлұмат түрін (соның ішінде талқылау беттерді, үлгілерді т.б.) іздеу үшін сұранымыңызды ''барлық:'' деп бастаңыз, немесе қалаған есім аясын бастауыш есебінде қолданыңыз.",
+'search-nonefound' => 'Сұрауға сәйкес нәтижелер табылмады.',
 'powersearch' => 'Кеңейтілген іздеу',
 'powersearch-legend' => 'Кеңейтілген іздеу',
 'powersearch-ns' => 'Мына есім аяларда іздеу:',
 'powersearch-redir' => 'Айдатуларды тізімдеу',
 'powersearch-field' => 'Іздеу',
+'powersearch-togglelabel' => 'Белгілеу:',
 'powersearch-toggleall' => 'Барлығы',
+'powersearch-togglenone' => 'Ешқандай',
 'search-external' => 'Шеттік іздегіш',
 'searchdisabled' => '{{SITENAME}} іздеу қызметі өшірілген.
 Әзірше Google арқылы іздеуге болады.
@@ -1224,22 +1327,27 @@ $3 келтірілген себебі: ''$2''",
 'prefs-watchlist-days' => 'Бақылау тізіміндегі күндердің көрсетпек саны:',
 'prefs-watchlist-edits' => 'Кеңейтілген бақылаулардағы өзгерістердің барынша көрсетпек саны:',
 'prefs-misc' => 'Әрқилы',
+'prefs-resetpass' => 'Құпия сөзді өзгерту',
 'prefs-email' => 'Е-пошта баптаулары',
 'prefs-rendering' => 'Сырт көрініс',
 'saveprefs' => 'Сақтау',
 'resetprefs' => 'Сақталмаған өзгерістерді тазарту',
 'restoreprefs' => 'Барлығын бастапқы баптауларға қайтару',
 'prefs-editing' => 'Өңдеу',
+'prefs-edit-boxsize' => 'Өңдеу терезесінің өлшемі.',
 'rows' => 'Жолдар:',
 'columns' => 'Бағандар:',
 'searchresultshead' => 'Іздеу',
 'resultsperpage' => 'Бет сайын нәтиже саны:',
 'stub-threshold' => '<a href="#" class="stub">Бастама сілтемесін</a> пішімдеу табалдырығы (байт):',
-'recentchangesdays' => 'Жүықтағы өзгерістерінде көрсетпек күн саны:',
+'stub-threshold-disabled' => 'Ажыратылған',
+'recentchangesdays' => 'Жуықтағы өзгерістерде көрсетілетін күн саны:',
 'recentchangescount' => 'Жуықтағы өзгерістердінде, тарих және журнал беттерінде көрсетпек өңдеме саны:',
 'savedprefs' => 'Бапталымдарыңыз сақталды.',
-'timezonelegend' => 'Уақыт белдеуі',
-'localtime' => 'Жергілікті уақыт',
+'timezonelegend' => 'Уақыт белдеуі:',
+'localtime' => 'Жергілікті уақыт:',
+'timezoneuseserverdefault' => 'Уикидің баптауларын қолдану ($1)',
+'timezoneuseoffset' => 'Басқа (жылжытуды көрсетіңіз)',
 'timezoneoffset' => 'Сағат ығысуы¹',
 'servertime' => 'Сервер уақыты',
 'guesstimezone' => 'Шолғыштан алып толтыру',
@@ -1255,7 +1363,7 @@ $3 келтірілген себебі: ''$2''",
 'timezoneregion-pacific' => 'Тынық мұхиты',
 'allowemail' => 'Басқадан хат қабылдауын қос',
 'prefs-searchoptions' => 'Іздеу бапталымдары',
-'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fлаÑ\80Ñ\8b',
+'prefs-namespaces' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96кÑ\82еÑ\80Ñ\96',
 'defaultns' => 'Мына есім аяларда әдепкіден іздеу:',
 'default' => 'әдепкі',
 'prefs-files' => 'Файлдар',
@@ -1264,6 +1372,7 @@ $3 келтірілген себебі: ''$2''",
 'username' => 'Қатысушы атыңыз:',
 'uid' => 'Қатысушы теңдестіргішіңіз:',
 'prefs-memberingroups' => 'Кірген {{PLURAL:$1|тобыңыз|топтарыңыз}}:',
+'prefs-registration' => 'Тіркелу уақыты:',
 'yourrealname' => 'Нақты атыңыз:',
 'yourlanguage' => 'Тіліңіз:',
 'yourvariant' => 'Тіл/жазба нұсқаңыз:',
@@ -1281,7 +1390,7 @@ $3 келтірілген себебі: ''$2''",
 'email' => 'Е-поштаңыз',
 'prefs-help-realname' => 'Нақты атыңыз міндетті емес.
 Егер бұны жетістіруді таңдасаңыз, бұл түзетуіңіздің ауторлығын анықтау үшін қолданылады.',
-'prefs-help-email' => 'Ð\95-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8b Ð¼Ñ\96ндеÑ\82Ñ\82Ñ\96 ÐµÐ¼ÐµÑ\81, Ð±Ñ\96Ñ\80аÒ\9b Ð¶ÐµÐºÐµ Ð±Ð°Ñ\81Ñ\8bÒ£Ñ\8bздÑ\8b Ð°Ñ\88пай Â«Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b» Ð½ÐµÐ¼ÐµÑ\81е Â«Ò\9aаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b\82алÒ\9bÑ\8bлаÑ\83Ñ\8b» Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80Ñ\96Ò£Ñ\96з Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ð±Ð°Ñ\80Ñ\88а Ñ\81Ñ\96збен Ð±Ð°Ð¹Ð»Ð°Ð½Ñ\8bÑ\81а Ð°лады.',
+'prefs-help-email' => 'ЭлекÑ\82Ñ\80ондÑ\8b Ð¿Ð¾Ñ\88Ñ\82аңÑ\8bздÑ\8bÒ£ Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83 Ð¼Ñ\96ндеÑ\82Ñ\82Ñ\96 ÐµÐ¼ÐµÑ\81, Ð±Ñ\96Ñ\80аÒ\9b Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 Ò±Ð¼Ñ\8bÑ\82Ò\9bан Ð¶Ð°Ò\93дайда ÐºÐµÑ\80ек Ð±Ð¾лады.',
 'prefs-help-email-required' => 'Е-пошта мекенжайы керек.',
 'prefs-info' => 'Негізгі мәлімет',
 'prefs-i18n' => 'Тіл туралы мәлімет',
@@ -1346,6 +1455,8 @@ $3 келтірілген себебі: ''$2''",
 'right-minoredit' => 'Өңдемелерді шағын деп белгілеу',
 'right-move' => 'Беттерді жылжыту',
 'right-move-subpages' => 'Беттерді бұлардың бағынышты беттерімен жылжыту',
+'right-move-rootuserpages' => 'қатысушы бетін ауыстыру',
+'right-movefile' => 'Файлдардың атын өзгерту',
 'right-suppressredirect' => 'Тиісті атауға бетті жылжытқанда айдағышты жасамау',
 'right-upload' => 'Файлдарды жүктеу',
 'right-reupload' => 'Бар файл үстіне жазу',
@@ -1401,14 +1512,22 @@ $3 келтірілген себебі: ''$2''",
 'action-read' => 'Осы бетті оқу',
 'action-edit' => 'осы бетті өңдеу',
 'action-delete' => 'Осы бетті жою',
+'action-mergehistory' => 'Бұл беттің өзгеріс тарихын қосу',
+'action-userrights' => 'Қатысушылардың барлық құқықтарын өзгерту',
+'action-userrights-interwiki' => 'Басқа уикилердегі қатысушылардың құқықтарын өзгерту',
+'action-siteadmin' => 'Дерекқорды бұғаттау немесе бұғаттан шығару',
+'action-sendemail' => 'электронды хаттарды жіберу',
 
 # Recent changes
 'nchanges' => '$1 өзгеріс',
 'recentchanges' => 'Жуықтағы өзгерістер',
 'recentchanges-legend' => 'Жуықтағы өзгерістер баптаулары',
-'recentchangestext' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
+'recentchanges-summary' => 'Бұл бетте осы уикидегі болған жуықтағы өзгерістер байқалады.',
 'recentchanges-feed-description' => 'Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.',
+'recentchanges-label-newpage' => 'Бұл өңдеме арқылы жаңа бет басталды',
 'recentchanges-label-minor' => 'Бұл шағын өңдеме',
+'recentchanges-label-bot' => 'Бұл өңдемені бот жасады.',
+'recentchanges-label-unpatrolled' => 'Бұл өңдеме әлі тексеруден өтпеді.',
 'rcnote' => "$3 кезіне дейін — төменде соңғы {{PLURAL:$2|күндегі|'''$2''' күндегі}}, соңғы '''$1''' өзгеріс көрсетіледі.",
 'rcnotefrom' => "'''$2''' кезінен бері — төменде '''$1''' жеткенше дейін өзгерістер көрсетіледі.",
 'rclistfrom' => '$1 кезінен бері — жаңа өзгерістерді көрсет.',
@@ -1420,16 +1539,20 @@ $3 келтірілген себебі: ''$2''",
 'rcshowhidemine' => 'Өңдемелерімді $1',
 'rclinks' => 'Соңғы $2 күнде болған, соңғы $1 өзгерісті көрсет<br />$3',
 'diff' => 'айырм.',
-'hist' => 'тар.',
-'hide' => 'жаÑ\81Ñ\8bÑ\80',
-'show' => 'көÑ\80Ñ\81еÑ\82',
+'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-old-title' => 'Бастапқы «$1» сияқты жасалған',
 
 # Recent changes linked
 'recentchangeslinked' => 'Қатысты өзгерістер',
@@ -1444,8 +1567,9 @@ $3 келтірілген себебі: ''$2''",
 
 # Upload
 'upload' => 'Жүктеу',
-'uploadbtn' => 'Қотарып бер!',
+'uploadbtn' => 'Файлды жүктеу',
 'reuploaddesc' => 'Жүктеу пішініне қайта келу.',
+'upload-tryagain' => 'Файл сипаттамасының өзгерістерін жөнелту',
 'uploadnologin' => 'Кірмегенсіз',
 'uploadnologintext' => 'Файлдарды қотарып беру үшін [[{{#special:Userlogin}}|кіруіңіз]] жөн.',
 'upload_directory_missing' => 'Қотарып бермек қалтасы ($1) жетіспейді және веб-сервер жарата алмайды.',
@@ -1481,6 +1605,7 @@ $3 келтірілген себебі: ''$2''",
 'filetype-unwanted-type' => "'''«.$1»''' — күтілмеген файл түрі. Ұнамды файл түрлері: $2.",
 'filetype-banned-type' => "'''«.$1»''' — рұқсатталмаған файл түрі. Рұқсатталған файл түрлері: $2.",
 'filetype-missing' => 'Бұл файлдың («.jpg» сияқты) кеңейтімі жоқ.',
+'empty-file' => 'Сіз жіберген файл бос.',
 'large-file' => 'Файлдың $1 мөлшерінен аспауына кепілдеме беріледі;
 бұл файл мөлшері — $2.',
 'largefileserver' => 'Осы файлдың мөлшері сервердің қалауынан асып кеткен.',
@@ -1508,21 +1633,28 @@ $3 келтірілген себебі: ''$2''",
 'file-exists-duplicate' => 'Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:',
 'uploadwarning' => 'Қотарып беру жөнінде құлақтандыру',
 'savefile' => 'Файлды сақтау',
-'uploadedimage' => '«[[$1]]» файлын қотарып берді',
+'uploadedimage' => '«[[$1]]» файлын жүктеді',
 'overwroteimage' => '«[[$1]]» файлынның жаңа нұсқасын қотарып берді',
 'uploaddisabled' => 'Қотарып беру өшірілген',
+'copyuploaddisabled' => 'URL арқылы жүктеу өшірілген.',
 'uploaddisabledtext' => '{{SITENAME}} жобасында файл қотарып беруі өшірілген.',
 'uploadscripted' => 'Бұл файлда веб шолғышты қателікпен талдатқызатын HTML не әмір коды бар.',
 'uploadvirus' => 'Бұл файлда вирус бар! Егжей-тегжейлері: $1',
+'upload-source' => 'Қайнар файл',
 'sourcefilename' => 'Қайнар файл атауы:',
+'sourceurl' => 'Қайнардың URL-мекенжайы:',
 'destfilename' => 'Нысана файл атауы:',
 'upload-maxfilesize' => 'Файлдың ең көп мүмкін мөлшері: $1',
-'watchthisupload' => 'Бұл бетті бақылау',
+'upload-description' => 'Файл сипаттамасы',
+'upload-options' => 'Жүктеу баптаулары',
+'watchthisupload' => 'Осы файлды бақылау',
 'filewasdeleted' => 'Бұл атауы бар файл бұрын қотарып берілген де бері келе жойылған.
 Бұны қайта қотарып беру алдынан $1 дегенді тексеріп шығыңыз.',
 'filename-bad-prefix' => "Қотарып бермек файлыңыздың атауы '''«$1» ''' деп басталады, мынадай сипаттаусыз атауды әдетте сандық камералар өздіктік береді.
 Файлыңызға сипаттылау атауды таңдаңыз.",
 'upload-success-subj' => 'Сәтті қотарып берілді',
+'upload-failure-subj' => 'Жүктеу мәселесі',
+'upload-warning-subj' => 'Жүктеу кезіндегі ескерту',
 
 'upload-proto-error' => 'Бұрыс хаттама',
 'upload-proto-error-text' => 'Шеттен қотарып беру үшін URL жайлары <code>http://</code> немесе <code>ftp://</code> дегендерден басталу жөн.',
@@ -1533,6 +1665,11 @@ $3 келтірілген себебі: ''$2''",
 'upload-misc-error-text' => 'Қотарып беру кезінде белгісіз қатеге ұшырасты.
 URL жарамды және қатынаулы екенін тексеріп шығыңыз да қайта байқап көріңіз.
 Егер бұл мәселе әлде де қалса, жүйе әкімшімен қатынасыңыз.',
+'upload-too-many-redirects' => 'URL шектен тыс жылжытуларға ие',
+'upload-unknown-size' => 'Белгісіз өлшем',
+
+# HTTP errors
+'http-read-error' => 'HTTP оқудағы қате.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL жетілмеді',
@@ -1544,19 +1681,20 @@ URL дұрыс екендігін және торап істеп тұрғаны
 Талабыңызды қол тиген кезінде қайта байқап көруіңіз мүмкін.',
 
 'license' => 'Лицензияландыруы:',
-'license-header' => 'Лицензияландыруы:',
+'license-header' => 'Лицензияландыруы',
 'nolicense' => 'Ештеңе бөлектенбеген',
 'license-nopreview' => '(Қарап шығу жетімді емес)',
 'upload_source_url' => ' (жарамды, баршаға қатынаулы URL)',
 'upload_source_file' => ' (компьютеріңіздегі файл)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Бұл арнайы бетте барлық қотарып берілген файлдар көрсетіледі.
-Соңғы қотарып берілген файлдар тізімде жоғарғы шетімен әдепкіден көрсетіледі.
+'listfiles-summary' => 'Бұл арнайы бетте барлық жүктелген файлдар көрсетіледі.
+Соңғы жүктелген файлдар тізімде жоғарғы шетімен әдепкіден көрсетіледі.
 Бағанның бас жолын нұқығанда сұрыптаудың реттеуі өзгертіледі.',
 'listfiles_search_for' => 'Таспа атауын іздеу:',
 'imgfile' => 'файл',
 'listfiles' => 'Файл тізімі',
+'listfiles_thumb' => 'Пішім',
 'listfiles_date' => 'Күн-айы',
 'listfiles_name' => 'Атауы',
 'listfiles_user' => 'Қатысушы',
@@ -1752,8 +1890,8 @@ URL дұрыс екендігін және торап істеп тұрғаны
 'nextpage' => 'Келесі бетке ($1)',
 'prevpage' => 'Алдыңғы бетке ($1)',
 'allpagesfrom' => 'Мына беттен бастап көрсету:',
-'allarticles' => 'Барлық бет тізімі',
-'allinnamespace' => 'Барлық бет ($1 есім аясы)',
+'allarticles' => 'Барлық беттер тізімі',
+'allinnamespace' => 'Барлық беттер ($1 есім кеңістігі)',
 'allnotinnamespace' => 'Барлық бет ($1 есім аясынан тыс)',
 'allpagesprev' => 'Алдыңғыға',
 'allpagesnext' => 'Келесіге',
@@ -1779,7 +1917,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:LinkSearch
 'linksearch' => 'Сыртқы сілтемелерді іздеу',
 'linksearch-pat' => 'Іздеу шарты:',
-'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b:',
+'linksearch-ns' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
 'linksearch-ok' => 'Іздеу',
 'linksearch-text' => '«*.wikipedia.org» атауына ұқсасты бәдел нышандарды қолдануға болады.',
 'linksearch-line' => '$2 дегеннен $1 сілтеген',
@@ -1905,7 +2043,8 @@ $NEWPAGE
 'historywarning' => 'Құлақтандыру: Жоюы көзделген бетте тарихы бар:',
 'confirmdeletetext' => 'Бетті бүкіл тарихымен бірге дерекқордан жойғалы жатырсыз.
 Бұл әрекетіңіз ниетпен жасалғанын, әрекет салдары есепке алынғанын және әрекетіңіз [[{{{{ns:mediawiki}}:Policy-url}}]]-іне лайықты болғанын тағы бір рет тексеріп шығуыңызды сұраймыз.',
-'actioncomplete' => 'Әрекет бітті',
+'actioncomplete' => 'Әрекет орындалды',
+'actionfailed' => 'Әрекет орындалмады',
 'deletedtext' => '«$1» жойылды.
 Жуықтағы жоюлар туралы жазбаларын $2 дегеннен қараңыз.',
 'dellogpage' => 'Жою_журналы',
@@ -1951,7 +2090,7 @@ $2 соңғы нұсқасына өзгертті.',
 'protectlogpage' => 'Қорғау журналы',
 'protectlogtext' => 'Төменде беттердің қорғау/қорғамау тізімі берілген.
 Ағымдағы қорғау әректтер бар беттер үшін [[{{#special:Protectedpages}}|қорғалған бет тізімін]] қараңыз.',
-'protectedarticle' => '«[[$1]]» қорғалды',
+'protectedarticle' => '«[[$1]]» беті қорғалды',
 'modifiedarticleprotection' => '«[[$1]]» қорғалу деңгейі өзгерді',
 'unprotectedarticle' => '«[[$1]]» қорғалуы өшірілді',
 'protect-title' => '«$1» қорғау деңгейін өзгерту',
@@ -2019,7 +2158,8 @@ $2 соңғы нұсқасына өзгертті.',
 Сілтемеңіз жарамсыз, не түзету қалпына келтірілген, немесе мұрағаттан аласталған болуы мүмкін.',
 'undelete-nodiff' => 'Еш алдыңғы түзету табылмады.',
 'undeletebtn' => 'Қалпына келтір!',
-'undeletelink' => 'қалпына келтіру',
+'undeletelink' => 'қарау/қалпына келтіру',
+'undeleteviewlink' => 'қарау',
 'undeletereset' => 'Қайта қой',
 'undeletecomment' => 'Мәндемесі:',
 'undeletedrevisions' => '$1 түзету қалпына келтірілді',
@@ -2047,13 +2187,14 @@ $1',
 'undelete-show-file-submit' => 'Иә',
 
 # Namespace form on various pages
-'namespace' => 'Ð\95Ñ\81Ñ\96м Ð°Ñ\8fÑ\81Ñ\8b:',
+'namespace' => 'Ð\95Ñ\81Ñ\96м ÐºÐµÒ£Ñ\96Ñ\81Ñ\82Ñ\96гÑ\96:',
 'invert' => 'Таңдалғанды жасыру',
 'namespace_association' => 'Қатысты есім аясы',
 'blanknamespace' => 'Негізгі беттерден',
 
 # Contributions
 'contributions' => 'Қатысушы үлесі',
+'contributions-title' => '$1 есімді қатысушының үлесі',
 'mycontris' => 'Үлесім',
 'contribsub2' => '$1 ($2) үлесі',
 'nocontribs' => 'Осы іздеу шартына сәйкес өзгерістер табылған жоқ.',
@@ -2065,10 +2206,12 @@ $1',
 'sp-contributions-newbies-sub' => 'Жаңадан тіркелгі жасағандар үшін',
 'sp-contributions-blocklog' => 'Бұғаттау журналы',
 'sp-contributions-deleted' => 'Қатысушының жойылған үлесі',
-'sp-contributions-talk' => 'Талқылауы',
+'sp-contributions-uploads' => 'жүктеулер',
+'sp-contributions-logs' => 'журналдар',
+'sp-contributions-talk' => 'талқылауы',
 'sp-contributions-userrights' => 'Қатысушы құқықтарын реттеу',
 'sp-contributions-search' => 'Үлес үшін іздеу',
-'sp-contributions-username' => 'IP мекенжайы не қатысушы аты:',
+'sp-contributions-username' => 'IP-мекенжайы немесе қатысушы аты:',
 'sp-contributions-submit' => 'Ізде',
 
 # What links here
@@ -2096,7 +2239,7 @@ $1',
 'blockiptext' => 'Төмендегі пішін қатысушының жазу рұқсатын белгілі IP мекенжайымен не атымен бұғаттау үшін қолданылады.
 Бұны тек бұзақылықты қақпайлау үшін және де [[{{{{ns:mediawiki}}:Policy-url}}|ережелер]] бойынша атқаруыңыз жөн.
 Төменде тиісті себебін толтырып көрсетіңіз (мысалы, дәйекке бұзақылықпен өзгерткен беттерді келтіріп).',
-'ipadressorusername' => 'IP мекенжайы не қатысушы аты:',
+'ipadressorusername' => 'IP-мекенжайы немесе қатысушы аты:',
 'ipbexpiry' => 'Мерзімі бітпек:',
 'ipbreason' => 'Себебі:',
 'ipbreasonotherlist' => 'Басқа себеп',
@@ -2111,14 +2254,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 бұғаттау тізімін]] қараңыз.',
@@ -2131,7 +2275,7 @@ $1',
 'ipusubmit' => 'Осы мекенжайды бұғаттамау',
 'unblocked' => '[[User:$1|$1]] бұғаттауы өшірілді',
 'unblocked-id' => '$1 бұғаттау аласталды',
-'ipblocklist' => 'Бұғатталған қатысушы / IP мекенжай тізімі',
+'ipblocklist' => 'Бұғатталған қатысушылар',
 'ipblocklist-legend' => 'Бұғатталған қатысушыны табу',
 'ipblocklist-submit' => 'Ізде',
 'infiniteblock' => 'мәнгі',
@@ -2144,6 +2288,7 @@ $1',
 'ipblocklist-no-results' => 'Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.',
 'blocklink' => 'бұғаттау',
 'unblocklink' => 'бұғаттамау',
+'change-blocklink' => 'Бұғаттауын өзгерту',
 'contribslink' => 'үлесі',
 'autoblocker' => 'IP мекенжайыңызды жуықта «[[{{ns:user}}:1|$1]]» пайдаланған, сондықтан өзбұғатталған.
 $1 бұғаттауы үшін келтірілген себебі: «$2».',
@@ -2183,8 +2328,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' => 'Құптау көзіне құсбелгі салмағансыз.',
@@ -2228,12 +2373,12 @@ $1 бұғаттауы үшін келтірілген себебі: «$2».',
 
 Ал мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
 'movearticle' => 'Ағымдағы бет атауы:',
-'movenologin' => 'Ð\96үйеге кірмегенсіз',
+'movenologin' => 'СÑ\96з Ð¶үйеге кірмегенсіз',
 'movenologintext' => 'Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.',
 'movenotallowed' => '{{SITENAME}} жобасында беттерді жылжыту руқсатыңыз жоқ.',
 'newtitle' => 'Жаңа бет атауы:',
 'move-watch' => 'Бұл бетті бақылау',
-'movepagebtn' => 'Бетті жылжыт',
+'movepagebtn' => 'Бетті жылжыту',
 'pagemovedsub' => 'Жылжыту сәтті аяқталды',
 'movepage-moved' => '\'\'\'"$1" беті "$2" бетіне жылжытылды\'\'\'',
 'articleexists' => 'Осылай аталған бет алдақашан бар, не таңдаған атауыңыз жарамды емес.
@@ -2291,6 +2436,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' => 'Үлкейту',
@@ -2342,13 +2493,13 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'import-logentry-interwiki-detail' => '$2 дегеннен $1 түзету',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Жеке бетім',
+'tooltip-pt-userpage' => 'Жеке бетіңіз',
 'tooltip-pt-anonuserpage' => 'Бұл IP мекенжайдың жеке беті',
-'tooltip-pt-mytalk' => 'Талқылау бетім',
+'tooltip-pt-mytalk' => 'Талқылау бетіңіз',
 'tooltip-pt-anontalk' => 'Бұл IP мекенжай өңдемелерін талқылау',
 'tooltip-pt-preferences' => 'Бапталымдарым',
 'tooltip-pt-watchlist' => 'Өзгерістерін бақылап тұрған беттер тізімім.',
-'tooltip-pt-mycontris' => 'Үлестерімдің тізімі',
+'tooltip-pt-mycontris' => 'Өңдеулеріңіздің тізімі',
 'tooltip-pt-login' => 'Кіруіңізді ұсынамыз, ол міндетті емес.',
 'tooltip-pt-anonlogin' => 'Кіруіңізді ұсынамыз, бірақ, ол міндетті емес.',
 'tooltip-pt-logout' => 'Шығу',
@@ -2402,6 +2553,8 @@ MediaWiki жүйесінің [[{{#special:Import}}|сырттан алу бет
 'tooltip-watch' => 'Бұл бетті бақылау тізіміңізге үстеу',
 'tooltip-recreate' => 'Бет жойылғанына қарамастан қайта бастау',
 'tooltip-upload' => 'Қотарып беруді бастау',
+'tooltip-rollback' => '"Шегіндіру" сілтемесін бір рет басу арқылы соңға редактордың барлық қатар өңдемелерін өшіру',
+'tooltip-summary' => 'Қысқаша сипаттамасын жазыңыз',
 
 # Stylesheets
 'common.css' => '/* Мында орналастырылған CSS барлық мәнерлерде қолданылады */',
@@ -2483,8 +2636,8 @@ $1',
 'filedelete-archive-read-only' => '«$1» мұрағат қалтасына веб-сервер жаза алмайды.',
 
 # Browsing diffs
-'previousdiff' => '← Алдыңғы айырм.',
-'nextdiff' => 'Келесі айырм. →',
+'previousdiff' => '← Алдыңғы өңдеме',
+'nextdiff' => 'Келесі өңдеме →',
 
 # Media information
 'mediawarning' => "'''Құлақтандыру''': Бұл файл түрінде қаскүнемді коды бар болуы ықтимал; бұны жегіп жүйеңізге зиян келтіруіңіз мүмкін.",
@@ -2494,7 +2647,7 @@ $1',
 'widthheightpage' => '$1 × $2, $3 бет',
 'file-info' => 'Файл мөлшері: $1, MIME түрі: $2',
 'file-info-size' => '$1 × $2 нүкте, файл мөлшері: $3, MIME түрі: $4',
-'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b Ð°Ð¶Ñ\8bÑ\80аÑ\82Ñ\8bлÑ\8bмдÑ\8bÒ\93Ñ\8b Ð¶ÐµÑ\82Ñ\96мÑ\81Ñ\96з.',
+'file-nohires' => 'Ð\96оÒ\93аÑ\80Ñ\8b ÐºÐµÒ£ÐµÐ¹Ñ\82Ñ\96лÑ\96мдегÑ\96 Ð½Ò±Ñ\81Ò\9bалаÑ\80Ñ\8b Ð¶Ð¾Ò\9b.',
 'svg-long-desc' => 'SVG файлы, кесімді $1 × $2 нүкте, файл мөлшері: $3',
 'show-big-image' => 'Жоғары ажыратылымды',
 
@@ -2791,7 +2944,7 @@ $1',
 
 # External editor support
 'edit-externally' => 'Бұл файлды шеттік қондырма арқылы өңдеу',
-'edit-externally-help' => 'Көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқамаларын] қараңыз.',
+'edit-externally-help' => '(көбірек ақпарат үшін [//www.mediawiki.org/wiki/Manual:External_editors орнату нұсқауларын] қараңыз.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'барлық',
@@ -2923,7 +3076,7 @@ $5
 # Watchlist editing tools
 'watchlisttools-view' => 'Қатысты өзгерістерді қарау',
 'watchlisttools-edit' => 'Бақылау тізімді қарау және өңдеу',
-'watchlisttools-raw' => 'Қам бақылау тізімді өңдеу',
+'watchlisttools-raw' => 'Бақылау тізімін өңдеу',
 
 # Iranian month names
 'iranian-calendar-m1' => 'пыруардин',
@@ -3034,5 +3187,7 @@ $5
 # New logging system
 'revdelete-restricted' => 'әкімшілерге тиымдар қолдады',
 'revdelete-unrestricted' => 'әкімшілерден тиымдарды аластады',
+'logentry-move-move-noredirect' => '$1 $3 бетін $4 бетіне жылжытты (айдатқыш қалдырылмады)',
+'logentry-move-move_redir-noredirect' => '$1 $3 бетін $4 деген айдатқыш үстіне жылжытты (айдатқыш қалдырылмады)',
 
 );
index 24aa511..3068bda 100644 (file)
@@ -1069,7 +1069,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 
 # Diffs
 'history-title' => '«$1» — tüzetw tarïxı',
-'difference' => '(Tüzetwler arasındağı aýırmaşılıq)',
 'lineno' => 'Jol nömiri $1:',
 'compareselectedversions' => 'Bölektengen nusqalardı salıstırw',
 'editundo' => 'joqqa şığarw',
@@ -1288,7 +1287,7 @@ Eger bunı jetistirwdi tañdasañız, bul tüzetwiñizdiñ awtorlığın anıqta
 # Recent changes
 'nchanges' => '$1 özgeris',
 'recentchanges' => 'Jwıqtağı özgerister',
-'recentchangestext' => 'Bul bette osı wïkïdegi bolğan jwıqtağı özgerister baýqaladı.',
+'recentchanges-summary' => 'Bul bette osı wïkïdegi bolğan jwıqtağı özgerister baýqaladı.',
 'recentchanges-feed-description' => 'Bul arnamenen wïkïdegi eñ soñğı özgerister qadağalanadı.',
 'rcnote' => "$3 kezine deýin — tömende soñğı {{PLURAL:$2|kündegi|'''$2''' kündegi}}, soñğı '''$1''' özgeris körsetiledi.",
 'rcnotefrom' => "'''$2''' kezinen beri — tömende '''$1''' jetkenşe deýin özgerister körsetiledi.",
index 149187b..e7f6e67 100644 (file)
@@ -948,7 +948,7 @@ $2',
 'userinvalidcssjstitle' => "'''ប្រយ័ត្ន៖''' គ្មានសំបក \"\$1\"។ ចងចាំថា ទំព័រផ្ទាល់ខ្លួន .css និង .js ប្រើប្រាស់ ចំណងជើង ជាអក្សរតូច, ឧទាហរណ៍  {{ns:user}}:Foo/vector.css ត្រឹមត្រូវ, រីឯ {{ns:user}}:Foo/Vector.css មិនត្រឹមត្រូវ។",
 'updated' => '(បានបន្ទាន់សម័យ)',
 'note' => "'''ចំណាំ៖'''",
-'previewnote' => "'''á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bមិនទាន់បាន​រក្សាទុកទេ!'''",
+'previewnote' => "'''á\9e\9fá\9e¼á\9e\98á\9e\85á\9e¶á\9f\86á\9e\90á\9e¶á\9e\93á\9f\81á\9f\87á\9e\82á\9f\92á\9e\9aá\9e¶á\9e\93á\9f\8bá\9e\8fá\9f\82á\9e\87á\9e¶â\80\8bá\9e\80á\9e¶á\9e\9aá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9e¶á\9e\9aá\9e\98á\9e¾á\9e\9bá\9e\87á\9e¶á\9e\98á\9e»á\9e\93á\9e\94á\9f\89á\9e»á\9e\8eá\9f\92á\9e\8eá\9f\84á\9f\87á\9f\94 á\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aâ\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80មិនទាន់បាន​រក្សាទុកទេ!'''",
 'previewconflict' => 'ការមើលមុននេះយោងតាមអត្ថបទក្នុងប្រអប់កែប្រែខាងលើ។ ទំព័រអត្ថបទនឹងបង្ហាញចេញបែបនេះប្រសិនបើអ្នកជ្រើសរើសរក្សាទុក។',
 'session_fail_preview' => "'''សូមអភ័យទោស! យើងមិនអាចរក្សាទុកការកែប្រែរបស់អ្នកបានទេ ដោយសារបាត់ទិន្នន័យវេនការងារ។
 
@@ -1206,7 +1206,6 @@ $1",
 
 # Diffs
 'history-title' => 'ប្រវត្តិកំណែប្រែនានានៃ "$1"',
-'difference' => '(ប្រៀបធៀបកំណែនានា)',
 'difference-multipage' => '(ភាពខុសគ្នារវាងទំព័រនានា)',
 'lineno' => 'បន្ទាត់ទី$1៖',
 'compareselectedversions' => 'ប្រៀបធៀប​កំណែដែលបាន​ជ្រើសយក',
@@ -1556,7 +1555,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|បំលាស់ប្ដូរ|បំលាស់ប្ដូរ}}',
 'recentchanges' => 'បំលាស់ប្ដូរ​ថ្មីៗ',
 'recentchanges-legend' => 'ជម្រើសនានា​ សម្រាប់ការបង្ហាញបន្លាស់ប្ដូរថ្មីៗ',
-'recentchangestext' => 'តាមដានរាល់បន្លាស់ប្ដូររថ្មីៗបំផុត ចំពោះវិគីនៅលើទំព័រនេះ។',
+'recentchanges-summary' => 'តាមដានរាល់បំលាស់ប្ដូរថ្មីៗបំផុតចំពោះវិគីនៅលើទំព័រនេះ។',
 'recentchanges-feed-description' => 'តាមដាន​បន្លាស់ប្ដូរថ្មីៗ​បំផុត​នៃ​វិគី​នេះក្នុង​មតិព័ត៌មាន​នេះ​។',
 'recentchanges-label-newpage' => 'ការកែប្រែនេះបានបង្កើតទំព័រថ្មីមួយ',
 'recentchanges-label-minor' => 'នេះជាការកែប្រែតិចតួចមួយប៉ុណ្ណោះ',
index 0ca82d3..f1c641d 100644 (file)
@@ -802,7 +802,6 @@ $2',
 
 # Diffs
 'history-title' => '"$1" ಪುಟದ ಬದಲಾವಣೆಗಳ ಇತಿಹಾಸ',
-'difference' => '(ಆವೃತ್ತಿಗಳ ನಡುವಿನ ವ್ಯತ್ಯಾಸ)',
 'lineno' => '$1 ನೇ ಸಾಲು:',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಾಡಿದ ಆವೃತ್ತಿಗಳನ್ನು ಹೊಂದಾಣಿಕೆ ಮಾಡಿ ನೋಡಿ',
 'showhideselectedversions' => 'ಆಯ್ದ ಆವೃತ್ತಿಗಳನ್ನು ತೋರಿಸು/ಅಡಗಿಸು',
@@ -1030,7 +1029,7 @@ $2',
 'nchanges' => '$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಗಳು}}',
 'recentchanges' => 'ಇತ್ತೀಚೆಗಿನ ಬದಲಾವಣೆಗಳು',
 'recentchanges-legend' => 'ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳ ಆಯ್ಕೆಗಳು',
-'recentchangestext' => 'ವಿಕಿಗೆ ಮಾಡಲ್ಪಟ್ಟ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಪುಟದಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.',
+'recentchanges-summary' => 'ವಿಕಿಗೆ ಮಾಡಲ್ಪಟ್ಟ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಪುಟದಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.',
 'recentchanges-feed-description' => 'ವಿಕಿಯಲ್ಲಿ ಆಗುವ ಹೊಸ ಬದಲಾವಣೆಗಳ ಮೇಲೆ ನಿಗ ಇಡಲು ಉಪಯೋಗವಾಗುವ ಫೀಡು.',
 'recentchanges-label-minor' => 'ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ',
 'rcnote' => "$5, $4 ವರೆಗೆ ಹಿಂದಿನ {{PLURAL:$2|ದಿನದಲ್ಲಿ|'''$2''' ದಿನಗಳಲ್ಲಿ}} ಮಾಡಲಾಗಿರುವ {{PLURAL:$1|'''೧''' ಬದಲಾವಣೆ|'''$1''' ಬದಲಾವಣೆಗಳು}} ಕೆಳಗಿವೆ.",
index bec964d..d8c1e4b 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Albamhandae
+ * @author Altostratus
  * @author Chanhee
  * @author Chulki Lee
  * @author Cwt96
@@ -23,6 +24,7 @@
  * @author Kaganer
  * @author Klutzy
  * @author Kwj2772
+ * @author Mintz0223
  * @author Pi.C.Noizecehx
  * @author PuzzletChung
  * @author TheAlpha for knowledge
@@ -30,6 +32,7 @@
  * @author Yknok29
  * @author לערי ריינהארט
  * @author 관인생략
+ * @author 아라
  */
 
 $namespaceNames = array(
@@ -63,13 +66,15 @@ $specialPageAliases = array(
        'Allmessages'               => array( '모든메시지' ),
        'Allpages'                  => array( '모든문서' ),
        'Ancientpages'              => array( '오래된문서' ),
+       'Badtitle'                  => array( '잘못된이름', '인식불가이름', '잘못된제목', '인식불가제목' ),
        'Blankpage'                 => array( '빈문서' ),
        'Block'                     => array( '차단' ),
        'Blockme'                   => array( '자가차단' ),
        'Booksources'               => array( '책찾기' ),
        'BrokenRedirects'           => array( '끊긴넘겨주기' ),
        'Categories'                => array( '분류' ),
-       'ChangePassword'            => array( '비밀번호변경', '비밀번호바꾸기' ),
+       'ChangeEmail'               => array( '이메일변경', '이메일바꾸기' ),
+       'ChangePassword'            => array( '비밀번호변경', '비밀번호바꾸기', '비밀단어변경', '비밀단어바꾸기' ),
        'ComparePages'              => array( '문서비교' ),
        'Confirmemail'              => array( '이메일인증' ),
        'Contributions'             => array( '기여', '기여목록', '사용자기여' ),
@@ -78,6 +83,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( '삭제된기여' ),
        'Disambiguations'           => array( '동음이의', '동음이의문서' ),
        'DoubleRedirects'           => array( '이중넘겨주기' ),
+       'EditWatchlist'             => array( '주시문서목록편집' ),
        'Emailuser'                 => array( '이메일보내기' ),
        'Export'                    => array( '내보내기' ),
        'Fewestrevisions'           => array( '역사짧은문서' ),
@@ -85,6 +91,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( '파일경로', '그림경로' ),
        'Import'                    => array( '가져오기' ),
        'Invalidateemail'           => array( '이메일인증취소', '이메일인증해제' ),
+       'JavaScriptTest'            => array( '자바스크립트시험' ),
        'BlockList'                 => array( '차단된사용자', '차단목록' ),
        'LinkSearch'                => array( '외부링크찾기', '외부링크검색' ),
        'Listadmins'                => array( '관리자', '관리자목록' ),
@@ -95,7 +102,7 @@ $specialPageAliases = array(
        'Listusers'                 => array( '사용자', '사용자목록' ),
        'Lockdb'                    => array( 'DB잠금', 'DB잠그기' ),
        'Log'                       => array( '기록', '로그' ),
-       'Lonelypages'               => array( '외톨이문서' ),
+       'Lonelypages'               => array( '외톨이문서', '홀로된문서' ),
        'Longpages'                 => array( '긴문서' ),
        'MergeHistory'              => array( '역사합치기' ),
        'MIMEsearch'                => array( 'MIME찾기', 'MIME검색' ),
@@ -112,7 +119,8 @@ $specialPageAliases = array(
        'Myuploads'                 => array( '내가올린파일' ),
        'Newimages'                 => array( '새파일', '새그림' ),
        'Newpages'                  => array( '새문서' ),
-       'PasswordReset'             => array( '암호변경' ),
+       'PasswordReset'             => array( '비밀번호초기화', '비밀단어초기화' ),
+       'PermanentLink'             => array( '고유링크', '영구링크' ),
        'Popularpages'              => array( '인기있는문서' ),
        'Preferences'               => array( '환경설정' ),
        'Prefixindex'               => array( '접두어찾기' ),
@@ -123,6 +131,7 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '최근바뀜' ),
        'Recentchangeslinked'       => array( '링크최근바뀜' ),
        'Revisiondelete'            => array( '특정판삭제' ),
+       'RevisionMove'              => array( '특정판이동' ),
        'Search'                    => array( '찾기', '검색' ),
        'Shortpages'                => array( '짧은문서' ),
        'Specialpages'              => array( '특수문서', '특수기능' ),
@@ -135,11 +144,12 @@ $specialPageAliases = array(
        'Uncategorizedtemplates'    => array( '분류안된틀' ),
        'Undelete'                  => array( '삭제취소', '삭제된문서' ),
        'Unlockdb'                  => array( 'DB잠금취소', 'DB잠금해제' ),
-       'Unusedcategories'          => array( '안쓰는분류' ),
-       'Unusedimages'              => array( '안쓰는파일', '안쓰는그림' ),
-       'Unusedtemplates'           => array( '안쓰는틀' ),
+       'Unusedcategories'          => array( '안쓰는분류', '쓰이지않는분류' ),
+       'Unusedimages'              => array( '안쓰는파일', '안쓰는그림', '쓰이지않는파일', '쓰이지않는그림' ),
+       'Unusedtemplates'           => array( '안쓰는틀', '쓰이지않는틀' ),
        'Unwatchedpages'            => array( '주시안되는문서' ),
-       'Upload'                    => array( '파일올리기', '그림올리기' ),
+       'Upload'                    => array( '올리기', '파일올리기', '그림올리기' ),
+       'UploadStash'               => array( '올린비공개파일' ),
        'Userlogin'                 => array( '로그인' ),
        'Userlogout'                => array( '로그아웃' ),
        'Userrights'                => array( '권한조정' ),
@@ -157,10 +167,10 @@ $magicWords = array(
        'redirect'                => array( '0', '#넘겨주기', '#REDIRECT' ),
        'notoc'                   => array( '0', '__목차숨김__', '__NOTOC__' ),
        'nogallery'               => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
-       'forcetoc'                => array( '0', '__목차보임__', '__FORCETOC__' ),
+       'forcetoc'                => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
        'toc'                     => array( '0', '__목차__', '__TOC__' ),
        'noeditsection'           => array( '0', '__단락편집숨김__', '__NOEDITSECTION__' ),
-       'noheader'                => array( '0', '__헤더숨김__', '__NOHEADER__' ),
+       'noheader'                => array( '0', '__머릿글숨김__', '__헤더숨김__', '__NOHEADER__' ),
        'currentmonth'            => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'           => array( '1', '현재월1', 'CURRENTMONTH1' ),
        'currentmonthname'        => array( '1', '현재월이름', 'CURRENTMONTHNAME' ),
@@ -194,6 +204,7 @@ $magicWords = array(
        'pagenamee'               => array( '1', '문서이름E', 'PAGENAMEE' ),
        'namespace'               => array( '1', '이름공간', 'NAMESPACE' ),
        'namespacee'              => array( '1', '이름공간E', 'NAMESPACEE' ),
+       'namespacenumber'         => array( '1', '이름공간수', 'NAMESPACENUMBER' ),
        'talkspace'               => array( '1', '토론이름공간', 'TALKSPACE' ),
        'talkspacee'              => array( '1', '토론이름공간E', 'TALKSPACEE' ),
        'subjectspace'            => array( '1', '본문서이름공간', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -211,8 +222,9 @@ $magicWords = array(
        'msg'                     => array( '0', '메시지:', 'MSG:' ),
        'subst'                   => array( '0', '풀기:', 'SUBST:' ),
        'safesubst'               => array( '0', '안전풀기:', 'SAFESUBST:' ),
-       'img_thumbnail'           => array( '1', '섬네일', '썸네일', 'thumbnail', 'thumb' ),
-       'img_manualthumb'         => array( '1', '섬네일=$1', '썸네일=$1', 'thumbnail=$1', 'thumb=$1' ),
+       'msgnw'                   => array( '0', '위키잘못메시지:', 'MSGNW:' ),
+       'img_thumbnail'           => array( '1', '섬네일', '썸네일', '축소판', 'thumbnail', 'thumb' ),
+       'img_manualthumb'         => array( '1', '섬네일=$1', '썸네일=$1', '축소판=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'               => array( '1', '오른쪽', 'right' ),
        'img_left'                => array( '1', '왼쪽', 'left' ),
        'img_none'                => array( '1', '없음', 'none' ),
@@ -221,25 +233,33 @@ $magicWords = array(
        'img_framed'              => array( '1', '프레임', 'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( '1', '프레임없음', 'frameless' ),
        'img_page'                => array( '1', '문서=$1', 'page=$1', 'page $1' ),
+       'img_upright'             => array( '1', '위오른쪽', '위오른쪽=$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'              => array( '1', '테두리', 'border' ),
        'img_baseline'            => array( '1', '밑줄', 'baseline' ),
        'img_sub'                 => array( '1', '아래첨자', 'sub' ),
        'img_super'               => array( '1', '위첨자', 'super', 'sup' ),
        'img_top'                 => array( '1', '위', 'top' ),
+       'img_text_top'            => array( '1', '글자위', '텍스트위', 'text-top' ),
        'img_middle'              => array( '1', '중간', 'middle' ),
        'img_bottom'              => array( '1', '아래', 'bottom' ),
+       'img_text_bottom'         => array( '1', '글자아래', '텍스트아래', 'text-bottom' ),
        'img_link'                => array( '1', '링크=$1', 'link=$1' ),
+       'img_alt'                 => array( '1', '대체글=$1', 'alt=$1' ),
+       'int'                     => array( '0', '정수:', 'INT:' ),
        'sitename'                => array( '1', '사이트이름', 'SITENAME' ),
        'ns'                      => array( '0', '이름:', '이름공간:', 'NS:' ),
        'nse'                     => array( '0', '이름E:', '이름공간E:', 'NSE:' ),
        'localurl'                => array( '0', '지역주소:', 'LOCALURL:' ),
        'localurle'               => array( '0', '지역주소E:', 'LOCALURLE:' ),
+       'articlepath'             => array( '0', '항목경로', '기사경로', 'ARTICLEPATH' ),
        'server'                  => array( '0', '서버', 'SERVER' ),
        'servername'              => array( '0', '서버이름', 'SERVERNAME' ),
        'scriptpath'              => array( '0', '스크립트경로', 'SCRIPTPATH' ),
        'stylepath'               => array( '0', '스타일경로', 'STYLEPATH' ),
        'grammar'                 => array( '0', '문법:', 'GRAMMAR:' ),
        'gender'                  => array( '0', '성별:', 'GENDER:' ),
+       'notitleconvert'          => array( '0', '__제목변환없음__', '__제변없음__', '__제목변환안함__', '__제변안함__', '__NOTITLECONVERT__', '__NOTC__' ),
+       'nocontentconvert'        => array( '0', '__내용변환없음__', '__내변없음__', '__내용변환안함__', '__내변안함__', '__NOCONTENTCONVERT__', '__NOCC__' ),
        'currentweek'             => array( '1', '현재주', 'CURRENTWEEK' ),
        'currentdow'              => array( '1', '현재요일숫자', 'CURRENTDOW' ),
        'localweek'               => array( '1', '지역주', 'LOCALWEEK' ),
@@ -255,11 +275,14 @@ $magicWords = array(
        'plural'                  => array( '0', '복수:', '복수형:', 'PLURAL:' ),
        'fullurl'                 => array( '0', '전체주소:', 'FULLURL:' ),
        'fullurle'                => array( '0', '전체주소E:', 'FULLURLE:' ),
+       'canonicalurl'            => array( '0', '표준주소:', 'CANONICALURL:' ),
+       'canonicalurle'           => array( '0', '표준주소E:', 'CANONICALURLE:' ),
        'lcfirst'                 => array( '0', '첫소문자:', 'LCFIRST:' ),
        'ucfirst'                 => array( '0', '첫대문자:', 'UCFIRST:' ),
        'lc'                      => array( '0', '소문자:', 'LC:' ),
        'uc'                      => array( '0', '대문자:', 'UC:' ),
-       'displaytitle'            => array( '1', '제목표시', 'DISPLAYTITLE' ),
+       'raw'                     => array( '0', '원시:', 'RAW:' ),
+       'displaytitle'            => array( '1', '제목보이기', '제목표시', 'DISPLAYTITLE' ),
        'newsectionlink'          => array( '1', '__새글쓰기__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'        => array( '1', '__새글쓰기숨기기__', '__NONEWSECTIONLINK__' ),
        'currentversion'          => array( '1', '현재버전', 'CURRENTVERSION' ),
@@ -267,11 +290,16 @@ $magicWords = array(
        'anchorencode'            => array( '0', '책갈피인코딩', 'ANCHORENCODE' ),
        'currenttimestamp'        => array( '1', '현재타임스탬프', 'CURRENTTIMESTAMP' ),
        'localtimestamp'          => array( '1', '지역타임스탬프', 'LOCALTIMESTAMP' ),
+       'directionmark'           => array( '1', '명령검토', 'DIRECTIONMARK', 'DIRMARK' ),
        'language'                => array( '0', '#언어:', '#LANGUAGE:' ),
        'contentlanguage'         => array( '1', '기본언어', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
        'pagesinnamespace'        => array( '1', '이름공간문서수', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'          => array( '1', '관리자수', 'NUMBEROFADMINS' ),
+       'formatnum'               => array( '0', '수형식', 'FORMATNUM' ),
+       'padleft'                 => array( '0', '대체왼쪽', 'PADLEFT' ),
+       'padright'                => array( '0', '대체오른쪽', 'PADRIGHT' ),
        'special'                 => array( '0', '특수기능', 'special' ),
+       'speciale'                => array( '0', '특수기능E', '특수기능e', 'speciale' ),
        'defaultsort'             => array( '1', '기본정렬:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                => array( '0', '파일경로:', '그림경로:', 'FILEPATH:' ),
        'tag'                     => array( '0', '태그', 'tag' ),
@@ -279,11 +307,16 @@ $magicWords = array(
        'pagesincategory'         => array( '1', '분류문서수', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                => array( '1', '문서크기', 'PAGESIZE' ),
        'index'                   => array( '1', '__색인__', '__INDEX__' ),
-       'noindex'                 => array( '1', '__색인거부__', '__NOINDEX__' ),
+       'noindex'                 => array( '1', '__색인안함__', '__색인거부__', '__NOINDEX__' ),
        'numberingroup'           => array( '1', '권한별사용자수', '그룹별사용자수', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'          => array( '1', '__넘겨주기고정__', '__STATICREDIRECT__' ),
        'protectionlevel'         => array( '1', '보호수준', 'PROTECTIONLEVEL' ),
        'formatdate'              => array( '0', '날짜형식', 'formatdate', 'dateformat' ),
+       'url_path'                => array( '0', '경로', 'PATH' ),
+       'url_wiki'                => array( '0', '위키', 'WIKI' ),
+       'url_query'               => array( '0', '쿼리', 'QUERY' ),
+       'defaultsort_noerror'     => array( '0', '오류없음', 'noerror' ),
+       'defaultsort_noreplace'   => array( '0', '바꾸기없음', 'noreplace' ),
 );
 
 $bookstoreList = array(
@@ -310,10 +343,10 @@ $messages = array(
 'tog-hidepatrolled' => '최근 바뀜에서 검토된 편집을 숨기기',
 'tog-newpageshidepatrolled' => '새 문서 목록에서 검토된 문서를 숨기기',
 'tog-extendwatchlist' => '주시문서 목록에서 가장 최근의 편집만이 아닌 모든 편집을 보기',
-'tog-usenewrc' => '향상된 최근 바뀜 (자바스크립트)',
+'tog-usenewrc' => '최근 바뀜 및 주시 문서 목록에서 문서별 그룹 바뀜 (자바스크립트 필요)',
 'tog-numberheadings' => '머릿글 번호 매기기',
 'tog-showtoolbar' => '편집창에 툴바 보이기 (자바스크립트)',
-'tog-editondblclick' => '더블클릭으로 문서 편집하기 (자바스크립트)',
+'tog-editondblclick' => '더블 클릭으로 문서 편집하기 (자바스크립트)',
 'tog-editsection' => '[편집] 링크로 부분 편집하기',
 'tog-editsectiononrightclick' => '제목을 오른쪽 클릭해서 부분 편집하기 (자바스크립트)',
 'tog-showtoc' => '문서의 차례 보여주기 (머릿글이 4개 이상인 경우)',
@@ -344,9 +377,11 @@ $messages = array(
 'tog-watchlisthideliu' => '주시문서 목록에서 로그인한 사용자의 편집을 숨기기',
 'tog-watchlisthideanons' => '주시문서 목록에서 비등록 사용자의 편집을 숨기기',
 'tog-watchlisthidepatrolled' => '주시문서 목록에서 검토된 편집을 숨기기',
+'tog-nolangconversion' => '변형 변환을 비활성화',
 'tog-ccmeonemails' => '이메일을 보낼 때 내 이메일로 복사본을 보내기',
 'tog-diffonly' => '편집 차이를 비교할 때 문서 내용을 보지 않기',
 'tog-showhiddencats' => '숨은 분류 보기',
+'tog-noconvertlink' => '링크 제목 변환을 비활성화',
 'tog-norollbackdiff' => '되돌리기 후 차이를 보이지 않기',
 
 'underline-always' => '항상',
@@ -420,11 +455,11 @@ $messages = array(
 'category-empty' => '이 분류에 속하는 문서나 자료가 없습니다.',
 'hidden-categories' => '{{PLURAL:$1|숨은 분류}}',
 'hidden-category-category' => '숨은 분류',
-'category-subcat-count' => '다음은 이 분류에 속하는 하위 분류 {{PLURAL:$2|$1 개|$2 개 가운데 $1 개}} 입니다.',
+'category-subcat-count' => '{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 하위 분류 $2개 가운데 $1개입니다.}}',
 'category-subcat-count-limited' => '이 분류에 하위분류가 $1개 있습니다.',
-'category-article-count' => '다음은 이 분류에 속하는 문서 {{PLURAL:$2|$1 개|$2 개 가운데 $1 개}} 입니다.',
+'category-article-count' => '{{PLURAL:$2|이 분류에는 문서 1개만이 속해 있습니다.|다음은 이 분류에 속하는 문서 $2개 가운데 $1개입니다.}}',
 'category-article-count-limited' => '이 분류에 문서가 $1개 있습니다.',
-'category-file-count' => '다음은 이 분류에 속하는 파일 {{PLURAL:$2|$1 개|$2 개 가운데 $1 개}} 입니다.',
+'category-file-count' => '{{PLURAL:$2|이 분류에는 파일 1개만이 속해 있습니다.|다음은 이 분류에 속하는 파일 $2개 가운데 $1개입니다.}}',
 'category-file-count-limited' => '이 분류에 파일이 $1개 있습니다.',
 'listingcontinuesabbrev' => ' (계속)',
 'index-category' => '색인된 문서',
@@ -448,7 +483,7 @@ $messages = array(
 'qbedit' => '편집',
 'qbpageoptions' => '문서 기능',
 'qbpageinfo' => '문서 정보',
-'qbmyoptions' => '내 문서',
+'qbmyoptions' => '내 사용자 문서',
 'qbspecialpages' => '특수 문서',
 'faq' => '자주 묻는 질문',
 'faqpage' => 'Project:FAQ',
@@ -461,7 +496,7 @@ $messages = array(
 'vector-action-undelete' => '되살리기',
 'vector-action-unprotect' => '보호 설정 변경',
 'vector-simplesearch-preference' => '향상된 검색어 제안 사용하기 (벡터 스킨 전용)',
-'vector-view-create' => '생성',
+'vector-view-create' => '만들기',
 'vector-view-edit' => '편집',
 'vector-view-history' => '역사',
 'vector-view-view' => '읽기',
@@ -486,7 +521,7 @@ $messages = array(
 'print' => '인쇄',
 'view' => '보기',
 'edit' => '편집',
-'create' => '생성',
+'create' => '만들기',
 'editthispage' => '이 문서 편집하기',
 'create-this-page' => '이 문서 만들기',
 'delete' => '삭제',
@@ -580,7 +615,7 @@ $1',
 'collapsible-expand' => '보이기',
 'thisisdeleted' => '$1을 보거나 되살리겠습니까?',
 'viewdeleted' => '$1을 보겠습니까?',
-'restorelink' => '삭제된 편집 $1 개',
+'restorelink' => '삭제된 편집 $1개',
 'feedlinks' => '피드:',
 'feed-invalid' => '잘못된 구독 피드 방식입니다.',
 'feed-unavailable' => '피드 서비스는 제공하지 않습니다',
@@ -659,8 +694,8 @@ $1',
 'cannotdelete-title' => '"$1" 문서를 삭제할 수 없습니다.',
 'badtitle' => '잘못된 제목',
 'badtitletext' => '문서 제목이 잘못되었거나 비어있습니다.',
-'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|$1개의 결과}}가 있습니다.',
-'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 갱신되었습니다.  캐시에 최대 {{PLURAL:$4|$4개의 결과}}가 있습니다.',
+'perfcached' => '다음 자료는 캐시된 것이므로 현재 상황을 반영하지 않을 수 있습니다. 캐시에 최대 {{PLURAL:$1|결과 $1개}}가 있습니다.',
+'perfcachedts' => '다음 자료는 캐시된 것으로, $1에 마지막으로 갱신되었습니다.  캐시에 최대 {{PLURAL:$4|결과 $4개}}가 있습니다.',
 'querypage-no-updates' => '이 문서의 갱신이 현재 비활성화되어 있습니다. 자료가 잠시 갱신되지 않을 것입니다.',
 'wrong_wfQuery_params' => 'wfQuery()에서 잘못된 매개변수 발생<br />함수: $1<br />쿼리: $2',
 'viewsource' => '내용 보기',
@@ -685,6 +720,10 @@ $2',
 'filereadonlyerror' => '‘$2’ 파일 저장소가 읽기 전용이기 때문에 ‘$1’ 파일을 변경할 수 없습니다.
 
 저장소 관리자가 파일 저장소를 잠근 이유에 대해 "\'\'$3\'\'"이라는 설명을 남겼습니다.',
+'invalidtitle-knownnamespace' => '제목 오류: 이름공간 "$2"와 텍스트 "$3"',
+'invalidtitle-unknownnamespace' => '제목 오류: 알 수 없는 이름공간 번호 "$1"과, 텍스트 "$2"',
+'exception-nologin' => '로그인하지 않음',
+'exception-nologin-text' => '이 문서나 행동은 이 위키에 로그인을 해야 합니다.',
 
 # Virus scanner
 'virus-badscanner' => "잘못된 설정: 알 수 없는 바이러스 검사기: ''$1''",
@@ -701,7 +740,7 @@ $2',
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '계정 이름:',
 'yourpassword' => '비밀번호:',
-'yourpasswordagain' => '비밀번호 입력:',
+'yourpasswordagain' => '비밀번호 다시 입력:',
 'remembermypassword' => '이 컴퓨터에서 로그인 상태를 저장하기 (최대 $1일)',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다.',
 'yourdomainname' => '도메인 이름',
@@ -713,7 +752,7 @@ $2',
 'userloginnocreate' => '로그인',
 'logout' => '로그아웃',
 'userlogout' => '로그아웃',
-'notloggedin' => '로그인하고 있지 않음',
+'notloggedin' => '로그인하지 않음',
 'nologin' => '계정이 없나요? $1.',
 'nologinlink' => '계정을 만들 수 있습니다',
 'createaccount' => '계정 만들기',
@@ -741,7 +780,7 @@ $2',
 'nouserspecified' => '사용자 이름을 입력하지 않았습니다.',
 'login-userblocked' => '이 사용자는 차단되었습니다. 로그인할 수 없습니다.',
 'wrongpassword' => '입력한 비밀번호가 다릅니다. 다시 시도해 주세요.',
-'wrongpasswordempty' => 'ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\93°지 않았습니다.
+'wrongpasswordempty' => 'ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e\85ë ¥í\95\98지 않았습니다.
 다시 시도해 주세요.',
 'passwordtooshort' => '비밀번호는 $1 문자 이상이어야 합니다.',
 'password-name-match' => '비밀번호는 사용자 이름과 반드시 달라야 합니다.',
@@ -760,7 +799,7 @@ $2',
 'eauthentsent' => '확인 이메일을 보냈습니다. 이메일 내용의 지시대로 계정 확인 절차를 실행해 주십시오.',
 'throttled-mailpassword' => '비밀번호 확인 이메일을 이미 최근 $1 시간 안에 보냈습니다. 악용을 방지하기 위해 비밀번호 확인 메일은 $1 시간마다 오직 하나씩만 보낼 수 있습니다.',
 'mailerror' => '메일 보내기 오류: $1',
-'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 생성하여, 계정 생성 한도를 초과하였습니다.
+'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 생성 한도를 초과하였습니다.
 따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
 'emailauthenticated' => '당신의 이메일 주소는 $2 $3에 인증되었습니다.',
 'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다. 이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.',
@@ -790,6 +829,7 @@ $2',
 # Change password dialog
 'resetpass' => '비밀번호 바꾸기',
 'resetpass_announce' => '이메일로 받은 임시 비밀번호로 로그인했습니다. 로그인을 마치려면 새 비밀번호를 여기에서 설정해야 합니다:',
+'resetpass_text' => '<!-- 여기에 텍스트를 추가하세요 -->',
 'resetpass_header' => '비밀번호 변경',
 'oldpassword' => '이전 비밀번호:',
 'newpassword' => '새 비밀번호:',
@@ -836,7 +876,7 @@ $2
 'passwordreset-emailerror-capture' => '비밀번호 찾기 이메일이 생성되어 아래에 표시되었지만 발송하는 데에는 실패했습니다: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'E-mail 주소 변경',
+'changeemail' => '이메일 주소 바꾸기',
 'changeemail-header' => '계정 메일 주소 변경',
 'changeemail-text' => '이메일 주소를 바꾸려면 이 양식을 채워주십시오. 변경 내용을 확인하기 위해 당신의 비밀번호를 입력해야합니다.',
 'changeemail-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
@@ -952,7 +992,8 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
 'updated' => '(바뀜)',
 'note' => "'''주의:'''",
-'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다! [[#editform|→ 편집 계속하기]]",
+'previewnote' => "'''이 화면은 미리 보기입니다'''. 편집한 내용은 아직 저장되지 않았습니다!",
+'continue-editing' => '계속 편집하기',
 'previewconflict' => '이 미리 보기는 저장할 때의 모습, 즉 위쪽 편집창의 문서를 반영합니다.',
 'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.
 다시 시도해도 되지 않으면 [[Special:UserLogout|로그아웃]]한 다음 다시 로그인해 보십시오.'''",
@@ -1005,11 +1046,11 @@ $1, 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 
 'template-semiprotected' => '(준보호됨)',
 'hiddencategories' => '이 문서는 다음 숨은 분류 $1 개에 속해 있습니다:',
 'edittools' => '<!-- 이 문서는 편집 창과 파일 올리기 창에 출력됩니다. -->',
-'nocreatetitle' => '문서 생성 제한',
+'nocreatetitle' => '문서 만들기 제한',
 'nocreatetext' => '{{SITENAME}}에서 새로운 문서를 생성하는 것은 제한되어 있습니다. 이미 존재하는 다른 문서를 편집하거나, [[Special:UserLogin|로그인하거나 계정을 만들 수 있습니다]].',
 'nocreate-loggedin' => '새 문서를 만들 권한이 없습니다.',
 'sectioneditnotsupported-title' => '부분 편집 지원 안됨',
-'sectioneditnotsupported-text' => '이 문서에서는  편집을 지원하지 않습니다.',
+'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
 'permissionserrors' => '권한 오류',
 'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음의 {{PLURAL:$1|이유}}를 확인해보세요:',
 'permissionserrorstext-withaction' => '$2 권한이 없습니다. 다음의 {{PLURAL:$1|이유}}를 확인해주세요:',
@@ -1043,6 +1084,12 @@ $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' => '페이지가 확장 깊이를 초과하였습니다',
+'parser-unstrip-loop-warning' => '스트립하지 않는 반복이 감지됨',
+'parser-unstrip-recursion-limit' => '스트립하지 않는 재귀 한도가 초과됨 ($1)',
 
 # "Undo" feature
 'undo-success' => '이 편집을 되돌리려면 아래의 변경되는 사항을 확인한 후 저장해주세요.',
@@ -1072,7 +1119,7 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 'page_first' => '처음',
 'page_last' => '마지막',
 'histlegend' => "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />
-설명: '''({{int:cur}})''' = 최신판과 비교,
+설명: '''({{int:cur}})''' = 최신 판과 비교,
 '''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
 'history-fieldset-title' => '문서의 변경 내력 찾기',
 'history-show-deleted' => '삭제된 것만',
@@ -1202,7 +1249,7 @@ $1",
 'mergehistory-go' => '합칠 수 있는 편집 보기',
 'mergehistory-submit' => '문서 역사 합치기',
 'mergehistory-empty' => '합칠 수 있는 판이 없습니다.',
-'mergehistory-success' => '[[:$1]] 문서의 $3개의 판이 [[:$2]]에 성공적으로 합쳐졌습니다.',
+'mergehistory-success' => '[[:$1]] 문서의 판 $3개가 [[:$2]]에 성공적으로 합쳐졌습니다.',
 'mergehistory-fail' => '문서 역사 합치기 명령을 수행할 수 없습니다. 문서와 시간 변수를 다시 확인하십시오.',
 'mergehistory-no-source' => '원본인 $1 문서가 존재하지 않습니다.',
 'mergehistory-no-destination' => '대상인 $1 문서가 존재하지 않습니다.',
@@ -1220,11 +1267,12 @@ $1",
 'mergelogpagetext' => '다음은 한 문서의 역사를 다른 문서의 역사와 합친 최근 기록입니다.',
 
 # Diffs
-'history-title' => '‘$1’ 문서의 변경 내력',
-'difference' => '(버전 사이의 차이)',
+'history-title' => '"$1"  문서의 변경 내력',
+'difference-title' => '"$1"의 두 판 사이의 차이',
+'difference-title-multipage' => '문서 "$1"과 "$2" 간의 차이',
 'difference-multipage' => '(문서간의 차이)',
 'lineno' => '$1번째 줄:',
-'compareselectedversions' => '선택된 판들을 비교하기',
+'compareselectedversions' => '선택한 판을 비교하기',
 'showhideselectedversions' => '선택한 판을 보이기/숨기기',
 'editundo' => '편집 취소',
 'diff-multi' => '({{PLURAL:$2|한 사용자의|사용자 $2명의}} 중간의 편집 $1개 숨겨짐)',
@@ -1266,7 +1314,7 @@ $1",
 'search-result-category-size' => '문서 {{PLURAL:$1|1|$1}}개, 하위 분류 {{PLURAL:$2|1|$2}}개, 파일 {{PLURAL:$3|1|$3}}',
 'search-result-score' => '유사도: $1%',
 'search-redirect' => '($1에서 넘어옴)',
-'search-section' => '($1 )',
+'search-section' => '($1 문단)',
 'search-suggest' => '$1 문서를 찾고 계신가요?',
 'search-interwiki-caption' => '자매 프로젝트',
 'search-interwiki-default' => '$1 결과:',
@@ -1316,6 +1364,7 @@ $1",
 'prefs-beta' => '베타 기능',
 'prefs-datetime' => '날짜와 시각',
 'prefs-labs' => '실험 중인 기능',
+'prefs-user-pages' => '사용자 문서',
 'prefs-personal' => '사용자 정보',
 'prefs-rc' => '최근 바뀜',
 'prefs-watchlist' => '주시문서 목록',
@@ -1472,8 +1521,8 @@ $1",
 # Rights
 'right-read' => '문서 읽기',
 'right-edit' => '문서 편집',
-'right-createpage' => '문서 생성 (토론 문서 제외)',
-'right-createtalk' => '토론 문서 생성',
+'right-createpage' => '문서 만들기 (토론 문서 제외)',
+'right-createtalk' => '토론 문서 만들기',
 'right-createaccount' => '새 계정 만들기',
 'right-minoredit' => '사소한 편집 사용 가능',
 'right-move' => '문서 이동',
@@ -1521,14 +1570,14 @@ $1",
 'right-patrol' => '다른 사용자의 편집을 검토',
 'right-autopatrol' => '자신의 편집을 자동으로 검토',
 'right-patrolmarks' => '최근 바뀜에서 검토 표시를 보기',
-'right-unwatchedpages' => '주시되지 않 문서 목록 보기',
+'right-unwatchedpages' => '주시되지 않 문서 목록 보기',
 'right-mergehistory' => '문서의 역사를 합침',
 'right-userrights' => '모든 사용자의 권한 조정',
 'right-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
 'right-siteadmin' => '데이터베이스를 잠그거나 잠금 해제',
 'right-override-export-depth' => '5단계로 링크된 문서를 포함하여 문서를 내보내기',
 'right-sendemail' => '다른 사용자에게 이메일 보내기',
-'right-passwordreset' => '호 재설정 이메일을 보기',
+'right-passwordreset' => '비밀번호 재설정 이메일을 보기',
 
 # User rights log
 'rightslog' => '사용자 권한 기록',
@@ -1541,7 +1590,7 @@ $1",
 'action-read' => '이 문서를 읽기',
 'action-edit' => '문서 편집',
 'action-createpage' => '문서 생성',
-'action-createtalk' => '토론 문서 생성하기',
+'action-createtalk' => '토론 문서 만들기',
 'action-createaccount' => '새 계정 만들기',
 'action-minoredit' => '이 편집을 사소한 편집으로 표시하기',
 'action-move' => '이 문서 옮기기',
@@ -1567,7 +1616,7 @@ $1",
 'action-importupload' => '파일 올리기를 통해 문서를 가져올',
 'action-patrol' => '다른 사용자의 편집을 검토된 것으로 표시하기',
 'action-autopatrol' => '자신의 편집을 검토된 것으로 표시할',
-'action-unwatchedpages' => '주시되지 않 문서 목록 보기',
+'action-unwatchedpages' => '주시되지 않 문서 목록 보기',
 'action-mergehistory' => '이 문서의 역사 합치기',
 'action-userrights' => '모든 사용자의 권한을 조정',
 'action-userrights-interwiki' => '다른 위키의 사용자 권한을 조정',
@@ -1578,7 +1627,7 @@ $1",
 'nchanges' => '$1개 바뀜',
 'recentchanges' => '최근 바뀜',
 'recentchanges-legend' => '최근 바뀜 설정',
-'recentchangestext' => '위키의 최근 바뀜 내역이 나와 있습니다.',
+'recentchanges-summary' => '위키의 최근 바뀜 내역이 나와 있습니다.',
 'recentchanges-feed-description' => '위키의 최근 바뀜',
 'recentchanges-label-newpage' => '새로운 문서',
 'recentchanges-label-minor' => '사소한 편집',
@@ -1628,8 +1677,8 @@ $1",
 'upload-tryagain' => '수정된 파일 설명을 저장',
 'uploadnologin' => '로그인하지 않음',
 'uploadnologintext' => '파일을 올리려면 [[Special:UserLogin|로그인]]해야 합니다.',
-'upload_directory_missing' => 'í\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ì\9a© ë\94\94ë \89í\86 리($1)가 없고 웹 서버가 생성하지 못했습니다.',
-'upload_directory_read_only' => 'í\8c\8cì\9d¼ ì \80ì\9e¥ ë\94\94ë \89í\86 리($1)에 쓰기 권한이 없습니다.',
+'upload_directory_missing' => 'í\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ì\9a© ë\94\94ë \89í\84°리($1)가 없고 웹 서버가 생성하지 못했습니다.',
+'upload_directory_read_only' => 'í\8c\8cì\9d¼ ì \80ì\9e¥ ë\94\94ë \89í\84°리($1)에 쓰기 권한이 없습니다.',
 'uploaderror' => '올리기 오류',
 'upload-recreate-warning' => "'''경고: 이 파일로 된 이름이 삭제되었거나 옮겨졌습니다.'''
 
@@ -1650,7 +1699,7 @@ $1",
 갤러리 형식으로 확인하고 싶으시다면 [[Special:NewFiles|새 파일 목록]]을 보세요.',
 'filename' => '파일 이름',
 'filedesc' => '파일의 설명',
-'fileuploadsummary' => 'ì\84¤ëª\85:',
+'fileuploadsummary' => 'ì\9a\94ì\95½:',
 'filereuploadsummary' => '파일 변경에 대한 요약:',
 'filestatus' => '저작권 상태:',
 'filesource' => '출처:',
@@ -1733,7 +1782,7 @@ $1",
 'filename-bad-prefix' => '올리려고 하는 파일 이름이 \'\'\'"$1"\'\'\'(으)로 시작합니다.
 "$1"은(는) 디지털 사진기가 자동으로 붙이는 의미없는 이름입니다.
 파일에 대해 알기 쉬운 이름을 골라주세요.',
-'filename-prefix-blacklist' => ' #<!-- 이 줄은 그대로 두십시오. --> <pre>
+'filename-prefix-blacklist' => ' #<!-- 이 줄은 그대로 두십시오 --> <pre>
 # 문법은 다음과 같습니다:
 #   * "#"에서 그 줄의 끝까지는 코멘트입니다.
 #   * 비어 있지 않은 줄은 디지털 카메라에서 자동적으로 부여하는 파일 접두어입니다.
@@ -1746,7 +1795,7 @@ IMG # 일반
 JD # 제놉틱
 MGP # 펜탁스
 PICT # 기타
- #</pre> <!-- 이 줄은 그대로 두십시오. -->',
+ #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 'upload-success-subj' => '올리기 성공',
 'upload-success-msg' => '파일을 [$2]에서 성공적으로 올렸습니다. 당신이 올린 파일이 여기 있습니다: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => '올리기 실패',
@@ -1783,14 +1832,15 @@ $1',
 'backend-fail-writetemp' => '임시 파일을 쓸 수 없습니다.',
 'backend-fail-closetemp' => '임시 파일을 닫을 수 없습니다.',
 'backend-fail-read' => '$1 파일을 읽을 수 없습니다.',
-'backend-fail-create' => '$1 í\8c\8cì\9d¼ì\9d\84 ì\93¸ ì\88\98 ì\97\86습니다.',
-'backend-fail-maxsize' => '$2{{PLURAL:$2|ë°\94ì\9d´í\8a¸}}ë³´ë\8b¤ ì»¤ì\84\9c $1 í\8c\8cì\9d¼ì\9d\84 ì\83\9dì\84±하지 못했습니다.',
+'backend-fail-create' => '$1 í\8c\8cì\9d¼ì\9d\84 ì \80ì\9e¥í\95\98ì§\80 ëª»í\96\88습니다.',
+'backend-fail-maxsize' => '$2{{PLURAL:$2|ë°\94ì\9d´í\8a¸}}ë³´ë\8b¤ ì»¤ì\84\9c $1 í\8c\8cì\9d¼ì\9d\84 ì \80ì\9e¥하지 못했습니다.',
 'backend-fail-readonly' => '‘$1’ 저장 백엔드가 읽기 전용입니다. 자세한 이유는 다음과 같습니다: “$2”',
 'backend-fail-synced' => '파일 "$1"은 내부 저장 백엔드에 불안정한 상태로 있습니다.',
 'backend-fail-connect' => "'$1' 저장 백엔드에 접속하지 못했습니다.",
 'backend-fail-internal' => '"$1" 저장 백엔드에 알 수 없는 오류가 발생했습니다.',
 'backend-fail-contenttype' => '"$1"에 저장하기 위한 파일의 내용 유형을 판별하지 못했습니다.',
-'backend-fail-batchsize' => '저장 백엔드에서 $1개의 파일 {{PLURAL:$1|작업}}이 쌓여 있습니다; 한계는 $2개입니다.',
+'backend-fail-batchsize' => '저장 백엔드에서 파일 {{PLURAL:$1|작업}} $1개가 쌓여 있습니다; 한계는 $2개입니다.',
+'backend-fail-usable' => '파일 저장 권한이 없거나 저장 위치가 빠졌기 때문에 $1 파일을 저장할 수 없습니다.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '저장소 백엔드 ‘$1’에 대한 저널 데이터베이스에 연결할 수 없습니다.',
@@ -1884,7 +1934,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist' => '파일 역사',
 'filehist-help' => '날짜/시간 링크를 클릭하면 해당 시간의 파일을 볼 수 있습니다.',
 'filehist-deleteall' => '모두 삭제',
-'filehist-deleteone' => 'ì§\80ì\9a°ê¸°',
+'filehist-deleteone' => 'ì\82­ì \9c',
 'filehist-revert' => '되돌리기',
 'filehist-current' => '최신',
 'filehist-datetime' => '날짜/시간',
@@ -1897,7 +1947,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-comment' => '내용',
 'filehist-missing' => '파일을 찾을 수 없음',
 'imagelinks' => '이 파일을 사용하는 문서',
-'linkstoimage' => '다음 $1ê°\9cì\9d\98 ë¬¸ì\84\9cê°\80 ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤:',
+'linkstoimage' => '다음 ë¬¸ì\84\9c $1ê°\9cê°\80 ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\82¬ì\9a©í\95\98ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤:',
 'linkstoimage-more' => '$1개 이상의 문서가 이 파일을 가리키고 있습니다.
 다음 목록은 이 파일을 가리키는 처음 $1개 문서만 보여주고 있습니다.
 이 파일을 가리키는 모든 문서를 보려면 [[Special:WhatLinksHere/$2|여기]]를 참고해 주십시오.',
@@ -1920,6 +1970,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'shared-repo-from' => '($1)',
 'shared-repo' => '공용 저장소',
 'shared-repo-name-wikimediacommons' => '위키미디어 공용',
+'filepage.css' => '/* 이 CSS 설정은 파일 설명 페이지에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
 
 # File reversion
 'filerevert' => '$1 되돌리기',
@@ -1952,7 +2003,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filedelete-maintenance-title' => '파일을 삭제할 수 없습니다',
 
 # MIME search
-'mimesearch' => 'MIME 검색',
+'mimesearch' => 'MIME 찾기',
 'mimesearch-summary' => 'MIME 타입에 해당하는 파일을 검색합니다. MIME 값을 <tt>image/jpeg</tt> 형태로 입력해주세요.',
 'mimetype' => 'MIME 종류:',
 'download' => '다운로드',
@@ -2032,8 +2083,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'nmembers' => '문서 $1개',
 'nrevisions' => '편집 $1개',
 'nviews' => '$1회 읽음',
-'nimagelinks' => '{{PLURAL:$1}}ê°\9c ë¬¸ì\84\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
-'ntransclusions' => '{{PLURAL:$1}}ê°\9c ë¬¸ì\84\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
+'nimagelinks' => '문ì\84\9c $1ê°\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
+'ntransclusions' => '문ì\84\9c $1ê°\9cì\97\90ì\84\9c ì\82¬ì\9a© ì¤\91',
 'specialpage-empty' => '명령에 대한 결과가 없습니다.',
 'lonelypages' => '외톨이 문서 목록',
 'lonelypagestext' => '{{SITENAME}}에서 다른 모든 문서에서 링크되거나 틀로 포함되지 않은 문서의 목록입니다.',
@@ -2109,10 +2160,11 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 로그 종류, 계정 이름, 문서 이름을 선택해서 볼 수 있습니다. 검색시에는 대소문자를 구별합니다.',
 'logempty' => '일치하는 항목이 없습니다.',
 'log-title-wildcard' => '다음 글로 시작하는 제목 검색',
+'showhideselectedlogentries' => '선택한 기록 항목 보이기/숨기기',
 
 # Special:AllPages
 'allpages' => '모든 문서 목록',
-'alphaindexline' => '$1에서 $2까지',
+'alphaindexline' => '$1부터 $2까지',
 'nextpage' => '다음 문서 ($1)',
 'prevpage' => '이전 문서 ($1)',
 'allpagesfrom' => '다음으로 시작하는 문서 보기:',
@@ -2128,6 +2180,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}}문서나 자료를 담고 있는 분류 목록입니다.
@@ -2175,7 +2232,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # Special:ListGroupRights
 'listgrouprights' => '사용자 권한 목록',
 'listgrouprights-summary' => '다음은 이 위키에서 설정된 사용자 권한 그룹의 목록입니다.
-각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|이곳]]을 참조하십시오.',
+각각의 권한에 대해서는 [[{{MediaWiki:Listgrouprights-helppage}}|이곳]]을 참고하세요.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">부여된 권한</span>
 * <span class="listgrouprights-revoked">해제된 권한</span>',
 'listgrouprights-group' => '그룹',
@@ -2225,6 +2282,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # User Messenger
 'usermessage-summary' => '시스템 메시지 남기기',
 'usermessage-editor' => '시스템 메신저',
+'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => '주시문서 목록',
@@ -2311,7 +2369,7 @@ $UNWATCHURL
 'exblank' => '빈 문서',
 'delete-confirm' => '‘$1’ 삭제',
 'delete-legend' => '삭제',
-'historywarning' => "'''주의''': 삭제하려는 문서에 약 $1개의 과거 편집 내역이 있습니다:",
+'historywarning' => "'''주의:''' 삭제하려는 문서에 과거 편집 내역 약 $1개가 있습니다:",
 'confirmdeletetext' => '문서와 문서 역사를 삭제하려고 합니다. 삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.',
 'actioncomplete' => '명령 완료',
 'actionfailed' => '명령 실패',
@@ -2407,7 +2465,7 @@ $UNWATCHURL
 # Restrictions (nouns)
 'restriction-edit' => '편집',
 'restriction-move' => '이동',
-'restriction-create' => '생성',
+'restriction-create' => '만들기',
 'restriction-upload' => '올리기',
 
 # Restriction levels
@@ -2503,6 +2561,7 @@ $1',
 'sp-contributions-username' => 'IP 주소 혹은 계정 이름:',
 'sp-contributions-toponly' => '최신판만 보기',
 'sp-contributions-submit' => '찾기',
+'sp-contributions-explain' => '',
 
 # What links here
 'whatlinkshere' => '여기를 가리키는 문서',
@@ -2561,7 +2620,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,10 +2672,12 @@ $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' => '계정 생성 막음',
+'block-log-flags-nocreate' => '계정 생성 금지됨',
 'block-log-flags-noautoblock' => '자동 차단 비활성화됨',
 'block-log-flags-noemail' => '이메일 막음',
 'block-log-flags-nousertalk' => '자신의 토론 문서 편집 불가',
@@ -2732,7 +2794,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'movelogpage' => '이동 기록',
 'movelogpagetext' => '아래는 옮겨진 문서의 목록입니다.',
 'movesubpage' => '{{PLURAL:$1}}하위 문서',
-'movesubpagetext' => '이 문서에는 다음 $1ê°\9cì\9d\98 í\95\98ì\9c\84 ë¬¸ì\84\9cê°\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
+'movesubpagetext' => '이 문서에는 다음 í\95\98ì\9c\84 ë¬¸ì\84\9c $1ê°\9cê°\80 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'movenosubpage' => '이 문서에는 하위 문서가 존재하지 않습니다.',
 'movereason' => '이유:',
 'revertmove' => '되돌리기',
@@ -2894,7 +2956,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-pt-logout' => '로그아웃',
 'tooltip-ca-talk' => '문서의 내용에 대한 토론 문서',
 'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리보기를 해 주세요.',
-'tooltip-ca-addsection' => ' 추가하기',
+'tooltip-ca-addsection' => '문단 추가하기',
 'tooltip-ca-viewsource' => '문서가 잠겨 있습니다. 문서의 소스만 볼 수 있습니다.',
 'tooltip-ca-history' => '문서의 과거 버전들',
 'tooltip-ca-protect' => '문서 보호하기',
@@ -2952,16 +3014,39 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-summary' => '짧은 편집 요약을 적어주세요',
 
 # Stylesheets
-'common.css' => '/** 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
+'common.css' => '/* 이 CSS 설정은 모든 스킨에 동일하게 적용됩니다 */',
+'standard.css' => '/* 이 CSS 설정은 모든 스탠다드 스킨에 적용됩니다 */',
+'nostalgia.css' => '/* 이 CSS 설정은 모든 노스텔지아 스킨에 적용됩니다 */',
+'cologneblue.css' => '/* 이 CSS 설정은 모든 쾰른 블루 스킨에 적용됩니다 */',
 'monobook.css' => '/* 이 CSS 설정은 모든 모노북 스킨에 적용됩니다 */',
+'myskin.css' => '/* 이 CSS 설정은 모든 마이스킨 스킨에 적용됩니다 */',
+'chick.css' => '/* 이 CSS 설정은 모든 치크 스킨에 적용됩니다 */',
+'simple.css' => '/* 이 CSS 설정은 모든 심플 스킨에 적용됩니다 */',
 'modern.css' => '/* 이 CSS 설정은 모든 모던 스킨에 적용됩니다 */',
 'vector.css' => '/* 이 CSS 설정은 모든 벡터 스킨에 적용됩니다 */',
-'print.css' => '/* 이 CSS 설정은 출력/인쇄 화면에 적용됩니다. */',
+'print.css' => '/* 이 CSS 설정은 출력/인쇄 화면에 적용됩니다 */',
+'handheld.css' => '/* 이 CSS 설정은 $wgHandheldStyle에 설정한 스킨을 기반으로 한 휴대 기기에 적용됩니다 */',
+'noscript.css' => '/* 이 CSS 설정은 자바스크립트를 비활성화한 사용자에 적용됩니다 */',
+'group-autoconfirmed.css' => '/* 이 CSS 설정은 자동 인증된 사용자에만 적용됩니다 */',
+'group-bot.css' => '/* 이 CSS 설정은 봇에만 적용됩니다 */',
+'group-sysop.css' => '/* 이 CSS 설정은 관리자에만 적용됩니다 */',
+'group-bureaucrat.css' => '/* 이 CSS 설정은 사무관에만 적용됩니다 */',
 
 # Scripts
 'common.js' => '/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */',
-'monobook.js' => '/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다. */',
-'vector.js' => '/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다. */',
+'standard.js' => '/* 이 자바스크립트 설정은 스탠다드 스킨을 사용하는 사용자에게 적용됩니다 */',
+'nostalgia.js' => '/* 이 자바스크립트 설정은 노스텔지아 스킨을 사용하는 사용자에게 적용됩니다 */',
+'cologneblue.js' => '/* 이 자바스크립트 설정은 쾰른 블루 스킨을 사용하는 사용자에게 적용됩니다 */',
+'monobook.js' => '/* 이 자바스크립트 설정은 모노북 스킨을 사용하는 사용자에게 적용됩니다 */',
+'myskin.js' => '/* 이 자바스크립트 설정은 마이스킨 스킨을 사용하는 사용자에게 적용됩니다 */',
+'chick.js' => '/* 이 자바스크립트 설정은 치크 스킨을 사용하는 사용자에게 적용됩니다 */',
+'simple.js' => '/* 이 자바스크립트 설정은 심플 스킨을 사용하는 사용자에게 적용됩니다 */',
+'modern.js' => '/* 이 자바스크립트 설정은 모던 스킨을 사용하는 사용자에게 적용됩니다 */',
+'vector.js' => '/* 이 자바스크립트 설정은 벡터 스킨을 사용하는 사용자에게 적용됩니다 */',
+'group-autoconfirmed.js' => '/* 이 자바스크립트 설정은 자동 인증된 사용자에만 적용됩니다 */',
+'group-bot.js' => '/* 이 자바스크립트 설정은 봇에만 적용됩니다 */',
+'group-sysop.js' => '/* 이 자바스크립트 설정은 관리자에만 적용됩니다 */',
+'group-bureaucrat.js' => '/* 이 자바스크립트 설정은 사무관에만 적용됩니다 */',
 
 # Metadata
 'notacceptable' => '클라이언트에서 인식 가능한 출력 포맷이 없습니다.',
@@ -2985,7 +3070,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'spamprotectionmatch' => '문제가 되는 부분은 다음과 같습니다: $1',
 'spambot_username' => 'MediaWiki 스팸 제거',
 'spam_reverting' => '$1을 포함하지 않는 최신 버전으로 되돌림',
-'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 문서를 비움',
+'spam_blanking' => '모든 버전에 $1 링크를 포함하고 있어 차단함',
+'spam_deleting' => '모든 버전에 $1 링크를 포함하고 있어 삭제함',
 
 # Info page
 'pageinfo-title' => '"$1" 문서에 대한 정보',
@@ -3287,7 +3373,7 @@ Variants for Chinese language
 'exif-disclaimer' => '면책 조항',
 'exif-contentwarning' => '콘텐츠 경고',
 'exif-giffilecomment' => 'GIF 파일 주석',
-'exif-intellectualgenre' => '컨텐츠 정보',
+'exif-intellectualgenre' => 'ì½\98텐츠 정보',
 'exif-subjectnewscode' => '주제 코드',
 'exif-scenecode' => 'IPTC 장면 코드',
 'exif-event' => '묘사된 사건',
@@ -3301,6 +3387,10 @@ Variants for Chinese language
 'exif-compression-2' => 'CCITT 그룹-3 1차원 수정 허프먼 반복 길이 부호화',
 'exif-compression-3' => 'CCITT 그룹-3 팩스 인코딩',
 'exif-compression-4' => 'CCITT 그룹-4 팩스 인코딩',
+'exif-compression-6' => 'JPEG (오래됨)',
+'exif-compression-8' => '압축 (Adobe)',
+'exif-compression-32773' => 'PackBits (매킨토시 RLE)',
+'exif-compression-32946' => '압축 (PKZIP)',
 
 'exif-copyrighted-true' => '저작권의 보호를 받음',
 'exif-copyrighted-false' => '퍼블릭 도메인',
@@ -3618,7 +3708,7 @@ $5
 
 # Auto-summaries
 'autosumm-blank' => '문서를 비움',
-'autosumm-replace' => '문서 내용을 ‘$1’으로 교체',
+'autosumm-replace' => '문서 내용을 ‘$1’으로 바꿈',
 'autoredircomment' => '[[$1]] 문서로 넘겨주기',
 'autosumm-new' => '새 문서: $1',
 
@@ -3683,17 +3773,22 @@ $5
 'version-hook-name' => '훅 이름',
 'version-hook-subscribedby' => '훅이 사용된 위치',
 'version-version' => '(버전 $1)',
-'version-license' => 'ë\9d¼ì\9d´ì\84¼스',
+'version-license' => 'ë\9d¼ì\9d´ì\84 스',
 'version-poweredby-credits' => "이 위키는 '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
 'version-poweredby-others' => '그 외 다른 개발자',
-'version-license-info' => '미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.
+'version-license-info' => "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.
 
-미디어위키가 유용하게 사용될 수 있기를 바라지만 상용으로 사용되거나 특정 목적에 맞을 것이라는 것을 보증하지 않습니다. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참고하십시오.
+미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참고하십시오.
 
-당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다; 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인]으로 읽어보시기 바랍니다.',
+당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, 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' => 'URL 진입점',
+'version-entrypoints-header-entrypoint' => '진입점',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath 문서 경로]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath 스크립트 경로]',
 
 # Special:FilePath
 'filepath' => '파일 경로',
@@ -3720,7 +3815,7 @@ $5
 * <span class="mw-specialpagerestricted">제한된 특수 문서.</span>',
 'specialpages-group-maintenance' => '관리용 목록',
 'specialpages-group-other' => '다른 특수 문서',
-'specialpages-group-login' => '로그인 / 등록',
+'specialpages-group-login' => '로그인 / 가입',
 'specialpages-group-changes' => '최근 바뀜과 기록',
 'specialpages-group-media' => '파일 관리',
 'specialpages-group-users' => '사용자와 권한',
@@ -3772,7 +3867,8 @@ $5
 
 # Database error messages
 'dberr-header' => '이 위키에 문제가 있습니다.',
-'dberr-problems' => '죄송합니다. 이 사이트는 기술적인 문제가 있습니다.',
+'dberr-problems' => '죄송합니다!
+이 사이트는 기술적인 문제가 있습니다.',
 'dberr-again' => '잠시 후에 다시 시도해주세요.',
 'dberr-info' => '(데이터베이스에 접속할 수 없습니다: $1)',
 'dberr-usegoogle' => '그 동안 구글을 통해 검색할 수도 있습니다.',
@@ -3798,13 +3894,13 @@ $5
 # New logging system
 'logentry-delete-delete' => '$1 사용자가 $3 문서를 삭제하였습니다.',
 'logentry-delete-restore' => '$1 사용자가 $3 문서를 복구하였습니다.',
-'logentry-delete-event' => '$1 사용자가 $3의 $5개의 기록에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5}}개 편집의 설정을 변경하였습니다: $4',
+'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 표시 설정을 바꾸었습니다: $4',
+'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5}}개 편집의 설정을 변경하였습니다: $4',
 'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 표시 설정을 변경하였습니다.',
 'logentry-delete-revision-legacy' => '$1 사용자가 $3 문서 편집의 표시 설정을 변경하였습니다.',
 'logentry-suppress-delete' => '$1 사용자가 $3 문서를 숨겼습니다.',
-'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|$5개의 기록}}에 대해 표시 설정을 바꾸었습니다: $4',
-'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|$5개의 판}}에 대해 표시 설정을 바꾸었습니다: $4',
+'logentry-suppress-event' => '$1 사용자가 비공개적으로 $3의 {{PLURAL:$5|기록 $5개}}에 대해 표시 설정을 바꾸었습니다: $4',
+'logentry-suppress-revision' => '$1 사용자가 비공개적으로 $3 문서의 {{PLURAL:$5|판 $5개}}에 대해 표시 설정을 바꾸었습니다: $4',
 'logentry-suppress-event-legacy' => '$1 사용자가 비공개적으로 $3의 항목에 대한 표시 설정을 바꾸었습니다.',
 'logentry-suppress-revision-legacy' => '$1 사용자가 비공개적으로 $3 문서의 특정 판에 대한 표시 설정을 바꾸었습니다.',
 'revdelete-content-hid' => '내용 숨겨짐',
@@ -3825,7 +3921,7 @@ $5
 'logentry-newusers-create' => '$1 사용자가 계정을 생성했습니다.',
 'logentry-newusers-create2' => '$1 사용자가 $3 계정을 생성했습니다.',
 'logentry-newusers-autocreate' => '$1 계정이 자동적으로 생성되었습니다.',
-'newuserlog-byemail' => '이메일로 보낸 호',
+'newuserlog-byemail' => '이메일로 보낸 비밀번호',
 
 # Feedback
 'feedback-bugornote' => '기술적 문제를 구체적으로 설명할 준비가 되었다면 [$1 버그를 신고]해 주세요.
@@ -3840,8 +3936,8 @@ $5
 'feedback-error3' => '오류: API가 응답하지 않음',
 'feedback-thanks' => '감사합니다! ‘[$2 $1]’ 문서에 당신의 의견을 남겼습니다.',
 'feedback-close' => '완료',
-'feedback-bugcheck' => 'ê°\90ì\82¬í\95©ë\8b\88ë\8b¤! í\98¹ì\8b\9c í\95´ë\8b¹ ì\82¬í\95­ì\9d´ [$1 ê¸°ì¡´ì\9d\98 ë²\84ê·¸ ë¦¬í\8f¬í\8a¸]에 올라와 있는지 확인해주세요.',
-'feedback-bugnew' => 'í\99\95ì\9d¸í\96\88ì\8aµë\8b\88ë\8b¤. ì\83\88ë¡\9cì\9a´ ë²\84ê·¸ ë¦¬í\8f¬í\8a¸를 작성합니다.',
+'feedback-bugcheck' => 'ê°\90ì\82¬í\95©ë\8b\88ë\8b¤! í\98¹ì\8b\9c í\95´ë\8b¹ ì\82¬í\95­ì\9d´ [$1 ê¸°ì¡´ì\9d\98 ë²\84ê·¸ ë³´ê³ ì\84\9c]에 올라와 있는지 확인해주세요.',
+'feedback-bugnew' => 'í\99\95ì\9d¸í\96\88ì\8aµë\8b\88ë\8b¤. ì\83\88ë¡\9cì\9a´ ë²\84ê·¸ ë³´ê³ ì\84\9c를 작성합니다.',
 
 # API errors
 'api-error-badaccess-groups' => '당신은 이 위키에 파일을 올릴 권한이 없습니다.',
@@ -3881,4 +3977,17 @@ $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|0년}}',
+'duration-centuries' => '$1{{PLURAL:$1|세기}}',
+'duration-millennia' => '$1{{PLURAL:$1|천년}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => '서버 $1의 잠금을 걸지 못했습니다.',
 );
index 870b0dc..30fdfcb 100644 (file)
@@ -317,7 +317,6 @@ $messages = array(
 
 # Diffs
 'history-title' => '$1 вильмöтан история',
-'difference' => '(Неöткодьыс версияэз коласын)',
 'difference-multipage' => 'Неöткодьыс листбоккез коласын',
 'lineno' => 'Визёк $1:',
 'compareselectedversions' => 'Ордчаöтны бöрйöм версияэз',
index b36ca74..f484421 100644 (file)
@@ -47,7 +47,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Джангы тюрлениулени списогунда тинтилген тюрлениулени кёргюзме',
 'tog-newpageshidepatrolled' => 'Джангы бетлени списогунда тинтилген бетлени кёргюзме',
 'tog-extendwatchlist' => 'Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт',
-'tog-usenewrc' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ð¸Ð³Ð¸Ð»ÐµÐ½Ð½Ð³ÐµÐ½ Ñ\81пиÑ\81огÑ\83н Ñ\85айÑ\8bÑ\80ландÑ\8bÑ\80 (JavaScript керекди)',
+'tog-usenewrc' => 'Ð\90Ñ\85Ñ\8bÑ\80 Ñ\82Ñ\8eÑ\80лениÑ\83леде Ñ\8dм ÐºÑ\91здеги Ñ\82измеде Ð±ÐµÑ\82лени ÐºÑ\8aаÑ\83Ñ\83м Ñ\82Ñ\8eÑ\80лениÑ\83леÑ\80и (JavaScript керекди)',
 'tog-numberheadings' => 'Башлыкъланы (бёлюмлени атлары) автомат номерленсинле',
 'tog-showtoolbar' => 'Тюрлендирген сагъатда, башындагъы инструмент панелни кёргюз (JavaScript)',
 'tog-editondblclick' => 'Эки басыу бла тюрлендириу бет ачылсын (JavaScript)',
@@ -174,7 +174,7 @@ $messages = array(
 'cancel' => 'Ызына алыу',
 'moredotdotdot' => 'Баргъаны…',
 'mypage' => 'Энчи бетим',
-'mytalk' => 'Ð\9cени Ñ\81юзюу бетим',
+'mytalk' => 'Сюзюу бетим',
 'anontalk' => 'Бу IP-адресге сюзюу бет',
 'navigation' => 'Навигация',
 'and' => '&#32;эм',
@@ -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' => 'Бу бет тюрлендириуге джабылыбды.',
@@ -436,7 +440,7 @@ $2',
 'securelogin-stick-https' => 'Чыкъгъандан сора да HTTPS бла байламлы къой',
 'yourdomainname' => 'Сизни доменигиз:',
 'externaldberror' => 'Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
-'login' => 'Кир',
+'login' => 'Кириу',
 'nav-login-createaccount' => 'Кириу / регистрация этиу',
 'loginprompt' => '{{SITENAME}} сайтха кирир ючюн «cookies» эркин этерге керексиз.',
 'userlogin' => 'Кир / регистрация эт',
@@ -448,7 +452,8 @@ $2',
 'nologinlink' => 'Тергеу джазыу (аккаунт) къурагъыз',
 'createaccount' => 'Джангы къошулуучуну регистрация эт',
 'gotaccount' => 'Тергеу джазыуугъуз (аккаунтугъуз) энди бармыды? $1.',
-'gotaccountlink' => 'Кир',
+'gotaccountlink' => 'Кириу',
+'userlogin-resetlink' => 'Кирир ючюн билгилеригизни унутхан этгенмисиз?',
 'createaccountmail' => 'e-mail бла',
 'createaccountreason' => 'Чурум:',
 'badretype' => 'Джазгъан паролларыгъыз бир-бирине келишмейдиле.',
@@ -471,7 +476,7 @@ $2',
 'wrongpasswordempty' => 'Пароль джазылмай къалгъанды. Джангыдан кёрюгюз.',
 'passwordtooshort' => '$1 {{PLURAL:$1|символдан}} аз болмазгъа керекди пароль.',
 'password-name-match' => 'Пароль къошулуучу атдан башха тюрлю болургъа керекди.',
-'mailmypassword' => 'Ð\94жангÑ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð¶Ð¸Ð±ÐµÑ\80 E-mail Ð±Ð»Ð°',
+'mailmypassword' => 'Ð\9cеннге e-mail Ð±Ð»Ð° Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ð¿Ð°Ñ\80олÑ\8c Ð´Ð¶Ð¸Ð±ÐµÑ\80',
 'passwordremindertitle' => '{{SITENAME}}  къошулуучугъа джангы болджаллы пароль',
 'passwordremindertext' => 'Ким эседа (сиз болургъа боллукъсуз, IP-адрес: $1) {{SITENAME}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. $2 къошулуучугъа джангы пароль: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм паролну алышдырыргъа тыйычлыды. Джангы паролну $5 {{PLURAL:$5|кюнню}} ичинде амалы боллукъду.
 
@@ -493,6 +498,7 @@ $2',
 'emailconfirmlink' => 'Электрон почта адресигизни бегитигиз.',
 'invalidemailaddress' => 'Электрон почта адресигизи къабыл этилинирге болмайды, форматха келишмегени ючюн.
 Тюз адрес джазыгъыз неда тизгинни бош къоюгъуз.',
+'emaildisabled' => 'Бу сайт, электрон потча бла билдириуле иймейди.',
 'accountcreated' => 'Тергеу джазыу (аккаунт) къуралды',
 'accountcreatedtext' => '$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.',
 'createaccount-title' => '{{SITENAME}}: тергеу джазыу (аккаунт) къурау',
@@ -526,13 +532,25 @@ $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' => 'Электрон почтаны адреси:',
+'passwordreset-emailtitle' => '{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле',
 
 # Special:ChangeEmail
 'changeemail-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
+'changeemail-oldemail' => 'Почтаны бусагъатдагъы адреси:',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
 'changeemail-none' => '(джокъ)',
+'changeemail-submit' => 'Адресни тюрлендир',
+'changeemail-cancel' => 'Ызына алыу',
 
 # Edit page toolbar
 'bold_sample' => 'Къалын джазыу',
@@ -605,7 +623,7 @@ $2',
 'nosuchsectiontext' => 'Сиз болмагъан бетни тюрлендирирге кюрешесиз.
 Бу бетге къарагъан заманыгъызда, кетерилирге неда башха джерге кёчюрюлюрге боллукъду.',
 'loginreqtitle' => 'Кирирге керекди',
-'loginreqlink' => 'Кир',
+'loginreqlink' => 'Кириу',
 'loginreqpagetext' => 'Сиз башха бетлеге къарар ючюн $1 керексиз.',
 'accmailtitle' => 'Пароль джиберилди',
 'accmailtext' => "[[User talk:$1|$1]] къошулуучугъа къуралгъан пароль $2 адресине джиберилгенди.
@@ -628,20 +646,26 @@ $2',
 'userpage-userdoesnotexist-view' => '«$1» тергеу джазыу (аккаунт) джокъду.',
 'blocked-notice-logextract' => 'Бу къошулуучу бусагъатда блокланыб турады.
 Тюбюнде блокланыуланы журналындан ахыр джазыу бериледи:',
-'clearyourcache' => "'''Эслегиз:''' Бетде сакъланнгандан сора тюрлендириуле кёрюнюрча браузеригизни кэшин ариулатыгъыз:
-'''Mozilla / Firefox''': ''Ctrl+Shift+R'',
-'''IE:''' ''Ctrl+F5'',
-'''Safari''': ''Cmd+Shift+R'',
- '''Konqueror''': ''F5'',
-'''Opera''':  ''Tools→Preferences'' меню бла.",
+'clearyourcache' => "'''Эслегиз.''' Бетде сакъланнгандан сора тюрлендириуле кёрюнюрча браузеригизни кэшин ариулатыргъа керек болургъа боллукъду.
+* '''Firefox / Safari''': ''Shift'' тиекни басыб тургъанлай инструментлени панелинде ''Джангырт'' тиекни басыгъыз, неда ''Ctrl-F5'' басыгъыз, неда ''Ctrl-R'' (Mac-да — ''⌘-R'')
+* '''Google Chrome:''' ''Ctrl-Shift-R'' басыгъыз (Mac-да — ''⌘-Shift-R'')
+* '''Internet Explorer:''' ''Ctrl'' тиекни басыб тургъанлай ''Джангырт'' тиекни басыгъыз, неда ''Ctrl-F5'' басыгъыз
+* '''Konqueror:''' ''Джангырт'' тиекни басыгъыз, неда ''F5'' тиекни
+* '''Opera:''' ''Инструментле → Джарашдырыула'' менюда кэшни ариулауну сайлагъыз",
 'usercssyoucanpreview' => "'''Юретиу.''' «{{int:showpreview}}» тиекни басыгъыз, джангы CSS-файлны сакълатырыгъызны аллы бла тинтиб кёрюрча.",
 'userjsyoucanpreview' => "'''Юретиу.''' «{{int:showpreview}}» тиекни басыгъыз, джангы JS-файлны сакълатырыгъызны аллы бла тинтиб кёрюрча.",
 'usercsspreview' => "'''Эсде тутугъуз, бу къуру ал къарауду, CSS файлыгъыз алкъын сакъланмагъанды!'''",
 'userjspreview' => "'''Эсде тутугъуз, бу къуру ал къарауду, javascript файлыгъыз алкъын сакъланмагъанды!'''",
+'sitecsspreview' => "'''Эслегиз, бу CSS-ни къуру ал къараууду.'''
+ '''Ол алкъын сакъланмагъанды!'''",
+'sitejspreview' => "'''Эслегиз, бу JavaScript-кодну къуру ал къараууду.'''
+ '''Ол алкъын сакъланмагъанды!'''",
 'userinvalidcssjstitle' => "'''Эс бёлюгюз:''' «$1» атлы тема джокъду. Эсде тутугъуз, .css эм .js бетле атлары ажымсыз къуру гитче харифледен болургъа керекди, сёз ючюн: {{ns:user}}:Foo/vector.css, былай  {{ns:user}}:Foo/Vector.css тюйюл!",
 'updated' => '(Джангыртылды)',
 'note' => "'''Белги:'''",
-'previewnote' => "'''Бу къуру ал къарауду, текст алкъын сакъланмагъанды!'''",
+'previewnote' => "'''Бу къуру ал къарауду.'''
+Сиз этген тюрлениуле алкъын сакъланмагъандыла!",
+'continue-editing' => 'Тюрлендириуню бардырыгъыз',
 'previewconflict' => 'Бу ал къарау, башындагъы тюрлендириу терезеде текстни сакъланнганча кёргюзеди.',
 'session_fail_preview' => "'''Джарсыугъа, сессияны идентификаторуну тас этгени себебли, сервер сизни тюрлендириуюгюзни сакълаталмагъанды.
 Энтдада кёрюгюз.
@@ -654,6 +678,7 @@ $2',
 Себеби: браузеригиз редактор терезеде пунктуация белгилени терс кёргюзеди, аны ючюн статьяны тексти бузулургъа боллукъду.
 Бу халатлары болгъан аноним веб-проксилени хайырландырылгъанлары ючюн болургъа боллукъду'''",
 'editing' => '«$1» бетни тюрлендириу',
+'creating' => '«$1» бетни къурау',
 'editingsection' => '«$1» бетде бёлюмню тюрлендириу',
 'editingcomment' => '«$1» бетни тюрлендириу (джангы бёлюм)',
 'editconflict' => 'Тюрлендириу конфликт: $1',
@@ -677,7 +702,7 @@ $2',
 Башхала сизни текстлеригизни тюрлендиргенлерин излемей эсегиз, былайгъа салмагъыз.<br />
 Сиз дагъыда этген къошакъларыгъызны автору болгъаныгъызны неда информацияны чыкъгъан джери эркин джаяргъа эм тюрлендирирге къойгъанын аны бегитесиз (къарагъыз: $1).
 '''ЭРКИНЛИКСИЗ АВТОР ХАКЪ БЛА ДЖАКЪЛАННГАН МАТЕРИАЛЛА САЛМАГЪЫЗ БЫЛАЙГЪА!'''",
-'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|$1 килобайт|$1 килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|$2 килобайт|$2 килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
+'longpageerror' => "'''ХАЛАТ: сиз сакълатхан текстни  {{PLURAL:$1|бир килобайт|$1 килобайт}} ёлчеми барды, ол {{PLURAL:$2|бир килобайт|$2 килобайт}} чекден кёбдю. Бет сакъланныкъ тюлдю.'''",
 'readonlywarning' => "'''Эс бёлюгюз: Билгилени базасы бусагъатда киритленибди. Ол себебден тюрлениулеригиз къошулаллыкъ тюлдю. Джазгъанларыгъызны башха бир файлда сакълаб, кечирек къошаргъа боллукъсуз'''
 
 Киритлеген администратор бу билдириуню къойгъанды: $1",
@@ -719,6 +744,7 @@ $2',
 'edit-no-change' => 'Текстде тюрлениуле эсленмегени ючюн, сизни тюрлендириуюгюз къабыл этилмеди.',
 'edit-already-exists' => 'Джангы бет къураргъа боллукъ тюлдю.
 Алайсызда барды бу атлы бет.',
+'defaultmessagetext' => 'Тынгылау бла текст',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Эсгериу:''' Бу бетде асыры кёб къайнакълы функция барды.
@@ -779,36 +805,35 @@ $3 джанындан берилген сылтау: ''$2''",
 Темасы аннга ушагъан бетлени табар ючюн [[Special:Search|викиде излеб]] кёрюгюз.',
 
 # Revision deletion
-'rev-deleted-comment' => '(комментарий кетерилгенди)',
+'rev-deleted-comment' => '(тюрлендириуню суратлауу кетерилгенди)',
 'rev-deleted-user' => '(къошулуучуну аты кетерилгенди)',
 'rev-deleted-event' => '(джазыу кетерилгенди)',
 'rev-deleted-user-contribs' => '[къошулуучуну аты неда IP-адреси кетерилгенди — тюрлендириу къошакъны бетинде кёргюзюлмейди]',
 'rev-deleted-text-permission' => "Бетни бу версиясы '''кетерилгенди'''.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Кетериулени журналында] табыб къояргъа боллукъсуз.",
-'rev-deleted-text-unhide' => "Бу бетни версиясы '''кетерилгенди'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Кетериулени журналында] чурумла ангылатылгъан болур.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bгÑ\8aÑ\8bз Ñ\8eÑ\87Ñ\8eн [$1 бу версияны кёрюрге боллукъсуз].",
-'rev-suppressed-text-unhide' => "Бетни бу версиясы '''джашырылгъанды'''.
-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Джашырылыуланы журналында] чурумла берилген болурла.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bгÑ\8aÑ\8bз Ñ\8eÑ\87Ñ\8eн [$1 версияны кёрюрге боллукъсуз].",
-'rev-deleted-text-view' => "Ð\91еÑ\82ни Ð±Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81Ñ\8b '''кеÑ\82еÑ\80илгенди'''.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bз Ñ\8eÑ\87Ñ\8eн Ð°Ð½Ð½Ð³Ð° ÐºÑ\8aаÑ\80аÑ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aÑ\81Ñ\83з; Ð\90нгÑ\8bлаÑ\82Ñ\8bÑ\83ла [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ð\9aеÑ\82еÑ\80иÑ\83лени Ð¶Ñ\83Ñ\80налÑ\8bнда] Ð±Ð¾Ð»Ñ\83Ñ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aдÑ\83ла.",
-'rev-suppressed-text-view' => "Бу бетни версиясы '''джашырылгъанды'''.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð±Ð¾Ð»Ð³Ñ\8aанÑ\8bгÑ\8aÑ\8bз Ñ\8eÑ\87Ñ\8eн ÐºÑ\8aаÑ\80аÑ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aÑ\81Ñ\83з. Ð\90нгÑ\8bлаÑ\82Ñ\8bÑ\83ла [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ð\94жаÑ\88Ñ\8bÑ\80Ñ\8bÑ\83ланÑ\8b Ð¶Ñ\83Ñ\80налÑ\8bнда] Ð±Ð¾Ð»Ñ\83Ñ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aдÑ\83ла.",
+'rev-deleted-text-unhide' => "Бетни бу версиясы '''кетерилгенди'''.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Кетериулени журналында] чурумла ангылатылгъандыла.
¡Ñ\8eйÑ\81егиз [$1 бу версияны кёрюрге боллукъсуз].",
+'rev-suppressed-text-unhide' => "Бетни бу версиясы '''джашырылыбды'''.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Джашырылыуланы журналында] чурумла берилгендиле.
¡Ñ\8eйÑ\81егиз [$1 версияны кёрюрге боллукъсуз].",
+'rev-deleted-text-view' => "Ð\91еÑ\82ни Ð±Ñ\83 Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81Ñ\8b '''кеÑ\82еÑ\80илибди'''.
¡Ñ\8eйÑ\81егиз ÐºÑ\8aаÑ\80аÑ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aÑ\81Ñ\83з. Ð\90нгÑ\8bлаÑ\82Ñ\8bÑ\83ла [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ÐºÐµÑ\82еÑ\80иÑ\83лени Ð¶Ñ\83Ñ\80налÑ\8bнда] Ð±Ð°Ñ\80дÑ\8bла.",
+'rev-suppressed-text-view' => "Бетни бу версиясы '''джашырылыбды'''.
¡Ñ\8eйÑ\81егиз ÐºÑ\8aаÑ\80аÑ\80гÑ\8aа Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aÑ\81Ñ\83з. Ð\90нгÑ\8bлаÑ\82Ñ\8bÑ\83ла [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ÐºÐµÑ\82еÑ\80иÑ\83лени Ð¶Ñ\83Ñ\80налÑ\8bнда] Ð±Ð°Ñ\80дÑ\8bла.",
 'rev-deleted-no-diff' => "Бетни версияларыны бири '''кетерилгени''' ючюн, тенглешдиреллик тюлсюз.
 Ангылатыула [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъдула.",
 'rev-suppressed-no-diff' => "Бетни бу версияларын тенглешдиреллик тюлсюз, аладан бири '''кетерилиб''' турады.",
-'rev-deleted-unhide-diff' => "Бетни версияларыны бири '''кетерилгенди'''.
-Ангылатыула [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа болур.
-Администратор болгъаныгъыз ючюн [$1 версиягъа къараргъа боллукъсуз].",
-'rev-suppressed-unhide-diff' => "Бу тенглешдириуну версияларыны бири '''джашырылгъанды'''.
-Ангылатыула [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} джашырыуланы журналында] болургъа болур.
-Администратор болгъаныгъыз ючюн, андан ары бардырыргъа излей эсегиз [$1 версияланы бу башхалыгъына] къараргъа боллукъсуз.",
-'rev-deleted-diff-view' => "Бу тенглешдириуню версияларыны бири '''кетерилгенди'''.
-Администратор болгъаныгъыз ючюн бу тенглештириуге къараргъа боллукъсуз, ангылатыула
-Как администратор, вы можете просмотреть это сравнение, подробности могут быть указаны в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъдула.",
-'rev-suppressed-diff-view' => "Бу тенглешдириуню версияларыны бири '''джашырылгъанды'''.
-Администратор болгъаныгъыз ючюн, бу тенглешдириуге къараргъа боллукъсуз, ангылатыула [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} джашырыуланы журналында] болургъа боллукъду.",
+'rev-deleted-unhide-diff' => "Бетни версияларындан бири '''кетерилибди'''.
+Ангылатыула [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] бардыла.
+Сюйсегиз [$1 версияланы башхалыкъларына къараргъа боллукъсуз].",
+'rev-suppressed-unhide-diff' => "Бетни версияларындан бири ''''''джашырылыбды''''''.
+Ангылатыула [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} кетериулени журналында] бардыла.
+Сюйсегиз [$1 версияланы башхалыкъларына къараргъа боллукъсуз].",
+'rev-deleted-diff-view' => "Бу тенглешдириуню версияларыны бири '''кетерилибди'''.
+Сюйсегиз бу тенглештириуге къараргъа боллукъсуз. Ангылатыула [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] бардыла.",
+'rev-suppressed-diff-view' => "Бу тенглешдириуню версияларыны бири '''джашырылыбды'''.
+Сюйсегиз бу тенглештириуге къараргъа боллукъсуз. Ангылатыула [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} кетериулени журналында] бардыла.",
 'rev-delundel' => 'кёргюзюу/джашырыу',
 'rev-showdeleted' => 'кёргюз',
 'revisiondelete' => 'Бетни версияларын кетер/къайтар',
@@ -870,13 +895,13 @@ $1",
 ** Орунсуз энчи билгиле',
 'revdelete-otherreason' => 'Башха/къошакъ чурум:',
 'revdelete-reasonotherlist' => 'Башха чурум',
-'revdelete-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\81пиÑ\81огÑ\83н тюрлендир',
+'revdelete-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\82измеÑ\81ин тюрлендир',
 'revdelete-offender' => 'Бетни версиясыны автору:',
 
 # Suppression log
 'suppressionlog' => 'Джашырыуланы журналы',
-'suppressionlogtext' => 'ТÑ\8eбÑ\8eндеги, Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ладан Ð´Ð¶Ð°Ñ\88Ñ\8bÑ\80Ñ\8bлгÑ\8aан Ð¼Ð°Ñ\82еÑ\80иаллада ÐºÑ\8aоÑ\88Ñ\83лгÑ\8aан ÐºÑ\91б Ð±Ð¾Ð»Ð¼Ð°Ð¹ Ñ\8dÑ\82илген ÐºÐµÑ\82еÑ\80иÑ\83ле Ð±Ð»Ð° Ñ\82Ñ\8bйÑ\8bлÑ\8bÑ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83дÑ\83.
-Бусагъатдагъы тыйылыуланы списоклары ючюн [[Special:IPBlockList|IP-тыйылыуланы списогуна]] къарагъыз.',
+'suppressionlogtext' => 'ТÑ\8eбÑ\8eндеги, Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80ладан Ð´Ð¶Ð°Ñ\88Ñ\8bÑ\80Ñ\8bлгÑ\8aан Ð¼Ð°Ñ\82еÑ\80иаллада Ð±Ð¾Ð»Ð³Ñ\8aан ÐºÐµÑ\82еÑ\80иÑ\83ле Ð±Ð»Ð° Ð±Ð»Ð¾Ðº Ñ\8dÑ\82иÑ\83лени Ñ\82измеÑ\81иди.
+[[Special:BlockList|Блок этиулени тизмесинде]] бусагъатдагъы блокланы табаргъа боллукъду.',
 
 # History merging
 'mergehistory' => 'Бетни тарихлерини бирлештириую.',
@@ -910,8 +935,9 @@ $1",
 'mergelogpagetext' => 'Тюбюрек бетлени тарихлерини ахыр бирлешдириулери берилгенди.',
 
 # Diffs
-'history-title' => '«$1» бетни тюрлениу тарихи',
-'difference' => '(Версияланы араларында башхалыкъ)',
+'history-title' => '$1 — тюрлениу тарихи',
+'difference-title' => '$1 — версияларыны арасында башхалыкъла',
+'difference-title-multipage' => '«$1» эм «$2» бетлени арасында башхалыкъла',
 'difference-multipage' => '(Бетле арасында башхалыкъ)',
 'lineno' => 'Тизгин $1:',
 'compareselectedversions' => 'Сайланнган версияланы тенглешдириу',
@@ -943,14 +969,14 @@ $1",
 'searchhelp-url' => 'Help:Ичиндегиле',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Бу префикс бла бетни кёргюз]]',
 'searchprofile-articles' => 'Баш бетле',
-'searchprofile-project' => 'Болушлукъ бла проектлени бетлери',
+'searchprofile-project' => 'Болушлукъ эм проект бетле',
 'searchprofile-images' => 'Мультимедия',
-'searchprofile-everything' => 'ХаÑ\80 Ð½Ðµ',
+'searchprofile-everything' => 'ХаÑ\80 ÐºÑ\8aайда',
 'searchprofile-advanced' => 'Кенгерген',
 'searchprofile-articles-tooltip' => '$1 ичинде изле',
 'searchprofile-project-tooltip' => '$1 ичинде изле',
 'searchprofile-images-tooltip' => 'Файлланы изле',
-'searchprofile-everything-tooltip' => 'Бютеу бетледе изле (сюзюу бетледеда)',
+'searchprofile-everything-tooltip' => 'Бютёу бетледе изле (сюзюу бетледе да)',
 'searchprofile-advanced-tooltip' => 'Энчи ат аланладада изле',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сёз}})',
 'search-result-category-size' => '{{PLURAL:$1|1 элемент|$1 элемент}} ({{PLURAL:$2|1 тюбкатегория|$2 тюбкатегория}}, {{PLURAL:$3|1 файл|$3 файл}})',
@@ -965,13 +991,13 @@ $1",
 'search-mwsuggest-disabled' => 'юретиулесиз',
 'search-relatedarticle' => 'Байламлы',
 'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
-'searcheverything-enable' => 'Атланы бютеу аланларында изле',
+'searcheverything-enable' => 'Атланы бютёу аламларында изле',
 'searchrelated' => 'бейламлы',
-'searchall' => 'бютеу',
+'searchall' => 'бютёу',
 'showingresults' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$1</strong> {{PLURAL:$1|эсеб|эсебле}} {{PLURAL:$1|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsnum' => 'Тюбюрек №&nbsp;<strong>$2</strong> башлаб <strong>$3</strong> {{PLURAL:$3|эсеб|эсебле}} {{PLURAL:$3|кёргюзюлгенди|кёргюзюлгендиле}}.',
 'showingresultsheader' => "'''$4''' ючюн {{PLURAL:$5|'''$3''' эсебден '''$1'''|'''$1 — $2''' арасы '''$3''' эсеб}}",
-'nonefound' => "'''Эсгериу.''' Тынгылау бла излеу бютеу атланы аламында бардырылмайды. Бютеу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын хайырландырыгъыз.",
+'nonefound' => "'''Эсгериу.''' Тынгылау бла излеу бютёу атланы аламында бардырылмайды. Бютёу атланы аламында (къошулуучуланы сюзюулери, шаблонла эмда башхала) излер ючюн аллындан ''all:'' префиксни хайырландырыгъыз неда керекли атланы аламын белгилегиз.",
 'search-nonefound' => 'Соруу бла келишген эсеб джокъду',
 'powersearch' => 'Кенг излеу',
 'powersearch-legend' => 'Кенг излеу',
@@ -979,8 +1005,8 @@ $1",
 'powersearch-redir' => 'Джибериулени кёргюз',
 'powersearch-field' => 'Излеу:',
 'powersearch-togglelabel' => 'Белгиле:',
-'powersearch-toggleall' => 'Барысыда',
-'powersearch-togglenone' => 'Бирида',
+'powersearch-toggleall' => 'Барысы да',
+'powersearch-togglenone' => 'Бири да',
 'search-external' => 'Тыш излеу',
 'searchdisabled' => '{{SITENAME}} сайтда излеу талай заманнга тохтатылгъанды. Бусагъатда Google бла хайырланыб {{SITENAME}} ичинде излеу этерге боллукъсуз. Излеу сайтлада индекслери бир кесек эски болургъа боллугъун унутмагъыз.',
 
@@ -991,6 +1017,7 @@ $1",
 'qbsettings-fixedright' => 'Онгу къатды',
 'qbsettings-floatingleft' => 'Солгъа джюзеди',
 'qbsettings-floatingright' => 'Оннга джюзеди',
+'qbsettings-directionality' => 'Тилигизни джазмасыны онг/сол таба джазылгъанына кёре бегитилибди',
 
 # Preferences page
 'preferences' => 'Джарашдырыула',
@@ -1092,6 +1119,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'prefs-help-realname' => 'Керти ат (излеуге байламлы).
 Аны кёргюзюрге излесегиз, сиз тюрлендирген бетлеригизни,сиз тюрлендиргенигизи белгили боллукъду.',
 'prefs-help-email' => 'Электрон почтагъызны адресин джазаргъа амалсыз керек тюлдю, алай а, паролюгъузну унутсагъыз, ажымсыз керек боллукъду.',
+'prefs-help-email-others' => 'Ол сизни энчи бетигизде болгъан джибериуню юсю бла сизни бла байлам этерге амал береди; электрон почтагъызны адресин да ачыкъ этерге керек болмайсыз.',
 'prefs-help-email-required' => 'Электрон почтагъызны кёргюзюгюз.',
 'prefs-info' => 'Баш билгиле',
 'prefs-i18n' => 'Интернационализация',
@@ -1260,7 +1288,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'nchanges' => '$1 {{PLURAL:$1|тюрлениу|тюрлениу}}',
 'recentchanges' => 'Ахыр тюрлениуле',
 'recentchanges-legend' => 'Ахыр тюрлениулени джарашдырыулары',
-'recentchangestext' => 'Тюбюнде, Википедияда этилген ахыр тюрлениуле хронология бла тизилиб турадыла.',
+'recentchanges-summary' => 'Тюбюнде, Википедияда этилген ахыр тюрлениуле хронология бла тизилиб турадыла.',
 'recentchanges-feed-description' => 'Викиде бу лентада тюрлениулени кёзде тут.',
 'recentchanges-label-newpage' => 'Бу тюрлендириу бла джангы бет къуралгъанды',
 'recentchanges-label-minor' => 'Бу гитче тюрлениудю',
@@ -1447,17 +1475,22 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 'upload-unknown-size' => 'Билинмеген ёлчем',
 'upload-http-error' => 'HTTP хата болду: $1',
 
+# File backend
+'backend-fail-delete' => '«$1» файл кетерилмеди.',
+'backend-fail-store' => '$1 файл $2 ичинде сакъланылынмады.',
+
 # Special:UploadStash
 'uploadstash' => 'Джашыртын джюклеу',
+'uploadstash-clear' => 'Джашырылгъан файлланы ариула',
 'uploadstash-nofiles' => 'Сизни джашырылгъан файлларыгъыз джокъду',
 'uploadstash-refresh' => 'Файлланы тизмесин джангырт',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Эркинлик джасакъланнганды',
-'img-auth-nopathinfo' => 'PATH_INFO джокъду.
+'img-auth-nopathinfo' => '<code>PATH_INFO</code> джокъду.
 Серверигиз бу билгилени джиберир ючюн джарашмагъанды.
-CGI тамалында ишлерге эмда img_auth бла ишлемезге болур.
-https://www.mediawiki.org/wiki/Manual:Image_Authorization бетге къара.',
+CGI тамалында ишлерге эмда <code>img_auth</code> бла ишлемезге болур.
+Къарагъыз: https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Изленнген джол джюклениулени папкасы бла байламлы тюлдю.',
 'img-auth-badtitle' => '«$1» бла джараулу башлыкъ этилмейди.',
 'img-auth-nologinnWL' => 'Сиз системагъа кирмедигиз, эмда «$1» акъ списокда тюлдю.',
@@ -1497,9 +1530,8 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'upload_source_file' => '(компьютеригиздеги файл)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Бу къуллукъ бет бютеу джюкленнген файлланы кёргюзеди.
-Кеб болмай джюкленнге файлла тынгылау бла списокну башында кёргюзюледиле.
-Колонканы башлыгъына басыу сафламаны тюрлендиреди.',
+'listfiles-summary' => 'Бу къуллукъ бет, бютеу джюкленнген файлланы кёргюзеди.
+Къошулуучугъа кёре айырыуда, ол къошулуучуну джангыз кёб болмай джюклеген файллары кёргюзюледиле.',
 'listfiles_search_for' => 'Медиа ат бла изле:',
 'imgfile' => 'файл',
 'listfiles' => 'Файлланы списогу',
@@ -1528,13 +1560,14 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'filehist-filesize' => 'Файлны ёлчеми',
 'filehist-comment' => 'Эсгериу',
 'filehist-missing' => 'Файл джокъду',
-'imagelinks' => 'ФайлгÑ\8aа Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83ле',
+'imagelinks' => 'ФайлнÑ\8b Ñ\85айÑ\8bÑ\80ланÑ\8bÑ\83Ñ\83',
 'linkstoimage' => 'Бу файлгъа {{PLURAL:$1|бет|$1 бет}} джибередиле:',
 'linkstoimage-more' => '$1-ден артыкъ {{PLURAL:$1|бет|бет}} бу файлгъа джибериу береди.
 Кёзюудеги список къуру бу файлгъа джибериу берген {{PLURAL:$1|биринчи файлны|биринчи $1 файлны}} кёргюзеди.
 [[Special:WhatLinksHere/$2|Толу спиосок]] барды.',
 'nolinkstoimage' => 'Бу файлгъа джиберген бет джокъду.',
 'morelinkstoimage' => 'Бу файлгъа [[Special:WhatLinksHere/$1|къалгъан джибериулеге]] къара.',
+'linkstoimage-redirect' => '$1 (файл редирект) $2',
 'duplicatesoffile' => '{{PLURAL:$1|файл|$1 файл}}, бу файлны дубликатыды ([[Special:FileDuplicateSearch/$2|анданда кёб ангылатыу]]):',
 'sharedupload' => 'Бу файл $1денди эм башха проектледе хайырландыргъа боллукъду.',
 'sharedupload-desc-there' => 'Бу файл $1 базадан башха проектледе хайырландырыргъа боллукъду.
@@ -1575,6 +1608,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 ** дубликат файл',
 'filedelete-edit-reasonlist' => 'Кетериуню чурумларын тюрлендир',
 'filedelete-maintenance' => 'Техника ишлени кёзюуюнде файлланы кетериу эм ызына къайтарыу функцияла ишлеймедиле.',
+'filedelete-maintenance-title' => 'Файл кетерилмеди',
 
 # MIME search
 'mimesearch' => 'MIME бла излеу',
@@ -1586,7 +1620,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unwatchedpages' => 'Киши кёзде тутмагъан бетле',
 
 # List redirects
-'listredirects' => 'Ð\94жибеÑ\80иÑ\83лени Ñ\81пиÑ\81огÑ\83',
+'listredirects' => 'Ð\94жибеÑ\80иÑ\83лени Ñ\82измеÑ\81и',
 
 # Unused templates
 'unusedtemplates' => 'Хайырландырылмагъан шаблонла',
@@ -1594,7 +1628,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'unusedtemplateswlh' => 'башха джибериуле',
 
 # Random page
-'randompage' => 'Ð\9aÑ\8aайÑ\81Ñ\8b Ð±Ð¾Ð»Ñ\81а Ð´Ð°',
+'randompage' => 'ЭÑ\81де Ð±Ð¾Ð»Ð¼Ð°Ð³Ñ\8aан Ð±ÐµÑ\82',
 'randompage-nopages' => '{{PLURAL:$2|Ат аланында|Ат аланында}} чырт бир бет джокъду: $1.',
 
 # Random redirect
@@ -1622,7 +1656,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'statistics-users-active-desc' => 'Ахыр {{PLURAL:$1|1 кюнде|$1 кюнде}} ишлеме этген къошулуучула',
 'statistics-mostpopular' => 'Эм кёб къаралгъан бетле',
 
-'disambiguations' => 'Ð\9aÑ\91б Ð¼Ð°Ð³Ñ\8aаналÑ\8b Ð°Ð½Ð³Ñ\8bламланÑ\8b Ð±ÐµÑ\82леÑ\80и',
+'disambiguations' => 'Ð\90нгÑ\8bлам Ð°Ð¹Ñ\8bÑ\80гÑ\8aан Ð±ÐµÑ\82леге Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83леÑ\80и Ð±Ð¾Ð»Ð³Ñ\8aан Ð±ÐµÑ\82ле',
 'disambiguationspage' => 'Template:кёб магъаналылыкъ',
 'disambiguations-text' => "Бу бетле '''кёб магъаналы бетлеге''' джибериу этедиле. Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
 [[MediaWiki:Disambiguationspage]] бетде аты салынган шаблон бетде болса, ол бет кёб магъаналы бетге саналады.",
@@ -1689,11 +1723,11 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'protectedtitles' => 'Джакъланнган башлыкъла',
 'protectedtitlestext' => 'Бу атланы хайырланыргъа эркинлик джокъду',
 'protectedtitlesempty' => 'Бусагъатда, бу параметрле бла джакъланнган башлыкъ джокъду.',
-'listusers' => 'Ð\9aÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83',
+'listusers' => 'Ð\9aÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\82измеÑ\81и',
 'listusers-editsonly' => 'Къуру тюрлендириу этген къошлуучуланы кёргюз',
 'listusers-creationsort' => 'Къуралгъан заманына кёре сафла',
 'usereditcount' => '$1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
-'usercreated' => 'Къуралгъанды: $1 $2',
+'usercreated' => '$1 $2 заманда {{GENDER:$3|регистрацияны ётгенди}}',
 'newpages' => 'Джангы бетле',
 'newpages-username' => 'Къошулуучуну аты:',
 'ancientpages' => 'Ахыр тюрлендириуге кёре эм эски болгъан статьяла',
@@ -1719,12 +1753,12 @@ 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}} Ñ\8eÑ\87Ñ\8eн Ð±Ñ\8eÑ\82еÑ\83 Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ð³Ñ\8aан Ð¶Ñ\83Ñ\80налланÑ\8b Ð±Ð¸Ñ\80леÑ\88ген Ñ\81пиÑ\81огÑ\83.
-Журнал типини, къошулуучу атны (уллу-гитче харифге кёре) неда тийилген бетни (олда уллу-гитче харифге кёре) элерге боллукъсуз.',
+'alllogstext' => '{{SITENAME}} Ñ\8eÑ\87Ñ\8eн Ð±Ñ\8eÑ\82еÑ\83 Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ð³Ñ\8aан Ð¶Ñ\83Ñ\80налланÑ\8b Ð±Ð¸Ñ\80леÑ\88ген Ñ\82измеÑ\81и.
+Журнал типини, къошулуучу атны (уллу-гитче харифге кёре) неда тийилген бетни (ол да уллу-гитче харифге кёре) элерге боллукъсуз.',
 'logempty' => 'Журналлагъа келишген билги джокъду.',
 'log-title-wildcard' => 'Бу символладан башланнган башлыкъланы изле',
 
@@ -1744,6 +1778,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'allpagesprefix' => 'Былайда джазгъан харифледен башланнган бетлени список эт:',
 'allpagesbadtitle' => 'Кирилген бет аты тиллени арасы байлм неда викилени арасында байлам болгъаны себебли джараусузду. Башлыкълада хайырланыуу джасакъ болгъан бир неда андан аслам символ тутаргъа болур.',
 'allpages-bad-ns' => '{{SITENAME}} сайтда «$1» ат алам джокъду.',
+'allpages-hide-redirects' => 'Башха бетлеге джиберген бетлени (редиректлени) джашыр',
 
 # Special:Categories
 'categories' => 'Категорияла',
@@ -1760,12 +1795,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' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
 
@@ -1776,7 +1812,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listusers-blocked' => '(блокга салыныбды)',
 
 # Special:ActiveUsers
-'activeusers' => 'Ð\90кÑ\82ив ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83',
+'activeusers' => 'Ð\90кÑ\82ив ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\82измеÑ\81и',
 'activeusers-intro' => 'Бу, ахыр $1 {{PLURAL:$1|кюнде|кюнде}} къаллайда болсун ишлетме кёргюзген къошлуучуланы списогуду.',
 'activeusers-count' => 'Ахыр {{PLURAL:$3|кюнде|$3 кюнде}} $1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
 'activeusers-from' => 'Бу бла башланнган къошлуучуланы кёргюз:',
@@ -1797,7 +1833,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'listgrouprights-group' => 'Къауум',
 'listgrouprights-rights' => 'Хакъла',
 'listgrouprights-helppage' => 'Help:Къауумланы хакълары',
-'listgrouprights-members' => '(гÑ\80Ñ\83ппанÑ\8b Ñ\81пиÑ\81огÑ\83)',
+'listgrouprights-members' => '(кÑ\8aаÑ\83Ñ\83мнÑ\83 Ñ\82измеÑ\81и)',
 'listgrouprights-right-display' => '<span class="listgrouprights-granted">$1 <tt>($2)</tt></span>',
 'listgrouprights-right-revoked' => '<span class="listgrouprights-revoked">$1 <tt>($2)</tt></span>',
 'listgrouprights-addgroup' => '{{PLURAL:$2|Къауум|Къауум}} къошаргъа боллукъду: $1',
@@ -1817,13 +1853,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' => 'Кимге:',
@@ -1842,14 +1881,16 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # Watchlist
 'watchlist' => 'Кёзюмде тургъан тизмем',
-'mywatchlist' => 'Кёзюмде тургъан тизмем',
+'mywatchlist' => 'Кёзюмдеги тизмем',
 'watchlistfor2' => '$1 ючюн $2',
 'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
 'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
 'watchnologin' => 'Системагъа кирирге керекди.',
 'watchnologintext' => 'Кёзюгюзде тургъан тизмегизни тюрлендирир ючюн [[Special:UserLogin|системагъа кирирге керексиз]].',
+'addwatch' => 'Кёзде тургъан тизмеге къош',
 'addedwatchtext' => '«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.
 Бу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.',
+'removewatch' => 'Кёзде тургъан тизмеден кетер',
 'removedwatchtext' => '«[[:$1]]» бет сизни [[Special:Watchlist|кёзюгюзде тургъан тизмегизден]] кетерилгенди.',
 'watch' => 'Кёзде тут',
 'watchthispage' => 'Бу бетни кёзде тут',
@@ -2078,12 +2119,13 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Атла алам:',
 'invert' => 'Сайланнганны айландыр',
+'namespace_association' => 'Байламлы ат алам',
 'blanknamespace' => '(Баш)',
 
 # Contributions
 'contributions' => 'Къошулуучуну къошханы',
 'contributions-title' => '$1 къошулуучуну къошагъы',
-'mycontris' => 'Ð\9cени Ðºъошханым',
+'mycontris' => 'Ð\9aъошханым',
 'contribsub2' => '$1 ($2) къошакъ',
 'nocontribs' => 'Бу критерийлеге келишген тюрлениуле табылмадыла',
 'uctop' => '(ахыргъы)',
@@ -2095,6 +2137,7 @@ $1',
 'sp-contributions-newbies-title' => 'Джангы тергеу джазыуладан этилген къошакъ',
 'sp-contributions-blocklog' => 'Блок этиуню журналы',
 'sp-contributions-deleted' => 'къошулуучуну кетерилген тюрлендириулери',
+'sp-contributions-uploads' => 'джюкленнгенле',
 'sp-contributions-logs' => 'журналла',
 'sp-contributions-talk' => 'сюзюу',
 'sp-contributions-userrights' => 'къошулуучуну хакъларына оноу этиу',
@@ -2115,7 +2158,7 @@ $1',
 'nolinkshere-ns' => "Сайланнган атла аламда '''[[:$1]]''' бетге джиберген бет джокъду.",
 'isredirect' => 'джибериу бет',
 'istemplate' => 'къошуу',
-'isimage' => 'Ñ\81Ñ\83Ñ\80аÑ\82Ñ\85а джибериу',
+'isimage' => 'Ñ\84айлгÑ\8aа джибериу',
 'whatlinkshere-prev' => '{{PLURAL:$1|алдагъы|алдагъы $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|эндиги|эндиги $1}}',
 'whatlinkshere-links' => '← джибериуле',
@@ -2167,8 +2210,9 @@ $1',
 'ipusubmit' => 'Бу тыйгъычны кетер',
 'unblocked' => '[[User:$1|$1]]- тыйылыу тохтатылгъанды',
 'unblocked-id' => '$1 тыйылыу къоратылгъанды',
-'ipblocklist' => 'Блок этилиннген IP-адресле эм къошулуучуланы атлары',
+'ipblocklist' => 'Блок этилиннген къошулуучула',
 'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-expiry' => 'Бошалыу датасы',
 'blocklist-reason' => 'Чурум',
 'ipblocklist-submit' => 'Таб',
 'ipblocklist-localblock' => 'Локал блокга салыу',
@@ -2449,9 +2493,9 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-pt-anonuserpage' => 'Сизни IP-адресигиз ючюн къошулуучу бет',
 'tooltip-pt-mytalk' => 'Сизни сюзюу бетигиз',
 'tooltip-pt-anontalk' => 'Бу IP-адресден этилген тюрлендириулени сюзюу бет',
-'tooltip-pt-preferences' => 'Ð\94жарашдырыуларыгъыз',
-'tooltip-pt-watchlist' => 'Ð\9cен ÐºÑ\91зÑ\8eмде тутхан бетлени тизмеси',
-'tooltip-pt-mycontris' => 'Сизни Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83леÑ\80игизни Ñ\81пиÑ\81огÑ\83',
+'tooltip-pt-preferences' => 'Сизни Ð´жарашдырыуларыгъыз',
+'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' => 'Чыгъыу',
@@ -2474,18 +2518,18 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-n-mainpage' => 'Баш бетге кёчюу',
 'tooltip-n-mainpage-description' => 'Баш бетге кёчюу',
 'tooltip-n-portal' => 'Проектни юсюнден, сизни не этерге боллугъугъузню юсюнден, хар не къайда болгъаныны юсюнден',
-'tooltip-n-currentevents' => 'Ð\91Ñ\83Ñ\81агÑ\8aаÑ\82да Ð±Ð¾Ð»Ð³Ñ\8aан Ð¸Ñ\88лени Ñ\81пиÑ\81огÑ\83',
-'tooltip-n-recentchanges' => 'Ð\90Ñ\85Ñ\8bÑ\80 Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\81пиÑ\81огÑ\83',
-'tooltip-n-randompage' => 'Ð\9aÑ\8aайÑ\81Ñ\8b Ð±Ð¾Ð»Ñ\81ада бир бетге къара',
+'tooltip-n-currentevents' => 'Ð\91Ñ\83Ñ\81агÑ\8aаÑ\82да Ð±Ð¾Ð»Ð³Ñ\8aан Ð¸Ñ\88лени Ñ\82измеÑ\81и',
+'tooltip-n-recentchanges' => 'Ð\90Ñ\85Ñ\8bÑ\80 Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\82измеÑ\81и',
+'tooltip-n-randompage' => 'ЭÑ\81де Ð±Ð¾Ð»Ð¼Ð°Ð³Ñ\8aан бир бетге къара',
 'tooltip-n-help' => '«{{SITENAME}}» проектге джардам этиу',
-'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютеу бетлени списогу',
+'tooltip-t-whatlinkshere' => 'Бу бетге джибериу берген бютёу бетлени тизмеси',
 'tooltip-t-recentchangeslinked' => 'Бу бет джибериуле берген бетледе ахыр тюрлениуле',
 'tooltip-feed-rss' => 'Бу битге RSS-трансляция',
 'tooltip-feed-atom' => 'Бу бетге Atom-трансляция',
 'tooltip-t-contributions' => 'Къошулуучуну тюрлендирген бетлерине къара',
 'tooltip-t-emailuser' => 'Бу къошулуучугъа письмо джибер',
 'tooltip-t-upload' => 'Файлланы джюклеу',
-'tooltip-t-specialpages' => 'Бютеу къуллукъчу бетлени списогу',
+'tooltip-t-specialpages' => 'Бютёу къуллукъчу бетлени тизмеси',
 'tooltip-t-print' => 'Бу бетни басмагъа версиясы',
 'tooltip-t-permalink' => 'Бетни бу версиясына дайым джибериу',
 'tooltip-ca-nstab-main' => 'Статьяны ичиндеги',
@@ -2504,6 +2548,8 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'tooltip-diff' => 'Тюрлендириулеригизни кёрюгюз',
 'tooltip-compareselectedversions' => 'Бу бетни сайланнган эки версиясыны араларында башхалыкъларын кёр',
 'tooltip-watch' => 'Бу бетни кёзюгюзде тургъан тизмеге къош',
+'tooltip-watchlistedit-normal-submit' => 'Белгиленнген атланы кетер',
+'tooltip-watchlistedit-raw-submit' => 'Кёзде тургъан тизмени джангырт',
 'tooltip-recreate' => 'Кетерилгенина къарамай бетни ызына къайтар',
 'tooltip-upload' => 'Джюклеуню башла',
 'tooltip-rollback' => 'Бир басхан бла ахыр къошулуучуну тюрлендиргенин кетер',
@@ -2534,6 +2580,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' => 'Ностальгия',
@@ -2588,6 +2645,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' => 'тогъайланнганды',
@@ -2606,6 +2665,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' => 'Формат былай болургъа керекди:
 
@@ -2618,7 +2684,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
@@ -2668,7 +2734,7 @@ $1',
 'exif-componentsconfiguration' => 'Хар компонентни ангыламы',
 'exif-compressedbitsperpixel' => 'Суратны къысдырыу амалы',
 'exif-pixelydimension' => 'Суратны кенглиги',
-'exif-pixelxdimension' => 'Суратны толу кенглиги',
+'exif-pixelxdimension' => 'Суратны мийиклиги',
 'exif-usercomment' => 'Къошакъ комментарий',
 'exif-relatedsoundfile' => 'Тауушлу комментарийни файлы',
 'exif-datetimeoriginal' => 'Оригинал джаратыу заман',
@@ -2682,9 +2748,9 @@ $1',
 'exif-exposureprogram' => 'Экспозицияны программасы',
 'exif-spectralsensitivity' => 'Спектрал сезимлилик',
 'exif-isospeedratings' => 'ISO терклик дараджасы',
-'exif-shutterspeedvalue' => 'Декланшорну терклиги',
-'exif-aperturevalue' => 'Диафрагма',
-'exif-brightnessvalue' => 'Джарыкълыкъ',
+'exif-shutterspeedvalue' => 'APEX декланшорну терклиги',
+'exif-aperturevalue' => 'APEX-де диафрагма',
+'exif-brightnessvalue' => 'APEX-де джарыкълыкъ',
 'exif-exposurebiasvalue' => 'Экспозицияны коменсациясы',
 'exif-maxaperturevalue' => 'Максимум диафрагма саны',
 'exif-subjectdistance' => 'Объектге дери узакълыкъ',
@@ -2747,9 +2813,59 @@ $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' => 'Джамагъат мюлк',
 
 'exif-unknowndate' => 'Билинмеген заман',
 
@@ -2758,9 +2874,9 @@ $1',
 'exif-orientation-3' => '180° бурулгъанды',
 'exif-orientation-4' => 'Вертикал бла кёргюзюлгенди',
 'exif-orientation-5' => '90° бурулгъан (солгъа) эмда вертикал бла кёргюзюлгенди',
-'exif-orientation-6' => '90° бурулгъаннды (сагъат стрелкагъа)',
+'exif-orientation-6' => 'Сагъат стрелкагъа къаршчы 90° бурулгъанды',
 'exif-orientation-7' => '90° бурулгъанды (сагъат стрелкагъа) эмда вертикал бла кёргюзюлгенди',
-'exif-orientation-8' => '90° бурулгъанды (солгъа)',
+'exif-orientation-8' => 'Сагъат стрелкагъа кёре 90° бурулгъанды',
 
 'exif-planarconfiguration-1' => '«chunky» формат',
 'exif-planarconfiguration-2' => '«planar» формат',
@@ -2769,7 +2885,7 @@ $1',
 'exif-xyresolution-c' => '$1 dpc',
 
 'exif-colorspace-1' => 'sRGB',
-'exif-colorspace-65535' => 'FFFF.H',
+'exif-colorspace-65535' => 'Суратны бояу джарашдырыуу этилмегенди',
 
 'exif-componentsconfiguration-0' => 'Джокъду',
 
@@ -2886,6 +3002,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' => 'Ёлчелеу бошалгъанды',
 
@@ -2897,15 +3017,54 @@ $1',
 'exif-gpsspeed-m' => 'Миль/сагъат',
 'exif-gpsspeed-n' => 'Тенгиз миля',
 
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Километрле',
+'exif-gpsdestdistance-m' => 'Миляла',
+'exif-gpsdestdistance-n' => 'Тенгиз миляла',
+
+'exif-gpsdop-excellent' => 'Айырма иги ($1)',
+'exif-gpsdop-good' => 'Иги ($1)',
+'exif-gpsdop-moderate' => 'Орта ($1)',
+'exif-gpsdop-fair' => 'Ортадан аман ($1)',
+'exif-gpsdop-poor' => 'Аман ($1)',
+
+'exif-objectcycle-a' => 'Къуру эртдембла',
+'exif-objectcycle-p' => 'Къуру ингирде',
+'exif-objectcycle-b' => 'Эртдембла эм ингирде',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Керти',
 'exif-gpsdirection-m' => 'Мукъладис',
 
+'exif-ycbcrpositioning-1' => 'Centered',
+'exif-ycbcrpositioning-2' => 'CO-sited',
+
+'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' => 'Къазауатла, конфликтле эмда къозгъалыула',
@@ -2995,6 +3154,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%',
@@ -3152,6 +3315,9 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'version-software' => 'Салыннган программа баджарыу',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints' => 'Кириу нохталаны адреслери',
+'version-entrypoints-header-entrypoint' => 'Кириу нохта',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Файлгъа джол',
@@ -3252,33 +3418,59 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'sqlite-no-fts' => '$1 толу текст излеуню хайырландыра билмеген',
 
 # New logging system
+'logentry-delete-delete' => '$1, $3 бетни кетерди',
+'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 версиясын автомат халда тинтиб чыкъды',
+'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къурады',
 '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-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' => '$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 37ebf37..e00c52b 100644 (file)
@@ -198,7 +198,7 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#ÖMLEIDE_OP', '#ÖMLEIDE', '#LEIDT_ÖM_OP', '#ÖMLEIDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
-       'nogallery'               => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__NOGALLERY__' ),
+       'nogallery'               => array( '0', '__KEIN_JALLERIE__', '__KEINE_GALERIE__', '__KEINEGALERIE__', '__NOGALLERY__' ),
        'toc'                     => array( '0', '__ENHALLT__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
        'img_right'               => array( '1', 'rähß', 'räts', 'rechts', 'right' ),
        'img_left'                => array( '1', 'lengks', 'lenks', 'links', 'left' ),
@@ -575,7 +575,7 @@ wat en Üvverschrefte nit erlaub es.
 Et künnt ussinn, wie ene InterWikiLink,
 dat jeiht ävver nit.
 Muss De repareere.',
-'perfcached' => 'Di Daate heh noh kumme usem Zweschespeicher (<l lang="en">cache</i>) un künnte nit mieh janz de allerneuste sin.
+'perfcached' => 'Di Daate heh noh kumme usem Zweschespeicher (cache) un künnte nit mieh janz de allerneuste sin.
 {{PLURAL:$1|Bloß ein Antwoot es|Nit mieh wi $1 Antwoote sin|Kein Antwoot es}} doh faßjehallde un ze han.',
 'perfcachedts' => 'De Daate heenoh kumme usem Zweschespeicher (Cache) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.
 {{PLURAL:$4|Bloß ein Antwoot es|Nit mieh wi $4 Antwoote sind|Kein Antwoot es}} doh ze han.',
@@ -614,6 +614,13 @@ $2',
 'customjsprotected' => 'Do darfs di JavaSkep-Sigg heh nit ändere. Se jehööt enem andere Metmacher un es e Stöck funn dämm sing eije Enstellunge.',
 'ns-specialprotected' => '{{int:nstab-special}}e künne mer nit ändere.',
 'titleprotected' => "Dä Tittel för en Sigg eß verbodde, fum [[User:$1]], un dr Jrond wohr: ''„$2“''",
+'filereadonlyerror' => 'Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.
+
+Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
+'invalidtitle-knownnamespace' => '„$3“ es ene onjöltijje Tittel för em Appachtemang „$2“',
+'invalidtitle-unknownnamespace' => '„$2“ es ene onjöltijje Tittel för e Appachtemang met dä verkehte Nommer $1.',
+'exception-nologin' => 'Nit enjelogg',
+'exception-nologin-text' => 'Heh di Sigg udder heh dä Opdraach jeiht blooß, wann De heh em Wiki enjelogg bes.',
 
 # Virus scanner
 'virus-badscanner' => "Fääler en de Enstellunge: Dat Projramm ''$1'' fö noh Kompjuterwiere ze söke, dat kenne mer nit.",
@@ -735,6 +742,7 @@ för der Momang nit noch mit Metmaacher neu aanmellde.',
 'emailconfirmlink' => 'Dun Ding <i lang="en">e-mail</i> Adress bestätije looße',
 'invalidemailaddress' => 'Wat De do als en Adreß för Ding <i lang="en">e-mail</i> aanjejovve häs, süht noh Dress us. En <i lang="en">e-mail</i> Adreß en däm Format, dat jitt et nit. Muss De repareere - oder Do mähs dat Feld leddich un schrievs nix eren. Un dann versök et noch ens.',
 'cannotchangeemail' => 'Sing <i lang="en">e-mail<i> Addreß kam_mer ehe em Wiki nit ändere.',
+'emaildisabled' => 'Heh dat Wiki kann kein <i lang="en">e-mails</i> verschecke.',
 'accountcreated' => 'Aanjemeldt',
 'accountcreatedtext' => 'De Aanmeldung för dä Metmaacher „<strong>$1</strong>“ es dorsch, De kanns jetz enlogge.',
 'createaccount-title' => 'Enne neue Metmaacher aanmelde för {{GRAMMAR:Akkusativ|{{SITENAME}}}}',
@@ -984,7 +992,8 @@ denk dran, dat ene Metmaacher eije Dateie för et Ussinn han kann, un dat die me
 aanfange dun, alsu etwa: {{ns:user}}:Name/vector.css, un {{ns:user}}:Name/vector.js heiße.',
 'updated' => '(Aanjepack)',
 'note' => "'''Opjepass:'''",
-'previewnote' => "'''Heh kütt nor de Vör-Aansich - Ding Änderunge sin noch nit jesechert!'''",
+'previewnote' => "'''Heh kütt nor de Vör-Aansich — Ding Änderunge sin noch nit jesechert!'''",
+'continue-editing' => 'Jangk tiräk nohm Plaz zom Schrieve',
 'previewconflict' => 'Heh die Vör-Aansich zeich dä Enhald vum bovvere Texfeld.
 Esu wööd dä Atikkel ussinn, wann De n jetz avspeichere däts.',
 'session_fail_preview' => "'''Schad: Ding Änderunge kunnte mer su nix met aanfange.
@@ -998,6 +1007,7 @@ Wann dat widder nit flupp, dann versök et ens met [[Special:UserLogout|Uslogge]
 'token_suffix_mismatch' => "'''Ding Änderung ham_mer nit övvernomme. Dinge Brauser hät Sazzeijche em verstoche <i lang=\"en\">Token</i> för et Ändere versout. Dat paßeet och ens, wann enne <i lang=\"en\">Proxy</i> nit fungkßjeneet. Et Affspeichere wör do jefährlesch, do künt dä Sigge_Enhaldt kapott bei jon.'''",
 'edit_form_incomplete' => "'''Ene Aandeil vun dämm Fommulaa es nit reshtesh om ẞööver aanjekumme. Donn Ding Ennjaabe prööve, repareere, un versöhg et norrens.'''",
 'editing' => 'De Sigg „$1“ ändere',
+'creating' => 'De Sigg „$1“ aanlääje',
 'editingsection' => 'Ne Avschnedd vun dä Sigg: „$1“ ändere',
 'editingcomment' => '„$1“ ändere (ene neue Avschnedd schrieve)',
 'editconflict' => 'Problemche: „$1“ dubbelt bearbeidt.',
@@ -1050,7 +1060,7 @@ Heh kütt der neuste Enndrach em Logbooch doh drövver:",
 'templatesusedsection' => '{{PLURAL:$1|De Schablon|Schablone|-nix-}} en däm Avschnedd heh:',
 'template-protected' => '(jeschöz)',
 'template-semiprotected' => '(halfjeschöz - tabu för neu Metmaacher un ohne Enlogge)',
-'hiddencategories' => 'Die Sigg heh is en {{PLURAL:$1|de verstoche Saachjrupp: |$1 verstoche Saachjruppe: |keij verstoche Saachjruppe dren.}}',
+'hiddencategories' => 'Die Sigg heh is en {{PLURAL:$1|dä verstoche Saachjrupp: |dä $1 verstoche Saachjruppe: |keij verstoche Saachjruppe dren.}}',
 'edittools' => '<!-- Dä Tex hee zeich et Wiki unger däm Texfeld zom „Ändere/Bearbeide“ un beim Texfeld vum „Huhlade“. -->',
 'nocreatetitle' => 'Neu Sigge Aanläje eß nit einfach esu müjjelesch.',
 'nocreatetext' => 'Sigge neu aanläje es nor müjjelich, wann de [[Special:UserLogin|enjelogg]] bes. Der ohne kanns De ävver Sigge ändere, die ald do sin.',
@@ -1071,6 +1081,7 @@ Ene Jrond weße mer nit.',
 'edit-conflict' => 'Dubbelt beärbeit.',
 'edit-no-change' => 'Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.',
 'edit-already-exists' => 'Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.',
+'defaultmessagetext' => 'Dä standaadmäßije Tex',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.
@@ -1084,6 +1095,12 @@ Ene Jrond weße mer nit.',
 'parser-template-loop-warning' => 'Schablon roofe sesch em Kringel op: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Schablone refe sesch zo öff sellver op ($1)',
 'language-converter-depth-warning' => 'Zoh vill Verschachtelunge (övver $1) beim Täx-Ömwandelle vun ein Shprooch en andere.',
+'node-count-exceeded-category' => 'Sigge, woh dä  node-count övverschredde es',
+'node-count-exceeded-warning' => 'Heh di Sigg hät dä  node-count övverschredde',
+'expansion-depth-exceeded-category' => 'Sigge, woh de  expansion depth övverschredde es',
+'expansion-depth-exceeded-warning' => 'Heh di Sigg hät  the expansion depth övverschredde',
+'parser-unstrip-loop-warning' => 'Ene Befähl em Täx betrick sesch op sesch sellef.',
+'parser-unstrip-recursion-limit' => 'Ene Befähl em Täx es mieh wi {{PLURAL:$1|eijmohl|$1 Mohl|jaa nit}} met  sesch sellef verschachtelt.',
 
 # "Undo" feature
 'undo-success' => 'De Änderung könnte mer zeröck nämme. Beloor Der de Ungerscheid un dann donn di Sigg avspeichere, wann De dengks, et es en Oodenung esu.',
@@ -1261,8 +1278,9 @@ Donn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn
 'mergelogpagetext' => 'Dat hee is dat Logboch fun de zesammejelaate Versione fun Sigge',
 
 # Diffs
-'history-title' => 'Liss met Versione vun „$1“',
-'difference' => '(Ungerscheid zwesche de Versione)',
+'history-title' => 'Älder Versione vun dä Sigg „$1“',
+'difference-title' => 'Ongerscheide zwesche Versione vun dä Sigg „$1“',
+'difference-title-multipage' => 'Ongerscheide zwesche dä Sigge „$1“ un „$2“',
 'difference-multipage' => '(Ongerscheide zwesche Sigge)',
 'lineno' => 'Reih $1:',
 'compareselectedversions' => 'Dun de markeete Version verjliche',
@@ -1369,6 +1387,7 @@ dat dänne ihr Daate topaktuell sin,
 'prefs-beta' => 'Saache zum Ußprobeere, di schun en Zick lang erproob woode sin',
 'prefs-datetime' => 'Datum un Uhrzigge',
 'prefs-labs' => 'Neu Saache zom Ußprobeere, die künnte noch nit akeraat fluppe',
+'prefs-user-pages' => 'Metmaachersigge',
 'prefs-personal' => 'De Enstellunge',
 'prefs-rc' => 'Neuste Änderunge',
 'prefs-watchlist' => 'De Oppassliss',
@@ -1383,7 +1402,7 @@ dat dänne ihr Daate topaktuell sin,
 'prefs-setemail' => 'Donn en Adräß för de <i lang="en">e-mail</i> faßlääje',
 'prefs-email' => '<i lang="en">e-mail</i>',
 'prefs-rendering' => 'Et Sigge-Aanzeije',
-'saveprefs' => 'Fasshalde',
+'saveprefs' => 'Faßhalde',
 'resetprefs' => 'Zeröck setze',
 'restoreprefs' => 'Alles op der Shtandatt retuur stelle',
 'prefs-editing' => 'Beim Bearbeide',
@@ -1630,7 +1649,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'nchanges' => '{{PLURAL:$1|Ein Änderung|$1 Änderunge|Kein Änderung}}',
 'recentchanges' => 'Neuste Änderunge',
 'recentchanges-legend' => 'Enstellunge',
-'recentchangestext' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
+'recentchanges-summary' => 'Op dä Sigg hee sin de neuste Änderunge am Wiki opjeliss.',
 'recentchanges-feed-description' => 'Op dämm Abonnomang-Kannal (<i lang="en">Feed</i>) kannze de {{int:recentchanges}} aam Wiki en Laif un en Färve metloore.',
 'recentchanges-label-newpage' => 'Heh di Sigg es neu dobei jekumme met dä Änderung',
 'recentchanges-label-minor' => 'Heh dat es en Mini-Änderung',
@@ -1661,6 +1680,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'newsectionsummary' => 'Neu Avschnet /* $1 */',
 'rc-enhanced-expand' => 'Einzelheite zeije (bruch JavaSkripp)',
 'rc-enhanced-hide' => 'Einzelheite versteiche',
+'rc-old-title' => 'ojinaal als „$1“ aanjelaat',
 
 # Recent changes linked
 'recentchangeslinked' => 'Änderunge aan Sigge, wo heh drop jelink es',
@@ -1840,6 +1860,7 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
 'upload-too-many-redirects' => 'Zoh vill Ömleitunge en däm <i lang="en">URL</i>',
 'upload-unknown-size' => 'Mer weße nit, wi jruuß',
 'upload-http-error' => 'Ene <i lang="en">HTTP</i>-Fäähler es opjetrodde: $1',
+'upload-copy-upload-invalid-domain' => 'Fun dä Domain künne mer nix noh heh huh laade. Di es nit zohjelohße.',
 
 # File backend
 'backend-fail-stream' => 'Mer kunnte di Dattei $1 nit övverdraare.',
@@ -1847,6 +1868,7 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
 'backend-fail-notexists' => 'En Dattei $1 jidd et nit.',
 'backend-fail-hashes' => 'Mer kunnte kein Pröfsomme vun dä Datteje träcke zom verjliesche.',
 'backend-fail-notsame' => 'En Dattei mem Name $1 jidd et ald, di es ävver ongerscheidlesch.',
+'backend-fail-invalidpath' => '„$1“ es keine jölteje Pahd för et Speischere.',
 'backend-fail-delete' => 'Mer kunnte di Dattei $1 nit fottschmiiße.',
 'backend-fail-alreadyexists' => 'En Dattei $1 jidd et ald.',
 'backend-fail-store' => 'Mer kunnte di Dattei $1 nit onger $2 affschpeischere.',
@@ -1856,7 +1878,20 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
 'backend-fail-writetemp' => 'Mer kunnte nit en de Zweschedattei schriive.',
 'backend-fail-closetemp' => 'Mer kunnte de Zweschedattei no zohmaache.',
 'backend-fail-read' => 'Mer kunnte di Dattei $1 nit lässe.',
-'backend-fail-create' => 'Mer kunnte di Dattei $1 nit aanlääje.',
+'backend-fail-create' => 'Mer kunnte di Dattei $1 nit schrieve.',
+'backend-fail-maxsize' => 'Mer kunnte di Dattei $1 nit schrieve, weil se jrüüßer wi {{PLURAL:$2|ein Byte|$2 Bytes|kein Byte}} es.',
+'backend-fail-readonly' => 'Dem Wiki sing  Schpeischersysteem „$1“ es em Momang bloß för ze Lässe enjeschtallt.
+Als Jrond es aanjejovve: „$2“',
+'backend-fail-synced' => 'Di Dattei „$1“ es em Momang en enem onklohre Zohschtand en dem Wiki singe ennere Schpeischersysteeme.',
+'backend-fail-connect' => 'Mer kunnte kein Verbendong met däm Schpeischersysteem „$1“ opnämme.',
+'backend-fail-internal' => 'Ene onklohre Fähler es opjetrodde met däm Schpeischersysteem „$1“.',
+'backend-fail-contenttype' => 'Mer kunnte de Zoot Enhalt nit eruß krijje, di en dä Dattei „$1“ faßjehallde wääde sull.',
+'backend-fail-batchsize' => 'Dat Schpeischersysteem hät ene Pöngel met {{PLURAL:$1|einem Befähl|$1 Befähle|keinem Befähl}} krääje, ävver et kann bloß {{PLURAL:$2|eine Befähl|$2 Befähle|keine Befähl}} op eijmohl.',
+'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze schrieve.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Mer kunnte kein Verbendong opnämme met dä Daatebangk för et Logbooch vum Schpeischersysteem „$1“.',
+'filejournal-fail-dbquery' => 'Mer kunnte en et Logbooch vum Schpeischersysteem „$1“ nix eren schriive.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Mer kunnte „$1“ nit freijävve. Ed es nit jeschpächt.',
@@ -1976,6 +2011,10 @@ Mer han och [$2 jenouer Date övver se].',
 'sharedupload-desc-here' => 'Di Datei kütt vun $1 un kann en ander Projekte jebruch wäde.
 Jenouer Date övver se fingk mer op dä [$2 Sigg övver se].
 Dat sellve shteiht hee dronger.',
+'sharedupload-desc-edit' => 'Heh di Dateti es vun $1 un künnt anderswoh och jebruch wääde.
+Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
+'sharedupload-desc-create' => 'Heh di Dateti es vun $1 un künnt anderswoh och jebruch wääde.
+Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'filepage-nofile' => 'Et jit kein Datei met dämm Nahme.',
 'filepage-nofile-link' => 'Et jit kein Datei met dämm Nahme, ävver De kanns se [$1 huhlaade].',
 'uploadnewversion-linktext' => 'Dun en neu Version vun dä Datei huhlade',
@@ -2118,6 +2157,13 @@ Tipp: Merk Der dä Tittel vun dä Sigg dovör.',
 'wantedpages' => 'Sigge, die mer noch nit han, die noch jebruch wääde',
 'wantedpages-badtitle' => 'Ene onjöltijje Tittel för en Sigg: $1',
 'wantedfiles' => 'Dateie, di onß noch fähle',
+'wantedfiletext-cat' => 'Heh di Datteije sin nit doh. Se wääde ävver jebruch, wi wann se doh wööre.
+Datteije uß frembde Sammlonge künne heh opjeleß sin, och wann et se jitt.
+Di sin dann <del>dorschjeschtresche</del>. 
+Sigge, woh Datteije jebruch wääde sulle, die mer jaa nit han, fengk mer och en dä [[:$1]].',
+'wantedfiletext-nocat' => 'Heh di Datteije sin nit doh. Se wääde ävver jebruch, wi wann se doh wööre.
+Datteije uß frembde Sammlonge künne heh opjeleß sin, och wann et se jitt.
+Di sin dann <del>dorschjeschtresche</del>.',
 'wantedtemplates' => 'Schablone, die mer noch nit han, die noch jebruch wääde',
 'mostlinked' => 'Atikele met de miehste Links drop',
 'mostlinkedcategories' => 'Saachjruppe met de miehste Links drop',
@@ -2192,6 +2238,7 @@ oder de Sigge ehr Name, un esu, einzel zoteet aanluure.
 Bei de Name moß mer op Jruß- un Kleinschreff aachjävve.",
 'logempty' => '<i>Mer han kein zopass Endräch en däm Logboch.</i>',
 'log-title-wildcard' => 'Sök noh Titelle, di aanfange met …',
+'showhideselectedlogentries' => 'Ußjesöhk Endrääsch verschteische udder zeije',
 
 # Special:AllPages
 'allpages' => 'All Sigge',
@@ -2210,6 +2257,12 @@ Bei de Name moß mer op Jruß- un Kleinschreff aachjävve.",
 'allpagesbadtitle' => 'Dä Siggename es nit ze jebruche. Dä hät e Köözel för en Sproch oder för ne Interwiki Link am Aanfang, oder et kütt e Zeiche dren för, wat en Siggename nit jeiht, villeich och mieh wie
 eins vun all däm op eimol.',
 'allpages-bad-ns' => "Dat Appachtemeng „$1“ ha'mer nit.",
+'allpages-hide-redirects' => 'Ömleidunge fott lohße',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Dat heh küdd ussem Zewescheschpeischer un kann bes op $1 alt sin.',
+'cachedspecial-viewing-cached-ts' => 'Dat heh küdd ussem Zewescheschpeischer un nünnt nidd om neuste Schtand sin.',
+'cachedspecial-refresh-now' => 'De neuste Version.',
 
 # Special:Categories
 'categories' => 'Saachjruppe',
@@ -2284,11 +2337,12 @@ Adress en Dinge [[Special:Preferences|ming Enstellunge]] stonn han, öm en E-Mai
 schecke.',
 'emailuser' => 'E-mail aan dä Metmaacher',
 'emailpage' => 'E-mail aan ene Metmaacher',
-'emailpagetext' => 'Wann dä Metmaacher en E-mail Adress aanjejovve hätt en singe Enstellunge,
-un die deit et och, dann kanns De met däm Fomular hee unge en einzelne E-Mail aan dä Metmaacher schecke.
-Ding E-mail Adress, die De en [[Special:Preferences|Ding eije Enstellunge]] aanjejovve häs,
-die weed als em Avsender sing Adress en die E-Mail enjedrage.
-Domet kann, wä die E-Mail kritt, drop antwoote, un die Antwood jeiht tirek aan Dech.
+'emailpagetext' => 'Wann heh dä Metmaacher en Adräß för sing <i lang="en">e-mail</i> aanjejovve hätt en singe Enstellunge,
+un die deit et och, dann kanns De met däm Fomular hee unge en einzel <i lang="en">e-mail</i> aan dä Metmaacher schecke.
+
+Ding <i lang="en">e-mail</i>-Adräß, di De en [[Special:Preferences|Ding eije Enstellunge]] aanjejovve häs,
+di weed als em Afsender sing Adräß en Ding <i lang="en">e-mail</i> enjedrage.
+Domet kann, wä di <i lang="en">e-mail</i> kritt, drop antwoote, un di Antwood jeiht tirek aan Desch.
 Alles klor?',
 'usermailererror' => 'Dat E-Mail-Objek jov ene Fähler us:',
 'defemailsubject' => 'e-mail fum $1 {{GRAMMAR:fun|{{SITENAME}}}}.',
@@ -2370,14 +2424,14 @@ dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
 'enotif_anon_editor' => 'Dä namelose Metmaacher $1',
 'enotif_body' => 'Leeven $WATCHINGUSERNAME,
 
-{{GRAMMAR:em|{{SITENAME}}}} wood die Sigg „$PAGETITLE“ am $PAGEEDITDATE vun „$PAGEEDITOR“ $CHANGEDORCREATED, unger $PAGETITLE_URL fings Do de neuste Version.
+{{GRAMMAR:em|{{SITENAME}}}} wood die Sigg „$PAGETITLE“ am $PAGEEDITDATE {{GENDER:$PAGEEDITOR|vum|vum|vum_Metmaacher|vun dä|vum}} „$PAGEEDITOR“ $CHANGEDORCREATED, unger $PAGETITLE_URL fings Do de neuste Version.
 
 $NEWPAGE
 
 {{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT
 
 Do kanns dä Metmaacher „$PAGEEDITOR“ aanspreche:
-* E-mail: $PAGEEDITOR_EMAIL
+* Övver e-mail: $PAGEEDITOR_EMAIL
 * Em Wiki: $PAGEEDITOR_WIKI
 
 Do kriss vun jetz aan kein e-mail mieh, bes dat Do Der di Sigg aanjeluurt häs,
@@ -2390,10 +2444,10 @@ Ene schöne Jroß {{GRAMMAR:vun|{{SITENAME}}}}.
 Öm de Enshtällonge för Nohreeschet aan Desch ze ändere, jangk op:
 {{canonicalurl:{{#special:Preferences}}}}
 
-Do kanns hee Ding Oppassliss ändere:
+Do kanns hee Ding Oppassl ändere:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Öm di Sigg vun Dinger Oppassliss ze schmieße:
+Öm di Sigg vun Dinger Oppassl ze schmieße:
 $UNWATCHURL
 
 Do kanns hee noh Hölp luure:
@@ -2661,8 +2715,9 @@ Drag bei „Aanlass“ ene möchlichs jenaue Jrund en, wöröm dat Sperre passee
 'badipaddress' => 'Wat De do jeschrevve häs, dat es kein öntlije IP-Adress.',
 'blockipsuccesssub' => 'De IP-Adress es jetz jesperrt',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] es jetz jesperrt.
-Luur op [[Special:BlockList|de Liss met jesperrte IP_Adresse]] wann de ne Üvverbleck üvver de Sperre han wells,
-un och wann De se ändere wells.',
+<br />
+Luur op [[Special:BlockList|{{int:ipblocklist}}]] wann de ene Övverbleck övver de Sperre han wells,
+un och, wann De se ändere wells.',
 'ipb-blockingself' => 'Do bes om Wääsch, Desh sellver ze sperre. Wells De dat?',
 'ipb-confirmhideuser' => 'Do bes om bäßte Wääsch ene Metaacher ze sperre met „Vershteishe“ ußjewählt.
 Domet weed dä Name vun däm Metmaacher uß alle Leßte un Logbööscher eruß jelohße.
@@ -2714,8 +2769,8 @@ Wells De dat?',
 'blocklog-showsuppresslog' => 'Heh dä Metmaacher es ald fröjer jeshperrt un vershtoche woode. Dat Logbooch vum Metmaacher-Vershteishe onge künnt doh jät mieh zoh saare.',
 'blocklogentry' => 'hät „[[$1]]“ fö de Zick vun $2 jesperrt. $3',
 'reblock-logentry' => 'hät di Sperr för dä „[[$1]]“ met dä Duuer fun $2 $3 jeändert',
-'blocklogtext' => 'Heh es dat Logboch för et Metmaacher Sperre un Freijevve.
-Automatich jesperrte IP-Adresse sin nit heh, ävver en de [[Special:BlockList|{{int:ipblocklist}}]] ze finge.',
+'blocklogtext' => 'Heh es et Logboch övver et Metmaacher-Sperre un -Freijevve vun Hand.
+Automattesch jesperrte <i lang="en>IP</i>-Addräße sin nit heh, ävver en de [[Special:BlockList|{{int:ipblocklist}}]] ze fenge.',
 'unblocklogentry' => 'Metmaacher „$1“ freijejovve',
 'block-log-flags-anononly' => 'nor de namelose Metmaacher sperre',
 'block-log-flags-nocreate' => 'neu Metmaacher aanlääje es verbodde',
@@ -2980,10 +3035,15 @@ Bes esu joot, un versök et noch ens.',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|ein Version|$1 Versione|kein Version}} vun „$2“',
 
 # JavaScriptTest
-'javascripttest-disabled' => 'Di Funxjon es ußjeschalldt.',
+'javascripttest' => ' JavaSkrepte ußprobeere.',
+'javascripttest-disabled' => 'Di Funxjon es en heh dämm Wiki ußjeschalldt.',
 'javascripttest-title' => 'De Prööfunge „$1“ loufe.',
+'javascripttest-pagetext-noframework' => 'Heh di Sigg es för JavaSkrepte ußzeprobeere.',
 'javascripttest-pagetext-unknownframework' => 'Dä Prööfrahme „$1“ es onbikannt.',
+'javascripttest-pagetext-frameworks' => 'Bes esu jood un söök eine vun dä Prööfömjävvonge us: $1',
 'javascripttest-pagetext-skins' => 'Sööke en Bovverfläsch udder et Ußsinn uß, öm di Prööfonge domet ze maache:',
+'javascripttest-qunit-intro' => 'Loor noh dä [$1 Dokemäntation övver et Prööfe] op mediawiki.org.',
+'javascripttest-qunit-heading' => 'De Sammlong vum MediaWiki sing JavaSkrep-<i lang="en">QUnit</i>-Pröövunge',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Don Ding eije Metmaachersigg aanzeije',
@@ -3432,6 +3492,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-copyrighted-true' => 'Häd_en Urhävverrääsch',
 'exif-copyrighted-false' => 'Es en de Allmende (jemeinfrei, <i lang="en">public domain</i>)',
 
+'exif-photometricinterpretation-2' => 'RJB',
 'exif-photometricinterpretation-6' => '<i lang="en">YCbCr</i>',
 
 'exif-unknowndate' => 'Dattum onbikannt',
@@ -3455,6 +3516,7 @@ Donoh kumme, en däsellve Reih, Links op Sigge wo die Datei trotz dämm jenehm e
 'exif-colorspace-65535' => 'De Färve sin nit kallibreert',
 
 'exif-componentsconfiguration-0' => 'Jidd_et nit',
+'exif-componentsconfiguration-5' => 'J',
 
 'exif-exposureprogram-0' => 'Nit faßjelaat',
 'exif-exposureprogram-1' => 'Vun Hand',
@@ -3793,6 +3855,17 @@ Wells Do jetz met en neu Version die Sigg widder neu aanläje?',
 'size-megabytes' => '$1 MB',
 'size-gigabytes' => '$1 GB',
 
+# Bitrate units
+'bitrate-bits' => '$1&nbps;bps',
+'bitrate-kilobits' => '$1&nbps;Kbps',
+'bitrate-megabits' => '$1&nbps;Mbps',
+'bitrate-gigabits' => '$1&nbps;Gbps',
+'bitrate-terabits' => '$1&nbps;Tbps',
+'bitrate-petabits' => '$1&nbps;Pbps',
+'bitrate-exabits' => '$1&nbps;Ebps',
+'bitrate-zetabits' => '$1&nbps;Zbps',
+'bitrate-yottabits' => '$1&nbps;Ybps',
+
 # Live preview
 'livepreview-loading' => 'Ben am Lade …',
 'livepreview-ready' => 'Fädesch jelaade.',
@@ -3853,7 +3926,7 @@ De könnts Ding Oppassliss ävver och [[Special:EditWatchlist|övver e Fomulaa m
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Klaafe]])',
-'timezone-utc' => 'UTC',
+'timezone-utc' => '<i lang="en">UTC</i>',
 
 # Core parser functions
 'unknown_extension_tag' => '„<code>$1</code>“ es en zosäzlejje Kennzeichnung, die kenne mer nit.',
@@ -3889,6 +3962,9 @@ Do sullts en [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie vun dä <i lang="en">GNU Ge
 'version-software' => 'Installeete Soffwäer',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Version',
+'version-entrypoints' => '<i lang="en>URLs</i> för enzeschteije',
+'version-entrypoints-header-entrypoint' => 'Enschteesch',
+'version-entrypoints-header-url' => '<i lang="en">URL</i>',
 
 # Special:FilePath
 'filepath' => 'Medije-Dateie med ier URL zëije',
@@ -4080,4 +4156,15 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'api-error-uploaddisabled' => 'Et Huhlaade es en heh däm Wiki nit zohjelohße.',
 'api-error-verification-error' => 'Di Dattei künnt kappott sin, udder en verkehte Endong em Naame han.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|ein Sekund|$1 Sekunde|kein Sekund}}',
+'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
+'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
+'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
+'duration-weeks' => '{{PLURAL: $1|en Woch|§1 Woche|kein Woch}}',
+'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
+'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
+'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
+'duration-millennia' => '{{PLURAL:$1|e Johrdousend|$1 Johrdousende|kei Johrdousend}}',
+
 );
index abc6288..77f25c1 100644 (file)
@@ -12,6 +12,7 @@
  * @author Erdal Ronahi
  * @author Ferhengvan
  * @author George Animal
+ * @author Ghybu
  * @author Gomada
  * @author Kaganer
  * @author Krinkle
@@ -48,7 +49,7 @@ $specialPageAliases = array(
        'Randompage'                => array( 'Rûpela_tesadufî' ),
        'Randomredirect'            => array( 'Redirecta_tasadufî' ),
        'Recentchanges'             => array( 'Guherandinên_dawî' ),
-       'Search'                    => array( 'Lêbigere' ),
+       'Search'                    => array( 'Lê_bigere' ),
        'Statistics'                => array( 'Statîstîk' ),
        'Uncategorizedcategories'   => array( 'Kategoriyên_bê_kategorî' ),
        'Uncategorizedpages'        => array( 'Rûpelên_bê_kategorî' ),
@@ -58,27 +59,32 @@ $specialPageAliases = array(
 );
 
 $magicWords = array(
+       'redirect'                => array( '0', '#BERALÎKIRIN', '#REDIRECT' ),
        'notoc'                   => array( '0', '_NAVEROKTUNE_', '__NOTOC__' ),
        'nogallery'               => array( '0', '_GALERÎTUNE_', '__NOGALLERY__' ),
        'toc'                     => array( '0', '_NAVEROK_', '__TOC__' ),
        'noheader'                => array( '0', '_SERÎTUNE_', '__NOHEADER__' ),
+       'currentmonth1'           => array( '1', 'MEHANIHA1', 'CURRENTMONTH1' ),
        'currentday'              => array( '1', 'ROJA_NIHA', 'CURRENTDAY' ),
        'currentday2'             => array( '1', 'ROJA_NIHA2', 'CURRENTDAY2' ),
+       'currenttime'             => array( '1', 'DEMA_NIHA', 'CURRENTTIME' ),
        'numberofpages'           => array( '1', 'HEJMARA_RÛPELAN', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', 'HEJMARA_GOTARAN', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', 'HEJMARA_DOSYEYAN', 'NUMBEROFFILES' ),
        'numberofusers'           => array( '1', 'HEJMARA_BIKARHÊNERAN', 'NUMBEROFUSERS' ),
        'numberofactiveusers'     => array( '1', 'HEJMARA_BIKARHÊNERÊN_ÇALAK', 'NUMBEROFACTIVEUSERS' ),
-       'numberofedits'           => array( '1', 'HEJMARA_GUHERANDINAN', 'NUMBEROFEDITS' ),
+       'numberofedits'           => array( '1', 'HEJMARA_GUHERTINAN', 'NUMBEROFEDITS' ),
        'subpagename'             => array( '1', 'BINRÛPEL', 'SUBPAGENAME' ),
        'img_right'               => array( '1', 'rast', 'right' ),
        'img_left'                => array( '1', 'çep', 'left' ),
-       'img_link'                => array( '1', 'lînk=$', 'link=$1' ),
+       'img_link'                => array( '1', 'girêdan=$', 'link=$1' ),
+       'sitename'                => array( '1', 'NAVÊ_PROJEYÊ', 'SITENAME' ),
        'grammar'                 => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
        'gender'                  => array( '0', 'ZAYEND.', 'GENDER:' ),
        'plural'                  => array( '0', 'PIRRJIMAR:', 'PLURAL:' ),
        'currentversion'          => array( '1', 'VERSIYONA_NIHA', 'CURRENTVERSION' ),
-       'numberofadmins'          => array( '1', 'HEJMARA_ADAMÎNISTRATORAN', 'NUMBEROFADMINS' ),
+       'language'                => array( '0', '#ZIMAN', '#LANGUAGE:' ),
+       'numberofadmins'          => array( '1', 'HEJMARA_RÊVEBERAN', 'NUMBEROFADMINS' ),
        'special'                 => array( '0', 'taybet', 'special' ),
 );
 
@@ -107,7 +113,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',
@@ -147,8 +153,8 @@ $messages = array(
 'sun' => 'Ykş',
 'mon' => 'Duş',
 'tue' => 'Sêş',
-'wed' => 'Çarş',
-'thu' => 'Pşem',
+'wed' => 'Çrş',
+'thu' => 'Pşm',
 'fri' => 'În',
 'sat' => 'Şem',
 'january' => 'rêbendan',
@@ -158,23 +164,23 @@ $messages = array(
 'may_long' => 'gulan',
 'june' => 'pûşper',
 'july' => 'tîrmeh',
-'august' => 'tebax',
+'august' => 'gelawêj',
 'september' => 'rezber',
 'october' => 'kewçêr',
 'november' => 'sermawez',
-'december' => 'Berfanbar',
+'december' => 'berfanbar',
 'january-gen' => 'Rêbendan',
 'february-gen' => 'Reşemî',
 'march-gen' => 'Adar',
 'april-gen' => 'Avrêl',
 'may-gen' => 'Gulan',
-'june-gen' => 'Pûşper',
+'june-gen' => 'pûşper',
 'july-gen' => 'Tîrmeh',
 'august-gen' => 'Gelawêj',
-'september-gen' => 'Rezber',
+'september-gen' => 'rezber',
 'october-gen' => 'Kewçêr',
 'november-gen' => 'Sermawez',
-'december-gen' => 'Berfanbar',
+'december-gen' => 'berfanbar',
 'jan' => 'rêb',
 'feb' => 'reş',
 'mar' => 'adr',
@@ -208,11 +214,11 @@ $messages = array(
 'about' => 'Der barê',
 'article' => 'Gotar',
 'newwindow' => '(di rûpeleke din de wê were nîşandan)',
-'cancel' => 'Betalkirin',
+'cancel' => 'Betal bike',
 'moredotdotdot' => 'Bêhtir...',
 'mypage' => 'Rûpela min',
-'mytalk' => 'Rûpela gotûbêja min',
-'anontalk' => 'Guftûgo ji bo vê IPê',
+'mytalk' => 'Gotûbêja min',
+'anontalk' => "Gotûbêj ji bo vê IP'ê",
 'navigation' => 'Navîgasyon',
 'and' => '&#32;û',
 
@@ -244,7 +250,7 @@ $messages = array(
 'variants' => 'Variyant',
 
 'errorpagetitle' => 'Çewtî',
-'returnto' => 'Bizîvire $1.',
+'returnto' => 'Vegere $1.',
 'tagline' => 'Ji {{SITENAME}}',
 'help' => 'Alîkarî',
 'search' => 'Lêgerîn',
@@ -268,26 +274,26 @@ $messages = array(
 'protect' => 'Biparêze',
 'protect_change' => 'guherandin',
 'protectthispage' => 'Vê rûpelê biparêze',
-'unprotect' => 'Parastinê rake',
-'unprotectthispage' => 'Parastina vê rûpelê rake',
+'unprotect' => 'Parastinê biguherîne',
+'unprotectthispage' => 'Parastina vê rûpelê biguherîne',
 'newpage' => 'Rûpela nû',
-'talkpage' => 'Vê rûpelê guftûgo bike',
-'talkpagelinktext' => 'Nîqaş',
+'talkpage' => 'Vê rûpelê gotûbêj bike',
+'talkpagelinktext' => 'gotûbêj',
 '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',
+'userpage' => 'Li rûpela bikarhêner binêre',
 'projectpage' => 'Li rûpela projeyê binêre',
 'imagepage' => 'Rûpela dosyeyan bibîne',
 'mediawikipage' => 'Rûpela peyamê bibîne',
 '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',
@@ -296,7 +302,7 @@ $messages = array(
 'protectedpage' => 'Rûpela parastî',
 'jumpto' => 'Here cem:',
 'jumptonavigation' => 'navîgasyon',
-'jumptosearch' => 'lêbigere',
+'jumptosearch' => 'lêgerîn',
 'view-pool-error' => 'Bibore, server niha zêde barkirî ne. Gelek bikarhêner niha hewl didin ku vê rûpelê bibînin. Ji kerema xwe kêlîkekê bisekine, berî ku tu dîsa hewl bidî rûpelê bibînî.',
 'pool-errorunknown' => 'Çewtiyeke nenas',
 
@@ -317,7 +323,7 @@ $messages = array(
 'policy-url' => 'Project:Rêgez',
 'portal' => 'Portala komê',
 'portal-url' => 'Project:Portala komê',
-'privacy' => 'Parastina daneyan',
+'privacy' => 'Siyaseta taybetîtiyê',
 'privacypage' => 'Project:Parastina daneyan',
 
 'badaccess' => 'Çewtiya destûrê',
@@ -327,11 +333,11 @@ $messages = array(
 'versionrequired' => 'Versiyona $1 a MediaWiki pêwîst e',
 'versionrequiredtext' => 'Versiyona $1 a MediaWiki ji bo bikaranîna vê rûpelê pêwîst e. Li [[Special:Versiyon|rûpela versiyonê]] binêre.',
 
-'ok' => 'Temam',
+'ok' => 'Baş e',
 'retrievedfrom' => 'Ji "$1" hatiye standin.',
 'youhavenewmessages' => '$1 yên te hene ($2).',
 'newmessageslink' => 'Peyamên nû',
-'newmessagesdifflink' => 'ciyawazî ji guhertoya berê',
+'newmessagesdifflink' => 'cudayî ji guhertoya berê',
 'youhavenewmessagesmulti' => 'Peyamên nû li $1 ji te re hene.',
 'editsection' => 'biguherîne',
 'editold' => 'biguherîne',
@@ -358,7 +364,7 @@ $messages = array(
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Rûpel',
-'nstab-user' => 'Bikarhêner',
+'nstab-user' => 'Rûpela bikarhêner',
 'nstab-media' => 'Medya',
 'nstab-special' => 'Rûpela taybet',
 'nstab-project' => 'Rûpela projeyê',
@@ -396,7 +402,7 @@ Sedema girtinê ev e: $1',
 'internalerror' => 'Çewtiyeke navxweyî',
 'internalerror_info' => 'Çewtiya navxweyî: $1',
 'fileappenderror' => '"$1" li "$2" nehate zêdekirin.',
-'filecopyerror' => 'Daneya „$1“ ji bo „$2“ naye kopîkirin.',
+'filecopyerror' => 'Daneya "$1" ji bo "$2" naye kopîkirin.',
 'filerenameerror' => 'Navê pelê "$1" nebû "$2".',
 'filedeleteerror' => '"$1" jê nehate birîn.',
 'directorycreateerror' => 'Rêbera "$1" nehate çêkirin.',
@@ -405,7 +411,7 @@ Sedema girtinê ev e: $1',
 'unexpected' => 'Tiştekî nedihate hêvîkirin: "$1"="$2".',
 'formerror' => 'Çewtî: Ew nivîs pêk nehat.',
 'badarticleerror' => 'Ev çalakî di vê rûpelê de nabe.',
-'cannotdelete' => 'Ev rûpel nikare were jêbirin. Dibe ku kesekî din ev rûpel jêbiribe.',
+'cannotdelete' => 'Ev rûpel an wêne nikare were jêbirin. Dibe ku kesekî din ev rûpel jêbiribe.',
 'badtitle' => 'Sernivîsa nebaş',
 'badtitletext' => 'Sernavê rûpelê yê xwestî ne derbasdar, vala an jî ne xwediyê girêdaneke rast e.
 Dibe ku di sernavê de karakterên nayên bikaranîn hatibin nivîsandin.',
@@ -421,12 +427,10 @@ Pirs: $2',
 'protectedpagetext' => 'Ev rûpel ji bo nenivîsandinê hatiye parastin.',
 'viewsourcetext' => 'Tu dikarî li çavkaniya vê rûpelê binêrî û wê kopî bikî:',
 'protectedinterface' => "Di vê rûpelê da nivîsandin ji bo interface'î zimanan yê vê software'ê ye. Ew tê parstin ji bo vandalîzm li vê derê çênebe.",
-'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku translatewiki.net] de bixebite, projeya MediaWiki.",
+'editinginterface' => "'''Hişyarî:''' Tu rûpeleke ku di Wîkîpediya de ji bo sîstemê girîng e diguherînî. Guherandinên di vê rûpelê de wê ji aliyê hemû bikarhêneran ve werin dîtin. Ji bo wergerê ji kerema xwe di [//translatewiki.net/wiki/Main_Page?setlang=ku-latn translatewiki.net] de bixebite, projeya MediaWiki.",
 'sqlhidden' => '(Jêpirskirina SQL hatiye veşartin)',
-'cascadeprotected' => '<strong>Ev rûpel hatiye parastin ji ber guherandinê, ji ber ku ev rûpela di {{PLURAL:$1|vê rûpelê|van rûpelan da}} tê bikaranîn:
-$2
-
-</strong>',
+'cascadeprotected' => 'Ev rûpel hatiye parastin ji ber guherandinê, ji ber ku ev rûpela di {{PLURAL:$1|vê rûpelê|van rûpelan da}} tê bikaranîn:
+$2',
 'namespaceprotected' => "Destûra te ji bo guhertina vê rûpelê '''$1''' di valahiya nav de nîne.",
 'ns-specialprotected' => 'Rûpelên taybet {{ns:special}} nikarin werin guherandin.',
 'titleprotected' => "Rûpelek bi vî navî nikare were çêkirin. Ev astengkirin ji [[User:$1|$1]] bi sedema ''$2'' hate çêkirin.",
@@ -435,7 +439,7 @@ $2
 'virus-unknownscanner' => 'Antîvîrusa nenas:',
 
 # Login and logout pages
-'logouttext' => "'''Tu niha derketî (logged out).'''
+'logouttext' => "'''Tu niha derketî.'''
 
 Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner [[Special:UserLogin|dîsa têkevî]].
 Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
@@ -450,16 +454,16 @@ Hesabê te hate afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe
 'externaldberror' => 'Çewtiyeke bingeha daneyan heye, an jî destûra te ya rojanekirina hesabê xweyê navxweyî nîne.',
 'login' => 'Têkeve',
 'nav-login-createaccount' => 'Têkeve / hesabekî nû çêke',
-'loginprompt' => "<b>Eger tu xwe nû qeyd bikî, nav û şîfreya xwe hilbijêre.</b> Ji bo xwe qeyd kirinê di {{SITENAME}} de divê ku ''cookies'' gengaz be.",
-'userlogin' => 'Têkeve an hesabeke nû çêke',
+'loginprompt' => "<b>Eger tu xwe nû tomar bikî, nav û şîfreya xwe hilbijêre.</b> Ji bo tomarkirina te ya di {{SITENAME}} de divê ku ''cookies'' gengaz bin.",
+'userlogin' => 'Têkeve an hesabekî nû çêke',
 'userloginnocreate' => 'Têkeve',
 'logout' => 'Derkeve',
 'userlogout' => 'Derkeve',
-'notloggedin' => 'Xwe qeyd nekir (not logged in)',
+'notloggedin' => 'Xwe tomar nekir',
 'nologin' => 'Hesabê te nîne? $1.',
 'nologinlink' => 'Bibe endam',
 'createaccount' => 'Hesabê nû çêke',
-'gotaccount' => "Hesabê te heye? '''$1'''.",
+'gotaccount' => 'Hesabê te heye? $1.',
 'gotaccountlink' => 'Têkeve',
 'userlogin-resetlink' => 'Te agahiyên hesabê xwe ji bîr kirin?',
 'createaccountmail' => 'bi e-name',
@@ -470,9 +474,9 @@ Hesabê te hate afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe
 'nocookiesnew' => "Hesabê bikarhêner hatibû çêkirin, lê te xwe qeyd nekiriye. {{SITENAME}} ji bo qeydkirina bikarhêneran cookie'yan bikartîne. Te bikaranîna cookie'yan girtiye. Xêra xwe cookie'yan qebûl bike, piştre bi navê bikarhêner û şîfreya xwe têkeve.",
 'nocookieslogin' => 'Ji bo qeydkirina bikarhêneran {{SITENAME}} "cookies" bikartîne. Te fonksîyona "cookies" girtîye. Xêra xwe kerema xwe "cookies" gengaz bike û careke din biceribîne.',
 'noname' => 'Navê ku te nivîsand derbas nabe.',
-'loginsuccesstitle' => 'Têketin serkeftî!',
-'loginsuccess' => 'Tu niha di {{SITENAME}} de qeydkirî yî wek "$1".',
-'nosuchuser' => 'Bikarhênera/ê bi navê "$1" tune. Navê rast binivîse an bi vê formê <b>hesabeke nû çêke</b>. (Ji bo hevalên nû "Têkeve" çênabe!)',
+'loginsuccesstitle' => 'Têketin serkevtî bû!',
+'loginsuccess' => 'Tu niha di {{SITENAME}} de tomarkirî yî wek "$1".',
+'nosuchuser' => 'Bikarhênerê bi navê "$1" tune. Navê rast binivîse an bi vê formê <b>hesabekî nû çêke</b>. (Ji bo hevalên nû "Têkeve" çênabe!)',
 'nosuchusershort' => 'Li vê derê ne bikarhênerek bi navî "$1" heye. Li nivîsandinê xwe seke.',
 'nouserspecified' => 'Divê tu navekî ji bo bikarhêneriyê hilbijêrî.',
 'login-userblocked' => 'Rê li ber vî/vê bikarhênerî/ê hatiye girtin. Destûr bo têketinê nîne.',
@@ -482,18 +486,18 @@ Hesabê te hate afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe
 'password-name-match' => 'Divê şîfreya te ji navê te yê bikaranînê cuda be.',
 'password-login-forbidden' => 'Bikaranîna vî navî û vê şîfreyê hatiye qedexekirin.',
 'mailmypassword' => 'Şîfreyeke nû bi e-mail ji min re bişîne',
-'passwordremindertitle' => 'Şîfreyakekî nuh ji hesabekî {{SITENAME}} ra',
-'passwordremindertext' => 'Kesek (têbê tu, bi IP\'ya $1) xwast ku şîfreyekî nuh ji {{SITENAME}} ($4) ji te ra were şandin. Şîfreya nuh ji bikarhêner "$2" niha "$3" e. Tu dikarî niha têkevê û şîfreya xwe biguherînê.
+'passwordremindertitle' => 'Şîfreyeke nû ya ji hesabekî {{SITENAME}} re',
+'passwordremindertext' => 'Kesek (têbê tu, bi IP\'ya $1) xwast ku şîfreyeke nû ji {{SITENAME}} ($4) ji te ra were şandin. Şîfreya nû ya bikarhêner "$2" niha "$3" e. Tu dikarî niha têkevê û şîfreya xwe biguherînê.
 
 Eger kesekî din vê xastinê ji te ra xast ya şîfreya kevin dîsa hate bîrê te, tu dikarê guh nedê vê peyamê û tu dikarê bi şîfreya xwe yê kevin hên karbikê.',
 'noemail' => 'Navnîşana bikarhênerê/î "$1" nehat tomar kirine.',
 'noemailcreate' => 'Divê tu e-nameyeke derbasdar binivîsî',
 'passwordsent' => 'Ji navnîşana e-mail ku ji bo "$1" hat tomarkirin şîfreyekê nû hat şandin. Vê bistîne û dîsa têkeve.',
-'blocked-mailpassword' => "IP'ya te yê ji te niha tê bikaranin ji bo guherandinê ra hatîye astengkirin. Ji bo tiştên şaş çênebin, xastinê te ji bo şifreyeka nuh jî hatîye qedexekirin.",
+'blocked-mailpassword' => "IP'ya ku tu niha bi kar tînî ji guherandinê re hatiye astengkirin. Ji bo tiştên şaş çênebin, xwestina te ya ji bo şîfreyeke nû jî hatiye qedexekirin.",
 'eauthentsent' => 'E-nameyeka naskirinê ji adresa nivîsî ra hate şandin. Berî e-name ji bikarhênerên din bi vê rêkê dikaribim bi te gên, ew adresa û rastbûna xwe gireke werin naskirin. Xêra xwe e-nameyê naskirinê bixûne!',
-'throttled-mailpassword' => 'Berî {{PLURAL:$1|saetekê|$1 saetan}} şîfreyekî nuh hate xastin. Ji bo şaşbûn bi vê fonksyonê çênebin, bes her {{PLURAL:$1|saetekê|$1 saetan}} şîfreyekî nuh dikare were xastin.',
+'throttled-mailpassword' => 'Berî {{PLURAL:$1|saetekê|$1 saetan}} şîfreyeke nû hate xwestin. Ji bo şaşbûn bi vê fonksiyonê çênebin, bes her {{PLURAL:$1|saetekê|$1 saetan}} şîfreyeke nû dikare were xwestin.',
 'mailerror' => 'Şaşbûnek li cem şandina e-nameyekê: $1',
-'acct_creation_throttle_hit' => 'Biborîne! Te hesab $1 vekirine. Tu êdî nikarî hesabên din vekî.',
+'acct_creation_throttle_hit' => 'Bibexşe! Te hesabê bikarhêneriyê $1 vekiriye. Tu êdî nikarî hesabên din vekî.',
 'emailauthenticated' => 'Adresa e-nameya te hate naskirin: $1.',
 'emailnotauthenticated' => 'Adresa e-nameyan yê te hên nehatîye naskirin. Fonksyonên e-nameyan piştî naskirina te dikarin ji te werin kirin.',
 'noemailprefs' => "'''Te hên adresa e-nameyan nenivîsandîye''', fonksyonên e-nameyan hên ji te ra ne tên qebûlkirin.",
@@ -514,7 +518,8 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
 
 # Change password dialog
 'resetpass' => 'Şîfreyê biguherîne',
-'resetpass_announce' => 'Te xwe bi şîfreyekê qeydkir, yê bi e-nameyekê ji te ra hate şandin. Ji bo xelaskirinê qeydkirinê, tu niha gireke şîfreyeka nuh binivisînê.',
+'resetpass_announce' => 'Te xwe bi şîfreyekê tomar kiriye ku bi riya e-nameyekê ji te re hatiye şandin.
+Ji bo xelaskirina tomarkirinê, divê tu niha şîfreyeke nû binivîsî:',
 'resetpass_text' => '<!-- Nivîsê li vir binivisîne -->',
 'resetpass_header' => 'Şîfreya hesabê xwe biguherîne',
 'oldpassword' => 'Şîfreya kevn',
@@ -566,7 +571,7 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
 'hr_tip' => 'Rastexêza berwarî (kêm bi kar bîne)',
 
 # Edit pages
-'summary' => 'Kurte û çavkanî (Te çi kir?):',
+'summary' => 'Kurte (Te çi kir?):',
 'subject' => 'Mijar/sernivîs:',
 'minoredit' => 'Ev guhertineke biçûk e',
 'watchthis' => 'Vê gotarê bişopîne',
@@ -576,6 +581,7 @@ Eger account\'a bikarhêneran şaşî hate çêkirin, guhdare vê peyamê meke.'
 'showlivepreview' => 'Pêşdîtina zindî',
 'showdiff' => 'Guherandinê nîşan bide',
 'anoneditwarning' => "'''Hişyarî:''' Tu netêketî yî! Navnîşana IP'ya te wê di dîroka guherandina vê rûpelê de bê tomarkirin.",
+'anonpreviewwarning' => "''Tu ne têketî yî. Tomarkirin wê navnîşana IP'ya te di dîroka guhertinan de nîşan bide.''",
 'missingsummary' => "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te nivîsekî kurt ji bo guherandinê ra nenivîsand. Eger tu niha carekî din li Tomar xê, guherandinê te vê nivîsekî kurt yê were tomarkirin.",
 'missingcommenttext' => 'Ji kerema xwe kurteya naverokê li jêr binivisîne.',
 'missingcommentheader' => "<span style=\"color:#990000;\">'''Zanibe:'''</span> Te sernavek nenivîsandiye. Heke tu niha carekî din li ser ''tomar bike'' bitikînî, ev guherandina vê sernavê wê were tomarkirin.",
@@ -624,15 +630,20 @@ 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î].',
+'noarticletext-nopermission' => 'Ev rûpel niha vala ye. 
+Tu dikarî [[Special:Search/{{PAGENAME}}|Di nav gotarên din de li "{{PAGENAME}}" bigere]] 
+an <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} vê rûpelê biguherînî]</span>.',
 'userpage-userdoesnotexist' => 'Hesabê bikarhêneran "<nowiki>$1</nowiki>" nehatiye qeydkirin. Heke tu bixwazî vê rûpelê çêkî/biguherînî ji kerema xwe lê binêre.',
 'userpage-userdoesnotexist-view' => 'Hesabê bikarhêner  "$1"  nehatiye qeyd kirin.',
 'blocked-notice-logextract' => 'Ev bikarhêner hatiye astengkirin.
 Astengkirina dawî bi referansa li jêr hatiye piştrastkirin:',
-'clearyourcache' => "'''Zanibe:''' Piştî tomarkirinê, tu gireke cache'a browser'î xwe dîsa wînê ji bo dîtina guherandinan. '''Mozilla / Firefor /Safari:''' Kepsa ''Shift'' bigre û li ''Reload'' xe, ya ''Ctrl-Shift-R'' bikepsîne (''Cmd-Shift-R'' li cem Apple Mac); '''IE:''' Kepsa ''Ctrl'' bigre û li ''Reload'' xe, ya li ''Ctrl-F5''; '''Konqueror:''' bes li ''Reload'' xe ya li kepsa ''F5'' xe; bikarhênerên '''Opera''' girekin belkî cache'a xwe tevda di bin ''Tools → Preferences'' da valabikin.",
+'clearyourcache' => "'''Zanibe:''' Piştî tomarkirinê, tu gireke cache'a browser'î xwe dîsa wînê ji bo dîtina guherandinan.
+* '''Firefor / Safari: ''' Kepsa ''Shift'' bigre û li ''Reload'' xe, ya ''Ctrl-Shift-R'' bikepsîne (''Cmd-Shift-R'' li cem Apple Mac)
+* '''IE:''' Kepsa ''Ctrl'' bigre û li ''Reload'' xe, ya li ''Ctrl-F5''
+* '''Konqueror:''' Bes li ''Reload'' xe ya li kepsa ''F5'' xe
+* '''Opera:''' Girekin belkî cache'a xwe tevda di bin ''Tools → Preferences'' da valabikin",
 'usercssyoucanpreview' => "'''Tîp:''' 'Pêşdîtin' bikarwîne ji bo tu bibînê çawa CSS'ê te yê nuh e berî tomarkirinê.",
 'userjsyoucanpreview' => "'''Tîp:''' 'Pêşdîtin' bikarwîne ji bo tu bibînê çawa JS'ê te yê nuh e berî tomarkirinê.",
 'usercsspreview' => "'''Zanibe ku tu bes pêşdîtina CSS dibînî.'''
@@ -641,28 +652,33 @@ Astengkirina dawî bi referansa li jêr hatiye piştrastkirin:',
 'updated' => '(Hate rojanekirin)',
 'note' => "'''Nîşe:'''",
 'previewnote' => "'''Ji bîr neke ku ev bi tenê çavdêriyek e, ev rûpel hîn nehatiye tomarkirin!'''",
+'continue-editing' => 'Guhertinê bidomîne',
 'editing' => 'Biguherîne: "$1"',
+'creating' => '$1 tê çêkirin',
 'editingsection' => 'Tê guherandin: $1 (beş)',
 'editingcomment' => '$1 (şîrove) tê guherandin.',
 'editconflict' => 'Têkçûna guherandinan: $1',
 'explainconflict' => "Ji dema te dest bi guherandinê kir heta niha kesekê/î din ev rûpel guherand.
-Jor guhartoya heyî tê dîtîn.
-Guherandinên te jêr tên nîşan dan.
-Divê tû wan bikî yek.
-Heke niha tomar bikî, '''bi tene''' nivîsara qutiya jor wê bê tomarkirin.",
+Li jor guhertoya heyî tê dîtîn.
+Guherandinên te li jêr tên nîşandan.
+Divê tu wan bikî yek.
+Heke niha tomar bikî, '''bi tenê''' nivîsara qutiya jor wê bê tomarkirin.",
 'yourtext' => 'Nivîsara te',
 'storedversion' => 'Versiyona qeydkirî',
 'editingold' => "'''Hişyarî: Tu li ser guhertoyeke kevn a vê rûpelê dixebitî.
 Heke tu qeyd bikî, hemû guhertinên piştî vê revîzyonê winda dibin.
 '''",
-'yourdiff' => 'Ciyawazî',
-'copyrightwarning' => "Hişyarî: Hemû tevkariyên {{SITENAME}} di bin $2 de tên belav kirin (ji bo hûragahiyan li $1 binêre). Eger tu nexwazî ku nivîsên te bê dilrehmî bên guherandin û li gora keyfa herkesî bên belavkirin, li vir neweşîne.<br />
-Tu soz didî ku te ev bi xwe nivîsand an jî ji çavkaniyekê azad an geliyane ''(public domain)'' girt.
-'''BERHEMÊN MAFÊN WAN PARASTΠ(©) BÊ DESTÛR NEWEŞÎNE!'''",
+'yourdiff' => 'Cudahî',
+'copyrightwarning' => "Hemû tevkariyên {{SITENAME}} di bin $2 de tên belav kirin (ji bo hûragahiyan li $1 binêre).
+Eger tu nexwazî ku nivîsên te bê dilrehmî bên guherandin û li gora keyfa herkesî bên belavkirin, li vir neweşîne.<br />
+Tu soz didî ku te ev bi xwe nivîsand an jî ji çavkaniyekê azad an geliyane (''public domain'') girt.
+'''Berhemên mafên wan parastî bê destûr neweşîne!'''",
 'protectedpagewarning' => "'''Hişyarî:  Ev rûpel tê parastin. Bi tenê bikarhênerên ku xwediyên mafên \"koordînatoriyê\" ne, dikarin vê rûpelê biguherînin.'''",
-'templatesused' => 'Şablon di van rûpelan da tê bikaranîn',
-'templatesusedpreview' => 'Şablon yê di vê pêşdîtinê da tên bikaranîn:',
-'templatesusedsection' => 'Şablon yê di vê perçê da tên bikaranîn:',
+'semiprotectedpagewarning' => "'''Hişyarî:''' Ev rûpel tê parastin, lewma bes bikarhênerên tomarkirî dikarin vê biguherînin.
+Guhertina herî dawî bi referansa li jêr hatiye piştrastkirin:",
+'templatesused' => 'Şablon di van rûpelan de tê bikaranîn',
+'templatesusedpreview' => 'Şablonên ku di vê pêşdîtinê de tên bikaranîn:',
+'templatesusedsection' => 'Şablonên ku di vê parçeyê de tên bikaranîn:',
 'template-protected' => '(tê parastin)',
 'template-semiprotected' => '(nîv-parastî)',
 'hiddencategories' => 'Ev rûpel endamê{{PLURAL:$1|1 hidden category|$1 hidden categories}} ye:',
@@ -676,7 +692,7 @@ Tu soz didî ku te ev bi xwe nivîsand an jî ji çavkaniyekê azad an geliyane
 Zanibe ku nuhçêkirinê vê rûpelê hêja ye ya na.
 Înformasyon li ser jêbirinê vê rûpelê li vir e:",
 'moveddeleted-notice' => 'Ev rûpel hatiye jêbirin.
-The deletion and move log for the page are provided below for reference.',
+Sedema jêbirina rûpelê bi referansa li jêr hatiye piştrastkirin.',
 'log-fulllog' => 'Tevahiya wê bibîne',
 'edit-conflict' => 'Têkçûna guherandinan.',
 'edit-no-change' => 'Guherandina te nehate hesibandin, ji ber ku guherandinên nivîsê tune bûn.',
@@ -684,9 +700,9 @@ The deletion and move log for the page are provided below for reference.',
 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-success' => 'Ev guherandin dikare were şûndekirin. Ji kerema xwe ferqa piştî tomarkirinê bibîne, bê ka tu dixwazî vê guhertoyê tomar bikî an na. Ger te şaşîtiyek kir, ji kerema xwe derkeve.',
+'undo-failure' => 'Ev guhertin ji ber guherandinên piştî wê re nikare were şûndekirin.',
+'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',
@@ -702,13 +718,13 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'revisionasof' => 'Guhertoya $1',
 'revision-info' => 'Guhertoya $1 ya ji aliyê $2 ve',
 'previousrevision' => '←Guhertoya kevintir',
-'nextrevision' => 'Guhertoya nûtir→',
+'nextrevision' => 'Guhertoya nûtir →',
 'currentrevisionlink' => 'Guhertoya niha nîşan bide',
-'cur' => 'ferq',
+'cur' => 'cudahî',
 'next' => 'pêş',
 'last' => 'berê',
-'page_first' => 'yekemîn',
-'page_last' => 'paşîn',
+'page_first' => 'ya pêşîn',
+'page_last' => 'ya paşîn',
 'histlegend' => 'Rênîşan: (cudahî) = cudahiya nav vê û versiyona niha,
 (berê) = cudahiya nav vê û ya berî vê, B = guhertina biçûk',
 'history-fieldset-title' => 'Li dîrokê bigere',
@@ -767,8 +783,8 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'revertmerge' => 'Veqetîne',
 
 # Diffs
-'history-title' => 'Dîroka versyonên "$1"',
-'difference' => '(Ciyawaziya nav guhertoyan)',
+'history-title' => 'Dîroka guhertoyên "$1"',
+'difference-title' => 'Cudahiya di navbera guhertoyên "$1" de',
 'difference-multipage' => '(Cudahî di navbera rûpelan de)',
 'lineno' => 'Rêz $1:',
 'compareselectedversions' => 'Guhertoyan bide ber hev',
@@ -779,24 +795,26 @@ Sedema qedexekirina $3 ev e: ''$2''",
 # Search results
 'searchresults' => 'Encamên lêgerînê',
 'searchresults-title' => 'Encamên lêgerrînê bo "$1"',
-'searchresulttext' => 'Ji bo zêdetir agahî der barê lêgerînê di {{SITENAME}} de, binêre [[{{MediaWiki:Helppage}}|Searching {{SITENAME}}]].',
+'searchresulttext' => 'Ji bo zêdetir agahî der barê lêgerînê di {{SITENAME}} de, binêre [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Te daxwaza "[[:$1]]" kir. ([[Special:Prefixindex/$1|hemî rûpelên bi "$1" dest pê dikin]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|hemî rûpelên ku bi "$1" ve hatine girêdan]])',
 'searchsubtitleinvalid' => "Tu li '''$1''' geriyayî",
 'titlematches' => 'Dîtinên di sernivîsên gotaran de',
 'notitlematches' => 'Di nav sernivîsan de nehat dîtin.',
 'textmatches' => 'Dîtinên di nivîsara rûpelan de',
-'notextmatches' => 'Di nivîsarê de nehat dîtin.',
+'notextmatches' => 'Di nav sernivîsan de nehat dîtin.',
 'prevn' => '{{PLURAL:$1|$1}} paş',
 'nextn' => '{{PLURAL:$1|$1}} pêş',
 'prevn-title' => '{{PLURAL:$1|result|Encamên}} pêştir $1',
 'nextn-title' => '$1 {{PLURAL:$1|encama|encamên}} pêştir',
+'shown-title' => 'Li her rûpelê $1 {{PLURAL:$1|encam|encaman}} nîşan bide',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Vebijartinên lêgerrînê',
+'searchmenu-exists' => "'''Rûpeleke bi navê \"[[:\$1]]\" li ser vê wîkiyê heye.'''",
 'searchmenu-new' => 'Rûpela "[[:$1]]" li ser vê derê çêke!',
 'searchhelp-url' => 'Help:Alîkarî',
 'searchprofile-articles' => 'Rûpelên naverokê',
 'searchprofile-project' => 'Rûpelên alîkariyê û projeyê',
-'searchprofile-images' => 'Multimedia',
+'searchprofile-images' => 'Multîmedya',
 'searchprofile-everything' => 'Her tişt',
 'searchprofile-advanced' => 'Pêşketî',
 'searchprofile-articles-tooltip' => 'Di $1 da lêbigere',
@@ -804,7 +822,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'searchprofile-images-tooltip' => 'Li pelan bigere',
 'search-result-size' => '$1 ({{PLURAL:$2|peyvek|$2 peyv}})',
 'search-result-score' => 'Lêhatin: $1%',
-'search-redirect' => '(redirect $1)',
+'search-redirect' => '(beralîkirin $1)',
 'search-section' => '(beş $1)',
 'search-suggest' => 'Gelo mebesta te ev bû: $1',
 'search-interwiki-caption' => 'Projeyên hevçeng',
@@ -817,10 +835,11 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'searchall' => 'hemû',
 'showingresults' => "{{PLURAL:$1|Encamek|'''$1''' encam}}, bi #'''$2''' dest pê dike.",
 'showingresultsnum' => "{{PLURAL:$3|'''1'''|'''$3'''}} encam, bi #<b>$2</b> dest pê dike.",
+'showingresultsheader' => "{{PLURAL:$5|Encam '''$1''' ên '''$3'''|Encam '''$1 - $2''' ên '''$3'''}} ji bo '''$4'''",
 'search-nonefound' => 'Ti rûpelên wek ya daxwazkirî nînin.',
 'powersearch' => 'Lê bigere',
 'powersearch-legend' => 'Lê bigere',
-'powersearch-ns' => "Di namespace'an da lêbigere:",
+'powersearch-ns' => 'Di valahiya navan de lêbigere:',
 'powersearch-redir' => "Lîsteya redirect'an",
 'powersearch-field' => 'Bigere li',
 'powersearch-togglelabel' => 'Kontrol bike:',
@@ -837,7 +856,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'preferences' => 'Tercîhên min',
 'mypreferences' => 'Tercihên min',
 'prefs-edits' => 'Hejmarê guherandinan:',
-'prefsnologin' => 'Xwe qeyd nekir',
+'prefsnologin' => 'Xwe tomar nekir',
 'prefsnologintext' => 'Tu gireke xwe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} qeydbikê]</span> ji bo guherandina tercihên bikarhêneran.',
 'changepassword' => 'Şîfreyê biguherîne',
 'prefs-skin' => 'Pêste',
@@ -856,7 +875,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'prefs-setemail' => 'Navnîşana E-nameyê binivîse',
 'prefs-email' => 'Vebijarkên E-nameyê',
 'prefs-rendering' => 'Rû',
-'saveprefs' => 'Tercîhan qeyd bike',
+'saveprefs' => 'Tercîhan tomar bike',
 'resetprefs' => 'Guhertinên netomarkirî şûnde vegerîne',
 'prefs-editing' => 'Guherandin',
 'rows' => 'Rêz',
@@ -890,12 +909,12 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'uid' => 'Nasnameya bikarhêner:',
 'prefs-memberingroups' => 'Endamê/a {{PLURAL:$1|komê|koman}}:',
 'prefs-registration' => 'Dema xweqeydkirinê:',
-'yourrealname' => 'Navê te yê rastî*',
+'yourrealname' => 'Navê te yê rast:',
 'yourlanguage' => 'Ziman',
 'yourvariant' => 'Cuda:',
 'yournick' => 'Bernavkê nû (ji bo îmzeyê):',
 'badsig' => 'Îmzeya ne derbasdar! Li HTML binêre ka sedema şaşbûnê çiye.',
-'badsiglength' => 'Navî te zêde dirêj e; ew gireke di bin {{PLURAL:$1|nîÅ\9fanekê|nîÅ\9fanan}} da be.',
+'badsiglength' => 'Navê te zêde dirêj e; pêwîst e di bin {{PLURAL:$1|nîÅ\9fanekê|nîÅ\9fanan}} de be.',
 'yourgender' => 'Zayend:',
 'gender-male' => 'Nêr',
 'gender-female' => 'Mê',
@@ -926,7 +945,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'userrights-user-editname' => 'Navekî bikarhêneriyê binivîse:',
 'editusergroup' => 'Komên bikarhêneran biguherîne',
 'editinguser' => "Mafên bikarhêner '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]]) tên guhertin",
-'userrights-editusergroup' => 'Grûpên bikarhêneran biguherîne',
+'userrights-editusergroup' => 'Komên bikarhêneran biguherîne',
 'saveusergroups' => 'Komên bikarhêneran tomar bike',
 'userrights-groupsmember' => 'Endamê/a:',
 'userrights-groups-help' => 'Tu dikarî komên bikarhêneran ên vê/vî bikarhênerê/î biguherînî:
@@ -938,25 +957,25 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'userrights-nodatabase' => 'Danegeh $1 nîne an ne ya vir e.',
 'userrights-nologin' => 'Ji bo guherandina mafên bikarhêneran, divê tu bi hesabê rêveber [[Special:UserLogin|têkevî]].',
 'userrights-notallowed' => "Account'a te mafê xwe tune ye ji bo guherandina mafên bikarhêneran.",
-'userrights-changeable-col' => 'Komên tu dikarî biguherînî',
-'userrights-unchangeable-col' => 'Komên tu nikarî biguherînî',
+'userrights-changeable-col' => 'Komên ku tu dikarî biguherînî',
+'userrights-unchangeable-col' => 'Komên ku tu nikarî biguherînî',
 
 # Groups
 'group' => 'Kom',
 'group-user' => 'Bikarhêner',
 'group-bot' => 'Bot',
 'group-sysop' => 'Rêveber',
-'group-bureaucrat' => 'Bûrokrat',
+'group-bureaucrat' => 'Burokrat',
 'group-all' => '(hemû)',
 
 'group-user-member' => 'Bikarhêner',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'rêveber',
-'group-bureaucrat-member' => 'Burokrat',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|rêveber}}',
+'group-bureaucrat-member' => '{{GENDER:$1|burokrat}}',
 
 'grouppage-user' => '{{ns:project}}:Bikarhêner',
 'grouppage-bot' => '{{ns:project}}:Bot',
-'grouppage-sysop' => '{{ns:project}}:Admînistrator',
+'grouppage-sysop' => '{{ns:project}}:Rêveber',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrat',
 
 # Rights
@@ -975,23 +994,23 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'right-sendemail' => 'Ji bikarhênerên di re e-name bişîne',
 
 # User rights log
-'rightslog' => 'Reşahîya mafên bikarhêneran',
-'rightslogtext' => 'Ev reşahîyek ji bo guherandinên mafên bikarhêneran e.',
+'rightslog' => 'guhertina mafê bikarhêneriyê',
+'rightslogtext' => 'Ev guhertineke ji bo mafên bikarhêneriyê ye.',
 'rightslogentry' => 'grûpa bikarhêneran ji bo $1 ji $2 guherande $3',
 'rightsnone' => '(tune)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => 'Vê rûpelê bixwîne',
+'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',
 'action-move-subpages' => 'vê rûpelê û binrûpelên wê bigerîne',
-'action-movefile' => "vê data'yê bigerîne",
-'action-upload' => "vê data'yê barbike",
-'action-delete' => 'vê rûpelê jêbibe',
+'action-movefile' => 'vê daneyê bigerîne',
+'action-upload' => 'vê daneyê bar bike',
+'action-delete' => 'vê rûpelê jê bibe',
 'action-deleterevision' => 'Vê revîzyonê je bibe',
 'action-deletedhistory' => 'dîroka vê rûpelê jêbirî bibîne',
 'action-browsearchive' => 'li rûpelên jêbirî bigere',
@@ -1002,17 +1021,18 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|guherandinek|guherandin}}',
 'recentchanges' => 'Guherandinên dawî',
 'recentchanges-legend' => 'Vebijarkên guherandinên dawî',
+'recentchanges-summary' => 'Guhertinên herî dawî yên wîkiyê li ser vê rûpelê bişopîne.',
 'recentchanges-label-minor' => 'Ev guhertineka biçûk e',
 'rcnote' => "Jêr {{PLURAL:$1|guherandinek|'''$1''' guherandinên dawî}} di {{PLURAL:$2|rojê|'''$2''' rojên dawî}} de ji $3 şûnde tên nîşan dan.",
-'rclistfrom' => 'an jî guherandinên ji $1 şûnda nîşan bide.',
-'rcshowhideminor' => 'guherandinên biçûk $1',
-'rcshowhidebots' => "bot'an $1",
-'rcshowhideliu' => 'bikarhênerên qeydkirî $1',
-'rcshowhideanons' => 'bikarhênerên neqeydkirî (IP) $1',
+'rclistfrom' => 'Guherandinên ji $1 şûnde nîşan bide',
+'rcshowhideminor' => 'Guherandinên biçûk $1',
+'rcshowhidebots' => "Bot'an $1",
+'rcshowhideliu' => 'Bikarhênerên qeydkirî $1',
+'rcshowhideanons' => 'Bikarhênerên neqeydkirî (IP) $1',
 'rcshowhidepatr' => '$1 guherandinên kontrolkirî',
-'rcshowhidemine' => 'guherandinên min $1',
+'rcshowhidemine' => 'Guherandinên min $1',
 'rclinks' => '$1 guherandinên di $2 rojên dawî de nîşan bide<br />$3',
-'diff' => 'ciyawazî',
+'diff' => 'cudahî',
 'hist' => 'dîrok',
 'hide' => 'veşêre',
 'show' => 'nîşan bide',
@@ -1021,12 +1041,12 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|bikarhênerek|$1 bikarhêner}} vê rûpelê {{PLURAL:$1|dişopîne|dişopînin}}.]',
 'rc_categories_any' => 'Hîç',
-'newsectionsummary' => '/* $1 */ beşeka nuh',
+'newsectionsummary' => '/* $1 */ beşeke nû',
 'rc-enhanced-expand' => 'Kitûmatan nîşan bide (JavaScript pêdivî ye)',
 'rc-enhanced-hide' => 'Kitûmatan veşêre',
 
 # Recent changes linked
-'recentchangeslinked' => 'Guherandinên peywend',
+'recentchangeslinked' => 'Guherandinên têkilîdar',
 'recentchangeslinked-feed' => 'Guherandinên peywend',
 'recentchangeslinked-toolbox' => 'Guherandinên peywend',
 'recentchangeslinked-summary' => "Ev rûpela taybetî guherandinên dawî ji rûpelên lînkkirî nîşandide. Ew rûpel yê di lîsteya te ya şopandinê da ne bi nivîsa '''estûr''' tên nîşandan.",
@@ -1034,9 +1054,9 @@ Sedema qedexekirina $3 ev e: ''$2''",
 
 # Upload
 'upload' => 'Wêneyekî barbike',
-'uploadbtn' => 'Wêneyê (ya tiştekî din ya mêdya) barbike',
+'uploadbtn' => 'Wêneyekî bar bike',
 'reuploaddesc' => 'Barkirinê biskîne û dîsa here rûpela barkirinê.',
-'uploadnologin' => 'Xwe qeyd nekir',
+'uploadnologin' => 'Xwe tomar nekir',
 'uploadnologintext' => 'Ji bo barkirina wêneyan divê ku tu [[Special:UserLogin|têkevî]].',
 'uploaderror' => 'Çewtiya barkirinê',
 'upload-recreate-warning' => "'''Agahdarî: Peleke bi vî navî hatiye jêbirin an jî raguhestin.'''",
@@ -1058,10 +1078,11 @@ anjî ji bo file'ên dengî '''<nowiki>[[</nowiki>{{ns:media}}:File.ogg<nowiki>]
 'filestatus' => 'Rewşa telîfê:',
 'filesource' => 'Çavkanî:',
 'uploadedfiles' => 'Pelên barkirî',
-'ignorewarning' => 'Hişyarê qebûl neke û dosyayê qeyd bike.',
+'ignorewarning' => 'Guh nede hişyariyê û pelê qeyd bike',
 'ignorewarnings' => 'Guh nede hişyariyan',
 'minlength1' => "Navên data'yan bi kêmani gireke tîpek be.",
-'illegalfilename' => 'Navî datayê "$1" ne tê qebûlkirin ji ber ku tişt tê da hatine nivîsandin yê qedexe ne. Xêra xwe navî datayê biguherîne û carekî din barbike.',
+'illegalfilename' => 'Navê daneya "$1" nayê qebûlkirin ji ber ku tê de tiştên qedexekirî hatine nivîsandin.
+Ji kerema xwe re navê daneyê biguherîne û carekî din bar bike!',
 'badfilename' => 'Navê vî wêneyî hat guherandin û bû "$1".',
 'filetype-badmime' => 'Data bi formata MIME yê "$1" nameşin werin barkirin.',
 'filetype-unwanted-type' => '\'\'\'".$1"\'\'\' formatekî nexastî ye.
@@ -1084,10 +1105,10 @@ Xêra xwe navekî din bibîne.",
 'file-thumbnail-no' => "Navî vê datayê bi '''<tt>$1</tt>''' destpêdike. Ev dibêje ku ev wêneyekî çûçik e ''(thumbnail)''. Xêra xwe seke, ku belkî versyonekî mezin yê vê wêneyê li cem te heye û wê wêneyê mezintir di bin navî orîjînal da barbike.",
 'fileexists-forbidden' => 'Medyayek bi vê navî heye; xêra xwe şonda here û vê medyayê bi navekî din barbike.
 [[File:$1|thumb|center|$1]]',
-'uploadwarning' => 'Hişyara barkirinê',
+'uploadwarning' => 'Hişyariya barkirinê',
 'savefile' => 'Dosyayê tomar bike',
-'uploadedimage' => '"$1" barkirî',
-'overwroteimage' => 'versyonekî nuh ji "[[$1]]" hate barkirin',
+'uploadedimage' => '"[[$1]]" hate barkirin',
+'overwroteimage' => 'versiyonekî nû ya "[[$1]]" hate barkirin',
 'uploaddisabled' => 'Barkirin hatîye qedexekirin',
 'uploaddisabledtext' => "Barkirinê data'yan  hatiye qedexekirin.",
 'uploadvirus' => "Di vê data'yê da vîrûsek heye! Înformasyon: $1",
@@ -1109,26 +1130,26 @@ Xêra xwe navekî din bibîne.",
 'upload-unknown-size' => 'Mezinahiya nayê zanîn',
 
 'license' => 'Lîsans:',
-'license-header' => 'Lîsens:',
-'nolicense' => 'ya hilbijartî nîne',
+'license-header' => 'Lîsans',
+'nolicense' => 'Ya hilbijartî nîne',
 'license-nopreview' => 'Pêşdîtin ne gengaz e.',
 
 # Special:ListFiles
-'listfiles_search_for' => 'Li navî wêneyê bigere:',
+'listfiles_search_for' => 'Li navê wêneyî bigere:',
 'imgfile' => 'dosye',
-'listfiles' => 'Listeya wêneyan',
+'listfiles' => 'Lîsteya wêneyan',
 'listfiles_date' => 'Dem',
 'listfiles_name' => 'Nav',
 'listfiles_user' => 'Bikarhêner',
 'listfiles_size' => 'Mezinbûn',
 'listfiles_description' => 'Danasîn',
-'listfiles_count' => 'Versiyon',
+'listfiles_count' => 'Guherto',
 
 # File description page
 'file-anchor-link' => 'Wêne',
-'filehist' => 'Dîroka datayê',
+'filehist' => 'Dîroka daneyê',
 'filehist-help' => 'Ji bo dîtina guhertoya wê demê bişkoka dîrokê bitikîne.',
-'filehist-deleteall' => 'giştika jêbibe',
+'filehist-deleteall' => 'hemûyan jê bibe',
 'filehist-deleteone' => 'jê bibe',
 'filehist-revert' => 'şûnde vegerîne',
 'filehist-current' => 'niha',
@@ -1143,7 +1164,9 @@ Xêra xwe navekî din bibîne.",
 'linkstoimage' => 'Di van rûpelan de lînkek ji vî wêneyî re heye:',
 'nolinkstoimage' => 'Rûpelekî ku ji vî wêneyî re girêdankê çêdike nîne.',
 'linkstoimage-redirect' => '$1 (beralîkirina pelê) $2',
-'uploadnewversion-linktext' => 'Versyonekî nû yê vê datayê barbike',
+'sharedupload-desc-here' => 'Ev pel ji $1 û dibe ku ji aliyê projeyên din ve jî hatibe bikaranîn.
+Agahdariya li ser [$2 rûpela danasîna pelê] li jêr tê nîşandan.',
+'uploadnewversion-linktext' => 'Versiyoneke nû ya vê daneyê barbike',
 'shared-repo-from' => 'ji $1',
 
 # File reversion
@@ -1198,7 +1221,7 @@ Xêra xwe navekî din bibîne.",
 'statistics-header-hooks' => 'Statîstîkên din',
 'statistics-articles' => 'Rûpelên naverokê',
 'statistics-pages' => 'Rûpel',
-'statistics-pages-desc' => 'Hemû rûpelên di vê wîkiyê de, bi hemû rûpelên nîqaş, beralîkirin, hwd.',
+'statistics-pages-desc' => 'Hemû rûpelên di vê wîkiyê de, bi hemû rûpelên gotûbêj, beralîkirin, hwd.',
 'statistics-files' => 'Wêneyên barkirî',
 'statistics-views-total' => 'Hemû nîşandan',
 'statistics-users' => '[[Special:ListUsers|Bikarhênerên tomarkirî]]',
@@ -1213,7 +1236,7 @@ Xêra xwe navekî din bibîne.",
 
 'brokenredirects' => 'Beralîkirinên xerabûyî',
 'brokenredirects-edit' => 'biguherîne',
-'brokenredirects-delete' => 'jêbibe',
+'brokenredirects-delete' => 'jê bibe',
 
 'withoutinterwiki' => 'Rûpelên bê girêdanên ziman',
 'withoutinterwiki-legend' => 'Pêşbendik',
@@ -1231,13 +1254,13 @@ Xêra xwe navekî din bibîne.",
 'uncategorizedcategories' => 'Kategoriyên bê kategorî',
 'uncategorizedimages' => 'Wêneyên bê kategorî',
 'uncategorizedtemplates' => 'Şablonên bê kategorî',
-'unusedcategories' => 'Kategoriyên ku nayên bi kar anîn',
-'unusedimages' => 'Wêneyên ku nayên bi kar anîn',
+'unusedcategories' => 'Kategoriyên ku nayên bikaranîn',
+'unusedimages' => 'Wêneyên ku nayên bikaranîn',
 'popularpages' => 'Rûpelên populer',
-'wantedcategories' => 'Kategoriyên tên xwestin',
+'wantedcategories' => 'Kategoriyên ku tên xwestin',
 'wantedpages' => 'Rûpelên ku tên xwestin',
 'wantedfiles' => 'Wêneyên ku tên xwestin',
-'wantedtemplates' => 'Şablonên tên xwestin',
+'wantedtemplates' => 'Şablonên ku tên xwestin',
 'mostlinked' => 'Rûpelên bi bêhtirîn girêdan',
 'mostlinkedcategories' => 'Kategoriyên bi bêhtirîn girêdan',
 'mostcategories' => 'Rûpelên bi pir kategorî',
@@ -1257,13 +1280,13 @@ Xêra xwe navekî din bibîne.",
 'movethispage' => 'Vê rûpelê bigerîne',
 'notargettitle' => 'Hedef tune',
 'pager-newer-n' => '{{PLURAL:$1|nûtir 1|nûtir $1}}',
-'pager-older-n' => '{{PLURAL:$1|kevintirin 1|kevintirin $1}}',
+'pager-older-n' => '{{PLURAL:$1|kevintir 1|kevintir $1}}',
 
 # Book sources
 'booksources' => 'Çavkaniyên pirtûkan',
 'booksources-search-legend' => 'Li pirtûkan bigere',
 'booksources-go' => 'Here',
-'booksources-text' => 'Li vir listek ji lînkên rûpelên, yê pirtûkên nuh ya kevin difiroşin, heye. Hên jî li vir tu dikarî înformasyonan li ser wan pirtûkan tê derxê.',
+'booksources-text' => 'Li vir listek ji lînkên rûpelên, yê pirtûkên nû ya kevin difiroşin, heye. Hên jî li vir tu dikarî înformasyonan li ser wan pirtûkan tê derxê.',
 
 # Special:Log
 'specialloguserlabel' => 'Bikarhêner:',
@@ -1301,14 +1324,14 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'special-categories-sort-abc' => 'li gorî alfabeyê rêzkirî ye',
 
 # Special:DeletedContributions
-'deletedcontributions' => 'Guherandinên bikarhênerekî yê jêbirî',
-'deletedcontributions-title' => 'Guherandinên bikarhênerekî yê jêbirî',
+'deletedcontributions' => 'Beşdariyên bikarhênerekî yê jêbirî',
+'deletedcontributions-title' => 'Guherandinên bikarhêner yê jêbirî',
 'sp-deletedcontributions-contribs' => 'tevkarî',
 
 # Special:LinkSearch
 'linksearch' => 'Girêdanên derveyî',
 'linksearch-ns' => 'Valahiya nav:',
-'linksearch-ok' => 'Lêbigere',
+'linksearch-ok' => 'Lêgerîn',
 
 # Special:ListUsers
 'listusers-submit' => 'Nîşan bide',
@@ -1328,6 +1351,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'listgrouprights' => 'Mafên koma bikarhêner',
 'listgrouprights-group' => 'Kom',
 'listgrouprights-rights' => 'Maf',
+'listgrouprights-helppage' => 'Help:Mafên koman',
 'listgrouprights-members' => '(lîsteya endaman)',
 'listgrouprights-addgroup-all' => 'Hemû koman tevlî bike',
 'listgrouprights-removegroup-all' => 'Hemû koman jê bibe',
@@ -1335,7 +1359,7 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 # E-mail user
 'mailnologin' => 'Navnîşanê neşîne',
 'mailnologintext' => 'Te gireke xwe [[Special:UserLogin|qeydbikê]] û adrêsa e-nameyan di [[Special:Preferences|tercihên xwe]] da nivîsandibe ji bo şandina e-nameyan ji bikarhênerên din ra.',
-'emailuser' => 'Ji vê/î bikarhênerê/î re e-name bişîne',
+'emailuser' => 'Ji bikarhêner re e-name bişîne',
 'emailpage' => 'E-name bikarhêner',
 'defemailsubject' => '{{SITENAME}} e-name',
 'noemailtitle' => 'Navnîşana e-name tune',
@@ -1357,17 +1381,16 @@ Li [[Special:WantedCategories|kategoriyên xwestî]] binêre.',
 'watchlist' => 'Lîsteya min a şopandinê',
 'mywatchlist' => 'Lîsteya min a şopandinê',
 'nowatchlist' => 'Tiştek di lîsteya te ya şopandinê de tune ye.',
-'watchlistanontext' => 'Ji bo sekirinê ya xeyrandinê lîsteya te ya şopandinê tu gireke xwe $1.',
-'watchnologin' => 'Te xwe qeyd nekiriye.',
-'watchnologintext' => 'Ji bo xeyrandinê lîsteya te ya şopandinê tu gireke xwe [[Special:UserLogin|qedy kiribe]].',
+'watchlistanontext' => 'Ji  kerema xwe ji bo dîtin an jî sererastkirina lîsteya te ya şopandinê xwe $1.',
+'watchnologin' => 'Te xwe tomar nekiriye',
+'watchnologintext' => 'Ji bo dîtin an jî sererastkirina lîsteya te ya şopandinê divê tu xwe [[Special:Userlogin|tomar bikî]].',
 '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 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.
-
+'addedwatchtext' => "Rûpela \"[[:\$1]]\" çû ser [[{{ns:special}}:Watchlist|lîsteya te ya şopandinê]].
+Li dahatû de her guhertoyek li wê rûpelê û rûpela guftûgo ya wê were kirin li vir tê nîşandan.
+Li rûpela [[{{ns:special}}:Recentchanges|Guherandinên dawî]] jî ji bo hêsan dîtina wê, ew rûpel bi '''Nivîsa stûr''' tê nîşandan.
 
-<p>Her dem tu bixwazî ew rûpel li nav lîsteya te ya şopandinê derbikî, li ser wê rûpelê, klîk bike \"êdî neşopîne\".</p>",
+Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li ser wê rûpelê, \"êdî neşopîne\" bitikîne.",
 'removewatch' => 'Ji lîsteya şopandinê derxe',
 'removedwatchtext' => 'Rûpela "[[:$1]]" ji lîsteya te ya şopandinê hate jêbirin.',
 'watch' => 'Bişopîne',
@@ -1376,17 +1399,17 @@ 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.",
+'wlheader-showupdated' => "* Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
 'watchlistcontains' => 'Di lîsteya şopandina te de {{PLURAL:$1|rûpelek heye|$1 rûpel hene}}.',
 'wlnote' => "Niha {{PLURAL:$1|xeyrandinê|'''$1''' xeyrandinên}} dawî yê {{PLURAL:$2|seetê|'''$2''' seetên}} dawî {{PLURAL:$1|tê|tên}} dîtin.",
-'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 (di sih rojên dawî de)',
+'wlshowlast' => 'Guhertinên berî $1 saetan, $2 rojan, ya $3 nîşan bide',
 'watchlist-options' => 'Vebijarkên lîsteya şopandinê',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Bişopîne...',
-'unwatching' => 'Neşopîne...',
+'unwatching' => 'Neşopîne',
 
 'enotif_reset' => 'Hemû rûpelan wek lêsekirî nîşanbide',
 'enotif_newpagetext' => 'Ev rûpeleke nû ye.',
@@ -1420,25 +1443,24 @@ Paşagahîdan û alîkaraya din:
 # Delete
 'deletepage' => 'Rûpelê jê bibe',
 'confirm' => 'Pesend bike',
-'excontent' => "Naveroka berê: '$1'",
-'excontentauthor' => "Naverroka vê rûpelê ev bû: '$1' (û tenya bikarhêner '$2' bû)",
-'exbeforeblank' => "Nawerok berî betal kirinê ew bû: '$1'
-Naverroka berî betalkirinê ev bû:'$1'",
+'excontent' => 'Naveroka berê: "$1"',
+'excontentauthor' => "Naveroka vê rûpelê ev bû: '$1' (û tenya bikarhêner '$2' bû)",
+'exbeforeblank' => 'Naverok berî betalkirinê ev bû: "$1"',
 'exblank' => 'rûpel vala bû',
 'delete-confirm' => 'Jêbirina "$1"',
-'delete-legend' => 'Jêbirin',
+'delete-legend' => 'Jê bibe',
 'historywarning' => "'''Hişyarî''': Dîrokeke vê rûpela tu dixwazî jê bibî heye:",
 'confirmdeletetext' => 'Tu kê niha rûpelekê bi tev dîroka wê jêbibê. Xêra xwe zanibe tu kê niha çi bikê û zanibe, çi di wîkîyê da yê bibe. Hên jî seke, ku ev jêbirina bi [[{{MediaWiki:Policy-url}}|mafên wîkîyê]] ra dimeşin ya na.',
 'actioncomplete' => 'Çalakî pêk hat',
 'actionfailed' => 'Çalakî têkçû',
 'deletedtext' => '"$1" hat jêbirin. Ji bo qeyda rûpelên ku di dema nêzîk de hatin jêbirin binêre $2.',
-'dellogpage' => 'Jêbirina rûpelê',
+'dellogpage' => 'jêbirina rûpelê',
 'dellogpagetext' => 'Li jêr lîsteyek ji jêbirinên dawî heye.',
 'deletionlog' => 'jêbirina rûpelê',
 'reverted' => 'Hate şondabirin berve verzyonekî berê',
 'deletecomment' => 'Sedem:',
-'deleteotherreason' => 'Sedemekî din:',
-'deletereasonotherlist' => 'Sedemekî din',
+'deleteotherreason' => 'Sedema din:',
+'deletereasonotherlist' => 'Sedema din',
 'deletereason-dropdown' => '*Sedemên jêbirinê
 ** Daxwaziya xwedî
 ** Pirsgirêka lîsansê
@@ -1448,13 +1470,14 @@ Naverroka berî betalkirinê ev bû:'$1'",
 'delete-warning-toobig' => "Dîroka vê rûpelê pir mezin e, zêdetirî $1 guherandin. Jêbirina van rûpelan dikarin şaşbûnan di database'ê {{SITENAME}} da çêkin; zandibe tu çi dikê!",
 
 # Rollback
-'rollback_short' => 'Bizivirîne pêş',
-'rollbacklink' => 'bizivirîne pêş',
-'cantrollback' => "Guharto naye vegerandin; bikarhêrê dawî, '''tenya''' nivîskarê wê rûpelê ye.",
+'rollback_short' => 'bizîvirîne pêş',
+'rollbacklink' => 'bizîvirîne pêş',
+'cantrollback' => 'Guherto naye vegerandin;
+bikarhênerê dawî, tenya nivîskarê vê 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; kesekî din ew rûpel zîvirandiye an guherandiye.
 
-Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
+Guhertoya 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.',
@@ -1474,7 +1497,7 @@ Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
 'protect-default' => 'Destûrê bide hemû bikarhêneran',
 'protect-level-autoconfirmed' => 'Bikarhênerên neqeydkirî astengbike',
 'protect-level-sysop' => 'Tenê rêveber (admîn)',
-'protect-expiring' => 'heta rojê $1 (UTC)',
+'protect-expiring' => 'heta roja $1 (UTC)',
 'protect-expiring-local' => 'di $1 de dema wê xilas dibe',
 'protect-othertime' => 'Demeke din:',
 'protect-othertime-op' => 'dema din',
@@ -1497,13 +1520,14 @@ Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
 'restriction-level-autoconfirmed' => 'nîv-parastî',
 
 # Undelete
-'undelete' => 'Li rûpelên jêbirî seke',
+'undelete' => 'Li rûpelên jêbirî binêre',
 'undeletepage' => 'Rûpelên jêbirî bibîne û dîsa çêke',
-'viewdeletedpage' => 'Rûpelên vemirandî seke',
+'viewdeletedpage' => 'Li rûpelên jêbirî binêre',
 'undeletepagetext' => 'Rûpelên jêr hatine jêbirin, lê ew hên di arşîvê da ne û dikarin dîsa werin çêkirin. Ev arşîva piştî demekê tê pakkirin.',
 'undeleteextrahelp' => "Ji bo dîsaçêkirina vê rûpelê, li checkbox'an nexe û li '''''Dîsa çêke''''' klîk bike. Eger tu naxazî ku hemû verzyon dîsa werin çêkirin, li checkbox'ên wan verzyonan xe, yê tu dixazî dîsa çêkê û paşê li '''''Dîsa çêke'''' klîk bike. Eger tu li '''''Biskine''''' xê, hemû checkbox û cihê sedemê yê werin valakirin.",
 'undeleterevisions' => '$1 {{PLURAL:$1|rêvîzyonek çû|rêvîzyon çûn}} arşîv',
-'undeletehistory' => 'Eger tu vê rûpelê dîsa çêkê, hemû rêvîzyon ê dîsa di dîrokê da werin çêkirin. Eger rûpeleka nuh ji dema jêbirinê da hatîye çêkirin, ew rêvîzyon ê werin pêşî diroka nuh.',
+'undeletehistory' => 'Ger tu vê rûpelê dîsa çêkî, hemû guherto wê dîsa di dîrokê de werin çêkirin.
+Ger rûpeleke nû di dema jêbirinê de hatibe çêkirin, ew guherto wê were pêşiya diroka nû.',
 'undelete-revision' => 'Rêvîzyonên jêbirî yê $1 (di $2) ji $3:',
 'undelete-nodiff' => 'Guhertoyên berê nehatin dîtin.',
 'undeletebtn' => 'Dîsa çêke!',
@@ -1512,21 +1536,21 @@ Guhartoya dawî bi [[User:$3|$3]] ([[User talk:$3|guftûgo]]).',
 'undeletereset' => 'Nû bike',
 'undeleteinvert' => 'Hilbijartinê şûnde vegerîne',
 'undeletecomment' => 'Sedem:',
-'undeletedrevisions' => '{{PLURAL:$1|Verzyonek dîsa hate|$1 verzyon dîsa hatin}} çêkirin',
-'undeletedrevisions-files' => '{{PLURAL:$1|Verzyonek|$1 verzyon}} û {{PLURAL:$2|medyayek hate|$2 medya hatin}} çêkirin',
+'undeletedrevisions' => '{{PLURAL:$1|Versiyonek dîsa hate|$1 versiyon dîsa hatin}} çêkirin',
+'undeletedrevisions-files' => '{{PLURAL:$1|Versiyonek|$1 versiyon}} û {{PLURAL:$2|medyayek hate|$2 medya hatin}} çêkirin',
 'undeletedfiles' => '{{PLURAL:$1|Medyayek hate|$1 medya hatin}} çêkirin',
 'undeletedpage' => "'''$1 dîsa hate çêkirin'''
 
-Ji bo jêbirinan û çêkirinên nuh ra, xêra xwe di [[Special:Log/delete|reşahîya jêbirinê]] da seke.",
-'undelete-header' => '[[Special:Log/delete|Reşahîya jêbirinê]] bibîne ji bo rûpelên jêbirî.',
-'undelete-search-box' => 'Rûpelên jêbirî lêbigere',
-'undelete-search-prefix' => 'Rûpela pêşe min ke ê bi vê destpêdîkin:',
-'undelete-search-submit' => 'Lêbigere',
+Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/delete|Jêbirina têketinê]] binêre.",
+'undelete-header' => 'Ji bo rûpelên dawî hatine jêbirin, li [[Special:Log/delete|Jêbirina têketinê]] binêre.',
+'undelete-search-box' => 'Li rûpelên jêbirî bigere',
+'undelete-search-prefix' => 'Rûpela nîşandanê bi vê destpêdike:',
+'undelete-search-submit' => 'Lêgerîn',
 'undelete-show-file-submit' => 'Erê',
 
 # Namespace form on various pages
 'namespace' => 'Valahiya nav:',
-'invert' => 'Hilbijardinê pêçewane bike',
+'invert' => 'Hemûyan bibîne',
 'namespace_association' => 'Navê têkilîdar',
 'blanknamespace' => '(Sereke)',
 
@@ -1536,8 +1560,8 @@ Ji bo jêbirinan û çêkirinên nuh ra, xêra xwe di [[Special:Log/delete|reşa
 'mycontris' => 'Beşdariyên min',
 'contribsub2' => 'Ji bo $1 ($2)',
 'uctop' => '(ser)',
-'month' => 'Ji mehê (û zûtir):',
-'year' => 'Ji salê (û zûtir):',
+'month' => 'Ji meha (û zûtir):',
+'year' => 'Ji sala (û zûtir):',
 
 'sp-contributions-newbies' => 'Tenê beşdariyên bikarhênerên nû nîşan bide',
 'sp-contributions-newbies-sub' => 'Ji bikarhênerên nû re',
@@ -1546,22 +1570,22 @@ Ji bo jêbirinan û çêkirinên nuh ra, xêra xwe di [[Special:Log/delete|reşa
 'sp-contributions-deleted' => 'Guherandinên bikarhênerekî yê jêbirî',
 'sp-contributions-uploads' => 'yên barkirî',
 'sp-contributions-logs' => 'têketin',
-'sp-contributions-talk' => 'nîqaş',
+'sp-contributions-talk' => 'gotûbêj',
 'sp-contributions-userrights' => 'Îdarekirina mafên bikarhêneran',
 'sp-contributions-search' => 'Li beşdariyan bigere',
-'sp-contributions-username' => 'Adresê IP ya navî bikarhêner:',
-'sp-contributions-submit' => 'Lêbigere',
+'sp-contributions-username' => "Adresa IP'yê yan navê bikarhêner:",
+'sp-contributions-submit' => 'Lêgerîn',
 
 # What links here
 'whatlinkshere' => 'Girêdanên li ser vê rûpelê',
 'whatlinkshere-title' => 'Rûpelan, yê berve $1 tên',
 'whatlinkshere-page' => 'Rûpel:',
-'linkshere' => "Ev rûpel tên ser vê rûpelê '''„[[:$1]]“''':",
-'nolinkshere' => "Ne ji rûpelekê lînk tên ser '''„[[:$1]]“'''.",
+'linkshere' => "Ev rûpel tên ser vê rûpelê '''[[:$1]]''':",
+'nolinkshere' => "Ne ji rûpelekê lînk tên ser '''[[:$1]]'''.",
 'nolinkshere-ns' => "Ne lînkek berve '''[[:$1]]''' di vê namespace'a da tê.",
 'isredirect' => 'rûpelê beralî bike',
 'istemplate' => 'tê bikaranîn',
-'isimage' => 'lînka wêneyê',
+'isimage' => 'girêdana wêneyî',
 'whatlinkshere-prev' => '{{PLURAL:$1|yê|$1 yên}} berê',
 'whatlinkshere-next' => '{{PLURAL:$1|yê|$1 yên}} din',
 'whatlinkshere-links' => '← girêdan',
@@ -1583,7 +1607,7 @@ Sedemekê binivîse!',
 'ipadressorusername' => "adresê IP'yekê ya navekî bikarhênerekî",
 'ipbexpiry' => 'Dem:',
 'ipbreason' => 'Sedem',
-'ipbreasonotherlist' => 'Sedemekî din',
+'ipbreasonotherlist' => 'Sedemeke din',
 'ipbreason-dropdown' => '*Sedemên astengkirinê
 ** vandalîzm
 ** agahiya şaş kire gotarekê
@@ -1595,17 +1619,17 @@ Sedemekê binivîse!',
 ** navekî ku nayê pejirandin',
 'ipbcreateaccount' => 'Çêkirina hesaban qedexe bike',
 'ipbemailban' => 'Ji bo şandina e-nameyan qedexe bike.',
-'ipbenableautoblock' => "Otomatîk IP'yên niha û yên nuh yê vê bikarhênerê astengbike.",
+'ipbenableautoblock' => "Otomatîk IP'yên niha û yên nû yê vê bikarhênerê astengbike.",
 'ipbsubmit' => 'Vê bikarhêner asteng bike',
 'ipbother' => 'Demekî din:',
-'ipboptions' => '1 seet:1 hour,2 seet:2 hours,6 seet:6 hours,1 roj:1 day,3 roj:3 days,1 hefte:1 week,2 hefte:2 weeks,1 mihe:1 month,3 mihe:3 months,1 sal:1 year,ji her demê ra:infinite',
+'ipboptions' => '2 saet:2 hours,1 roj:1 day,3 roj:3 days,1 hefte:1 week,2 hefte:2 weeks,1 meh:1 month,3 meh:3 months,6 meh:6 months,1 sal:1 year,ji her demê re:infinite',
 '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',
+'ipbotherreason' => 'Sedemeke din',
+'ipbhidename' => 'Navê bikarhêner / adresê IP ji "pirtûkê" astengkirinê, lîsteya astengkirinên nû û lîsteya bikarhêneran veşêre',
+'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û',
+'blockipsuccesssub' => 'Astengkirin pêkhat',
 'blockipsuccesstext' => '"$1" hat asteng kirin.
 <br />Bibîne [[Special:BlockList|Lîsteya IP\'yan hatî asteng kirin]] ji bo lîsteya blokan.',
 'ipb-edit-dropdown' => 'Sedemên astengkirinê',
@@ -1615,19 +1639,19 @@ Sedemekê binivîse!',
 'ipb-blocklist-contribs' => 'Beşdariyên ji bo $1',
 'unblockip' => "IP'yekê dîsa veke",
 'unblockiptext' => "Nivîsara jêr bikarwîne ji bo qebûlkirina nivîsandinê bikarhênerekî ya IP'yeka berê astengkirî.",
-'ipusubmit' => 'Astengkirina vê adrêsê rake',
+'ipusubmit' => 'Vê astengkirinê rake',
 'unblocked' => '[[User:$1|$1]] niha vê astengkirinê ye',
 'unblocked-id' => '$1 dîsa vê astengkirinê ye',
 'blocklist' => 'Bikarhênerên astengkirî',
 'ipblocklist' => "Listek ji adresên IP'yan û bikarhêneran yê hatine astengkirin",
-'ipblocklist-legend' => 'Bikarhênerekî astengkirî bibîne',
+'ipblocklist-legend' => 'Bikarhênerên astengkirî bibîne',
 'blocklist-userblocks' => 'Astengkirina hesaban veşêre',
 'blocklist-tempblocks' => 'Astengkirinên demkî veşêre',
 'blocklist-rangeblocks' => 'Astengkirinên cur bi cur veşêre',
 'blocklist-by' => 'Astengkirina rêveber',
 'blocklist-params' => 'Parametreyan asteng bike',
 'blocklist-reason' => 'Sedem',
-'ipblocklist-submit' => 'Lêbigere',
+'ipblocklist-submit' => 'Lêgerîn',
 'ipblocklist-localblock' => 'Astengkirina herêmî',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|Astengkirin|Astengkirinên}} din',
 'infiniteblock' => 'ji her demê ra',
@@ -1636,7 +1660,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',
@@ -1644,18 +1668,18 @@ Sedemekê binivîse!',
 'change-blocklink' => 'Astengkirinê biguherîne',
 'contribslink' => 'beşdarî',
 'emaillink' => 'e-name bişîne',
-'autoblocker' => 'Otomatîk hat bestin jiberku IP-ya we û ya "[[User:$1|$1]]" yek in. Sedem: "\'\'\'$2\'\'\'"',
-'blocklogpage' => 'Astengkirina bikarhêner',
-'blocklogentry' => '"[[$1]]" ji bo dema $2 $3 hatîye asteng kirin',
+'autoblocker' => 'Otomatîk hate astengkirin ji ber ku IP\'ya wê û ya "[[User:$1|$1]]" yek in. Sedem: "\'\'$2\'\'"',
+'blocklogpage' => 'Astengkirina têketinê',
+'blocklogentry' => '"[[$1]]" ji bo dema $2, $3 asteng kir',
 'blocklogtext' => "Ev reşahîyek ji astengkirinên û rakirina astengkirinên bikarhêneran ra ye. Adrêsên IP'yan, yê otomatîk hatine astengkirin, nehatine nivîsandin. [[Special:BlockList|Lîsteya IP'yên astengkirî]] bibîne ji bo dîtina astengkirinên IP'yan.",
 'unblocklogentry' => 'astenga "$1" betalkir',
 'block-log-flags-anononly' => 'bes bikarhênerên neqeydkirî',
 '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_expiry_invalid' => 'Dem ne serast e.',
 'ipb_already_blocked' => '"$1" berê hatîye astengkirin',
 'ipb-needreblock' => '$1 berê hatiye astengkirin. Tu dixwazî eyaran biguherînî?',
 'ipb_cant_unblock' => "Şaşbûn: ID'ya astengkirinê $1 nehate dîtin. Astengkirinê xwe niha belkî hatîye rakirin.",
@@ -1676,16 +1700,16 @@ Sedemekê binivîse!',
 # Move page
 'move-page' => '$1 bigerîne',
 'move-page-legend' => 'Vê rûpelê bigerîne',
-'movepagetalktext' => "Rûpela '''guftûgoyê''' vê rûpelê wê were, eger hebe, gerandin. Lê ev tişta nameşe, eger
+'movepagetalktext' => "Rûpela '''gotûbêjê''' vê rûpelê wê were, eger hebe, gerandin. Lê ev tişta nameşe, eger
 
-*berê guftûgoyek bi wê navê hebe ya
+*berê gotûbêjek bi wî navî hebe ya
 *tu tiştekî jêr hilbijêrê.
 
 Eger ev mişkla çêbû, tu gireke vê rûpelê bi xwe bigerînê.
 
-Xêra xwe navî nuh û sedemê navgerandinê binivisîne.",
+Xêra xwe navê nû û sedemê navgerandinê binivisîne.",
 'movearticle' => 'Rûpelê bigerîne',
-'movenologin' => 'Xwe qeyd nekir',
+'movenologin' => 'Xwe tomar nekir',
 'movenologintext' => 'Tu dive bikarhênereke qeydkirî bî û [[Special:UserLogin|werî nav sîstemê]]
 da bikarî navê wê rûpelê biguherînî.',
 'movenotallowed' => 'Mafên te bo guherandina navên gotaran tune ye.',
@@ -1702,11 +1726,11 @@ 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' => "Heke gengaz be, rûpela '''gotûbêj'''a wê jî bigerîne.",
 '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.',
-'movelogpage' => 'Nav guherandin',
+'movelogpage' => 'guhertina nav',
 'movelogpagetext' => 'Li jêr lîsteyek ji rûpelan ku navê wan hatiye guherandin heye.',
 'movereason' => 'Sedem',
 'revertmove' => 'şûnde vegerîne',
@@ -1725,13 +1749,14 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'export-download' => 'Weka dosyeyê qeyd bike',
 
 # Namespace 8 related
-'allmessages' => 'Hemû mesajên sîstemê',
+'allmessages' => 'Hemû peyamên sîstemê',
 'allmessagesname' => 'Nav',
 'allmessagescurrent' => 'Nivîsa niha',
-'allmessagestext' => 'Ev lîsteya hemû mesajên di namespace a MediaWiki: de ye.',
+'allmessagestext' => 'Lîsteya hemû peyamên MediaWikiyê.',
+'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' nikare were bikaranîn ji ber ku '''\$wgUseDatabaseMessages''' hatiye jêbirin.",
 'allmessages-filter-legend' => 'Parzûn',
 'allmessages-filter-unmodified' => 'Neguhertî',
-'allmessages-filter-all' => 'hemû',
+'allmessages-filter-all' => 'Hemû',
 'allmessages-filter-modified' => 'Guhertî',
 'allmessages-language' => 'Ziman',
 'allmessages-filter-submit' => 'Gotar',
@@ -1759,16 +1784,17 @@ 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' => 'Gotûbêja min',
 '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-pt-logout' => 'Derkeve',
+'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ê.',
-'tooltip-ca-history' => 'Versyonên berê yên vê rûpelê.',
+'tooltip-ca-viewsource' => 'Ev rûpel tê parastin.
+Tu dikarî tenê li çavkaniyê binêrî.',
+'tooltip-ca-history' => 'Guhertoyên berê yên vê rûpelê',
 'tooltip-ca-protect' => 'Vê rûpelê biparêze',
 'tooltip-ca-unprotect' => 'Parastina vê rûpelê rake',
 'tooltip-ca-delete' => 'Vê rûpelê jê bibe',
@@ -1778,14 +1804,14 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'tooltip-search' => 'Li {{SITENAME}} bigere',
 'tooltip-search-go' => 'Here rûpeleke tev bi vî navî, heke hebe',
 'tooltip-search-fulltext' => 'Di nav rûpelan de li vê nivîsê bigerre',
-'tooltip-p-logo' => 'Biçe Destpêkê',
+'tooltip-p-logo' => 'Here Destpêkê',
 'tooltip-n-mainpage' => 'Biçe Destpêkê',
-'tooltip-n-mainpage-description' => 'Biçe Destpêkê',
+'tooltip-n-mainpage-description' => 'Here Destpêkê',
 'tooltip-n-portal' => 'Agahdarî li ser {{SITENAME}}, tu dikarî çi bikî, tu dikarî çi li ku bîbînî',
 'tooltip-n-recentchanges' => "Lîsteya guherandinên dawî di vê Wîkî'yê da.",
-'tooltip-n-randompage' => 'Rûpelekî helkeft biwêşîne',
+'tooltip-n-randompage' => 'Rûpeleka ketober bar bike',
 'tooltip-n-help' => 'Bersivên ji bo pirsên te.',
-'tooltip-t-whatlinkshere' => 'Lîsteya hemû rûpelên ku ji vê re grêdidin.',
+'tooltip-t-whatlinkshere' => 'Lîsteya hemû rûpelên ku pê ve girêdayî ne.',
 'tooltip-t-recentchangeslinked' => 'Recent changes in pages linking to this page',
 'tooltip-feed-rss' => "RSS feed'ên ji bo rûpelê",
 'tooltip-feed-atom' => "Atom feed'ên ji bo vê rûpelê",
@@ -1795,18 +1821,18 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'tooltip-t-specialpages' => 'Lîsteya hemû rûpelên taybetî',
 'tooltip-t-print' => 'Versiyona çapkirinê ya vê rûpelê',
 'tooltip-ca-nstab-main' => 'Li rûpela naverokê binêre',
-'tooltip-ca-nstab-user' => 'Rûpela bikarhênerê/î temaşe bike',
+'tooltip-ca-nstab-user' => 'Rûpela bikarhêner bibîne',
 'tooltip-ca-nstab-special' => 'This is a special page, you can',
 'tooltip-ca-nstab-project' => 'Li rûpelê projektê seke',
 'tooltip-ca-nstab-image' => 'Rûpela dosyeyê bibîne',
-'tooltip-ca-nstab-template' => 'Şablonê nîşanbide',
+'tooltip-ca-nstab-template' => 'Şablonê nîşan bide',
 'tooltip-ca-nstab-help' => 'Rûpela alîkariyê bibîne',
 'tooltip-ca-nstab-category' => 'Li rûpelê kategorîyê seke',
 'tooltip-minoredit' => 'Vê guherandinê weka biçûk îşaret bike',
 'tooltip-save' => 'Guherandinên xwe tomarbike',
 'tooltip-preview' => 'Guherandinên xwe bibîne, berî ku tu wî qeyd bikî!',
 'tooltip-diff' => 'Guherandinên ku te di nivîsê de kirîyî nîşan bide',
-'tooltip-compareselectedversions' => 'Cudatiyên guhartoyên hilbijartî yên vê rûpelê bibîne.',
+'tooltip-compareselectedversions' => 'Cudatiyên guhertoyên hilbijartî yên vê rûpelê bibîne.',
 'tooltip-watch' => 'Vê rûpelê têke nav lîsteya te ya şopandinê',
 'tooltip-upload' => 'Barkirinê destpêke',
 
@@ -1818,13 +1844,14 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 
 # Attribution
 'anonymous' => 'Bikarhênera/ê nediyarkirî ya/yê {{SITENAME}}',
-'siteuser' => 'Bikarhênera/ê $1 a/ê {{SITENAME}}',
+'siteuser' => 'Bikarhênera $1 ê {{SITENAME}}',
 'others' => 'ên din',
 'siteusers' => 'Bikarhênerên $1 yên {{SITENAME}}',
 
 # Spam protection
 'spamprotectiontitle' => 'Parastina spam',
-'spamprotectiontext' => 'Ew rûpela yê tu dixast tomarbikê hate astengkirin ji ber ku parastina spam. Ew çêbû ji ber ku lînkekî derva di vê rûpelê da ye.',
+'spamprotectiontext' => 'Rûpela ku tu dixwazî tomar bikî ji ber parastina spamê hate astengkirin.
+Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'spamprotectionmatch' => 'Ev nivîsa parastinê spam vêxist: $1',
 
 # Info page
@@ -1832,14 +1859,14 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'pageinfo-header-watchlist' => 'Lîsteya şopandinê',
 'pageinfo-header-views' => 'Dîtin',
 'pageinfo-subjectpage' => 'Rûpel',
-'pageinfo-talkpage' => 'Rûpela nîqaşê',
+'pageinfo-talkpage' => 'Rûpela gotûbêjê',
 'pageinfo-watchers' => 'Hejmara kesên dişopînin',
 'pageinfo-edits' => 'Hejmara guherandinan',
 'pageinfo-views' => 'Hejmara dîtinê',
 
 # Patrolling
-'markaspatrolleddiff' => 'Wek serrastkirî nîşanbide',
-'markaspatrolledtext' => 'Vê rûpelê wek serrastkirî nîşanbide',
+'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
+'markaspatrolledtext' => 'Vê rûpelê wek serrastkirî nîşan bide',
 'markedaspatrolled' => 'Wek serrastkirî tê nîşandan',
 'markedaspatrolledtext' => 'Guherandina rûpelê wek serrastkirî tê nîşandan.',
 
@@ -1848,21 +1875,21 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 
 # Image deletion
 'deletedrevision' => 'Guhertoya berê $1 hate jêbirin.',
-'filedelete-missing' => 'Data\'yê "$1" nikane were jêbirin, ji ber ku ew tune.',
-'filedelete-current-unregistered' => 'Datayê "$1" di sistêmê da tune.',
+'filedelete-missing' => 'Dane "$1" nikare were jêbirin, ji ber ku ew tune ye.',
+'filedelete-current-unregistered' => 'Daneya "$1" li sîstemê tune ye.',
 
 # Browsing diffs
-'previousdiff' => '← Ciyawaziya pêştir',
-'nextdiff' => 'Ciyawaziya paştir →',
+'previousdiff' => '← Cudahiya pêştir',
+'nextdiff' => 'Cudahiya paştir →',
 
 # Media information
 'thumbsize' => 'Mezinahiya wêne:',
 'widthheight' => '$1 x $2',
 'widthheightpage' => '$1 × $2, $3 rûpel',
-'file-info' => 'mezinbûnê data: $1, MIME-typ: $2',
+'file-info' => 'mezinbûna daneyê: $1, MIME type: $2',
 'file-info-size' => '$1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4',
 'file-nohires' => 'Versyonekî jê mezintir tune.',
-'svg-long-desc' => "Data'ya SVG, mezinbûna rast: $1 × $2 pixel; mezinbûna data'yê: $3",
+'svg-long-desc' => 'Daneya SVG, mezinbûna rast: $1 × $2 pixel; mezinbûna daneyê: $3',
 'show-big-image' => 'Mezînbûn',
 
 # Special:NewFiles
@@ -1872,17 +1899,17 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'newimages-legend' => 'Parzûn',
 'showhidebots' => '($1 bot)',
 'noimages' => 'Ne tiştek tê dîtin.',
-'ilsubmit' => 'Lêbigere',
+'ilsubmit' => 'Lêgerîn',
 'bydate' => 'li gor dîrokê',
-'sp-newimages-showfrom' => "Data'yên nuh ji dema $1, saet $2 da bibîne",
+'sp-newimages-showfrom' => 'Daneyên nû ji dema $1, saet $2 ve bibîne',
 
 # Variants for Kurdish language
-'variantname-ku-arab' => 'tîpên erebî',
-'variantname-ku-latn' => 'tîpên latînî',
+'variantname-ku-arab' => 'Tîpên erebî',
+'variantname-ku-latn' => 'Tîpên latînî',
 'variantname-ku' => 'disable',
 
 # Metadata
-'metadata' => "Data'yên meta",
+'metadata' => 'Daneyên meta',
 'metadata-expand' => 'Detayên dirêj nîşan bide',
 'metadata-collapse' => 'Detayên dirêj veşêre',
 
@@ -1890,7 +1917,7 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'exif-imagewidth' => 'Panbûn',
 'exif-imagelength' => 'Dirêjbûn',
 'exif-jpeginterchangeformatlength' => "Byte'ên daneya JPEG",
-'exif-imagedescription' => 'Navî wêneyê',
+'exif-imagedescription' => 'Navê wêne',
 'exif-model' => 'Modela kamerayê',
 'exif-artist' => 'Nûser',
 'exif-pixelydimension' => 'Firehiya wêne',
@@ -1907,6 +1934,7 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 'exif-languagecode' => 'Ziman',
 'exif-iimcategory' => 'Kategorî',
 'exif-label' => 'Etîket',
+'exif-disclaimer' => 'Ferexetname',
 
 'exif-unknowndate' => 'Dîroka nayê zanîn',
 
@@ -1966,14 +1994,14 @@ Rûpela "[[:$1]]" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'hemû',
 'namespacesall' => 'Hemû',
-'monthsall' => 'giştik',
+'monthsall' => 'hemû',
 'limitall' => 'hemû',
 
 # E-mail address confirmation
 'confirmemail' => 'Adrêsa e-nameyan nasbike',
-'confirmemail_noemail' => 'Te e-mail-adressê xwe di [[Special:Preferences|tercihên xwe da]] nenivîsandîye.',
+'confirmemail_noemail' => 'Te e-mail-adressê xwe di [[Special:Preferences|tercihên xwe da]] nenivîsandiye.',
 'confirmemail_success' => 'E-Mail adrêsa te hate naskirin. Tu niha dikarî xwe qeydbikê û kêfkê.',
-'confirmemail_loggedin' => 'Adrêsa te yê E-Mail hate qebûlkirin.',
+'confirmemail_loggedin' => 'Navnîşana te ya E-Nameyê hate qebûlkirin.',
 'confirmemail_body' => 'Kesek, dibê tu, bi IP adressê $1, xwe li {{SITENAME}} bi vê navnîşana e-name tomar kir ("$2") .
 
 Eger ev rast qeydkirinê te ye û di dixwazî bikaranîna e-nama ji te ra çêbibe li {{SITENAME}}, li vê lînkê bitikîne:
@@ -1987,14 +2015,14 @@ Lê eger ev *ne* tu bû, li lînkê netikîne. Ev e-nameya di rojê $4 da netê
 'scarytranscludetoolong' => '[URL zêde dirêj e; bibore]',
 
 # Delete conflict
-'deletedwhileediting' => 'Hîşyar: Piştî te guherandinê xwe dest pê kir ev rûpela hate jêbirin!',
-'confirmrecreate' => "Bikarhêner [[User:$1|$1]] ([[User talk:$1|nîqaş]]) vê rûpelê jêbir, piştî te destpêkir bi guherandinê. Sedemê jêbirinê ev bû:
+'deletedwhileediting' => "'''Hişyarî:''' Piştî te dest bi guherandinê kir ev rûpel hate jêbirin!",
+'confirmrecreate' => "Piştî te dest bi guherandinê kir, bikarhêner [[User:$1|$1]] ([[User talk:$1|gotûbêj]]) ev rûpel jê bir. Sedema jêbirinê ev bû:
 : ''$2''
-Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
+Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'recreate' => 'Dîsa çêke',
 
 # action=purge
-'confirm_purge_button' => 'Temam',
+'confirm_purge_button' => 'Baş e',
 'confirm-purge-top' => 'Bîra vê rûpelê jêbîbe ?',
 
 # Multipage image navigation
@@ -2004,33 +2032,33 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'imgmultigoto' => 'Here rûpela $1',
 
 # Table pager
-'table_pager_next' => 'Rûpelê din',
-'table_pager_prev' => 'Rûpelê berî',
-'table_pager_first' => 'Rûpelê yekemîn',
-'table_pager_last' => 'Rûpelê dawî',
+'table_pager_next' => 'Rûpela pêş',
+'table_pager_prev' => 'Rûpela berî',
+'table_pager_first' => 'Rûpela pêşîn',
+'table_pager_last' => 'Rûpela dawî',
 'table_pager_limit_submit' => 'Biçe',
 
 # Auto-summaries
 'autosumm-blank' => 'Rûpel hate vala kirin',
 'autosumm-replace' => "'$1' ket şûna rûpelê.",
 'autoredircomment' => 'ji bo [[$1]] hate beralîkirin',
-'autosumm-new' => 'Rûpela nû: $1',
+'autosumm-new' => 'Rûpela nû: "$1"',
 
 # Live preview
 'livepreview-loading' => 'Tê…',
 'livepreview-ready' => 'Bar dibe… Amade ye!',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Xeyrandin yê piştî $1 sanîyan hatine çêkirin belkî netên wêşendan.',
+'lag-warn-normal' => 'Sererastkirinên piştî $1 çirkeyan hatine çêkirin belkî neyên weşandin.',
 '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',
 'watchlistedit-normal-submit' => 'Gotaran jê bibe',
-'watchlistedit-normal-done' => '{{PLURAL:$1|1 gotar hate|$1 gotaran hatin}} jêbirin ji lîsteya te yê şopandinê:',
+'watchlistedit-normal-done' => '{{PLURAL:$1|1 gotar hate|$1 gotar hatin}} jêbirin ji lîsteya te yê şopandinê:',
 'watchlistedit-raw-titles' => 'Sernav:',
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 gotar hate|$1 gotar hatin}} jêbirin:',
 
@@ -2038,7 +2066,7 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'watchlisttools-edit' => 'Lîsteya şopandinê bibîne û biguherîne',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|nîqaş]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|gotûbêj]])',
 
 # Special:Version
 'version' => 'Versiyon',
@@ -2047,7 +2075,8 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'version-version' => ' (Verzîyon $1)',
 'version-license' => 'Destûr',
 'version-software-product' => 'Berhem',
-'version-software-version' => 'Versiyon',
+'version-software-version' => 'Guherto',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath-page' => 'Wêne:',
@@ -2055,7 +2084,7 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Navê dosyeyê:',
-'fileduplicatesearch-submit' => 'Lêbigere',
+'fileduplicatesearch-submit' => 'Lê bigere',
 
 # Special:SpecialPages
 'specialpages' => 'Rûpelên taybet',
@@ -2064,7 +2093,7 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 * <strong class="mw-specialpagerestricted">Rûpelên taybetî ji bikarhêneran bi mafên zêdetir ra</strong>',
 'specialpages-group-other' => 'Rûpelên taybetî yên din',
 'specialpages-group-login' => 'Têkeve',
-'specialpages-group-changes' => 'Guherandinên dawî û reşahîyan',
+'specialpages-group-changes' => 'Guherandinên dawî û têketin',
 'specialpages-group-media' => 'Nameyên medyayan û barkirinan',
 'specialpages-group-users' => 'Bikarhêner û maf',
 'specialpages-group-pages' => 'Lîstên rûpelan',
@@ -2097,7 +2126,12 @@ Xêra xwe zanibe ku tu bi rastî dixwazê vê rûpelê dîsa çêkê",
 'htmlform-selectorother-other' => 'Yên din',
 
 # New logging system
+'logentry-delete-delete' => '$1 rûpela $3 jê bir',
+'revdelete-content-hid' => 'naverok veşartî ye',
 'revdelete-uname-hid' => 'navê bikarhêneriyê yê veşartî',
+'logentry-move-move' => '$1 navê $3 weke $4 guherand',
+'logentry-move-move-noredirect' => '$1 navê $3 guherand û kir $4',
+'logentry-move-move_redir' => '$1 navê $3 guherand û kir $4',
 'logentry-newusers-newusers' => '$1 hesabekî bikarhêneriyê çêkir',
 'logentry-newusers-create' => '$1 hesabekî bikarhêneriyê çêkir',
 'newuserlog-byemail' => 'şîfre bi e-nameyê hate şandin',
index e8e755a..9e17935 100644 (file)
 
 $fallback = 'ru';
 
+$namespaceNames = array(
+       NS_SPECIAL          => 'Отсасян',
+       NS_TALK             => 'Сёрнитанiн',
+       NS_USER             => 'Пырысь',
+       NS_USER_TALK        => 'Пырыськӧд_сёрнитанiн',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Файл_донъялӧм',
+       NS_MEDIAWIKI        => 'МедиаВики',
+       NS_MEDIAWIKI_TALK   => 'МедиаВики_донъялӧм',
+       NS_TEMPLATE         => 'Шаблон',
+       NS_TEMPLATE_TALK    => 'Шаблон_донъялӧм',
+);
+
+$namespaceAliases = array(
+       // Backward compat. Fallbacks from 'ru'.
+       'Медиа'                              => NS_MEDIA,
+       'Служебная'                          => NS_SPECIAL,
+       'Обсуждение'                         => NS_TALK,
+       'Участник'                           => NS_USER,
+       'Обсуждение_участника'               => NS_USER_TALK,
+       'Обсуждение_{{GRAMMAR:genitive|$1}}' => NS_PROJECT_TALK,
+       'Файл'                               => NS_FILE,
+       'Обсуждение_файла'                   => NS_FILE_TALK,
+       'Обсуждение_MediaWiki'               => NS_MEDIAWIKI_TALK,
+       'Шаблон'                             => NS_TEMPLATE,
+       'Обсуждение_шаблона'                 => NS_TEMPLATE_TALK,
+       'Справка'                            => NS_HELP,
+       'Обсуждение_справки'                 => NS_HELP_TALK,
+       'Категория'                          => NS_CATEGORY,
+       'Обсуждение_категории'               => NS_CATEGORY_TALK
+);
+
 $messages = array(
 # Dates
 'sunday'        => 'вежалун',
index 61c8513..9b8b641 100644 (file)
@@ -60,31 +60,51 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Allmessages'               => array( 'OllMessajow' ),
-       'Allpages'                  => array( 'OllFolennow' ),
-       'Ancientpages'              => array( 'FolennowCoth' ),
+       'Allpages'                  => array( 'OllFolednow' ),
+       'Ancientpages'              => array( 'FolednowKoth' ),
+       'Badtitle'                  => array( 'TitelDrog' ),
+       'Blankpage'                 => array( 'FolenWag' ),
        'Block'                     => array( 'Lettya' ),
-       'Categories'                => array( 'Classys' ),
+       'Booksources'               => array( 'PednfentynyowLyver' ),
+       'Categories'                => array( 'Klassys' ),
+       'ChangeEmail'               => array( 'ChanjyaEbost' ),
+       'ChangePassword'            => array( 'ChanjyaGerTremena' ),
        'Contributions'             => array( 'Kevrohow' ),
+       'CreateAccount'             => array( 'FormyaAkont' ),
+       'DeletedContributions'      => array( 'KevrohowDiles' ),
+       'EditWatchlist'             => array( 'ChanjyaRolGolyas' ),
        'Emailuser'                 => array( 'EbostyaDevnydhyer' ),
-       'Export'                    => array( 'Esperthy' ),
-       'Import'                    => array( 'Ymperthy' ),
+       'Export'                    => array( 'Esperthi' ),
+       'Import'                    => array( 'Ymperthi' ),
+       'MIMEsearch'                => array( 'HwilansMIME' ),
        'Movepage'                  => array( 'GwayaFolen' ),
        'Mycontributions'           => array( 'OwHevrohow' ),
        'Mypage'                    => array( 'OwFolen' ),
        'Mytalk'                    => array( 'OwHows' ),
-       'Newpages'                  => array( 'FolennowNowyth' ),
-       'Preferences'               => array( 'Dewisyansow' ),
+       'Myuploads'                 => array( 'OwUghkargansow' ),
+       'Newimages'                 => array( 'RestrednowNowyth' ),
+       'Newpages'                  => array( 'FolednowNowyth' ),
+       'PasswordReset'             => array( 'DassetyaGerTremena' ),
+       'Preferences'               => array( 'Dowisyansow' ),
        'Randompage'                => array( 'FolenDreJons' ),
        'Recentchanges'             => array( 'Chanjyow_a-dhiwedhes' ),
-       'Search'                    => array( 'Whilans' ),
-       'Specialpages'              => array( 'FolennowArbennek' ),
-       'Upload'                    => array( 'Ughcarga' ),
+       'Search'                    => array( 'Hwilas' ),
+       'Specialpages'              => array( 'FolednowArbednek' ),
+       'Uncategorizedcategories'   => array( 'KlassysHebKlass' ),
+       'Uncategorizedimages'       => array( 'RestrednowHebKlass' ),
+       'Uncategorizedpages'        => array( 'FolednowHebKlass' ),
+       'Uncategorizedtemplates'    => array( 'SkantlynsHebKlass' ),
+       'Upload'                    => array( 'Ughkarga' ),
+       'Userlogin'                 => array( 'Omgelmi' ),
+       'Userlogout'                => array( 'Digelmi' ),
+       'Userrights'                => array( 'GwiryowDevnydhyer' ),
        'Version'                   => array( 'Versyon' ),
-       'Wantedcategories'          => array( 'ClassysWhansus' ),
-       'Wantedfiles'               => array( 'RestrennowWhansus' ),
-       'Wantedpages'               => array( 'FolennowWhansus' ),
-       'Wantedtemplates'           => array( 'ScantlynsWhansus' ),
+       'Wantedcategories'          => array( 'KlassysHwansus' ),
+       'Wantedfiles'               => array( 'RestrednowHwansus' ),
+       'Wantedpages'               => array( 'FolednowHwansus' ),
+       'Wantedtemplates'           => array( 'SkantlynsHwansus' ),
        'Watchlist'                 => array( 'Rol_golyas' ),
+       'Whatlinkshere'             => array( 'OwKevrednaObma' ),
 );
 
 $messages = array(
@@ -491,7 +511,6 @@ Alhwedh: '''({{int:cur}})''' = dyffrans gans an amendyans diwettha, '''({{int:la
 
 # Diffs
 'history-title' => 'Istori an folen "$1"',
-'difference' => '(Dyffrans ynter an amendyansow)',
 'difference-multipage' => '(Dyffrans ynter an folednow)',
 'lineno' => 'Linen $1:',
 'compareselectedversions' => 'Keheveli an amendyansow dowisyes',
@@ -638,7 +657,7 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'nchanges' => '$1 {{PLURAL:$1|chanj|chanj}}',
 'recentchanges' => 'Chanjyow a-dhiwedhes',
 'recentchanges-legend' => 'Etholyow an chanjyow a-dhiwedhes',
-'recentchangestext' => "War'n folen-ma y hellowgh hwi sewya an chanjyow diwettha eus gwres dhe'n wiki.",
+'recentchanges-summary' => "Sewya an chanjyow diwettha eus dhe'n wiki war'n folen-ma.",
 'recentchanges-feed-description' => "Sewya an chanjyow diwettha dhe'n wiki e'n feed-ma.",
 'recentchanges-label-newpage' => 'An chanj-ma a wrug gwruthyl folen nowyth',
 'recentchanges-label-minor' => 'Chanj bian yw hebma',
index f920971..726c146 100644 (file)
@@ -9,9 +9,26 @@
  *
  * @author AidaBishkek
  * @author Aidabishkek
+ * @author Amire80
+ * @author Chorobek
+ * @author Muratjumashev
  * @author Ztimur
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Медиа',
+       NS_SPECIAL          => 'Атайын',
+       NS_TALK             => 'Баарлашуу',
+       NS_USER             => 'Колдонуучу',
+       NS_USER_TALK        => 'Колдонуучунун_баарлашуулары',
+       NS_PROJECT_TALK     => '$1_баарлашуу',
+       NS_FILE             => 'Файл',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_TEMPLATE         => 'Калып',
+       NS_HELP             => 'Жардам',
+       NS_CATEGORY         => 'Категория',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Шилтемелердин алдын сызуу:',
@@ -20,15 +37,15 @@ $messages = array(
 'tog-usenewrc' => 'Акыркы өзгөрүүлөрдүн жакшыртылган тизмесин колдонуу (JavaScript талап кылынат)',
 'tog-numberheadings' => 'Башсаптарды автоматтык түрдө номурлоо',
 'tog-showtoolbar' => 'Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)',
-'tog-editondblclick' => 'Ð\9aоÑ\88 Ñ\87еÑ\80Ñ\82Ò¯Ò¯ Ð¼ÐµÐ½ÐµÐ½ баракты оңдоо (JavaScript талап кылынат)',
+'tog-editondblclick' => 'Эки Ð±Ð°Ñ\81Ñ\8bп баракты оңдоо (JavaScript талап кылынат)',
 'tog-editsection' => 'Ар бир секция үчүн «оңдоо» шилтемеси',
 
-'underline-always' => 'Ð\90Ñ\80 Ð´айым',
+'underline-always' => 'Ð\94айым',
 'underline-never' => 'Эч качан',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Оңдоо талаасынын арибинин стили:',
-'editfont-default' => 'Ð\90Ñ\80алагÑ\8bÑ\87Ñ\82Ñ\8bн Ð°Ñ\80ибин ÐºÐ»Ð´Ð¾Ð½Ñ\83Ñ\83',
+'editfont-default' => 'СеÑ\80епÑ\87инин Ð°Ñ\80ибин ÐºÐ¾Ð»Ð´Ð¾Ð½',
 'editfont-monospace' => 'Моножазы ариби',
 
 # Dates
@@ -86,7 +103,7 @@ $messages = array(
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категориялар}}',
 'category_header' => '"$1" категориядагы барактар',
-'subcategories' => 'Ð\9aөмөк категориялар',
+'subcategories' => 'Ð\98Ñ\87ки категориялар',
 'category-media-header' => '"$1" категориясындагы медиафайлдар',
 'category-empty' => "''Бул категорияда азыр эч бир барак же файл жок.''",
 'hidden-categories' => '{{PLURAL:$1|Жашырылган категория|Жашырылган категориялар}}',
@@ -99,8 +116,8 @@ $messages = array(
 'category-file-count-limited' => 'Бул категорияда {{PLURAL:$1|$1|$1|$1}} файл бар.',
 'listingcontinuesabbrev' => 'уланд.',
 'index-category' => 'Индекстелген барактар',
-'noindex-category' => 'Иреттелбеген барактар',
-'broken-file-category' => 'Файлдарга туура эмес шилтемелүү барактар',
+'noindex-category' => 'Индекстелбеген барактар',
+'broken-file-category' => 'Файлдарга туура эмес шилтеме берген барактар',
 
 'about' => 'Тууралуу',
 'article' => 'Макала',
@@ -108,14 +125,14 @@ $messages = array(
 'cancel' => 'Жокко чыгар',
 'moredotdotdot' => 'Уландысы...',
 'mypage' => 'Барагым',
-'mytalk' => 'Талкуум',
+'mytalk' => 'ТалкÑ\83Ñ\83лаÑ\80Ñ\8bм',
 'anontalk' => 'Бул IP дарек үчүн талкуу',
-'navigation' => 'Багыттоо',
+'navigation' => 'Багыт алуу',
 'and' => '&#32;жана',
 
 # Cologne Blue skin
-'qbfind' => 'Издөө',
-'qbbrowse' => 'Ð\9aаÑ\80оо',
+'qbfind' => 'Изде',
+'qbbrowse' => 'СеÑ\80еп Ñ\81ал',
 'qbedit' => 'Оңдоо',
 'qbpageoptions' => 'Бул барак',
 'qbpageinfo' => 'Контекст',
@@ -135,7 +152,7 @@ $messages = array(
 'vector-view-edit' => 'Оңдо',
 'vector-view-history' => 'Тарыхын кара',
 'vector-view-view' => 'Оку',
-'vector-view-viewsource' => 'Ð\91айкоо',
+'vector-view-viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
 'actions' => 'Аракеттер',
 'namespaces' => 'Аталыш топтому',
 'variants' => 'Варианттар',
@@ -207,8 +224,8 @@ $messages = array(
 'mainpage-description' => 'Башбарак',
 'portal' => 'Жамаат порталы',
 'portal-url' => 'Project:Жамаат порталы',
-'privacy' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83ндÑ\83Ñ\83лÑ\83к Ñ\82аÑ\80Ñ\82иби',
-'privacypage' => 'Project:Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83ндÑ\83Ñ\83лÑ\83к Ñ\82аÑ\80Ñ\82иби',
+'privacy' => 'Ð\9cаалÑ\8bмаÑ\82Ñ\82Ñ\8b ÐºÑ\83пÑ\83Ñ\8f Ñ\81акÑ\82оо Ñ\81аÑ\8fÑ\81аÑ\82Ñ\8b',
+'privacypage' => 'Project:Ð\9cаалÑ\8bмаÑ\82Ñ\82Ñ\8b ÐºÑ\83пÑ\83Ñ\8f Ñ\81акÑ\82оо Ñ\81аÑ\8fÑ\81аÑ\82Ñ\8b',
 
 'retrievedfrom' => '"$1" булагындан алынды',
 'youhavenewmessages' => 'Сизге $1 ($2) бар.',
@@ -233,10 +250,10 @@ $messages = array(
 'nstab-main' => 'Макала',
 'nstab-user' => 'Колдонуучунун барагы',
 'nstab-special' => 'Атайын барак',
-'nstab-project' => 'Долбоор барагы',
+'nstab-project' => 'Долбоордун барагы',
 'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Билдирүү',
-'nstab-template' => 'Ð\9dÑ\83Ñ\81ка',
+'nstab-template' => 'Ð\9aалÑ\8bп',
 'nstab-help' => 'Жардам',
 'nstab-category' => 'Категория',
 
@@ -264,7 +281,7 @@ $messages = array(
 'badtitle' => 'Ыксыз аталыш',
 'badtitletext' => 'Талап кылынган барак аталышы туура эмес, бош, же тилдер-аралык же уики-аралык аталышы туура эмес шилтемеленген.
 Балким аталышта колдонулбай турган бир же андан көп белги камтылган.',
-'viewsource' => 'Ð\91айкоо',
+'viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
 
 # Login and logout pages
 'welcomecreation' => '== Кош келиңиз, $1! ==
@@ -273,21 +290,29 @@ $messages = array(
 'yourname' => 'Колдонуучунун аты',
 'yourpassword' => 'Сырсөз',
 'yourpasswordagain' => 'Сырсөздү кайра жазыңыз',
-'remembermypassword' => 'Ð\91Ñ\83л Ð±Ñ\80аÑ\83зеÑ\80де ÐºÐ°Ñ\82Ñ\82оо Ð¶Ð°Ð·Ñ\83Ñ\83мдÑ\83 Ñ\8dÑ\81Ñ\82е тут (эң көп $1 {{PLURAL:$1|күн|күн}})',
+'remembermypassword' => 'Ð\91Ñ\83л Ð±Ñ\80аÑ\83зеÑ\80де ÐºÐ°Ñ\82Ñ\82оо Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80Ñ\8bмдÑ\8b Ñ\8dÑ\81ке тут (эң көп $1 {{PLURAL:$1|күн|күн}})',
 'yourdomainname' => 'Сиздин домен',
 'login' => 'Кирүү',
 'nav-login-createaccount' => 'Кирүү / Каттоо',
 'loginprompt' => '{{SITENAME}} сайтына кирүү үчүн «cookies» колдонууга уруксатыңыз керек .',
 'userlogin' => 'Кирүү / Каттоо',
+'userloginnocreate' => 'Кирүү',
 'logout' => 'Чыгуу',
 'userlogout' => 'Чыгуу',
+'notloggedin' => 'Сиз системага кире элексиз',
 'nologin' => 'Каттала элексизби? $1.',
 'nologinlink' => 'Каттоону башта',
 'createaccount' => 'Жаңы колдонуучуну катта',
 'gotaccount' => 'Катталгансызбы? $1.',
 'gotaccountlink' => 'Кирүү',
-'userlogin-resetlink' => 'Кирүү маалыматыңызды унутуп калдыңызбы?',
+'userlogin-resetlink' => 'Кирүүчү маалыматарыңызды унутуп калдыңызбы?',
 'createaccountmail' => 'Электрондук дарек боюнча',
+'createaccountreason' => 'Себеби:',
+'badretype' => 'Сиз киргизген сырсөздөр дал келишпейт',
+'userexists' => 'Сиз тандаган колдонуучунун аты бош эмес.',
+'loginerror' => 'Колдонуучуну таанууда ката кетти',
+'createaccounterror' => '$1 эсебин түзүү мүмкүн эмес',
+'loginsuccesstitle' => 'Сиз ийгиликтүү кирдиңиз',
 'wrongpassword' => 'Ката сырсөз киргизилди. Кайтадан аракет кылып көрүңүз.',
 'wrongpasswordempty' => 'Сырсөз киргизилген жок. Кайтадан аракет кылып көрүңүз.',
 'mailmypassword' => 'Жаңы сырсөздү электрондук дарекке жибер',
@@ -300,8 +325,8 @@ $messages = array(
 'newpassword' => 'Жаңы сырсөз:',
 
 # Edit page toolbar
-'bold_sample' => 'Калын тамга',
-'bold_tip' => 'Калын тамга',
+'bold_sample' => 'Калың тамга',
+'bold_tip' => 'Калың тамга',
 'italic_sample' => 'Жантык тамга',
 'italic_tip' => 'Жантык тамга',
 'link_sample' => 'Шилтеменин аталышы',
@@ -314,7 +339,7 @@ $messages = array(
 'nowiki_tip' => 'Уики-форматтоого көңүл бөлбө',
 'image_tip' => 'Кыстарылган файл',
 'media_tip' => 'Файлга шилтеме',
-'sig_tip' => 'Ð\9aол Ñ\82амгаңÑ\8bз Ð¶Ð°Ð½Ð° Ñ\81ааÑ\82Ñ\8b',
+'sig_tip' => 'Ð\9aол Ñ\82амгаңÑ\8bз Ð¶Ð°Ð½Ð° Ñ\83бакÑ\8bÑ\82 Ð¼Ó©Ó©Ñ\80Ò¯',
 'hr_tip' => 'Туурасынын сызык (жыш колдонбоңуз)',
 
 # Edit pages
@@ -324,11 +349,16 @@ $messages = array(
 'savearticle' => 'Баракты сактап кой',
 'preview' => 'Алдын ала көрүү',
 'showpreview' => 'Алдын ала көрсөт',
+'showlivepreview' => 'Ылдам карап чыгуу',
 'showdiff' => 'Өзгөртүүлөрдү көрсөт',
 'anoneditwarning' => "'''Эскертүү:''' Сиз каттоодон өткөн жоксуз.
 IP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
+'blockedtext' => 'Сиздин колдонуучу атыңыз же IP дарегиңиз тосмолонгон',
+'blockednoreason' => 'себеби көрсөтүлгөн эмес',
+'loginreqtitle' => 'Колдонуучунун аты талап кылынат',
+'loginreqlink' => 'Кирүү',
 'accmailtitle' => 'Сырсөз жөнөтүлдү.',
-'accmailtext' => '"$1" үчүн сырсөз $2 ге жөнөтүлдү.',
+'accmailtext' => ' [[User talk:$1|$1]] үчүн сырсөз $2 ге жөнөтүлдү.',
 'newarticle' => '(Жаңы)',
 'newarticletext' => "Сиз ачыла элек баракка шилтемени бастыңыз.
 Бул баракты ачуу үчүн, ылдый жактагы терезечеге жаза баштаңыз (кошумча маалымат алуу үчүн [[{{MediaWiki:Helppage}}|жардам барагы]] караңыз).
@@ -336,38 +366,48 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'noarticletext' => "Азыр бул баракта текст жок.
 Сиз [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты изде]] башка барактарда 
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз],
-же '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} ошондой аталыш менен барак ача аласыз].'''</span>.",
+же '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} ошондой аталыш менен барак ача аласыз]'''</span>.",
 'noarticletext-nopermission' => 'Азыр бул баракта текст жок.
 Сиз башка барактардан [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты издөө]] салып,
 же <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз]</span>.',
+'userpage-userdoesnotexist' => '"$1" Мындай колдонуучу катталган эмес. Ушул баракты түзүүнү же оңдогонду каалганыңыз анык болсун',
 'previewnote' => "'''Бул алдын ала көрүнүшү гана болгонун эсиңизге алыңыз.'''
 Өзгөртүүлөрүңүз сактала элек!",
+'continue-editing' => 'Өзгөртүүүлөрдү улантабыз',
+'session_fail_preview' => 'Кечиресиз, байланыш үзүлгөндүктөн сиздин өзгөртүүлөр сакталган жок. Дагы бир жолу аракет кылып көрүңүз. Болбосо, [[Special:UserLogout|logging out]] аткарып, кайра кирип көрүңүз.',
 'editing' => 'Оңдоо $1',
+'creating' => '$1 түзүлүүдө',
 'editingsection' => '$1 (бөлүмү) оңдолууда',
+'editingcomment' => ' $1 оңдолууда (жаңы бөлүм)',
 'yourtext' => 'Текстиңиз',
 'yourdiff' => 'Айырмалар',
-'templatesused' => 'Бул баракта колдонулган {{PLURAL:$1|шаблон |шаблон}}:',
+'templatesused' => 'Бул баракта колдонулган {{PLURAL:$1|калып |калыптар}}:',
 'template-protected' => '(корголгон)',
 'template-semiprotected' => '(жарым-жартылай корголгон)',
 'hiddencategories' => 'Бул барак {{PLURAL:$1|1 жашыруун категориянын|$1 жашыруун категориялардын}} мүчөсү:',
 'permissionserrorstext-withaction' => 'Сизге $2, төмөнкү {{PLURAL:$1|себеп|себеп}} менен уруксат жок:',
-'recreate-moveddeleted-warn' => "'''Ð\90байлаÑ\82Ñ\83Ñ\83: Сиз мурун өчүрүлгөн баракты кайра баштап жатасыз.'''
+'recreate-moveddeleted-warn' => "'''ЭÑ\81кеÑ\80Ñ\82Ò¯Ò¯: Сиз мурун өчүрүлгөн баракты кайра баштап жатасыз.'''
 
\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¾Ò£Ð´Ð¾Ð¾Ð½Ñ\83 Ñ\83ланÑ\82Ñ\83Ñ\83га Ñ\8bлайÑ\8bгÑ\8bн Ñ\82екÑ\88еÑ\80иңиз.
-Ыңгайлуулук үчүн өчүрүү жана өзгөртүүлөрдүн тизмеси ылдый жакта берилген:",
\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8b ÐºÐ°Ð¹Ñ\80а ÐºÐ°Ð¹Ñ\82аÑ\80Ñ\83Ñ\83 Ñ\87Ñ\8bндап ÐºÐµÑ\80ек Ñ\8dкендигине ÐºÓ©Ð·Ò¯Ò£Ò¯Ð· Ð¶ÐµÑ\82Ñ\81ин.
+Ыңгайлуулук үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген:",
 'moveddeleted-notice' => 'Бул барак өчүрүлгөн.
-Маалымат алуу үчүн баракты өчүрүү жана өзгөртүүлөрдүн тизмеси ылдый жакта берилген.',
+Маалымат үчүн төмөндө өчүрүүлөрдүн жана өзгөртүүлөрдүн тизмеси берилген.',
+'edit-conflict' => 'Өзгөртүүлөрдүн конфликти',
+'edit-already-exists' => 'Жаңы барак түзүү мүмкүн эмес. Мындай барак бар',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''Эскертүү:''' Шаблондун өлчөмү ашырып жиберилген.
-Кээ бир шаблондор кошулбайт.",
-'post-expand-template-inclusion-category' => 'Өлчөмү ашырып жиберилген шаблон камтыган барактар',
-'post-expand-template-argument-warning' => "'''Абайлатуу:''' Бул барак жаюуга өтө чоң көлөмдүү эң аз дегенде бир шаблон жүйөсүн камтыйт.
-Ушул сыяктуу жүйөлөр аттатылышты.",
-'post-expand-template-argument-category' => 'Аттатылган шаблон жүйөлөрүн камтыган барактар',
+'post-expand-template-inclusion-warning' => "'''Эскертүү:''' Камтылган калыптардын өлчөмү өтө чоң.
+Кээ бир калыптар камтылбайт.",
+'post-expand-template-inclusion-category' => 'Камтылган калыптардын өлчөмү ашып кеткен барактар',
+'post-expand-template-argument-warning' => "'''Эскертүү:''' Бул барак, жок дегенде, абдан чоң көлөмдүү калыптын бир жүйөсүн камтыйт жана  жайылганда өлчөмү абдан чоң болуп кетет. 
+Ушул сыяктуу жүйөлөр аттатылды.",
+'post-expand-template-argument-category' => 'Калыптардын аттатылган жүйөлөрүн камтыган барактар',
+'parser-template-loop-warning' => 'Калыптарда айланма бар:[[$1]]',
 
 # History pages
 'viewpagelogs' => 'Бул барак үчүн тизмелерди кара',
+'nohistory' => 'Бул барактын өзгөртүүлөр тарыхы жок',
+'currentrev' => 'Акыркы версиясы',
 'currentrev-asof' => '$1 -га соңку версиясы',
 'revisionasof' => '$1 -деги абалы',
 'revision-info' => '$1 карата $2 тарабынан жасалган версия',
@@ -377,18 +417,23 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'cur' => 'учрдг.',
 'next' => 'кийинки',
 'last' => 'соңку',
-'histlegend' => "Айырмалоону тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгиле жана \"Enter\"-ди же астындагы нукуурун бас.<br />
+'page_first' => 'биринчи',
+'page_last' => 'акыркы',
+'histlegend' => "Айырмаларды тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгилеп туруп \"Enter\"-ди же астындагы баскычты бас.<br />
 Түшүндүрүү: '''({{int:cur}})''' = соңку версиясынан айырма, '''({{int:last}})''' = мурунку версиясынан айырма, '''{{int:minoreditletter}}''' = майда оңдоо.",
 'history-fieldset-title' => 'Тарыхын кара',
 'history-show-deleted' => 'Өчүрүлгөндөрдү гана',
 'histfirst' => 'Эң эски',
 'histlast' => 'Соңку',
+'historyempty' => 'бош',
 
 # Revision feed
+'history-feed-title' => 'Өзгөртүүлөр тарыхы',
 'history-feed-item-nocomment' => '$1, $2 карата',
 
 # Revision deletion
 'rev-delundel' => 'көрсөт/жашыр',
+'rev-showdeleted' => 'көрсөт',
 'revdel-restore' => 'көрүнүшүн өзгөрт',
 'revdel-restore-deleted' => 'өчүрүлгөн версиялар',
 'revdel-restore-visible' => 'көрүнүүчү версиялары',
@@ -397,8 +442,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'revertmerge' => 'Бөл',
 
 # Diffs
-'history-title' => '"$1" барактын тарыхына сереп',
-'difference' => '(Оңдоолордун айырмасы)',
+'history-title' => '"$1" өзгөрүүлөр тарыхы',
 'lineno' => '$1 -сап:',
 'compareselectedversions' => 'Тандалган версияларды салыштыр',
 'editundo' => 'жокко чыгар',
@@ -419,7 +463,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchprofile-project' => 'Жардам жана Долбоор барактары',
 'searchprofile-images' => 'Мултимедиа',
 'searchprofile-everything' => 'Баары',
-'searchprofile-advanced' => 'Ð\96етилген',
+'searchprofile-advanced' => 'Ð\9aеңейтилген',
 'searchprofile-articles-tooltip' => '$1 -де изде',
 'searchprofile-project-tooltip' => '$1 -де изде',
 'searchprofile-images-tooltip' => 'Файлдарды изде',
@@ -435,12 +479,14 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'searchrelated' => 'байланыштуу',
 'searchall' => 'баары',
 'showingresultsheader' => "'''$4''' үчүн {{PLURAL:$5|'''$3''' жыйынтыктан '''$1'''-и|'''$1 - $2''' -дан '''$3''' жыйынтык}}",
-'search-nonefound' => 'СÑ\83Ñ\80ооңÑ\83зга Ñ\8bлайÑ\8bк ÐºÐµÐ»Ð³ÐµÐ½ Ð¶Ñ\8bйÑ\8bнÑ\82Ñ\8bк жок.',
+'search-nonefound' => 'Талапка Ñ\82өп Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 Ñ\82абÑ\8bлган жок.',
 'powersearch' => 'Издөө',
+'powersearch-legend' => 'Кеңиртип изде',
 
 # Preferences page
-'preferences' => 'Түзөө',
+'preferences' => 'ЫңгайлаÑ\88Ñ\82Ñ\8bÑ\80Ñ\83Ñ\83',
 'mypreferences' => 'Ырастоолорум',
+'prefs-edits' => 'Өзгөртүүлөрдүн саны',
 'changepassword' => 'Сырсөздү өзгөртүү',
 'prefs-datetime' => 'Дата жана убакыт',
 'prefs-rc' => 'Соңку өзгөрүүлөр',
@@ -460,6 +506,12 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'prefs-help-email' => 'Электрондук дарек милдетүү эмес, бирок сырсөздү унутуп калсаңыз ал сырсөздү жиберүүгө керек.',
 'prefs-help-email-others' => 'Ошондой эле башкалар сиз менен колдонуучу же талкуу барактарыңыздагы шилтеме аркылуу байланыш түзүүгө уруксат берүүнү тандай аласыз.
 Электрондук дарегиңиз башка кодонуучуларга байланыш түзгөндө көрүнбөйт.',
+'prefs-advancedediting' => 'Кеңейтилген',
+'prefs-advancedrc' => 'Кеңейтилген',
+'prefs-advancedrendering' => 'Кеңейтилген',
+'prefs-advancedsearchoptions' => 'Кеңейтилген',
+'prefs-advancedwatchlist' => 'Кеңейтилген',
+'prefs-displayrc' => 'Көрсөтүүнү тууралоо',
 
 # Groups
 'group' => 'Топ:',
@@ -474,7 +526,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'nchanges' => '$1 {{PLURAL:$1|өзгөрүү|өзгөрүү}}',
 'recentchanges' => 'Соңку өзгөрүүлөр',
 'recentchanges-legend' => 'Соңку өзгөртүүлөрдүн ырастоолору',
-'recentchangestext' => 'Уикидеги соңку өзгөрүүлөрдү ушул барактан көзөмөлдө.',
+'recentchanges-summary' => 'Уикидеги соңку өзгөрүүлөрдү ушул барактан көзөмөлдө.',
 'recentchanges-feed-description' => 'Ушул агымдагы уикидеги соңку өзгөрүүлөрдү көзөмөлдө.',
 'recentchanges-label-newpage' => 'Бул оңдоо жаңы баракты ачты',
 'recentchanges-label-minor' => 'Бул майда оңдоо',
@@ -486,7 +538,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'rcshowhideminor' => 'Майда оңдоолорду $1',
 'rcshowhidebots' => 'ботторду $1',
 'rcshowhideliu' => '$1 катталган колдонуучу',
-'rcshowhideanons' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\8bн ÐºÐ¾Ð»Ð´Ð¾Ð½Ñ\83Ñ\83Ñ\87Ñ\83лаÑ\80дÑ\8b $1',
+'rcshowhideanons' => 'Ð\96аÑ\88Ñ\8bÑ\80Ñ\83Ñ\83н ÐºÐ¾Ð»Ð´Ð¾Ð½Ñ\83Ñ\83Ñ\87Ñ\83лаÑ\80 $1',
 'rcshowhidepatr' => 'Көзөмөл алдындагы оңдоолорду $1',
 'rcshowhidemine' => 'Оңдоолорумду $1',
 'rclinks' => 'Соңку $2 кундө жасалган акыркы $1 өзгөртүүлөрдү көрсөт<br />$3',
@@ -520,6 +572,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'uploadedfiles' => 'Жүктөлгөн файлдар',
 'savefile' => 'Файлды сактап кой',
 'uploadedimage' => '"[[$1]]" жүктөлдү',
+'upload-success-subj' => 'Ийгиликтүү жүктөлдү',
 
 'license' => 'Лицензиялоо:',
 'license-header' => 'Лицензиялоо:',
@@ -542,8 +595,8 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'imagelinks' => 'Файл пайдалануу',
 'linkstoimage' => 'Бул файлга болгон {{PLURAL:$1|шилтеме|$1 шилтеме}} :',
 'nolinkstoimage' => 'Бул файлга шилтеме берген барак жок.',
-'sharedupload-desc-here' => 'Файл $1 -дан Ð¶Ð°Ð½Ð° Ð±Ð°Ñ\88ка Ð´Ð¾Ð»Ð±Ð¾Ð¾Ñ\80лоÑ\80до Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\83Ñ\83га Ð°Ð»Ð° Ð°Ð»Ñ\8bÑ\88аÑ\82.
«Ð»Ð´Ñ\8bй Ð¶Ð°ÐºÑ\82а Ð°Ð½Ñ\8bн [$2 Ñ\84айлдÑ\8b Ñ\81Ñ\8bпаÑ\82Ñ\82оо Ð±Ð°Ñ\80агÑ\8b]нан Ñ\81Ñ\8bпаÑ\82Ñ\82оÑ\81Ñ\83 көрсөтүлгөн.',
+'sharedupload-desc-here' => 'Ð\91Ñ\83л Ñ\84айл $1 -дан  Ð¶Ð°Ð½Ð° Ð±Ð°Ñ\88ка Ð´Ð¾Ð»Ð±Ð¾Ð¾Ñ\80лоÑ\80до Ð¿Ð°Ð¹Ð´Ð°Ð»Ð°Ð½Ñ\8bлÑ\8bÑ\88Ñ\8b Ð¼Ò¯Ð¼ÐºÒ¯Ð½.
¢Ó©Ð¼Ó©Ð½Ð´Ó© Ð°Ð½Ñ\8bн [$2 Ñ\84айлдÑ\8b Ñ\81Ñ\8bпаÑ\82Ñ\82оо Ð±Ð°Ñ\80агÑ\8b]нан Ñ\81Ñ\8bпаÑ\82Ñ\82амаÑ\81Ñ\8b көрсөтүлгөн.',
 
 # Unused templates
 'unusedtemplates' => 'Колдонулбаган нускалар',
@@ -651,8 +704,8 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'undeletecomment' => 'Түшүндүрмө:',
 
 # Namespace form on various pages
-'namespace' => 'Аталыш топтому',
-'invert' => 'ТандалгандÑ\8b кайтар',
+'namespace' => 'Аталыштар мейкиндиги:',
+'invert' => 'Ð\91елгиленгенди кайтар',
 'blanknamespace' => '(Негизги)',
 
 # Contributions
@@ -665,7 +718,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'year' => 'Жылынан (жана андан мурун):',
 
 'sp-contributions-newbies' => 'Жаңы колдонуучулардын гана салымдарын көрсөт',
-'sp-contributions-blocklog' => 'Ñ\82оÑ\81моолоÑ\80дÑ\83н Ñ\82измеÑ\81и',
+'sp-contributions-blocklog' => 'тосмолордун тизмеси',
 'sp-contributions-uploads' => 'жүктөөлөр',
 'sp-contributions-logs' => 'тизме',
 'sp-contributions-talk' => 'талкуу',
@@ -700,7 +753,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'blocklink' => 'тосмоло',
 'unblocklink' => 'тосмолоону алып сал',
 'change-blocklink' => 'тосмолоону өзгөрт',
-'contribslink' => 'салымдар',
+'contribslink' => 'салымдары',
 'blocklogpage' => 'Тосмоолордун тизмеси',
 'blocklogentry' => '[[$1]] тосмолонду, тосмолоо мөөнөтү: $2 $3',
 'block-log-flags-nocreate' => 'Каттоо мүмкүн эмес',
@@ -730,7 +783,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Колдонуучу барагыңыз',
 'tooltip-pt-mytalk' => 'Талкуу барагыңыз',
-'tooltip-pt-preferences' => 'Ырастооңуздар',
+'tooltip-pt-preferences' => 'Ырастоолоруңуз',
 'tooltip-pt-watchlist' => 'Өзгөрүүлөрүн көзөмөлгө алган барактардын тизмеси',
 'tooltip-pt-mycontris' => 'Салымдарыңыздын тизмеси',
 'tooltip-pt-login' => 'Сизге системада катталууга сунуш кылынат, бирок милдеттүү эмес',
@@ -739,7 +792,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-edit' => 'Сиз бул баракты оңдой аласыз. Кичи пейилдикке, сактоодон мурда алдын ала көрсөтүү нукуурун колдонуңуз.',
 'tooltip-ca-addsection' => 'Жаңы бөлүм башта',
 'tooltip-ca-viewsource' => 'Бул барак корголгон.
\91айкоого Ð°Ñ\87Ñ\8bлаÑ\82.',
¡Ð¸Ð· Ð°Ð½Ñ\8bн ÐºÐ°Ð¹Ð½Ð°Ñ\80Ñ\8bн ÐºÓ©Ñ\80Ó© Ð°Ð»Ð°Ñ\81Ñ\8bз',
 'tooltip-ca-history' => 'Бул барактын мурунку оңдоолору',
 'tooltip-ca-protect' => 'Бул баракты корго',
 'tooltip-ca-delete' => 'Бул баракты өчүр',
@@ -747,7 +800,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-watch' => 'Бул баракты көзөмөл тизмеңизге кошуңуз',
 'tooltip-ca-unwatch' => 'Бул баракты көзөмөл тизмеңизден алып салыңыз',
 'tooltip-search' => '{{SITENAME}} изде',
-'tooltip-search-go' => 'УÑ\88Ñ\83л Ð°Ñ\82алÑ\8bÑ\88 Ð¼ÐµÐ½ÐµÐ½ Ð±Ð°Ñ\80ак Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ñ\81о, Ð°Ð»Ð³Ð°',
+'tooltip-search-go' => 'Так Ñ\83Ñ\88Ñ\83ндай Ð°Ñ\82алÑ\8bÑ\88Ñ\82агÑ\8b Ð±Ð°Ñ\80акÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82',
 'tooltip-search-fulltext' => 'Ушул текст менен барактарды изде',
 'tooltip-p-logo' => 'Башбаракка кайрыл',
 'tooltip-n-mainpage' => 'Башбаракка кайрыл',
@@ -771,7 +824,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'tooltip-ca-nstab-special' => 'Бул атайын барак, аны оңдой албайсыз',
 'tooltip-ca-nstab-project' => 'Долбоор барагын кара',
 'tooltip-ca-nstab-image' => 'Файл барагын көрсөт',
-'tooltip-ca-nstab-template' => 'ШаблондÑ\83 көрсөт',
+'tooltip-ca-nstab-template' => 'Ð\9aалÑ\8bпÑ\82Ñ\8b көрсөт',
 'tooltip-ca-nstab-category' => 'Категория барагын көрсөт',
 'tooltip-minoredit' => 'Муну майда оңдоо деп белгиле',
 'tooltip-save' => 'Өзгөртүүлөрдү сактап кой',
@@ -810,10 +863,10 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 
 # Metadata
 'metadata' => 'Метамаалыматтар',
-'metadata-help' => 'Ð\91Ñ\83л Ñ\84айл Ð±Ð°Ð»ÐºÐ¸Ð¼ Ñ\81анаÑ\80ип ÐºÐ°Ð¼ÐµÑ\80адан Ð¶Ðµ Ñ\81каннеÑ\80ден ÐºÐ¾Ñ\88Ñ\83лган ÐºÐ¾Ñ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 камтыйт. 
-Эгерде файл баштапкы абалынан соң өзгөртүлсө, анда кээ бир мүнөздөгүчтөрү толук түрдө дал келбеши мүмкүн.',
-'metadata-fields' => 'Төмөндө тизмеленген сүрөт метамаалыматтарынын саптары метамаалыматтардын жадыбалы түрүлгөндө сүрөт барагына кошумчаланат.
-Калгандары сөз байлашуу менен жашырылат.
+'metadata-help' => 'Ð\91Ñ\83л Ñ\84айл Ð°Ð´Ð°Ñ\82Ñ\82а Ñ\81анаÑ\80ип ÐºÐ°Ð¼ÐµÑ\80а Ð¶Ðµ Ñ\81каннеÑ\80 ÐºÐ¾Ñ\88Ñ\83Ñ\83Ñ\87Ñ\83 Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80дÑ\8b камтыйт. 
+Эгерде файл баштапкы абалынан өзгөртүлсө, анда анын кээ бир сыпаттары толук чагылдырылбашы мүмкүн.',
+'metadata-fields' => 'Төмөндө тизмеленген сүрөт метамаалыматтарынын саптары метамаалыматтардын жадыбалы түрүлүү учурда сүрөт барагына кошумчаланат.
+Калгандары баштапкы абалда (өзгөртүлбөсө) көргөзүлбөйт.
 * make
 * model
 * datetimeoriginal
@@ -856,7 +909,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'watchlisttools-raw' => 'Жетиле элек көзөмөл тизмени оңдо',
 
 # Core parser functions
-'duplicate-defaultsort' => '\'\'\'Ð\90байлаÑ\82Ñ\83Ñ\83:\'\'\' "$2" белгиленген ылгоочу ачкыч "$1" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.',
+'duplicate-defaultsort' => '\'\'\'ЭÑ\81кеÑ\80Ñ\82Ò¯Ò¯:\'\'\' "$2" белгиленген ылгоочу ачкыч "$1" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.',
 
 # Special:Version
 'version' => 'Версия',
index 0383065..3059c11 100644 (file)
@@ -802,8 +802,7 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'revertmerge' => 'Inconfundere',
 
 # Diffs
-'history-title' => 'Historia paginae "$1"',
-'difference' => '(Dissimilitudo inter emendationes)',
+'history-title' => '$1: Historia paginae',
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Conferre emendationes selectas',
 'showhideselectedversions' => 'Monstrare/celare emendationes selectas',
@@ -1074,7 +1073,7 @@ Si vis id dare, opera tua tibi ascribentur.',
 'nchanges' => '$1 {{PLURAL:$1|mutatio|mutationes}}',
 'recentchanges' => 'Nuper mutata',
 'recentchanges-legend' => 'Indicis paginarum nuper mutatarum praeferentiae',
-'recentchangestext' => 'Inspice mutationes recentes huic vici in hac pagina.',
+'recentchanges-summary' => 'Inspice mutationes recentes huic vici in hac pagina.',
 'recentchanges-feed-description' => 'Nuper mutata Viciae hoc in fluxu observare.',
 'recentchanges-label-newpage' => 'Haec recensio paginam novam creavit',
 'recentchanges-label-minor' => 'Haec est recensio minor',
@@ -1384,6 +1383,7 @@ Adspectum graciliorem potes facere modum indicum, nomen usoris (cave litteras ma
 'allpagesprefix' => 'Monstrare paginas quibus est praeverbium:',
 'allpagesbadtitle' => 'Nomen paginae datum fuit invalidum aut praverbium interlinguale vel interviciale habuit. Fortasse insunt una aut plus litterarum quae in titulis non possunt inscribier.',
 'allpages-bad-ns' => 'Non est spatium nominale "$1" apud {{grammar:accusative|{{SITENAME}}}}.',
+'allpages-hide-redirects' => 'Celare redirectiones',
 
 # Special:Categories
 'categories' => 'Categoriae',
index fbbd3cb..fc9b562 100644 (file)
@@ -68,6 +68,9 @@ $namespaceAliases = array(
        'Diskussión_de_Kateggoría' => NS_CATEGORY_TALK,
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $specialPageAliases = array(
        'Activeusers'               => array( 'UsadoresAktivos' ),
        'Allmessages'               => array( 'TodosLosMessajes' ),
@@ -169,7 +172,7 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#DIRIJAR', '#DIRECCIÓN', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
-       'fullpagename'            => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+       'fullpagename'            => array( '1', 'NOMBREDEHOJACOMPLETA', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
        'subpagename'             => array( '1', 'NOMBREDEHOJICA', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
        'msg'                     => array( '0', 'MSJ:', 'MSG:' ),
        'img_left'                => array( '1', 'cierda', 'izquierda', 'izda', 'izq', 'left' ),
@@ -633,7 +636,6 @@ Leyenda: (act) = diferencias con la versión actual,
 
 # Diffs
 'history-title' => 'Istoria de revisiones para «$1»',
-'difference' => '(Diferencias entre rêvisiones)',
 'lineno' => 'Shurá $1:',
 'compareselectedversions' => 'Comparar versiones escogidas',
 'editundo' => 'deshaze',
@@ -741,7 +743,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 'nchanges' => '$1 {{PLURAL:$1|trocamiento|trocamientos}}',
 'recentchanges' => 'Trocamientos freskos',
 'recentchanges-legend' => 'Opciones encima de los trocamientos frescos',
-'recentchangestext' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
+'recentchanges-summary' => 'Perseguid en esta hoja, los trocamientos de alcabo realizados en la Viki.',
 'recentchanges-feed-description' => 'Perseguir los trocamientos más nuevos en el viki en este feed.',
 'recentchanges-label-minor' => 'Esta es un trocamiento chiquitico',
 'rcnote' => "Debaxo {{PLURAL:$1|ay '''1''' trocamiento realizado|están los dal cabo '''$1''' trocamientos realizados}} en  {{PLURAL:$2|el dal cabo día|los dal cabo '''$2''' días}}, hasta el $4, $5.",
index 6b53e45..7c81684 100644 (file)
@@ -50,12 +50,14 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'All_Systemmessagen' ),
        'Allpages'                  => array( 'All_Säiten' ),
        'Ancientpages'              => array( 'Al_Säiten' ),
+       'Badtitle'                  => array( 'Falschen_Titel' ),
        'Blankpage'                 => array( 'Eidel_Säit' ),
        'Block'                     => array( 'Spären' ),
        'Blockme'                   => array( 'Mech_spären' ),
        'Booksources'               => array( 'Bicher_mat_hirer_ISBN_sichen' ),
        'BrokenRedirects'           => array( 'Futtis_Viruleedungen' ),
        'Categories'                => array( 'Kategorien' ),
+       'ChangeEmail'               => array( 'E-Mailadress_änneren' ),
        'ChangePassword'            => array( 'Passwuert_zrécksetzen' ),
        'ComparePages'              => array( 'Säite_vergkäichen' ),
        'Confirmemail'              => array( 'E-Mail_confirméieren' ),
@@ -73,6 +75,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Pad_bäi_de_Fichier' ),
        'Import'                    => array( 'Importéieren' ),
        'Invalidateemail'           => array( 'E-Mailadress_net_confirméieren' ),
+       'JavaScriptTest'            => array( 'JavaScript-Test' ),
        'BlockList'                 => array( 'Lëscht_vu_gespaarten_IPen_a_Benotzer' ),
        'LinkSearch'                => array( 'Weblink-Sichen' ),
        'Listadmins'                => array( 'Lëscht_vun_den_Administrateuren' ),
@@ -145,6 +148,7 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#VIRULEEDUNG', '#WEITERLEITUNG', '#REDIRECT' ),
+       'numberofpages'           => array( '1', 'Säitenzuel', 'SEITENANZAHL', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', 'Artikelen', 'ARTIKELANZAHL', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', 'Fichieren', 'DATEIANZAHL', 'NUMBEROFFILES' ),
        'numberofusers'           => array( '1', 'Benotzerzuel', 'BENUTZERANZAHL', 'NUMBEROFUSERS' ),
@@ -153,18 +157,21 @@ $magicWords = array(
        'namespace'               => array( '1', 'Nummraum', 'NAMENSRAUM', 'NAMESPACE' ),
        'subjectspace'            => array( '1', 'Haaptnummraum', 'HAUPTNAMENSRAUM', 'SUBJECTSPACE', 'ARTICLESPACE' ),
        'subjectpagename'         => array( '1', 'Haaptsäit', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'img_thumbnail'           => array( '1', 'Miniatur', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
        'img_right'               => array( '1', 'riets', 'rechts', 'right' ),
        'img_left'                => array( '1', 'lénks', 'links', 'left' ),
        'img_none'                => array( '1', 'ouni', 'ohne', 'none' ),
        'img_center'              => array( '1', 'zentréiert', 'zentriert', 'center', 'centre' ),
        'img_framed'              => array( '1', 'gerummt', 'gerahmt', 'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( '1', 'net_gerummt', 'rahmenlos', 'frameless' ),
+       'img_page'                => array( '1', 'Säit=$1', 'Säit_$1', 'seite=$1', 'seite $1', 'page=$1', 'page $1' ),
        'img_border'              => array( '1', 'bord', 'rand', 'border' ),
+       'img_top'                 => array( '1', 'uewen', 'oben', 'top' ),
        'grammar'                 => array( '0', 'GRAMMAIRE', 'GRAMMATIK:', 'GRAMMAR:' ),
        'plural'                  => array( '0', 'PLURAL', 'PLURAL:' ),
        'formatnum'               => array( '0', 'ZUELEFORMAT', 'ZAHLENFORMAT', 'FORMATNUM' ),
        'special'                 => array( '0', 'spezial', 'special' ),
-       'hiddencat'               => array( '1', '__VERSTOPPTE_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
+       'hiddencat'               => array( '1', '__VERSTOPPT_KATEGORIE__', '__VERSTECKTE_KATEGORIE__', '__WARTUNGSKATEGORIE__', '__HIDDENCAT__' ),
 );
 
 $messages = array(
@@ -552,6 +559,8 @@ $2',
 'customjsprotected' => "Dir hutt net d'Recht dës JavaScript-Säit z'änneren, well dorop déi perséinlech Astellunge vun engem anere Benotzer gespäichert sinn.",
 'ns-specialprotected' => 'Spezialsäite kënnen net verännert ginn.',
 'titleprotected' => "Eng Säit mat dësem Numm kann net ugeluecht ginn. Dës Spär gouf vum [[User:$1|$1]] gemaach deen als Grond ''$2'' uginn huet.",
+'invalidtitle-knownnamespace' => 'Net valabelen Titel mam Nummraum "$2" a mam Text "$3"',
+'invalidtitle-unknownnamespace' => 'Net valabelen Titel mat der onbekannter Nummraum-Zuel $1 a mam Text "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Schlecht Configuratioun: onbekannte  Virescanner: ''$1''",
@@ -559,11 +568,11 @@ $2',
 'virus-unknownscanner' => 'onbekannten Antivirus:',
 
 # Login and logout pages
-'logouttext' => "'''Dir sidd elo ofgemellt.'''
+'logouttext' => "'''Dir sidd elo ausgeloggt.'''
 
-Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm umellen]].
+Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm aloggen]].
 
-Opgepasst: Op verschiddene Säite gesäit et nach esou aus, wéi wann Dir nach ugemellt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
+Opgepasst: Op verschiddene Säite kann et nach esou aus gesinn, wéi wann Dir nach ageloggt wiert, bis Dir Ärem Browser säin Tëschespäicher (cache) eidel maacht.",
 'welcomecreation' => '== Wëllkomm, $1! ==
 Äre Kont gouf kreéiert.
 Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
@@ -574,7 +583,7 @@ Denkt drun, Är [[Special:Preferences|{{SITENAME}}-Astellungen]] unzepassen.',
 'securelogin-stick-https' => 'Nom Umelle mat HTTPS verbonn bleiwen',
 'yourdomainname' => 'Ären Domain',
 'externaldberror' => 'Entweder ass e Feeler bei der externer Authentifizéierung geschitt, oder Dir däerft Ären externe Benotzerkont net aktualiséieren.',
-'login' => 'Umellen',
+'login' => 'Aloggen',
 'nav-login-createaccount' => 'Aloggen / Benotzerkont uleeën',
 'loginprompt' => "Fir sech op {{SITENAME}} aloggen ze kënnen, mussen d'Cookien aktivéiert sinn.",
 'userlogin' => 'Aloggen / Benotzerkont uleeën',
@@ -673,7 +682,7 @@ Fir är Umeldung ofzeschléissen, musst Dir elo hei een neit Passwuert uginn:',
 'oldpassword' => 'Aalt Passwuert:',
 'newpassword' => 'Neit Passwuert:',
 'retypenew' => 'Neit Passwuert nach eemol antippen:',
-'resetpass_submit' => 'Passwuert aginn an umellen',
+'resetpass_submit' => 'Passwuert aginn an aloggen',
 'resetpass_success' => 'Äert Passwuert gouf geännert!
 Loggt Iech elo an ...',
 'resetpass_forbidden' => 'Passwierder kënnen net geännert ginn.',
@@ -801,7 +810,9 @@ Et ka sinn datt e geännert oder geläscht gouf iwwerdeems wou Dir d'Säit gekuc
 D'Passwuert fir dësen neie Benotzerkont kann op der ''[[Special:ChangePassword|Passwuert ännere]]'' Säit beim Alogge geännert ginn.",
 'newarticle' => '(Nei)',
 'newarticletext' => "Dir hutt op e Link vun enger Säit geklickt, déi et nach net gëtt. Fir déi Säit unzeleeën, gitt w.e.g. Ären Text an déi Këscht hei drënner an (kuckt d'[[{{MediaWiki:Helppage}}|Hëllef Säit]] fir méi Informatiounen). Wann Dir duerch een Iertum heihi komm sidd, da klickt einfach op de Knäppchen '''Zréck''' vun Ärem Browser.",
-'anontalkpagetext' => "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren. Sou eng IP Adress ka vun e puer Benotzer gedeelt ginn. Wann Dir en anonyme Benotzer sidd an Dir irrelevant Kommentäre krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat anonyme Benotzer ze verhënneren.''",
+'anontalkpagetext' => "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.
+Sou eng IP Adress ka vun e puer Benotzer gedeelt ginn.
+Wann Dir en anonyme Benotzer sidd an Dir irrelevant Kommentäre krut, [[Special:UserLogin/signup|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
 'noarticletext' => 'Dës Säit huet momentan keen Text.
 Dir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} esou eng Säit uleeën]</span>.',
@@ -834,7 +845,8 @@ Denkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen,
 'updated' => '(Geännert)',
 'note' => "'''Notiz:'''",
 'previewnote' => "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''
-Är Ännerunge sinn nach net gespäichert! [[#editform|→ Virufuere mam Änneren]]",
+Är Ännerunge sinn nach net gespäichert!",
+'continue-editing' => 'Weider änneren',
 'previewconflict' => 'Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.',
 'session_fail_preview' => "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.
 Versicht et w.e.g. nach eng Kéier.
@@ -1009,7 +1021,7 @@ Dir kënnt dësen Ënnerscheed gesinn; Detailer fannt Dir am [{{fullurl:{{#Speci
 'revdelete-no-file' => 'De Fichier deen ugi war gëtt et net.',
 'revdelete-show-file-confirm' => 'Sidd Dir sécher datt Dir déi geläschte Versioun vum Fichier "<nowiki>$1</nowiki>" vum $2 ëm $3 gesi wëllt?',
 'revdelete-show-file-submit' => 'Jo',
-'revdelete-selected' => "'''{{PLURAL:$2|Gewielte Versioun|Gewielte Versioune}} vu(n) '''$1''' :'''",
+'revdelete-selected' => "'''{{PLURAL:$2|Gewielt Versioun|Gewielt Versioune}} vu(n) [[:$1]] :'''",
 'logdelete-selected' => "'''Ausgewielten {{PLURAL:$1|Evenement|Evenementer}} aus dem Logbuch:'''",
 'revdelete-text' => "'''Geläschte Versiounen oder aner geläschte Bestanddeeler sinn net méi ëffentlech zougänglech, si stinn awer weiderhin an der Versiounsgeschicht vun der Säit.'''
 Aner {{SITENAME}}-Administrateure kënnen de geläschten Inhalt oder aner geläschte Bestanddeeler weiderhi gesinn a restauréieren, et sief, et gouf festgeluecht, datt déi Limitatioune vum Accès och fir Administrateure gëllen.",
@@ -1030,7 +1042,7 @@ Aner {{SITENAME}}-Administrateure kënnen de geläschten Inhalt oder aner geläs
 'revdelete-suppress' => 'Grond vum Läschen och fir Administrateure verstoppt',
 'revdelete-unsuppress' => 'Limitatiounen fir restauréiert Versiounen ophiewen',
 'revdelete-log' => 'Grond:',
-'revdelete-submit' => 'Op déi gewielte {{PLURAL:$1|Versioun|Versiounen}} uwenden',
+'revdelete-submit' => 'Op déi gewielt {{PLURAL:$1|Versioun|Versiounen}} uwenden',
 'revdelete-success' => "'''Sichtbarkeet vun de Versioune gouf aktualiséiert.''''",
 'revdelete-failure' => "'''Sichtbarkeet vun der Versioun konnt net aktualiséiert ginn:'''
 $1",
@@ -1064,7 +1076,7 @@ Kuckt w.e.g. an de Logbicher no.",
 # Suppression log
 'suppressionlog' => 'Lëscht vun de verstoppten a geläschte Säiten',
 'suppressionlogtext' => 'Ënnendrënner ass eng Lëscht vun de geläschte Säiten a Spären a vun den Administrateuren verstopptem Inhalt.
-Kuckt [[Special:BlockList|Lëscht vun de gespaarten IPen]] fir déi aktuell Spären.',
+Kuckt [[Special:BlockList|Lëscht vun Späre]] fir déi aktuell Spären.',
 
 # History merging
 'mergehistory' => 'Historiquë fusionéieren',
@@ -1100,8 +1112,9 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'mergelogpagetext' => 'Lëscht vun de rezenten Zesummeféierunge vu Versiounsgeschichten.',
 
 # Diffs
-'history-title' => 'Versiounshistorique vun „$1“',
-'difference' => '(Ennerscheed tëscht Versiounen)',
+'history-title' => '$1: Historique vun de Versiounen',
+'difference-title' => '$1: Ënnerscheed tëschent de Versiounen',
+'difference-title-multipage' => '$1 a(n) $2: Ënnerscheed tëschent de Säiten',
 'difference-multipage' => '(Ënnerscheed tëschent Säiten)',
 'lineno' => 'Linn $1:',
 'compareselectedversions' => 'Ausgewielte Versioune vergläichen',
@@ -1196,6 +1209,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'prefs-beta' => 'Beta-Fonctiounen',
 'prefs-datetime' => 'Datum an Auerzäit',
 'prefs-labs' => '"Labs"-Fonctiounen',
+'prefs-user-pages' => 'Benotzersäiten',
 'prefs-personal' => 'Benotzerprofil',
 'prefs-rc' => 'Rezent Ännerungen',
 'prefs-watchlist' => 'Iwwerwaachungslëscht',
@@ -1457,7 +1471,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerungen}}',
 'recentchanges' => 'Rezent Ännerungen',
 'recentchanges-legend' => 'Optioune vun de rezenten Ännerungen',
-'recentchangestext' => "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
+'recentchanges-summary' => "Op dëser Säit kënnt Dir déi rezent Ännerungen op '''{{SITENAME}}''' gesinn.",
 'recentchanges-feed-description' => 'Verfollegt mat dësem Feed déi rezent Ännerungen op {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Dës Ännerung huet eng nei Säit ugeluecht',
 'recentchanges-label-minor' => 'Dëst ass eng kleng Ännerung',
@@ -1650,13 +1664,17 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-writetemp' => 'Den temporäre Fichier konnt net geännert ginn.',
 '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-create' => 'De Fichier $1 konnt net geschriwwe ginn.',
+'backend-fail-maxsize' => 'De Fichier $1 konnt net geschriwwe 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
 'lockmanager-notlocked' => '"$1" konnt net fräigeschalt ginn; $1 ass net gespaart.',
 'lockmanager-fail-closelock' => 'De Spärfichier fir "$1" konnt net zougemaach ginn.',
 'lockmanager-fail-deletelock' => 'De Spärfichier fir "$1" konnt net geläscht ginn.',
+'lockmanager-fail-acquirelock' => '"$1" konnt net gespaart ginn.',
+'lockmanager-fail-openlock' => 'De Spärfichier fir "$1" konnt net opgemaach ginn.',
+'lockmanager-fail-releaselock' => 'D\'Spär fir "$1" konnt net opgehuewe ginn.',
 'lockmanager-fail-db-release' => "D'Spären op der Datebank $1 konnten net fräigeschalt ginn.",
 'lockmanager-fail-svr-release' => "D'Spären um Server $1 konnten net fräigeschalt ginn.",
 
@@ -1713,8 +1731,8 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
 'upload-curl-error28' => "D'Eroplueden huet ze laang gedauert (timeout)",
 'upload-curl-error28-text' => "Dëse Site huet ze laang gebraucht fir z'äntwerten. Kuckt w. e. g. no, ob dëse Site online ass, waart een Ament a probéiert et dann nach eng Kéier. Et ka sënnvoll sinn, et nach eng Kéier méi spéit ze versichen.",
 
-'license' => 'Lizenzéiert:',
-'license-header' => 'Lizenzéieren',
+'license' => 'Lizenz',
+'license-header' => 'Lizenz',
 'nolicense' => 'Keng Lizenz ausgewielt',
 'license-nopreview' => '(Kucken ouni ofzespäichere geet net)',
 'upload_source_url' => ' (gëlteg, ëffentlech zougänglech URL)',
@@ -1766,6 +1784,10 @@ Eng [[Special:WhatLinksHere/$2|komplett Lëscht]] ass disponibel.',
 Kuckt w.e.g. d'[$2 Säit mat der Beschreiwung vum Fichier] fir méi Informatiounen.",
 'sharedupload-desc-here' => "Dëse Fichier ass vu(n) $1 an däerf vun anere Projete benotzt ginn.
 D'Beschreiwung op senger [$2 Beschreiwungssäit] steet hei ënnendrënner.",
+'sharedupload-desc-edit' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
+'sharedupload-desc-create' => 'Dëse Fichier ass vu(n) $1 a ka vun anere Projete benotzt ginn.
+Dir kënnt seng Beschreiwung op senger [$2 Beschreiwungssäit] änneren.',
 'filepage-nofile' => 'Et gëtt kee Fichier mat deem Numm.',
 'filepage-nofile-link' => 'Et gëtt kee Fichier mat deem Numm, awer Dir kënnt [$1 en eroplueden].',
 'uploadnewversion-linktext' => 'Eng nei Versioun vun dësem Fichier eroplueden',
@@ -1899,6 +1921,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'wantedpages' => 'Gewënschte Säiten',
 'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
 'wantedfiles' => 'Gewënschte Fichieren',
+'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
 'wantedtemplates' => 'Gewënschte Schablounen',
 'mostlinked' => 'Dacks verlinkte Säiten',
 'mostlinkedcategories' => 'Dacks benotzte Kategorien',
@@ -1977,6 +2000,11 @@ Dir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisit
 'allpages-bad-ns' => 'Den Nummraum „$1“ gëtt et net op {{SITENAME}}.',
 'allpages-hide-redirects' => 'Viruleedunge verstoppen',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Dir gesitt eng Versioun aus dem Tëschespäicher (cache) vun dëser Säit, déi bis zu $1 al ka sinn.',
+'cachedspecial-viewing-cached-ts' => 'Dir gesitt eng Versioun vun dëser Säit aus dem Tëschespäicher (cache), déi eventuell net méi aktuell ass.',
+'cachedspecial-refresh-now' => 'Déi rezentst weisen.',
+
 # Special:Categories
 'categories' => 'Kategorien',
 'categoriespagetext' => 'Dës {{PLURAL:$1|Kategorie huet|Kategorien hu}} Säiten oder Medien.
@@ -2354,7 +2382,7 @@ $1',
 'sp-contributions-userrights' => 'Verwaltung vun de Benotzerrechter',
 'sp-contributions-blocked-notice' => 'Dëse Benotzer ass elo gespaart. Déi lescht Entrée am Läsch-Logbuch steet als Referenz hei ënnendrënner:',
 'sp-contributions-blocked-notice-anon' => "Dës IP-Adress ass elo gespaart.
-Ënnendrënner steet déi lescht Androung an d'Spärlëscht:",
+Ënnendrënner steet déi lescht Aschreiwung an d'Spärlëscht:",
 'sp-contributions-search' => 'No Kontributioune sichen',
 'sp-contributions-username' => 'IP-Adress oder Benotzernumm:',
 'sp-contributions-toponly' => 'Nëmmen Ännerunge weisen déi déi lescht Versioun sinn',
@@ -2417,7 +2445,7 @@ $1',
 'blockipsuccesssub' => 'Gouf gespaart',
 'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] gouf gespaart. <br />
 
-Kuckt d'[[Special:BlockList|IP Spär-Lëscht]] fir all Spären ze gesin.",
+Kuckt d'[[Special:BlockList|Spär-Lëscht]] fir all Spären nozekucken.",
 'ipb-blockingself' => 'Dir sidd am gaang Iech selwer ze spären! Sidd Dir sécher datt Dir dat maache wëllt?',
 'ipb-confirmhideuser' => 'Dir sidd am gaang e Benotzer ze späre mat der Fonctioun "Benotzer verstoppen" ageschalt. Dëst hëlt den Numm vum Benotzer aus alle Lëschten a Logbicher eraus. Sidd Dir sécher datt Dir dat maache wëllt?',
 'ipb-edit-dropdown' => 'Spärgrënn änneren',
@@ -2470,7 +2498,7 @@ De Grond dee fir d\'Spär vum $1 ugi gouf ass: "$2".',
 'reblock-logentry' => "huet d'Spär vum [[$1]] bis den $2 $3 geännert",
 'blocklogtext' => "Dëst ass eng Lëscht vu Spären a vu Spären déi opgehuewe goufen.
 Automatesch gespaarten IP-Adresse sinn hei net opgelëscht.
-Kuckt d'[[Special:BlockList|IP Spärlëscht]] fir déi aktuell Spären.",
+Kuckt d'[[Special:BlockList|Spärlëscht]] fir déi aktuell Spären.",
 'unblocklogentry' => "huet d'Spär vum $1 opgehuewen",
 'block-log-flags-anononly' => 'Nëmmen anonym Benotzer',
 'block-log-flags-nocreate' => 'Schafe vu Benotzerkonte gespaart',
@@ -2838,6 +2866,7 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'spambot_username' => 'Botz vum Spam duerch MediaWiki',
 'spam_reverting' => 'Déi lescht Versioun ouni Linken op $1 restauréieren.',
 'spam_blanking' => 'An alle Versioune ware Linken op $1, et ass elo alles gebotzt.',
+'spam_deleting' => 'All Versioune mat Linken op $1 gi geläscht',
 
 # Info page
 'pageinfo-title' => 'Informatioun iwwer "$1"',
@@ -2866,7 +2895,7 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'markaspatrolleddiff' => 'Als nogekuckt markéieren',
 'markaspatrolledtext' => 'Dës Säit als nogekuckt markéieren',
 'markedaspatrolled' => 'ass als nogekuckt markéiert',
-'markedaspatrolledtext' => 'Déi gewielte Versioun vu(n) [[:$1]] gouf als nogekuckt markéiert.',
+'markedaspatrolledtext' => 'Déi gewielt Versioun vu(n) [[:$1]] gouf als nogekuckt markéiert.',
 'rcpatroldisabled' => 'Rezent Ännerungskontroll ausgeschalt.',
 'rcpatroldisabledtext' => "D'Kontroll vun de leschten Ännerungen ass elo ausgeschalt.",
 'markedaspatrollederror' => 'Kann net als "nogekuckt" markéiert ginn.',
@@ -3523,6 +3552,9 @@ 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
 'filepath' => 'Pad bei de Fichier',
@@ -3707,4 +3739,17 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'api-error-uploaddisabled' => "D'Eroplueden ass op dëser Wiki ausgeschalt.",
 'api-error-verification-error' => 'Dëse Fichier kéint korrupt sinn, oder en huet eng falsch Erweiderung.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|Sekonn|Sekonnen}}',
+'duration-minutes' => '$1 {{PLURAL:$1|Minutt|Minutten}}',
+'duration-hours' => '$1 {{PLURAL:$1|Stonn|Stonnen}}',
+'duration-days' => '$1 {{PLURAL:$1|Dag|Deeg}}',
+'duration-weeks' => '$1 {{PLURAL: $1|Woch|Wochen}}',
+'duration-years' => '$1 {{PLURAL:$1|Joer|Joer}}',
+'duration-decades' => '$1 {{PLURAL:$1|Joerzéngt|Joerzéngten}}',
+'duration-centuries' => '$1 {{PLURAL:$1|Joerhonnert|Joerhonnerten}}',
+'duration-millennia' => '$1 {{PLURAL:$1|Millenaire|Millenairen}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => "D'Spären um Server $1 konnten net ofgefrot ginn.",
 );
index dfe840f..787e1be 100644 (file)
@@ -15,7 +15,9 @@
  * @author Migraghvi
  * @author Namik
  * @author Nemo bis
+ * @author Ole Yves
  * @author Reedy
+ * @author Soul Train
  */
 
 $fallback = 'ru';
@@ -27,20 +29,23 @@ $messages = array(
 'tog-hideminor' => 'Мукьвара хьайи дегишвилера авай гъвечIи дуьзар хъувунар чуьнуьхун',
 'tog-hidepatrolled' => 'Мукьвара хьайи дегишвилера авай къаравулвал авунвай дуьзар хъувунар чуьнуьхун',
 'tog-newpageshidepatrolled' => 'ЦIийи ччинрин сиягьда къаравулвал авунвай ччинар чуьнуьхун',
-'tog-usenewrc' => 'ЦIийи дегишвилерин сиягь кардик кутун (JavaScript герекзава)',
-'tog-numberheadings' => 'КЬилин цIарариз автоматдаказ номерар эцигун',
+'tog-extendwatchlist' => 'ЧӀехи сиягь килигунин, кутазвай вири дегишунар, амма са эхирбур туш',
+'tog-usenewrc' => 'Мукьвара хьайи масакIавилерин ччина ва вилив хуьнин сиягьда  дуьзар хъувунар кIеретIриз ччара авун. (JavaScript герекзава)',
+'tog-numberheadings' => 'Кьилин цӀарариз автоматдаказ номерар эцигун',
 'tog-showtoolbar' => 'Дуьзар хъувунин алатрин кьвати къалура (JavaScript)',
 'tog-editondblclick' => 'Ччинар кьве тIампIуналди дуьзар хъувун (JavaScript герекзава)',
 'tog-editsection' => 'Пай [дуьзар хъувун] патал элячIун къалура',
 'tog-editsectiononrightclick' => 'Пайдин кьилинцIардиз эрчIи патан тIампI авуна пайдин дуьзар хъувуниз мумкинвал гун (JavaScript герекзава)',
-'tog-showtoc' => 'КЪенеавайбурун сиягь къалурун (3-й гзаф кьилинцIарар авай ччинар патал)',
+'tog-showtoc' => 'Къенеавайбурун сиягь къалурун (3-й гзаф кьилинцӀарар авай ччинар патал)',
 'tog-rememberpassword' => 'И браузерда зи логин рикlел хуьхь (лап гзаф $1 {{PLURAL:$1|югъ|йикъар}})',
 'tog-watchcreations' => 'За туькIуьрнавай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdefault' => 'За дуьзар хъувунвай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchmoves' => 'За тIвар эхцигай ччинар зи гуьзетунин сиягьдиз алава авун',
 'tog-watchdeletion' => 'За алуднавай ччинар зи гуьзетунин сиягьдиз алава авун',
+'tog-minordefault' => 'Авайвилелди, вири дуьзар хъувунар гъвечIи дуьзар хъувунар хьиз лишан авун',
 'tog-previewontop' => 'Сифтедин килигун дуьзар хъувундин дакIардин вилик эцига',
 'tog-previewonfirst' => 'Дуьзар хъувундиз эгечIайла сифтедин килигун къалурун',
+'tog-enotifwatchlistpages' => 'Зи гуьзетунин ччин масакIа хьайила заз эмейл ракъура.',
 'tog-enotifusertalkpages' => 'КЬилди жуван веревирдрин ччина хьанвай дегишвилерикай э-почтадиз чар ракъурун.',
 'tog-oldsig' => 'Алай къул:',
 'tog-showhiddencats' => 'Чуьнуьхай категорияр къалурун',
@@ -51,6 +56,7 @@ $messages = array(
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Дуьзар хъувунин чкадин шрифтдин жуьре',
+'editfont-default' => 'Браузердин низамарунрикай шрифт',
 'editfont-monospace' => 'Моногьяркьуьвилер авай шрифт',
 'editfont-sansserif' => 'КЬацI авачир шрифт',
 'editfont-serif' => 'КьацI авай кхьин',
@@ -63,55 +69,55 @@ $messages = array(
 'thursday' => 'Хемис',
 'friday' => 'Жуьмя',
 'saturday' => 'Киш',
-'sun' => 'Гья',
+'sun' => 'Гьяд',
 'mon' => 'Исл',
 'tue' => 'Сал',
 'wed' => 'Aрб',
 'thu' => 'Xем',
 'fri' => 'Жум',
 'sat' => 'Киш',
-'january' => 'СÑ\83Ñ\8cл',
-'february' => 'Чила',
-'march' => 'ТIÑ\83л',
-'april' => 'Ð\92ил',
-'may_long' => 'мукал',
-'june' => 'Ð\9aÑ\8cамÑ\83г',
-'july' => 'БаскIум',
-'august' => 'Ð\9dава',
-'september' => 'Ð\9cаÑ\80а',
-'october' => 'Ð\91аÑ\81кlÑ\83м',
-'november' => 'Цlехуьл',
-'december' => 'Фандукl',
-'january-gen' => 'Ð\93Ñ\8cеÑ\80',
-'february-gen' => 'Эхем',
-'march-gen' => 'Ð\98бне',
-'april-gen' => 'Ð\9dава',
-'may-gen' => 'ТӀул',
-'june-gen' => 'Ð\9aÑ\8aамÑ\83г',
-'july-gen' => 'Чиле',
-'august-gen' => 'Ð\9fаÑ\85Ñ\83н',
-'september-gen' => 'Ð\9cаÑ\80а',
-'october-gen' => 'Ð\91аÑ\81кÓ\80Ñ\83м',
-'november-gen' => 'ЦӀехуьл',
-'december-gen' => 'ФaндукӀ',
-'jan' => 'Ð\93Ñ\8cе',
-'feb' => 'Эхе',
-'mar' => 'Ð\98бн',
-'apr' => 'Ð\9dав',
-'may' => 'Тlул',
-'jun' => 'Ð\9aÑ\8aа',
-'jul' => 'Чил',
-'aug' => 'Ð\9fаÑ\85Ñ\83н',
-'sep' => 'Ð\9cаÑ\80',
-'oct' => 'Ð\91аÑ\81',
-'nov' => 'Цlе',
-'dec' => 'Фан',
+'january' => 'гÑ\8cеÑ\80 (Ñ\8fнваÑ\80Ñ\8c)',
+'february' => 'эхен (февраль)',
+'march' => 'ибне (маÑ\80Ñ\82)',
+'april' => 'нава (апÑ\80елÑ\8c)',
+'may_long' => 'тӀул (май)',
+'june' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
+'july' => 'чиле (июль)',
+'august' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
+'september' => 'маÑ\80а (Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c)',
+'october' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
+'november' => 'цӀехуьл (ноябрь)',
+'december' => 'фундукӀ (декабрь)',
+'january-gen' => 'гÑ\8cеÑ\80 (Ñ\8fнваÑ\80диз)',
+'february-gen' => 'эхен (февралдиз)',
+'march-gen' => 'ибне (маÑ\80Ñ\82диз)',
+'april-gen' => 'нава (апÑ\80елдиз)',
+'may-gen' => 'тӀул (майдиз)',
+'june-gen' => 'кÑ\8cамÑ\83г (иÑ\8eндиз)',
+'july-gen' => 'чиле (июлдиз)',
+'august-gen' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82диз)',
+'september-gen' => 'маÑ\80а (Ñ\81енÑ\82Ñ\8fбÑ\80диз)',
+'october-gen' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80диз)',
+'november-gen' => 'цӀехуьл (ноябрдиз)',
+'december-gen' => 'фундукӀ (декабрдиз)',
+'jan' => 'гÑ\8cеÑ\80 (Ñ\8fнваÑ\80Ñ\8c)',
+'feb' => 'эхен (февраль)',
+'mar' => 'ибне (маÑ\80Ñ\82)',
+'apr' => 'нава (апÑ\80елÑ\8c)',
+'may' => 'тӀул (май)',
+'jun' => 'кÑ\8cамÑ\83г (иÑ\8eнÑ\8c)',
+'jul' => 'чиле (июль)',
+'aug' => 'паÑ\85Ñ\83н (авгÑ\83Ñ\81Ñ\82)',
+'sep' => 'маÑ\80а (Ñ\81енÑ\82Ñ\8fбÑ\80Ñ\8c)',
+'oct' => 'баÑ\81кÓ\80Ñ\83м (окÑ\82Ñ\8fбÑ\80Ñ\8c)',
+'nov' => 'цӀехуьл (ноябрь)',
+'dec' => 'фандукl (декабрь)',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категории}}',
 'category_header' => '"$1" категориядин ччинар',
 'subcategories' => 'агъакатегорияр',
-'category-media-header' => '"$1" категорияда медиа',
+'category-media-header' => '"$1" категоридин медиа',
 'category-empty' => "''Алай чIава и категория ичIи я.\"",
 'hidden-categories' => '{{PLURAL:$1|Чуьнуьхай категория |Чуьнуьхай категорияр }}',
 'hidden-category-category' => 'Чуьнуьхай категорияр',
@@ -169,7 +175,7 @@ $messages = array(
 'returnto' => '$1 ччиниз элкъвена хтун',
 'tagline' => '{{SITENAME}} Cайтдихъай',
 'help' => 'Куьмек',
-'search' => 'Жагъурун',
+'search' => 'Жугъурун',
 'searchbutton' => 'Жагъурун',
 'go' => 'ЭлячIун',
 'searcharticle' => 'ЭлячIун',
@@ -199,7 +205,7 @@ $messages = array(
 'specialpage' => 'Куьмекчи ччин',
 'personaltools' => 'Кьилди вичин алатар',
 'postcomment' => 'ЦIйий пай',
-'articlepage' => 'КЪене авайбурун ччиндиз  килигун',
+'articlepage' => 'Къене авайбурун ччиндиз килигун',
 'talk' => 'Веревирд авун',
 'views' => 'Килигунар',
 'toolbox' => 'Алатрин кьвати',
@@ -236,10 +242,10 @@ $messages = array(
 'helppage' => 'Help:Къене авайбур',
 'mainpage' => 'Кьилин ччин',
 'mainpage-description' => 'Кьилин ччин',
-'policy-url' => 'Project:КЪайдаяр',
+'policy-url' => 'Project:Къайдаяр',
 'portal' => 'КIапIалдин портал',
 'portal-url' => 'Project:КIапIалдин портал',
-'privacy' => 'Чинебанвилин политика',
+'privacy' => 'Чинебанвилин сиясат',
 'privacypage' => 'Project:Чинебанвилин политика',
 
 'badaccess' => 'ГЬатунин гъалатlдин',
@@ -298,6 +304,7 @@ $messages = array(
 'missingarticle-rev' => '(жуьре#: $1)',
 'internalerror' => 'КЪенепатан гъалатI',
 'internalerror_info' => 'КЪенепатан гъалатI $1',
+'filerenameerror' => '«$1» файл  «$2» -з тIвар эхцигиз жезвач..',
 'badarticleerror' => 'И ччина и кар кьилиз акъудиз мумкин ттуш.',
 'cannotdelete-title' => ' "$1" ччин алудиз жезвач',
 'badtitle' => 'Ииже текъвер тIвар',
@@ -337,6 +344,7 @@ $messages = array(
 'wrongpasswordempty' => 'Тавакъу ийида, ичIи тушир парол ттур.',
 'mailmypassword' => 'ЦIийи парол Э-мейлдиз къачун',
 'mailerror' => 'Чар ракъурунин гъалатI: $1',
+'emailconfirmlink' => 'Куь электрон почтунин адрес тестикьун.',
 'accountcreated' => 'Аккаунт туькIуьрнава',
 'usernamehasherror' => 'Уртахдин тIвар "диез"дин лишан квачиз хьана кIанзава',
 'loginlanguagelabel' => 'ЧIал: $1',
@@ -397,6 +405,7 @@ $messages = array(
 'showdiff' => 'МасакIавилер къалурун',
 'anoneditwarning' => "'''Дикъет:''' Куьне системадиз жув вуж ятIа лагьанвач. Куь IP-адрес и ччинин масакIавилерин тарихдиз  кхьида.",
 'summary-preview' => 'Сифте килигун паталди:',
+'subject-preview' => 'КьилинцIарцIин сифтедин килигун:',
 'blockedtitle' => 'Иштиракчи блокарнава',
 'blockednoreason' => 'Са себебни ганвач',
 'nosuchsectiontitle' => 'Пай жугъуриз жезвач',
@@ -414,10 +423,13 @@ $messages = array(
 'noarticletext-nopermission' => 'Исятда и  ччина са текстни авач.
 Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз ва я
 <span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз] жеда.',
+'blocked-notice-logextract' => 'И уртах алайчIава блокарнава.
+Агъадихъ блокарунин журналдикай эхиримжи кхьинар къалурнава:',
 'previewnote' => "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.'''  
-Куь масакIавилер гьеле хвенвач! [[#editform|→ дуьзар хъувун давамрун]]",
+Куь масакIавилер гьеле хвенвач!",
 'editing' => '$1 Дуьзар хъувун',
 'editingsection' => 'Дуьзар хъувун $1  (пай)',
+'editingcomment' => '$1 дуьзар хъувун (цIийи пай)',
 'editconflict' => 'Дуьзар хъувунрин акьунар: $1',
 'yourtext' => 'Зи текст',
 'yourdiff' => 'Тафаватар',
@@ -436,7 +448,7 @@ $messages = array(
 Квевай и ччинин туьхкlуьрунин гереквилиз килигиз тIалабзава.
 Агъадихъ и ччинин алудун ва тIвар эхцигунин журнал къалурнава.",
 'moveddeleted-notice' => 'И ччин алуднава. 
-Агъадихъ малумат патал и ччинин алудун ва тIвар эхцигунин журнал къалурнава.',
+Агъадихъ малумат патал и ччинин алудунин ва тIвар эхцигунин журнал къалурнава.',
 'log-fulllog' => 'Вири журналдиз килигун',
 'edit-conflict' => 'Дуьзар хъувунрин акьунар',
 
@@ -512,10 +524,9 @@ $messages = array(
 
 # Diffs
 'history-title' => '$1  -  масакIавилерин тарих',
-'difference' => '(Жуьрейрин арада тафаватар)',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
-'editundo' => 'Ð\93ьич авун',
+'editundo' => 'гьич авун',
 'diff-multi' => '({{PLURAL:$2|Са уртах|$2 уртахар}} патал авунвай {{PLURAL:$1|са арадин жуьре|$1 арадин жуьреяр}} къалурнавач)',
 
 # Search results
@@ -532,7 +543,7 @@ $messages = array(
 'nextn' => 'Гуьгъуьнин {{PLURAL:$1|$1}}',
 'prevn-title' => 'Вилик фейи  $1 {{PLURAL:$1|нетижа|нетижаяр}}',
 'nextn-title' => 'КЪведай $1 {{PLURAL:$1|нетижа|нетижаяр}}',
-'shown-title' => 'Ччина $1 {{PLURAL:$1|нетижа|нетижаяр}} къалура',
+'shown-title' => 'Ччина $1 {{PLURAL:$1|нетижа|нетижа}} къалурун',
 'viewprevnext' => 'Килигун ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Жагъурунин низамарунар',
 'searchmenu-exists' => "'''И вики-проектда \"[[:\$1]]\" тlвар алай ччин ава.'''",
@@ -548,7 +559,7 @@ $messages = array(
 'searchprofile-images-tooltip' => 'Файлар жугъура',
 'searchprofile-everything-tooltip' => 'Вири ччинра къекъуьгъ (веревирдрин ччинар кваз)',
 'searchprofile-advanced-tooltip' => 'Ганвай тlварарин генгвилера къекъуьгъ',
-'search-result-size' => '$1 ({{PLURAL:$2|1 гаф|$2 гафар}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 гаф|$2 гаф}})',
 'search-result-category-size' => '{{PLURAL:$1|1 элемент|$1 элементар}} ({{PLURAL:$2|1 агъакатегория|$2 агъакатегорияр}}, {{PLURAL:$3|1 файл|$3 файлар}})',
 'search-redirect' => '(рахкъурун $1)',
 'search-section' => '(пай $1)',
@@ -631,13 +642,14 @@ $messages = array(
 'timezoneregion-pacific' => 'Секин чIехи гуьл',
 'prefs-files' => 'Шикил',
 'youremail' => 'Электрон почта:',
-'username' => 'Ð\98Ñ\88лемиÑ\88Ñ\87идин Ñ\82lар',
+'username' => 'УÑ\80Ñ\82аÑ\85дин Ñ\82Ó\80вар',
 'uid' => 'Уртах тайин ийидайди:',
 'yourrealname' => 'Xалис тIвар:',
 'yourlanguage' => 'ЧIалар',
+'yournick' => 'ЦӀийи къул:',
 'yourgender' => 'Жинс:',
 'gender-male' => 'итимдин',
-'gender-female' => 'Фамили',
+'gender-female' => 'папаÑ\80ин',
 'email' => 'E-mail',
 'prefs-help-email' => 'Электрон почтунин адрес кхьи  мажбури туш, амма куьне парол рикIелай ракъурдатIа, ам герек жеда.',
 'prefs-help-email-others' => 'Квевай куь уртахдин, ва я куь веревирдрин ччина элячIун къалурна муькуь уртахар галаз электрон почтадин куькмедалди алакъа хуьз жеда.
@@ -702,10 +714,10 @@ $messages = array(
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|масакIавал|масакIавилер}}',
-'recentchanges' => 'Mукьвара хьайи масакIавилер',
+'recentchanges' => 'Mукьвара хьайи масакӀавилер',
 'recentchanges-legend' => 'Цlийи масакIавилерин низамарунар',
-'recentchangestext' => 'Викида хьанвай эхиримжи масакIавилер и ччина гуьзетун',
-'recentchanges-feed-description' => 'Ð\98 Ñ\85вала Ð²Ð¸ÐºÐ¸Ð´Ð° Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð¼Ð°Ñ\81акIавилеÑ\80 Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83н',
+'recentchanges-summary' => 'Викида хьанвай эхиримжи масакIавилер и ччина гуьзетун',
+'recentchanges-feed-description' => 'Ð\98 Ñ\85вала Ð²Ð¸ÐºÐ¸Ð´Ð° Ñ\85Ñ\8cанвай Ñ\8dÑ\85иÑ\80имжи Ð¼Ð°Ñ\81акIавилеÑ\80 Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cн',
 'recentchanges-label-newpage' => 'И дуьзар хъувун  цlийи ччин туькlуьрна',
 'recentchanges-label-minor' => 'Им гъвечlи дуьзар хъувун я',
 'recentchanges-label-bot' => 'И дуьзар хъувун ботди авунвайд я',
@@ -737,7 +749,7 @@ $messages = array(
 'recentchangeslinked-toolbox' => 'Галкlанвай масакIавилер',
 'recentchangeslinked-title' => '"$1" галаз галкlанавай масакIавилер',
 'recentchangeslinked-noresult' => 'Ганвай чlава галкlанавай ччинра са масакIавални хьанвайд туш',
-'recentchangeslinked-summary' => 'Ð\98м ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз (ва Ñ\8f ÐºÑ\8aалÑ\83Ñ\80ай ÐºÐ°Ñ\82егоÑ\80иÑ\8fдиз Ð³Ñ\8cаÑ\82завай Ñ\87Ñ\87инÑ\80из) Ñ\8dлÑ\8fÑ\87Iзавай Ñ\87Ñ\87инÑ\80а Ð¼Ñ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð¼Ð°Ñ\81акIавилеÑ\80ин Ñ\81иÑ\8fгÑ\8c Ñ\8f. Ð\9aÑ\83Ñ\8c [[Special:Watchlist| Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин Ñ\81иÑ\8fгÑ\8c  ]]диз гьатзавай  ччинар яцlу шрифтдал къалурнава.',
+'recentchangeslinked-summary' => 'Ð\98м ÐºÑ\8aалÑ\83Ñ\80ай Ñ\87Ñ\87иниз (ва Ñ\8f ÐºÑ\8aалÑ\83Ñ\80ай ÐºÐ°Ñ\82егоÑ\80иÑ\8fдиз Ð³Ñ\8cаÑ\82завай Ñ\87Ñ\87инÑ\80из) Ñ\8dлÑ\8fÑ\87Iзавай Ñ\87Ñ\87инÑ\80а Ð¼Ñ\83кÑ\8cваÑ\80а Ñ\85Ñ\8cайи Ð¼Ð°Ñ\81акIавилеÑ\80ин Ñ\81иÑ\8fгÑ\8c Ñ\8f. Ð\9aÑ\83Ñ\8c [[Special:Watchlist| Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин Ñ\81иÑ\8fгÑ\8c ]]диз гьатзавай  ччинар яцlу шрифтдал къалурнава.',
 'recentchangeslinked-page' => 'Ччинин тlвар:',
 'recentchangeslinked-to' => 'Аксина, къалурай ччиниз элячlзавай ччинра масакIавилер къалура',
 
@@ -773,7 +785,7 @@ $messages = array(
 # img_auth script messages
 'img-auth-accessdenied' => 'Гьахьун къадагъа авунва',
 
-'license' => 'Лицензиа авун:',
+'license' => 'Лицензиярун',
 'license-header' => 'Лицинзиярун',
 'nolicense' => 'ЗатIни хкягънавач',
 'license-nopreview' => '(Сифтедин килигун авайд ттуш)',
@@ -895,7 +907,7 @@ $messages = array(
 'allpagessubmit' => 'ЭлячIун',
 
 # Special:Categories
-'categories' => 'Тlаб',
+'categories' => 'Ð\9aаÑ\82егоÑ\80иÑ\8fÑ\80',
 
 # Special:LinkSearch
 'linksearch' => 'КЪецепатан элячIунар жугъурун',
@@ -926,17 +938,17 @@ $messages = array(
 'emailsend' => 'Ракъурун',
 
 # Watchlist
-'watchlist' => 'Ð\97и Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин сиягь',
-'mywatchlist' => 'Ð\97и Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин сиягь',
+'watchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягь',
+'mywatchlist' => 'Ð\97и Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягь',
 'watchlistfor2' => '$1 $2 патал',
 'addedwatchtext' => "Чар \"[[:\$1]]\" тун хъувунай куьн [[Special:Watchlist|watchlist]].                                                                                                             Къвезмай дегишунар и чарчел ва галкlанавай чарчихъ ихтилатар жеда инна, ахъатдава \"сакlус яцlу''''' инна [[Special:RecentChanges|list of recent changes]] гьам кьизил авун.",
 'removedwatchtext' => 'Чар "[[:$1]]" Идай чlурнай [[Special:Watchlist|ахтармишунин цlарар]].',
-'watch' => 'Ð\93Ñ\83Ñ\8cзеÑ\82Ñ\83н',
+'watch' => 'Ð\92илив Ñ\85Ñ\83Ñ\8cн',
 'watchthispage' => 'Гелкъуьн и хъувун',
-'unwatch' => 'Ð\93Ñ\83Ñ\8cзеÑ\82 Ð¸Ð¹Ð¸мир',
-'watchlist-details' => 'Ð\9aÑ\83Ñ\8c Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин Ñ\81иÑ\8fгÑ\8cда {{PLURAL:$1|$1 Ñ\87Ñ\87ин|$1 Ñ\87Ñ\87инаÑ\80}}, веревирдрин ччинар квачиз.',
+'unwatch' => 'Ð\92илив Ñ\85Ñ\83Ñ\8cмир',
+'watchlist-details' => 'Ð\9aÑ\83Ñ\8c Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин Ñ\81иÑ\8fгÑ\8cда {{PLURAL:$1|$1 Ñ\87Ñ\87ин|$1 Ñ\87Ñ\87ин}} Ð°Ð²Ð°Ð¹Ð´Ð¸ Ñ\8f, веревирдрин ччинар квачиз.',
 'wlshowlast' => 'Эхиримжи $1 сят $2 югъ $3 къалура',
-'watchlist-options' => 'Ð\93Ñ\83Ñ\8cзеÑ\82Ñ\83нин сиягьдин низамарунар',
+'watchlist-options' => 'Ð\92илив Ñ\85Ñ\83Ñ\8cнин сиягьдин низамарунар',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Килигун...',
@@ -1013,8 +1025,8 @@ $messages = array(
 
 # Contributions
 'contributions' => 'Уртахди кутур крар',
-'contributions-title' => '$1 уртахдин кутур крар',
-'mycontris' => 'За кутур крар',
+'contributions-title' => '$1 уртахди кутур крар',
+'mycontris' => 'За кутур кар',
 'contribsub2' => '($1)-ин кутур пай  ($2)',
 'uctop' => '(вини кьил)',
 'month' => ' Вацралай (ва адалай вилик)',
@@ -1120,10 +1132,10 @@ $messages = array(
 'import-token-mismatch' => 'Сеансдин  ганайбур квахьнава. Тавакъу ийида, мадни алахъун ая.',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Куь ишлемишзавайдин ччин',
+'tooltip-pt-userpage' => 'Куьн (уртахдин) ччин',
 'tooltip-pt-mytalk' => 'Куь веревирдрин ччин',
 'tooltip-pt-preferences' => 'Куь низамарунар',
-'tooltip-pt-watchlist' => 'Ð\9aÑ\83Ñ\8cне Ð³Ñ\83Ñ\8cзеÑ\82завай ччинрин сиягь',
+'tooltip-pt-watchlist' => 'Ð\9aÑ\83Ñ\8cне Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cзвай ччинрин сиягь',
 'tooltip-pt-mycontris' => 'Куьне авунвай дуьзар хъувунрин сиягь',
 'tooltip-pt-login' => 'Квез гьахьиз теклифзава, анжах им мажбури туш',
 'tooltip-pt-logout' => 'ЭкъечIун',
@@ -1135,19 +1147,19 @@ $messages = array(
 'tooltip-ca-protect' => 'И ччин хуьн',
 'tooltip-ca-delete' => 'И ччин алудун',
 'tooltip-ca-move' => 'Ччиндин тIвар масакIа авун',
-'tooltip-ca-watch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин сиягьдиз алава авун',
-'tooltip-ca-unwatch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин Ñ\81иÑ\8fгÑ\8cдал къахчун',
-'tooltip-search' => 'И гаф жагъурун {{SITENAME}}',
+'tooltip-ca-watch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягьдиз алава авун',
+'tooltip-ca-unwatch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин Ñ\81иÑ\8fгÑ\8cдай къахчун',
+'tooltip-search' => '{{SITENAME}} къекъуьн',
 'tooltip-search-go' => 'АватIа, гьа и тIвар авай ччиниз элячIун',
-'tooltip-search-fulltext' => 'Къалурай текст авай ччинар жугъура',
+'tooltip-search-fulltext' => 'Къалурай текст авай ччинар жугъурун',
 'tooltip-p-logo' => 'Кьилин ччиниз элячIун',
-'tooltip-n-mainpage' => 'Ð\9aÑ\8cилин Ñ\87Ñ\87индиз Ñ\8dлÑ\8fÑ\87\83н',
+'tooltip-n-mainpage' => 'Кьилин ччиниз элячIун',
 'tooltip-n-mainpage-description' => 'Кьилин ччиндиз элячIун',
 'tooltip-n-portal' => 'Проектдикай,  квевай вуч йийз алакьда, са вуч ятIани гьинай жугъурда',
 'tooltip-n-currentevents' => 'Алай вакъийрин сиягь',
 'tooltip-n-recentchanges' => 'Викида мукьвара хьайи масакIавилерин сиягь',
 'tooltip-n-randompage' => 'Дуьшуьшдин чин ппарун',
-'tooltip-n-help' => 'Жагъурдай чка',
+'tooltip-n-help' => 'Жагъурун патал чка',
 'tooltip-t-whatlinkshere' => 'Иниз элячIзавай викидин вири  ччинрин сиягь',
 'tooltip-t-recentchangeslinked' => 'И ччиндиз элячIзавай ччинра  мукьвара хьайи масакIавилер',
 'tooltip-feed-rss' => 'RSS  хуьрек и чарчиз',
@@ -1170,7 +1182,7 @@ $messages = array(
 'tooltip-preview' => 'Ччин хуьдалди вилик, сифте килигун кардик кутун тавакъу ийизва',
 'tooltip-diff' => 'Сифте кьилин текстдиз талукь тир куьне авунвай масакIавилер къалурун',
 'tooltip-compareselectedversions' => 'И ччинин кьве хкягъай жуьрейрин арада авай тафаватдиз килигун',
-'tooltip-watch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð³Ñ\83Ñ\8cзеÑ\82Ñ\83нин сиягьдиз алава авун',
+'tooltip-watch' => 'Ð\98 Ñ\87Ñ\87ин ÐºÑ\83Ñ\8c Ð²Ð¸Ð»Ð¸Ð² Ñ\85Ñ\83Ñ\8cнин сиягьдиз алава авун',
 'tooltip-rollback' => '« КЬулухъди чIугун »  и ччиндиз эхиримжи кар кутазвайди патай  авунвай дуьзар хъувунар са т!ампуналди  paxкурзава',
 'tooltip-undo' => '«Гьич авун»  авунвай дуьзар хъувун paxкурзава ва сифтедин килигунин режимда  дуьзар хъувундин форма ахъа йийзва. Им нетижадиз себеб алава йийз мумкинвал гузва',
 'tooltip-summary' => 'Куьруь нетижа гьадрун',
@@ -1248,20 +1260,7 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 'limitall' => 'вири',
 
 # action=purge
-'confirm_purge_button' => 'Э(кхьин)
-
-
-
-
-
-
-
-
-
-
-
-
-9',
+'confirm_purge_button' => 'ЭХь',
 'confirm-purge-top' => 'И ччинин кэш алуддани?',
 
 # action=watch/unwatch
@@ -1315,14 +1314,14 @@ Cиягьда авай анжах (* лишандихъ галаз эгечIза
 'specialpages' => 'КьетIен  ччинар',
 
 # External image whitelist
-'external_image_whitelist' => ' #И цIар авайд хьиз тур</pre>
-#Агъада вахт акадар тийиз жезвай (гьамиша къайдадалди ) лугьунрин кьатIар эцига (// арада авай кIус).
+'external_image_whitelist' => ' #И цӀар авайд хьиз тур<pre>
+#Агъада вахт акадар тийиз жезвай (гьамиша къайдадалди) лугьунрин кьатӀар эцига (// арада авай кӀус).
 #Ибур кьецепатан суьретрин URL галаз гекъигда.
-#Дуьзкъвезвайбур суьретар хьиз къалурда, муькуьбур суьретриз тухузвай элячIунар хьиз къалурда.
-# "#" галаз эгечIзавай цIарариз къейдериз хьиз килигда.
-#ЦIарар регистрдиз фад кьатIудайбур я.
+#Дуьзкъвезвайбур суьретар хьиз къалурда, муькуьбур суьретриз тухузвай элячӀунар хьиз къалурда.
+#«#» галаз эгечӀзавай цӀарариз къейдериз хьиз килигда.
+#ЦӀарар регистрдиз фад кьатӀудайбур я.
 
-#ЦIарцин винел вири вахт акадар тийиз жезвай лугьунрин кьатIар эцига.И цIар авайд хьиз тур</pre>',
+#ЦӀарцин винел вири вахт акадар тийиз жезвай лугьунрин кьатӀар эцига. И цӀар авайд хьиз тур</pre>',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] куьзунаг:',
index 80ed160..024c56a 100644 (file)
@@ -428,7 +428,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 
 # Diffs
 'history-title' => 'Istoria de cambias de "$1"',
-'difference' => '(Difere entre cambias)',
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Compare varias elejeda',
 'editundo' => 'desfa',
@@ -505,7 +504,7 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cambia|cambias}}',
 'recentchanges' => 'Cambias resente',
-'recentchangestext' => 'Asi la lista de cambias resente en la vici.',
+'recentchanges-summary' => 'Asi la lista de cambias resente en la vici.',
 'recentchanges-feed-description' => 'Seque la cambias plu resente a la vici en esta flue.',
 'rcnote' => 'Su es {{PLURAL:$1|cambia|cambias}} en la presedente {{PLURAL:$2|dia|dias}}, en $5, $4.',
 'rcnotefrom' => "A su es la cambias de '''$2''' (asta '''$1''' es mostrada).",
index e72f69f..88b41b4 100644 (file)
@@ -803,7 +803,6 @@ oba ku gano agali ku lupapula luno.<br />
 
 # Diffs
 'history-title' => 'Empandika eza "$1"',
-'difference' => "(Enjawulo mu mpandika ez'olupapula)",
 'lineno' => 'Lunyiriri namba $1:',
 'compareselectedversions' => 'Gerageranya likooda zenonze',
 'editundo' => 'julula enkyukakyuka',
@@ -916,7 +915,7 @@ W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipedi
 'nchanges' => '{{PLURAL:$1|Olukyukakyuka|Nkyukakyuka}} $1',
 'recentchanges' => 'Ebyakakyusibwa',
 'recentchanges-legend' => "Awategekerwa endaga y'ebyakakyusibwa",
-'recentchangestext' => "Goberera enkyukakyuka empya ez'oku lupapula luno",
+'recentchanges-summary' => "Goberera enkyukakyuka empya ez'oku lupapula luno",
 'recentchanges-feed-description' => "Kozesa omukutu guno okugoberera enkyukakyuka empya ez'oku wiki",
 'rcnote' => "Wano olaba {{PLURAL:$1|olukyukakyuka '''1''' olukoledwawo|enkyukakyuka '''$1''' ezikoledwawo}} mu {{PLURAL:$2|lunaku olwakayita|naku '''$2''' ezaakayita}}. Bino byategeerese ku ssaawa $5 nga $4.",
 'rclistfrom' => 'Laga enkyukakyuka empya ezikoledwa okuva $1',
index d86e3d1..f610349 100644 (file)
@@ -55,7 +55,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'Alle_berichte' ),
        'Allpages'                  => array( 'Alle_pagina\'s' ),
        'Ancientpages'              => array( 'Audste_pagina\'s' ),
-       'Blankpage'                 => array( 'Laege_pagina\'s' ),
+       'Blankpage'                 => array( 'Laeg_pagina\'s' ),
        'Block'                     => array( 'Blokkere' ),
        'Blockme'                   => array( 'Blokkeer_mich' ),
        'Booksources'               => array( 'Bookwinkele' ),
@@ -542,7 +542,9 @@ $2",
 De gegaeve ree is ''$2''.",
 'filereadonlyerror' => '\'t Waar neet meugelik óm \'t bestandj "$1" aan te passe went de bestandjsrepositoir "$2" steit noe op allein-laeze.
 
-d\'n Opgegaeve raej waar "\'\'$3\'\'".',
+d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Óngèljige titel mit naamruumdje "$2" en teks "$3"',
+'invalidtitle-unknownnamespace' => 'Óngèljige titel mit ónbekèndj naamruumdenómmer $1 en teks "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Slechte configuratie: onbekenge virusscanner: ''$1''",
@@ -628,6 +630,7 @@ e-mail óntvange veur alle volgende toepassinge.',
 'emailconfirmlink' => 'Bevèstig dien e-mailadres',
 'invalidemailaddress' => "'t E-mailadres is neet geaccepteerd omdet 't 'n ongeldige opmaak haet. Gaef a.u.b. 'n geldig e-mailadres op of laot 't veld laeg.",
 'cannotchangeemail' => 'E-mailadresse kinne neet waere verangerdj óp deze wiki.',
+'emaildisabled' => 'Dees site kin gein mails versjikke.',
 'accountcreated' => 'Gebroeker aangemaak',
 'accountcreatedtext' => 'De gebroeker $1 is aangemaak.',
 'createaccount-title' => 'Gebroekers aanmake veur {{SITENAME}}',
@@ -818,6 +821,7 @@ Lèt op: dien eige .css- en .js-pagina's beginne mèt  'ne klein lètter, beveur
 'updated' => '(Biegewèrk)',
 'note' => "'''Opmirking:'''",
 'previewnote' => "'''Lèt op: dit is 'n controlepagina; dien teks is nog neet opgesjlage!'''",
+'continue-editing' => 'Gank dórch mit bewirke',
 'previewconflict' => "Dees versie toent wie de tèks in 't bôvesjte vèld oet git zeen es e zouws opsjlaon.",
 'session_fail_preview' => "'''Sorry! Dien bewerking is neet verwerkt omdat sessiegegevens verlaore zeen gegaon.
 Probeer 't opnieuw. Als 't dan nog neet lukt, meldt dich dan aaf en weer aan.'''",
@@ -829,6 +833,7 @@ Probeer 't opnieuw. Als 't dan nog neet lukt, meldt dich dan aaf en weer aan.'''
 'token_suffix_mismatch' => "'''Dien bewerking is geweigerd omdat dien client de laesteikes in 't bewerkingstoken onjuist haet behandeld. De bewerking is geweigerd om verminking van de paginateks te veurkomme. Dit gebeurt soms es d'r een webgebaseerde proxydienst wurt gebroek die foute bevat.'''",
 'edit_form_incomplete' => "'''Sommige ongerdeile van 't bewerkingsformuleer höbbe de server neet bereik. Controleer of dien bewerkinge intak zien en perbeer 't obbenuits.'''",
 'editing' => 'Bewirkingspagina: $1',
+'creating' => '$1 aanmakendj',
 'editingsection' => 'Bewirke van sectie van $1',
 'editingcomment' => 'Bewirke $1 (commentair)',
 'editconflict' => 'Bewirkingsconflik: $1',
@@ -887,6 +892,7 @@ Ze lik eweggesjaf te zien.',
 'edit-no-change' => "Dien bewirking is genegeerd, ómdet d'r gein verangering in de teks is gemaak.",
 'edit-already-exists' => 'De pagina is neet aangemaak.
 Zie besjteit al.',
+'defaultmessagetext' => 'Obligaten teks',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' dees pagina gebroek te väöl kosbare parserfuncties.
@@ -902,6 +908,12 @@ Dees parameters zeen eweggelaote.",
 'parser-template-loop-warning' => "D'r is 'ne krinkloup in sjablone geconstateerd: [[$1]]",
 'parser-template-recursion-depth-warning' => 'De recursiedeepte veur sjablone is euversjrede ($1)',
 'language-converter-depth-warning' => 'De deepdjelimiet veure spraokómzètter is euversjreje ($1)',
+'node-count-exceeded-category' => "Pagina's wo 't maximaal aantal nodes te väöl is",
+'node-count-exceeded-warning' => "Oppe paasj is 't maximaal aantal nodes te väöl",
+'expansion-depth-exceeded-category' => "Pagina's wo de expansiedeepdje te väöl is",
+'expansion-depth-exceeded-warning' => 'De paasj haet te väöl sjablone',
+'parser-unstrip-loop-warning' => 'Unstriplus gevónje',
+'parser-unstrip-recursion-limit' => 'Unstriprecursielimiet te väöl ($1)',
 
 # "Undo" feature
 'undo-success' => "Hiej onger stuit de teks wo in de verangering ongedaon gemaak is. Controleer veur 't opslaon of 't resultaot gewins is.",
@@ -1047,7 +1059,7 @@ Controleer de logbeuk.",
 # Suppression log
 'suppressionlog' => 'Verbergingslogbook',
 'suppressionlogtext' => 'De ongerstaonde lies bevat de verwiederinge en blokkades die veur beheerders verborge zeen.
-In de [[Special:BlockList|IP-blokkeerlies]] zeen de hudige blokkades te bekieke.',
+In de [[Special:BlockList|blokkeerlies]] zeen de hudige blokkades te bekieke.',
 
 # History merging
 'mergehistory' => "Gesjiedenis van pagina's samevoege",
@@ -1079,8 +1091,9 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
 'mergelogpagetext' => "Hiejonger zuut geer 'ne lies van recente samevoeginge van 'ne paginagesjiedenis nao 'ne angere.",
 
 # Diffs
-'history-title' => 'Gesjiedenis van "$1"',
-'difference' => '(Versjil tösje bewirkinge)',
+'history-title' => '$1: bewèrkingseuverzich',
+'difference-title' => '$1 versjèl tösje versies',
+'difference-title-multipage' => "$1 en $2: versjèl tösje pagina's",
 'difference-multipage' => '(Versjil tösje paazjes)',
 'lineno' => 'Tekslien $1:',
 'compareselectedversions' => 'Vergeliek geselecteerde versies',
@@ -1179,6 +1192,7 @@ Mèrk op dat hun indexe van {{SITENAME}} content e bietje gedatierd kint zien.',
 'prefs-beta' => 'Bètadeil',
 'prefs-datetime' => 'Datum en tied',
 'prefs-labs' => 'Alfadeil',
+'prefs-user-pages' => "Gebroekerpagina's",
 'prefs-personal' => 'Gebroekersinfo',
 'prefs-rc' => 'Recènte verangeringe en weergaaf van sjtumpkes',
 'prefs-watchlist' => 'Volglies',
@@ -1442,7 +1456,7 @@ Deze informatie is zichbaar veur angere gebroekers.',
 'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkinge}}',
 'recentchanges' => 'Lètste verangeringe',
 'recentchanges-legend' => 'Opties veur recènte verangeringe',
-'recentchangestext' => 'op dees pagina kins doe de recènte verangeringe in deze wiki bekieke.',
+'recentchanges-summary' => 'Volg de recènste bewirkinge op deze wiki op dees pagina.',
 'recentchanges-feed-description' => 'Volg de meis recente bewerkinge in deze wiki via deze feed.',
 'recentchanges-label-newpage' => "Mit dees verangering is 'n nuuj pagina aangemaak",
 'recentchanges-label-minor' => "Dit is 'n klein bewirking",
@@ -1632,14 +1646,15 @@ Gank trök nao t [[Special:Upload/stash/$1|uploadformuleer]] om dit perbleem te
 'backend-fail-writetemp' => "'t Waes neet mäögelik nao 'n tiedelik besjtand te sjrieve.",
 'backend-fail-closetemp' => "'t Waes neet mäögelik 'n tiedelik besjtand te sjlete.",
 'backend-fail-read' => 'Kós bestjand $1 neet laeze.',
-'backend-fail-create' => 'Kós bestjand $1 neet aanmake.',
-'backend-fail-maxsize' => "'t Waar neet meugelik 't bestandj $1 aan te make went 't is grótter es {{PLURAL:$2|eine byte|$2 byte}}.",
+'backend-fail-create' => 'Kós bestandj $1 neet sjrieve.',
+'backend-fail-maxsize' => "'t Waar neet meugelik 't bestandj $1 te besjrieve went 't is grótter es {{PLURAL:$2|eine byte|$2 byte}}.",
 'backend-fail-readonly' => 'Vannen opslaag "$1" kin op dit memènt allein gelaeze waere. De opgegaeve raeje is: "$2"',
 'backend-fail-synced' => '\'t Bestandj "$1" bevindj zich in \'nen ónsamehangendje toestandj inne intern opslaagbackends.',
 'backend-fail-connect' => 'Kós de bestandjsbackend neet verbinje mitte opslaagbackend "$1".',
 'backend-fail-internal' => '\'n Ónbekèndje fout is ópgetaoje innen opslaagbackend "$1".',
 'backend-fail-contenttype' => 'Kós \'t inhawdtype van \'t bestnadj óm es "$1" op te slaon neet bepaole.',
 'backend-fail-batchsize' => 'Reiks van $1 {{PLURAL:$1|bestandjsoperatie|bestandjsoperaties}} in de opslaagbackend; de limiet is $2 {{PLURAL:$2|operatie|operaties}}.',
+'backend-fail-usable' => "Kós 't bestandj $1 neet besjraeve vanwaenge te mèn rèchte of aafwaezige mappe/kóntaeners.",
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kós neet verbinje mit de journaaldatabase veur de opslaagbackend "$1".',
@@ -1761,6 +1776,8 @@ d'r Is ouch ne [[Special:WhatLinksHere/$2|volledige lies]].",
 Bekiek de [$2 pagina mit de besjtandjsbesjrieving] veur mie infermasie.',
 'sharedupload-desc-here' => 'Dit besjtandj kump van $1 en kin ouch in anger projekte gebroek waere.
 De [$2 pagina mit de besjtandjsbesjrieving] wurt hiejónger weergegaeve.',
+'sharedupload-desc-edit' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
+'sharedupload-desc-create' => 'Dit bestandj kump van $1 en kin ouch in anger projekte gebroek waere. De kins de [$2 pagina mit bestandjsbesjrieving] dao bewirke.',
 'filepage-nofile' => 'dr Besteit gei bestandj mit deze naam.',
 'filepage-nofile-link' => 'dr Besteit gei bestandj mit deze naam, mer doe kins t [$1 uploade].',
 'uploadnewversion-linktext' => "Upload 'n nuuj versie van dit besjtand",
@@ -1955,6 +1972,7 @@ Controleer of se wellich n fout höbs gemaak bie de inveur.',
 'alllogstext' => "Dit is 't gecombineerd logbook ven {{SITENAME}}. De kins ouch 'n bepaald logbook keze, of filtere op gebroekersnaam of  pazjena, beide huidlettergeveulig.",
 'logempty' => "d'r Zeen gein regels in 't logbook die voldaon aan deze criteria.",
 'log-title-wildcard' => "Zeuk pagina's die met deze naam beginne",
+'showhideselectedlogentries' => 'Tuin of verstaek geselecteerdje logbookregels',
 
 # Special:AllPages
 'allpages' => "Alle pagina's",
@@ -1972,6 +1990,12 @@ Controleer of se wellich n fout höbs gemaak bie de inveur.',
 'allpagesprefix' => "Betrach pazjena's mit 't veurvoogsel:",
 'allpagesbadtitle' => "De opgegaeve paginanaam is ongeldig of haj 'n intertaal of interwiki veurvoegsel. Meugelik bevatte de naam karakters die neet gebroek moge waere in paginanäöm.",
 'allpages-bad-ns' => '{{SITENAME}} haet gein naamruumde mit de naam "$1".',
+'allpages-hide-redirects' => 'Verbèrg redireks',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "De bekieks 'ne paginacache dae maximaal $1 aad is.",
+'cachedspecial-viewing-cached-ts' => "De bekieks 'ne paginacache dae muuegelik neet gans biegewirk is.",
+'cachedspecial-refresh-now' => 'Tuin lèste.',
 
 # Special:Categories
 'categories' => 'Categorieë',
@@ -2450,7 +2474,7 @@ Zuug de [[Special:BlockList|lies van geblokkeerde IP-adresse]].',
 'blocklog-showsuppresslog' => "Deze gebroeker is al geblok gewaes en d'r zeen (deil van) bewerkinge van deze gebroeker verbórge. 't Verbèrgingslogbook steit hieónger:",
 'blocklogentry' => '"[[$1]]" is geblokkeerd veur d\'n tied van $2 $3',
 'reblock-logentry' => 'haet de instellinge veur de blokkaasj veur [[$1]] gewiezig. Deze verlöp noe op $2 om $3',
-'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde IP-adresse]] veur de lies van op dit mement wèrkende blokkades.",
+'blocklogtext' => "Dit is 'n log van blokkades van gebroekers. Automatisch geblokkeerde IP-adresse sjtoon hie neet bie. Zuug de [[Special:BlockList|Lies van geblokkeerde adresse]] veur de lies van op dit mement wèrkende blokkades.",
 'unblocklogentry' => 'blokkade van $1 opgeheve',
 'block-log-flags-anononly' => 'allein anoniem',
 'block-log-flags-nocreate' => 'aanmake gebroekers geblokkeerd',
@@ -2854,7 +2878,7 @@ $1",
 
 # Media information
 'mediawarning' => "'''Waorsjuwing''': Dit bestandj kin 'n anger kood höbbe, door 't te doorveure in dien systeem kin 't gecompromeerde dinger oplevere.",
-'imagemaxsize' => "Meximale aafbeildjingsaafmaeting:<b r/>''(veur besjrievingspaasj)''",
+'imagemaxsize' => "Meximaal aafbeildjingsaafmaeting:<br />''(veur besjrievingspaasj)''",
 'thumbsize' => 'Gruutde vanne thumbnail:',
 'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pazjena|pazjena's}}",
 'file-info' => 'bestandsgruutde: $1, MIME-type: $2',
@@ -3499,6 +3523,9 @@ Same mit dit programma heurs se 'n [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van d
 'version-software' => 'Geïnstallieërde sofwaer',
 'version-software-product' => 'Perduk',
 'version-software-version' => 'Versie',
+'version-entrypoints' => 'Ingang-URLs',
+'version-entrypoints-header-entrypoint' => 'Ingank',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Bestandjspaad',
@@ -3687,4 +3714,15 @@ Anges kin se-n ouch \'t einvawdig formeleer hieónger gebroeke. Dien commentaar
 'api-error-uploaddisabled' => 'Upload steit oet óp deze wiki.',
 'api-error-verification-error' => "Dit bestandj is meugelik besjadig of haet 'n ónjuuste extensie.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekond|sekond}}',
+'duration-minutes' => '$1 {{PLURAL:$1|menuut|menuut}}',
+'duration-hours' => '$1 {{PLURAL:$1|oer|oer}}',
+'duration-days' => '$1 {{PLURAL:$1|daag|daag}}',
+'duration-weeks' => '$1 {{PLURAL:$1|waek|waek}}',
+'duration-years' => '$1 {{PLURAL:$1|jaor|jaor}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|ieëf|ieëf}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
 );
index 5bd9c85..8d0a9cd 100644 (file)
@@ -584,7 +584,6 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 
 # Diffs
 'history-title' => 'Stöia de revixoìn de "$1"',
-'difference' => '(Differense fra e revixoîn)',
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Confronta e verscioîn selessionæ',
 'editundo' => 'Anùlla',
@@ -666,7 +665,7 @@ Leggenda: (corr) = differense co-a verscion corrente, (prec) = differense co-a v
 'nchanges' => '$1 {{PLURAL:$1|modiffica|modiffiche}}',
 'recentchanges' => 'Ùrtimi cangiamenti',
 'recentchanges-legend' => 'Inpostaçioìn de lìùrtimi cangiaménti',
-'recentchangestext' => "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
+'recentchanges-summary' => "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-feed-description' => "Questo feed o g'ha di cangiaménti ciù reçenti a-i contegnûi do scîto.",
 'recentchanges-label-newpage' => "Sto cangiaménto o l'à creòu 'na pàgina nêuva",
 'recentchanges-label-minor' => 'Cangiamento minô (m)',
index ec1607a..141c05e 100644 (file)
@@ -307,7 +307,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 
 # Diffs
 'history-title' => 'Līed "$1" mõitõkst istōrij',
-'difference' => '(Vaiţīd redaktsijõd vail)',
 'lineno' => 'Rīnda $1:',
 'compareselectedversions' => 'Līdzinţ vēļdõt redaktsijḑi',
 'editundo' => 'kištānt jarā',
@@ -384,7 +383,7 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 'nchanges' => '$1 {{PLURAL:$1|mõitõks|mõitõkst}}',
 'recentchanges' => 'Perrizt mõitõkst',
 'recentchanges-legend' => 'Perrizt mõitõkst',
-'recentchangestext' => 'Vaņ sīe līed pǟl tīedõd perīži mõitõkši.',
+'recentchanges-summary' => 'Vaņ sīe līed pǟl tīedõd perīži mõitõkši.',
 'recentchanges-feed-description' => 'Vaņ iļ vikipēdijõz tīedõd perīži mõitõkši.',
 'recentchanges-label-newpage' => 'Se mõitõks luoi ūd līed',
 'recentchanges-label-minor' => 'Se um ikš piški parāmtimi',
index 91aac02..1625953 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lumbaart (Lumbaart)
+/** lumbaart (lumbaart)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -12,6 +12,7 @@
  * @author Dakrismeno
  * @author DracoRoboter
  * @author Flavio05
+ * @author GatoSelvadego
  * @author Insübrich
  * @author Kemmótar
  * @author Malafaya
@@ -591,7 +592,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 
 # Diffs
 'history-title' => 'Cronolugia di mudifegh de "$1"',
-'difference' => '(Diferenz intra i revisión)',
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Compara i versión seleziunaa',
 'editundo' => "turna a 'me che l'era",
@@ -739,7 +739,7 @@ Pröa a giuntagh denanz a la tò ricerca ''all:'' per cercà in tücc i namespac
 'nchanges' => '$1 {{PLURAL:$1|mudifega|mudifegh}}',
 'recentchanges' => 'Cambiament recent',
 'recentchanges-legend' => 'Upzión ültem mudifegh',
-'recentchangestext' => "In quela pagina chì a gh'è i cambiament püssee recent al cuntegnüü del sit.",
+'recentchanges-summary' => "In quela pagina chì a gh'è i cambiament püssee recent al cuntegnüü del sit.",
 'recentchanges-feed-description' => "Quel feed chì 'l mustra i mudifegh püssee recent ai cuntegnüü de la wiki.",
 'recentchanges-label-newpage' => "Quela mudifega chì l'ha creaa una pagina növa",
 'recentchanges-label-minor' => "Quela chì l'è una mudifega piscinina.",
@@ -1364,6 +1364,9 @@ Te riçevaree un mesacc cun deent un ligamm specjal; ti duvaree clicaa sül liga
 'watchlisttools-edit' => 'Varda e mudifega la lista di paginn che te tegnet sut ögg',
 'watchlisttools-raw' => 'Mudifega la lista in furmaa test',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciciarade]])',
+
 # Special:Version
 'version' => 'Versiun',
 
index 14fcf89..9597ca9 100644 (file)
@@ -21,292 +21,292 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $messages = array(
 # User preference toggles
-'tog-underline'        => 'Kotíya sulimá na bikangisi:',
-'tog-showtoolbar'      => 'Komɔ́nisa ndámbo-ndámbo (esengélí JavaScript)',
+'tog-underline' => 'Kotíya sulimá na bikangisi:',
+'tog-showtoolbar' => 'Komɔ́nisa ndámbo-ndámbo (esengélí JavaScript)',
 'tog-rememberpassword' => 'Komíkundola bokitoli na molúki (ekosúkisa na {{PLURAL:$1|mokɔlɔ|mikɔlɔ}} $1)',
 
 # Dates
-'sunday'        => 'Lomíngo',
-'monday'        => 'mokɔlɔ ya libosó',
-'tuesday'       => 'mokɔlɔ ya míbalé',
-'wednesday'     => 'mokɔlɔ ya mísáto',
-'thursday'      => 'mokɔlɔ ya mínei',
-'friday'        => 'mokɔlɔ ya mítáno',
-'saturday'      => 'Mpɔ́sɔ',
-'sun'           => 'Lom',
-'mon'           => 'Mɔ̌k',
-'tue'           => 'Míb',
-'wed'           => 'Mís',
-'thu'           => 'Mín',
-'fri'           => 'Mít',
-'sat'           => 'Mpɔ́',
-'january'       => 'sánzá ya yambo',
-'february'      => 'sánzá ya míbalé',
-'march'         => 'sánzá ya mísáto',
-'april'         => 'sánzá ya mínei',
-'may_long'      => 'sánzá ya mítáno',
-'june'          => 'sánzá ya motóbá',
-'july'          => 'sánzá ya nsambo',
-'august'        => 'sánzá ya mwambe',
-'september'     => 'sánzá ya libwá',
-'october'       => 'sánzá ya zómi',
-'november'      => 'sánzá ya zómi na mɔ̌kɔ́',
-'december'      => 'sánzá ya zómi na míbalé',
-'january-gen'   => 'sánzá ya yambo',
-'february-gen'  => 'sánzá ya míbalé',
-'march-gen'     => 'sánzá ya mísáto',
-'april-gen'     => 'sánzá ya mínei',
-'may-gen'       => 'sánzá ya mítáno',
-'june-gen'      => 'sánzá ya motóbá',
-'july-gen'      => 'sánzá ya nsambo',
-'august-gen'    => 'sánzá ya mwambe',
+'sunday' => 'Lomíngo',
+'monday' => 'mokɔlɔ ya libosó',
+'tuesday' => 'mokɔlɔ ya míbalé',
+'wednesday' => 'mokɔlɔ ya mísáto',
+'thursday' => 'mokɔlɔ ya mínei',
+'friday' => 'mokɔlɔ ya mítáno',
+'saturday' => 'Mpɔ́sɔ',
+'sun' => 'Lom',
+'mon' => 'Mɔ̌k',
+'tue' => 'Míb',
+'wed' => 'Mís',
+'thu' => 'Mín',
+'fri' => 'Mít',
+'sat' => 'Mpɔ́',
+'january' => 'sánzá ya yambo',
+'february' => 'sánzá ya míbalé',
+'march' => 'sánzá ya mísáto',
+'april' => 'sánzá ya mínei',
+'may_long' => 'sánzá ya mítáno',
+'june' => 'sánzá ya motóbá',
+'july' => 'sánzá ya nsambo',
+'august' => 'sánzá ya mwambe',
+'september' => 'sánzá ya libwá',
+'october' => 'sánzá ya zómi',
+'november' => 'sánzá ya zómi na mɔ̌kɔ́',
+'december' => 'sánzá ya zómi na míbalé',
+'january-gen' => 'sánzá ya yambo',
+'february-gen' => 'sánzá ya míbalé',
+'march-gen' => 'sánzá ya mísáto',
+'april-gen' => 'sánzá ya mínei',
+'may-gen' => 'sánzá ya mítáno',
+'june-gen' => 'sánzá ya motóbá',
+'july-gen' => 'sánzá ya nsambo',
+'august-gen' => 'sánzá ya mwambe',
 'september-gen' => 'sánzá ya libwá',
-'october-gen'   => 'sánzá ya zómi',
-'november-gen'  => 'sánzá ya zómi na mɔ̌kɔ́',
-'december-gen'  => 'sánzá ya zómi na míbalé',
-'jan'           => 's1',
-'feb'           => 's2',
-'mar'           => 's3',
-'apr'           => 's4',
-'may'           => 's4',
-'jun'           => 's5',
-'jul'           => 's7',
-'aug'           => 's8',
-'sep'           => 's9',
-'oct'           => 's10',
-'nov'           => 's11',
-'dec'           => 's12',
+'october-gen' => 'sánzá ya zómi',
+'november-gen' => 'sánzá ya zómi na mɔ̌kɔ́',
+'december-gen' => 'sánzá ya zómi na míbalé',
+'jan' => 's1',
+'feb' => 's2',
+'mar' => 's3',
+'apr' => 's4',
+'may' => 's4',
+'jun' => 's5',
+'jul' => 's7',
+'aug' => 's8',
+'sep' => 's9',
+'oct' => 's10',
+'nov' => 's11',
+'dec' => 's12',
 
 # Categories related messages
-'pagecategories'        => '{{PLURAL:$1|Katégoli|Katégoli}}',
-'category_header'       => 'Nkásá o molɔngɔ́ ya bilɔkɔ ya loléngé mɔ̌kɔ́ « $1 »',
-'subcategories'         => 'Ndéngé-bǎna',
+'pagecategories' => '{{PLURAL:$1|Katégoli|Katégoli}}',
+'category_header' => 'Nkásá o molɔngɔ́ ya bilɔkɔ ya loléngé mɔ̌kɔ́ « $1 »',
+'subcategories' => 'Ndéngé-bǎna',
 'category-media-header' => 'Media in category "$1"',
-'category-empty'        => "''Loléngé loye ezalí na ekakola tɛ̂, loléngé-mwǎna tɛ̂ tǒ nkásá mitímediá tɛ̂.''",
+'category-empty' => "''Loléngé loye ezalí na ekakola tɛ̂, loléngé-mwǎna tɛ̂ tǒ nkásá mitímediá tɛ̂.''",
 
-'about'      => 'elɔ́kɔ elobámí',
-'article'    => 'ekakoli',
-'newwindow'  => '(ekofúngola na lininísa lya sika)',
-'cancel'     => 'Kozóngela',
-'mytalk'     => 'Ntembe na ngáí',
+'about' => 'elɔ́kɔ elobámí',
+'article' => 'ekakoli',
+'newwindow' => '(ekofúngola na lininísa lya sika)',
+'cancel' => 'Kozóngela',
+'mytalk' => 'Ntembe na ngáí',
 'navigation' => 'Botamboli',
-'and'        => '&#32;mpé',
+'and' => '&#32;mpé',
 
 # Cologne Blue skin
-'qbfind'         => 'Koluka',
-'qbbrowse'       => 'Kolúka',
-'qbedit'         => 'Kobɔngisa',
-'qbpageinfo'     => 'Context',
+'qbfind' => 'Koluka',
+'qbbrowse' => 'Kolúka',
+'qbedit' => 'Kobɔngisa',
+'qbpageinfo' => 'Context',
 'qbspecialpages' => 'Nkásá gudi',
-'faq'            => 'Mitúná Mizóngelaka (MM)',
+'faq' => 'Mitúná Mizóngelaka (MM)',
 
 # Vector skin
-'vector-action-addsection'       => 'Kobakisa mpɔ̂',
-'vector-action-delete'           => 'Kolímwisa',
-'vector-action-move'             => 'Kobóngola nkómbó',
-'vector-action-protect'          => 'Kobátela',
-'vector-action-undelete'         => 'Kolímwisa tɛ̂',
-'vector-action-unprotect'        => ' Kobátela tɛ̂',
+'vector-action-addsection' => 'Kobakisa mpɔ̂',
+'vector-action-delete' => 'Kolímwisa',
+'vector-action-move' => 'Kobóngola nkómbó',
+'vector-action-protect' => 'Kobátela',
+'vector-action-undelete' => 'Kolímwisa tɛ̂',
+'vector-action-unprotect' => ' Kobátela tɛ̂',
 'vector-simplesearch-preference' => 'Kolamusa bokáni bwa boluki bobakísámí (káka na Vector)',
-'vector-view-create'             => 'Kokela',
-'vector-view-edit'               => 'Kobɔngisa',
-'vector-view-history'            => 'Komɔ́nisa mokóló',
-'vector-view-view'               => 'Kotánga',
-'vector-view-viewsource'         => 'Komɔ́nisa mosólo',
-'namespaces'                     => 'Ntáká ya nkómbó',
-
-'errorpagetitle'    => 'Mbéba',
-'returnto'          => 'Kozóngisa na $1.',
-'tagline'           => 'Útá {{SITENAME}}.',
-'help'              => 'Bosálisi',
-'search'            => 'Boluki',
-'searchbutton'      => 'Boluki',
-'go'                => 'Kokɛndɛ',
-'searcharticle'     => 'Kokɛndɛ',
-'history'           => 'Mokóló mwa lonkásá',
-'history_short'     => 'Mokóló',
-'printableversion'  => 'Mpɔ̂ na kofínela',
-'permalink'         => 'Ekangeli ya ntángo yɔ́nsɔ',
-'print'             => 'kobimisa nkomá',
-'view'              => 'Komɔ́nisa',
-'edit'              => 'kobɔngisa',
-'create'            => 'Kokela',
-'editthispage'      => 'Kokoma lonkásá óyo',
-'create-this-page'  => 'Kokela lonkásá loye',
-'delete'            => 'Kolímwisa',
-'deletethispage'    => 'Kolímwisa lonkásá loye',
-'protect'           => 'Kobátela',
-'protect_change'    => 'kobóngola',
-'protectthispage'   => 'Kobátela lonkásá loye',
-'unprotect'         => 'Kobátela tɛ̂',
+'vector-view-create' => 'Kokela',
+'vector-view-edit' => 'Kobɔngisa',
+'vector-view-history' => 'Komɔ́nisa mokóló',
+'vector-view-view' => 'Kotánga',
+'vector-view-viewsource' => 'Komɔ́nisa mosólo',
+'namespaces' => 'Ntáká ya nkómbó',
+
+'errorpagetitle' => 'Mbéba',
+'returnto' => 'Kozóngisa na $1.',
+'tagline' => 'Útá {{SITENAME}}.',
+'help' => 'Bosálisi',
+'search' => 'Boluki',
+'searchbutton' => 'Boluki',
+'go' => 'Kokɛndɛ',
+'searcharticle' => 'Kokɛndɛ',
+'history' => 'Mokóló mwa lonkásá',
+'history_short' => 'Mokóló',
+'printableversion' => 'Mpɔ̂ na kofínela',
+'permalink' => 'Ekangeli ya ntángo yɔ́nsɔ',
+'print' => 'kobimisa nkomá',
+'view' => 'Komɔ́nisa',
+'edit' => 'kobɔngisa',
+'create' => 'Kokela',
+'editthispage' => 'Kokoma lonkásá óyo',
+'create-this-page' => 'Kokela lonkásá loye',
+'delete' => 'Kolímwisa',
+'deletethispage' => 'Kolímwisa lonkásá loye',
+'protect' => 'Kobátela',
+'protect_change' => 'kobóngola',
+'protectthispage' => 'Kobátela lonkásá loye',
+'unprotect' => 'Kobátela tɛ̂',
 'unprotectthispage' => 'Kobátela lonkásá loye tɛ̂',
-'newpage'           => 'Lonkásá la sika',
-'talkpage'          => 'Ntembe ya lonkásá loye',
-'talkpagelinktext'  => 'Ntembe',
-'specialpage'       => 'Lonkásá gudi',
-'personaltools'     => 'Bisáleli ya moto-mɛ́i',
-'articlepage'       => 'Komɔ́nisa káti',
-'talk'              => 'Ntembe',
-'views'             => 'Bomɔ́nisi',
-'toolbox'           => 'Bisáleli',
-'userpage'          => 'Komɔ́nisa lonkásá la mosáleli',
-'projectpage'       => 'Komɔ́nisa lonkásá la mwǎngo',
-'imagepage'         => 'Komɔ́nisa lonkásá la kásá',
-'viewhelppage'      => 'Komɔ́nisa lonkásá la bosálisi',
-'categorypage'      => 'Komɔ́nisa lonkásá la katégori',
-'otherlanguages'    => 'Na nkótá isúsu',
-'redirectedfrom'    => '(Eyendísí útá $1)',
-'redirectpagesub'   => 'Lonkásá la boyendisi',
-'lastmodifiedat'    => 'Lonkásá loye lobóngwámí o mokɔlɔ $1, ngonga $2.',
-'protectedpage'     => 'Lonkásá lobátélámí',
-'jumpto'            => 'Kokɛndɛ na:',
-'jumptonavigation'  => 'bolúki',
-'jumptosearch'      => 'boluki',
+'newpage' => 'Lonkásá la sika',
+'talkpage' => 'Ntembe ya lonkásá loye',
+'talkpagelinktext' => 'Ntembe',
+'specialpage' => 'Lonkásá gudi',
+'personaltools' => 'Bisáleli ya moto-mɛ́i',
+'articlepage' => 'Komɔ́nisa káti',
+'talk' => 'Ntembe',
+'views' => 'Bomɔ́nisi',
+'toolbox' => 'Bisáleli',
+'userpage' => 'Komɔ́nisa lonkásá la mosáleli',
+'projectpage' => 'Komɔ́nisa lonkásá la mwǎngo',
+'imagepage' => 'Komɔ́nisa lonkásá la kásá',
+'viewhelppage' => 'Komɔ́nisa lonkásá la bosálisi',
+'categorypage' => 'Komɔ́nisa lonkásá la katégori',
+'otherlanguages' => 'Na nkótá isúsu',
+'redirectedfrom' => '(Eyendísí útá $1)',
+'redirectpagesub' => 'Lonkásá la boyendisi',
+'lastmodifiedat' => 'Lonkásá loye lobóngwámí o mokɔlɔ $1, ngonga $2.',
+'protectedpage' => 'Lonkásá lobátélámí',
+'jumpto' => 'Kokɛndɛ na:',
+'jumptonavigation' => 'bolúki',
+'jumptosearch' => 'boluki',
 
 # 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'            => 'Elɔ́kɔ elobí {{SITENAME}}',
-'aboutpage'            => 'Project:Etalí',
-'copyright'            => 'Maloba ma nkomá mazalí na ndingisa ya $1.',
-'copyrightpage'        => '{{ns:project}}:Mikokisi',
-'currentevents'        => 'Elɔ́kɔ ya sika',
-'disclaimers'          => 'Ndelo ya boyanoli',
-'disclaimerpage'       => 'Project:Boyanoli ndelo',
-'edithelp'             => 'Kobimisela bosálisi',
-'edithelppage'         => 'Help:Libɔngeli',
-'mainpage'             => 'Lonkásá ya libosó',
+'aboutsite' => 'Elɔ́kɔ elobí {{SITENAME}}',
+'aboutpage' => 'Project:Etalí',
+'copyright' => 'Maloba ma nkomá mazalí na ndingisa ya $1.',
+'copyrightpage' => '{{ns:project}}:Mikokisi',
+'currentevents' => 'Elɔ́kɔ ya sika',
+'disclaimers' => 'Ndelo ya boyanoli',
+'disclaimerpage' => 'Project:Boyanoli ndelo',
+'edithelp' => 'Kobimisela bosálisi',
+'edithelppage' => 'Help:Libɔngeli',
+'mainpage' => 'Lonkásá ya libosó',
 'mainpage-description' => 'Lokásá ya libosó',
-'portal'               => 'Bísó na bísó',
-'privacy'              => 'Politíki ya viplívɛ',
-'privacypage'          => 'Project:Politíki ya viplívɛ',
+'portal' => 'Bísó na bísó',
+'privacy' => 'Politíki ya viplívɛ',
+'privacypage' => 'Project:Politíki ya viplívɛ',
 
-'ok'                 => 'Nandimi',
-'retrievedfrom'      => 'Ezwámí úta «$1»',
+'ok' => 'Nandimi',
+'retrievedfrom' => 'Ezwámí úta «$1»',
 'youhavenewmessages' => 'Ozweí $1 ($2).',
-'newmessageslink'    => 'nsango ya sika',
-'editsection'        => 'kobɔngisa',
-'editold'            => 'kobɔngisa',
-'viewsourceold'      => 'Komɔ́nisa mosólo',
-'editlink'           => 'kobɔngisa',
-'viewsourcelink'     => 'komɔ́nisa mosólo',
-'editsectionhint'    => 'Kokoma sɛksíɔ: $1',
-'toc'                => 'Etápe',
-'showtoc'            => 'komɔ́nisa',
-'hidetoc'            => 'kobomba',
-'feedlinks'          => 'Ebale:',
-'site-rss-feed'      => 'Ebale RSS ya $1',
-'site-atom-feed'     => 'Ebale Atom ya «$1»',
-'page-rss-feed'      => 'Ebale RSS ya «$1»',
-'page-atom-feed'     => 'Ebale Atom ya «$1»',
-'red-link-title'     => '$1 (lonkásá  ezalí tɛ̂)',
+'newmessageslink' => 'nsango ya sika',
+'editsection' => 'kobɔngisa',
+'editold' => 'kobɔngisa',
+'viewsourceold' => 'Komɔ́nisa mosólo',
+'editlink' => 'kobɔngisa',
+'viewsourcelink' => 'komɔ́nisa mosólo',
+'editsectionhint' => 'Kokoma sɛksíɔ: $1',
+'toc' => 'Etápe',
+'showtoc' => 'komɔ́nisa',
+'hidetoc' => 'kobomba',
+'feedlinks' => 'Ebale:',
+'site-rss-feed' => 'Ebale RSS ya $1',
+'site-atom-feed' => 'Ebale Atom ya «$1»',
+'page-rss-feed' => 'Ebale RSS ya «$1»',
+'page-atom-feed' => 'Ebale Atom ya «$1»',
+'red-link-title' => '$1 (lonkásá  ezalí tɛ̂)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'lonkásá',
-'nstab-user'      => 'Lonkásá la mosáleli',
-'nstab-media'     => 'Mediá',
-'nstab-special'   => 'Lonkásá gudi',
-'nstab-project'   => 'Etalí',
-'nstab-image'     => 'Kásá',
+'nstab-main' => 'lonkásá',
+'nstab-user' => 'Lonkásá la mosáleli',
+'nstab-media' => 'Mediá',
+'nstab-special' => 'Lonkásá gudi',
+'nstab-project' => 'Etalí',
+'nstab-image' => 'Kásá',
 'nstab-mediawiki' => 'Liyébísí',
-'nstab-template'  => 'Emekisele',
-'nstab-help'      => 'Lonkásá ya lisálisi',
-'nstab-category'  => 'Katégori',
+'nstab-template' => 'Emekisele',
+'nstab-help' => 'Lonkásá ya lisálisi',
+'nstab-category' => 'Katégori',
 
 # Main script and global functions
-'nosuchaction'      => 'Ekelá eyébani tɛ̂',
+'nosuchaction' => 'Ekelá eyébani tɛ̂',
 'nosuchspecialpage' => 'Lonkásá gudi lwangó lozalí tɛ̂',
 'nospecialpagetext' => '<strong>Otúní lonkásá gudi kasi yangó ezalí tɛ̂.</strong>
 
 Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error'              => 'Mbéba',
-'databaseerror'      => 'Zíko ya litákoli ya kabo',
-'laggedslavemode'    => "'''Likébisi''': lonkásá óyo ekokí kokwa mbóngwana ya nsúka nyɔ́nsɔ tɛ̂",
-'readonly'           => 'Litákoli ya kabo efúngámí',
-'enterlockreason'    => 'Ópésa ntína mpé ntángo ya kokanisa ya bofúngi ya litákoli ya kabo',
-'internalerror'      => 'Zíko ya káti',
+'error' => 'Mbéba',
+'databaseerror' => 'Zíko ya litákoli ya kabo',
+'laggedslavemode' => "'''Likébisi''': lonkásá óyo ekokí kokwa mbóngwana ya nsúka nyɔ́nsɔ tɛ̂",
+'readonly' => 'Litákoli ya kabo efúngámí',
+'enterlockreason' => 'Ópésa ntína mpé ntángo ya kokanisa ya bofúngi ya litákoli ya kabo',
+'internalerror' => 'Zíko ya káti',
 'internalerror_info' => 'Zíko ya káti: $1',
-'perfcached'         => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lɛlɔ́ tɛ̂. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts'       => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lɛlɔ́ tɛ̂. Bizalí bya $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'viewsource'         => 'Komɔ́nisa mosólo',
+'perfcached' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lɛlɔ́ tɛ̂. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Bipeseli byangó bizalí o mobómbisi-lombángu mpé bikokí kozala ya lɛlɔ́ tɛ̂. Bizalí bya $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'viewsource' => 'Komɔ́nisa mosólo',
 
 # Login and logout pages
-'yourname'                => 'Nkómbó ya mosáleli:',
-'yourpassword'            => 'Banda nayó:',
-'yourpasswordagain'       => 'Banda naíno:',
-'remembermypassword'      => 'Mɛ́i-komíkitola na molúki moye mbala ilandí (ekosúkisa na {{PLURAL:$1|mokɔlɔ|mikɔlɔ}} $1)',
-'login'                   => 'komíkitola (log in)',
+'yourname' => 'Nkómbó ya mosáleli:',
+'yourpassword' => 'Banda nayó:',
+'yourpasswordagain' => 'Banda naíno:',
+'remembermypassword' => 'Mɛ́i-komíkitola na molúki moye mbala ilandí (ekosúkisa na {{PLURAL:$1|mokɔlɔ|mikɔlɔ}} $1)',
+'login' => 'komíkitola (log in)',
 'nav-login-createaccount' => 'Komíkomisa tǒ kokɔtɔ',
-'userlogin'               => 'Komíkomisa tǒ komíkitola',
-'userloginnocreate'       => 'komíkitola (log in)',
-'logout'                  => 'kolongwa',
-'userlogout'              => 'Kolongwa',
-'nologin'                 => "Omíkomísí naíno tɛ̂? '''$1'''.",
-'nologinlink'             => 'Míkomísá yɔ̌-mɛ́i',
-'gotaccount'              => "Omíkomísí naíno ? '''$1'''.",
-'gotaccountlink'          => 'komíkitola (log in)',
-'createaccountmail'       => 'na mokánda',
-'createaccountreason'     => 'Ntína:',
-'mailmypassword'          => 'Kotíndisa liloba-nzelá lya sika na mɛ́lɛ',
-'loginlanguagelabel'      => 'Lokótá: $1',
+'userlogin' => 'Komíkomisa tǒ komíkitola',
+'userloginnocreate' => 'komíkitola (log in)',
+'logout' => 'kolongwa',
+'userlogout' => 'Kolongwa',
+'nologin' => "Omíkomísí naíno tɛ̂? '''$1'''.",
+'nologinlink' => 'Míkomísá yɔ̌-mɛ́i',
+'gotaccount' => "Omíkomísí naíno ? '''$1'''.",
+'gotaccountlink' => 'komíkitola (log in)',
+'createaccountmail' => 'na mokánda',
+'createaccountreason' => 'Ntína:',
+'mailmypassword' => 'Kotíndisa liloba-nzelá lya sika na mɛ́lɛ',
+'loginlanguagelabel' => 'Lokótá: $1',
 
 # Change password dialog
-'oldpassword'             => 'Banda kala',
-'newpassword'             => 'Banda sika',
+'oldpassword' => 'Banda kala',
+'newpassword' => 'Banda sika',
 'resetpass-submit-cancel' => 'Kozóngela',
 
 # Special:PasswordReset
 'passwordreset-username' => 'Nkómbó ya mosáleli:',
-'passwordreset-email'    => 'Adɛlɛ́sɛ-ímɛ́lɛ:',
+'passwordreset-email' => 'Adɛlɛ́sɛ-ímɛ́lɛ:',
 
 # Edit page toolbar
-'bold_sample'     => 'Nkomá ya mbinga',
-'bold_tip'        => 'Nkomá ya mbinga',
-'italic_sample'   => 'Nkomá ya kotɛ́ngama',
-'italic_tip'      => 'Nkomá ya kotɛ́ngama',
-'link_sample'     => 'Títɛlɛ ya ekangisele',
-'extlink_sample'  => 'http://www.example.com Litɛ́mɛ ya ekangisi',
-'extlink_tip'     => 'Ekangisele na libándá (óbósana http:// o libóso tɛ̂)',
+'bold_sample' => 'Nkomá ya mbinga',
+'bold_tip' => 'Nkomá ya mbinga',
+'italic_sample' => 'Nkomá ya kotɛ́ngama',
+'italic_tip' => 'Nkomá ya kotɛ́ngama',
+'link_sample' => 'Títɛlɛ ya ekangisele',
+'extlink_sample' => 'http://www.example.com Litɛ́mɛ ya ekangisi',
+'extlink_tip' => 'Ekangisele na libándá (óbósana http:// o libóso tɛ̂)',
 'headline_sample' => 'Nkomá ya litɛ́mɛ',
-'headline_tip'    => 'Litɛ́mɛ ya emeko 2',
-'image_tip'       => 'Kásá eyíngísámí',
-'media_tip'       => 'Ekangisele ya kásá',
-'hr_tip'          => 'Monkɔ́lɔ́tɔ́ molálí sémba (kosálela mwâ mokɛ́)',
+'headline_tip' => 'Litɛ́mɛ ya emeko 2',
+'image_tip' => 'Kásá eyíngísámí',
+'media_tip' => 'Ekangisele ya kásá',
+'hr_tip' => 'Monkɔ́lɔ́tɔ́ molálí sémba (kosálela mwâ mokɛ́)',
 
 # Edit pages
-'summary'                => 'Likwé ya mokusé:',
-'subject'                => 'Mokonza/litɛ́mɛ:',
-'minoredit'              => 'Ezalí mbóngwana ya mokɛ́',
-'watchthis'              => 'Kolanda lonkásá óyo',
-'savearticle'            => 'kobómbisa lonkásá',
-'preview'                => 'Botáli',
-'showpreview'            => 'Kotála yambo',
-'showdiff'               => 'Komɔ́nisa mbóngwana',
-'newarticle'             => '(Sika)',
-'editing'                => 'Kokoma «$1»',
-'editingsection'         => 'Bobɔngisi ya «$1» (sɛksió)',
-'editingcomment'         => 'Bobɔngisi ya «$1» (sɛksió ya sika)',
-'yourtext'               => 'Nkomá na yɔ̌',
-'templatesused'          => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o lonkásá óyo:',
-'templatesusedpreview'   => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o botáli boye:',
-'template-protected'     => '(na bobáteli)',
+'summary' => 'Likwé ya mokusé:',
+'subject' => 'Mokonza/litɛ́mɛ:',
+'minoredit' => 'Ezalí mbóngwana ya mokɛ́',
+'watchthis' => 'Kolanda lonkásá óyo',
+'savearticle' => 'kobómbisa lonkásá',
+'preview' => 'Botáli',
+'showpreview' => 'Kotála yambo',
+'showdiff' => 'Komɔ́nisa mbóngwana',
+'newarticle' => '(Sika)',
+'editing' => 'Kokoma «$1»',
+'editingsection' => 'Bobɔngisi ya «$1» (sɛksió)',
+'editingcomment' => 'Bobɔngisi ya «$1» (sɛksió ya sika)',
+'yourtext' => 'Nkomá na yɔ̌',
+'templatesused' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o lonkásá óyo:',
+'templatesusedpreview' => '{{PLURAL:$1|Emekisele esálélí|Bimekisele bisálélí}} o botáli boye:',
+'template-protected' => '(na bobáteli)',
 'template-semiprotected' => '(na bobáteli ya ndámbo)',
 
 # History pages
-'viewpagelogs'        => 'Komɔ́nisa zuluná ya lonkásá loye',
-'currentrev'          => 'Lizóngeli na mosálá',
-'revisionasof'        => 'Lizóngeli ya $1',
-'previousrevision'    => '← Lizóngeli lilekí',
-'nextrevision'        => 'Lizóngeli lilandí →',
+'viewpagelogs' => 'Komɔ́nisa zuluná ya lonkásá loye',
+'currentrev' => 'Lizóngeli na mosálá',
+'revisionasof' => 'Lizóngeli ya $1',
+'previousrevision' => '← Lizóngeli lilekí',
+'nextrevision' => 'Lizóngeli lilandí →',
 'currentrevisionlink' => 'Lizóngeli na mosálá',
-'cur'                 => 'sika',
-'next'                => 'bolɛngɛli',
-'last'                => 'ya nsúka',
-'histfirst'           => 'ya yambo',
-'histlast'            => 'ya nsúka',
+'cur' => 'sika',
+'next' => 'bolɛngɛli',
+'last' => 'ya nsúka',
+'histfirst' => 'ya yambo',
+'histlast' => 'ya nsúka',
 
 # Revision deletion
-'rev-delundel'   => 'komɔ́nisa/kobomba',
+'rev-delundel' => 'komɔ́nisa/kobomba',
 'revdel-restore' => 'kobóngola emɔnanela',
 
 # Merge log
@@ -314,56 +314,56 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 
 # Diffs
 'history-title' => 'Mokóló mwa mbóngwana mwa « $1 »',
-'lineno'        => 'Mokɔlɔ́tɔ $1 :',
-'editundo'      => 'kozóngela',
+'lineno' => 'Mokɔlɔ́tɔ $1 :',
+'editundo' => 'kozóngela',
 
 # Search results
-'searchresults'                  => 'Bozwi bwa boluki',
-'searchresults-title'            => 'Bozwi bwa boluka bwa «$1»',
-'searchresulttext'               => 'Mpɔ̂ na liyébísí lya {{SITENAME}}, ótala [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle'                 => "Olukákí '''[[:$1]]'''  ([[Special:Prefixindex/$1|nkásá yɔ́nsɔ ibandí na « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|nkásá yɔ́nsɔ ikangísí na « $1 »]])",
-'searchsubtitleinvalid'          => "Olukákí « '''$1''' »",
-'notitlematches'                 => 'Títɛlɛ yɔ̌kɔ́ tɛ́ ekokánísí',
-'notextmatches'                  => 'Nkomá ya nkásá yɔ̌kɔ́ tɛ́ ekokánísí',
-'prevn'                          => '{{PLURAL:$1|$1}} ya libosó',
-'nextn'                          => 'bolɛngɛli {{PLURAL:$1|$1}}',
-'viewprevnext'                   => 'Komɔ́na ($1 {{int:pipe-separator}} $2) ($3)',
-'searchprofile-articles'         => 'ekakoli',
-'searchprofile-images'           => 'Mitímediá',
-'searchprofile-everything'       => 'Yɔ́nsɔ',
+'searchresults' => 'Bozwi bwa boluki',
+'searchresults-title' => 'Bozwi bwa boluka bwa «$1»',
+'searchresulttext' => 'Mpɔ̂ na liyébísí lya {{SITENAME}}, ótala [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => "Olukákí '''[[:$1]]'''  ([[Special:Prefixindex/$1|nkásá yɔ́nsɔ ibandí na « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|nkásá yɔ́nsɔ ikangísí na « $1 »]])",
+'searchsubtitleinvalid' => "Olukákí « '''$1''' »",
+'notitlematches' => 'Títɛlɛ yɔ̌kɔ́ tɛ́ ekokánísí',
+'notextmatches' => 'Nkomá ya nkásá yɔ̌kɔ́ tɛ́ ekokánísí',
+'prevn' => '{{PLURAL:$1|$1}} ya libosó',
+'nextn' => 'bolɛngɛli {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Komɔ́na ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-articles' => 'ekakoli',
+'searchprofile-images' => 'Mitímediá',
+'searchprofile-everything' => 'Yɔ́nsɔ',
 'searchprofile-articles-tooltip' => 'Koluka na $1',
-'searchprofile-project-tooltip'  => 'Koluka na $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|lokomá 1|nkomá $2}})',
-'search-result-score'            => 'Ntína : $1%',
-'search-redirect'                => '(boyendisi útá $1)',
-'search-section'                 => '(sɛksió ya $1)',
-'search-suggest'                 => 'Ómeka na lokomá : $1',
-'search-interwiki-default'       => 'Bozwi bwa $1 :',
-'search-interwiki-more'          => '(elekí)',
-'search-mwsuggest-enabled'       => 'na bokáni',
-'search-mwsuggest-disabled'      => 'na bokáni tɛ́',
-'searchall'                      => 'nyɔ́nsɔ',
-'nonefound'                      => "'''Notí''' : Boluki bwa likwá bosálí na ndámbo ya ntáká ya nkómbó.
+'searchprofile-project-tooltip' => 'Koluka na $1',
+'search-result-size' => '$1 ({{PLURAL:$2|lokomá 1|nkomá $2}})',
+'search-result-score' => 'Ntína : $1%',
+'search-redirect' => '(boyendisi útá $1)',
+'search-section' => '(sɛksió ya $1)',
+'search-suggest' => 'Ómeka na lokomá : $1',
+'search-interwiki-default' => 'Bozwi bwa $1 :',
+'search-interwiki-more' => '(elekí)',
+'search-mwsuggest-enabled' => 'na bokáni',
+'search-mwsuggest-disabled' => 'na bokáni tɛ́',
+'searchall' => 'nyɔ́nsɔ',
+'nonefound' => "'''Notí''' : Boluki bwa likwá bosálí na ndámbo ya ntáká ya nkómbó.
 Ómeka kobakisa ''all:'' o libóso lya esɛ́ngi mpɔ̂ na koluka maloba ma nkomá mánsɔ (ekɔ́tí ntembe, bimekisele, b.n.b.), tǒ kobakisa ntáka ya nkómbó eye olingí o libóso.",
-'powersearch'                    => 'Boluki',
-'powersearch-legend'             => 'Boluki bopúsání',
-'powersearch-ns'                 => 'Koluka o ntáká ya nkómbó :',
-'powersearch-redir'              => 'Kotíya molɔngɔ́ mwa mayendisi',
-'powersearch-field'              => 'Koluka',
+'powersearch' => 'Boluki',
+'powersearch-legend' => 'Boluki bopúsání',
+'powersearch-ns' => 'Koluka o ntáká ya nkómbó :',
+'powersearch-redir' => 'Kotíya molɔngɔ́ mwa mayendisi',
+'powersearch-field' => 'Koluka',
 
 # Preferences page
-'preferences'       => 'Malúli',
-'mypreferences'     => 'Malúli ma ngáí',
-'prefs-datetime'    => 'Mokɔlɔ mpé ntángo',
-'prefs-rc'          => 'Mbóngwana ya nsúka',
-'saveprefs'         => 'kobómbisa',
+'preferences' => 'Malúli',
+'mypreferences' => 'Malúli ma ngáí',
+'prefs-datetime' => 'Mokɔlɔ mpé ntángo',
+'prefs-rc' => 'Mbóngwana ya nsúka',
+'saveprefs' => 'kobómbisa',
 'searchresultshead' => 'Boluki',
-'allowemail'        => 'Enable mokánda from other users',
-'youremail'         => 'Mokandá (e-mail) *',
-'username'          => 'Nkómbó ya mosáleli :',
-'yourrealname'      => 'nkómbó ya sɔ̂lɔ́',
-'yourlanguage'      => 'Lokótá',
-'email'             => 'Mokánda',
+'allowemail' => 'Enable mokánda from other users',
+'youremail' => 'Mokandá (e-mail) *',
+'username' => 'Nkómbó ya mosáleli :',
+'yourrealname' => 'nkómbó ya sɔ̂lɔ́',
+'yourlanguage' => 'Lokótá',
+'email' => 'Mokánda',
 
 # Groups
 'group-sysop' => 'Bayángeli',
@@ -377,56 +377,56 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'action-edit' => 'Kobɔngisa lonkásá loye',
 
 # Recent changes
-'recentchanges'                  => 'Mbóngwana ya nsúka',
-'recentchanges-legend'           => 'Mapɔni ma mbóngwana ya nsúka',
+'recentchanges' => 'Mbóngwana ya nsúka',
+'recentchanges-legend' => 'Mapɔni ma mbóngwana ya nsúka',
 'recentchanges-feed-description' => 'Kolanda mbóngwana ya nsúka ya wiki o ebale eye.',
-'recentchanges-label-minor'      => 'Ezalí mbóngwana ya mokɛ́',
-'rcnote'                         => "Áwa o nsé {{PLURAL:$1|ezalí mbóngwana '''1''' ya nsúka|izalí mbóngwana '''$1''' ya nsúka}} o {{PLURAL:$2|mokɔlɔ|mikɔlɔ '''$2'''}} ya nsúka, o ntángo $5 o mokɔlɔ $4.",
-'rcshowhideminor'                => '$1 mbóngwana ya mokɛ́',
-'rcshowhidebots'                 => '$1 barobot',
-'rcshowhideliu'                  => '$1 basáleli bamíkitólí',
-'rcshowhideanons'                => '$1 basáleli sóngóló',
-'rcshowhidemine'                 => '$1 mbóngwana ya ngáí',
-'rclinks'                        => 'Komɔ́nisa mbóngwana $1 ya nsúka o mikɔlɔ $2<br />$3',
-'diff'                           => 'mbó.',
-'hist'                           => 'mokóló',
-'hide'                           => 'kobomba',
-'show'                           => 'Komɔ́nisa',
-'minoreditletter'                => 'm',
-'newpageletter'                  => 'S',
-'boteditletter'                  => 'b',
-'rc-enhanced-expand'             => 'Komɔ́nisa ndámbo-ndámbo (esengélí JavaScript)',
+'recentchanges-label-minor' => 'Ezalí mbóngwana ya mokɛ́',
+'rcnote' => "Áwa o nsé {{PLURAL:$1|ezalí mbóngwana '''1''' ya nsúka|izalí mbóngwana '''$1''' ya nsúka}} o {{PLURAL:$2|mokɔlɔ|mikɔlɔ '''$2'''}} ya nsúka, o ntángo $5 o mokɔlɔ $4.",
+'rcshowhideminor' => '$1 mbóngwana ya mokɛ́',
+'rcshowhidebots' => '$1 barobot',
+'rcshowhideliu' => '$1 basáleli bamíkitólí',
+'rcshowhideanons' => '$1 basáleli sóngóló',
+'rcshowhidemine' => '$1 mbóngwana ya ngáí',
+'rclinks' => 'Komɔ́nisa mbóngwana $1 ya nsúka o mikɔlɔ $2<br />$3',
+'diff' => 'mbó.',
+'hist' => 'mokóló',
+'hide' => 'kobomba',
+'show' => 'Komɔ́nisa',
+'minoreditletter' => 'm',
+'newpageletter' => 'S',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Komɔ́nisa ndámbo-ndámbo (esengélí JavaScript)',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Bolandi ekangisi',
-'recentchangeslinked-feed'    => 'Bolandi ekangisi',
+'recentchangeslinked' => 'Bolandi ekangisi',
+'recentchangeslinked-feed' => 'Bolandi ekangisi',
 'recentchangeslinked-toolbox' => 'Bolandi ekangisi',
-'recentchangeslinked-title'   => 'Mbóngwana ikangání na « $1 »',
-'recentchangeslinked-page'    => 'Nkómbó ya lonkásá :',
+'recentchangeslinked-title' => 'Mbóngwana ikangání na « $1 »',
+'recentchangeslinked-page' => 'Nkómbó ya lonkásá :',
 
 # Upload
-'upload'        => 'Kotíya kásá yɔ̌kɔ́',
-'uploadbtn'     => 'Kotíya nkásá mɔ̌kɔ́',
+'upload' => 'Kotíya kásá yɔ̌kɔ́',
+'uploadbtn' => 'Kotíya nkásá mɔ̌kɔ́',
 'uploadlogpage' => 'Zuluná ya botómbisi likoló',
-'filedesc'      => 'Likwé ya mokusé:',
-'savefile'      => 'kobómbisa kásá-kásá',
+'filedesc' => 'Likwé ya mokusé:',
+'savefile' => 'kobómbisa kásá-kásá',
 'uploadedimage' => '«[[$1]]» etómbísámí likoló',
 
 # Special:ListFiles
 'listfiles_date' => 'Mokɔlɔ',
 
 # File description page
-'file-anchor-link'          => 'Elilingi',
-'filehist'                  => 'Mokóló mwa kásá',
-'filehist-revert'           => 'kozóngela',
-'filehist-current'          => 'ya sikáwa',
-'filehist-datetime'         => 'Mokɔlɔ mpé ntángo',
-'filehist-thumb'            => 'Miniátilɛ',
-'filehist-thumbtext'        => 'Miniátilɛ ya versió ya $1',
-'filehist-user'             => 'Mosáleli',
-'filehist-dimensions'       => 'Dimasió',
-'filehist-comment'          => 'Ntembe',
-'imagelinks'                => 'Bikangisele  bya kásá',
+'file-anchor-link' => 'Elilingi',
+'filehist' => 'Mokóló mwa kásá',
+'filehist-revert' => 'kozóngela',
+'filehist-current' => 'ya sikáwa',
+'filehist-datetime' => 'Mokɔlɔ mpé ntángo',
+'filehist-thumb' => 'Miniátilɛ',
+'filehist-thumbtext' => 'Miniátilɛ ya versió ya $1',
+'filehist-user' => 'Mosáleli',
+'filehist-dimensions' => 'Dimasió',
+'filehist-comment' => 'Ntembe',
+'imagelinks' => 'Bikangisele  bya kásá',
 'uploadnewversion-linktext' => 'Kotómbisa likoló kásá eye lisúsu',
 
 # File deletion
@@ -446,20 +446,20 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'doubleredirects' => 'Boyendisi mbala míbalé',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|okté|baokté}}',
-'nmembers'                => '{{PLURAL:$1|ekakoli|bikakoli}} $1',
-'uncategorizedpages'      => 'Nkásá izángí loléngé',
+'nbytes' => '$1 {{PLURAL:$1|okté|baokté}}',
+'nmembers' => '{{PLURAL:$1|ekakoli|bikakoli}} $1',
+'uncategorizedpages' => 'Nkásá izángí loléngé',
 'uncategorizedcategories' => 'Ndéngé izángí loléngé',
-'uncategorizedimages'     => 'Bilílí bizángí loléngé',
-'uncategorizedtemplates'  => 'Bimekoli bizángí loléngé',
-'unusedcategories'        => 'Ndéngé na mosálá tɛ̂',
-'prefixindex'             => 'Nkásá yɔ́nsɔ na libandi...',
-'shortpages'              => 'Nkásá ya mokúsé',
-'longpages'               => 'Nkásá ya molaí',
-'newpages'                => 'Ekakoli ya sika',
-'newpages-username'       => 'Nkómbó ya mosáleli :',
-'move'                    => 'Kobóngola nkómbó',
-'movethispage'            => 'Kobóngola nkómbó ya lonkásá loye',
+'uncategorizedimages' => 'Bilílí bizángí loléngé',
+'uncategorizedtemplates' => 'Bimekoli bizángí loléngé',
+'unusedcategories' => 'Ndéngé na mosálá tɛ̂',
+'prefixindex' => 'Nkásá yɔ́nsɔ na libandi...',
+'shortpages' => 'Nkásá ya mokúsé',
+'longpages' => 'Nkásá ya molaí',
+'newpages' => 'Ekakoli ya sika',
+'newpages-username' => 'Nkómbó ya mosáleli :',
+'move' => 'Kobóngola nkómbó',
+'movethispage' => 'Kobóngola nkómbó ya lonkásá loye',
 
 # Book sources
 'booksources-go' => 'Kɛndɛ́',
@@ -468,13 +468,13 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'log' => 'Bapasɔ́',
 
 # Special:AllPages
-'allpages'       => 'Nkásá ínsɔ',
+'allpages' => 'Nkásá ínsɔ',
 'alphaindexline' => '$1 kina $2',
-'nextpage'       => 'Lonkásá ya nsima ($1)',
-'prevpage'       => 'Lonkasá o libosó ($1)',
-'allarticles'    => 'Nkásá ínsɔ',
-'allpagesprev'   => '< ya libosó',
-'allpagesnext'   => 'bolɛngɛli >',
+'nextpage' => 'Lonkásá ya nsima ($1)',
+'prevpage' => 'Lonkasá o libosó ($1)',
+'allarticles' => 'Nkásá ínsɔ',
+'allpagesprev' => '< ya libosó',
+'allpagesnext' => 'bolɛngɛli >',
 'allpagessubmit' => 'kokɛndɛ',
 
 # Special:Categories
@@ -484,121 +484,121 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'newuserlogpage' => 'Zuluná ya bokeli bwa konti ya mosáleli',
 
 # E-mail user
-'emailuser'       => 'Kotíndela yě mɛ́lɛ',
+'emailuser' => 'Kotíndela yě mɛ́lɛ',
 'defemailsubject' => '{{SITENAME}} mokánda',
-'emailfrom'       => 'útá',
-'emailto'         => 'epái',
-'emailmessage'    => 'Nsango',
-'emailsend'       => 'kotínda',
-'emailsent'       => 'nkandá etíndámá',
-'emailsenttext'   => 'Nkandá ya yɔ̌ etíndámá',
+'emailfrom' => 'útá',
+'emailto' => 'epái',
+'emailmessage' => 'Nsango',
+'emailsend' => 'kotínda',
+'emailsent' => 'nkandá etíndámá',
+'emailsenttext' => 'Nkandá ya yɔ̌ etíndámá',
 
 # Watchlist
-'watchlist'         => 'Nkásá nalandí',
-'mywatchlist'       => 'Nkásá nalandí',
-'addedwatchtext'    => "Lonkásá «[[:$1]]» lobakísámí na [[Special:Watchlist|nkásá olandí]]. Mbóngwana o lonkásá loye mpé o lonkásá la ntembe ikomɔ́nisama áwa, ikokɔ́mana '''mbinga''' o [[Special:RecentChanges|Lístɛ ya mbóngwana ya nsúka]] mpɔ̂ na mpási tɛ̂.",
-'watch'             => 'Kolanda',
-'watchthispage'     => 'Kolanda lonkásá óyo',
-'unwatch'           => 'Kolanda tɛ́',
+'watchlist' => 'Nkásá nalandí',
+'mywatchlist' => 'Nkásá nalandí',
+'addedwatchtext' => "Lonkásá «[[:$1]]» lobakísámí na [[Special:Watchlist|nkásá olandí]]. Mbóngwana o lonkásá loye mpé o lonkásá la ntembe ikomɔ́nisama áwa, ikokɔ́mana '''mbinga''' o [[Special:RecentChanges|Lístɛ ya mbóngwana ya nsúka]] mpɔ̂ na mpási tɛ̂.",
+'watch' => 'Kolanda',
+'watchthispage' => 'Kolanda lonkásá óyo',
+'unwatch' => 'Kolanda tɛ́',
 'watchlist-details' => '{{PLURAL:$1|Lonkásá $1 elandámí|Nkásá $1 bilandámí}}, longola nkásá ya ntembe.',
-'wlnote'            => "Áwa o nsé {{PLURAL:$1|ezalí mbóngwana ya nsúka|izalí mbóngwana '''$1''' ya nsúka}} o {{PLURAL:$2|ngonga|ngonga '''$2'''}} ya nsúka.",
-'wlshowlast'        => 'Komɔ́nisa ngónga $1 ya nsúka, mikɔlɔ $2 mya nsúka tǒ $3',
+'wlnote' => "Áwa o nsé {{PLURAL:$1|ezalí mbóngwana ya nsúka|izalí mbóngwana '''$1''' ya nsúka}} o {{PLURAL:$2|ngonga|ngonga '''$2'''}} ya nsúka.",
+'wlshowlast' => 'Komɔ́nisa ngónga $1 ya nsúka, mikɔlɔ $2 mya nsúka tǒ $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Kolanda...',
+'watching' => 'Kolanda...',
 'unwatching' => 'Kolanda tɛ́...',
 
 'created' => 'ekomákí',
 
 # Delete
-'deletepage'            => 'Kolímwisa lonkásá loye',
-'dellogpage'            => 'zuluná ya bolímwisi',
-'deletionlog'           => 'zuluná ya bolímwisi',
-'deletecomment'         => 'Ntína:',
-'deleteotherreason'     => 'Ntína káka tǒ esúsu :',
+'deletepage' => 'Kolímwisa lonkásá loye',
+'dellogpage' => 'zuluná ya bolímwisi',
+'deletionlog' => 'zuluná ya bolímwisi',
+'deletecomment' => 'Ntína:',
+'deleteotherreason' => 'Ntína káka tǒ esúsu :',
 'deletereasonotherlist' => 'Ntína esúsu',
 
 # Rollback
 'rollbacklink' => 'kolíngola',
 
 # Protect
-'protectlogpage'              => 'Zuluná ya mbátela',
-'protectcomment'              => 'Ntína:',
-'protectexpiry'               => 'Esílí :',
-'protect_expiry_invalid'      => 'Ntángo ya bosílisi ebɔngɛ́lí tɛ̂',
-'protect_expiry_old'          => 'Ntángo ya bosílisi ezalí o ntángo elékákí',
-'protect-default'             => 'Kolingisa basáleli bánsɔ',
-'protect-fallback'            => 'Esengélí ndingisa « $1 »',
+'protectlogpage' => 'Zuluná ya mbátela',
+'protectcomment' => 'Ntína:',
+'protectexpiry' => 'Esílí :',
+'protect_expiry_invalid' => 'Ntángo ya bosílisi ebɔngɛ́lí tɛ̂',
+'protect_expiry_old' => 'Ntángo ya bosílisi ezalí o ntángo elékákí',
+'protect-default' => 'Kolingisa basáleli bánsɔ',
+'protect-fallback' => 'Esengélí ndingisa « $1 »',
 'protect-level-autoconfirmed' => 'Kotɛ́lɛmisa basáleli bamíkomísí tɛ́ tǒ ya sika',
-'protect-level-sysop'         => 'Káka bayángeli',
-'protect-summary-cascade'     => 'bobáteli ya kokitana',
-'protect-expiring'            => 'Esílí o $1 (UTC)',
-'restriction-type'            => 'Ndingisa :',
-'restriction-level'           => 'nivó ya bondimi ndámbo',
+'protect-level-sysop' => 'Káka bayángeli',
+'protect-summary-cascade' => 'bobáteli ya kokitana',
+'protect-expiring' => 'Esílí o $1 (UTC)',
+'restriction-type' => 'Ndingisa :',
+'restriction-level' => 'nivó ya bondimi ndámbo',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Kobɔngisa',
 'restriction-move' => 'Kobóngola nkómbó',
 
 # Undelete
-'undeletelink'     => 'komɔnisa / kozóngisa',
+'undeletelink' => 'komɔnisa / kozóngisa',
 'undeleteviewlink' => 'Komɔ́nisa',
 
 # Namespace form on various pages
-'namespace'      => 'Ntáká ya nkómbó :',
+'namespace' => 'Ntáká ya nkómbó :',
 'blanknamespace' => '(Ya libosó)',
 
 # Contributions
-'contributions'       => 'Mosálá mwa mosáleli óyo',
+'contributions' => 'Mosálá mwa mosáleli óyo',
 'contributions-title' => 'Mosálá mwa mosáleli $1',
-'mycontris'           => 'Nkásá nakomí',
-'contribsub2'         => 'Mpɔ̂ na $1 ($2)',
-'month'               => 'Bandá sánzá (mpé yangó ilekí):',
-'year'                => 'Bandá mobú (mpé myangó milekí) :',
+'mycontris' => 'Nkásá nakomí',
+'contribsub2' => 'Mpɔ̂ na $1 ($2)',
+'month' => 'Bandá sánzá (mpé yangó ilekí):',
+'year' => 'Bandá mobú (mpé myangó milekí) :',
 
 'sp-contributions-blocklog' => 'zuluná ya botɛ́lɛmisi',
-'sp-contributions-talk'     => 'Ntembe',
-'sp-contributions-submit'   => 'Boluki',
+'sp-contributions-talk' => 'Ntembe',
+'sp-contributions-submit' => 'Boluki',
 
 # What links here
-'whatlinkshere'            => 'Ekangísí áwa',
-'whatlinkshere-title'      => 'Nkásá ikangísí na « $1 »',
-'whatlinkshere-page'       => 'Lonkásá:',
-'isredirect'               => 'Lonkásá la boyendisi',
-'isimage'                  => 'Bikangisele  bya kásá',
-'whatlinkshere-links'      => '← bikangiseli',
+'whatlinkshere' => 'Ekangísí áwa',
+'whatlinkshere-title' => 'Nkásá ikangísí na « $1 »',
+'whatlinkshere-page' => 'Lonkásá:',
+'isredirect' => 'Lonkásá la boyendisi',
+'isimage' => 'Bikangisele  bya kásá',
+'whatlinkshere-links' => '← bikangiseli',
 'whatlinkshere-hideredirs' => '$1 mayendisi',
-'whatlinkshere-hidetrans'  => '$1 botíyi na káti',
-'whatlinkshere-hidelinks'  => '$1 bikangiseli',
-'whatlinkshere-filters'    => 'Bikɔngɔlɛlɛ',
+'whatlinkshere-hidetrans' => '$1 botíyi na káti',
+'whatlinkshere-hidelinks' => '$1 bikangiseli',
+'whatlinkshere-filters' => 'Bikɔngɔlɛlɛ',
 
 # Block/unblock
-'blockip'                  => 'Kotɛ́lɛmisa mosáleli',
-'ipboptions'               => 'ngonga 2:2 hours, mokɔlɔ 1:1 day, mikɔlɔ 3:3 days,mpɔ́sɔ 1:1 week,mpɔ́sɔ 2:2 weeks,sánzá 1:1 month,sánzá 3:3 months,sánzá 6:6 months,mobú 1:1 year,na nsúka tɛ̂:infinite',
-'ipblocklist'              => 'Adɛ́lɛsɛ IP mpé basáleli batɛ́lɛmísámí',
-'blocklink'                => 'kotɛ́lɛmisa',
-'unblocklink'              => 'koboma botɛ́lɛmisi',
-'change-blocklink'         => 'kobóngola botɛ́lɛmisi',
-'contribslink'             => 'bíteni ya mosálá',
-'blocklogpage'             => 'Zuluná ya botɛ́lɛmisi',
-'blocklogentry'            => '[[$1]] atɛ́lɛ́mísámí ; bosílisi : $2 $3',
-'unblocklogentry'          => 'ebomí botɛ́lɛmisi $1',
+'blockip' => 'Kotɛ́lɛmisa mosáleli',
+'ipboptions' => 'ngonga 2:2 hours, mokɔlɔ 1:1 day, mikɔlɔ 3:3 days,mpɔ́sɔ 1:1 week,mpɔ́sɔ 2:2 weeks,sánzá 1:1 month,sánzá 3:3 months,sánzá 6:6 months,mobú 1:1 year,na nsúka tɛ̂:infinite',
+'ipblocklist' => 'Adɛ́lɛsɛ IP mpé basáleli batɛ́lɛmísámí',
+'blocklink' => 'kotɛ́lɛmisa',
+'unblocklink' => 'koboma botɛ́lɛmisi',
+'change-blocklink' => 'kobóngola botɛ́lɛmisi',
+'contribslink' => 'bíteni ya mosálá',
+'blocklogpage' => 'Zuluná ya botɛ́lɛmisi',
+'blocklogentry' => '[[$1]] atɛ́lɛ́mísámí ; bosílisi : $2 $3',
+'unblocklogentry' => 'ebomí botɛ́lɛmisi $1',
 'block-log-flags-nocreate' => 'bokeli bwa konti botendísámí',
 
 # Move page
-'movearticle'             => 'Kobóngola nkómbó ya ekakoli :',
-'move-watch'              => 'Kolánda lonkásá la líziba mpé lonkásá la tíndamelo',
-'movepagebtn'             => 'Kobóngola lonkásá',
-'movedto'                 => 'nkómbó ya sika',
-'movelogpage'             => 'Zuluná ya bobóngoli nkómbó',
-'movereason'              => 'Ntína :',
-'revertmove'              => 'kozóngela',
-'delete_and_move'         => 'Kolímwisa mpé kobóngola nkómbó',
+'movearticle' => 'Kobóngola nkómbó ya ekakoli :',
+'move-watch' => 'Kolánda lonkásá la líziba mpé lonkásá la tíndamelo',
+'movepagebtn' => 'Kobóngola lonkásá',
+'movedto' => 'nkómbó ya sika',
+'movelogpage' => 'Zuluná ya bobóngoli nkómbó',
+'movereason' => 'Ntína :',
+'revertmove' => 'kozóngela',
+'delete_and_move' => 'Kolímwisa mpé kobóngola nkómbó',
 'delete_and_move_confirm' => 'Boye, kolímwisa lonkásá',
-'delete_and_move_reason'  => 'Ntína ya bolímwisi mpé bobóngoli bwa nkómbó',
+'delete_and_move_reason' => 'Ntína ya bolímwisi mpé bobóngoli bwa nkómbó',
 
 # Export
-'export'        => 'komɛmɛ na...',
+'export' => 'komɛmɛ na...',
 'export-submit' => 'Komɛmɛ',
 
 # Namespace 8 related
@@ -611,48 +611,48 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'import' => 'koútisa...',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'Lonkásá na ngáí',
-'tooltip-pt-mytalk'              => 'Lonkásá ntembe lwa ngáí',
-'tooltip-pt-preferences'         => 'Malúli ma ngáí',
-'tooltip-pt-watchlist'           => 'Nkásá nalandí mpɔ̂ na mbóngwana',
-'tooltip-pt-mycontris'           => 'Molɔngɔ́ mwa nkásá nakomí',
-'tooltip-pt-login'               => 'Epésí lilako lya komíkitola yɔ̂, kasi esengélí tê.',
-'tooltip-pt-logout'              => 'Kolongwa',
-'tooltip-ca-talk'                => 'Ntembe etálí lonkásá lwa nkomá',
-'tooltip-ca-edit'                => 'Okokí kokoma lonkásá loye. Ósálela butɔ́ ya botáli-yambo o libóso na kobómbisa.',
-'tooltip-ca-history'             => 'Mbóngwana ya kala ya lonkásá loye (na basáleli)',
-'tooltip-ca-protect'             => 'Kobátela lonkásá loye',
-'tooltip-ca-delete'              => 'Kolímwisa lonkásá loye',
-'tooltip-ca-move'                => 'Kobóngola nkómbó ya lonkásá loye',
-'tooltip-ca-watch'               => 'Kobakisa na nkásá olandaka',
-'tooltip-ca-unwatch'             => 'Kolongola na nkásá olandaka',
-'tooltip-search'                 => 'Boluki {{SITENAME}}',
-'tooltip-search-go'              => 'Kokɛndɛ na lonkásá na nkómbó óyo sɔ́kí ezalí',
-'tooltip-search-fulltext'        => 'Koluka nkásá na nkomá yangó.',
-'tooltip-p-logo'                 => 'Lokásá ya libosó',
-'tooltip-n-mainpage'             => 'Kokɛndɛ na Lonkásá ya libosó',
+'tooltip-pt-userpage' => 'Lonkásá na ngáí',
+'tooltip-pt-mytalk' => 'Lonkásá ntembe lwa ngáí',
+'tooltip-pt-preferences' => 'Malúli ma ngáí',
+'tooltip-pt-watchlist' => 'Nkásá nalandí mpɔ̂ na mbóngwana',
+'tooltip-pt-mycontris' => 'Molɔngɔ́ mwa nkásá nakomí',
+'tooltip-pt-login' => 'Epésí lilako lya komíkitola yɔ̂, kasi esengélí tê.',
+'tooltip-pt-logout' => 'Kolongwa',
+'tooltip-ca-talk' => 'Ntembe etálí lonkásá lwa nkomá',
+'tooltip-ca-edit' => 'Okokí kokoma lonkásá loye. Ósálela butɔ́ ya botáli-yambo o libóso na kobómbisa.',
+'tooltip-ca-history' => 'Mbóngwana ya kala ya lonkásá loye (na basáleli)',
+'tooltip-ca-protect' => 'Kobátela lonkásá loye',
+'tooltip-ca-delete' => 'Kolímwisa lonkásá loye',
+'tooltip-ca-move' => 'Kobóngola nkómbó ya lonkásá loye',
+'tooltip-ca-watch' => 'Kobakisa na nkásá olandaka',
+'tooltip-ca-unwatch' => 'Kolongola na nkásá olandaka',
+'tooltip-search' => 'Boluki {{SITENAME}}',
+'tooltip-search-go' => 'Kokɛndɛ na lonkásá na nkómbó óyo sɔ́kí ezalí',
+'tooltip-search-fulltext' => 'Koluka nkásá na nkomá yangó.',
+'tooltip-p-logo' => 'Lokásá ya libosó',
+'tooltip-n-mainpage' => 'Kokɛndɛ na Lonkásá ya libosó',
 'tooltip-n-mainpage-description' => 'Kokɛndɛ na lonkásá ya libosó',
-'tooltip-n-portal'               => 'Etalí mwángo moye',
-'tooltip-n-recentchanges'        => 'Lístɛ ya mbóngwana ya nsúka o wiki',
-'tooltip-n-randompage'           => 'Tómbisa lonkásá na mbɛsɛ',
-'tooltip-n-help'                 => 'Esíká ya bosálisi',
-'tooltip-t-whatlinkshere'        => 'Lístɛ ya nkásá wiki nyɔ́nsɔ iye ikangísí áwa',
-'tooltip-feed-rss'               => 'Ebale RSS mpɔ̂ na lonkásá loye',
-'tooltip-feed-atom'              => 'Ebale Atom mpɔ̂ na lonkásá loye',
-'tooltip-t-emailuser'            => 'Kotíndela mosáleli óyo mɛ́lɛ',
-'tooltip-t-upload'               => 'Kotíya kásá ebelé',
-'tooltip-t-specialpages'         => 'Lístɛ ya nkásá gudi nyɔ́nsɔ',
-'tooltip-t-print'                => 'Loléngé la lonkásá loye la kobimisa',
-'tooltip-t-permalink'            => 'Ekangisele ya koúmela na versió eye ya lonkánsá',
-'tooltip-ca-nstab-main'          => 'Komɔ́nisa káti',
-'tooltip-ca-nstab-user'          => 'Komɔ́nisa lonkásá la mosáleli',
-'tooltip-ca-nstab-special'       => 'Eye ezalí lonkásá gudi, okokí kobɔngisa eye tɛ̂',
-'tooltip-ca-nstab-project'       => 'Komɔ́nisa lonkásá la mwǎngo',
-'tooltip-ca-nstab-image'         => 'Komɔ́nisa lonkásá la kásá',
-'tooltip-ca-nstab-template'      => 'Komɔ́nisela emekisele',
-'tooltip-ca-nstab-category'      => 'Komɔ́nisa lonkásá la katégori',
-'tooltip-save'                   => 'Kobómbisa mbóngwana ya yɔ̌',
-'tooltip-watch'                  => 'Kobakisa na nkásá olandaka',
+'tooltip-n-portal' => 'Etalí mwángo moye',
+'tooltip-n-recentchanges' => 'Lístɛ ya mbóngwana ya nsúka o wiki',
+'tooltip-n-randompage' => 'Tómbisa lonkásá na mbɛsɛ',
+'tooltip-n-help' => 'Esíká ya bosálisi',
+'tooltip-t-whatlinkshere' => 'Lístɛ ya nkásá wiki nyɔ́nsɔ iye ikangísí áwa',
+'tooltip-feed-rss' => 'Ebale RSS mpɔ̂ na lonkásá loye',
+'tooltip-feed-atom' => 'Ebale Atom mpɔ̂ na lonkásá loye',
+'tooltip-t-emailuser' => 'Kotíndela mosáleli óyo mɛ́lɛ',
+'tooltip-t-upload' => 'Kotíya kásá ebelé',
+'tooltip-t-specialpages' => 'Lístɛ ya nkásá gudi nyɔ́nsɔ',
+'tooltip-t-print' => 'Loléngé la lonkásá loye la kobimisa',
+'tooltip-t-permalink' => 'Ekangisele ya koúmela na versió eye ya lonkánsá',
+'tooltip-ca-nstab-main' => 'Komɔ́nisa káti',
+'tooltip-ca-nstab-user' => 'Komɔ́nisa lonkásá la mosáleli',
+'tooltip-ca-nstab-special' => 'Eye ezalí lonkásá gudi, okokí kobɔngisa eye tɛ̂',
+'tooltip-ca-nstab-project' => 'Komɔ́nisa lonkásá la mwǎngo',
+'tooltip-ca-nstab-image' => 'Komɔ́nisa lonkásá la kásá',
+'tooltip-ca-nstab-template' => 'Komɔ́nisela emekisele',
+'tooltip-ca-nstab-category' => 'Komɔ́nisa lonkásá la katégori',
+'tooltip-save' => 'Kobómbisa mbóngwana ya yɔ̌',
+'tooltip-watch' => 'Kobakisa na nkásá olandaka',
 
 # Browsing diffs
 'previousdiff' => '← Bobóngoli bwa libosó',
@@ -668,7 +668,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'nyɔ́nsɔ',
 'namespacesall' => 'Nyɔ́nsɔ',
-'monthsall'     => 'nyɔ́nsɔ',
+'monthsall' => 'nyɔ́nsɔ',
 
 # action=purge
 'confirm_purge_button' => 'Nandimi',
@@ -682,13 +682,13 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 # Watchlist editing tools
 'watchlisttools-view' => 'Komɔ́nisela mbóngwana ya ntína',
 'watchlisttools-edit' => 'Komɔ́nisela mpé kobóngola nkásá nalandí',
-'watchlisttools-raw'  => 'Kobimisela nkásá nalandí (na pɛpɛ)',
+'watchlisttools-raw' => 'Kobimisela nkásá nalandí (na pɛpɛ)',
 
 # Special:SpecialPages
 'specialpages' => 'Nkásá gudi',
 
 # HTML forms
-'htmlform-submit'              => 'Kotínda',
+'htmlform-submit' => 'Kotínda',
 'htmlform-selectorother-other' => 'Mosúsu',
 
 );
index ecc2420..9669b31 100644 (file)
@@ -469,7 +469,6 @@ $messages = array(
 
 # Diffs
 'history-title' => 'ປະຫວັດການດັດແກ້ ຂອງ "$1"',
-'difference' => '(ສ່ວນຕ່າງລະຫວ່າງແຕ່ລະສະບັບ)',
 'lineno' => 'ແຖວ $1:',
 'compareselectedversions' => 'ສົມທຽບ ລະຫວ່າງ ສະບັບເລືອກ',
 'editundo' => 'ກັບຄືນ',
@@ -544,7 +543,7 @@ $messages = array(
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ການປ່ຽນແປງ|ການປ່ຽນແປງ}}',
 'recentchanges' => 'ການດັດແກ້ຫຼ້າສຸດ',
-'recentchangestext' => 'ເບິ່ງ ການປ່ຽນແປງ ຫຼ້າສຸດ ຢູ່ ໜ້າວິກີນີ້.',
+'recentchanges-summary' => 'ເບິ່ງ ການປ່ຽນແປງ ຫຼ້າສຸດ ຢູ່ ໜ້າວິກີນີ້.',
 'recentchanges-feed-description' => 'ນຳເບິ່ງການປ່ຽນແປງຫຼ້າສຸດຢູ່ ວິກິນີ້ ໃນ ຟີດ',
 'rcnote' => "ທາງລຸ່ມ {{PLURAL:$1|ແມ່ນ'''1''' ການປ່ຽນແປງ|ແມ່ນ '''$1''' ການປ່ຽນແປງຫຼ້າສຸດ}} ໃນ {{PLURAL:$2|ມື້|'''$2''' ມື້}}, ເມື່ອ $3.",
 'rclistfrom' => 'ສະແດງ ການປ່ຽນແປງ ເລີ່ມແຕ່  $1',
index bccb4ac..762c1e8 100644 (file)
@@ -441,7 +441,6 @@ Informasi: (bye) = petuho a nca selt,
 
 # Diffs
 'history-title' => 'Bundau di selt di "$1"',
-'difference' => '(Petuho kwa selt)',
 'lineno' => 'Lani $1:',
 'compareselectedversions' => 'Bapisize',
 'editundo' => "afi hloli ye ng'i",
index 46fb3ca..ec52b88 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lithuanian (Lietuvių)
+/** Lithuanian (lietuvių)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -18,6 +18,7 @@
  * @author Kaganer
  * @author Matasg
  * @author Meno25
+ * @author Ola
  * @author Pdxx
  * @author Perkunas
  * @author Pėstininkas
@@ -561,6 +562,11 @@ $2',
 'ns-specialprotected' => 'Specialieji puslapiai negali būti redaguojami.',
 'titleprotected' => "[[User:$1|$1]] apsaugojo šį pavadinimą nuo sukūrimo.
 Nurodyta priežastis yra ''$2''.",
+'filereadonlyerror' => 'Neįmanoma pakeisti failo "$1" nes failų saugykla "$2" yra nustatyta tik skaitymo režimu.
+
+Ją užrakinęs administratorius pateikė šį paaiškinimą: "$3".',
+'invalidtitle-knownnamespace' => 'Klaidingas pavadinimas vardų erdvėje "$2" ir tekstu "$3"',
+'invalidtitle-unknownnamespace' => 'Klaidingas pavadinimas nežinomoje vardų erdvėje numeriu $1 ir tekstu "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Neleistina konfigūracija: nežinomas virusų skeneris: ''$1''",
@@ -653,6 +659,7 @@ nebus siunčiami nei vienai žemiau išvardintai paslaugai.',
 'invalidemailaddress' => 'El. pašto adresas negali būti priimtas, nes atrodo, kad jis nėra teisingo formato.
 Prašome įvesti gerai suformuotą adresą arba palikite tą laukelį tuščią.',
 'cannotchangeemail' => 'Paskyros e-mail adresas šiame viki negali būti keičiamas.',
+'emaildisabled' => 'Ši svetainė negali siųsti elektroninių laiškų.',
 'accountcreated' => 'Paskyra sukurta',
 'accountcreatedtext' => 'Naudotojo paskyra $1 buvo sukurta.',
 'createaccount-title' => '{{SITENAME}} paskyros kūrimas',
@@ -835,7 +842,8 @@ Jūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] ki
 'userinvalidcssjstitle' => "'''Dėmesio:''' Nėra jokios išvaizdos „$1“. Nepamirškite, kad savo .css ir .js puslapiai naudoja pavadinimą mažosiomis raidėmis, pvz., {{ns:user}}:Foo/vector.css, o ne {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Atnaujinta)',
 'note' => "'''Pastaba:'''",
-'previewnote' => "'''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
+'previewnote' => "''Nepamirškite, kad tai tik peržiūra, pakeitimai dar nėra išsaugoti!'''",
+'continue-editing' => 'Tęsti redagavimą',
 'previewconflict' => 'Ši peržiūra parodo tekstą iš viršutiniojo teksto redagavimo lauko taip, kaip jis bus rodomas, jei pasirinksite išsaugoti.',
 'session_fail_preview' => "'''Atsiprašome! Mes negalime vykdyti jūsų keitimo dėl sesijos duomenų praradimo.
 Prašome pamėginti vėl. Jei tai nepadeda, pamėginkite atsijungti ir prisijungti atgal.'''",
@@ -847,6 +855,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',
@@ -910,6 +919,7 @@ Greičiausiai jis yra ištrintas.',
 'edit-no-change' => 'Jūsų keitimas buvo ignoruotas kadangi nebuvo atlikta jokių teksto pakeitimų.',
 'edit-already-exists' => 'Negalima sukurti naujo puslapio.
 Jis jau egzistuoja.',
+'defaultmessagetext' => 'Numatytasis pranešimo tekstas',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Įspėjimas: Šiame puslapyje yra per daug užtrunkančių analizatoriaus funkcijų šaukinių.
@@ -1070,7 +1080,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',
@@ -1104,7 +1114,8 @@ Prašome patikrinti sąrašus.',
 
 # Diffs
 'history-title' => '„$1“ versijų istorija',
-'difference' => '(Skirtumai tarp versijų)',
+'difference-title' => '$1: Skirtumas tarp puslapio versijų',
+'difference-title-multipage' => 'Skirtumas tarp puslapių „$1 ir $2“',
 'difference-multipage' => '(Skirtumai tarp puslapių)',
 'lineno' => 'Eilutė $1:',
 'compareselectedversions' => 'Palyginti pasirinktas versijas',
@@ -1199,6 +1210,7 @@ Prašome patikrinti sąrašus.',
 'prefs-beta' => 'Beta funkcijos',
 'prefs-datetime' => 'Data ir laikas',
 'prefs-labs' => 'Bandomosios funkcijos',
+'prefs-user-pages' => 'Naudotojo puslapiai',
 'prefs-personal' => 'Naudotojo profilis',
 'prefs-rc' => 'Naujausi keitimai',
 'prefs-watchlist' => 'Stebimų sąrašas',
@@ -1463,7 +1475,7 @@ teisės",
 'nchanges' => '$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}',
 'recentchanges' => 'Naujausi keitimai',
 'recentchanges-legend' => 'Naujausių keitimų parinktys',
-'recentchangestext' => 'Šiame puslapyje yra patys naujausi pakeitimai šiame projekte.',
+'recentchanges-summary' => 'Šiame puslapyje yra patys naujausi pakeitimai šiame projekte.',
 'recentchanges-feed-description' => 'Sekite pačius naujausius projekto keitimus šiame šaltinyje.',
 'recentchanges-label-newpage' => 'Šiuo keitimu sukurtas naujas puslapis',
 'recentchanges-label-minor' => 'Tai smulkus pakeitimas',
@@ -1493,6 +1505,7 @@ teisės",
 'newsectionsummary' => '/* $1 */ naujas skyrius',
 'rc-enhanced-expand' => 'Rodyti detales (reikia JavaScript)',
 'rc-enhanced-hide' => 'Slėpti detales',
+'rc-old-title' => 'iš pradžių sukurtas kaip " $1 "',
 
 # Recent changes linked
 'recentchangeslinked' => 'Susiję keitimai',
@@ -1651,6 +1664,7 @@ Prašome susisiekti su [[Special:ListUsers/sysop|sistemos administratoriumi]].',
 'backend-fail-closetemp' => 'Negalima uždaryti laikino failo.',
 'backend-fail-read' => 'Negalima nuskaityti failo $1.',
 'backend-fail-create' => 'Negalima sukurti failo $1.',
+'backend-fail-maxsize' => 'Failo $1 sukurti nepavyko nes jis didesnis nei {{PLURAL:$2|vienas baitas|$2 baitai|$2 baitų}}.',
 'backend-fail-readonly' => 'Galutinė saugykla "$1" dabar yra skirta tik skaitymui. Buvo nurodyta priežastis: "$2"',
 'backend-fail-synced' => 'Failas "$1", esantis vidinėje galutinėje saugykloje, yra pažymėtas kaip nepilnas.',
 'backend-fail-connect' => 'Negalima prisijungti prie galutinės saugyklos "$1".',
@@ -1841,10 +1855,10 @@ Informacija iš [$2 failo aprašymo puslapio] yra pateikiama žemiau.',
 'statistics-pages-desc' => 'Visi puslapiai, tarp jų aptarimo, nukreipimų, ir kiti puslapiai.',
 'statistics-files' => 'Įkelti failai',
 'statistics-edits' => 'Puslapių redagavimų skaičius nuo {{SITENAME}} sukūrimo',
-'statistics-edits-average' => 'Vidutinis redakcijų kiekis puslapiui',
+'statistics-edits-average' => 'Vidutinis puslapių keitimų kiekis',
 'statistics-views-total' => 'Iš viso peržiūrų',
 'statistics-views-total-desc' => 'Neegzistuojančių ir specialiųjų puslapių parodymai neįtraukti',
-'statistics-views-peredit' => 'Peržiūrų skaičius redakcijai',
+'statistics-views-peredit' => 'Peržiūrų skaičius puslapio versijai',
 'statistics-users' => 'Registruotų [[Special:ListUsers|naudotojų]]',
 'statistics-users-active' => 'Aktyvių naudotojų',
 'statistics-users-active-desc' => 'Naudotojai, kurie per {{PLURAL:$1|paskutinę dieną|paskutines $1 dienų}} padarė keitimų',
@@ -1977,6 +1991,12 @@ Galima sumažinti rezultatų skaičių patikslinant veiksmo rūšį, naudotoją
 'allpagesprefix' => 'Rodyti puslapiu su priedėliu:',
 'allpagesbadtitle' => 'Duotas puslapio pavadinimas yra neteisingas arba turi tarpkalbininį arba tarpprojektinį priedėlį. Jame yra vienas ar keli simboliai, kurių negalima naudoti pavadinimuose.',
 'allpages-bad-ns' => '{{SITENAME}} neturi „$1“ vardų srities.',
+'allpages-hide-redirects' => 'Slėpti peradresavimus',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Jūs matote kompiuterio atmintyje išsaugotą puslapio versiją, kuri gali būti $1 senumo.',
+'cachedspecial-viewing-cached-ts' => 'Jūs matote kompiuterio atmintyje išsaugotą puslapio versiją, kuri gali neatitikti naujausios versijos.',
+'cachedspecial-refresh-now' => 'Peržiūrėti naujausius.',
 
 # Special:Categories
 'categories' => 'Kategorijos',
@@ -2470,7 +2490,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',
@@ -2773,7 +2793,7 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 'tooltip-search' => 'Ieškoti šiame projekte',
 'tooltip-search-go' => 'Eiti į puslapį su tokiu pavadinimu, jei toks yra',
 'tooltip-search-fulltext' => 'Ieškoti puslapių su šiuo tekstu',
-'tooltip-p-logo' => 'Pradinis puslapis',
+'tooltip-p-logo' => 'Eiti į pradinį puslapį',
 'tooltip-n-mainpage' => 'Eiti į pradinį puslapį',
 'tooltip-n-mainpage-description' => 'Eiti į pradinį puslapį',
 'tooltip-n-portal' => 'Apie projektą, ką galima daryti, kur ką rasti',
@@ -2847,6 +2867,7 @@ Leidžia pridėti atmetimo priežastį komentaruose',
 'spambot_username' => 'MediaWiki reklamų šalinimas',
 'spam_reverting' => 'Atkuriama į ankstesnę versiją, neturinčios nuorodų į $1',
 'spam_blanking' => 'Visos versijos turėjo nuorodų į $1, išvaloma',
+'spam_deleting' => 'Visos versijos turėjo nuorodų į $1, ištrinama',
 
 # Info page
 'pageinfo-title' => '„$1“ informacija',
@@ -3562,6 +3583,7 @@ Jūs turėjote gauti [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU General Public Licens
 'version-software' => 'Įdiegta programinė įranga',
 'version-software-product' => 'Produktas',
 'version-software-version' => 'Versija',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Failo kelias',
@@ -3686,32 +3708,61 @@ Paveikslėliai yra rodomi pilna raiška, kiti failų tipai paleidžiami tiesiogi
 'newuserlog-byemail' => 'slaptažodis nusiųstas elektroniniu paštu',
 
 # Feedback
+'feedback-bugornote' => 'Jei jūs esate pasirengę aprašyti techninę problemą išsamiau, [$1 praneškite apie programinę klaidą].
+Kitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentaras bus įtrauktas į puslapį „[$3 $2]“, kartu su jūsų naudotojo vardu ir jūsų naudojama naršykle.',
 'feedback-subject' => 'Tema:',
 'feedback-message' => 'Pranešimas:',
 'feedback-cancel' => 'Atšaukti',
 'feedback-submit' => 'Siųsti Atsiliepimą',
 'feedback-adding' => 'Pridedamas atsiliepimas į puslapį ...',
+'feedback-error1' => 'Klaida: Neatpažįstamas rezultatas iš API',
 'feedback-error2' => 'Klaida: Redagavimas nepavyko',
+'feedback-error3' => 'Klaida: Jokio atsakymo iš API',
+'feedback-thanks' => 'Ačiū! Jūsų atsiliepimas buvo užregistruotas puslapyje „[$2 $1]“.',
+'feedback-close' => 'Atlikta',
+'feedback-bugcheck' => 'Puiku! Tiesiog patikrinkite, ar tai ne viena [$1 jau žinomų klaidų].',
+'feedback-bugnew' => 'Patikrinau. Pranešti apie naują klaidą',
 
 # API errors
 'api-error-badaccess-groups' => 'Jums neleidžiama įkelti failus į šią wiki.',
 'api-error-copyuploaddisabled' => 'Siuntimas pagal URL yra išjungtas šiame serveryje.',
 'api-error-duplicate-popup-title' => 'Dubliuoti  {{PLURAL:$1|failą|failus}}',
 'api-error-empty-file' => 'Pateikta failas buvo tuščias.',
+'api-error-emptypage' => 'Kurti naujus, tuščius puslapius neleidžiama.',
+'api-error-fetchfileerror' => 'Vidinė klaida: Kažkas nutiko gaunant failą.',
 'api-error-file-too-large' => 'Failą, kurį pateikėte buvo per didelis.',
 'api-error-filename-tooshort' => 'Failo vardas yra per trumpas.',
 'api-error-filetype-banned' => 'Šis failų tipas yra uždraustas.',
+'api-error-filetype-missing' => 'Failas neturi galūnės.',
+'api-error-hookaborted' => 'Pakeitimą, kurį bandėte atlikti, nutraukė priedas.',
 'api-error-http' => 'Vidinė klaida: nepavyko prisijungti prie serverio.',
 'api-error-illegal-filename' => 'Failo vardas neleidžiamas.',
 'api-error-invalid-file-key' => 'Vidinė klaida: failas nerastas saugykloje.',
+'api-error-missingresult' => 'Vidinė klaida: nepavyko nustatyti, ar pavyko nukopijuoti.',
 'api-error-mustbeloggedin' => 'Jūs turite būti prisijungęs kad galėtumėte įkelti failus.',
 'api-error-mustbeposted' => 'Vidinė klaida: prašymas reikalauja HTTP POST.',
+'api-error-noimageinfo' => 'Įkelti pavyko, bet serveris nepateikė mums jokios informacijos apie failą.',
 'api-error-ok-but-empty' => 'Vidinė klaida: nėra atsakymo iš serverio.',
 'api-error-overwrite' => 'Perrašymas esamą failą neleidžiamas.',
+'api-error-stashfailed' => 'Vidinė klaida: serveriui nepavyko išsaugoti laikinąjį failą.',
+'api-error-timeout' => 'Serveris neatsakė per numatytą laiką.',
 'api-error-unclassified' => 'Įvyko nežinoma klaida',
 'api-error-unknown-code' => 'Nežinoma klaida: " $1 "',
 'api-error-unknown-error' => 'Vidinė klaida: kažkas nutiko bandant įkelti failą.',
 'api-error-unknown-warning' => 'Nežinomas įspėjimas: $1',
+'api-error-unknownerror' => 'Nežinoma klaida: "$1"',
 'api-error-uploaddisabled' => 'Įkėlimas išjungtas šioje wiki.',
+'api-error-verification-error' => 'Šis failas gali būti sugadintas arba turi neteisingą papildinį.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekundė|sekundės|sekundžių}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutė|minutės|minučių}}',
+'duration-hours' => '$1 {{PLURAL:$1|valanda|valandos|valandų}}',
+'duration-days' => '$1 {{PLURAL:$1|diena|dienos|dienų}}',
+'duration-weeks' => '$1 {{PLURAL:$1|savaitė|savaitės|savaičių}}',
+'duration-years' => '$1 {{PLURAL:$1|metai|metai|metų}}',
+'duration-decades' => '$1 {{PLURAL:$1|dešimtmetis|dešimtmečiai|dešimtmečių}}',
+'duration-centuries' => '$1 {{PLURAL:$1|amžius|amžiai|amžių}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tūkstantmetis|tūkstantmečiai|tūkstantmečių}}',
 
 );
index 78c5152..497b6c4 100644 (file)
@@ -371,7 +371,6 @@ n = nasvareigs lobuojums.',
 
 # Diffs
 'history-title' => '"$1" verseju viesture',
-'difference' => '(Versiju saleidzynuojums)',
 'lineno' => '$1 aiļa',
 'compareselectedversions' => 'Saleidzynuot ituos versejis',
 'editundo' => 'atsaukt',
index 25fb555..8f09ec9 100644 (file)
@@ -22,9 +22,9 @@ $messages = array(
 'tog-usenewrc' => 'Tihdanglam thar belhchhan hmang rawh (JavaScript a ngai)',
 'tog-numberheadings' => 'A thupuite amahin nambar inpêktir rawh',
 'tog-showtoolbar' => 'Siamţhatna hmanraw-liang tilang rawh (JavaScript a ngai)',
-'tog-editondblclick' => 'Vawihnih klikin phêk siamţha rawh (JavaScript a ngai)',
+'tog-editondblclick' => 'Hmehphìrin phêk siamţha rawh (JavaScript a ngai)',
 'tog-editsection' => 'Hlawm hrang siamţhatna [siamţhatna] zawmna hmangin awmtir rawh',
-'tog-editsectiononrightclick' => 'Hlawm thupui ding-klik hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
+'tog-editsectiononrightclick' => 'Hlawm thupui ding-hmeh hmangin hlawm siamţhat theihna awmtir rawh (JavaScript a ngai)',
 'tog-showtoc' => 'A chhunga thu awm te tilang rawh (thupui 3 aia tam phêk tan)',
 'tog-rememberpassword' => 'He ka rangpuifannaah hian min hre reng rawh (a rei berah ni $1  {{PLURAL:$1}})',
 'tog-watchcreations' => 'Ka phêk siamte ka ralvèn zing-ah telh rawh',
@@ -35,9 +35,9 @@ $messages = array(
 'tog-previewontop' => 'Siamţhatna bawm hmaah endikna dah rawh',
 'tog-previewonfirst' => 'Siamţhat vawi khatnaah endikna tilang rawh',
 'tog-nocache' => 'Fanna-in phêk a cache tur veng rawh',
-'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin email min thawn rawh',
-'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin min email rawh',
-'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh min email tho rawh',
+'tog-enotifwatchlistpages' => 'Ka ralvèn zinga phêk pakhat tihdanglam a nih apiangin e-lehkha min thawn rawh',
+'tog-enotifusertalkpages' => 'Ka hmangtu-sawihona phêk tihdanglam a nihin e-lehkha min thawn rawh',
+'tog-enotifminoredits' => 'Phêk siamţhat tenauah pawh e-lehkha min thawn tho rawh',
 'tog-enotifrevealaddr' => 'Hriattirna email zingah ka email address pho lang rawh',
 'tog-shownumberswatching' => 'Ralvèngtu zât tilang rawh',
 'tog-oldsig' => 'Khàrna hming hman mék:',
@@ -53,18 +53,18 @@ $messages = array(
 'tog-watchlisthideliu' => 'Ralvèn zing aţang hmangtu inziaklut siamţhat tibo rawh.',
 'tog-watchlisthideanons' => 'Hmangtu hriat lohvina an siamţhat ralvèn zing aţang',
 'tog-watchlisthidepatrolled' => 'Siamţhat viltu nei ralvèn zingah telh suh',
-'tog-ccmeonemails' => 'Hmangtu dang hnena ka email thawn apiang min thawn ve zel rawh',
-'tog-diffonly' => 'Diff hnuaiah phêk chhunga awmte tilang suh',
+'tog-ccmeonemails' => 'Hmangtu dang hnena ka e-lehkha thawn apiang min thawn ve zel rawh',
+'tog-diffonly' => 'Dnglmn hnuaiah phêk chhúng tilang suh',
 'tog-showhiddencats' => 'Pawl thuhrûkho tilang rawh',
-'tog-norollbackdiff' => 'Lumlêt hnuah diff kalkan rawh',
+'tog-norollbackdiff' => 'Lumlêt hnuah dnglmn kalkan rawh',
 
 'underline-always' => 'Ziah/ngei ngei',
 'underline-never' => 'Ngai lo',
-'underline-default' => 'Browser duhdàn',
+'underline-default' => 'Rängpuifanna duhdàn',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Siamţhatna hmun hawrawp pian',
-'editfont-default' => 'Browser duhdàn',
+'editfont-default' => 'Rängpuifanna duhdàn',
 'editfont-monospace' => 'Hawrawp inkar rualkhai',
 'editfont-sansserif' => 'Sans-serif hawrawp',
 'editfont-serif' => 'Serif hawrawp',
@@ -87,11 +87,11 @@ $messages = array(
 'january' => 'Pawlkut',
 'february' => 'Ramtuk',
 'march' => 'Vau',
-'april' => 'Ţau',
-'may_long' => 'Ţomir',
+'april' => 'au',
+'may_long' => 'omir',
 'june' => 'Nikir',
 'july' => 'Vawkhniahzawn',
-'august' => 'Thiţin',
+'august' => 'Thiin',
 'september' => 'Mimkut',
 'october' => 'Khuangchawi',
 'november' => 'Sahmulphah',
@@ -99,7 +99,7 @@ $messages = array(
 'january-gen' => 'Pawlkût thla',
 'february-gen' => 'Ramtuk thla',
 'march-gen' => 'Vau thla',
-'april-gen' => 'Ţau thla',
+'april-gen' => 'au thla',
 'may-gen' => 'Ţomir thla',
 'june-gen' => 'Nikir thla',
 'july-gen' => 'Vawkhniahzawn thla',
@@ -127,14 +127,14 @@ $messages = array(
 'subcategories' => 'Pawlpengte',
 'category-media-header' => '"$1" pawla mediate',
 'category-empty' => '"He pawl hian phêk leh media pakhat mah a nei hrih lo."',
-'hidden-categories' => 'Pawl thuhrûk {{PLURAL:$1||-te}}',
+'hidden-categories' => 'Pawl thuhrûk{{PLURAL:$1||te}}',
 'hidden-category-category' => 'Pawl thuhrûkte',
-'category-subcat-count' => '{{PLURAL:$2|He pawl hian he pawlpeng chauh hi a nei. |He pawl hian heng: {{PLURAL:$1|pawlpeng|pawlpeng $1-te}} hi a nei, a vaia $2 zingah.}}',
-'category-subcat-count-limited' => 'He pawl hian hengte hi a ni: {{PLURAL:$1|pawlpeng|$1 pawlpengte}}',
-'category-article-count' => '{{PLURAL:$2|He pawl hian hë phêk chauh hi a nei. | Heng phek{{PLURAL:$1||$1-te}} hi he pawlah hian a awm, a vaia $2 zingah.}}',
+'category-subcat-count' => '{{PLURAL:$2|He pawl hian he pawlpeng chauh hi a nei. |He pawl hian heng  {{PLURAL:$1|pawlpéng|pawlpéng $1-te}} hi a nei, avaia  $2  zingah.}}',
+'category-subcat-count-limited' => "He pawl hian  {{PLURAL:$1|hë pawlpéng chauh|$1 hê'ng pawlpéngte}} hi a nei.",
+'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 (file) 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' => '{{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|$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',
@@ -172,7 +172,7 @@ $messages = array(
 'vector-simplesearch-preference' => 'Sawn awlsam lehzualna rawtna awmtir rawh (Vektawr vun tan chauh)',
 'vector-view-create' => 'Siamna',
 'vector-view-edit' => 'Siamţhatna',
-'vector-view-history' => 'A chanchin enna',
+'vector-view-history' => 'Hunhlui-chanchin',
 'vector-view-view' => 'Chhiarna',
 'vector-view-viewsource' => 'A hnar enna',
 'actions' => 'Thiltih',
@@ -181,20 +181,20 @@ $messages = array(
 
 'errorpagetitle' => 'Dik lo',
 'returnto' => '$1 phekah kir leh rawh.',
-'tagline' => '{{SITENAME}} aţangin',
-'help' => 'Ţanpuina',
+'tagline' => '{{SITENAME}} aangin',
+'help' => 'anpuina',
 'search' => 'Zawnna',
 'searchbutton' => 'Zawng rawh le',
-'go' => 'Kal rawh le',
-'searcharticle' => 'Kal rawh le',
+'go' => 'Khai le',
+'searcharticle' => 'Khai le',
 'history' => 'Phêk chanchin',
 'history_short' => 'Chanchin',
 'updatedmarker' => 'ka tlawh hnuhnun ber hnua tihdanglam',
-'printableversion' => 'Nemkai theih',
+'printableversion' => 'Chhụtkài theih',
 'permalink' => 'Hlet hlun',
-'print' => 'Nemkaina',
+'print' => 'Chhụkàina',
 'view' => 'Enna',
-'edit' => 'Siamţhatna',
+'edit' => 'Siamhatna',
 'create' => 'Siamna',
 'editthispage' => 'He phek hi siamţha rawh',
 'create-this-page' => 'He phêk hi siam rawh',
@@ -226,7 +226,7 @@ $messages = array(
 'categorypage' => 'Pawl phêk enna',
 'viewtalkpage' => 'Sawinona en rawh',
 'otherlanguages' => 'Ţawng dangin',
-'redirectedfrom' => '($1 aţanga hruailuh a ni)',
+'redirectedfrom' => '($1 aanga hruailuh a ni)',
 'redirectpagesub' => 'Hruailuhna phêk',
 'lastmodifiedat' => 'Hemi phek hi ni $1,  dar $2 khan siamţhat hnuhnun ber a ni.',
 'viewcount' => 'He phêk hi vawi {{PLURAL:$1|khat|$1}} tlawh a ni tawh.',
@@ -247,8 +247,8 @@ $1',
 'aboutsite' => '{{SITENAME}}  chungchang',
 'aboutpage' => 'Project:Chungchang',
 'copyright' => 'A chhung thute hi $1 hmanga lakchhawn phal a ni.',
-'copyrightpage' => '{{ns:project}}:Lakchhawn phalna',
-'currentevents' => 'Chanchin thar',
+'copyrightpage' => '{{ns:project}}:Lakchhawn phalphung',
+'currentevents' => 'Chanchinthar',
 'currentevents-url' => 'Project: Chanchin thar',
 'disclaimers' => 'Intlawhkhalhna',
 'disclaimerpage' => 'Project: Intlawhkhalhna Dan',
@@ -272,7 +272,7 @@ $1',
 [[Special:Version|version page]] en rawh.',
 
 'ok' => 'Aw le',
-'retrievedfrom' => '"$1" aţanga lâk chhuah',
+'retrievedfrom' => '"$1" aanga lâk chhuah',
 'youhavenewmessages' => '($2) $1 i nei.',
 'newmessageslink' => 'thudawn thar',
 'newmessagesdifflink' => 'tihdanglam thar',
@@ -284,8 +284,8 @@ $1',
 'viewsourcelink' => 'a hnar enna',
 'editsectionhint' => 'Hemi thuhlawm hi siamţha rawh le: $1',
 'toc' => 'A chhung thute',
-'showtoc' => 'tihlanna',
-'hidetoc' => 'tihbona',
+'showtoc' => 'pharhna',
+'hidetoc' => 'thlehna',
 'collapsible-collapse' => 'Thlehna',
 'collapsible-expand' => 'Pharhna',
 'thisisdeleted' => '$1 hi en emaw, dah lêt leh emaw i duh em?',
@@ -318,7 +318,7 @@ $1',
 'nosuchaction' => 'Hetiang hi a tih theih loh',
 'nosuchactiontext' => 'URL-a tihtur lang hi a tihtheih loh.
 URL i chhu dik lo a ni mai thei, emaw zawm dik loah i kal a niang.
-{{SITENAME}} software hmanah hian dik tawk lo lai a awm a ni thei bawk.',
+{{SITENAME}} khawlthlûak hmanah hian dik tawk lo lai a awm a ni thei bawk.',
 'nosuchspecialpage' => 'Hetiang vohbik phek hi a awm lo',
 'nospecialpagetext' => '<strong>Vohbik phek awm lo en i tum.</strong>
 
@@ -327,6 +327,12 @@ Vohbik phekte chu hetah hian a en theih [[Special:SpecialPages|{{int:specialpage
 # General errors
 'error' => 'Dik lo',
 'databaseerror' => 'Database dik loh',
+'dberrortext' => 'Zémpui zawhna tih dik loh a awm palh.
+Kháwlthlûakah hrik a awm tihna a ni mai thei.
+Zémpui zawhna hnuhnüng ber chu:
+<blockquote><tt>$1<tt></blockquote>,
+"<<tt>$2</tt>" tih hnathawh chhúng aṭang.
+Zémpuiin dikhlelhna "<tt>$3: $4</tt>" a rawn khawhkïr.',
 'laggedslavemode' => "'''Vaukhanna:''' He phêk hian tun hnaia siam thar a pho lang lo mai thei.",
 'readonly' => 'Database kalh a ni',
 'enterlockreason' => 'I kalhna chhan leh i hawn leh hun tura i rin sawi rawh',
@@ -378,6 +384,8 @@ $2',
 'customjsprotected' => 'Hmangtu dang mimal thil a tel avangin he JavaScript phêk hi siamţhat phalsak i ni lo.',
 'ns-specialprotected' => 'Phêk vohbîkte siam danglam theih a ni lo.',
 'titleprotected' => 'He phêk hi hmangtu [[User:$1|$1]] siam phalsak a ni lo. A chhan hetah: "\'\'$2\'\'" hian pêk a ni.',
+'invalidtitle-knownnamespace' => 'Hming pawm loh hminghmun "$2"-a "$3" tih thu chuang.',
+'invalidtitle-unknownnamespace' => 'Hming pawm loh leh hminghmun zât hriat loh $1-a thu chuang "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Inremdan dikhlel: Hrik thiantu hriat loh: ''$1''",
@@ -394,7 +402,7 @@ I [[Special:Preferences|{{SITENAME}}duhdàn]] siam danglam theihnghilh suh ang c
 'yourname' => 'Hmangtuhming:',
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
-'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
+'remembermypassword' => 'He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.',
 'securelogin-stick-https' => 'Luh hnuah HTTPS-ah hian chëng reng rawh.',
 'yourdomainname' => 'I ram:',
 'externaldberror' => 'Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.',
@@ -428,6 +436,7 @@ I thilziah enfiah rawh, a nih loh pawhin [[Special:UserLogin/signup|siangchan th
 'nosuchusershort' => 'Hmangtu hming "$1" a awm lo.
 I thilziah enfiah rawh.',
 'nouserspecified' => 'Hmangtuhming i ziah a ngai.',
+'login-userblocked' => 'Hë hmangtu hi danbeh a ni. Luh phalsak a ni lo.',
 'wrongpassword' => 'Thurûk dik lo.
 Khawngaihin tum nawn leh rawh.',
 'wrongpasswordempty' => 'Thurûk i ziak lo.
@@ -450,9 +459,14 @@ A hnuaia mi eng vang pawh hian e-lehkha thawn a ni lo vang:',
 'invalidemailaddress' => 'A awmphung a dik loh avangin he e-chenhmun hi pawm theih a ni lo.
 E-chenhmun dik tak ziaklût rawh, a nih loh leh thai reh vek rawh.',
 'cannotchangeemail' => 'He wiki-ah hian siangchan e-chenhmun thlâk theih a ni lo.',
+'emaildisabled' => 'Hë rangpuihmun hian e-lehkha a thawn thei lo',
 'accountcreated' => 'Siangchan siamfel a ni ta.',
 'accountcreatedtext' => '$1 tana hmangtu siangchan siamfel a ni ta.',
 'createaccount-title' => '{{SITENAME}} tana siangchan siam',
+'createaccount-text' => 'Tüemawin {{SITENAME}}-ah ($4) i e-chènhmun hmangin "$2" tih hming púin, thurûka "$3" tih hmangin siangchan a lo siam a.
+Thurûk tidanglam tùrin i luh vat a ngái.
+
+Hë siangchan hi siam sual palh a nih chuan hë thuthawn hi i ngaihthah dáwn nia.',
 'usernamehasherror' => 'Hmangtuhmingin bawhtah lem a hmang thiang lo',
 'login-throttled' => 'Tunhnai maiah luh i tum ngun lutuk.
 I tum leh hmain nghâk lawk ang che.',
@@ -483,6 +497,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
@@ -558,9 +573,9 @@ I siangchan thurûk hi [[Special:ChangePassword|thurûk tihdanglamna]]-ah i inzi
 Tihsual palh thilthua heta lo lût i nih chuan i rangpuifanna-a '''letna''' fei zawnah hmet rawh.",
 'noarticletext' => 'He phêkah hian thu a la awm hrih lo.
 Phêk dangah [[Special:Search/{{PAGENAME}}| he phêk hming hi i zawng]] thei ang, a nih loh pawhin a laichin 
-<span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} log dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}} | page={{FULLPAGENAMEE}}}} chanchin-ziak dang i zawng thei ang]; a nih loh chuan [{{fullurl:{{FULLPAGENAME}}|action=edit}} he phêk hi i siamţha thei ang] </span>.',
 'noarticletext-nopermission' => 'He phêkah hian thu a la awm hrih lo.
-He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{GULLPAGENAMEE}}}} a laichin chanchin dang] i zawng thei bawk ang. </span>',
+He phêk hming hi hmun dangah i [[Special:Search/{{PAGENAME}}|zawng]] thei ang, a nih loh pawhin <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}-a a laichin chanchin dang] i zawng thei bawk ang. </span>',
 'userpage-userdoesnotexist' => 'Hmangtu siangchan "$1" hi hriat a ni lo.
 He phêk hi siam/siamţhat emaw i duh chuan enfiah rawh.',
 'userpage-userdoesnotexist-view' => 'Hmangtu siangchan "$1" hi hriat a ni lo.',
@@ -570,16 +585,26 @@ I rawn atan a danbeh chhinchhiahna kan han tarlang a ni e:',
 'userjsyoucanpreview' => "'''Rawlrûk:''' I JavaScript thar fiah tùrin i dahţhat hmain \"{{int:showpreview}}\" hmehkhep hi hmang rawh.",
 'note' => "'''Hriat tùr:'''",
 'previewnote' => "'''Heihi endikna chauh a ni tih hrereng ang che.'''
-I tihdanglamna dahţhat a la ni lo!  [[#editform|→ Ziah chhunzawmna]]",
+I tihdanglamna dahţhat a la ni lo!",
+'continue-editing' => 'Siamṭhat chhunzawmna',
+'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',
+'creating' => '$1 i siam mék',
 'editingsection' => '$1 (hlawm) i siam(ţha) mék',
 'editingcomment' => '$1 (hlawm thar) i siam(ţha) mék',
 'editconflict' => 'Siamţhat inchuh: $1',
 'yourtext' => 'I thu tah hian:',
 'storedversion' => 'Ennawnna vawnţhat',
 'yourdiff' => 'Danglamnate',
-'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:",
+'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 theih tùra vènhim a ni.
+I ràwn tùrin siam danglamna chanchin ziaka kan dahţhat thạr ber a hnuaiah khuan kan rawn chhawpchhûak e:",
 'templatesused' => 'He phêka {{PLURAL:$1|siamsa hman|siamsa hmante}}',
 'templatesusedpreview' => 'He endiknaa {{PLURAL:$1|Siamsa hman|Siamsa hmante}}:',
 'templatesusedsection' => 'Hemi hlawma  {{PLURAL:$1|Siamsa hman|Siamsa hmante}}',
@@ -598,10 +623,14 @@ He phêk buaipui chhunzawm hi a remchang nge chang lo tih inbihchiang rawh.
 Remchangah he phek paihna leh sawnna chhinchhiahna-ziak rawn chhawp chhuah a ni e:",
 'moveddeleted-notice' => 'He phek hi paih tawh a ni.
 I rawn atan he phek paihna leh sawnna chanchin chhinchhiahna a hnuaiah khuan chhawp chhuah a ni.',
-'log-fulllog' => 'Chanchin chhinchhiah kimchang enna',
+'log-fulllog' => 'Chanchin chhinchhiah kimchang hetah hian a en theih e.',
+'edit-gone-missing' => 'Phêk bithuam theih a ni lo.
+Nuaibo a ni tawh a nih hmèl.',
 'edit-conflict' => 'Siamţhat inchuh buaina.',
+'edit-no-change' => 'Tihdanglam i neih leh tâk loh avangin i siamṭhatna ngaihthah a ni.',
 'edit-already-exists' => 'Phêk thar siam theih a ni lo.
 A awm tawh sa.',
+'defaultmessagetext' => 'Thuthawn tùr ziahsa',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Vaukhanna:''' Siamsa telh a lian leh lutuk.
@@ -613,8 +642,9 @@ Heng kawngte hi hmaih mai tur.",
 
 # History pages
 'viewpagelogs' => 'He phêk chanchin hi en rawh',
+'nohistory' => 'Hë phêk siamṭhatna chanchin ziak a awm lo tlat.',
 'currentrev' => 'Ennawnna hnuhnung ber',
-'currentrev-asof' => 'Ni $1-a ennawnna hnuhnung ber',
+'currentrev-asof' => 'Dar $1-a ennawnna hnuhnung ber',
 'revisionasof' => '$1 -a ennawnna zawng',
 'revision-info' => '$1-a $2 ennawnna',
 'previousrevision' => '←Ennawnna hlui zâwk',
@@ -631,9 +661,12 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'history-show-deleted' => 'Nuaibo tawh zawng chauh',
 'histfirst' => 'Hmasa ber',
 'histlast' => 'Hnuhnung ber',
+'historysize' => '({{PLURAL:$1|bait 1 |bait $1}})',
+'historyempty' => '(ruak)',
 
 # Revision feed
 'history-feed-title' => 'Ennawnna chanchin',
+'history-feed-description' => 'Wiki-a hemi phêk ennawnna chanchin',
 'history-feed-item-nocomment' => '$1-in $2-ah',
 
 # Revision deletion
@@ -647,15 +680,21 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'revdel-restore-deleted' => 'ennawnna nuaibo tawhte',
 'revdel-restore-visible' => 'ennawn hmuh theih chin',
 'pagehist' => 'Phêk chanchin',
+'deletedhist' => 'Chanchin nuaibo',
+'revdelete-reasonotherlist' => 'Chhan dang',
+'revdelete-edit-reasonlist' => 'Nuaibona chhante siamṭhatna',
+'revdelete-offender' => 'Ennawntu:',
+
+# Suppression log
+'suppressionlog' => 'Nuaibo chhinchhiahna',
 
 # Merge log
 'revertmerge' => 'Ţhenhranna',
 
 # Diffs
 'history-title' => '"$1" ennawnna chanchin',
-'difference' => '(Ennawnnate danglamna)',
 'lineno' => 'Tlar $1:',
-'compareselectedversions' => 'Ennawnna i thlan tâkte khi khaikhin rawh le',
+'compareselectedversions' => 'Ennawnna i thlan tâkte khaikhin rawh le',
 'editundo' => 'tihletna',
 'diff-multi' => '(Hmangtu {{PLURAL:$2|1-in|$2-ten}} a karlaka {{PLURAL:$2|a|an}} ennawnna {{PLURAL:$1|1|$1-te}} tihlan a ni lo)',
 
@@ -668,6 +707,7 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'nextn-title' => 'Zawnchhuah dawt leh $1 {{PLURAL:$1||}}',
 'shown-title' => 'Phek khatah zawnchhuah $1 {{PLURAL:$1||}} zel tilang rawh',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) en rawh',
+'searchmenu-legend' => 'Zawn duhthlanna',
 'searchmenu-exists' => "'''He wiki-ah hian \"[[:\$1]]\" tia koh phêk a awm.'''",
 'searchmenu-new' => "'''[[:$1]] phek hi he wiki-ah hian siam rawh le!'''",
 'searchhelp-url' => 'Help:A chhunga thu awmte',
@@ -698,7 +738,7 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'searcheverything-enable' => 'Hminghmun zawng zawngah zawng rawh',
 'searchrelated' => 'laichin',
 'searchall' => 'a vaiin',
-'showingresultsheader' => "'''$4''' tana {{PLURAL:$5|chhuak  '''$3''' zinga '''$1'''|chhuak '''$3''' zinga  '''$1 - $2'''  }}",
+'showingresultsheader' => "'''$4'''  tana {{PLURAL:$5|chhuak   '''$3'''  zinga  '''$1'''|chhuak  '''$3'''  zinga   '''$1 - $2'''  }}",
 'search-nonefound' => 'I zawn mil a awm lo',
 'powersearch' => 'Zawnna chi sang',
 'powersearch-legend' => 'Zawnna chi sang',
@@ -735,10 +775,11 @@ Google hmangin i lo zawng hrih thei ang.
 'prefs-beta' => 'Beta hman theihnate',
 'prefs-datetime' => 'Hun leh ni',
 'prefs-labs' => '"Lab" hman theihnate',
+'prefs-user-pages' => 'Hmangtu phêkte',
 'prefs-personal' => 'Hmangtu chanchin tawi',
 'prefs-rc' => 'Tihdanglam thar',
 'prefs-watchlist' => 'Ralvèn',
-'prefs-watchlist-days' => 'Ralvèna ni tihlang tùr chin:',
+'prefs-watchlist-days' => 'Ralvèna ni tihlan tùr chin:',
 'prefs-watchlist-days-max' => 'A rei berah ni $1 {{PLURAL:$1||}}',
 'prefs-watchlist-edits' => 'Ralvèn pawhseia tihdanglam zât tihlan tùr tam ber:',
 'prefs-watchlist-edits-max' => 'A tam ber: 1000',
@@ -827,11 +868,11 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'prefs-signature' => 'Hmingtàr',
 'prefs-dateformat' => 'Hun tarlan dan tùr',
 'prefs-timeoffset' => 'Hun inthlauhna',
-'prefs-advancedediting' => 'Duhthlan sang',
-'prefs-advancedrc' => 'Duhthlan sang',
-'prefs-advancedrendering' => 'Duhthlan sang',
-'prefs-advancedsearchoptions' => 'Duhthlan sang',
-'prefs-advancedwatchlist' => 'Duhthlan sang',
+'prefs-advancedediting' => 'Duhthlan ràiril',
+'prefs-advancedrc' => 'Duhthlan ràiril',
+'prefs-advancedrendering' => 'Duhthlan ràiril',
+'prefs-advancedsearchoptions' => 'Duhthlan ràiril',
+'prefs-advancedwatchlist' => 'Duhthlan ràiril',
 'prefs-displayrc' => 'Duhthlanna tilang rawh',
 'prefs-displaysearchoptions' => 'Duhthlanna tilang rawh',
 'prefs-displaywatchlist' => 'Duhthlanna tilang rawh',
@@ -894,6 +935,7 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'right-move-subpages' => 'Phêkte leh an phêkpéngte sawnna',
 'right-move-rootuserpages' => 'Hmangtu bulte sawnna',
 'right-movefile' => 'Taksa sawnna',
+'right-suppressredirect' => 'Phêk sawna hruailuhna phêk siam lohtírna',
 'right-upload' => 'Taksa hlankaina',
 'right-reupload' => 'Taksa awmsa ziahhnan rawh',
 'right-reupload-own' => 'Mahni hlankai taksa awmsa ziahhnan rawh',
@@ -912,7 +954,7 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'he phêk hi chhiar rawh',
-'action-edit' => 'he phek hi siamţha rawh',
+'action-edit' => 'phek siamṭhat',
 'action-createpage' => 'phêk siam tharna',
 'action-createtalk' => 'sawihona phêk siamna',
 'action-createaccount' => 'he hmangtu siangchan hi siam rawh',
@@ -927,17 +969,19 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'action-writeapi' => 'ziakna WPI hmang rawh',
 'action-delete' => 'he phêk hi paih rawh',
 'action-deleterevision' => 'he ennawnna hi paih rawh',
+'action-deletedhistory' => 'phêk chanchin nuaibo tawh enna',
 'action-browsearchive' => 'phêk nuaibo tawhte zawng rawh',
 'action-undelete' => 'he phêk hi lakir leh rawh',
+'action-suppressionlog' => 'mimal chanchin bîk enna',
 'action-block' => 'he hmangtuina a siam danglam tùr hi däl rawh',
 
 # Recent changes
 'nchanges' => 'Tihdanglam {{PLURAL:$1||$1-te}}',
 'recentchanges' => 'Tihdanglam thar',
 'recentchanges-legend' => 'Tihdanglam thar duhdàn',
-'recentchangestext' => 'He phek wiki-a tihdanglamna thar deuh deuhte chhui rawh.',
+'recentchanges-summary' => 'He phek wiki-a tihdanglamna thar deuh deuhte chhui rawh.',
 'recentchanges-feed-description' => 'He chawm-a wiki tihdanglamna thar deuh deuhte chhui rawh.',
-'recentchanges-label-newpage' => 'He siamţhat hian phêk thar a siam',
+'recentchanges-label-newpage' => 'Hei hi phêk thar siamna a ni.',
 'recentchanges-label-minor' => 'Hei hi siamţhatna tenau a ni',
 'recentchanges-label-bot' => 'He siamţhat hi khawlmi tih a ni',
 'recentchanges-label-unpatrolled' => 'He siamţhat hi viltu la nei lo a ni',
@@ -958,11 +1002,18 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 'minoreditletter' => 't',
 'newpageletter' => 'T',
 'boteditletter' => 'k',
+'number_of_watching_users_pageview' => '[$1 hmangtu {{PLURAL:$1||te}} vil mék]',
+'rc_categories' => 'Pawla bithliahna ("|" hmangin kárdan rawh)',
+'rc_categories_any' => 'Väi',
+'rc-change-size-new' => 'Tihdanglam hnuah {{PLURAL:$1|bait|bait}} $1',
+'newsectionsummary' => '/* $1 */ hläwm thar',
 '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.',
@@ -981,16 +1032,28 @@ 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:",
+'uploadtext' => "Taksa hlankai nan a hnuaia lehkha hi hmang rawh.
+Ahmaa taksa hlankaisaho en tùr emaw zawng tùr chuan [[Special:FileList|taksa hlankai tawh zawng zawng tlarna]] tihah hian kal rawh; hlankai (nawn)ho pawh [[Special:Log/upload|hlankai chhinchhiahna]]-ah vawnfel an ni a, paih tawhho pawh [[Special:Log/delete|paihho chhinchhiahna]]-ah chhinchhiah fel vek an ni.
+
+Phêka taksa hmang tùrin ahnuaia tihphung engemaw ni ber hmang khuan zawmna i siam thei ang:
+*A taksa pumpui hmang tùr chuan '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>''' tiin. Heti hi chuan taksa hi i sezawl chhuah a ni.
+*Phêk veilam síra 'Sawifiahna' hmanga 200px-a liana i tàrlan duh chuan '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|Sawifiahna]]</nowiki></tt>'''  tiin.
+*A taksa tárlang lova zawm ringawt i duh chuan '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>''' tiin.",
 'upload-permitted' => 'Taksa phal chiho: $1.',
 'upload-preferred' => 'Taksa duh deuh bîk: $1.',
 'upload-prohibited' => 'Taksa khap: $1.',
-'uploadlog' => 'chanchin hlankaina',
+'uploadlog' => 'hlankai chhinchhiahna',
 'uploadlogpage' => 'Hlankai chhinchhiahna',
+'uploadlogpagetext' => 'Taksa hlankai thar deuh deuh kan rawn tlar chhuak e.
+A aia hmuhnawm deuh zâwka i thlìr duh chuan [[Special:NewFiles|taksa hlankai thar tàrhmunpui]]-ah i kal thei ang.',
 'filename' => 'Taksahming',
-'filedesc' => 'Laktawi',
-'fileuploadsummary' => 'Kaihtawi:',
+'filedesc' => 'Sawifiahna täwi',
+'fileuploadsummary' => 'Sawifiahna täwi:',
 'filereuploadsummary' => 'Taksa tihdanglamna:',
-'filestatus' => 'Copyright dinhmun:',
+'filestatus' => 'Lâkchhàwn phalphung dinhmun:',
 'filesource' => 'Hnar:',
 'uploadedfiles' => 'Taksa hlankai tawhte',
 'ignorewarning' => 'Vaukhanna ngaihthah la taksa dahţha lui rawh',
@@ -1000,7 +1063,11 @@ Hmangtuten e-lehkha an thawn chein i e-chenhmun hrilh an ni chuang lo vang.',
 A hming thlâk la bei ţha leh rawh.',
 'filename-toolong' => 'Taksahming 240 bytes aiin a sei tùr a ni lo.',
 'badfilename' => 'Taksahming "$1"-ah thlâk a ni.',
-'filetype-missing' => 'Taksa in tawpna a nei lo (entirna ".jpg").',
+'filetype-mime-mismatch' => 'Taksa hming zauhna ".$1"-in a taksa MIME chî kan hmuh ($2) a mil lo tlat.',
+'filetype-badmime' => '"$1" ang MIME chî taksa hlànkài phal a ni lo.',
+'filetype-unwanted-type' => "'''\".\$1\"''' hi taksa phal loh chî a ni.
+Taksa phalzáwng{{PLURAL:\$3||te}} chu: \$2.",
+'filetype-missing' => 'Taksain tawpna a nei lo (entirna ".jpg").',
 'empty-file' => 'I taksa thehluh kha a ruak.',
 'file-too-large' => 'A lian leh lutuk.',
 'filename-tooshort' => 'Taksahming a sawi leh lutuk.',
@@ -1010,13 +1077,50 @@ A hming thlâk la bei ţha leh rawh.',
 'illegal-filename' => 'Taksahming phal loh.',
 'overwrite' => 'Taksa awmsa ziah hnan khap a ni.',
 'unknown-error' => 'Dikhlelhna hriat loh a lo thleng.',
+'tmp-create-error' => 'Taksa lailâwk a siam theih loh.',
+'tmp-write-error' => 'Taksa lailâwk ziah a tlawlh',
+'large-file' => 'Taksa rëng rëng $1 aia lian lo tùra duh a ni;
+he taksa hi $2 lái a ni.',
+'largefileserver' => 'Hë taksa hi rawngbawltu phaltir zât aia ritsak a ni.',
+'windows-nonascii-filename' => 'Hë wiki hian taksahminga chhinchhiahna bîk tel a pawm thei lo.',
+'savefile' => 'Taksa dahṭhatna',
 'uploadedimage' => 'hlankai: "[[$1]]"',
+'uploadvirus' => 'I taksa hlànkài tumin hrik a päi!
+Chanchin kimchang: $1',
+'upload-source' => 'Hnar taksa',
+'sourcefilename' => 'Hnar taksahming:',
+'sourceurl' => 'Hnar URL:',
+'destfilename' => 'Tumhmun taksahming:',
+'upload-maxfilesize' => 'Taksa lenzáwng bituk: $1 aia lian lo.',
+'upload-description' => 'Taksa sawifiahna',
+'upload-options' => 'Hlankai duhdàn thlanna',
+'watchthisupload' => 'Hë taksa hi vil rawh',
+'filewasdeleted' => 'He hming pu taksa hi ahmaah lo hlankai tawh a ni a, paihbo leh nghâl a ni.
+Hlankai leh i tum hmain $1 i thlïthläi deuh dawn nia.',
+'upload-success-subj' => 'Hlawhtling taka hlankai a ni',
+'upload-success-msg' => '[$2] aṭangin i hlangkai hlawhtling ta e. Hetah hian hman theihin a awm ta: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Hlankai rokhawlhna',
+'upload-failure-msg' => '[$2] aṭanga i hlankai tumnaah rokhawlhna a awm tlat:
 
-'license' => 'Phalna:',
-'license-header' => 'Phalna:',
+$1',
+'upload-warning-subj' => 'Hlankai vauhkhànna',
+'upload-warning-msg' => '[$2] aṭanga i hlankaiah rokhawlhna a awm tlat. [[Special:Upload/stash/$1|Hlankaina lehkha]]-ah chingfel tùrin i lêt leh thei ang.',
+
+'upload-proto-error' => 'Inpawhphung dikhlel',
+'upload-file-error' => 'Chhúnglam dik lohna',
+
+'license' => 'Phalphung:',
+'license-header' => 'Phalphung:',
+'nolicense' => 'I la thlang lo',
+'license-nopreview' => '(Endik chhin theih loh)',
+'upload_source_url' => '(URL tláng pawh theih, nung bawk)',
+'upload_source_file' => '(i khawlthlûakneia mi taksa)',
 
 # Special:ListFiles
-'imgfile' => 'taksa (file)',
+'listfiles-summary' => 'Hë vohbîk phêk hian taksa hlankai tawh zawng zawng a pholang.
+Hmangtu azira i thliarhran erawh chuan a hmangtuina a hlankai hnuhnüng ber taksa chauh pholan a ni.',
+'listfiles_search_for' => 'Media hming zawnna:',
+'imgfile' => 'taksa',
 'listfiles' => 'Taksa tlarna',
 'listfiles_thumb' => 'Kutbï',
 'listfiles_date' => 'Ni',
@@ -1027,8 +1131,8 @@ A hming thlâk la bei ţha leh rawh.',
 'listfiles_count' => 'Chhuah',
 
 # File description page
-'file-anchor-link' => 'Taksa (file)',
-'filehist' => 'A chanchin enna',
+'file-anchor-link' => 'Taksa',
+'filehist' => 'Hunhlui-chanchin',
 'filehist-help' => 'A hunlaia a lan dan en tùrin a hun/ni-ah hmet rawh.',
 'filehist-deleteall' => 'a vaiin nuaibo rawh',
 'filehist-deleteone' => 'nuaibo rawh',
@@ -1045,9 +1149,22 @@ A hming thlâk la bei ţha leh rawh.',
 'filehist-missing' => 'Taksa a awm lo',
 'imagelinks' => 'Bungraw hmanna',
 'linkstoimage' => 'A hnuai  {{PLURAL:$1|phek 1|phek $1-te}} hian he taksa hi a hmang:',
+'linkstoimage-more' => 'Hë taksa hi phêk {{PLURAL:$1||}} $1 aia tamin a zawm/hmang.
+Ahnuaih hian {{PLURAL:$1|zawmtu hmasa ber|zawmtu hmasa $1-te}} kan rawn tlar chhuak e.
+Zawmtu zawng zawng [[Special:WhatLinksHere/$2|tlarchhuahna hetah hian a awm]] e.',
 'nolinkstoimage' => 'He taksa zawmtu/hmanna phêk pakhat mah a awm lo.',
+'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna}}.',
+'linkstoimage-redirect' => '$1 (taksa hruailuhna) $2',
+'duplicatesoffile' => 'A hnuaia taksa{{PLURAL:$1||te}} khu hë taksa nihpui{{PLURAL:$1||te}} a{{PLURAL:$1||n}} ni ([[Special:FileDuplicateSearch/$2|chanchin kimchang]]):',
+'sharedupload' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.',
+'sharedupload-desc-there' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang ve mai thei.
+Hriattirna dang chu [$2 taksa sawifiahna phêk]-ah hian i en thei ang.',
 'sharedupload-desc-here' => 'He taksa hi $1-a mi a ni a, hna-hmachhawp dangin an hmang ve mai thei.
-[Taksa sawifiahna phek $2]-a sawifiahna lang hetah hian kan rawh chhawp chhuak e.',
+[$2 Taksa sawifiahna phek]-a sawifiahna lang hetah hian kan rawh chhawp chhuak e.',
+'sharedupload-desc-edit' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.
+Taksa sawifiahna hi i siamṭha duh a nih chuan  [$2 taksa sawifiahna phêk] aṭang hian i siamṭha thei ang.',
+'sharedupload-desc-create' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.
+Taksa sawifiahna hi i siamṭha duh a nih chuan  [$2 taksa sawifiahna phêk] aṭang hian i siamṭha thei ang.',
 'filepage-nofile' => 'He hmingpu taksa a awm lo',
 'filepage-nofile-link' => 'He hming pu taksa hi a awm lo va, mahsé i [$1 hlangkai thei] ang.',
 'uploadnewversion-linktext' => 'He taksa chhuah thar hi hlangkai rawh',
@@ -1058,73 +1175,204 @@ A hming thlâk la bei ţha leh rawh.',
 'filerevert' => '$1 tilêt rawh',
 'filerevert-legend' => 'Taksa tilêt rawh',
 
+# MIME search
+'mimetype' => 'MIME chî:',
+'download' => 'hnuhthlâkna',
+
+# Unwatched pages
+'unwatchedpages' => 'Vèn loh phêkte',
+
+# List redirects
+'listredirects' => 'Hruailuhna phêkte',
+
+# Unused templates
+'unusedtemplates' => 'Siamsa hman lohte',
+'unusedtemplateswlh' => 'zawmna dang',
+
 # Random page
 'randompage' => 'Phêk kahpah',
+'randompage-nopages' => "{{PLURAL:$2|Hë hminghmunah hian|Hê'ng hminghmunahte hian}} phêk pakhat mah a awm lo: $1.",
+
+# Random redirect
+'randomredirect' => 'Hruailuhna kahpah',
+'randomredirect-nopages' => '"$1" hminghmunah hian hruailuhna phêk pakhat mah a awm lo.',
 
 # Statistics
 'statistics' => 'Lepsena',
+'statistics-header-pages' => 'Phêk lepsena',
+'statistics-header-edits' => 'Siamṭhatphung lepsena',
+'statistics-header-views' => 'Tlawhna lepsèna',
+'statistics-header-users' => 'Hmangtute chanchin kimchang',
+'statistics-header-hooks' => 'Chanchin dang',
+'statistics-articles' => 'Thuziakna phêkte',
 'statistics-pages' => 'Phekte',
-
+'statistics-pages-desc' => 'Hë wiki-a phêk awm zawng zawng, sawihona phêk, hruailuhna phêk ladt. tel vekin.',
+'statistics-files' => 'Taksa hlankaite',
+'statistics-edits' => '{{SITENAME}} din achina phêk khawih danglam zât',
+'statistics-edits-average' => 'Phêk khat zëla siamṭhat zât chawhrual',
+'statistics-views-total' => 'Tlawh zât',
+'statistics-views-total-desc' => 'Phêk awm lo leh phêk vohbîkte tlawhna chu chhiar tel a ni lo',
+'statistics-views-peredit' => 'Siamṭhat pakhat zël tlawh zât',
+'statistics-users' => '[[Special:ListUsers|Hmangtu]] inziaklût zât',
+'statistics-users-active' => 'Hmangtu aktif zât',
+'statistics-users-active-desc' => 'Ni {{PLURAL:$1|khat|$1}} kaltâ chhunga thiltih nei hmangtuho',
+'statistics-mostpopular' => 'Phêk thlir zin deuh deuhte',
+
+'disambiguations' => 'Thliarfelna phêk zawmtu phêkte',
 'disambiguationspage' => 'Template:thliar',
 
+'doubleredirects' => 'Hruailuhna phír',
+'double-redirect-fixed-move' => '[[$1]] sawn a ni ta.
+[[$2]] lama hruailuhna siam nghâl a ni.',
+'double-redirect-fixed-maintenance' => '[[$1]] aṭanga [[$2]] hruailuhna phír chinfel.',
+'double-redirect-fixer' => 'Hruailuhna chingfeltu',
+
+'brokenredirects' => 'Hruailuhna kehchhia',
+'brokenredirectstext' => 'Ahnuaia hruailuhnate hian phêk awm lova hruailuh an tum:',
 'brokenredirects-edit' => 'siamţhatna',
 'brokenredirects-delete' => 'paihna',
 
 'withoutinterwiki-legend' => 'Thuhmabet',
 'withoutinterwiki-submit' => 'Tihlanna',
 
+'fewestrevisions' => 'Phêk siam danglam hlawh lo zualte',
+
 # Miscellaneous special pages
 'nbytes' => 'Bait {{PLURAL:$1||}} $1',
-'nmembers' => 'Tel (a chhunga awm) {{PLURAL:$1||$1}}',
+'ncategories' => '{{PLURAL:$1|Páwl|Páwl}} $1',
+'nlinks' => '$1 {{PLURAL:$1||}} Zawmna $1',
+'nmembers' => 'A chhungah  {{PLURAL:$1||$1}} a awm.',
+'nrevisions' => 'siamṭhatna $1 {{PLURAL:$1||}}',
+'nviews' => 'vawi $1 {{PLURAL:$1||}} ràwn a ni tawh.',
+'nimagelinks' => 'Phêk $1-ah {{PLURAL:$1||}} hman a ni.',
+'ntransclusions' => 'phêk $1-ah {{PLURAL:$1||}} hman a ni.',
+'specialpage-empty' => 'Thuhawn a awm lo tlat.',
+'lonelypages' => 'Phêk fahrahte',
+'uncategorizedpages' => 'Páwl nei lo phêkte',
+'uncategorizedcategories' => 'Páwl nei lo páwlte',
+'uncategorizedimages' => 'Páwl nei lo taksate',
+'uncategorizedtemplates' => 'Páwl nei lo siamsâte',
+'unusedcategories' => 'Páwl hman lohte',
+'unusedimages' => 'Taksa hman hlawh lote',
 'popularpages' => 'Phêk lärte',
-'prefixindex' => 'Hmabet nei phek zawng zawng',
+'wantedcategories' => 'Páwl mamawhte',
+'wantedpages' => 'Phêk mamawhte',
+'wantedpages-badtitle' => 'Phêk hming dik lo: $1',
+'wantedfiles' => 'Taksa mamawhte',
+'wantedtemplates' => 'Siamsa mamawhte',
+'mostlinked' => 'Phêk zawm hlawh berte',
+'mostlinkedcategories' => 'Pawl zawm hlawh berte',
+'mostlinkedtemplates' => 'Siamsa hman hlawh berte',
+'mostcategories' => 'Telna páwl ngah ber phêkte',
+'mostimages' => 'Taksa hman hlawh berte',
+'mostrevisions' => 'Phêk siam danglam zin berte',
+'prefixindex' => 'Hemi hmabet nei phek zawng zawng',
+'prefixindex-namespace' => 'Hemi ($1 hminghmun) hmabeta neih phêk zawng zawngte',
+'shortpages' => 'Phêk täwite',
+'longpages' => 'Phêk seite',
+'deadendpages' => 'Phêk ralthümte',
+'deadendpagestext' => 'A hnuaia phêkte hian {{SITENAME}}-a phêk dang pakhat mah zawmpui an nei lo.',
+'protectedpages' => 'Phêk vènhimte',
+'protectedpages-indef' => 'Phêk vènhim kumhlunho chauh',
+'protectedpagestext' => 'A hnuaia phêkte hi sawn emaw siam danglam theih loh tùra vènhim an ni',
+'protectedtitles' => 'Hming vènhimte',
+'listusers' => 'Hmangtu tlarna',
+'listusers-editsonly' => 'Siam danglam nei hmangtu chauh pholang rawh',
+'listusers-creationsort' => 'Siam ni indawtin tlar rawh',
+'usereditcount' => 'Siam danglam {{PLURAL:||}} $1',
 'usercreated' => '{{GENDER:$3|}} Ni $1, dar $2-a siam',
 'newpages' => 'Phek tharte',
 'newpages-username' => 'Hmangtu hming:',
 'ancientpages' => 'Phek hluiho',
 'move' => 'Sawnna',
+'movethispage' => 'Hë phêk hi sawn rawh',
+'notargettitle' => 'Tumhmun nei lo',
+'nopagetitle' => 'Hetiang tumhmun phêk hi a awm lo',
+'nopagetext' => 'I tumhmun sawi kher kha a awm lo niin a lang.',
 'pager-newer-n' => '{{PLURAL:$1|thar zawk 1|thar zawk $1}}',
 'pager-older-n' => '{{PLURAL:$1|hlui 1|hlui $1}}',
+'suppress' => 'Hmuh hmaih',
 
 # Book sources
 'booksources' => 'Lehkhabu rawnte',
 'booksources-search-legend' => 'Lehkhabu hnar zingah zawng rawh',
-'booksources-go' => 'Kal rawh le',
+'booksources-go' => 'Khai le',
 
 # Special:Log
+'specialloguserlabel' => 'Buatsaihtu:',
+'speciallogtitlelabel' => 'Tumhmun (hming emaw hmangtu):',
 'log' => 'Chanchin-ziak',
+'all-logs-page' => 'Chanchin-ziak vàntlang thilte:',
+'log-title-wildcard' => 'Hë thüa inṭan hmingte hi zawng rawh',
 
 # Special:AllPages
 'allpages' => 'Phek zawng zawngte',
-'alphaindexline' => '$1 aţanga $2',
+'alphaindexline' => '$1 aanga $2',
 'nextpage' => 'Phek dawt ($1)',
 'prevpage' => 'Phêk hmasa ($1)',
+'allpagesfrom' => 'Hemi aṭanga inṭan hian pholang rawh:',
+'allpagesto' => 'Hemi chin thleng hian:',
 'allarticles' => 'Phek zawng zawngte',
 'allinnamespace' => 'Phêk zawng zawng (hminghmun $1-a mi)',
 'allnotinnamespace' => 'Phêk zawng zawng (hminghmun $1-a awm lo)',
 'allpagesprev' => 'Hma',
 'allpagesnext' => 'Dawt',
-'allpagessubmit' => 'Kal rawh le',
+'allpagessubmit' => 'Khai le',
 'allpagesprefix' => 'Hemi thuhmabeta neih zawng hi pholang rawh:',
 'allpagesbadtitle' => 'Phêk hming dik lo emaw ţawng dang/wiki dang thuhmabet a hmang palh a nih hmel.
 Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
+'allpages-bad-ns' => '{{SITENAME}} hian "$1" tih hminghmun a nei lo.',
+'allpages-hide-redirects' => 'Hruailuhna phêkho thup rawh',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'A thar ber thlirna.',
 
 # Special:Categories
 'categories' => 'Pawlte',
+'categoriespagetext' => 'A hnuaia pawl{{PLURAL:$1||te}} hian phêk emaw media a{{PLURAL:$1||n}} nei.
+Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
+[[Special:WantedCategories|Pawl mamawhho]] en bawk la.',
+'categoriesfrom' => 'Hemi-a inṭan pawlho hi pholang rawh:',
+'special-categories-sort-count' => 'a chhúnga thil awm zât azirin thliar rawh',
 'special-categories-sort-abc' => 'a-aw-b indawtin',
 
 # Special:DeletedContributions
+'deletedcontributions' => 'Hmangtu kutthawhna paihbo tawhte',
+'deletedcontributions-title' => 'Hmangtu kutthawhna paihbo tawhte',
 'sp-deletedcontributions-contribs' => 'kutthawhnate',
 
 # Special:LinkSearch
-'linksearch-ok' => 'Zawng rawh',
+'linksearch' => 'Zawmchhuahna zawnna',
+'linksearch-pat' => 'Thu zawn:',
+'linksearch-ns' => 'Hminghmun:',
+'linksearch-ok' => 'Zawng rawh le',
 'linksearch-line' => '$1 hi $2 aţanga thlunzawm a ni',
 
+# Special:ListUsers
+'listusersfrom' => 'Hemi-a inṭanin hmangtuho pholang rawh:',
+'listusers-submit' => 'Pholanna',
+'listusers-noresult' => 'Hmangtu an awm lo.',
+'listusers-blocked' => '(danbeh)',
+
+# Special:ActiveUsers
+'activeusers' => 'Hmangtu hlun tlarna',
+'activeusers-hidebots' => 'Khawlmi thupna',
+'activeusers-hidesysops' => 'Roreltu thupna',
+'activeusers-noresult' => 'Hmangtu awm lo.',
+
 # Special:Log/newusers
 'newuserlogpage' => 'Hmangtu siamna chanchin-ziak',
+'newuserlogpagetext' => 'Hei hi hmangtu siangchan siam chhinchhiahna a ni.',
 
 # Special:ListGroupRights
+'listgrouprights' => 'Hmangtu pawl dikna-chanvote',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">Dikna-chanvo phalsak</span>
+* <span class="listgrouprights-revoked">Dikna-chanvo hnuhkirsak</span>',
+'listgrouprights-group' => 'Pawl',
+'listgrouprights-rights' => 'Dikna-chanvo',
+'listgrouprights-helppage' => 'Help:Pawl dikna-chanvo',
 'listgrouprights-members' => '(tel zawng zawng)',
+'listgrouprights-addgroup' => '{{PLURAL:$2|Pawl|Pawl}} belhna: $1',
 
 # E-mail user
 'emailuser' => 'He hmangtu hi e-lehkha thawn rawh',
@@ -1140,16 +1388,18 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'emailccsubject' => '$1: $2 hnenah thawn bawk rawh',
 'emailsent' => 'E-lehkha thawn a ni.',
 'emailsenttext' => 'I e-lehkha thawn a ni.',
+'emailuserfooter' => 'Hë e-lehkha hi {{SITENAME}}-a "Hmangtu e-lehkha thawn rawh" tih hmanraw hmanga $1-in $2 a thawn a ni.',
 
 # User Messenger
+'usermessage-summary' => 'Kháwlthuthawn a hnutchhiah e.',
 'usermessage-editor' => 'Thuthawntu khawl',
 
 # Watchlist
 'watchlist' => 'Ka ralvèn',
 'mywatchlist' => 'Ka ralvèn',
 'watchlistfor2' => '$1 tan $2',
-'nowatchlist' => 'I ràlvènah engmah i nei lo.',
-'watchlistanontext' => 'I ralvèn en tùrin emaw siamţha tùrin $1 rawh.',
+'nowatchlist' => 'Rálvèn i nei lo',
+'watchlistanontext' => 'I ralvèn en tùrin emaw siamha tùrin $1 rawh.',
 'watchnologin' => 'I la lût lo',
 'watchnologintext' => 'I ralvèn tidanglam tùrin i [[Special:UserLogin|inziahluh]] a ngai.',
 'addwatch' => 'Ràlvèn zingah telh rawh',
@@ -1160,6 +1410,7 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'unwatch' => 'Vil tihtawpna',
 'unwatchthispage' => 'Vil tihtawpna',
 'notanarticle' => 'Phêk dikdawh a ni lo.',
+'notvisiblerev' => 'Hmangtu dang tihdanglamna thar paihbo a ni.',
 'watchnochange' => 'I hun sawi chhungah khan i ralvèn khawih buai a ni lo.',
 'watchlist-details' => 'I ralvèn zing aţanga {{PLURAL:$1| phêk $1 |phêk $1}}, sawihona phêk chhiar lohvin.',
 'wlheader-enotif' => '*E-lehkha inhriattirna tihnun a ni.',
@@ -1170,19 +1421,117 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'wlshowlast' => 'Darkar $1 kalta-a tihdanglam tilang rawh , ni $2 kalta-a tihdanglam tilang rawh, $3 tilang rawh',
 'watchlist-options' => 'Ralvèn duhdàn',
 
+'enotif_reset' => 'Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.',
+'enotif_newpagetext' => 'Hei hi phêk thar a ni.',
+'enotif_impersonal_salutation' => '{{SITENAME}} hmangtu',
+'changed' => 'tihdanglam a ni ta',
+'created' => 'siam a ni ta',
+'enotif_subject' => '{{SITENAME}} phêk $PAGETITLE tih hi $CHANGEDORCREATED,  $PAGEEDITOR bultum a ni.',
+'enotif_lastvisited' => 'I tlawh hnuhnùn ber hnu lama tihdanglam zawng zawng en i duh chuan $1 en rawh.',
+'enotif_lastdiff' => 'Hë tihdanglamna hi en tùrin $1 thlír rawh.',
+'enotif_anon_editor' => 'hmangtu hriat loh $1',
+
 # Delete
+'deletepage' => 'Hë phêk hi paih rawh',
+'confirm' => 'Tihchianna',
+'excontent' => 'kentel: "$1"',
+'excontentauthor' => 'kentel: "$1" (kutthawhtu awm chhun "[[Special:Contributions/$2|$2]])',
+'exbeforeblank' => 'tihruah hmaa a thufùn: $1',
+'exblank' => 'phêk ruak a ni',
+'delete-confirm' => '"$1" paihbona',
+'delete-legend' => 'Nuaibona',
+'historywarning' => "'''Vàukhànna:''' I nuaibo tum phêk hian khawih danglam vawi $1{{PLURAL:$1||}} vêl zet a lo tâwk tawh.",
+'confirmdeletetext' => 'Phêk pakhat leh a chanchin-ziak zawng zawng i nuaibo vek dawn mék a ni.
+Hei hi i tih tum rëng a ni a, a hnuleh i hre chiang a, [[{{MediaWiki:Policy-url}}|rèlphung]] dàn zúl i zui ngèi a ni tih finfiah phawt rawh le.',
 'actioncomplete' => 'A zo ta',
 'actionfailed' => 'A tlawlh',
+'deletedtext' => '"$1" nuaibo a ni ta.
+Tün hnäia nuaibo thar chhinchhiahna $2-ah i en thei ang.',
 'dellogpage' => 'Nuaibo chhinchhiahna',
+'dellogpagetext' => 'A hnuaiah hian tün hnaia nuaibo tharho kan rawn chhawp chhuak e.',
+'deletionlog' => 'nuaibo chhinchhiahna',
+'reverted' => 'Awmphung hluiah dah lêt a ni',
+'deletecomment' => 'Chhan:',
+'deleteotherreason' => 'Chhan dang:',
+'deletereasonotherlist' => 'Chhan dang',
+'deletereason-dropdown' => '*Nuaibo chhan hluar zualte
+**Phêk siamtu ngenna
+**Lâkchhàwn phalphung bawhpelhna
+**Inchirhthehna',
+'delete-edit-reasonlist' => 'Nuaibo chhan siamṭhatna',
+'delete-toobig' => 'Hë phêk hian siam danglam a tâwk ngun mangkhèng, vawi $1 {{PLURAL:$1||}} chüang zet.
+Hetiang phêk nuaibo hi hrêk deuh hlek a ni, tum loh puia {{SITENAME}} tihchingpen däl tùrin.',
+'delete-warning-toobig' => 'Hë phêk hian tihdanglam a lo tâwk nasa tawh mangkhèng, vawi $1 {{PLURAL:$1||}} chüang zet.
+Hemi nuaibo hian {{SITENAME}} hriatna-khawlpui hnathawh a tisukuk palh thei; 
+fimkhur zui hräm ang che.',
 
 # Rollback
+'rollback' => 'Siamṭhatna sûtna',
+'rollback_short' => 'Sûtlêtna',
 'rollbacklink' => 'sûtlêtna',
+'rollbackfailed' => 'Sûtlêt a tlawlh',
+'cantrollback' => 'Siamṭhatna a sûtlêt theih loh;
+a siamṭhatu hnuhnüng ber hi hë phêk tawktu awm chhun a la ni tlat.',
+'editcomment' => "Siamṭhatna kaihtawi: \"''\$1''\".",
+'rollback-success' => '$1-in siamṭhana a sûtlêt a;
+$2-in a awmphung ngäiah a dahlêt leh.',
+
+# Edit tokens
+'sessionfailure-title' => 'Hun hman tlawlh!',
 
 # Protect
 'protectlogpage' => 'Venhim chhinchhiahna',
 'protectedarticle' => 'venhim: "[[$1]]"',
+'modifiedarticleprotection' => '"[[$1]]" vènhimphung a thlâk',
+'unprotectedarticle' => '"[[$1]]" laka vènhimna a nuaibo',
+'movedarticleprotection' => 'vènhimna herremphung "[[$2]]" aṭang "[[$1]]"-ah a sawn',
+'protect-title' => '"$1" vènhimphung thlâkna',
+'protect-title-notallowed' => '"$1" vènhimphung thlìrna',
+'prot_1movedto2' => '[[$1]] kha [[$2]]-ah sawn a ni',
+'protect-badnamespace-title' => 'Hminghmun vènhim theih loh',
+'protect-badnamespace-text' => 'Hë hminghmuna phêkte hi vènhim theih a ni lo.',
+'protect-legend' => 'Vènhim tihchianna',
+'protectcomment' => 'Chhan:',
+'protectexpiry' => 'Tàwp hun:',
+'protect_expiry_invalid' => 'A tàwp hun i sawi kha a hman theih loh.',
+'protect_expiry_old' => 'A tàwp hun i thlan kha a thleng tawh!',
+'protect-unchain-permissions' => 'Vènhimna duhthlan dang chhuah zalenna',
+'protect-expiring' => '$1 (UTC) thleng',
+'protect-expiring-local' => '$1 thleng',
+'protect-expiry-indefinite' => 'tiamchin awm lo',
+'protect-cascade' => 'Hë phêka ziahhnanho pawh vénghim vek rawh (vènhim inkhaidiat)',
+'protect-cantedit' => 'Hë phêk vènhimphung hi i thlâk thei lo, siamṭhat phalna i neih loh vàng a ni.',
+'protect-othertime' => 'Hun dang:',
+'protect-othertime-op' => 'hun dang',
+'protect-existing-expiry' => 'Tàwphun awm sa: $3, $2',
+'protect-otherreason' => 'Chhan dang:',
+'protect-otherreason-op' => 'Chhan dang',
+'protect-dropdown' => '*Vènhim chhan lär zualte
+**Inchirhthehna hlüar lutuk
+**Infakmawina hleihlûak
+**Siamṭhat inchuhna pawi tham
+̆**Phêk tlawh nasat',
+'protect-edit-reasonlist' => 'Vènhim chhan siamṭhatna',
+'protect-expiry-options' => 'darkar 1:1 hour, ni 1:1 day, kar 1:1 week, kar 2:2 weeks, thla 1:1 month, thla 3:3 months, thla 6:6 months, kum 1:1 year, tiam chin awm lo:infinite',
+'restriction-type' => 'Phalna:',
+'restriction-level' => 'Hrêkphung:',
+'minimum-size' => 'Têtzáwng tiamchin',
+'maximum-size' => 'Lenzáwng bituk:',
+'pagesize' => '(bait)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Siamṭhatna',
+'restriction-move' => 'Sawnna',
+'restriction-create' => 'Siamna',
+'restriction-upload' => 'Hlànkàina',
+
+# Restriction levels
+'restriction-level-sysop' => 'vènhim pumhlùm',
+'restriction-level-autoconfirmed' => 'hualna',
+'restriction-level-all' => 'a enga pawh',
 
 # Undelete
+'undelete' => 'Phêk nuaibo tawhho thlìrna',
 'undeletelink' => 'enna/ngaiawhtirna',
 'undeleteviewlink' => 'enna',
 'undelete-search-submit' => 'Zawnna',
@@ -1190,6 +1539,7 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 # Namespace form on various pages
 'namespace' => 'Hminghmun:',
 'invert' => 'Thlan lêtna',
+'namespace_association' => 'Hminghmun kaihhnawih',
 'blanknamespace' => '(Phekpui)',
 
 # Contributions
@@ -1197,11 +1547,14 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'contributions-title' => '$1 kutthawhnate',
 'mycontris' => 'Ka kutthawhnate',
 'contribsub2' => '$1 tan ($2) .',
+'nocontribs' => 'I zawn mil tihdanglamna a awm miah lo a nih hmel.',
 'uctop' => '(chung)',
 'month' => 'Thla (leh a hmalam):',
 'year' => 'Kum (leh a hmalam):',
 
 'sp-contributions-newbies' => 'Siangchan tharte kut-thawhna chauh tilang rawh',
+'sp-contributions-newbies-sub' => 'Siangchan thar tán',
+'sp-contributions-newbies-title' => 'Siangchan thar tána hmangtu kutthawhnate',
 'sp-contributions-blocklog' => 'danbeh chhinchhiahna',
 'sp-contributions-uploads' => 'hlankaite',
 'sp-contributions-logs' => 'chanchin-ziak',
@@ -1239,6 +1592,7 @@ Phêk hminga hman awih loh hawrawp a hmang palh a ni mai thei bawk.',
 'ipbreasonotherlist' => 'Chhan dang',
 'ipbsubmit' => 'Hmangtu dangbet rawh',
 'ipboptions' => 'darkar 2:2 hours, ni 1:1 day, ni 3:3 days, kar 1:1 week, kar 2:2 weeks, thla 1:1 month, thla 3:3 months, thla 6:6 months, kum 1:1 year, tiam chin awm lo:infinite',
+'ipb-blockingself' => 'Nangmah leh nangmah i indäl dáwn! I duh chiah maw?',
 'ipblocklist' => 'Hmangtu danbeh-ho',
 'ipblocklist-legend' => 'Hmangtu danbeh zawng rawh',
 'blocklink' => 'danbehna',
@@ -1297,13 +1651,17 @@ Amah leh amah inluahlantir a theih loh.',
 'allmessagesname' => 'Thuthawn hming',
 'allmessagesdefault' => 'Thuthawn tùr ziahsa',
 'allmessages-language' => 'Ţawng:',
-'allmessages-filter-submit' => 'Kal rawh le',
+'allmessages-filter-submit' => 'Khai le',
 
 # Thumbnails
 'thumbnail-more' => 'Tihlenna',
 'filemissing' => 'Taksa a awm lo',
 'thumbnail_error' => 'Zungbï siam hlawhchham: $1',
 
+# Special:Import
+'import-token-mismatch' => 'Ṭhut chhung hriatrengna hloh hman a ni.
+Khawngaihin tum nawn leh rawh.',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Nangma pual phek',
 'tooltip-pt-mytalk' => 'I sawihona phêk',
@@ -1321,7 +1679,9 @@ Khawngaihin i dahţhat/tlangzarh hmain endikna hmehkhep khu hmang ang che (hei h
 A hnar i en thei ang.',
 'tooltip-ca-history' => 'Tunhmaa he phêk ennawnnate',
 'tooltip-ca-protect' => 'He phek hi venghim rawh',
+'tooltip-ca-unprotect' => ' Vènhimphung tihdanglamna',
 'tooltip-ca-delete' => 'He phek hi paih rawh',
+'tooltip-ca-undelete' => 'Hë phêk nuaibo a nih hmaa siamṭhatnate kàitho leh rawh',
 'tooltip-ca-move' => 'He phek hi sawn rawh',
 'tooltip-ca-watch' => 'I ralvèn zingah telh rawh',
 'tooltip-ca-unwatch' => 'He phêk hi i ralvèn aţang paih rawh',
@@ -1344,7 +1704,7 @@ A hnar i en thei ang.',
 'tooltip-t-emailuser' => 'He hmangtu hnenah hian e-lehkha thawn rawh',
 'tooltip-t-upload' => 'Taksa hlankaina',
 'tooltip-t-specialpages' => 'Phek vohbik zawng zawng tlarna',
-'tooltip-t-print' => 'Nemkai theih',
+'tooltip-t-print' => 'Chhụtkài theih',
 'tooltip-t-permalink' => 'He phêk ennawnna zawmna hlun',
 'tooltip-ca-nstab-main' => 'A chhung thu awm ziahna en rawh',
 'tooltip-ca-nstab-user' => 'Hmangtu phêk en rawh',
@@ -1434,9 +1794,11 @@ Tlar pakhata zawmna hmasa ber chu taksa ţha lo zawmna a ni tùr a ni.
 Chu tlara zawmna dang awm reng reng chu bîk-thil-a ngaih a ni ang; tlar chhunga taksa awmna tùr phek kan tihna a nih chu.',
 
 # Metadata
-'metadata' => 'Nepnawi  (metadata)',
-'metadata-help' => 'He taksa hian hriatna dang a keng tel, thlalakna emaw ami siamna sekrek ilo aţanga lo awm a ni mai thei.
-He taksa hi a tira a nihphung tihdanglam tawh a nih chuan a chanchin ziah khuan a danglam hnu chanchin a huam tel lo mai thei.',
+'metadata' => 'Nepnawi',
+'metadata-help' => 'He taksa hian hriatna dang a keng tel; thlalakna emaw thlachhuina amah siamna sekrek ilo aṭanga lo awm a ni mai thei.
+He taksa hi a tira a nihphung tihdanglam tawh a nih chuan a chanchin ziah khuan a danglam hnu chanchin a hril kim lo mai thei.',
+'metadata-expand' => 'Chanchin kimchang tihlanna',
+'metadata-collapse' => 'Chanchin kimchang thup ṭhenna',
 'metadata-fields' => 'Thlalâk chanchin nepnawi he thuthawna tihlante hi thlalâk phek pholan huna chanchin nepnawi dawhkan thleh a nihin tihlan a ni ang.
 A bak zawng chu thuhrûk sa vek a ni ang.
 * make
@@ -1454,6 +1816,46 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 * gpsaltitude',
 
 # EXIF tags
+'exif-imagewidth' => 'Zàuzáwng',
+'exif-imagelength' => 'Sànzáwng',
+'exif-bitspersample' => 'Péng khata mal(bit) awm zât',
+'exif-compression' => 'Sàwrtêtphung',
+'exif-photometricinterpretation' => 'Rawng inpawlhphung',
+'exif-orientation' => 'Hawizáwng',
+'exif-samplesperpixel' => 'Péng zât',
+'exif-planarconfiguration' => 'Hriatna inremphung',
+'exif-ycbcrsubsampling' => 'Y leh C inthlauhbï',
+'exif-ycbcrpositioning' => 'Y leh C ṭhuthmun',
+'exif-xresolution' => 'Pheizáwnga tihfiahphung',
+'exif-yresolution' => 'Tungzáwnga tihfiahphung',
+'exif-stripoffsets' => 'Thlalâk hriattirna awmna',
+'exif-rowsperstrip' => 'Ṭhuang khata tlar zât',
+'exif-stripbytecounts' => 'Ṭhuang zàwr zìmtina byte awm zât',
+'exif-jpeginterchangeformat' => 'JPEG SOI dahhmun',
+'exif-jpeginterchangeformatlength' => 'JPEG hriattirna lenzawng (Byte-in)',
+'exif-whitepoint' => 'Hmun vár rawng nihphung',
+'exif-primarychromaticities' => 'Rawng bulbälte nihphung',
+'exif-datetime' => 'Taksa tihdanglam hun leh ni',
+'exif-imagedescription' => 'Lem hming',
+'exif-make' => 'Thlalâkna siamtu',
+'exif-model' => 'Thlalâkna sìamphung',
+'exif-software' => 'Khawlthlûak hman',
+'exif-artist' => 'Buatsaihtu',
+'exif-copyright' => 'Phalna kawltu',
+'exif-exifversion' => 'EXIF chhuah',
+'exif-flashpixversion' => 'Flashpix chhuah chhawmdàwl theih',
+'exif-colorspace' => 'Rawng hmun',
+'exif-componentsconfiguration' => 'Péngtinte awmzia',
+'exif-compressedbitsperpixel' => 'Lem sàwrzìmphung',
+'exif-pixelydimension' => 'Lem zauzáwng',
+'exif-pixelxdimension' => 'Lem sànzáwng',
+'exif-usercomment' => 'Hmangtu kamchhuak',
+'exif-relatedsoundfile' => 'Ritaksa laichinte',
+'exif-datetimeoriginal' => 'Hriattirna siamchhuah hun leh ni',
+'exif-datetimedigitized' => 'Tihkhàwl hun leh ní',
+'exif-subsectime' => 'Tihdanglam hun leh ni',
+'exif-exposuretime' => 'Phochhuah hun',
+'exif-fnumber' => 'F zât',
 'exif-source' => 'Hnar:',
 'exif-writer' => 'Ziaktu',
 'exif-languagecode' => 'Ţawng',
@@ -1474,7 +1876,7 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 'confirm-unwatch-button' => 'Aw le',
 
 # Multipage image navigation
-'imgmultigo' => 'Kal rawh le!',
+'imgmultigo' => 'Khai le!',
 'imgmultigoto' => 'Phêk $1-ah kal rawh',
 
 # Table pager
@@ -1512,7 +1914,25 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 #Tbchb zawng zawng hemi tlar chungah hian dah tùr. He tlar hi a nih ang ngai ngaia hnutchhiah tùr </pre>',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|Tag]] thlitfimna:',
+'tag-filter' => '[[Special:Tags|Sawirelh]] thlitfimna:',
+'tag-filter-submit' => 'Thlitfimna',
+'tags-title' => 'Sawirelh',
+'tags-tag' => 'Sawirelh hming',
+'tags-display-header' => 'Tihdanglam tlarna-a landàn',
+'tags-description-header' => 'Awmze sawifiahna kimchang',
+'tags-hitcount-header' => 'Tihdanglam sawirelhte',
+'tags-edit' => 'siamṭhatna',
+
+# New logging system
+'logentry-move-move' => '$3 tih phêk kha $4-ah $1 hian a thlâk.',
+'logentry-move-move-noredirect' => 'Hruailuhna phêk hnutchhiah lovin $1-in $3 phêk kha $4-ah a sawn.',
+'logentry-move-move_redir' => 'Hruailuhna chungah $3 phêk kha $4-ah $1 hian a sawn.',
+'logentry-move-move_redir-noredirect' => 'Hruailuhna hnutchhiah lovin $3 phêk kha $4-ah $1 hian a sawn.',
+'logentry-newusers-newusers' => '$1 hian hmangtu siangchan a siam.',
+'logentry-newusers-create' => '$1 hian hmangtu siangchan a siam.',
+'logentry-newusers-create2' => '$1 hian hmangtu siangchan $3 a siam.',
+'logentry-newusers-autocreate' => 'Siangchan $1 hi amahin a insiam.',
+'newuserlog-byemail' => 'thurûk e-lehkha hmanga thawn a ni.',
 
 # Feedback
 'feedback-subject' => 'Thupui:',
index d3d6ddc..1f6799d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Latvian (Latviešu)
+/** Latvian (latviešu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -667,7 +667,7 @@ Pēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:',
 '''Tas vēl nav saglabāts!'''",
 'updated' => '(Atjaunots)',
 'note' => "'''Piezīme: '''",
-'previewnote' => "'''Atceries, ka šis ir tikai pirmskats un vēl nav saglabāts!'''",
+'previewnote' => "'''Atceries, ka šis ir tikai pirmskats un teksts vēl nav saglabāts!'''",
 'session_fail_preview' => "'''Neizdevās apstrādāt tavas izmaiņas, jo tika pazaudēti sesijas dati.
 Lūdzu mēģini vēlreiz.
 Ja tas joprojām nedarbojas, mēģini [[Special:UserLogout|izlogoties ārā]] un ielogoties no jauna.'''",
@@ -882,7 +882,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" versiju hronoloģija',
-'difference' => '(Atšķirības starp versijām)',
 'difference-multipage' => '(Atšķirības starp lapām)',
 'lineno' => '$1. rindiņa:',
 'compareselectedversions' => 'Salīdzināt izvēlētās versijas',
@@ -1110,10 +1109,10 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'group-all' => '(visi)',
 
 'group-user-member' => '{{GENDER:$1|lietotājs}}',
-'group-autoconfirmed-member' => 'automātiski apstiprinātais lietotājs',
-'group-bot-member' => 'Bots',
-'group-sysop-member' => 'Administrators',
-'group-bureaucrat-member' => 'Birokrāts',
+'group-autoconfirmed-member' => '{{GENDER:$1|automātiski apstiprināts lietotājs|automātiski apstiprināta lietotāja}}',
+'group-bot-member' => '{{GENDER:$1|bots}}',
+'group-sysop-member' => '{{GENDER:$1|administrators|administratore}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birokrāts|birokrāte}}',
 'group-suppress-member' => 'novērotājs',
 
 'grouppage-user' => '{{ns:project}}:Lietotāji',
@@ -1221,7 +1220,7 @@ Ja tu izvēlies to norādīt, tas tiks izmantots, lai identificētu tavu darbu (
 'nchanges' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
 'recentchanges' => 'Pēdējās izmaiņas',
 'recentchanges-legend' => 'Pēdējo izmaiņu iespējas',
-'recentchangestext' => 'Šajā lapā ir šitajā viki izdarītās pēdējās izmaiņas.',
+'recentchanges-summary' => 'Šajā lapā ir uzskaitītas pēdējās izdarītās izmaiņas.',
 'recentchanges-feed-description' => 'Sekojiet līdzi jaunākajām izmaiņām vikijā izmantojot šo barotni.',
 'recentchanges-label-newpage' => 'Šī ir jaunizveidota lapa',
 'recentchanges-label-minor' => 'Šī ir maznozīmīga izmaiņa',
@@ -1634,7 +1633,7 @@ Katrā rindiņā ir saites uz pirmo un otro pāradresācijas lapu, kā arī pirm
 'listusers-editsonly' => 'Rādīt tikai lietotājus, kas ir izdarījuši kādas izmaiņas',
 'listusers-creationsort' => 'Kārtot pēc izveidošanas datuma',
 'usereditcount' => '$1 {{PLURAL:$1|izmaiņa|izmaiņas}}',
-'usercreated' => 'Izveidots $1, $2',
+'usercreated' => '{{GENDER:$3|Izveidoja}} $1 plkst. $2',
 'newpages' => 'Jaunas lapas',
 'newpages-username' => 'Lietotājs:',
 'ancientpages' => 'Vecākās lapas',
index 13b6701..f1c695d 100644 (file)
@@ -8,10 +8,95 @@
  * @file
  *
  * @author Itsmine
+ * @author Justincheng12345
  * @author Omnipaedista
  * @author Shinjiman
  */
 
+$specialPageAliases = array(
+       'Activeusers'               => array( '躍簿' ),
+       'Allmessages'               => array( '官話' ),
+       'Allpages'                  => array( '全典' ),
+       'Ancientpages'              => array( '陳年' ),
+       'Blankpage'                 => array( '白頁' ),
+       'Booksources'               => array( '書海' ),
+       'BrokenRedirects'           => array( '斷渡' ),
+       'Categories'                => array( '類' ),
+       'ChangePassword'            => array( '易符節' ),
+       'ComparePages'              => array( '較頁' ),
+       'Confirmemail'              => array( '核郵驛' ),
+       'Contributions'             => array( '功績' ),
+       'CreateAccount'             => array( '增簿' ),
+       'Deadendpages'              => array( '此無路也' ),
+       'DeletedContributions'      => array( '已刪之積' ),
+       'Disambiguations'           => array( '釋義' ),
+       'DoubleRedirects'           => array( '窮渡' ),
+       'EditWatchlist'             => array( '治哨站' ),
+       'Emailuser'                 => array( '遺書' ),
+       'Export'                    => array( '出匯' ),
+       'Fewestrevisions'           => array( '鮮察' ),
+       'FileDuplicateSearch'       => array( '擇重檔' ),
+       'Filepath'                  => array( '檔路' ),
+       'Import'                    => array( '圖入匯' ),
+       'Invalidateemail'           => array( '消核郵驛' ),
+       'BlockList'                 => array( '列禁簿、禁址' ),
+       'LinkSearch'                => array( '尋網連' ),
+       'Listfiles'                 => array( '見檔' ),
+       'Listgrouprights'           => array( '權任一覽' ),
+       'Listredirects'             => array( '表轉' ),
+       'Listusers'                 => array( '點簿' ),
+       'Lockdb'                    => array( '閉庫' ),
+       'Log'                       => array( '誌' ),
+       'Lonelypages'               => array( '孤寡' ),
+       'Longpages'                 => array( '長言' ),
+       'MergeHistory'              => array( '併頁之誌' ),
+       'MIMEsearch'                => array( '篩檔' ),
+       'Mostcategories'            => array( '跨船' ),
+       'Mostimages'                => array( '名檔' ),
+       'Mostlinked'                => array( '好料' ),
+       'Mostlinkedcategories'      => array( '豪門' ),
+       'Mostlinkedtemplates'       => array( '美模' ),
+       'Mostrevisions'             => array( '屢審' ),
+       'Movepage'                  => array( '遷' ),
+       'Mycontributions'           => array( '吾績' ),
+       'Newimages'                 => array( '新圖之廊' ),
+       'Newpages'                  => array( '新灶' ),
+       'Preferences'               => array( '簿註' ),
+       'Prefixindex'               => array( '依名索引' ),
+       'Protectedpages'            => array( '頁錮' ),
+       'Randompage'                => array( '清風翻書' ),
+       'Randomredirect'            => array( '任渡' ),
+       'Recentchanges'             => array( '近易' ),
+       'Recentchangeslinked'       => array( '援引' ),
+       'Search'                    => array( '尋' ),
+       'Shortpages'                => array( '短篇' ),
+       'Specialpages'              => array( '特查' ),
+       'Statistics'                => array( '彙統' ),
+       'Uncategorizedcategories'   => array( '問栓' ),
+       'Uncategorizedimages'       => array( '候裱' ),
+       'Uncategorizedpages'        => array( '欲訂' ),
+       'Uncategorizedtemplates'    => array( '待蘸' ),
+       'Undelete'                  => array( '覽刪' ),
+       'Unlockdb'                  => array( '開庫' ),
+       'Unusedcategories'          => array( '樞鏽' ),
+       'Unusedimages'              => array( '色褪' ),
+       'Unusedtemplates'           => array( '墨乾' ),
+       'Unwatchedpages'            => array( '無哨頁' ),
+       'Upload'                    => array( '進獻' ),
+       'UploadStash'               => array( '貢貯' ),
+       'Userlogin'                 => array( '登簿' ),
+       'Userlogout'                => array( '去簿' ),
+       'Userrights'                => array( '秉治權任' ),
+       'Version'                   => array( '版' ),
+       'Wantedcategories'          => array( '求門' ),
+       'Wantedfiles'               => array( '求檔' ),
+       'Wantedpages'               => array( '徵頁' ),
+       'Wantedtemplates'           => array( '徵模' ),
+       'Watchlist'                 => array( '哨站' ),
+       'Whatlinkshere'             => array( '取佐' ),
+       'Withoutinterwiki'          => array( '孤語' ),
+);
+
 /**
  * A list of date format preference keys which can be selected in user
  * preferences. New preference keys can be added, provided they are supported
@@ -59,13 +144,6 @@ $digitTransformTable = array(
        ',' => '',
 );
 
-# -------------------------------------------------------------------
-# Default messages
-# -------------------------------------------------------------------
-# Allowed characters in keys are: A-Z, a-z, 0-9, underscore (_) and
-# hyphen (-). If you need more characters, you may be able to change
-# the regex in MagicWord::initRegex
-
 $messages = array(
 # User preference toggles
 'tog-underline' => '鏈墊線:',
@@ -84,6 +162,8 @@ $messages = array(
 'tog-rememberpassword' => '符節通越(達至$1日)',
 'tog-watchcreations' => '哨己撰',
 'tog-watchdefault' => '哨己纂',
+'tog-watchmoves' => '派哨予吾遷之頁',
+'tog-watchdeletion' => '派哨予吾除之頁',
 'tog-minordefault' => '慣為校',
 'tog-previewontop' => '頂草覽',
 'tog-previewonfirst' => '覽首修',
@@ -193,6 +273,7 @@ $messages = array(
 'listingcontinuesabbrev' => '續',
 'index-category' => '已索之頁',
 'noindex-category' => '未索之頁',
+'broken-file-category' => '帶壞檔之頁',
 
 'about' => '述',
 'article' => '文',
@@ -459,6 +540,7 @@ $2',
 'createaccount' => '增簿',
 'gotaccount' => '有簿矣哉?往$1。',
 'gotaccountlink' => '登簿',
+'userlogin-resetlink' => '君忘登簿所需爾?',
 'createaccountmail' => '同郵',
 'createaccountreason' => '因:',
 'badretype' => '符節不合也。',
@@ -632,6 +714,7 @@ $2',
 '''纂文若合,惠再之。如復不成,簿[[Special:UserLogout|重登]]焉。'''",
 'token_suffix_mismatch' => "'''君修見拒,蓋因代理之故,亂事見兮。'''",
 'editing' => '纂$1',
+'creating' => '撰$1',
 'editingsection' => '纂節$1',
 'editingcomment' => '贊$1',
 'editconflict' => '纂沖$1',
@@ -857,7 +940,6 @@ $1",
 
 # Diffs
 'history-title' => '$1之誌',
-'difference' => '(辨異)',
 'difference-multipage' => '(辨頁)',
 'lineno' => '列$1:',
 'compareselectedversions' => '辨二擇',
@@ -1194,7 +1276,7 @@ $1",
 'nchanges' => '$1易',
 'recentchanges' => '近易',
 'recentchanges-legend' => '近易項',
-'recentchangestext' => '共筆揮新,悉列於此。',
+'recentchanges-summary' => '共筆揮新,悉列於此。',
 'recentchanges-feed-description' => '跟wiki源之近易。',
 'recentchanges-label-newpage' => '此纂開新頁',
 'recentchanges-label-minor' => '此乃細纂',
index 7e9c100..469b493 100644 (file)
@@ -10,7 +10,9 @@
  * @author Bombola
  * @author Dato deutschland
  * @author Dawid Deutschland
+ * @author Erdemaslancan
  * @author Ibero-kolxi
+ * @author Reedy
  * @author The Evil IP address
  */
 
@@ -18,340 +20,343 @@ $fallback = 'tr';
 
 $messages = array(
 # User preference toggles
-'tog-underline'        => "Link'iş tude kogu3’uxaçki:",
+'tog-underline' => "Link'iş tude kogu3’uxaçki:",
 'tog-rememberpassword' => 'Parola-skani goişini (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-showhiddencats'   => "Şinaxeri k'at'egorepe ko3'iri",
+'tog-showhiddencats' => "Şinaxeri k'at'egorepe ko3'iri",
 
 'underline-always' => "P'anda",
-'underline-never'  => "P'ot'e",
+'underline-never' => "P'ot'e",
 
 # Dates
-'sunday'        => 'Mjaçxa',
-'monday'        => 'Tutaçxa',
-'tuesday'       => 'İk’inaçxa',
-'wednesday'     => 'Cumaçxa',
-'thursday'      => 'Çaçxa',
-'friday'        => 'Obiçxa',
-'saturday'      => 'Sabat’oni',
-'sun'           => 'Mja',
-'mon'           => 'Tut',
-'tue'           => "İk'i",
-'wed'           => 'Cum',
-'thu'           => 'Çaç',
-'fri'           => 'Obi',
-'sat'           => 'Sab',
-'january'       => '3ʼanağani',
-'february'      => 'Kʼundura',
-'march'         => 'Martʼi',
-'april'         => 'Apʼrili',
-'may_long'      => 'Maisi',
-'june'          => 'Mbuliştuta',
-'july'          => 'X3ala',
-'august'        => 'Maraşina',
-'september'     => 'Stʼaroşina',
-'october'       => 'Gumatuta',
-'november'      => 'Çxalva',
-'december'      => 'Xristʼana',
-'january-gen'   => '3ʼanağani',
-'february-gen'  => 'Kʼundura',
-'march-gen'     => 'Martʼi',
-'april-gen'     => 'Apʼrili',
-'may-gen'       => 'Maisi',
-'june-gen'      => 'Mbuliştuta',
-'july-gen'      => 'X3ala',
-'august-gen'    => 'Maraşina',
+'sunday' => 'Mjaçxa',
+'monday' => 'Tutaçxa',
+'tuesday' => 'İk’inaçxa',
+'wednesday' => 'Cumaçxa',
+'thursday' => 'Çaçxa',
+'friday' => 'Obiçxa',
+'saturday' => 'Sabat’oni',
+'sun' => 'Mja',
+'mon' => 'Tut',
+'tue' => "İk'i",
+'wed' => 'Cum',
+'thu' => 'Çaç',
+'fri' => 'Obi',
+'sat' => 'Sab',
+'january' => '3ʼanağani',
+'february' => 'Kʼundura',
+'march' => 'Martʼi',
+'april' => 'Apʼrili',
+'may_long' => 'Maisi',
+'june' => 'Mbuliştuta',
+'july' => 'X3ala',
+'august' => 'Maraşina',
+'september' => 'Stʼaroşina',
+'october' => 'Gumatuta',
+'november' => 'Çxalva',
+'december' => 'Xristʼana',
+'january-gen' => '3ʼanağani',
+'february-gen' => 'Kʼundura',
+'march-gen' => 'Martʼi',
+'april-gen' => 'Apʼrili',
+'may-gen' => 'Maisi',
+'june-gen' => 'Mbuliştuta',
+'july-gen' => 'X3ala',
+'august-gen' => 'Maraşina',
 'september-gen' => 'Stʼaroşina',
-'october-gen'   => 'Gumatuta',
-'november-gen'  => 'Çxalva',
-'december-gen'  => 'Xristʼana',
-'jan'           => '3ʼan',
-'feb'           => 'Kʼun',
-'mar'           => 'Mar',
-'apr'           => 'Apʼr',
-'may'           => 'Mai',
-'jun'           => 'Mbul',
-'jul'           => 'X3al',
-'aug'           => 'Mara',
-'sep'           => 'Stʼa',
-'oct'           => 'Gum',
-'nov'           => 'Çxa',
-'dec'           => 'Xri',
+'october-gen' => 'Gumatuta',
+'november-gen' => 'Çxalva',
+'december-gen' => 'Xristʼana',
+'jan' => '3ʼan',
+'feb' => 'Kʼun',
+'mar' => 'Mar',
+'apr' => 'Apʼr',
+'may' => 'Mai',
+'jun' => 'Mbul',
+'jul' => 'X3al',
+'aug' => 'Mara',
+'sep' => 'Stʼa',
+'oct' => 'Gum',
+'nov' => 'Çxa',
+'dec' => 'Xri',
 
 # Categories related messages
-'pagecategories'                => 'Butʼkʼaşi {{PLURAL:$1|kʼatʼegori|kʼatʼegorepe}}',
-'category_header'               => '"$1" kʼatʼegoris butʼkʼape',
-'subcategories'                 => 'Tudekʼategorepe',
-'category-media-header'         => '"$1" k\'at\'egoris media',
-'category-empty'                => "''Am k'at'egoris çkar madde varna media va uğun.''",
-'hidden-categories'             => '{{PLURAL:$1|Şinaxeri kʼatʼegori|Şinaxeri kʼatʼegorepe}}',
-'hidden-category-category'      => "Şinaxeri k'at'egorepe",
-'category-subcat-count'         => '{{PLURAL:$2|Am kʼatʼegoris, xvala, tude na ren kʼatʼegori uğun.|Am kʼatʼegori tʼoplamurot $2 kʼatʼegorişen {{PLURAL:$1|tudekʼatʼegori|$1 tudekʼatʼegori}}s uğun}}',
+'pagecategories' => 'Butʼkʼaşi {{PLURAL:$1|kʼatʼegori|kʼatʼegorepe}}',
+'category_header' => '"$1" kʼatʼegoris butʼkʼape',
+'subcategories' => 'Tudekʼategorepe',
+'category-media-header' => '"$1" k\'at\'egoris media',
+'category-empty' => "''Am k'at'egoris çkar madde varna media va uğun.''",
+'hidden-categories' => '{{PLURAL:$1|Şinaxeri kʼatʼegori|Şinaxeri kʼatʼegorepe}}',
+'hidden-category-category' => "Şinaxeri k'at'egorepe",
+'category-subcat-count' => '{{PLURAL:$2|Am kʼatʼegoris, xvala, tude na ren kʼatʼegori uğun.|Am kʼatʼegori tʼoplamurot $2 kʼatʼegorişen {{PLURAL:$1|tudekʼatʼegori|$1 tudekʼatʼegori}}s uğun}}',
 'category-subcat-count-limited' => "Am k'at'egori tudes na dgin {{PLURAL:$1|tude k'at'egoris|$1 tude k'at'egoris}} uğun.",
-'category-article-count'        => '{{PLURAL:$2|Am kʼatʼegoris, xvala, tude na ren kʼatʼegori uğun.|Tʼoplami $2 şen, tude na ren {{PLURAL:$1|butʼkʼa|$1 butʼkʼa}} am kʼatʼegoris ren.}}',
-'listingcontinuesabbrev'        => '(naqona)',
-'index-category'                => "Indexi na uğun but'k'ape",
-'noindex-category'              => 'Indexi muşi na var uğun sayfape',
-
-'about'         => 'Şeni',
-'newwindow'     => '(ağne penceres guin3ʼkʼen)',
-'cancel'        => 'İpʼtʼali qʼvi',
+'category-article-count' => '{{PLURAL:$2|Am kʼatʼegoris, xvala, tude na ren kʼatʼegori uğun.|Tʼoplami $2 şen, tude na ren {{PLURAL:$1|butʼkʼa|$1 butʼkʼa}} am kʼatʼegoris ren.}}',
+'listingcontinuesabbrev' => '(naqona)',
+'index-category' => "Indexi na uğun but'k'ape",
+'noindex-category' => 'Indexi muşi na var uğun sayfape',
+
+'about' => 'Şeni',
+'newwindow' => '(ağne penceres guin3ʼkʼen)',
+'cancel' => 'İpʼtʼali qʼvi',
 'moredotdotdot' => 'Çkva…',
-'mypage'        => 'Çkimi sayfa',
-'mytalk'        => 'Çkimi mesajepe',
-'anontalk'      => "Am IP'şi mesajepe",
-'navigation'    => 'Goxtima',
-'and'           => '&#32;do',
+'mypage' => 'Çkimi sayfa',
+'mytalk' => 'Çkimi mesajepe',
+'anontalk' => "Am IP'şi mesajepe",
+'navigation' => 'Goxtima',
+'and' => '&#32;do',
 
 # Cologne Blue skin
-'qbfind'         => 'Koz*iri',
-'qbedit'         => 'Doktiri',
-'qbpageoptions'  => 'Am sayfa',
-'qbmyoptions'    => 'Çkimi sayfape',
+'qbfind' => 'Koz*iri',
+'qbedit' => 'Doktiri',
+'qbpageoptions' => 'Am sayfa',
+'qbmyoptions' => 'Çkimi sayfape',
 'qbspecialpages' => 'Doxmeli sayfape',
 
 # Vector skin
 'vector-action-delete' => 'Jili',
-'vector-view-edit'     => 'Doktiri',
-
-'errorpagetitle'   => 'Çilata',
-'returnto'         => '$1 butʼkʼaşa goikti.',
-'tagline'          => '{{SITENAME}}-işen',
-'help'             => 'Meşvela',
-'search'           => 'mgori',
-'searchbutton'     => 'Mgori',
-'go'               => 'İgzali',
-'searcharticle'    => 'İgzali',
-'history'          => 'Butʼkʼaş tarixi',
-'history_short'    => 'Tarixi',
+'vector-action-protect' => 'İçvi',
+'vector-view-create' => 'dokʼidi',
+'vector-view-edit' => 'Doktiri',
+'variants' => "Variant'epe",
+
+'errorpagetitle' => 'Çilata',
+'returnto' => '$1 butʼkʼaşa goikti.',
+'tagline' => '{{SITENAME}}-işen',
+'help' => 'Meşvela',
+'search' => 'mgori',
+'searchbutton' => 'Mgori',
+'go' => 'İgzali',
+'searcharticle' => 'İgzali',
+'history' => 'Butʼkʼaş tarixi',
+'history_short' => 'Tarixi',
 'printableversion' => "Kart'alişa na geibaz*gen versiyoni",
-'permalink'        => 'Am xalişa kʼontaktʼi qʼvi',
-'edit'             => 'doktiri',
-'create'           => 'dokʼidi',
-'editthispage'     => 'Butʼkʼa doktiri',
-'delete'           => 'Jili',
-'deletethispage'   => 'Am sayfa jili',
-'protect'          => 'İçvi',
-'protect_change'   => 'Doktiri',
-'newpage'          => 'Ağani butʼkʼa',
-'talkpage'         => 'Butʼkʼas ğarğali.',
+'permalink' => 'Am xalişa kʼontaktʼi qʼvi',
+'edit' => 'doktiri',
+'create' => 'dokʼidi',
+'editthispage' => 'Butʼkʼa doktiri',
+'delete' => 'Jili',
+'deletethispage' => 'Am sayfa jili',
+'protect' => 'İçvi',
+'protect_change' => 'Doktiri',
+'newpage' => 'Ağani butʼkʼa',
+'talkpage' => 'Butʼkʼas ğarğali.',
 'talkpagelinktext' => 'Mesaji',
-'specialpage'      => 'Doxmeli sayfa',
-'personaltools'    => 'Doxmeli oxmaronepe',
-'talk'             => 'Ğarğala',
-'views'            => 'Oz*iramepe',
-'toolbox'          => 'Oxmaronepe',
-'otherlanguages'   => 'Majurani nenapes',
-'redirectedfrom'   => '($1 butʼkʼaşen moxtu)',
-'redirectpagesub'  => 'Redirektʼiş butʼkʼa',
-'lastmodifiedat'   => 'Am butʼkʼa çodinurot $2, $1 tarixis iktirinu.',
-'jumpto'           => 'İdi do:',
+'specialpage' => 'Doxmeli sayfa',
+'personaltools' => 'Doxmeli oxmaronepe',
+'talk' => 'Ğarğala',
+'views' => 'Oz*iramepe',
+'toolbox' => 'Oxmaronepe',
+'otherlanguages' => 'Majurani nenapes',
+'redirectedfrom' => '($1 butʼkʼaşen moxtu)',
+'redirectpagesub' => 'Redirektʼiş butʼkʼa',
+'lastmodifiedat' => 'Am butʼkʼa çodinurot $2, $1 tarixis iktirinu.',
+'jumpto' => 'İdi do:',
 'jumptonavigation' => 'ixmari',
-'jumptosearch'     => 'mgori',
+'jumptosearch' => 'mgori',
 
 # 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}} şeni',
-'aboutpage'            => 'Project:Ambarepe',
-'copyright'            => 'Doloxe na renanpe, $1-şi ren.',
-'copyrightpage'        => '{{ns:project}}:Şinaxeri Hakʼepe',
-'disclaimers'          => 'Kʼabuli na var ixvenu ondepe',
-'disclaimerpage'       => 'Project:Mtelot kʼabuli na var ixvenu ondepe',
-'edithelp'             => 'Muçʼoşi iktirinen?',
-'edithelppage'         => 'Help:Butʼkʼa muçʼoşi iktirinen?',
-'helppage'             => 'Help:Doloxe na renanpe',
-'mainpage'             => 'Dudi Butʼkʼa',
+'aboutsite' => '{{SITENAME}} şeni',
+'aboutpage' => 'Project:Ambarepe',
+'copyright' => 'Doloxe na renanpe, $1-şi ren.',
+'copyrightpage' => '{{ns:project}}:Şinaxeri Hakʼepe',
+'disclaimers' => 'Kʼabuli na var ixvenu ondepe',
+'disclaimerpage' => 'Project:Mtelot kʼabuli na var ixvenu ondepe',
+'edithelp' => 'Muçʼoşi iktirinen?',
+'edithelppage' => 'Help:Butʼkʼa muçʼoşi iktirinen?',
+'helppage' => 'Help:Doloxe na renanpe',
+'mainpage' => 'Dudi Butʼkʼa',
 'mainpage-description' => "Dudi But'k'a",
-'privacy'              => 'Şinaxeri Hakʼepe',
-'privacypage'          => 'Project:Şinaxeri Hakʼepe',
+'privacy' => 'Şinaxeri Hakʼepe',
+'privacypage' => 'Project:Şinaxeri Hakʼepe',
 
 'badaccess' => 'İzini çilata',
 
-'ok'                      => 'HO',
-'retrievedfrom'           => '"$1" adresişen eizdinu',
-'youhavenewmessages'      => 'Ağani <u>$1</u> giğun. ($2)',
-'newmessageslink'         => 'ağani mesajepe',
-'newmessagesdifflink'     => 'çodinaşi oktiroba',
+'ok' => 'HO',
+'retrievedfrom' => '"$1" adresişen eizdinu',
+'youhavenewmessages' => 'Ağani $1 giğun. ($2)',
+'newmessageslink' => 'ağani mesajepe',
+'newmessagesdifflink' => 'çodinaşi oktiroba',
 'youhavenewmessagesmulti' => "$1's ağne mesajepe giğun",
-'editsection'             => 'doktiri',
-'editold'                 => 'Doktiri',
-'editlink'                => 'Doktiri',
-'viewsourcelink'          => 'odude koz*iri',
-'editsectionhint'         => '$1 burme muşi doktiri',
-'toc'                     => 'Temaşi dudi-coxope',
-'showtoc'                 => 'ko3ʼiri',
-'hidetoc'                 => 'Doşinaxi',
-'site-rss-feed'           => '$1 RSS-iş Feedi',
-'site-atom-feed'          => '$1 Atʼom-iş feedi',
-'page-rss-feed'           => '"$1" RSS-iş Feedi',
-'page-atom-feed'          => '"$1" Atʼom-iş Feedi',
-'red-link-title'          => '$1 (Ak butʼkʼa va ren)',
+'editsection' => 'doktiri',
+'editold' => 'Doktiri',
+'editlink' => 'Doktiri',
+'viewsourcelink' => 'odude koz*iri',
+'editsectionhint' => '$1 burme muşi doktiri',
+'toc' => 'Temaşi dudi-coxope',
+'showtoc' => 'ko3ʼiri',
+'hidetoc' => 'Doşinaxi',
+'site-rss-feed' => '$1 RSS-iş Feedi',
+'site-atom-feed' => '$1 Atʼom-iş feedi',
+'page-rss-feed' => '"$1" RSS-iş Feedi',
+'page-atom-feed' => '"$1" Atʼom-iş Feedi',
+'red-link-title' => '$1 (Ak butʼkʼa va ren)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Stʼatʼia',
-'nstab-user'      => 'maxmareş butʼkʼa',
-'nstab-special'   => 'Doxmeli butʼkʼa',
-'nstab-project'   => 'Pʼrojeşi butʼkʼa',
-'nstab-image'     => 'Dosya',
+'nstab-main' => 'Stʼatʼia',
+'nstab-user' => 'maxmareş butʼkʼa',
+'nstab-special' => 'Doxmeli butʼkʼa',
+'nstab-project' => 'Pʼrojeşi butʼkʼa',
+'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesaji',
-'nstab-template'  => 'Şabloni',
-'nstab-category'  => 'Kʼatʼegori',
+'nstab-template' => 'Şabloni',
+'nstab-category' => 'Kʼatʼegori',
 
 # General errors
-'missing-article'    => 'Datʼabeizik, na igoren "$1" $2 coxoni butʼkʼaşi tekstʼi var az*iru.
+'missing-article' => 'Datʼabeizik, na igoren "$1" $2 coxoni butʼkʼaşi tekstʼi var az*iru.
 
 Muşeni? Çunki am butʼkʼa, jileri na ren a butʼkʼaşi golaxteri versiyoni ren.
 
 Eger sebebi aya na va renna, pʼrogramis ar çilata z*irit.
 Mu iqʼven! Aya, a [[Special:ListUsers/sysop|adminis]], URL-ti çʼareli şekʼilite rapʼortʼi doçʼarit.',
 'missingarticle-rev' => '(revizyoni#: $1)',
-'badtitletext'       => 'Na içʼaren butʼkʼaşi coxo ya çilatoni ren ya boşi ren varna inter-nena do inter-vikʼişi kʼontʼaktʼis na uğutʼu şeni mtini varen.
+'badtitletext' => 'Na içʼaren butʼkʼaşi coxo ya çilatoni ren ya boşi ren varna inter-nena do inter-vikʼişi kʼontʼaktʼis na uğutʼu şeni mtini varen.
 Dudicoxopes oxmaruşi yasaği na ren ar, varna daha dido kʼarakʼtʼeri uğun.',
-'viewsource'         => 'Odudes o3ʼkʼedi',
+'viewsource' => 'Odudes o3ʼkʼedi',
 
 # Login and logout pages
-'yourname'                => 'Skani maxmare-coxo:',
-'yourpassword'            => 'Pʼarola-skani:',
-'remembermypassword'      => 'Parola-skani goişini (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'Sitʼeşa amaxti',
+'yourname' => 'Skani maxmare-coxo:',
+'yourpassword' => 'Pʼarola-skani:',
+'remembermypassword' => 'Parola-skani goişini (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Sitʼeşa amaxti',
 'nav-login-createaccount' => 'Sitʼeşa amaxti / hesabi dokʼidi',
-'userlogin'               => 'Sitʼeşa amaxti / hesabi dokʼidi',
-'logout'                  => 'Siteşen Kogamaxti',
-'userlogout'              => 'Siteşen Kogamaxti',
-'nologin'                 => "Hesabi va giğuni? '''$1'''",
-'nologinlink'             => 'Hesabi dokʼidi.',
-'mailmypassword'          => 'Ağne pʼarola-çkimi moncğoni',
+'userlogin' => 'Sitʼeşa amaxti / hesabi dokʼidi',
+'logout' => 'Siteşen Kogamaxti',
+'userlogout' => 'Siteşen Kogamaxti',
+'nologin' => "Hesabi va giğuni? '''$1'''",
+'nologinlink' => 'Hesabi dokʼidi.',
+'mailmypassword' => 'Ağne pʼarola-çkimi moncğoni',
 
 # Change password dialog
 'oldpassword' => "Mcveşi p'arola:",
 'newpassword' => "Ağani P'arola:",
 
 # Edit page toolbar
-'bold_sample'     => 'Mçxu nçʼara',
-'bold_tip'        => 'Mçxu nçʼara',
-'italic_sample'   => 'Elakteri nçʼara',
-'italic_tip'      => 'Elakteri nçʼara',
-'link_sample'     => 'Kʼontʼaktʼiş dudicoxo',
-'link_tip'        => 'Doloxeni linkʼi',
-'extlink_sample'  => 'http://www.example.com adresiş oxo3ʼonapa',
-'extlink_tip'     => 'Galeni kʼontʼaktʼi (Adresiş dudis http:// ukʼatit)',
+'bold_sample' => 'Mçxu nçʼara',
+'bold_tip' => 'Mçxu nçʼara',
+'italic_sample' => 'Elakteri nçʼara',
+'italic_tip' => 'Elakteri nçʼara',
+'link_sample' => 'Kʼontʼaktʼiş dudicoxo',
+'link_tip' => 'Doloxeni linkʼi',
+'extlink_sample' => 'http://www.example.com adresiş oxo3ʼonapa',
+'extlink_tip' => 'Galeni kʼontʼaktʼi (Adresiş dudis http:// ukʼatit)',
 'headline_sample' => 'Dudicoxoşi nçʼara',
-'headline_tip'    => '2. derece dudicoxo',
-'nowiki_sample'   => 'Oxoşkveri formatʼi nçʼara-tkvani ak doçʼarit.',
-'nowiki_tip'      => 'vikʼiş formatʼi ipʼtʼali qʼvi.',
-'image_tip'       => 'Doxveri dosya',
-'media_tip'       => 'Media dosyasişa kʼontʼaktʼi',
-'sig_tip'         => 'Xeşçʼara-tkvani do tarixi',
-'hr_tip'          => 'Horizontʼali ğara (m3ika ixmarit)',
+'headline_tip' => '2. derece dudicoxo',
+'nowiki_sample' => 'Oxoşkveri formatʼi nçʼara-tkvani ak doçʼarit.',
+'nowiki_tip' => 'vikʼiş formatʼi ipʼtʼali qʼvi.',
+'image_tip' => 'Doxveri dosya',
+'media_tip' => 'Media dosyasişa kʼontʼaktʼi',
+'sig_tip' => 'Xeşçʼara-tkvani do tarixi',
+'hr_tip' => 'Horizontʼali ğara (m3ika ixmarit)',
 
 # Edit pages
-'summary'                          => 'Mkʼule nçʼarate:',
-'subject'                          => 'Tema/dudi-coxo:',
-'minoredit'                        => 'Çʼitʼa oktiroba',
-'watchthis'                        => 'Butkʼa gatxozi',
-'savearticle'                      => 'Butʼkʼas ikʼayitʼi',
-'preview'                          => 'Evvelişen i3ʼkʼedi',
-'showpreview'                      => '"Evvelişen i3ʼkʼedi" fonkʼsioni ixmari',
-'showdiff'                         => 'Oktirobape ko3ʼiri',
-'anoneditwarning'                  => "'''KUN3Xİ:''' Sitʼeşa amaxtimeri va re.
+'summary' => 'Mkʼule nçʼarate:',
+'subject' => 'Tema/dudi-coxo:',
+'minoredit' => 'Çʼitʼa oktiroba',
+'watchthis' => 'Butkʼa gatxozi',
+'savearticle' => 'Butʼkʼas ikʼayitʼi',
+'preview' => 'Evvelişen i3ʼkʼedi',
+'showpreview' => '"Evvelişen i3ʼkʼedi" fonkʼsioni ixmari',
+'showdiff' => 'Oktirobape ko3ʼiri',
+'anoneditwarning' => "'''KUN3Xİ:''' Sitʼeşa amaxtimeri va re.
 Emuşeni butʼkʼaşi oktirobaşi kʼayitʼepes, coxoskani yeine IP adresiskani ikʼayitʼinasen.",
-'summary-preview'                  => '"Evvelişen i3ʼkʼedi" fonkʼsionişi ozetʼi:',
-'newarticle'                       => '(Ağani)',
-'newarticletext'                   => "Daha na va ren ar butʼkʼaşa na geidven ar kʼontʼaktʼis atxozit. Am butʼkʼa okʼidu şeni tude na ren tʼeksboksi ixmarit. Çkina şeni [[{{MediaWiki:Helppage}}|meşvelaşi butʼkʼas]] o3ʼkʼedit. Ak çilataten moxtit na, pʼrogramişi '''Ukʼuni''' tʼuşis geibaz*git.",
-'noarticletext'                    => 'A3ʼi am butʼkʼa boşi ren.
+'summary-preview' => '"Evvelişen i3ʼkʼedi" fonkʼsionişi ozetʼi:',
+'newarticle' => '(Ağani)',
+'newarticletext' => "Daha na va ren ar butʼkʼaşa na geidven ar kʼontʼaktʼis atxozit. Am butʼkʼa okʼidu şeni tude na ren tʼeksboksi ixmarit. Çkina şeni [[{{MediaWiki:Helppage}}|meşvelaşi butʼkʼas]] o3ʼkʼedit. Ak çilataten moxtit na, pʼrogramişi '''Ukʼuni''' tʼuşis geibaz*git.",
+'noarticletext' => 'A3ʼi am butʼkʼa boşi ren.
 Am butʼkʼaş dudi-coxo majurani butʼkʼapes [[Special:Search/{{PAGENAME}}|gagoren]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} alakʼali na renan ndğerepe gagoren],
 varna am butʼkʼa [{{fullurl:{{FULLPAGENAME}}|action=edit}} gaktirinen]</span>.',
-'previewnote'                      => "'''Aya, xvala, \"Evvelişen i3ʼkʼedi\" fonkʼsioni ren do oktirobape-skani kʼayitʼi var ixvenu çkva!'''",
-'editing'                          => '"$1" butʼkʼa iktirinen a3ʼi',
-'editingsection'                   => '"$1" butʼkʼas burme iktirinen',
-'copyrightwarning'                 => "'''Mu iqʼven kʼun3xi:''' {{SITENAME}} sitʼeşa na ixvenu mteli meşvelape <i>$2</i>
+'previewnote' => "'''Aya, xvala, \"Evvelişen i3ʼkʼedi\" fonkʼsioni ren do oktirobape-skani kʼayitʼi var ixvenu çkva!'''",
+'editing' => '"$1" butʼkʼa iktirinen a3ʼi',
+'editingsection' => '"$1" butʼkʼas burme iktirinen',
+'copyrightwarning' => "'''Mu iqʼven kʼun3xi:''' {{SITENAME}} sitʼeşa na ixvenu mteli meşvelape <i>$2</i>
 paktʼiş doloxe ren (detayepe şeni $1's o3ʼkʼedi).
 Na qʼvi meşvelaşa başka makʼaturepeşkʼelen pʼatʼi mutxanepe ixvenen varna xemoşletinerot do uoçodinurot başka svapeşa niçinen, aya kʼabuli qʼvi varna am sitʼe şeni mutu mo ikip!<br />
 Edo amuş metʼi, ak mxuciş meçamu ginonna, meşvelape ti-skani kʼala oçʼaruşi re, varna ofi3ialurişa gon3ʼkʼimeri na ren ar kʼaynağişen (odudeşen) varna başka oxoşkveri kʼaynağepeşen (odudepeşen) na ezdi kʼabuli oxvenuşi re.<br />
-'''<center>DOXMELİ HAKʼEPETE NA İŞİNAXENAN XANDAPE AK MO UKʼATEPT!</center>'''",
-'templatesused'                    => 'Am butʼkʼas na ixmarinen {{PLURAL:$1|şabloni|şablonepe}}:',
-'templatesusedpreview'             => 'Am "Evvelişen i3ʼkʼedi" fonkʼsionis na ixmarinen {{PLURAL:$1|şabloni|şablonepe}}:',
-'template-protected'               => '(oçvu)',
-'template-semiprotected'           => '(gverd-oçvu)',
-'hiddencategories'                 => 'Am butʼkʼa {{PLURAL:$1|1 şinaxeri kʼatʼegori|$1 şinaxeri kʼatʼegori}}şi ren:',
+'''DOXMELİ HAKʼEPETE NA İŞİNAXENAN XANDAPE AK MO UKʼATEPT!'''",
+'templatesused' => 'Am butʼkʼas na ixmarinen {{PLURAL:$1|şabloni|şablonepe}}:',
+'templatesusedpreview' => 'Am "Evvelişen i3ʼkʼedi" fonkʼsionis na ixmarinen {{PLURAL:$1|şabloni|şablonepe}}:',
+'template-protected' => '(oçvu)',
+'template-semiprotected' => '(gverd-oçvu)',
+'hiddencategories' => 'Am butʼkʼa {{PLURAL:$1|1 şinaxeri kʼatʼegori|$1 şinaxeri kʼatʼegori}}şi ren:',
 'permissionserrorstext-withaction' => 'Tude na çʼars {{PLURAL:$1|sebebi|sebebepe}} na rtʼu şeni $2 yetʼkʼi var giğun:',
 
 # History pages
-'viewpagelogs'           => 'Am butʼkʼa şeni kʼayitʼepe ko3ʼiri',
-'currentrev-asof'        => '$1 itibariten butʼkʼaşi a3ʼineri xali.',
-'revisionasof'           => 'Butʼkʼaşi $1 tarixis xali muşi',
-'previousrevision'       => '← Mcveşi xali muşi',
-'nextrevision'           => 'Ağani xali-muşi →',
-'currentrevisionlink'    => 'İrişen ağne xali-muşi ko3ʼiri',
-'cur'                    => 'farkʼi',
-'last'                   => 'çodina',
-'histlegend'             => 'Farkʼiş 3xuna: o3xunu şeni na ginon 2 versiyoniş na go3ʼadgin dairepeşa gebaz*gi, do ukvule entʼerişa gebaz*gi varna butʼkʼaşi tude na dgin tʼuşişa gebaz*gi.<br />
+'viewpagelogs' => 'Am butʼkʼa şeni kʼayitʼepe ko3ʼiri',
+'currentrev-asof' => '$1 itibariten butʼkʼaşi a3ʼineri xali.',
+'revisionasof' => 'Butʼkʼaşi $1 tarixis xali muşi',
+'previousrevision' => '← Mcveşi xali muşi',
+'nextrevision' => 'Ağani xali-muşi →',
+'currentrevisionlink' => 'İrişen ağne xali-muşi ko3ʼiri',
+'cur' => 'farkʼi',
+'last' => 'çodina',
+'histlegend' => 'Farkʼiş 3xuna: o3xunu şeni na ginon 2 versiyoniş na go3ʼadgin dairepeşa gebaz*gi, do ukvule entʼerişa gebaz*gi varna butʼkʼaşi tude na dgin tʼuşişa gebaz*gi.<br />
 Oxo3ʼonapape: (a3ʼineri) = a3ʼineri versiyoni kʼala na ren farkʼi,
 (iptineri) = iptineri versiyoni kʼala na ren farkʼi, Çʼ = çʼitʼa oktiroba.',
 'history-fieldset-title' => 'Golaxteris o3ʼkʼedi',
-'histfirst'              => 'irişen mcveşi',
-'histlast'               => 'irişen ağani',
+'histfirst' => 'irişen mcveşi',
+'histlast' => 'irişen ağani',
 
 # Revision deletion
-'rev-delundel'          => 'ko3ʼiri/doşinaxi',
-'revdelete-radio-set'   => 'Ho',
+'rev-delundel' => 'ko3ʼiri/doşinaxi',
+'revdelete-radio-set' => 'Ho',
 'revdelete-radio-unset' => 'Var',
-'revdel-restore'        => 'Ozʼiramuşi doktiri',
+'revdel-restore' => 'Ozʼiramuşi doktiri',
 
 # Merge log
 'revertmerge' => 'Artikʼartişen okʼo3ʼkʼi',
 
 # Diffs
-'history-title'           => '"$1" butʼkʼaşi tarixi',
-'difference'              => '(Versiyonepeşi farkʼepe)',
-'lineno'                  => '$1. satʼiri:',
+'history-title' => '"$1" butʼkʼaşi tarixi',
+'lineno' => '$1. satʼiri:',
 'compareselectedversions' => 'Na goşiğen versiyonepe okʼo3ʼiri',
-'editundo'                => 'ukʼuni',
+'editundo' => 'ukʼuni',
 
 # Search results
-'searchresults'             => 'Ogoru sonucepe',
-'searchresults-title'       => '"$1" şeni ogoru sonucepe',
-'searchresulttext'          => '{{SITENAME}}-iş doloxe ogoru temas, mutxanepe oguru şeni [[{{MediaWiki:Helppage}}|{{int:help}}]] coxoni butʼkʼas o3ʼkʼedit.',
-'searchsubtitle'            => 'Si \'\'\'[[:$1]]\'\'\' şeni gori. ([[Special:Prefixindex/$1|"$1" kʼala na gyoçʼkʼaps mtel butʼkʼape]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"\' butʼkʼa muşişa kʼontʼaktʼi na ikips mtel butʼkʼape]])',
-'searchsubtitleinvalid'     => "'''$1''' şeni mgori",
-'notitlematches'            => 'Çkar svas var iz*irinu',
-'notextmatches'             => 'Çkar butʼkʼa var iz*irinu',
-'prevn'                     => 'ukʼuni {{PLURAL:$1|$1}}',
-'nextn'                     => 'mendi {{PLURAL:$1|$1}}',
-'viewprevnext'              => '($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 tkvala|$2 tkvala}})',
-'search-redirect'           => '(redirektʼi $1)',
-'search-section'            => '(burme $1)',
-'search-suggest'            => 'Aya çʼari-i: $1',
-'search-interwiki-caption'  => 'Cuma projepe',
-'search-interwiki-default'  => '$1 sonucepe:',
-'search-interwiki-more'     => '(çkva)',
-'search-mwsuggest-enabled'  => 'okʼvandupete',
+'searchresults' => 'Ogoru sonucepe',
+'searchresults-title' => '"$1" şeni ogoru sonucepe',
+'searchresulttext' => '{{SITENAME}}-iş doloxe ogoru temas, mutxanepe oguru şeni [[{{MediaWiki:Helppage}}|{{int:help}}]] coxoni butʼkʼas o3ʼkʼedit.',
+'searchsubtitle' => 'Si \'\'\'[[:$1]]\'\'\' şeni gori. ([[Special:Prefixindex/$1|"$1" kʼala na gyoçʼkʼaps mtel butʼkʼape]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"\' butʼkʼa muşişa kʼontʼaktʼi na ikips mtel butʼkʼape]])',
+'searchsubtitleinvalid' => "'''$1''' şeni mgori",
+'notitlematches' => 'Çkar svas var iz*irinu',
+'notextmatches' => 'Çkar butʼkʼa var iz*irinu',
+'prevn' => 'ukʼuni {{PLURAL:$1|$1}}',
+'nextn' => 'mendi {{PLURAL:$1|$1}}',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 tkvala|$2 tkvala}})',
+'search-redirect' => '(redirektʼi $1)',
+'search-section' => '(burme $1)',
+'search-suggest' => 'Aya çʼari-i: $1',
+'search-interwiki-caption' => 'Cuma projepe',
+'search-interwiki-default' => '$1 sonucepe:',
+'search-interwiki-more' => '(çkva)',
+'search-mwsuggest-enabled' => 'okʼvandupete',
 'search-mwsuggest-disabled' => 'okʼvandu varen',
-'nonefound'                 => "'''Notʼi''': Xvala, namtini svacoxope maartani oqʼopinot igoren.
+'searchall' => 'mteli',
+'nonefound' => "'''Notʼi''': Xvala, namtini svacoxope maartani oqʼopinot igoren.
 Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (oğarğaluşi butʼkʼape, şablonepe, doçkva şeyepeti iqʼvasen) mgori varna pʼrefiksi oqʼopinot na igoren svacoxo ixmarit.",
-'powersearch'               => 'Mordineri ogoru',
-'powersearch-legend'        => 'Mordineri ogoru',
-'powersearch-ns'            => 'Svacoxo-s mgori:',
-'powersearch-redir'         => 'Redirektʼepe ilistʼeli',
-'powersearch-field'         => 'Mgori:',
+'powersearch' => 'Mordineri ogoru',
+'powersearch-legend' => 'Mordineri ogoru',
+'powersearch-ns' => 'Svacoxo-s mgori:',
+'powersearch-redir' => 'Redirektʼepe ilistʼeli',
+'powersearch-field' => 'Mgori:',
 
 # Preferences page
-'preferences'               => 'Tercihepe',
-'mypreferences'             => 'Çkimi tercihepe',
-'searchresultshead'         => 'Mgori',
-'timezoneregion-africa'     => "Afrik'a",
+'preferences' => 'Tercihepe',
+'mypreferences' => 'Çkimi tercihepe',
+'searchresultshead' => 'Mgori',
+'timezoneregion-africa' => "Afrik'a",
 'timezoneregion-antarctica' => "Antartik'a",
-'timezoneregion-asia'       => 'Asya',
-'timezoneregion-europe'     => "Avrop'a",
-'youremail'                 => 'E-maili:',
-'yourrealname'              => 'Coxo skani:',
-'yourlanguage'              => 'Nena skani:',
-'gender-male'               => "Biç'i",
-'gender-female'             => "Bozo (K'ulani)",
-'email'                     => 'E-maili',
+'timezoneregion-asia' => 'Asya',
+'timezoneregion-europe' => "Avrop'a",
+'youremail' => 'E-maili:',
+'yourrealname' => 'Coxo skani:',
+'yourlanguage' => 'Nena skani:',
+'gender-male' => "Biç'i",
+'gender-female' => "Bozo (K'ulani)",
+'email' => 'E-maili',
 
 # Groups
-'group'       => 'Grubi:',
+'group' => 'Grubi:',
 'group-sysop' => 'Adminepe',
 
 'grouppage-sysop' => '{{ns:project}}:Adminepe',
@@ -360,99 +365,102 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
 'right-delete' => 'Am sayfape jili',
 
 # User rights log
-'rightslog'  => 'Maxmareş hakʼişi kʼayitʼepe',
+'rightslog' => 'Maxmareş hakʼişi kʼayitʼepe',
 'rightsnone' => '(Va ren)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read'   => "am sayfa ik'itxi",
-'action-edit'   => 'am butʼkʼa oktiruşa',
+'action-read' => "am sayfa ik'itxi",
+'action-edit' => 'am butʼkʼa oktiruşa',
 'action-delete' => 'am sayfa dokosi',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|oktiroba|oktiroba}}',
-'recentchanges'                  => 'Çodinaşi oktirobape',
-'recentchanges-legend'           => 'Çodinaşi oktirobape tercihepe',
+'nchanges' => '$1 {{PLURAL:$1|oktiroba|oktiroba}}',
+'recentchanges' => 'Çodinaşi oktirobape',
+'recentchanges-legend' => 'Çodinaşi oktirobape tercihepe',
 'recentchanges-feed-description' => 'Am feedis vikiʼs na ixvenu irişen sonni oktirobape gatxozi.',
-'rcnote'                         => "$4 tarixi do saatʼi $5 şakis, çodinaşi {{PLURAL:$2|1 ndğas|'''$2''' ndğas}} na ixvenu, {{PLURAL:$1|'''1''' oktiroba|'''$1''' oktiroba}}, tude ren.",
-'rclistfrom'                     => '$1 tarixişen doni na ixvenu oktirobape ko3ʼiri',
-'rcshowhideminor'                => 'çʼitʼa oktirobape $1',
-'rcshowhidebots'                 => 'botʼepe $1',
-'rcshowhideliu'                  => 'meçʼareri maxmarepe $1',
-'rcshowhideanons'                => 'anonimuri maxmarepe $1',
-'rcshowhidemine'                 => 'çkimi oktirobape $1',
-'rclinks'                        => 'Çodinaşi $2 ndğas na ixvenu çodinaşi $1 oktiroba ko3ʼiri;<br /> $3',
-'diff'                           => 'farkʼi',
-'hist'                           => 'tarixi',
-'hide'                           => 'Doşinaxi',
-'show'                           => 'Ko3ʼiri',
-'minoreditletter'                => 'çʼ',
-'newpageletter'                  => 'A',
-'boteditletter'                  => 'b',
-'rc_categories_any'              => 'Çkar',
-'rc-enhanced-expand'             => 'Detayepe ko3ʼiri (JavaScript-i unon)',
-'rc-enhanced-hide'               => 'Detayepe doşinaxi',
+'rcnote' => "$4 tarixi do saatʼi $5 şakis, çodinaşi {{PLURAL:$2|1 ndğas|'''$2''' ndğas}} na ixvenu, {{PLURAL:$1|'''1''' oktiroba|'''$1''' oktiroba}}, tude ren.",
+'rclistfrom' => '$1 tarixişen doni na ixvenu oktirobape ko3ʼiri',
+'rcshowhideminor' => 'çʼitʼa oktirobape $1',
+'rcshowhidebots' => 'botʼepe $1',
+'rcshowhideliu' => 'meçʼareri maxmarepe $1',
+'rcshowhideanons' => 'anonimuri maxmarepe $1',
+'rcshowhidemine' => 'çkimi oktirobape $1',
+'rclinks' => 'Çodinaşi $2 ndğas na ixvenu çodinaşi $1 oktiroba ko3ʼiri;<br /> $3',
+'diff' => 'farkʼi',
+'hist' => 'tarixi',
+'hide' => 'Doşinaxi',
+'show' => 'Ko3ʼiri',
+'minoreditletter' => 'çʼ',
+'newpageletter' => 'A',
+'boteditletter' => 'b',
+'rc_categories_any' => 'Çkar',
+'rc-enhanced-expand' => 'Detayepe ko3ʼiri (JavaScript-i unon)',
+'rc-enhanced-hide' => 'Detayepe doşinaxi',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Alakʼali na renan oktirobape',
-'recentchangeslinked-title'   => '"$1" kʼala alakʼali na renan oktirobape',
+'recentchangeslinked' => 'Alakʼali na renan oktirobape',
+'recentchangeslinked-title' => '"$1" kʼala alakʼali na renan oktirobape',
 'recentchangeslinked-summary' => "Tude na çʼars listʼe, kʼiti na noğiru butʼkʼaşa (varna kʼiti na noğiru kʼatʼegorişi makʼaturepeşa) kʼontʼaktʼi na ikips butʼkʼapes na ixvenu çodinaşi oktirobapeşi listʼe ren.
 [[Special:Watchlist|Gotxozu na ginon butʼkʼapeşi listʼes]] na renan butʼkʼape '''mçxu''' nçʼaraten niçʼaru.",
-'recentchangeslinked-page'    => 'Butʼkʼaşi coxo:',
-'recentchangeslinked-to'      => 'Na niçinen butʼkʼa yeine na niçinen butʼkʼaşa kʼontʼaktʼi meçameri na renan butʼkʼape ko3ʼiri',
+'recentchangeslinked-page' => 'Butʼkʼaşi coxo:',
+'recentchangeslinked-to' => 'Na niçinen butʼkʼa yeine na niçinen butʼkʼaşa kʼontʼaktʼi meçameri na renan butʼkʼape ko3ʼiri',
 
 # Upload
-'upload'        => 'Dosya doloxe kamaxvi',
+'upload' => 'Dosya doloxe kamaxvi',
 'uploadlogpage' => 'Dosya oncğonu kʼayitʼepe',
 'uploadedimage' => 'Siteşa na incğonen resimi: "[[$1]]"',
 
+'license-header' => 'Lisans',
+
 # File description page
-'filehist'                  => 'Dosyaşi tarixi',
-'filehist-help'             => 'Dosyaşi tarixi oz*iru şeni Ndğa/Ora burme-muşis na renan tarixepes o3ʼkʼedi.',
-'filehist-deleteall'        => 'mteli jili',
-'filehist-deleteone'        => 'jili',
-'filehist-current'          => 'A3ʼineri',
-'filehist-datetime'         => 'Dğa/Ora',
-'filehist-thumb'            => 'Mçʼitʼa sureti',
-'filehist-thumbtext'        => '$1 tarixis na iz*iren versiyonişi mçʼitʼa na ren xali',
-'filehist-user'             => 'Maxmare',
-'filehist-dimensions'       => 'Ebatʼepe',
-'filehist-comment'          => 'Kʼommentʼi',
-'imagelinks'                => 'Dosyaşi kʼontaktʼepe',
-'linkstoimage'              => 'Am oz*ira-dosyaşa kʼontʼaktʼi na ikips {{PLURAL:$1|butʼkʼa|$1 butʼkʼa}}:',
-'sharedupload'              => 'Am dosya $1-şen moxtu do belkim majurani pʼrojepesti ixmarinen.',
+'file-anchor-link' => 'Dosya',
+'filehist' => 'Dosyaşi tarixi',
+'filehist-help' => 'Dosyaşi tarixi oz*iru şeni Ndğa/Ora burme-muşis na renan tarixepes o3ʼkʼedi.',
+'filehist-deleteall' => 'mteli jili',
+'filehist-deleteone' => 'jili',
+'filehist-current' => 'A3ʼineri',
+'filehist-datetime' => 'Dğa/Ora',
+'filehist-thumb' => 'Mçʼitʼa sureti',
+'filehist-thumbtext' => '$1 tarixis na iz*iren versiyonişi mçʼitʼa na ren xali',
+'filehist-user' => 'Maxmare',
+'filehist-dimensions' => 'Ebatʼepe',
+'filehist-comment' => 'Kʼommentʼi',
+'imagelinks' => 'Dosyaşi kʼontaktʼepe',
+'linkstoimage' => 'Am oz*ira-dosyaşa kʼontʼaktʼi na ikips {{PLURAL:$1|butʼkʼa|$1 butʼkʼa}}:',
+'sharedupload' => 'Am dosya $1-şen moxtu do belkim majurani pʼrojepesti ixmarinen.',
 'uploadnewversion-linktext' => 'Dosyaşi ağani versiyoni doloxe kamaxvi',
 
 # Statistics
 'statistics' => 'İstatistʼiğepe',
 
-'brokenredirects-edit'   => 'doktiri',
+'brokenredirects-edit' => 'doktiri',
 'brokenredirects-delete' => 'jili',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|byte|byte}}',
-'nmembers'      => '{{PLURAL:$1|makʼature|makʼaturepe}}',
-'prefixindex'   => 'Pʼrefiksi kʼala mteli butʼkʼape',
-'newpages'      => 'Ağani butʼkʼape',
-'move'          => 'Komendiği',
-'movethispage'  => 'Butʼkʼa zdi',
+'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
+'nmembers' => '{{PLURAL:$1|makʼature|makʼaturepe}}',
+'prefixindex' => 'Pʼrefiksi kʼala mteli butʼkʼape',
+'newpages' => 'Ağani butʼkʼape',
+'move' => 'Komendiği',
+'movethispage' => 'Butʼkʼa zdi',
 'pager-newer-n' => '{{PLURAL:$1|çkva ağani 1|çkva ağani $1}}',
 'pager-older-n' => '{{PLURAL:$1|çkva mcveşi 1|çkva mcveşi $1}}',
 
 # Book sources
-'booksources'               => 'Odude svarape',
+'booksources' => 'Odude svarape',
 'booksources-search-legend' => 'Svaraş odudepe mgori',
-'booksources-go'            => 'İgzali',
+'booksources-go' => 'İgzali',
 
 # Special:Log
 'log' => 'Kʼayitʼepe',
 
 # Special:AllPages
-'allpages'       => 'Mteli butʼkʼape',
+'allpages' => 'Mteli butʼkʼape',
 'alphaindexline' => '$1 butʼkʼa muşişen $2 butʼkʼa muşişa',
-'prevpage'       => 'İptineri butʼkʼa ($1)',
-'allpagesfrom'   => 'Olistʼeluşa na geiçʼkʼasen harfepe:',
-'allpagesto'     => 'Amu kʼala na içodu butʼkʼape ko3ʼiri:',
-'allarticles'    => 'Mteli butʼkʼape',
+'prevpage' => 'İptineri butʼkʼa ($1)',
+'allpagesfrom' => 'Olistʼeluşa na geiçʼkʼasen harfepe:',
+'allpagesto' => 'Amu kʼala na içodu butʼkʼape ko3ʼiri:',
+'allarticles' => 'Mteli butʼkʼape',
 'allpagessubmit' => 'İgzali',
 
 # Special:LinkSearch
@@ -468,122 +476,123 @@ Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (o
 'emailuser' => 'Maxmares e-maili oncğoni',
 
 # Watchlist
-'watchlist'         => 'çkimi gotxozu listʼe',
-'mywatchlist'       => 'Çkimi gotxozu listʼe',
-'addedwatchtext'    => '"<nowiki>[[:$1]]</nowiki>" coxoni butʼkʼa [[Special:Watchlist|gotxozu listʼes]] ikʼayitʼinu.
+'watchlist' => 'çkimi gotxozu listʼe',
+'mywatchlist' => 'Çkimi gotxozu listʼe',
+'addedwatchtext' => '"<nowiki>[[:$1]]</nowiki>" coxoni butʼkʼa [[Special:Watchlist|gotxozu listʼes]] ikʼayitʼinu.
 
 Na moxtasen oras, am butʼkʼaşa do am butʼkʼa kʼala alakʼali na ren oğarğaluşi butʼkʼaşa na ixvenasen oktirobape ak ilistʼelinasen.
 
 Dido kʼai o3xunu şeni doloxe muşis [[Special:RecentChanges|çodinaşi oktirobapeşi listʼe]] stʼatʼias dolom3ʼkʼupineri harfepete ilistʼelinasenan.
 
 Butʼkʼai gotxozu listʼeşen ojilu şeni "gotxozu naşkʼvi" linkʼişa gebaz*git.',
-'removedwatchtext'  => '"[[:$1]]" but\'k\'a, [[Special:Watchlist|skani gotxozu list\'eşen]] nijilu.',
-'watch'             => 'Amus gatxozi',
-'watchthispage'     => 'Butʼkʼa gatxozi',
-'unwatch'           => 'Gotxozu naşkʼvi',
+'removedwatchtext' => '"[[:$1]]" but\'k\'a, [[Special:Watchlist|skani gotxozu list\'eşen]] nijilu.',
+'watch' => 'Amus gatxozi',
+'watchthispage' => 'Butʼkʼa gatxozi',
+'unwatch' => 'Gotxozu naşkʼvi',
 'watchlist-details' => '{{PLURAL:$1|$1 butʼkʼa|$1 butʼkʼa}}, skani gotxozu listʼes ren, ama oğarğaluşi butʼkʼapes va ren',
-'wlshowlast'        => 'Çodinaşi $1 saatʼi $2 ndğa ko3ʼiri $3',
+'wlshowlast' => 'Çodinaşi $1 saatʼi $2 ndğa ko3ʼiri $3',
 'watchlist-options' => 'Gotxozu listʼeşi tercihepe',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'i3ʼkʼedinen...',
+'watching' => 'i3ʼkʼedinen...',
 'unwatching' => 'var i3ʼkʼedinen...',
 
 # Delete
-'deletepage'            => 'Butʼkʼa jili',
-'confirmdeletetext'     => 'Aşoten am butʼkʼa varna dosya, mteli golaxteri kʼayitʼepe kʼala datʼabeizişen nijilen.
+'deletepage' => 'Butʼkʼa jili',
+'confirmdeletetext' => 'Aşoten am butʼkʼa varna dosya, mteli golaxteri kʼayitʼepe kʼala datʼabeizişen nijilen.
 Am dulyaşen na yeçkindasen zararepe giçkinna do am dulya [[{{MediaWiki:Policy-url}}|Ojiluşi kʼaidepe]] şeni mtini renya isimadep na, am dulya doqʼvi.',
-'actioncomplete'        => 'Aksiyoni içodinu.',
-'deletedtext'           => '"$1" nijilu.
+'actioncomplete' => 'Aksiyoni içodinu.',
+'deletedtext' => '"$1" nijilu.
 Xolosi oras jileri na renanpe oz*iru şeni: $2.',
-'dellogpage'            => 'Ojiluşi kʼayitʼepe',
-'deletecomment'         => 'Muşen:',
-'deleteotherreason'     => 'Majurani/ilave sebebi:',
+'dellogpage' => 'Ojiluşi kʼayitʼepe',
+'deletecomment' => 'Muşen:',
+'deleteotherreason' => 'Majurani/ilave sebebi:',
 'deletereasonotherlist' => 'Majurani sebebepe',
 
 # Rollback
 'rollbacklink' => 'mcveşi xali muşişa igzali',
 
 # Protect
-'protectlogpage'              => 'Oçvaluşi kʼayitʼepe',
-'protectedarticle'            => '"[[$1]]" içven a3ʼi',
-'modifiedarticleprotection'   => '"[[$1]]" şeni oçvaluşi derece iktirinu',
-'protectcomment'              => 'Sebebi:',
-'protectexpiry'               => 'Am tarixis içoden:',
-'protect_expiry_invalid'      => 'Am tarixis var içoden, mtini va ren.',
-'protect_expiry_old'          => 'Golaxteris soni oxmaruşi ora.',
-'protect-text'                => "'''$1''' butʼkʼaşi oçvaluşi sinori akolen gazʼiren do gaktirinen.",
-'protect-locked-access'       => "Butʼkʼaşi oçvalu sinorepe oktiru şeni maxmare-hesabi skanis yetʼkʼi var uğun.
+'protectlogpage' => 'Oçvaluşi kʼayitʼepe',
+'protectedarticle' => '"[[$1]]" içven a3ʼi',
+'modifiedarticleprotection' => '"[[$1]]" şeni oçvaluşi derece iktirinu',
+'protectcomment' => 'Sebebi:',
+'protectexpiry' => 'Am tarixis içoden:',
+'protect_expiry_invalid' => 'Am tarixis var içoden, mtini va ren.',
+'protect_expiry_old' => 'Golaxteris soni oxmaruşi ora.',
+'protect-text' => "'''$1''' butʼkʼaşi oçvaluşi sinori akolen gazʼiren do gaktirinen.",
+'protect-locked-access' => "Butʼkʼaşi oçvalu sinorepe oktiru şeni maxmare-hesabi skanis yetʼkʼi var uğun.
 '''$1''' butʼkʼaşi maartani tercihepe antepe renan:",
-'protect-cascadeon'           => 'Am butʼkʼa, "kʼademoni oçvuşi sistemi" aktʼifi na ixvenu do tude na ren {{PLURAL:$1|$1 butʼkʼas|$1 butʼkʼas}} na ixmarinetʼu şeni a3ʼi içven.
+'protect-cascadeon' => 'Am butʼkʼa, "kʼademoni oçvuşi sistemi" aktʼifi na ixvenu do tude na ren {{PLURAL:$1|$1 butʼkʼas|$1 butʼkʼas}} na ixmarinetʼu şeni a3ʼi içven.
 Am butʼkʼaşi oçvuşi sinori gaktirinen; ama am oktiroba, kʼademoni oçvaluşa mutu va ikips.',
-'protect-default'             => 'Mteli maxmarepes izni komeçi',
-'protect-fallback'            => '"$1" izni unon',
+'protect-default' => 'Mteli maxmarepes izni komeçi',
+'protect-fallback' => '"$1" izni unon',
 'protect-level-autoconfirmed' => 'Ağani do kʼayitʼoni na va renan kʼoçepes bloği qʼvi',
-'protect-level-sysop'         => 'Xvala, Adminepe şeni',
-'protect-summary-cascade'     => 'kʼademoni',
-'protect-expiring'            => 'çodinaşi tarixi $1 (UTC)',
-'protect-cascade'             => 'Am butʼkʼas na ixmarinen mteli butʼkʼape içvi (kʼademoni oçvalu)',
-'protect-cantedit'            => 'Am butʼkʼaşi oçvaluşi sinori va gaktirinen, çunki yetkʼi var giğun.',
-'restriction-type'            => 'İzini:',
-'restriction-level'           => 'Om3ikanuşi sinori:',
+'protect-level-sysop' => 'Xvala, Adminepe şeni',
+'protect-summary-cascade' => 'kʼademoni',
+'protect-expiring' => 'çodinaşi tarixi $1 (UTC)',
+'protect-cascade' => 'Am butʼkʼas na ixmarinen mteli butʼkʼape içvi (kʼademoni oçvalu)',
+'protect-cantedit' => 'Am butʼkʼaşi oçvaluşi sinori va gaktirinen, çunki yetkʼi var giğun.',
+'restriction-type' => 'İzini:',
+'restriction-level' => 'Om3ikanuşi sinori:',
 
 # Undelete
-'undeletelink'              => 'i3ʼkʼedi/komoiği',
-'undelete-search-submit'    => 'Mgori',
+'undeletelink' => 'i3ʼkʼedi/komoiği',
+'undelete-search-submit' => 'Mgori',
 'undelete-show-file-submit' => 'Ho',
 
 # Namespace form on various pages
-'namespace'      => 'Svacoxo:',
-'invert'         => '3xuneri na var renanpe ko3ʼiri',
+'namespace' => 'Svacoxo:',
+'invert' => '3xuneri na var renanpe ko3ʼiri',
 'blanknamespace' => '(Dudi)',
 
 # Contributions
-'contributions'       => 'Maxmareşi meşvelape',
+'contributions' => 'Maxmareşi meşvelape',
 'contributions-title' => '$1 şeni maxmareş meşvelape',
-'mycontris'           => 'Çkimi meşvelape',
-'contribsub2'         => '$1 ($2)',
-'uctop'               => '(dudi)',
-'month'               => 'Tuta:',
-'year'                => '3ʼana:',
+'mycontris' => 'Çkimi meşvelape',
+'contribsub2' => '$1 ($2)',
+'uctop' => '(dudi)',
+'month' => 'Tuta:',
+'year' => '3ʼana:',
 
-'sp-contributions-newbies'  => 'Xvala ağani maxmarepeşi meşvelape ko3ʼiri',
+'sp-contributions-newbies' => 'Xvala ağani maxmarepeşi meşvelape ko3ʼiri',
 'sp-contributions-blocklog' => 'Bloğiş kʼayitʼi',
-'sp-contributions-search'   => 'Meşvelape mgori',
+'sp-contributions-talk' => 'Mesaji',
+'sp-contributions-search' => 'Meşvelape mgori',
 'sp-contributions-username' => 'IP varna maxmare:',
-'sp-contributions-submit'   => 'Mgori',
+'sp-contributions-submit' => 'Mgori',
 
 # What links here
-'whatlinkshere'            => 'Butʼkʼaşa na ixvenu kʼontʼaktʼepe',
-'whatlinkshere-title'      => '"$1" maddeşa kʼontʼaktʼi na ikips butʼkʼape',
-'whatlinkshere-page'       => 'Butʼkʼa:',
-'linkshere'                => "'''[[:$1]]''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
-'isredirect'               => 'redirektʼiş butʼkʼa',
-'istemplate'               => 'okʼatu',
-'isimage'                  => 'dosyaşi kʼontʼaktʼi',
-'whatlinkshere-prev'       => '{{PLURAL:$1|ukʼuni|ukʼuni $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|mendi|mendi $1}}',
-'whatlinkshere-links'      => '← kʼontaktʼepe',
+'whatlinkshere' => 'Butʼkʼaşa na ixvenu kʼontʼaktʼepe',
+'whatlinkshere-title' => '"$1" maddeşa kʼontʼaktʼi na ikips butʼkʼape',
+'whatlinkshere-page' => 'Butʼkʼa:',
+'linkshere' => "'''[[:$1]]''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
+'isredirect' => 'redirektʼiş butʼkʼa',
+'istemplate' => 'okʼatu',
+'isimage' => 'dosyaşi kʼontʼaktʼi',
+'whatlinkshere-prev' => '{{PLURAL:$1|ukʼuni|ukʼuni $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|mendi|mendi $1}}',
+'whatlinkshere-links' => '← kʼontaktʼepe',
 'whatlinkshere-hideredirs' => 'redirektʼepe $1',
-'whatlinkshere-hidetrans'  => 'Çʼapʼrazi mem3xverepe $1',
-'whatlinkshere-hidelinks'  => 'kʼontʼaktʼepe $1',
-'whatlinkshere-filters'    => 'Filitʼrepe',
+'whatlinkshere-hidetrans' => 'Çʼapʼrazi mem3xverepe $1',
+'whatlinkshere-hidelinks' => 'kʼontʼaktʼepe $1',
+'whatlinkshere-filters' => 'Filitʼrepe',
 
 # Block/unblock
-'blockip'                  => 'Maxmares bloği qʼvi',
-'ipboptions'               => '2 saatʼi:2 hours,1 ndğa:1 day,3 ndğa:3 days,1 doloni:1 week,2 doloni:2 weeks,1 tuta:1 month,3 tuta:3 months,6 tuta:6 months,1 3ʼana:1 year,pʼanda:infinite',
-'ipblocklist'              => 'Bloği xveneri na renan IP adresepe do maxmareş coxope',
-'blocklink'                => 'bloği qʼvi',
-'unblocklink'              => 'bloği kezdi',
-'change-blocklink'         => 'bloği doktiri',
-'contribslink'             => 'Meşvelape',
-'blocklogpage'             => 'Bloğiş kʼayitʼepe',
-'blocklogentry'            => ', [[$1]] maxmare kododginu, dodginuşi ora: $2 $3',
-'unblocklogentry'          => '$1 maxmareşi bloği kaizdinu',
+'blockip' => 'Maxmares bloği qʼvi',
+'ipboptions' => '2 saatʼi:2 hours,1 ndğa:1 day,3 ndğa:3 days,1 doloni:1 week,2 doloni:2 weeks,1 tuta:1 month,3 tuta:3 months,6 tuta:6 months,1 3ʼana:1 year,pʼanda:infinite',
+'ipblocklist' => 'Bloği xveneri na renan IP adresepe do maxmareş coxope',
+'blocklink' => 'bloği qʼvi',
+'unblocklink' => 'bloği kezdi',
+'change-blocklink' => 'bloği doktiri',
+'contribslink' => 'Meşvelape',
+'blocklogpage' => 'Bloğiş kʼayitʼepe',
+'blocklogentry' => ', [[$1]] maxmare kododginu, dodginuşi ora: $2 $3',
+'unblocklogentry' => '$1 maxmareşi bloği kaizdinu',
 'block-log-flags-nocreate' => 'hesabi okʼidu geinkʼilu',
 
 # Move page
-'movepagetext'     => "Tude na ren formi oxmarute butʼkʼaşi coxo iktirinen. Edo xolo mteli golaxteri kʼayitʼepeti ağani coxos itiren.
+'movepagetext' => "Tude na ren formi oxmarute butʼkʼaşi coxo iktirinen. Edo xolo mteli golaxteri kʼayitʼepeti ağani coxos itiren.
 Mcveşi coxo, ağani coxoşa redirektʼi xali aqʼven.
 Otomatikurot mcveşi stʼatʼiaşa na ixvenen redirektʼepe gaktirinen.
 Am dulya otomatikurot oxvenu va ginonna [[Special:DoubleRedirects|tʼkʼubi]] varna [[Special:BrokenRedirects|tʼaxeri]] na renan redirektʼepe ti-skani kʼala oktiruşi re. Na qʼvare am oktirobate mteli kʼontʼaktʼepe dido kʼai oçalişu ren, amuşen si sorumli re.
@@ -598,90 +607,93 @@ Am ktira, populeri na ren a butʼkʼa şeni pʼatʼi mutxanepe axvenen; mu iqʼv
 *Tude na ren çʼitʼa boksi va ixmarit na.
 
 Am situa3yonepes, butʼkʼa skanişkʼelen otiruşi ren.",
-'movearticle'      => 'Mcveşi coxo:',
-'newtitle'         => 'Ağani coxo:',
-'move-watch'       => 'Am butʼkʼa gatxozi',
-'movepagebtn'      => 'Coxo-muşi doktiri',
-'pagemovedsub'     => 'Coxo iktirinu.',
-'movepage-moved'   => '\'\'\'"$1",  "$2" butʼkʼa muşişa itirinu\'\'\'',
-'articleexists'    => 'Am coxos ar butʼkʼa koren varna na çʼari coxo mtini va ren.
+'movearticle' => 'Mcveşi coxo:',
+'newtitle' => 'Ağani coxo:',
+'move-watch' => 'Am butʼkʼa gatxozi',
+'movepagebtn' => 'Coxo-muşi doktiri',
+'pagemovedsub' => 'Coxo iktirinu.',
+'movepage-moved' => '\'\'\'"$1",  "$2" butʼkʼa muşişa itirinu\'\'\'',
+'articleexists' => 'Am coxos ar butʼkʼa koren varna na çʼari coxo mtini va ren.
 Mu iqʼven başka coxo doçʼari.',
-'talkexists'       => "'''Butʼkʼa dido kʼai itirinu, mara oğarğaluşi butʼkʼa var itirinu çunki na itirinasen coxos zate ar butʼkʼa rtʼu. Mu iqʼven butʼkʼaşi doloçʼareli nç'arape majurani butʼkʼaşa ti-skani kʼala itirini.'''",
-'movedto'          => 'itirinu:',
-'movetalk'         => 'Korenna, "oğarğaluşi" butʼkʼa muşiti mendiği.',
-'movelogpage'      => 'Coxo oktirobaşi kʼayitʼepe',
-'movereason'       => 'Muşen:',
-'revertmove'       => 'komoiği',
+'talkexists' => "'''Butʼkʼa dido kʼai itirinu, mara oğarğaluşi butʼkʼa var itirinu çunki na itirinasen coxos zate ar butʼkʼa rtʼu. Mu iqʼven butʼkʼaşi doloçʼareli nç'arape majurani butʼkʼaşa ti-skani kʼala itirini.'''",
+'movedto' => 'itirinu:',
+'movetalk' => 'Korenna, "oğarğaluşi" butʼkʼa muşiti mendiği.',
+'movelogpage' => 'Coxo oktirobaşi kʼayitʼepe',
+'movereason' => 'Muşen:',
+'revertmove' => 'komoiği',
 
 # Export
 'export' => 'Butʼkʼa ikʼayitʼi',
 
+# Namespace 8 related
+'allmessagesname' => 'Coxo',
+
 # Thumbnails
 'thumbnail-more' => 'Didi qʼvi',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Skani butʼkʼa',
-'tooltip-pt-mytalk'               => 'Mesajiş butʼkʼa',
-'tooltip-pt-preferences'          => 'Skani tercixepe',
-'tooltip-pt-watchlist'            => 'Gotxozu na minon butʼkʼape',
-'tooltip-pt-mycontris'            => 'Skani meşvelapeşi listʼe',
-'tooltip-pt-login'                => 'Ginon na sitʼeşa amaxti, mecburi va re',
-'tooltip-pt-logout'               => 'Siteşen Kogamaxti',
-'tooltip-ca-talk'                 => 'Butʼkʼaş doloxe na içʼaren çʼarape şeni mutxanepe mi3ʼvit',
-'tooltip-ca-edit'                 => 'Am butʼkʼa kodogaktiren. Mu iqʼven! ipti "Evvelişen i3ʼkʼedi" tʼuşi ixmari do na çʼari çʼara ikʼontʼroli, ukʼule ikʼayitʼi.',
-'tooltip-ca-addsection'           => 'Ağani burme dokʼidi.',
-'tooltip-ca-viewsource'           => 'Am butʼkʼa içven. Xvala odudeş kʼodi gaz*iren. Doloxe muşi va gaktirinen.',
-'tooltip-ca-history'              => 'Am butʼkʼaşi golaxteri versiyonepe',
-'tooltip-ca-protect'              => 'Am butʼkʼa içvi',
-'tooltip-ca-delete'               => 'Am sayfa jili',
-'tooltip-ca-move'                 => 'Butʼkʼaşi coxo doktiri',
-'tooltip-ca-watch'                => 'Am butʼkʼas gatxozi.',
-'tooltip-ca-unwatch'              => 'Skani gotxozu listʼeşen jili am butʼkʼa',
-'tooltip-search'                  => '{{SITENAME}}-iş doloxe mgori',
-'tooltip-search-go'               => 'Eger korenna, am coxos na uğun ar butʼkʼaşa idi',
-'tooltip-search-fulltext'         => 'Am nçʼara şeni butʼkʼape mgori',
-'tooltip-n-mainpage'              => 'Dudi butʼkʼaşa idi',
-'tooltip-n-mainpage-description'  => 'Dudi butʼkʼaşa idi',
-'tooltip-n-portal'                => 'Proje şeni, şeyepe so gaz*iren, mu gaxvenen',
-'tooltip-n-currentevents'         => 'Ağani oğodape şeni çodinaşi çkinape',
-'tooltip-n-recentchanges'         => 'Vikʼis na ixvenu sonni oktirobapeşi listʼe.',
-'tooltip-n-randompage'            => 'Na var giçkin a butʼkʼaşa idi.',
-'tooltip-n-help'                  => 'Meşvelaş yezdimu şeni',
-'tooltip-t-whatlinkshere'         => 'Am butʼkʼaşa kʼontʼaktʼi na ikips majurani vikʼiş butʼkʼapeşi listʼe',
-'tooltip-t-recentchangeslinked'   => 'Am butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼapes, çodinaşi oktirobape',
-'tooltip-feed-rss'                => 'Am butʼkʼa şeni RSS-iş feedi',
-'tooltip-feed-atom'               => 'Am butʼkʼa şeni atʼom-iş feedi',
-'tooltip-t-contributions'         => 'Maxmareşi meşvela listʼe kozʼiri',
-'tooltip-t-emailuser'             => 'Maxmareşa e-maili oncğoni',
-'tooltip-t-upload'                => 'Dosyape doloxe kamaxvi',
-'tooltip-t-specialpages'          => 'Mteli doxmeli butʼkʼapeşi listʼe ko3ʼiri',
-'tooltip-t-print'                 => 'Am butʼkʼaşi kartʼalişa çʼareli na ren versiyoni',
-'tooltip-t-permalink'             => 'Am butʼkʼaşi am versiyoni muşis kʼarta ora kʼontʼaktʼi iqʼvi.',
-'tooltip-ca-nstab-main'           => 'Butʼkʼa ko3ʼiri',
-'tooltip-ca-nstab-user'           => 'Maxmareşi butʼkʼa ko3ʼiri',
-'tooltip-ca-nstab-special'        => 'Aya doxmeli butʼkʼa ren, emuşeni ak mutu va gaktirinen.',
-'tooltip-ca-nstab-project'        => 'Pʼrojeşi butʼkʼa ko3ʼiri',
-'tooltip-ca-nstab-image'          => 'Dosyaşi butʼkʼa ko3ʼiri',
-'tooltip-ca-nstab-template'       => 'Şabloni ko3ʼiri',
-'tooltip-ca-nstab-category'       => 'Kʼatʼegorişi butʼkʼa ko3ʼiri',
-'tooltip-minoredit'               => 'Aşoten "Çʼitʼa oktiroba" gaxvenen',
-'tooltip-save'                    => 'Oktirobape ikʼayitʼi',
-'tooltip-preview'                 => 'Evvelişen i3ʼkʼedi; ipti am fonkʼsioni ixmari, oktirobape kʼontʼroli qʼvi do ukʼule ikʼayitʼi!',
-'tooltip-diff'                    => 'Tekstʼişa na qʼvi oktirobape o3ʼiraps.',
+'tooltip-pt-userpage' => 'Skani butʼkʼa',
+'tooltip-pt-mytalk' => 'Mesajiş butʼkʼa',
+'tooltip-pt-preferences' => 'Skani tercixepe',
+'tooltip-pt-watchlist' => 'Gotxozu na minon butʼkʼape',
+'tooltip-pt-mycontris' => 'Skani meşvelapeşi listʼe',
+'tooltip-pt-login' => 'Ginon na sitʼeşa amaxti, mecburi va re',
+'tooltip-pt-logout' => 'Siteşen Kogamaxti',
+'tooltip-ca-talk' => 'Butʼkʼaş doloxe na içʼaren çʼarape şeni mutxanepe mi3ʼvit',
+'tooltip-ca-edit' => 'Am butʼkʼa kodogaktiren. Mu iqʼven! ipti "Evvelişen i3ʼkʼedi" tʼuşi ixmari do na çʼari çʼara ikʼontʼroli, ukʼule ikʼayitʼi.',
+'tooltip-ca-addsection' => 'Ağani burme dokʼidi.',
+'tooltip-ca-viewsource' => 'Am butʼkʼa içven. Xvala odudeş kʼodi gaz*iren. Doloxe muşi va gaktirinen.',
+'tooltip-ca-history' => 'Am butʼkʼaşi golaxteri versiyonepe',
+'tooltip-ca-protect' => 'Am butʼkʼa içvi',
+'tooltip-ca-delete' => 'Am sayfa jili',
+'tooltip-ca-move' => 'Butʼkʼaşi coxo doktiri',
+'tooltip-ca-watch' => 'Am butʼkʼas gatxozi.',
+'tooltip-ca-unwatch' => 'Skani gotxozu listʼeşen jili am butʼkʼa',
+'tooltip-search' => '{{SITENAME}}-iş doloxe mgori',
+'tooltip-search-go' => 'Eger korenna, am coxos na uğun ar butʼkʼaşa idi',
+'tooltip-search-fulltext' => 'Am nçʼara şeni butʼkʼape mgori',
+'tooltip-n-mainpage' => 'Dudi butʼkʼaşa idi',
+'tooltip-n-mainpage-description' => 'Dudi butʼkʼaşa idi',
+'tooltip-n-portal' => 'Proje şeni, şeyepe so gaz*iren, mu gaxvenen',
+'tooltip-n-currentevents' => 'Ağani oğodape şeni çodinaşi çkinape',
+'tooltip-n-recentchanges' => 'Vikʼis na ixvenu sonni oktirobapeşi listʼe.',
+'tooltip-n-randompage' => 'Na var giçkin a butʼkʼaşa idi.',
+'tooltip-n-help' => 'Meşvelaş yezdimu şeni',
+'tooltip-t-whatlinkshere' => 'Am butʼkʼaşa kʼontʼaktʼi na ikips majurani vikʼiş butʼkʼapeşi listʼe',
+'tooltip-t-recentchangeslinked' => 'Am butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼapes, çodinaşi oktirobape',
+'tooltip-feed-rss' => 'Am butʼkʼa şeni RSS-iş feedi',
+'tooltip-feed-atom' => 'Am butʼkʼa şeni atʼom-iş feedi',
+'tooltip-t-contributions' => 'Maxmareşi meşvela listʼe kozʼiri',
+'tooltip-t-emailuser' => 'Maxmareşa e-maili oncğoni',
+'tooltip-t-upload' => 'Dosyape doloxe kamaxvi',
+'tooltip-t-specialpages' => 'Mteli doxmeli butʼkʼapeşi listʼe ko3ʼiri',
+'tooltip-t-print' => 'Am butʼkʼaşi kartʼalişa çʼareli na ren versiyoni',
+'tooltip-t-permalink' => 'Am butʼkʼaşi am versiyoni muşis kʼarta ora kʼontʼaktʼi iqʼvi.',
+'tooltip-ca-nstab-main' => 'Butʼkʼa ko3ʼiri',
+'tooltip-ca-nstab-user' => 'Maxmareşi butʼkʼa ko3ʼiri',
+'tooltip-ca-nstab-special' => 'Aya doxmeli butʼkʼa ren, emuşeni ak mutu va gaktirinen.',
+'tooltip-ca-nstab-project' => 'Pʼrojeşi butʼkʼa ko3ʼiri',
+'tooltip-ca-nstab-image' => 'Dosyaşi butʼkʼa ko3ʼiri',
+'tooltip-ca-nstab-template' => 'Şabloni ko3ʼiri',
+'tooltip-ca-nstab-category' => 'Kʼatʼegorişi butʼkʼa ko3ʼiri',
+'tooltip-minoredit' => 'Aşoten "Çʼitʼa oktiroba" gaxvenen',
+'tooltip-save' => 'Oktirobape ikʼayitʼi',
+'tooltip-preview' => 'Evvelişen i3ʼkʼedi; ipti am fonkʼsioni ixmari, oktirobape kʼontʼroli qʼvi do ukʼule ikʼayitʼi!',
+'tooltip-diff' => 'Tekstʼişa na qʼvi oktirobape o3ʼiraps.',
 'tooltip-compareselectedversions' => '3xuneri na ren jur versiyonişi oşkendas na renan farkʼepe ko3ʼiri.',
-'tooltip-watch'                   => 'Am butʼkʼa gatxozi',
-'tooltip-rollback'                => '"Ukʼuni" fonkʼsionik, ar gebaz*gute, am butʼkʼas na nuşvelu maxmareşi oktirobape ipʼtʼali ikips',
-'tooltip-undo'                    => '"Ukʼuni" am fonkʼsionik, oktirobape ipʼtʼali ikips do aşoten oktirobaşi formi, "Evvelişen i3ʼkʼedi" modis guin3ʼkʼen.
+'tooltip-watch' => 'Am butʼkʼa gatxozi',
+'tooltip-rollback' => '"Ukʼuni" fonkʼsionik, ar gebaz*gute, am butʼkʼas na nuşvelu maxmareşi oktirobape ipʼtʼali ikips',
+'tooltip-undo' => '"Ukʼuni" am fonkʼsionik, oktirobape ipʼtʼali ikips do aşoten oktirobaşi formi, "Evvelişen i3ʼkʼedi" modis guin3ʼkʼen.
 "Mkʼule nçʼarate" fonkʼsioni şeni ar sebebi okʼum3xus izni meçaps',
 
 # Browsing diffs
 'previousdiff' => '← İptineri versiyoni kʼala na ren farkʼi',
-'nextdiff'     => 'Ukʼaçxineri versiyoni kʼala na ren farkʼi →',
+'nextdiff' => 'Ukʼaçxineri versiyoni kʼala na ren farkʼi →',
 
 # Media information
 'file-info-size' => '$1 × $2 pikseli, dosyaşi didinoba: $3, MIME type: $4',
-'file-nohires'   => 'Çkva kʼai ozʼiramuşis na uğun versiyoni va ren.',
-'svg-long-desc'  => 'SVG dosya, coxoten $1 × $2 pʼikʼseli, dosyaşi didinoba: $3',
+'file-nohires' => 'Çkva kʼai ozʼiramuşis na uğun versiyoni va ren.',
+'svg-long-desc' => 'SVG dosya, coxoten $1 × $2 pʼikʼseli, dosyaşi didinoba: $3',
 'show-big-image' => 'Tam ozʼiramuşi',
 
 # Bad image list
@@ -692,11 +704,11 @@ Satʼirişi maartani kʼontʼaktʼi, pʼatʼi dosyaşa na ulun ar kʼontʼaktʼi
 Ukʼaçxe na mulunan kʼontʼaktʼepe istʼisna oqʼopinot kʼabuli ixvenen. Mesela: dosya, butʼkʼas, satʼiriş doloxe iz*iren.',
 
 # Metadata
-'metadata'          => 'Metadata',
-'metadata-help'     => 'Am dosyas, suretişi mangana varna mao3xoneşkʼelen kʼatineri na ren okʼum3vale çkinape koren. Eger dosyaşi originali xalişa modifiye na iqʼu na, namtini çkinape, ağani oktiroba şeni mcveşi doskideri iqʼopen.',
-'metadata-expand'   => 'Detayepe ko3ʼiri',
+'metadata' => 'Metadata',
+'metadata-help' => 'Am dosyas, suretişi mangana varna mao3xoneşkʼelen kʼatineri na ren okʼum3vale çkinape koren. Eger dosyaşi originali xalişa modifiye na iqʼu na, namtini çkinape, ağani oktiroba şeni mcveşi doskideri iqʼopen.',
+'metadata-expand' => 'Detayepe ko3ʼiri',
 'metadata-collapse' => 'Detayepe doşinaxi',
-'metadata-fields'   => 'Am butʼkʼas na ilistʼelinen EXIF metadataş burmepe, resimi ozʼiramuşi butʼkʼapes metadata tʼablo na ğuru oras ixmarinen. Majuranepeti maartani oqʼopinot işinaxasen.
+'metadata-fields' => 'Am butʼkʼas na ilistʼelinen EXIF metadataş burmepe, resimi ozʼiramuşi butʼkʼapes metadata tʼablo na ğuru oras ixmarinen. Majuranepeti maartani oqʼopinot işinaxasen.
 * make
 * model
 * datetimeoriginal
@@ -712,18 +724,18 @@ Ukʼaçxe na mulunan kʼontʼaktʼepe istʼisna oqʼopinot kʼabuli ixvenen. Mes
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'Dosyas, kʼompʼuteris na renan pʼrogramepe kʼala oktirobape doqʼvi.',
+'edit-externally' => 'Dosyas, kʼompʼuteris na renan pʼrogramepe kʼala oktirobape doqʼvi.',
 'edit-externally-help' => '(Dido çkina şeni metʼas na renan [//www.mediawiki.org/wiki/Manual:External_editors galeni xvenaş tercihepe] (İngilisuri) butʼkʼa muşis o3ʼkʼedit)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'mteli',
 'namespacesall' => 'mteli',
-'monthsall'     => 'mteli',
+'monthsall' => 'mteli',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Am tema kʼala alakʼali na renan oktirobape ko3ʼiri',
 'watchlisttools-edit' => 'Gotxozu listʼe koz*iri do doktiri',
-'watchlisttools-raw'  => 'Kʼobo gotxozu listʼe doktiri',
+'watchlisttools-raw' => 'Kʼobo gotxozu listʼe doktiri',
 
 # Special:SpecialPages
 'specialpages' => 'Doxmeli butʼkʼape',
index c357bbf..aae0d93 100644 (file)
@@ -17,6 +17,7 @@
  * @author Meno25
  * @author Priyanka.rachna.jha
  * @author Rajesh
+ * @author Reedy
  * @author Umeshberma
  * @author Vinitutpal
  */
@@ -336,7 +337,7 @@ $1',
 अहाँ सार्वत्रिक विभव संकेतक गलत टंकण केने हएब, वा कोनो गलत लिंकक पाछाँ गेल हएब।
 ई {{अन्तर्जाल}} प्रयोक्ता द्वारा प्रयुक्त तंत्रांशमे स्थित कोनो दोषक संकेत सेहो कऽ सकैए।',
 'nosuchspecialpage' => 'एहेन कोनो विशेष पन्ना नै',
-'nospecialpagetext' => '<गाढ़> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </गाढ़>
+'nospecialpagetext' => '<strong> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </strong>
 मान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।',
 
 # General errors
@@ -967,7 +968,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 
 # Diffs
 'history-title' => '"$1" क संशोधन इतिहास',
-'difference' => '(नव संशोधन सभक बीच अन्तर)',
 'difference-multipage' => '(पन्ना सभक बीचमे अन्तर)',
 'lineno' => 'पंक्त्ति $1:',
 'compareselectedversions' => 'चयन कएल संशोधन सभक तुलना करू',
@@ -1333,7 +1333,7 @@ $3 द्वारा देल कारण अछि ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|परिवर्त्तन|परिवर्त्तन}}',
 'recentchanges' => 'लगक परिवर्तन सभ',
 'recentchanges-legend' => 'नव परिवर्तन सभक विकल्प सभ',
-'recentchangestext' => 'ऐ पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।',
+'recentchanges-summary' => 'ऐ पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।',
 'recentchanges-feed-description' => 'ऐ सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकू',
 'recentchanges-label-newpage' => 'ई सम्पादन एकटा नव पन्नाक निर्माण केलक।',
 'recentchanges-label-minor' => 'ई एकटा लघु सम्पादन छी',
@@ -2740,7 +2740,7 @@ $1',
 'file-info' => 'संचिका आकार: $1, माइम प्रकार: $2',
 'file-info-size' => '$1 × $2 चित्राणु, फाइल आकार: $3, माइम प्रकार: $4',
 'file-info-size-pages' => '$1 × $2 चित्रकण, संचिका आकार : $3, माइम प्रकार: $4, $5 {{PLURAL:$5|पन्ना|पन्ना सभ}}',
-'file-nohires' => '<छोट>ऐसँ बेशी आनन्तर्य उपलब्ध नै अछि।</छोट>',
+'file-nohires' => 'ऐसँ बेशी आनन्तर्य उपलब्ध नै अछि।',
 'svg-long-desc' => 'एस.वी.जी. फाइल, मामूली रूपमे $1 × $2 चित्रकण, फाइलक आकार: $3',
 'show-big-image' => 'पूर्ण आनन्तर्य',
 'show-big-image-preview' => 'ऐ पूर्वदृश्यक आकार: $1.',
index 858a052..1e462df 100644 (file)
@@ -836,7 +836,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
 
 # Diffs
 'history-title' => 'Sajarah revisi sekang "$1"',
-'difference' => '(Prabédan antarrevisi)',
 'difference-multipage' => '(Prabedan antarkaca)',
 'lineno' => 'Baris $1:',
 'compareselectedversions' => 'Bandingna revisi kapilih',
@@ -1184,7 +1183,7 @@ Aja kuatir, alamat imele Rika ora ditidokna dong pangganggo sejen ngontak Rika.'
 'nchanges' => '$1 {{PLURAL:$1|pangowahan|owah-owahan}}',
 'recentchanges' => 'Pengobahan',
 'recentchanges-legend' => 'Opsi owahan anyar',
-'recentchangestext' => 'Runutna owah-owahan anyare wiki nang kaca kiye.',
+'recentchanges-summary' => 'Runutna owah-owahan anyare wiki nang kaca kiye.',
 'recentchanges-feed-description' => "Urutna owah-owahan anyare wiki nang ''feed'' kiye.",
 'recentchanges-label-newpage' => 'Suntingan kiye gawé kaca anyar',
 'recentchanges-label-minor' => 'Kiye suntingan cilik',
index dc64723..e25ebbd 100644 (file)
@@ -889,7 +889,6 @@ $3 макссь туфталсь - ''$2''",
 
 # Diffs
 'history-title' => '"$1"-нь верзиетнень историясна',
-'difference' => '(Явомась верзиетнень ёткова)',
 'difference-multipage' => 'Явомась лопаланготнень ёткова',
 'lineno' => 'Кикссь $1:',
 'compareselectedversions' => 'Путомс кочкаф верзиетнень ваксс',
@@ -1181,7 +1180,7 @@ $3 макссь туфталсь - ''$2''",
 'nchanges' => '$1 {{PLURAL:$1|полафнема|полафнемат}}',
 'recentchanges' => 'Мекольце полафнемат',
 'recentchanges-legend' => 'Мекольце полафнематнень арафнемасна',
-'recentchangestext' => 'Ваномс сяда мекольце Викиса полафнематнень мельге тя лопаса.',
+'recentchanges-summary' => 'Ваномс сяда мекольце Викиса полафнематнень мельге тя лопаса.',
 'recentchanges-feed-description' => 'Ваномс сяда мекольце Викиса полафнематнень мельге тя шудемаса.',
 'rcnote' => "Ала {{PLURAL:$1|мекольце '''1''' полафнема|мекольце '''$1''' полафнемат}} '''$2''' ётай  {{PLURAL:$2|шис|шис}}, $5, $4ста.",
 'rcnotefrom' => "Ала няфтезь полафнематне '''$2'''-ста ('''$1'''-с).",
index ca44e58..56660e9 100644 (file)
@@ -110,7 +110,7 @@ $namespaceAliases = array(
        'Utilisateur' => NS_USER,
        'Discussion_Utilisateur' => NS_USER_TALK,
        'Discussion_$1' => NS_PROJECT_TALK,
-       'Discussion_Image' => NS_IMAGE_TALK,
+       'Discussion_Image' => NS_FILE_TALK,
        'Discussion_MediaWiki' => NS_MEDIAWIKI_TALK,
        'Modèle' => NS_TEMPLATE,
        'Discussion_Modèle' => NS_TEMPLATE_TALK,
@@ -896,6 +896,7 @@ Nilaina io tsy fanekena io mba tsy hikatso ilay pejy.
 Misy io olana io rehefa mamppiasa serveur mandataire tsy manana anarana sy manan-olana eo amin'ny tranonkala ianao.",
 'edit_form_incomplete' => "'''Misy tsy tonga tany amin'ny lohamilina ny singan'ity pejy fenoina ity. Azonao ampiana ny mpandika hafa amin'ny famoronana ny fanazavana ity pejy ity.",
 'editing' => "Manova an'i $1",
+'creating' => "Famoronana an'i $1",
 'editingsection' => 'Fanovana $1 (fizarana)',
 'editingcomment' => 'Fanovana $1 (fizarana vaovao)',
 'editconflict' => 'Fanovana mifandona : $1',
@@ -1149,7 +1150,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 
 # Diffs
 'history-title' => "Tantara ny endrik'i « $1 »",
-'difference' => "(Fahasamihafan'ny pejy)",
 'difference-multipage' => "(Fahasamihafan'ny pejy)",
 'lineno' => 'Andalana $1:',
 'compareselectedversions' => 'Ampitahao ireo version voafidy',
@@ -1498,7 +1498,7 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'nchanges' => '{{PLURAL:$1|fanovana|fanovana}} $1',
 'recentchanges' => 'Fanovana farany',
 'recentchanges-legend' => 'Safidy ny fanovàna farany',
-'recentchangestext' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
+'recentchanges-summary' => "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
 'recentchanges-feed-description' => "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
 'recentchanges-label-newpage' => 'Namorona pejy vaovao io fanovana io',
 'recentchanges-label-minor' => 'Kely fotsiny ity fanovana ity',
@@ -1728,6 +1728,7 @@ Tsindrio eo amin'ny lohan-tsanganana raha hanova ny laharam-pisehoana.",
 'listfiles_search_for' => 'Hitady anarana media :',
 'imgfile' => 'rakitra',
 'listfiles' => "Lisitran'ny rakitra",
+'listfiles_thumb' => 'Sary nakelezina',
 'listfiles_date' => 'Daty',
 'listfiles_name' => 'Anarana',
 'listfiles_user' => 'Mpikambana',
@@ -1868,6 +1869,8 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'nmembers' => '{{PLURAL:$1|mpikambana|mpikambana}} $1',
 'nrevisions' => '{{PLURAL:$1|fanovana|fanovana}} $1',
 'nviews' => '{{PLURAL:}}Tsidika $1',
+'nimagelinks' => "Ampiasain'ny pejy miisa{{PLURAL:}} $1",
+'ntransclusions' => "Ampiasaina eo amin'ny pejy miisa $1 {{PLURAL:}}",
 'specialpage-empty' => 'Tsy misy valiny ho aseho.',
 'lonelypages' => 'Pejy manirery',
 'lonelypagestext' => "Ireo pejy ireo dia tsy voarohy sy tsy ampiasain'ny pejin' ity wiki ity.",
@@ -2283,6 +2286,8 @@ Vakio ny [[Special:Log/delete|laogim-pamafana]] ho an'ny lisitry ny famafana sy
 'undelete-filename-mismatch' => "Tsy afaka averina ny santiônan'ilay rakitra tamin'ny $1 : tsy mifanaraka ny anaran-drakitra.",
 'undelete-bad-store-key' => "Tsy mety averina ny santiônan'ilay rakitra tamin'ny $1 : mbola tsy tao ilay rakitra talohan'ny famafana.",
 'undelete-cleanup-error' => 'Tsy fetezana teo am-pamafana ilay rakitra an-tahiry tsy miasa « $1 ».',
+'undelete-missing-filearchive' => "Tsy afaka atao ny mamerina ilay rakitra tahiry miaraka amin'ny ID $1 satria tsy ao amin'ny banky angona izy io.
+Mety efa naverina angamba izy io.",
 'undelete-error-short' => 'Tsi-fetezana teo am-pamerenana ilay rakitra : $1',
 'undelete-error-long' => 'Nisy tsi-fetezana nitranga teo am-pamerenana ilay rakitra :
 
@@ -2444,6 +2449,8 @@ ny lisitry ny fisakanana sy fandrarana na tanteraka misy ankehitriny.",
 'ipb-otherblocks-header' => '{{PLURAL:$1}}sakana hafa',
 'ipb_cant_unblock' => 'Tsy fetezana : Marik ny fanakanana $1 tsy hita.
 Mety efa natao angamba ny fanalana sakana.',
+'ipb_blocked_as_range' => "Hadisoana : tsy nosakanana manokana ny adiresy IP $1 ka noho izany tsy afaka alàna ny sakany.
+Ao amin'ny laharana $2 izay afaka alàna sakana anefa izy io.",
 'ip_range_invalid' => 'Tsy mety io IP io.',
 'ip_range_toolarge' => 'Ny fanidiana laharana IP ngeza nohonny /$1 dia tsy azo atao.',
 'blockme' => 'Sakano ahy',
@@ -2534,6 +2541,7 @@ mifanaraka amin'ilay anarana vaovao. Azafady mba atambaro izay pejin-dresaka iza
 'movepage-page-exists' => 'Efa misy ny pejy $1 ary tsy afaka soloina ho azy.',
 'movepage-page-moved' => 'Voaova anarana lasa $2 ilay pejy $1.',
 'movepage-page-unmoved' => 'Tsy afaka novaina anarana $2 ilay pejy $1.',
+'movepage-max-pages' => 'Efa tratra ny isam-pejy farafahabetsany izay azo ovaina anarana (pejy $1){{PLURAL:}}, ka tsy ho voaova anarana ho azy intsony ny pejy hafa.',
 'movelogpage' => 'Ny laogim-panisahana',
 'movelogpagetext' => 'Lisitry ny pejy nafindra toerana.',
 'movesubpage' => 'Zana-pejy{{PLURAL:$1||}} $1',
@@ -2554,6 +2562,7 @@ Efa misy ny lahatsoratra hoe "[[:$1]]". Irinao ve ny hamafana azy mba hahafahana
 'immobile-source-page' => 'Tsy azo ovaina anarana ity pejy ity.',
 'immobile-target-page' => "Tsy afaka ovaina anarana makany amin'io lohateny io ilay pejy.",
 'imagenocrossnamespace' => 'Tsy mety ovaina anarana makany amina anaran-tsehatra hafa afatsy rakitra ihany ny rakitra.',
+'nonfile-cannot-move-to-file' => "Tsy afaka manova anaran'ny pejy tsy rakitra any amin'ny anaran-tsehatry ny rakitra.",
 'imagetypemismatch' => "Tsy mifanaraka amin'ny karazany ny fanitaran'ity rakitra ity.",
 'imageinvalidfilename' => 'Diso ny anaran-drakitra tanjona',
 'fix-double-redirects' => "Hanao update ny fihodinana makany amin'ny lohateny fotony",
@@ -2880,6 +2889,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-copyright' => 'Mpanana ilay copyright',
 'exif-exifversion' => 'Santiôna EXIF',
 'exif-flashpixversion' => 'Santiôna FlashPix',
+'exif-colorspace' => 'Valan-doko',
 'exif-pixelydimension' => 'Haavon-tsary ekena',
 'exif-pixelxdimension' => 'Halalan-tsary ekena',
 'exif-usercomment' => 'Diniky ny mpikambana',
@@ -2887,8 +2897,10 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-datetimeoriginal' => 'Daty fangalana niaviana',
 'exif-datetimedigitized' => 'Daty nanaovana numerisation',
 'exif-subsectime' => 'Daty nanovana',
+'exif-exposuretime' => 'Fitaona famakiana',
 'exif-exposuretime-format' => '$1 s ($2 s)',
 'exif-fnumber' => 'Isa F',
+'exif-exposureprogram' => 'Fomba famakiana',
 'exif-isospeedratings' => 'ISO',
 'exif-aperturevalue' => 'Sanasana',
 'exif-lightsource' => 'Loharanon-kazavana',
@@ -3170,6 +3182,8 @@ Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindr
 'htmlform-selectorother-other' => 'Hafa',
 
 # New logging system
+'logentry-delete-delete' => "nofafan'i $1 ny pejy $3",
+'logentry-suppress-delete' => "nofafan'i $1 ny pejy $3",
 'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra",
 'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra",
 'newuserlog-byemail' => 'tenimiafina nalefa imailaka',
index 0b40d7a..42ca8c7 100644 (file)
@@ -483,7 +483,6 @@ $messages = array(
 
 # Diffs
 'history-title' => '$1лан тӱрлык эртымгорно',
-'difference' => '(Тӱрлык-влакын ойыртемышт)',
 'lineno' => '$1 корно:',
 'compareselectedversions' => 'Ойырымо версий-влакым таҥастараш',
 'editundo' => 'чараш',
@@ -602,7 +601,7 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|тӧрлатымаш|тӧрлатымаш-влак}}',
 'recentchanges' => 'Пытартыш тӧрлатымаш-влак',
 'recentchanges-legend' => 'Пытартыш тӧрлатымаш-влакын келыштарымашышт',
-'recentchangestext' => 'Тиде лаштыкыште пытартыш тӧрлатымашым шекланаш.',
+'recentchanges-summary' => 'Тиде лаштыкыште пытартыш тӧрлатымашым шекланаш.',
 'recentchanges-feed-description' => 'Тиде кылыште пытартыш тӧрлатымашым шекланаш.',
 'recentchanges-label-newpage' => 'Тиде тӧрлатымаш дене у лаштыкым ыштеныт',
 'recentchanges-label-minor' => 'Тиде изирак тӧрлатымаш',
index ffbfdef..a71605a 100644 (file)
@@ -771,7 +771,6 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 
 # Diffs
 'history-title' => 'Riwayat revisi dari "$1"',
-'difference' => '(Parbedaan antaro revisi)',
 'lineno' => 'Barih $1:',
 'compareselectedversions' => 'Bandingkan revisi pilihan',
 'editundo' => 'batalkan',
@@ -851,7 +850,7 @@ Alamaik surek elektronik awak ang tu indak kan katahuan dek urang lain nan mangh
 'nchanges' => '$1 {{PLURAL:$1|parubahan|parubahan}}',
 'recentchanges' => 'Parubahan baru',
 'recentchanges-legend' => 'Pilihan parubahan baru',
-'recentchangestext' => 'Manjajak parubahan terbaru dalam wiki di laman ko.',
+'recentchanges-summary' => 'Manjajak parubahan terbaru dalam wiki di laman ko.',
 'recentchanges-feed-description' => 'Temukan parubahan baru dalam umpan wiki ko',
 'recentchanges-label-newpage' => 'Suntiang ko mambuek laman baru',
 'recentchanges-label-minor' => 'Iko di suntiang saketek',
index ceb3061..402ae7f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Macedonian (Ð\9cакедонски)
+/** Macedonian (македонски)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -122,6 +122,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'ПатДоПодатотека' ),
        'Import'                    => array( 'Увоз' ),
        'Invalidateemail'           => array( 'ПогрешнаЕпошта' ),
+       'JavaScriptTest'            => array( 'ПробаНаJavaСкрипта' ),
        'BlockList'                 => array( 'СписокНаБлокираниIP' ),
        'LinkSearch'                => array( 'ПребарајВрска' ),
        'Listadmins'                => array( 'СписокНаАдминистратори' ),
@@ -190,7 +191,7 @@ $specialPageAliases = array(
        'Wantedtemplates'           => array( 'ПотребниШаблони' ),
        'Watchlist'                 => array( 'СписокНаНабљудувања' ),
        'Whatlinkshere'             => array( 'ШтоВодиОвде' ),
-       'Withoutinterwiki'          => array( 'Ð\91езÐ\98нÑ\82еÑ\80вики' ),
+       'Withoutinterwiki'          => array( 'Ð\91езÐ\9cеÑ\93Ñ\83вики' ),
 );
 
 $magicWords = array(
@@ -333,7 +334,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Скриј испатролирани уредувања во скорешните промени',
 'tog-newpageshidepatrolled' => 'Скриј испатролирани страници од списокот на нови страници',
 'tog-extendwatchlist' => 'Прошири го список на набљудувања за приказ на сите промени, не само скорешните',
-'tog-usenewrc' => 'Ð\9aоÑ\80иÑ\81Ñ\82и Ð¿Ð¾Ð´Ð¾Ð±Ñ\80ени скорешни промени (бара JavaScript)',
+'tog-usenewrc' => 'Ð\9fÑ\80омени Ð²Ð¾ Ð³Ñ\80Ñ\83пи Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ð²Ð¾ Ñ\81пиÑ\81окоÑ\82 Ð½Ð° скорешни промени (бара JavaScript)',
 'tog-numberheadings' => 'Авто нумерирање на заглавијата',
 'tog-showtoolbar' => 'Прикажи алатник за уредување (JavaScript)',
 'tog-editondblclick' => 'Уредување на страници при двојно кликнување (JavaScript)',
@@ -372,7 +373,7 @@ $messages = array(
 'tog-diffonly' => 'Не ја покажувај содржината на страницата под разликите',
 'tog-showhiddencats' => 'Прикажи скриени категории',
 'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
-'tog-norollbackdiff' => 'Ð\98зоÑ\81Ñ\82ави Ñ\98а Ñ\80азликаÑ\82а Ð¿Ð¾ Ð¸Ð·Ð²Ñ\80Ñ\88ено Ð²Ñ\80аÑ\9cање',
+'tog-norollbackdiff' => 'Ð\98зоÑ\81Ñ\82ави Ñ\98а Ñ\80азликаÑ\82а Ð¿Ð¾ Ð¸Ð·Ð²Ñ\80Ñ\88ено Ð¾Ñ\82повикÑ\83вање',
 
 'underline-always' => 'Секогаш',
 'underline-never' => 'Никогаш',
@@ -691,7 +692,8 @@ $1',
 Можеби некој друг веќе ја избришал.',
 'cannotdelete-title' => 'Не можам да ја избришам страницата „$1“',
 'badtitle' => 'Лош наслов',
-'badtitletext' => 'Бараниот наслов е грешен, празен или погрешно поврзан меѓујазичен или интер-вики наслов. Може да содржи еден или повеќе знаци што не можат да се користат во наслови.',
+'badtitletext' => 'Бараниот наслов е грешен, празен или неисправно поврзан меѓујазичен или меѓувики наслов. 
+Може да содржи недопуштени знаци.',
 'perfcached' => 'Следните податоци се кеширани и може да не се тековни. Во кешот {{PLURAL:$1|е достапен највеќе еден резултат|се достапни највеќе $1 резултати}}.',
 'perfcachedts' => 'Следните податоци се кеширани, последен пат подновени на $1. Во кешот {{PLURAL:$4|е достапен највеќе еден резултат|се достапни највеќе $4 резултати}}.',
 'querypage-no-updates' => 'Подновите на оваа страница моментално се оневозможени.
@@ -723,6 +725,10 @@ $2',
 'filereadonlyerror' => "Не можам да ја изменам податотеката „$1“ бидејќи складиштето „$2“ е во незаписен режим.
        
 Администраторот што ја заклучи го понуди следново образложение: „''$3''“.",
+'invalidtitle-knownnamespace' => 'Неважечки наслов со именски простор „$2“ и текст „$3“',
+'invalidtitle-unknownnamespace' => 'Неважечки наслов со именски простор бр. $1 и текст „$2“',
+'exception-nologin' => 'Не сте најавени',
+'exception-nologin-text' => 'Оваа страница или постапка бара да сте најавени на викито.',
 
 # Virus scanner
 'virus-badscanner' => "Лоша поставка: непознат проверувач на вируси: ''$1''",
@@ -972,7 +978,7 @@ $2
 
 Вашата IP-адреса е $3, a ID на блокирањеto е $5.
 Ве молиме наведете ги овие подробности доколку реагирате на блокирањето.",
-'blockednoreason' => 'не Ðµ Ð´Ð°Ð´ÐµÐ½Ð¾ Ð¾Ð±Ñ\80азложение',
+'blockednoreason' => 'не Ðµ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð° Ð¿Ñ\80иÑ\87ина',
 'whitelistedittext' => 'Мора да сте $1 за да уредувате страници.',
 'confirmedittext' => 'Морате да ја потврдите вашата е-поштенска адреса пред да уредувате страници.
 Поставете ја и валидирајте ја вашата е-поштенска адреса преку вашите [[Special:Preferences|нагодувања]].',
@@ -1024,7 +1030,8 @@ $2
 'updated' => '(Подновено)',
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте предвид дека ова е само преглед.'''
-Вашите промени сè уште не се зачувани! [[#editform|→ Продолжете со уредување]]",
+Вашите промени сè уште не се зачувани!",
+'continue-editing' => 'Продолжете со уредување',
 'previewconflict' => 'Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.',
 'session_fail_preview' => "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''
 Обидете се повторно.
@@ -1043,7 +1050,7 @@ $2
 'creating' => 'Создавање на $1',
 'editingsection' => 'Уредување на $1 (пасус)',
 'editingcomment' => 'Уредување на $1 (ново заглавие)',
-'editconflict' => 'Ð\9aонÑ\84ликÑ\82ни уредувања: $1',
+'editconflict' => 'СпÑ\80оÑ\82иÑ\81Ñ\82авени уредувања: $1',
 'explainconflict' => "Некој друг ја променил страницата откако почнавте да ја уредувате.
 Горниот дел за текст ја содржи страницата како што сега постои.
 Вашите промени се прикажани во долниот дел.
@@ -1095,7 +1102,7 @@ $2
 'recreate-moveddeleted-warn' => "Внимание: Повторно создавате страница што претходно била бришена.'''
 
 Размислете дали е правилно да продолжите со уредување на оваа страница.
-Подолу е прикажан дневникот на бришења и преместувања на оваа страница за ваш преглед:",
+Подолу е прикажан дневникот на бришења и преместувања на оваа страница:",
 'moveddeleted-notice' => 'Оваа страница била претходно бришена.
 Дневникот на бришења и преместувања за оваа страница е прикажан подолу за ваше дополнително информирање.',
 'log-fulllog' => 'Преглед на целиот дневник',
@@ -1103,7 +1110,7 @@ $2
 Не е дадено никакво образложение.',
 'edit-gone-missing' => 'Не можев да ја подновам страницата.
 Веројатно е избришана.',
-'edit-conflict' => 'Ð\9aонÑ\84ликÑ\82но Ñ\83Ñ\80едÑ\83ваÑ\9aе.',
+'edit-conflict' => 'СпÑ\80оÑ\82иÑ\81Ñ\82авеноÑ\81Ñ\82 Ð²Ð¾ Ñ\83Ñ\80едÑ\83ваÑ\9aеÑ\82о.',
 'edit-no-change' => 'Вашите уредувања беа игнорирани, бидејќи не се направени промени врз текстот.',
 'edit-already-exists' => 'Не може да се создаде нова страница.
 Истата веќе постои.',
@@ -1121,15 +1128,21 @@ $2
 Таквите аргументи ќе бидат изземени при парсирањето.",
 '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' => 'Страницата ја надмина длабочината на проширувањето',
+'parser-unstrip-loop-warning' => 'Утврдена е јамка',
+'parser-unstrip-recursion-limit' => 'Пречекорена е границата на рекурзија ($1)',
 
 # "Undo" feature
 'undo-success' => 'Уредувањето може да се откаже.
 Ве молиме споредете ги промените со претходната верзија за да проверите дали тоа е сигурно она што сакате да го направите, а потоа зачувајте ги промените за да го завршите откажувањето на претходното уредување.',
-'undo-failure' => 'УÑ\80едÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ñ\82каже Ð·Ð°Ñ\80ади Ð´Ñ\80Ñ\83ги ÐºÐ¾Ð½Ñ\84ликÑ\82ни Ñ\83Ñ\80едÑ\83ваÑ\9aа ÐºÐ¾Ð¸ Ð½Ð°Ñ\81Ñ\82анале Ð²Ð¾ Ð¼ÐµÑ\93Ñ\83вÑ\80еме.',
+'undo-failure' => 'УÑ\80едÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\88е Ð´Ð° Ñ\81е Ð¾Ñ\82каже Ð·Ð°Ñ\80ади Ð¼ÐµÑ\93Ñ\83вÑ\80емени Ñ\81пÑ\80оÑ\82иÑ\81Ñ\82авени Ñ\83Ñ\80едÑ\83ваÑ\9aа.',
 'undo-norev' => 'Измената не можеше да биде вратена бидејќи не постои или била избришана.',
-'undo-summary' => 'Откажано уредување $1 од ([[Special:Contributions/$2|$2]] | [[Разговор со корисник:$2|Разговор]])',
+'undo-summary' => 'Откажано уредувањето $1 на уредникот [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Не може да се создаде корисничка сметка',
@@ -1139,7 +1152,7 @@ $2
 
 # History pages
 'viewpagelogs' => 'Преглед на дневници за оваа страница',
-'nohistory' => 'Ð\9dе Ð¿Ð¾Ñ\81Ñ\82ои Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а Ð½Ð° Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð·Ð° Ð¾Ð²Ð°Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а.',
+'nohistory' => 'СÑ\82Ñ\80аниÑ\86аÑ\82а Ð½ÐµÐ¼Ð° Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а Ð½Ð° Ñ\83Ñ\80едÑ\83ваÑ\9aе.',
 'currentrev' => 'Тековна ревизија',
 'currentrev-asof' => 'Последна ревизија од $1',
 'revisionasof' => 'Ревизија од $1',
@@ -1262,7 +1275,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'Дневник на сокривања',
 'suppressionlogtext' => 'Подолу е прикажан список на бришења и блокирања поврзани со содржини скриени од администратори.
-Тековните забрани и блокирања ќе ги најдете на [[Special:BlockList|списокот на блокирани IP-адреси]].',
+Тековните забрани и блокирања ќе ги најдете на [[Special:BlockList|списокот на блокирања]].',
 
 # History merging
 'mergehistory' => 'Спојување на истории на страница',
@@ -1296,8 +1309,9 @@ $1",
 'mergelogpagetext' => 'Следи список на скорешни спојувања на истории на страници.',
 
 # Diffs
-'history-title' => 'Историја на измените на „$1“',
-'difference' => '(Разлика меѓу ревизија)',
+'history-title' => '$1: Историја на измените',
+'difference-title' => '$1: Разлика помеѓу ревизиите',
+'difference-title-multipage' => '$1 и $2: Разлика помеѓу страниците',
 'difference-multipage' => '(Разлики помеѓу страници)',
 'lineno' => 'Ред $1:',
 'compareselectedversions' => 'Спореди избрани ревизии',
@@ -1387,7 +1401,7 @@ $1",
 'mypreferences' => 'мои нагодувања',
 'prefs-edits' => 'Број на уредувања:',
 'prefsnologin' => 'Не сте најавени',
-'prefsnologintext' => 'Мора да сте <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} најавени]</span> за промена на вашите кориснички нагодувања.',
+'prefsnologintext' => 'Мора да бидете <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} најавени]</span> за да ги менувате вашите кориснички нагодувања.',
 'changepassword' => 'Смени лозинка',
 'prefs-skin' => 'Руво',
 'skin-preview' => 'Преглед',
@@ -1395,6 +1409,7 @@ $1",
 'prefs-beta' => 'Бета-можности',
 'prefs-datetime' => 'Датум и време',
 'prefs-labs' => 'Експериментални можности',
+'prefs-user-pages' => 'Кориснички страници',
 'prefs-personal' => 'Кориснички профил',
 'prefs-rc' => 'Скорешни промени',
 'prefs-watchlist' => 'Список на набљудувања',
@@ -1428,7 +1443,7 @@ $1",
 Секој што го знае клучот во полево ќе може да го чита вашиот список на набљудувања, па затоа изберете некоја безбедна вредност.
 Еве една случајно-создадена вредност што можете да ја користите: $1',
 'savedprefs' => 'Вашите нагодувања се зачувани.',
-'timezonelegend' => 'ЧаÑ\81овна Ð·Ð¾Ð½Ð°:',
+'timezonelegend' => 'ЧаÑ\81овен Ð¿Ð¾Ñ\98аÑ\81:',
 'localtime' => 'Локално време:',
 'timezoneuseserverdefault' => 'Од викито ($1)',
 'timezoneuseoffset' => 'Друго (посочете отстапување)',
@@ -1454,7 +1469,7 @@ $1",
 'prefs-custom-css' => 'Посебно CSS',
 'prefs-custom-js' => 'Посебно JS',
 'prefs-common-css-js' => 'Заеднички CSS/JS за сите изгледи:',
-'prefs-reset-intro' => 'Може да ја користите оваа страница за враќање на вашите нагодувања на основно-зададените нагодувања на викито. Оваа не може да се врати.',
+'prefs-reset-intro' => 'Може да ја користите оваа страница за враќање на вашите нагодувања на основно-зададените нагодувања на викито. Ова дејство е неповратно.',
 'prefs-emailconfirm-label' => 'Потврда на е-пошта:',
 'prefs-textboxsize' => 'Големина на полето за уредување',
 'youremail' => 'Е-пошта:',
@@ -1580,7 +1595,7 @@ $1",
 'right-deletedtext' => 'Прегледување на избришан текст и промени помеѓу избришани ревизии',
 'right-browsearchive' => 'Пребарување на избришани страници',
 'right-undelete' => 'Обновување избришана страница',
-'right-suppressrevision' => 'Ð\9fÑ\80егледÑ\83ваÑ\9aе Ð¸ Ð²Ñ\80аÑ\9cаÑ\9aе Ð½Ð° Ñ\80евизии Ñ\81окÑ\80иени Ð¾Ð´ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и',
+'right-suppressrevision' => 'Прегледување и враќање на ревизии скриени од администратори',
 'right-suppressionlog' => 'Гледање на приватни дневници',
 'right-block' => 'Оневозможување на останати корисници да уредуваат',
 'right-blockemail' => 'Оневозможување корисници да праќаат е-пошта',
@@ -1594,7 +1609,7 @@ $1",
 'right-editusercssjs' => 'Уредување на CSS и JS податотеки на други корисници',
 'right-editusercss' => 'Уредување на CSS податотеки на други корисници',
 'right-edituserjs' => 'Уредување на JS податотеки на други корисници',
-'right-rollback' => 'Брзо отстранување на уредувањата на последниот корисник кој уредувал одредена страница',
+'right-rollback' => 'Брзо отповикување на уредувањата на последниот корисник што уредувал одредена страница',
 'right-markbotedits' => 'Означување на вратени уредувања како ботовски уредувања',
 'right-noratelimit' => 'Без временски ограничувања на уредување',
 'right-import' => 'Увезување страници од други викија',
@@ -1643,7 +1658,7 @@ $1",
 'action-suppressionlog' => 'преглед на овој приватен дневник',
 'action-block' => 'оневозможи го овој корисник да уредува',
 'action-protect' => 'измени го степенот на заштита на оваа страница',
-'action-rollback' => 'бÑ\80зо Ð²Ñ\80аÑ\9cање на измени направени од последниот уредник на страницата',
+'action-rollback' => 'бÑ\80зо Ð¾Ñ\82повикÑ\83вање на измени направени од последниот уредник на страницата',
 'action-import' => 'увези ја оваа страница од друго вики',
 'action-importupload' => 'увези ја оваа страница од подигната податотека',
 'action-patrol' => 'означи ги уредувањата на другите како проверени',
@@ -1659,10 +1674,10 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|промена|промени}}',
 'recentchanges' => 'Скорешни промени',
 'recentchanges-legend' => 'Нагодувања за скорешни промени',
-'recentchangestext' => 'На оваа страница ги следите скорешните промени на викито.',
+'recentchanges-summary' => 'На оваа страница ги следите скорешните промени на викито.',
 'recentchanges-feed-description' => 'Следење на најскорешните промени на викито во овие емитувања.',
 'recentchanges-label-newpage' => 'Ова уредување создаде нова страница',
-'recentchanges-label-minor' => 'Ð\9eва Ðµ Ñ\81иÑ\82но Ñ\83Ñ\80едÑ\83ваÑ\9aе',
+'recentchanges-label-minor' => 'Ð\9eва Ðµ Ñ\81иÑ\82на Ð¿Ñ\80омена',
 'recentchanges-label-bot' => 'Ова уредување е направено од бот',
 'recentchanges-label-unpatrolled' => 'Ова уредување сè уште не било патролирано',
 'rcnote' => "Подолу {{PLURAL:$1|е прикажана '''1''' промена|се прикажани последните '''$1''' промени}} {{PLURAL:$2|за денес|во последниве '''$2''' дена}}, заклучно со $5, $4.",
@@ -1676,7 +1691,7 @@ $1",
 'rcshowhidemine' => '$1 мои уредувања',
 'rclinks' => 'Прикажи скорешни $1 промени во последните $2 дена<br />$3',
 'diff' => 'разл',
-'hist' => 'ист',
+'hist' => 'истор',
 'hide' => 'Скриј',
 'show' => 'Прикажи',
 'minoreditletter' => 'с',
@@ -1764,7 +1779,7 @@ $1",
 'tmp-create-error' => 'Не можев да создадам привремена податотека.',
 'tmp-write-error' => 'Грешка при запис на привремената податотека.',
 'large-file' => 'Се препорачува податотеките да не бидат поголеми од $1; оваа податотека е $2.',
-'largefileserver' => 'Ð\93олеминаÑ\82а Ð½Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82екаÑ\82а Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð°.',
+'largefileserver' => 'Ð\93олеминаÑ\82а Ð½Ð° Ð¾Ð²Ð°Ð° Ð¿Ð¾Ð´Ð°Ñ\82оÑ\82ека Ðµ Ð¿Ð¾Ð³Ð¾Ð»ÐµÐ¼Ð° Ð¾Ð´ Ð¼Ð°ÐºÑ\81имално Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð°Ñ\82а Ð³Ð¾Ð»ÐµÐ¼Ð¸Ð½Ð° Ð¾Ð´ Ñ\81еÑ\80веÑ\80оÑ\82.',
 'emptyfile' => 'Податотеката што ја подигнавте изгледа дека е празна.
 Ова може да е поради грешка во името на податотеката.
 Ве молиме проверете дали навистина сакате да ја подигнете оваа податотека.',
@@ -1871,14 +1886,15 @@ $1',
 'backend-fail-writetemp' => 'Не можев да запишам во привремената податотека.',
 'backend-fail-closetemp' => 'Не можев да ја затворам привремената податотека.',
 'backend-fail-read' => 'Не можев да ја прочитам податотеката $1',
-'backend-fail-create' => 'Не можев да ја создадам податотеката $1',
-'backend-fail-maxsize' => 'Не можев да ја создадам податотеката $1 бидејќи е поголема од {{PLURAL:$2|$2 бајт|$2 бајти}}.',
+'backend-fail-create' => 'Не можев да ја запишам податотеката $1.',
+'backend-fail-maxsize' => 'Не можев да ја запишам податотеката $1 бидејќи е поголема од {{PLURAL:$2|еден бајт|$2 бајти}}.',
 'backend-fail-readonly' => 'Складишната основа „$1“ моментално не може да се запишува. Наведената причина гласи: „$2“',
 'backend-fail-synced' => 'Податотеката „$1“ е во состојба недоследна во рамките на внатрешните складишни основи',
 'backend-fail-connect' => 'Не можев да се поврзам со складишната основа „$1“.',
 'backend-fail-internal' => 'Се појави непозната грешка во складишната основа „$1“.',
 'backend-fail-contenttype' => 'Не можев да утврдам каква содржина има податотеката што треба да ја складирам во „$1“.',
 'backend-fail-batchsize' => 'Складишната основа доби блок од $1 податочна {{PLURAL:$1|операција|операции}}, а ограничувањето е $2 {{PLURAL:$2|операција|операции}}.',
+'backend-fail-usable' => 'Не можев да ја запишам податотеката $1 бидејќи немате доволно дозволи или поради тоа што недостасуваат именици/содржатели.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не можев да се поврзам со дневничката база за складишната основа „$1“.',
@@ -1956,7 +1972,7 @@ $1',
 'nolicense' => 'Нема',
 'license-nopreview' => '(Прегледот не е достапен)',
 'upload_source_url' => ' (важечка, јавно достапна URL-адреса)',
-'upload_source_file' => '(податотека на вашиот сметач)',
+'upload_source_file' => '(податотека на вашиот компјутер)',
 
 # Special:ListFiles
 'listfiles-summary' => 'Оваа специјална страница ги прикажува сите подигнати податотеки.
@@ -2113,7 +2129,7 @@ $1',
 'brokenredirects-edit' => 'уреди',
 'brokenredirects-delete' => 'избриши',
 
-'withoutinterwiki' => 'СÑ\82Ñ\80аниÑ\86и Ð±ÐµÐ· Ð¸Ð½Ñ\82еÑ\80вики (Ñ\98азиÑ\87ни) врски',
+'withoutinterwiki' => 'СÑ\82Ñ\80аниÑ\86и Ð±ÐµÐ· Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ни врски',
 'withoutinterwiki-summary' => 'Следните страници немаат врски до други јазични верзии.',
 'withoutinterwiki-legend' => 'Префикс',
 'withoutinterwiki-submit' => 'Прикажи',
@@ -2206,6 +2222,7 @@ $1',
 Можете да го ограничите прикажаното избирајќи тип на дневник, корисничко име (разликува големи и мали букви), или страница (разликува големи и мали букви).',
 'logempty' => 'Нема соодветни записи во дневникот.',
 'log-title-wildcard' => 'Пребарај наслови кои почнуваат со овој текст',
+'showhideselectedlogentries' => 'Прикажи/скриј одбрани записи',
 
 # Special:AllPages
 'allpages' => 'Сите страници',
@@ -2221,10 +2238,15 @@ $1',
 'allpagesnext' => 'Следна',
 'allpagessubmit' => 'Оди',
 'allpagesprefix' => 'Прикажи страници со префикс:',
-'allpagesbadtitle' => 'Ð\94адениоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð½ÐµÐ²Ð°Ð¶ÐµÑ\87ки Ð¸Ð»Ð¸ Ð¸Ð¼Ð° Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¸Ð½Ñ\82еÑ\80вики префикс. Може да содржи повеќе знаци кои не смеат да се користат во наслови.',
+'allpagesbadtitle' => 'Ð\94адениоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð½ÐµÐ²Ð°Ð¶ÐµÑ\87ки Ð¸Ð»Ð¸ Ð¸Ð¼Ð° Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¼ÐµÑ\93Ñ\83вики префикс. Може да содржи повеќе знаци кои не смеат да се користат во наслови.',
 'allpages-bad-ns' => 'Википедија не содржи именски простор „$1“.',
 'allpages-hide-redirects' => 'Скриј пренасочувања',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Гледате кеширана верзија на оваа страница, која може да е стара $1.',
+'cachedspecial-viewing-cached-ts' => 'Гледате кеширана верзија на оваа страница, која може да се разликува од тековната.',
+'cachedspecial-refresh-now' => 'Погл. најновата.',
+
 # Special:Categories
 'categories' => 'Категории',
 'categoriespagetext' => '{{PLURAL:$1|Следната категорија содржи|Следните категории содржат}} страници или мултимедијални податотеки.
@@ -2434,16 +2456,16 @@ $UNWATCHURL
 продолжете доколку сте сигруни дека треба тоа да го сторите.',
 
 # Rollback
-'rollback' => 'Ð\92Ñ\80аÑ\82и промени',
-'rollback_short' => 'Ð\92Ñ\80аÑ\82и',
-'rollbacklink' => 'Ð\92Ñ\80аÑ\82и',
-'rollbackfailed' => 'Ð\9dеÑ\83Ñ\81пеÑ\88но Ð²Ñ\80аÑ\9cаÑ\9aе',
-'cantrollback' => 'УÑ\80едÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð²Ñ\80аÑ\82и.
+'rollback' => 'Ð\9eÑ\82повикаÑ\98 промени',
+'rollback_short' => 'Ð\9eÑ\82повикаÑ\98',
+'rollbacklink' => 'оÑ\82повикаÑ\98',
+'rollbackfailed' => 'Ð\9eÑ\82повикÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ñ\83Ñ\81пеа',
+'cantrollback' => 'УÑ\80едÑ\83ваÑ\9aеÑ\82о Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82повика.
 Последниот уредник е воедно и единствениот автор на страницата.',
-'alreadyrolled' => 'Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð²Ñ\80аÑ\82и Ð¿Ð¾Ñ\81ледноÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð¾Ð´ [[:$1]] Ð½Ð° [[User:$2|$2]] ([[User talk:$2|Разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
-некој друг веќе ја уредил или ги вратил промените на страницата.
+'alreadyrolled' => 'Ð\9dе Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¾Ñ\82повика Ð¿Ð¾Ñ\81ледноÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а â\80\9e[[:$1]]â\80\9c Ð¸Ð·Ð²Ñ\80Ñ\88ено Ð¾Ð´  [[User:$2|$2]] ([[User talk:$2|Ñ\80азговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
+некој друг веќе ја изменил или отповикал страницата.
 
\9fоÑ\81ледноÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð±ÐµÑ\88е Ð½Ð° [[User:$3|$3]] ([[User talk:$3|Разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
\9fоÑ\81ледноÑ\82о Ñ\83Ñ\80едÑ\83ваÑ\9aе Ð³Ð¾ Ð¸Ð·Ð²Ñ\80Ñ\88и [[User:$3|$3]] ([[User talk:$3|Ñ\80азговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Коментарот на уредувањето беше: „''$1''“.",
 'revertpage' => 'Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]',
 'revertpage-nouser' => 'Вратени уредувања на (избришано корисничко име) на последната ревизија од [[User:$1|$1]]',
@@ -2530,9 +2552,9 @@ $UNWATCHURL
 'viewdeletedpage' => 'Прегледај ги избришаните страници',
 'undeletepagetext' => '{{PLURAL:$1|Следната страница била избришана но сè уште е во архивот и може да биде вратена.|Следните $1 страници биле избришани но сè уште се во архивот и можат да бидат вратени.}}
 Архивот може периодично да се чисти.',
-'undelete-fieldset-title' => 'Ð\9eбнови ревизии',
-'undeleteextrahelp' => "За да вратите целосна историја на една страница, отштиклирајте ги сите полиња и притиснете на '''''{{int:undeletebtn}}'''''.
-За да извршите делумно враќање, штиклирајте ги соодветните ревизии за враќање и притиснете на '''''{{int:undeletebtn}}'''''.",
+'undelete-fieldset-title' => 'Ð\92Ñ\80аÑ\82и ревизии',
+'undeleteextrahelp' => "За да вратите целосна историја на една страница, отштиклирајте ги сите полиња и притиснете на „'''{{int:undeletebtn}}'''“.
+За да извршите делумно враќање, штиклирајте ги соодветните ревизии за враќање и притиснете на „'''{{int:undeletebtn}}'''“.",
 'undeleterevisions' => '{{PLURAL:$1|$1 измена е архивирана|$1 измени се архивирани}}',
 'undeletehistory' => 'Ако ја обновите страницата, сите поправки ќе бидат вратени во историјата.
 Ако нова страница со исто име е создадена по бришењето, обновените поправки ќе се појават во претходната историја.',
@@ -2545,16 +2567,16 @@ $UNWATCHURL
 'undeleterevision-missing' => 'Грешна или непостоечка ревизија.
 Можеби имате лоша врска, ревизијата била обновена или избришана од архивата.',
 'undelete-nodiff' => 'Не постои постара ревизија.',
-'undeletebtn' => 'Ð\9eбнови',
+'undeletebtn' => 'Ð\92Ñ\80аÑ\82и',
 'undeletelink' => 'погледај/врати',
 'undeleteviewlink' => 'преглед',
-'undeletereset' => 'Ð\92Ñ\80аÑ\82и',
+'undeletereset' => 'Ð\9eдново',
 'undeleteinvert' => 'Обратен избор',
 'undeletecomment' => 'Причина:',
 'undeletedrevisions' => '{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени',
 'undeletedfiles' => '{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}',
-'cannotundelete' => 'Враќањето не успеа, некој друг можеби ја вратил страницата претходно.',
+'cannotundelete' => 'Враќањето не успеа. Можеби некој друг веќе ја вратил страницата.',
 'undeletedpage' => "'''$1 беше обновена'''
 
 Погледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.",
@@ -2659,7 +2681,7 @@ $1',
 'ipbenableautoblock' => 'Автоматски блокирај ја последната IP-адреса што ја користел корисникот и сите понатамошни адреси од кои ќе се обиде да уредува',
 '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',
+'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' => 'Скриј го корисничкото име во уредувањата и списоците',
@@ -2669,8 +2691,8 @@ $1',
 'ipb-confirm' => 'Потврди блок',
 'badipaddress' => 'Неважечка IP-адреса',
 'blockipsuccesssub' => 'Успешно блокирање',
-'blockipsuccesstext' => 'IP-адресата [[Special:Contributions/$1|$1]] е блокирана.<br />
-[[Special:BlockList|Список на блокирани IP-адреси]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] е блокирана.<br />
+Блоковите можете да ги прегледате на [[Special:BlockList|списокот на блокови]].',
 'ipb-blockingself' => 'Се спремате да се блокирате самите себеси! Сигурни сте дека го сакате ова?',
 'ipb-confirmhideuser' => 'Сакате да блокирате корисник со можноста „скриј корисник“. Ова ќе го затаи името на корисникот во сите списоци и дневнички записи. Дали сте сигурни дека сакате да го направите тоа?',
 'ipb-edit-dropdown' => 'Наведи причина за блокирање',
@@ -2725,7 +2747,7 @@ $1',
 'reblock-logentry' => 'ги промени нагодувањата за блокирање на [[$1]] со рок на истекување од $2 $3',
 'blocklogtext' => 'Ова е дневник на блокирање и одблокирање на кориснци.
 Автоматски блокираните IP-адреси не се наведени.
\92идеÑ\82е Ð³Ð¾ [[Special:BlockList|Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани IP-адÑ\80еÑ\81и]].',
¢ÐµÐºÐ¾Ð²Ð½Ð¸Ñ\82е Ð·Ð°Ð±Ñ\80ани Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ñ\9cе Ð³Ð¸ Ð½Ð°Ñ\98деÑ\82е Ð½Ð° [[Special:BlockList|Ñ\81пиÑ\81окоÑ\82 Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа]].',
 'unblocklogentry' => 'го одблокира „$1“',
 'block-log-flags-anononly' => 'само анонимни корисници',
 'block-log-flags-nocreate' => 'оневозможено создавање кориснички сметки',
@@ -2860,7 +2882,7 @@ $1',
 не може да се премести страница во самата себе.',
 'immobile-source-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
 'immobile-target-namespace' => 'Не може да се преместуваат страници во именскиот простор „$1“',
-'immobile-target-namespace-iw' => 'Ð\98нÑ\82еÑ\80вики Ð²Ñ\80Ñ\81ка Ð½Ðµ Ðµ Ð²Ð°Ð¶ÐµÑ\87ка Ñ\86ел Ð·Ð° Ð¿Ñ\80емеÑ\81Ñ\82Ñ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86а.',
+'immobile-target-namespace-iw' => 'Ð\9cеÑ\93Ñ\83вики-вÑ\80Ñ\81ка Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð·Ð° Ð¿Ñ\80еименÑ\83ваÑ\9aе Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и.',
 'immobile-source-page' => 'Оваа страница не може да се преместува.',
 'immobile-target-page' => 'Не може да се премести под бараниот наслов.',
 'imagenocrossnamespace' => 'Не може да се премести податотека во неподатотечен именски простор',
@@ -2953,7 +2975,7 @@ $1',
 'importfailed' => 'Неуспешно внесување: $1',
 'importunknownsource' => 'Непознат тип за внесување',
 'importcantopen' => 'Не може да се отвори увезената податотека',
-'importbadinterwiki' => 'Ð\9bоÑ\88а Ð¸Ð½Ñ\82еÑ\80вики врска',
+'importbadinterwiki' => 'Ð\9bоÑ\88а Ð¼ÐµÑ\93Ñ\83вики-врска',
 'importnotext' => 'Празно или без текст',
 'importsuccess' => 'Увезувањето е завршено!',
 'importhistoryconflict' => 'Постои конфликтна историја на верзиите (можно е страницата веќе да била внесена)',
@@ -3051,7 +3073,7 @@ $1',
 'tooltip-ca-nstab-template' => 'Преглед на шаблонот',
 'tooltip-ca-nstab-help' => 'Преглед на страницата за помош',
 'tooltip-ca-nstab-category' => 'Преглед на категоријата',
-'tooltip-minoredit' => 'Ð\9eбележеÑ\82е ја промената како ситна',
+'tooltip-minoredit' => 'Ð\9eбележи ја промената како ситна',
 'tooltip-save' => 'Зачувајте ги вашите промени',
 'tooltip-preview' => 'Прегледајте ги вашите промени, ве молиме користете го ова пред зачувување!',
 'tooltip-diff' => 'Покажи кои промени ги направи во текстот.',
@@ -3061,11 +3083,10 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'Поднови го списокот',
 'tooltip-recreate' => 'Повторно создај ја страницата иако е избришана',
 'tooltip-upload' => 'Започни со подигање',
-'tooltip-rollback' => '„Врати“ ги поништува последните уредувања на оваа страница со еден клик до уредувањата на претпоследниот придонесувач',
-'tooltip-undo' => '„Откажи“ го поништува ова уредување и отвора прозорец за уредување.
-Дозволува додавање на причина во описот',
+'tooltip-rollback' => '„Отповикај“ ги повлекува промените на последниот уредник',
+'tooltip-undo' => '„Откажи“ го поништува ова уредување и ве носи на уредувањето во режим на преглед. Дава можност за наведување на причина во описот.',
 'tooltip-preferences-save' => 'Зачувај',
-'tooltip-summary' => 'Ð\92неÑ\81еÑ\82е ÐºÑ\80аÑ\82ко Ñ\80езиме',
+'tooltip-summary' => 'Ð\92неÑ\81еÑ\82е ÐºÑ\80аÑ\82ок Ð¾Ð¿Ð¸Ñ\81',
 
 # Stylesheets
 'common.css' => '/* Тука поставениот CSS ќе се применува врз сите рува */',
@@ -3124,7 +3145,8 @@ $1',
 'spamprotectionmatch' => 'Следниот текст е она што го предизвика нашиот филтер за спам: $1',
 'spambot_username' => 'МедијаВики чистач на спам',
 'spam_reverting' => 'Враќам на последната верзија што не содржи врска до $1',
-'spam_blanking' => 'Сите верзии содржеа врски до $1, бришам',
+'spam_blanking' => 'Сите ревизии содржеа врски до $1. Чистам',
+'spam_deleting' => 'Сите ревизии содржеа врски до $1. Бришам',
 
 # Info page
 'pageinfo-title' => 'Информации за „$1“',
@@ -3994,6 +4016,11 @@ $5
 'version-software' => 'Инсталирана програмска опрема',
 'version-software-product' => 'Производ',
 'version-software-version' => 'Верзија',
+'version-entrypoints' => 'URL-а на влезните точки',
+'version-entrypoints-header-entrypoint' => 'Влезна точка',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath?uselang=mk Статија]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath?uselang=mk Скрипта]',
 
 # Special:FilePath
 'filepath' => 'Патека до податотека',
@@ -4181,4 +4208,17 @@ $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' => '{{PLURAL: $1|година|години}}',
+'duration-decades' => '$1 {{PLURAL:$1|деценија|децении}}',
+'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
+'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Не можев да добијам катанци за опслужувачот $1',
 );
index bcbd0bd..e191792 100644 (file)
@@ -83,6 +83,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'സർവ്വസന്ദേശങ്ങൾ' ),
        'Allpages'                  => array( 'എല്ലാതാളുകളും' ),
        'Ancientpages'              => array( 'പുരാതന_താളുകൾ' ),
+       'Badtitle'                  => array( 'മോശംതലക്കെട്ട്' ),
        'Blankpage'                 => array( 'ശൂന്യതാൾ' ),
        'Block'                     => array( 'തടയുക', 'ഐ.പി.തടയുക', 'ഉപയോക്തൃതടയൽ' ),
        'Blockme'                   => array( 'എന്നെതടയുക' ),
@@ -107,6 +108,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'പ്രമാണവിലാസം' ),
        'Import'                    => array( 'ഇറക്കുമതി' ),
        'Invalidateemail'           => array( 'ഇമെയിൽഅസാധുവാക്കുക' ),
+       'JavaScriptTest'            => array( 'ജാവാസ്ക്രിപ്റ്റ്പരീക്ഷണം' ),
        'BlockList'                 => array( 'തടയൽ‌പട്ടിക', 'ഐപികളുടെ_തടയൽ‌പട്ടിക' ),
        'LinkSearch'                => array( 'കണ്ണികൾ_തിരയുക' ),
        'Listadmins'                => array( 'കാര്യനിർവാഹകപട്ടിക' ),
@@ -219,6 +221,7 @@ $magicWords = array(
        'pagenamee'               => array( '1', 'താളിന്റെപേര്‌സമഗ്രം', 'PAGENAMEE' ),
        'namespace'               => array( '1', 'നാമമേഖല', 'NAMESPACE' ),
        'namespacee'              => array( '1', 'നാമമേഖലസമഗ്രം', 'NAMESPACEE' ),
+       'namespacenumber'         => array( '1', 'നാമമേഖലാസംഖ്യ', 'NAMESPACENUMBER' ),
        'talkspace'               => array( '1', 'സംവാദമേഖല', 'TALKSPACE' ),
        'talkspacee'              => array( '1', 'സംവാദമേഖലസമഗ്രം', 'TALKSPACEE' ),
        'subjectspace'            => array( '1', 'വിഷയമേഖല', 'ലേഖനമേഖല', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -317,6 +320,8 @@ $magicWords = array(
        'url_path'                => array( '0', 'പഥം', 'PATH' ),
        'url_wiki'                => array( '0', 'വിക്കി', 'WIKI' ),
        'url_query'               => array( '0', 'ക്വറി', 'QUERY' ),
+       'defaultsort_noerror'     => array( '0', 'പിഴവില്ല', 'noerror' ),
+       'defaultsort_noreplace'   => array( '0', 'മാറ്റേണ്ടതില്ല', 'noreplace' ),
 );
 
 $digitGroupingPattern = "##,##,###";
@@ -329,7 +334,7 @@ $messages = array(
 'tog-hidepatrolled' => 'റോന്തുചുറ്റിയ തിരുത്തുകൾ പുതിയമാറ്റങ്ങളിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-newpageshidepatrolled' => 'റോന്തുചുറ്റിയ താളുകൾ പുതിയതാളുകളുടെ പട്ടികയിൽ പ്രദർശിപ്പിക്കാതിരിക്കുക',
 'tog-extendwatchlist' => 'ഏറ്റവും പുതിയവ മാത്രമല്ല, എല്ലാ മാറ്റങ്ങളും ദൃശ്യമാകുന്ന വിധത്തിൽ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക വികസിപ്പിക്കുക.',
-'tog-usenewrc' => 'വിപàµ\81à´²àµ\80à´\95àµ\83à´¤ à´ªàµ\81തിയ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\89പയàµ\8bà´\97ിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
+'tog-usenewrc' => 'സമàµ\80à´ªà´\95ാല à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´¤à´¾à´³à´¿à´²àµ\81à´\82 à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവയàµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിലàµ\81à´\82 à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´¤à´¾à´³à´¿à´¨à´¨àµ\81സരിà´\9aàµ\8dà´\9aàµ\8d à´\97ണമായി à´ªàµ\8dരദർശിപàµ\8dà´ªിക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)',
 'tog-numberheadings' => 'ഉപവിഭാഗങ്ങൾക്ക് ക്രമസംഖ്യ കൊടുക്കുക',
 'tog-showtoolbar' => 'തിരുത്തൽ റ്റൂൾബാർ  പ്രദർശിപ്പിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
 'tog-editondblclick' => 'താളുകളിൽ ഇരട്ട ക്ലിക്ക് ചെയ്യുമ്പോൾ തിരുത്താനനുവദിക്കുക (ജാവാസ്ക്രിപ്റ്റ്)',
@@ -341,7 +346,7 @@ $messages = array(
 'tog-watchdefault' => 'ഞാൻ തിരുത്തുന്ന താളുകൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
 'tog-watchmoves' => 'ഞാൻ തലക്കെട്ടു മാറ്റുന്ന താളുകൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
 'tog-watchdeletion' => 'ഞാൻ നീക്കം ചെയ്യുന്ന താളുകൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ചേർക്കുക',
-'tog-minordefault' => 'à´\8eà´²àµ\8dലാ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95à´³àµ\81à´\82 à´\9aàµ\86à´±àµ\81തിരàµ\81à´¤àµ\8dതലàµ\81à´\95ളായി à´¸àµ\8dവയà´\82 അടയാളപ്പെടുത്തുക',
+'tog-minordefault' => 'à´\8eà´²àµ\8dലാ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\81à´\95à´³àµ\81à´\82 à´¸àµ\8dവതàµ\87 à´\9aàµ\86à´±àµ\81തിരàµ\81à´¤àµ\8dതലàµ\81à´\95ളായി അടയാളപ്പെടുത്തുക',
 'tog-previewontop' => 'തിരുത്തൽ പെട്ടിക്കു മുകളിൽ പ്രിവ്യൂ കാണിക്കുക',
 'tog-previewonfirst' => 'ആദ്യത്തെ തിരുത്തലിന്റെ പ്രിവ്യൂ കാണിക്കുക',
 'tog-nocache' => 'ബ്രൗസറിൽ താളുകൾ തദ്ദേശീയമായി സംഭരിച്ചുവയ്ക്കുന്നത് നിർജ്ജീവമാക്കുക',
@@ -373,7 +378,7 @@ $messages = array(
 'underline-default' => 'ബ്രൗസറിലേതു പോലെ',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'തിരുത്തൽ മേഖലയിലെ ഫോണ്ടിന്റെ ശൈലി',
+'editfont-style' => 'തിരുത്തൽ മേഖലയിലെ ഫോണ്ടിന്റെ ശൈലി:',
 'editfont-default' => 'ബ്രൗസറിലേതു പോലെ',
 'editfont-monospace' => 'മോണോസ്പേസ്ഡ് ഫോണ്ട്',
 'editfont-sansserif' => 'സാൻസ്-സെറിഫ് ഫോണ്ട്',
@@ -446,8 +451,8 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന ഒരു പ്രമാണം മാത്രമാണുള്ളത്.|ഈ വർഗ്ഗത്തിൽ മൊത്തം $2 പ്രമാണങ്ങളുള്ളതിൽ {{PLURAL:$1|ഒരെണ്ണം|$1 എണ്ണം}} താഴെ നൽകിയിരിക്കുന്നു.}}',
 'category-file-count-limited' => 'ഈ വർഗ്ഗത്തിൽ താഴെ നൽകിയിരിക്കുന്ന {{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}} ഉണ്ട്.',
 'listingcontinuesabbrev' => 'തുടർച്ച.',
-'index-category' => 'വർà´\97àµ\8dà´\97àµ\80കരിക്കപ്പെട്ട താളുകൾ',
-'noindex-category' => 'വർà´\97àµ\8dà´\97àµ\80കരിക്കപ്പെടാത്ത താളുകൾ',
+'index-category' => 'à´¸àµ\82à´\9aà´¿à´\95ാവതàµ\8dകരിക്കപ്പെട്ട താളുകൾ',
+'noindex-category' => 'à´¸àµ\82à´\9aà´¿à´\95ാവതàµ\8dകരിക്കപ്പെടാത്ത താളുകൾ',
 'broken-file-category' => 'പ്രമാണത്തിലേക്കുള്ള പ്രവർത്തനരഹിതമായ കണ്ണി ഉൾക്കൊള്ളുന്ന താളുകൾ',
 
 'about' => 'വിവരണം',
@@ -487,7 +492,7 @@ $messages = array(
 'vector-view-viewsource' => 'മൂലരൂപം കാണുക',
 'actions' => 'നടപടികൾ',
 'namespaces' => 'നാമമേഖല',
-'variants' => 'à´\9aà´°ങ്ങൾ',
+'variants' => 'à´°àµ\82പഭàµ\87à´¦ങ്ങൾ',
 
 'errorpagetitle' => 'പിഴവ്',
 'returnto' => '$1 എന്ന താളിലേക്ക് തിരിച്ചുപോവുക.',
@@ -529,7 +534,7 @@ $messages = array(
 'toolbox' => 'പണിസഞ്ചി',
 'userpage' => 'ഉപയോക്താവിന്റെ താൾ കാണുക',
 'projectpage' => 'പദ്ധതി താൾ കാണുക',
-'imagepage' => 'à´®àµ\80à´¡à´¿à´¯ താൾ കാണുക',
+'imagepage' => 'à´ªàµ\8dരമാണ താൾ കാണുക',
 'mediawikipage' => 'സന്ദേശങ്ങളുടെ താൾ കാണുക',
 'templatepage' => 'ഫലകം താൾ കാണുക',
 'viewhelppage' => 'സഹായം താൾ കാണുക',
@@ -585,7 +590,7 @@ $1',
 'youhavenewmessages' => 'താങ്കൾക്ക് $1 ഉണ്ട് ($2).',
 'newmessageslink' => 'പുതിയ സന്ദേശങ്ങൾ',
 'newmessagesdifflink' => 'അവസാന മാറ്റം',
-'youhavenewmessagesmulti' => 'താങ്കൾക്ക് $1-ൽ പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്',
+'youhavenewmessagesmulti' => 'താങ്കൾക്ക് $1 താളിൽ പുതിയ സന്ദേശങ്ങൾ ഉണ്ട്',
 'editsection' => 'തിരുത്തുക',
 'editold' => 'തിരുത്തുക',
 'viewsourceold' => 'മൂലരൂപം കാണുക',
@@ -603,9 +608,9 @@ $1',
 'feedlinks' => 'ഫീഡ്:',
 'feed-invalid' => 'അസാധുവായ സബ്‌സ്ക്രിപ്ഷൻ ഫീഡ് തരം.',
 'feed-unavailable' => 'സിൻഡിക്കേഷൻ ഫീഡുകൾ ലഭ്യമല്ല',
-'site-rss-feed' => '$1 à´¨àµ\8dà´±àµ\86 à´\86ർ.à´\8eà´¸àµ\8d.à´\8eà´¸àµ\8d à´«àµ\80à´¡àµ\8d',
-'site-atom-feed' => '$1 à´¨àµ\8dà´±àµ\86 à´\86à´±àµ\8dà´±à´\82 à´«àµ\80à´¡àµ\8d',
-'page-rss-feed' => '"$1" ന്റെ ആർ.എസ്.എസ്. ഫീഡ്',
+'site-rss-feed' => '$1 ആർ.എസ്.എസ് ഫീഡ്',
+'site-atom-feed' => '$1 ആറ്റം ഫീഡ്',
+'page-rss-feed' => '"$1"  ആർ.എസ്.എസ്. ഫീഡ്',
 'page-atom-feed' => '"$1" ആറ്റം ഫീഡ്',
 'feed-atom' => 'ആറ്റം',
 'feed-rss' => 'ആർ.എസ്.എസ്.',
@@ -663,8 +668,8 @@ $1',
 'missingarticle-rev' => '(മാറ്റം#: $1)',
 'missingarticle-diff' => '(വ്യത്യാസം: $1, $2)',
 'readonly_lag' => 'വിവരശേഖരം സ്വയം ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു അതേസമയം കീഴ്-വിവരശേഖര സെർവറുകൾ മാസ്റ്റർ വരെ പിടിച്ചിരിക്കുന്നു',
-'internalerror' => 'ആന്തരികപ്രശ്നം',
-'internalerror_info' => 'ആന്തരികപ്രശ്നം: $1',
+'internalerror' => 'ആന്തരിക പിഴവ്',
+'internalerror_info' => 'ആന്തരിക പിഴവ്: $1',
 'fileappenderrorread' => 'കൂട്ടിച്ചേർക്കുന്ന സമയം "$1" വായിച്ചെടുക്കാൻ കഴിഞ്ഞില്ല.',
 'fileappenderror' => '"$1" എന്നത് "$2"-ലേക്ക് കൂട്ടിച്ചേർക്കുവാൻ സാധിച്ചില്ല.',
 'filecopyerror' => '"$1" എന്ന പ്രമാണം "$2" എന്നതിലേയ്ക്ക് പകർത്താൻ സാധിച്ചില്ല.',
@@ -682,7 +687,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 />
@@ -708,6 +713,8 @@ $2',
 'filereadonlyerror' => 'പ്രമാണ ശേഖരണി "$2" ഇപ്പോൾ "കാണൽ-മാത്രം" വിധത്തിൽ ക്രമീകരിച്ചിരിക്കുന്നതിനാൽ "$1" എന്ന പ്രമാണത്തിൽ മാറ്റം വരുത്താനാകില്ല.
 
 ബന്ധിച്ച കാര്യ‌നിർവാഹക(ൻ) നൽകിയിരിക്കുന്ന കാരണം "\'\'$3\'\'" എന്നാണ്.',
+'invalidtitle-knownnamespace' => 'നാമമേഖല "$2", എഴുത്ത് "$3" എന്നിവ ഉപയോഗിച്ചുള്ള അസാധുവായ തലക്കെട്ട്',
+'invalidtitle-unknownnamespace' => 'അപരിചിതമായ നാമമേഖലാ സംഖ്യ $1, എഴുത്ത് "$2" എന്നിവ ഉപയോഗിച്ചുള്ള അസാധുവായ തലക്കെട്ട്',
 
 # Virus scanner
 'virus-badscanner' => "തെറ്റായ ക്രമീകരണങ്ങൾ: അപരിചിതമായ വൈറസ് തിരച്ചിൽ ഉപാധി :  ''$1''",
@@ -727,7 +734,7 @@ $2',
 'yourpassword' => 'രഹസ്യവാക്ക്:',
 'yourpasswordagain' => 'രഹസ്യവാക്ക് ഒരിക്കൽക്കൂടി:',
 'remembermypassword' => 'എന്റെ പ്രവേശനം ഈ ബ്രൗസറിൽ ({{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}) ഓർത്തുവെക്കുക',
-'securelogin-stick-https' => 'à´ªàµ\8dà´°à´µàµ\87ശിà´\9aàµ\8dà´\9aതിനàµ\81 à´\8eà´\9aàµ\8dà´\9aàµ\8d.à´±àµ\8dറി.à´±àµ\8dറി.പി.à´\8eà´¸àµ\8d. ഉപയോഗിക്കുക',
+'securelogin-stick-https' => 'à´ªàµ\8dà´°à´µàµ\87ശനതàµ\8dതിനàµ\81 à´¶àµ\87à´·à´µàµ\81à´\82 à´\8eà´\9aàµ\8dà´\9aàµ\8d.à´±àµ\8dറി.à´±àµ\8dറി.പി.à´\8eà´¸àµ\8d. à´¤à´¨àµ\8dà´¨àµ\86 ഉപയോഗിക്കുക',
 'yourdomainname' => 'താങ്കളുടെ ഡൊമെയിൻ:',
 'externaldberror' => 'ഒന്നുകിൽ ഡേറ്റാബേസ് സാധൂകരണത്തിൽ പ്രശ്നം ഉണ്ടായിരുന്നു അല്ലെങ്കിൽ നവീകരിക്കുവാൻ താങ്കളുടെ ബാഹ്യ അംഗത്വം താങ്കളെ അനുവദിക്കുന്നില്ല.',
 'login' => 'പ്രവേശിക്കുക',
@@ -746,7 +753,7 @@ $2',
 'userlogin-resetlink' => 'താങ്കളുടെ ലോഗിൻ വിവരങ്ങൾ മറന്നു പോയോ?',
 'createaccountmail' => 'ഇമെയിൽ വഴി',
 'createaccountreason' => 'കാരണം:',
-'badretype' => 'താà´\99àµ\8dà´\95ൾ à´\9fàµ\88à´ªàµ\8dà´ªàµ\8d à´\9aàµ\86à´¯àµ\8dà´¤ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\81à´\95ൾ à´¤à´®àµ\8dമിൽ à´¯àµ\8bà´\9cà´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനില്ല.',
+'badretype' => 'താà´\99àµ\8dà´\95ൾ à´¨àµ½à´\95à´¿à´¯ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\81à´\95ൾ à´¸à´®à´®ല്ല.',
 'userexists' => 'നൽകിയ ഉപയോക്തൃനാമം മുമ്പേ നിലവിലുണ്ട്.
 ദയവായി മറ്റൊരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക.',
 'loginerror' => 'പ്രവേശനം സാധിച്ചില്ല',
@@ -812,6 +819,7 @@ $2',
 # Change password dialog
 'resetpass' => 'രഹസ്യവാക്ക് മാറ്റുക',
 'resetpass_announce' => 'താങ്കൾക്ക് ഇമെയിൽ ആയി കിട്ടിയ താൽക്കാലിക കോഡ് ഉപയോഗിച്ചാണ്‌ ഇപ്പോൾ ലോഗിൻ ചെയ്തിരിക്കുന്നതു്‌. ലോഗിൻ പ്രക്രിയ പൂർത്തിയാകുവാൻ പുതിയൊരു രഹസ്യവാക്ക് ഇവിടെ കൊടുക്കുക:',
+'resetpass_text' => '<!-- എഴുത്ത് ഇവിടെ ചേർക്കുക -->',
 'resetpass_header' => 'അംഗത്വത്തിന്റെ രഹസ്യവാക്ക് മാറ്റുക',
 'oldpassword' => 'പഴയ രഹസ്യവാക്ക്:',
 'newpassword' => 'പുതിയ രഹസ്യവാക്ക്:',
@@ -822,8 +830,8 @@ $2',
 'resetpass-no-info' => 'ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.',
 'resetpass-submit-loggedin' => 'രഹസ്യവാക്ക് മാറ്റുക',
 'resetpass-submit-cancel' => 'റദ്ദാക്കുക',
-'resetpass-wrong-oldpass' => 'സാധàµ\81തയിലàµ\8dലാതàµ\8dà´¤ à´¤à´¾à´¤àµ\8dà´\95ാലിà´\95 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95്.
-നിലവിൽ à´¤à´¾à´\99àµ\8dà´\95ൾ à´µà´¿à´\9cà´¯à´\95രമായി à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´®à´¾à´±àµ\8dറിയിà´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fàµ\8d à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´\92à´°àµ\81 à´ªàµ\81തിയ à´¤à´¾à´¤àµ\8dà´\95ാലിà´\95 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95à´¿à´¨àµ\8d à´\86വശàµ\8dയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´°à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.',
+'resetpass-wrong-oldpass' => 'താതàµ\8dà´\95ാലിà´\95മായി à´²à´­à´¿à´\9aàµ\8dà´\9a à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dളതായി à´¨àµ½à´\95à´¿à´¯ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\85സാധàµ\81വാണ്.
+താà´\99àµ\8dà´\95ൾ à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´µà´¿à´\9cà´¯à´\95രമായി à´®à´¾à´±àµ\8dറിയിà´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fà´¾à´\95à´¾à´\82 à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´ªàµ\81തിയ à´¤à´¾à´¤àµ\8dà´\95ാലിà´\95 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\85à´­àµ\8dയർതàµ\8dഥിà´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fàµ\81à´£àµ\8dà´\9fà´¾à´\95à´¾à´\82.',
 'resetpass-temp-password' => 'താത്കാലിക രഹസ്യവാക്ക്:',
 
 # Special:PasswordReset
@@ -861,7 +869,7 @@ $2
 # Special:ChangeEmail
 'changeemail' => 'ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
 'changeemail-header' => 'അംഗത്വത്തിന്റെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്തുക',
-'changeemail-text' => 'താങ്കളുടെ ഇമെയിൽ വിലാസത്തിൽ മാറ്റംവരുത്താൻ ഈ ഫോം പൂരിപ്പിച്ചു നൽകുക. മാറ്റം സ്ഥിരീകരിക്കാനായി താങ്കളുടെ രഹസ്യവാക്ക് നൽകേണ്ടതാണ്.',
+'changeemail-text' => 'താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\87à´®àµ\86യിൽ à´µà´¿à´²à´¾à´¸à´¤àµ\8dതിൽ à´®à´¾à´±àµ\8dà´±à´\82വരàµ\81à´¤àµ\8dതാൻ à´\88 à´«àµ\8bà´\82 à´ªàµ\82à´°à´¿à´ªàµ\8dപിà´\9aàµ\8dà´\9aàµ\81 à´¨àµ½à´\95àµ\81à´\95. à´®à´¾à´±àµ\8dà´±à´\82 à´¸àµ\8dഥിരàµ\80à´\95à´°à´¿à´\95àµ\8dà´\95ാനായി à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´°à´¹à´¸àµ\8dയവാà´\95àµ\8dà´\95àµ\8d à´\95àµ\82à´\9fàµ\86 à´¨àµ½à´\95àµ\87à´£àµ\8dà´\9fതാണàµ\8d.',
 'changeemail-no-info' => 'ഈ താൾ നേരിട്ടു കാണുന്നതിന് താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കണം.',
 'changeemail-oldemail' => 'ഇപ്പോഴത്തെ ഇമെയിൽ വിലാസം:',
 'changeemail-newemail' => 'പുതിയ ഇമെയിൽ വിലാസം:',
@@ -979,7 +987,8 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'updated' => '(പുതുക്കിയിരിക്കുന്നു)',
 'note' => "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
 'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''
-താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല! [[#editform|→ തിരുത്തൽ തുടരുക]]",
+താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല!",
+'continue-editing' => 'തിരുത്തൽ തുടരുക',
 'previewconflict' => 'ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ്‌ ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.',
 'session_fail_preview' => "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.''' 
 ദയവായി വീണ്ടും ശ്രമിക്കൂ.
@@ -1052,6 +1061,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'edit-no-change' => 'ഇപ്പോഴുള്ള സ്ഥിതിയിൽ നിന്നു യാതൊരു മാറ്റവും ഇല്ലാത്തതിനാൽ താങ്കളുടെ തിരുത്തലുകൾ തിരസ്കരിക്കപ്പെട്ടിരിക്കുന്നു.',
 'edit-already-exists' => 'പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.
 താൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.',
+'defaultmessagetext' => 'സ്വതേയുള്ള സന്ദേശ എഴുത്ത്',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.
@@ -1067,6 +1077,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' => 'ഈ തിരുത്തൽ താങ്കൾക്ക് തിരസ്ക്കരിക്കാവുന്നതാണ്‌. താഴെ കൊടുത്തിരിക്കുന്ന പതിപ്പുകൾ തമ്മിലുള്ള താരതമ്യം ഒന്നുകൂടി പരിശോധിച്ച് ഈ പ്രവൃത്തി ചെയ്യണോ എന്ന് ഒന്നുകൂടി ഉറപ്പാക്കുക. ഉറപ്പാണെങ്കിൽ തിരുത്തൽ തിരസ്ക്കരിക്കുവാൻ താൾ സേവ് ചെയ്യുക.',
@@ -1214,7 +1228,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'ഒതുക്കൽ രേഖ',
 'suppressionlogtext' => 'കാര്യനിർവാഹകരിൽ നിന്നും മറയ്ക്കപ്പെട്ടിട്ടുള്ള മായ്ക്കുകയും തടയുകയും ചെയ്തതുമായ ഉള്ളടക്കങ്ങളുടെ പട്ടിക നൽകിയിരിക്കുന്നു.
-à´\87à´ªàµ\8dà´ªàµ\8bൾ à´\95àµ\88à´\95ാരàµ\8dà´¯à´\82 à´\9aàµ\86à´¯àµ\8dയാൻ à´ªà´±àµ\8dà´±àµ\81à´¨àµ\8dà´¨ à´¨à´¿à´°àµ\8bധനà´\99àµ\8dà´\99à´³àµ\81à´\82 à´¤à´\9fയലàµ\81à´\95à´³àµ\81à´\82 à´\95ാണാൻ [[Special:BlockList|à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´\90.പി. à´µà´¿à´²à´¾à´¸à´\99àµ\8dà´\99ൾ]] കാണുക.',
+à´\87à´ªàµ\8dà´ªàµ\8bൾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´³àµ\8dà´³ à´¨à´¿à´°àµ\8bധനà´\99àµ\8dà´\99à´³àµ\81à´\82 à´¤à´\9fയലàµ\81à´\95à´³àµ\81à´\82 à´\95ാണാൻ [[Special:BlockList|à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´µ]] കാണുക.',
 
 # History merging
 'mergehistory' => 'താളുകളുടെ നാൾവഴികൾ സം‌യോജിപ്പിക്കുക',
@@ -1247,7 +1261,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1" എന്ന താളിന്റെ നാൾവഴി',
-'difference' => '(തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം)',
+'difference-title' => '"$1" എന്ന താളിന്റെ പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം',
+'difference-title-multipage' => '"$1", "$2" എന്നീ താളുകൾ തമ്മിലുള്ള വ്യത്യാസം',
 'difference-multipage' => '(താളുകൾ തമ്മിലുള്ള വ്യത്യാസം)',
 'lineno' => 'വരി $1:',
 'compareselectedversions' => 'തിരഞ്ഞെടുത്ത പതിപ്പുകൾ തമ്മിലുള്ള വ്യത്യാസം കാണുക',
@@ -1272,7 +1287,7 @@ $1",
 'prevn-title' => 'മുൻപത്തെ {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}',
 'nextn-title' => 'അടുത്ത {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}}',
 'shown-title' => '{{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} വീതം താളിൽ കാണിക്കുക',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2 {{int:pipe-separator}} $3 മാറ്റങ്ങൾ കാണുക)',
+'viewprevnext' => '$1 {{int:pipe-separator}} $2 എണ്ണം കാണുക ($3)',
 'searchmenu-legend' => 'തിരച്ചിൽ ഉപാധികൾ',
 'searchmenu-exists' => "'''\"[[:\$1]]\" എന്ന തലക്കെട്ടിൽ ഒരു താൾ ഈ വിക്കിയിൽ നിലവിലുണ്ട്'''",
 'searchmenu-new' => "'''ഈ വിക്കിയിൽ \"[[:\$1]]\" താൾ നിർമ്മിക്കുക!'''",
@@ -1342,6 +1357,7 @@ $1",
 'prefs-beta' => 'പരീക്ഷണാടിസ്ഥാനത്തിലുള്ള സൗകര്യങ്ങൾ',
 'prefs-datetime' => 'ദിവസവും സമയവും',
 'prefs-labs' => 'പരീക്ഷണശാലയിൽ തയ്യാറാകുന്ന സൗകര്യങ്ങൾ',
+'prefs-user-pages' => 'ഉപയോക്തൃതാളുകൾ',
 'prefs-personal' => 'അഹം',
 'prefs-rc' => 'സമീപകാല മാറ്റങ്ങൾ',
 'prefs-watchlist' => 'ശ്രദ്ധിക്കുന്നവ',
@@ -1559,7 +1575,7 @@ $1",
 
 # User rights log
 'rightslog' => 'ഉപയോക്തൃ അവകാശ രേഖ',
-'rightslogtext' => 'à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99ൾ à´\95ാണിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´\92à´°àµ\81 à´²àµ\8bà´\97ാണിത്.',
+'rightslogtext' => 'à´\88 à´ªàµ\8dരവർതàµ\8dതനരàµ\87à´\96 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´µà´\95ാശà´\99àµ\8dà´\99ൾà´\95àµ\8dà´\95àµ\81à´£àµ\8dà´\9fായ à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\87താണ്.',
 'rightslogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $2 എന്നതിൽ നിന്നു $3 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
 'rightslogentry-autopromote' => '$2 എന്നതിൽ നിന്ന് $3 എന്നതിലേയ്ക്ക് സ്വയം ഉയർത്തിയിരിക്കുന്നു',
 'rightsnone' => '(ഒന്നുമില്ല)',
@@ -1605,7 +1621,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|ഒരു മാറ്റം|$1 മാറ്റങ്ങൾ}}',
 'recentchanges' => 'സമീപകാല മാറ്റങ്ങൾ',
 'recentchanges-legend' => 'സമീപകാല മാറ്റങ്ങളുടെ ക്രമീകരണം',
-'recentchangestext' => '{{SITENAME}} സംരംഭത്തിലെ ഏറ്റവും പുതിയ മാറ്റങ്ങൾ ഇവിടെ കാണാം.',
+'recentchanges-summary' => '{{SITENAME}} സംരംഭത്തിലെ ഏറ്റവും പുതിയ മാറ്റങ്ങൾ ഇവിടെ കാണാം.',
 'recentchanges-feed-description' => 'ഈ ഫീഡ് ഉപയോഗിച്ച് വിക്കിയിലെ പുതിയ മാറ്റങ്ങൾ നിരീക്ഷിക്കുക.',
 'recentchanges-label-newpage' => 'ഒരു പുതിയ താൾ സൃഷ്ടിച്ചിരിക്കുന്നു',
 'recentchanges-label-minor' => 'ഇതൊരു ചെറിയ തിരുത്താണ്',
@@ -1800,6 +1816,23 @@ $1',
 'backend-fail-read' => '$1 എന്ന പ്രമാണം വായിക്കാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-create' => '$1 എന്ന പ്രമാണം സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-maxsize' => '{{PLURAL:$2|$2 ബൈറ്റ്സിലും|$2 ബൈറ്റിലും}} വലുതാണെന്ന കാരണത്താൽ $1 എന്ന പ്രമാണം സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-readonly' => 'സംഭരണ ബാക്കെൻഡ് "$1" ഇപ്പോൾ കാണൽ-മാത്രം (read-only) രീതിയിലാണ്. നൽകിയിരിക്കുന്ന കാരണം: "\'\'$2\'\'"',
+'backend-fail-synced' => 'ആന്തരിക ശേഖരണ ബാക്കെൻഡിൽ പ്രമാണം "$1" അസ്ഥിരാവസ്ഥയിലാണുള്ളത്',
+'backend-fail-connect' => '"$1"  ശേഖരണ ബാക്കെൻഡുമായി ബന്ധപ്പെടാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-internal' => '"$1" എന്ന സ്റ്റോറേജ് ബാക്കെൻഡിൽ അപരിചിതമായ പിഴവ് സംഭവിച്ചു.',
+'backend-fail-contenttype' => '"$1" എന്നതിൽ സംഭരിച്ചിരിക്കുന്ന പ്രമാണത്തിന്റെ ഉള്ളടക്ക തരം നിർണ്ണയിക്കാനായില്ല.',
+'backend-fail-usable' => 'ആവശ്യമായത്ര അനുമതിയില്ലാത്തതു കൊണ്ടോ ഡയറക്റ്ററികൾ/കണ്ടൈനറുകൾ ഇല്ലാത്തതു കൊണ്ടോ പ്രമാണം $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) പരിശോധനകൾക്കായി പ്രമാണം തുറന്നപ്പോൾ പിഴവുണ്ടായി.',
@@ -1917,6 +1950,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'shared-repo-from' => '$1 സംരംഭത്തിൽ നിന്ന്',
 'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
 'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
+'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
 
 # File reversion
 'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
@@ -1996,7 +2030,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]] എന്ന താളിൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ട ഒരു ഫലകം ഉപയോഗിക്കണം.',
 
@@ -2097,13 +2131,14 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'booksources-invalid-isbn' => 'തന്നിരിക്കുന്ന ഐ.എസ്.ബി.എൻ. സാധുവാണെന്നു തോന്നുന്നില്ല; യഥാർത്ഥ സ്രോതസ്സിൽ നിന്നും പകർത്തിയപ്പോൾ തെറ്റുപറ്റിയോ എന്നു പരിശോധിക്കുക',
 
 # Special:Log
-'specialloguserlabel' => 'à´\86വിഷàµ\8dà´\95ർതàµ\8dതാവàµ\8d:',
+'specialloguserlabel' => 'à´¨à´\9fà´ªàµ\8dപിലാà´\95àµ\8dà´\95ിയയാൾ:',
 'speciallogtitlelabel' => 'ലക്ഷ്യം (തലക്കെട്ട് അല്ലെങ്കിൽ ഉപയോക്താവ്) :',
 'log' => 'പ്രവർത്തനരേഖകൾ',
 'all-logs-page' => 'എല്ലാ പൊതുരേഖകളും',
 'alllogstext' => '{{SITENAME}} സംരംഭത്തിൽ ലഭ്യമായ വിവിധ പ്രവർത്തന രേഖകൾ ഈ താളിൽ ഒരുമിച്ച് കാണാം. താങ്കൾക്ക് രേഖകളുടെ സ്വഭാവം, ഉപയോക്തൃനാമം (കേസ് സെൻസിറ്റീവ്), ബന്ധപ്പെട്ട താൾ (കേസ് സെൻസിറ്റീവ്) മുതലായവ തിരഞ്ഞെടുത്ത് അന്വേഷണം കൂടുതൽ ക്ഌപ്തപ്പെടുത്താവുന്നതാണ്.',
 'logempty' => 'പ്രവർത്തനരേഖയിൽ ബന്ധമുള്ളവ ഇല്ല.',
 'log-title-wildcard' => 'ഈ വാക്കിൽ തുടങ്ങുന്ന തിരച്ചിൽ ഫലങ്ങൾ',
+'showhideselectedlogentries' => 'തിരഞ്ഞെടുത്ത രേഖാ വിവരങ്ങൾ പ്രദർശിപ്പിക്കുക/മറയ്ക്കുക',
 
 # Special:AllPages
 'allpages' => 'എല്ലാ താളുകളും',
@@ -2114,16 +2149,21 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'allpagesto' => 'ഇതിൽ അവസാനിക്കുന്ന താളുകൾ കാട്ടുക:',
 'allarticles' => 'എല്ലാ താളുകളും',
 'allinnamespace' => 'എല്ലാ താളുകളും ($1 നാമമേഖല)',
-'allnotinnamespace' => 'à´\8eà´²àµ\8dലാ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 ($1 à´¨à´¾à´®à´®àµ\87à´\96ലയിലലàµ\8dലാതàµ\8dതതàµ\8d)',
+'allnotinnamespace' => 'à´\8eà´²àµ\8dലാ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 ($1 à´¨à´¾à´®à´®àµ\87à´\96ലയിലലàµ\8dലാതàµ\8dതവ)',
 'allpagesprev' => 'മുമ്പത്തെ',
 'allpagesnext' => 'അടുത്തത്',
 'allpagessubmit' => 'പോകൂ',
-'allpagesprefix' => 'à´ªàµ\82ർവàµ\8dവപദമàµ\81à´³àµ\8dà´³ താളുകൾ പ്രദർശിപ്പിക്കുക:',
+'allpagesprefix' => 'à´\87à´\99àµ\8dà´\99à´¨àµ\86 à´¤àµ\81à´\9fà´\99àµ\8dà´\99àµ\81à´¨àµ\8dà´¨ താളുകൾ പ്രദർശിപ്പിക്കുക:',
 'allpagesbadtitle' => 'താളിനു നൽകിയ തലക്കെട്ട് അസാധുവാണ്‌ അല്ലെങ്കിൽ അന്തർഭാഷയ്ക്കുള്ളതോ അന്തർവിക്കിയ്ക്കുള്ളതോ ആയ പൂർവ്വപദം ഉപയോഗിച്ചിരിക്കുന്നു.
 തലക്കെട്ടിൽ ഉപയോഗിക്കാൻ പാടില്ലാത്ത ഒന്നോ അതിലധികമോ ലിപികൾ ഇതിലുണ്ടാകാം.',
 '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|വർഗ്ഗത്തിൽ|വർഗ്ഗങ്ങളിൽ}} താളുകളും പ്രമാണങ്ങളുമുണ്ട്.
@@ -2153,7 +2193,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'listusersfrom' => 'ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക:',
 'listusers-submit' => 'പ്രദർശിപ്പിക്കുക',
 'listusers-noresult' => 'ഈ സംഘത്തിൽ ഉൾപ്പെടുന്ന ഉപയോക്താക്കൾ ആരും ഇല്ല.',
-'listusers-blocked' => '(à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¤àµ\8d)',
+'listusers-blocked' => '(à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fàµ\81)',
 
 # Special:ActiveUsers
 'activeusers' => 'സജീവ ഉപയോക്താക്കളുടെ പട്ടിക',
@@ -2174,7 +2214,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 വ്യക്തിപരമായ അവകാശങ്ങളെ കുറിച്ച് [[{{MediaWiki:Listgrouprights-helppage}}|കൂടുതൽ വിവരങ്ങൾ]] ഉണ്ടാകാനിടയുണ്ട്.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">അവകാശം നൽകിയിരിക്കുന്നു</span>
 * <span class="listgrouprights-revoked">അവകാശം നീക്കിയിരിക്കുന്നു</span>',
-'listgrouprights-group' => 'വിഭാà´\97ം',
+'listgrouprights-group' => 'à´¸à´\82à´\98ം',
 'listgrouprights-rights' => 'അവകാശങ്ങൾ',
 'listgrouprights-helppage' => 'Help:സംഘാവകാശങ്ങൾ',
 'listgrouprights-members' => '(അംഗങ്ങളുടെ പട്ടിക)',
@@ -2241,7 +2281,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'notanarticle' => 'ലേഖന താൾ അല്ല',
 'notvisiblerev' => 'മറ്റൊരു ഉപയോക്താവ് സൃഷ്ടിച്ച അവസാനത്തെ നാൾപ്പതിപ്പ് മായ്ച്ചിരിക്കുന്നു',
 'watchnochange' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകൾ ഒന്നും തന്നെ ഇക്കാലയളവിൽ തിരുത്തപ്പെട്ടിട്ടില്ല.',
-'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 à´¤à´¾à´³àµ\81à´\95ൾ à´\85à´²àµ\8dലാതàµ\8dà´¤ {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
+'watchlist-details' => 'à´¸à´\82â\80\8cവാദà´\82 à´¤à´¾à´³àµ\81à´\95ൾ à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതാതàµ\86 {{PLURAL:$1|ഒരു താൾ|$1 താളുകൾ}} താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയിലുണ്ട്.',
 'wlheader-enotif' => '* ഇമെയിൽ വിജ്ഞാപനം സാധ്യമാക്കിയിരിക്കുന്നു.',
 'wlheader-showupdated' => "* താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം തിരുത്തപ്പെട്ട താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
 'watchmethod-recent' => 'ശ്രദ്ധിക്കുന്ന താളുകൾക്കുവേണ്ടി പുതിയ മാറ്റങ്ങൾ പരിശോധിക്കുന്നു',
@@ -2332,9 +2372,9 @@ $UNWATCHURL
 'rollbacklink' => 'റോൾബാക്ക്',
 'rollbackfailed' => 'റോൾബാക്ക് പരാജയപ്പെട്ടു',
 'cantrollback' => 'തിരുത്തൽ തിരസ്കരിക്കുവാൻ സാധിക്കുകയില്ല. ഒരു ഉപയോക്താവ് മാത്രമാണ് ഈ താളിൽ സം‌ഭാവന ചെയ്തിരിക്കുന്നത്.',
-'alreadyrolled' => '[[:$1]] എന്ന താളിൽ [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) നടത്തിയ തിരുത്തലുകൾ മുൻപ്രാപനം ചെയ്യാൻ സാധിക്കുന്നതല്ല. മറ്റാരോ താൾ തിരുത്തുകയോ മുൻപ്രാപനം ചെയ്യുകയോ ചെയ്തിരിക്കുന്നു.
+'alreadyrolled' => '[[:$1]] എന്ന താളിൽ [[User:$2|$2]] ([[User talk:$2|സംവാദം]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) നടത്തിയ തിരുത്തലുകൾ മുൻപ്രാപനം ചെയ്യാൻ സാധിക്കുന്നതല്ല. മറ്റാരോ താൾ തിരുത്തുകയോ മുൻപ്രാപനം ചെയ്യുകയോ ചെയ്തിരിക്കുന്നു.
 
-താളിലെ അവസാന തിരുത്തൽ ചെയ്തിരിക്കുന്നത് [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ആണ്.',
+താളിലെ അവസാന തിരുത്തൽ ചെയ്തിരിക്കുന്നത് [[User:$3|$3]] ([[User talk:$3|സംവാദം]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ആണ്.',
 'editcomment' => "തിരുത്തലിന്റെ ചുരുക്കം: \"''\$1''\" എന്നായിരുന്നു.",
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|സംവാദം]]) നടത്തിയ തിരുത്തലുകൾ നീക്കം ചെയ്തിരിക്കുന്നു; നിലവിലുള്ള പതിപ്പ് [[User:$1|$1]] സൃഷ്ടിച്ചതാണ്',
 'revertpage-nouser' => '(ഉപയോക്തൃനാമം നീക്കിയിരിക്കുന്നു) നടത്തിയ തിരുത്തലുകൾ [[User:$1|$1]] സൃഷ്ടിച്ച അവസാന പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്തിരിക്കുന്നു',
@@ -2386,7 +2426,7 @@ $UNWATCHURL
 'protect-othertime' => 'മറ്റ് കാലാവധി:',
 'protect-othertime-op' => 'മറ്റു കാലയളവ്',
 'protect-existing-expiry' => 'നിലവിലെ കാലാവധി: $3, $2',
-'protect-otherreason' => 'മറàµ\8dà´±àµ\81à´³àµ\8dà´³/à´ªàµ\81റമàµ\87à´¯àµ\81à´³àµ\8dà´³ കാരണം:',
+'protect-otherreason' => 'മറàµ\8dà´±àµ\8d/à´\95àµ\82à´\9fàµ\81തൽ കാരണം:',
 'protect-otherreason-op' => 'മറ്റ് കാരണം',
 'protect-dropdown' => '*സംരക്ഷിക്കാനുള്ള കാരണങ്ങൾ
 ** അമിതമായ നശീകരണപ്രവർത്തനങ്ങൾ
@@ -2557,7 +2597,7 @@ $1',
 'badipaddress' => 'അസാധുവായ ഐ.പി. വിലാസം.',
 'blockipsuccesssub' => 'തടയൽ വിജയിച്ചിരിക്കുന്നു',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] എന്ന ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു.<br />
-à´¤à´\9fയൽ à´ªàµ\81à´¨à´\83പരിശàµ\8bധിà´\95àµ\8dà´\95ാൻ [[Special:BlockList|à´\90.പി. à´¤à´\9fയൽ à´ªà´\9fàµ\8dà´\9fà´¿à´\95]] à´\95ാണàµ\81à´\95.',
+തടയൽ പുനഃപരിശോധിക്കാൻ [[Special:BlockList|തടയൽ പട്ടിക]] കാണുക.',
 'ipb-blockingself' => 'താങ്കൾ താങ്കളെ തന്നെ തടയാൻ പോകുകയാണ്! അത് ചെയ്യണം എന്ന് താങ്കൾക്കുറപ്പാണോ?',
 'ipb-confirmhideuser' => 'താങ്കൾ "ഉപയോക്താവിനെ മറച്ചുകൊണ്ട്" ഒരു തടയൽ ചെയ്യാൻ പോവുകയാണ്. ഇത് എല്ലാ പട്ടികകളിൽ നിന്നും രേഖകളിൽ നിന്നും ഉപയോക്താവിന്റെ പേര് മറച്ച് വെയ്ക്കും. ഇപ്രകാരം വേണമെന്ന് തീർച്ചയാണോ?',
 'ipb-edit-dropdown' => 'തടഞ്ഞതിന്റെ കാരണം തിരുത്തുക',
@@ -2601,7 +2641,7 @@ $1',
 'change-blocklink' => 'തടയലിൽ മാറ്റം വരുത്തുക',
 'contribslink' => 'സംഭാവനകൾ',
 'emaillink' => 'ഇമെയിൽ അയയ്ക്കുക',
-'autoblocker' => 'താങ്കളുടെ ഐ.പി. വിലാസം "[[User:$1|$1]]" എന്ന ഉപയോക്താവ് ഈ അടുത്ത് ഉപയോഗിക്കുകയും പ്രസ്തുത ഉപയോക്താവിനെ വിക്കിയിൽ നിന്നു തടയുകയും ചെയ്തിട്ടുള്ളതാണ്‌. അതിനാൽ താങ്കളും യാന്ത്രികമായി തടയപ്പെട്ടിരിക്കുന്നു. $1ന്റെ തടയലിനു സൂചിപ്പിക്കപ്പെട്ട കാരണം "$2" ആണ്‌.',
+'autoblocker' => 'താങ്കളുടെ ഐ.പി. വിലാസം "[[User:$1|$1]]" എന്ന ഉപയോക്താവ് ഈ അടുത്ത് ഉപയോഗിക്കുകയും പ്രസ്തുത ഉപയോക്താവിനെ വിക്കിയിൽ നിന്നു തടയുകയും ചെയ്തിട്ടുള്ളതാണ്‌. അതിനാൽ താങ്കളും യാന്ത്രികമായി തടയപ്പെട്ടിരിക്കുന്നു. $1 എന്ന ഉപയോക്താവിന്റെ തടയലിനു സൂചിപ്പിക്കപ്പെട്ട കാരണം "$2" എന്നാണ്‌.',
 'blocklogpage' => 'തടയൽ രേഖ',
 'blocklog-showlog' => 'ഈ ഉപയോക്താവ് മുമ്പേ തടയപ്പെട്ടതാണ്.
 തടയൽ രേഖ അവലംബമായി താഴെ കൊടുത്തിരിക്കുന്നു:',
@@ -2609,7 +2649,7 @@ $1',
 അവലംബത്തിനായി ഒതുക്കൽ രേഖ താഴെ കൊടുത്തിരിക്കുന്നു:',
 'blocklogentry' => '$2 കാലത്തേക്കു [[$1]] എന്ന അംഗത്വത്തെ തടഞ്ഞിരിക്കുന്നു $3',
 'reblock-logentry' => '[[$1]] എന്ന ഉപയോക്താവിനുള്ള തടയൽ നിബന്ധനകൾ മാറ്റിയിരിക്കുന്നു, തടയൽ അവസാനിക്കുന്നത് $2 $3',
-'blocklogtext' => '{{SITENAME}} സംരംഭത്തിൽ പ്രവർത്തിക്കുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടഞ്ഞതിന്റേയും, പുനഃപ്രവർത്തനാനുമതി നൽകിയതിന്റേയും രേഖകൾ താഴെ കാണാം. {{SITENAME}} സംരംഭം സ്വയം  തടയുന്ന ഐ.പി. വിലാസങ്ങൾ ഈ പട്ടികയിലില്ല. [[Special:BlockList|തടയപ്പെട്ടിട്ടുള്ള ഐ.പി. വിലാസങ്ങളുടെ പട്ടിക]] എന്ന താളിൽ നിലവിലുള്ള നിരോധനങ്ങളേയും തടയലുകളേയും കാണാവുന്നതാണ്.',
+'blocklogtext' => 'ഉപയോക്താക്കളെ തടഞ്ഞതിന്റേയും, പുനഃപ്രവർത്തനാനുമതി നൽകിയതിന്റേയും രേഖകൾ താഴെ കാണാം. സ്വയം  തടയപ്പെടുന്ന ഐ.പി. വിലാസങ്ങൾ ഈ പട്ടികയിലില്ല. [[Special:BlockList|തടയപ്പെട്ടിട്ടുള്ളവയുടെ പട്ടിക]] എന്ന താളിൽ നിലവിലുള്ള നിരോധനങ്ങളേയും തടയലുകളേയും കാണാവുന്നതാണ്.',
 'unblocklogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ തടയൽ ഒഴിവാക്കിയിരിക്കുന്നു',
 'block-log-flags-anononly' => 'അജ്ഞാത ഉപയോക്താക്കളെ മാത്രം',
 'block-log-flags-nocreate' => 'അംഗത്വം സൃഷ്ടിക്കുന്നതും തടഞ്ഞിരിക്കുന്നു',
@@ -2739,10 +2779,10 @@ $1',
 'delete_and_move' => 'മായ്ക്കുകയും മാറ്റുകയും ചെയ്യുക',
 'delete_and_move_text' => '==താൾ മായ്ക്കേണ്ടിയിരിക്കുന്നു==
 
-താà´\99àµ\8dà´\95ൾ à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95ാൻ à´¶àµ\8dരമിà´\9aàµ\8dà´\9a "[[:$1]]" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´£àµ\8dà´\9fàµ\8d. à´\86 à´¤à´¾àµ¾ à´®à´¾à´¯àµ\8dà´\9aàµ\8dà´\9aàµ\8d à´ªàµ\81തിയ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\8d à´¨àµ½കേണ്ടതുണ്ടോ?',
+മാറàµ\8dറാനായി à´¨àµ½à´\95à´¿à´¯ "[[:$1]]" à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ à´¨à´¿à´²à´µà´¿à´²àµ\81à´£àµ\8dà´\9fàµ\8d. à´\88 à´®à´¾à´±àµ\8dà´±à´\82 à´¨à´\9fà´¤àµ\8dà´¤àµ\81à´¨àµ\8dനതിനàµ\81à´µàµ\87à´£àµ\8dà´\9fà´¿ à´\86 à´¤à´¾àµ¾ à´®à´¾à´¯àµ\8dà´\95àµ\8dകേണ്ടതുണ്ടോ?',
 'delete_and_move_confirm' => 'ശരി, താൾ നീക്കം ചെയ്യുക',
 'delete_and_move_reason' => '"[[$1]]" എന്നതിൽ നിന്നും മാറ്റാനുള്ള സൗകര്യത്തിനായി മായ്ച്ചു',
-'selfmove' => 'à´¸àµ\8dà´°àµ\8bതസàµ\8dസിനàµ\8dà´±àµ\86 à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81à´\82 à´²à´\95àµ\8dà´·àµ\8dയതàµ\8dതിനàµ\8dà´±àµ\86 à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81à´\82 à´\92à´¨àµ\8dനാണàµ\8dâ\80\8c. അതിനാൽ തലക്കെട്ടുമാറ്റം സാദ്ധ്യമല്ല.',
+'selfmove' => 'പഴയ à´¤à´²à´\95àµ\8dà´\95àµ\86à´\9fàµ\8dà´\9fàµ\81 à´¤à´¨àµ\8dà´¨àµ\86യാണàµ\8d à´®à´¾à´±àµ\8dറാനായി à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതàµ\8d; അതിനാൽ തലക്കെട്ടുമാറ്റം സാദ്ധ്യമല്ല.',
 'immobile-source-namespace' => '"$1" നാമമേഖലയിലെ താളുകൾ മാറ്റാൻ കഴിയില്ല',
 'immobile-target-namespace' => '"$1" നാമമേഖലയിലേയ്ക്ക് താളുകൾ മാറ്റാൻ കഴിയില്ല',
 'immobile-target-namespace-iw' => 'അന്തർവിക്കി കണ്ണി താൾ മാറ്റാനുള്ള സാധുവായ ലക്ഷ്യമല്ല.',
@@ -2951,12 +2991,28 @@ $1',
 
 # Stylesheets
 'common.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എല്ലാ ദൃശ്യരൂപങ്ങൾക്കും ബാധകമായിരിക്കും */',
+'standard.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സാർവത്രികം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'nostalgia.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ഗൃഹാതുരത്വം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'monobook.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'myskin.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. എന്റിഷ്ടം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'chick.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. സുന്ദരി ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'modern.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. വെക്റ്റർ ദൃശ്യരൂപത്തിനു ബാധകമായിരിക്കും*/',
+'noscript.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്., ജാവാസ്ക്രിപ്റ്റ് സജ്ജമാക്കിയിട്ടില്ലാത്ത ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-autoconfirmed.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. യാന്ത്രികമായി സ്ഥിരീകരിച്ച ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-bot.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */',
+'group-sysop.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */',
+'group-bureaucrat.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */',
 
 # Scripts
 'common.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് എല്ലാ ഉപയോക്താക്കൾക്കും, എല്ലാ താളുകളിലും പ്രവർത്തിക്കുന്നതായിരിക്കും */',
+'monobook.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് മോണോബുക്ക് ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
+'modern.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് നവീനം ദൃശ്യരൂപം ഉപയോഗിക്കുന്നവർക്ക് ബാധകമായിരിക്കും */',
 'vector.js' => '/*ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് വെക്റ്റർ ദൃശ്യരൂപം ഉപയോഗിക്കുന്ന ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും*/',
+'group-autoconfirmed.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾക്ക് ബാധകമായിരിക്കും */',
+'group-bot.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബോട്ടുകൾക്ക് ബാധകമായിരിക്കും */',
+'group-sysop.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് കാര്യനിർവാഹകർക്ക് ബാധകമായിരിക്കും */',
+'group-bureaucrat.js' => '/* ഇവിടെ നൽകുന്ന ജാവാസ്ക്രിപ്റ്റ് ബ്യൂറോക്രാറ്റുകൾക്ക് ബാധകമായിരിക്കും */',
 
 # Metadata
 'notacceptable' => 'താങ്കളുടെ ക്ലയന്റിനു മനസ്സിലാക്കാൻ പാകത്തിലുള്ള തരത്തിൽ വിവരങ്ങൾ നൽകാൻ വിക്കി സെർവറിനു ശേഷിയില്ല.',
@@ -2980,7 +3036,8 @@ $1',
 'spamprotectionmatch' => 'പാഴെഴുത്ത് അരിപ്പയെ ഉണർത്തിയ എഴുത്ത് താഴെ കൊടുത്തിരിക്കുന്നു: $1',
 'spambot_username' => 'മീഡിയാവിക്കിയിലെ പാഴെഴുത്ത് ശുദ്ധീകരണം',
 'spam_reverting' => '$1 എന്നതിലേയ്ക്കുള്ള കണ്ണികളില്ലാത്ത അവസാന നാൾപ്പതിപ്പിലേയ്ക്ക് മുൻപ്രാപനം ചെയ്യുന്നു',
-'spam_blanking' => '$1 എന്ന കണ്ണികളുള്ള നാൾപ്പതിപ്പുകളെല്ലാം ശൂന്യമാക്കുന്നു',
+'spam_blanking' => '$1 എന്നതിലേയ്ക്ക് കണ്ണികളുള്ള എല്ലാ നാൾപ്പതിപ്പുകളും ശൂന്യമാക്കുന്നു',
+'spam_deleting' => '$1 എന്നതിലേയ്ക്ക് കണ്ണികളുള്ള എല്ലാ നാൾപ്പതിപ്പുകളും മായ്ക്കുന്നു',
 
 # Info page
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
@@ -3058,7 +3115,7 @@ $1',
 'file-info-png-frames' => '{{PLURAL:$1|ഒരു ഫ്രെയിം|$1 ഫ്രെയിം}}',
 
 # Special:NewFiles
-'newimages' => 'à´ªàµ\81തിയ à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86 à´\97ാലറി',
+'newimages' => 'à´ªàµ\81തിയ à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86 à´\9aà´¿à´¤àµ\8dരശാല',
 'imagelisttext' => '$2 നൽകിയിട്ടുള്ള {{PLURAL:$1|പ്രമാണത്തിന്റെ|$1 പ്രമാണങ്ങളുടെ}} പട്ടിക താഴെ കാണാം.',
 'newimages-summary' => 'ചുരുക്കം',
 'newimages-legend' => 'അരിപ്പ',
@@ -3070,6 +3127,10 @@ $1',
 'sp-newimages-showfrom' => '$2, $1 നു ശേഷം അപ്‌ലോഡ് ചെയ്ത പ്രമാണങ്ങൾ പ്രദർശിപ്പിക്കുക',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1സെ',
+'minutes-abbrev' => '$1മി',
+'hours-abbrev' => '$1മ',
+'days-abbrev' => '$1ദി',
 'seconds' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
 'minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
@@ -3278,6 +3339,9 @@ $1',
 
 # EXIF attributes
 'exif-compression-1' => 'ചുരുക്കാത്തത്',
+'exif-compression-5' => 'എൽ.സെഡ്.ഡബ്ല്യു.',
+'exif-compression-6' => 'ജെപിഇജി (പഴയത്)',
+'exif-compression-7' => 'ജെപിഇജി',
 
 'exif-copyrighted-true' => 'പകർപ്പവകാശസംരക്ഷിതം',
 'exif-copyrighted-false' => 'പൊതുസഞ്ചയം',
@@ -3496,7 +3560,7 @@ $1',
 'confirmemail_noemail' => '[[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളുടെ കൂടെ]] സാധുവായൊരു ഇ-മെയിൽ വിലാസം സജ്ജീകരിച്ചിട്ടില്ല.',
 'confirmemail_text' => '{{SITENAME}} സം‌രംഭത്തിൽ ഇ-മെയിൽ സൗകര്യം ഉപയോഗിക്കണമെങ്കിൽ താങ്കൾ താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിന്റെ സാധുത തെളിയിച്ചിരിക്കണം. താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് സ്ഥിരീകരണ മെയിൽ അയക്കുവാൻ താഴെയുള്ള ബട്ടൺ അമർത്തുക. താങ്കൾക്ക് അയക്കുന്ന ഇ-മെയിലിൽ ഒരു സ്ഥിരീകരണ കോഡ് ഉണ്ട്. ആ കോഡിൽ അമർത്തിയാൽ താങ്കളുടെ വിലാസത്തിന്റെ സാധുത തെളിയിക്കപ്പെടും.',
 'confirmemail_pending' => 'താങ്കളുടെ അംഗത്വം ഈ അടുത്ത് ഉണ്ടാക്കിയതാണെങ്കിൽ,  ഒരു സ്ഥിരീകരണ കോഡ് താങ്കൾക്ക് ഇ-മെയിൽ ചെയ്തിട്ടുണ്ട്.  പുതിയ സ്ഥിരീകരണ കോഡ് ആവശ്യപ്പെടാൻ ശ്രമിക്കുന്നതിനു മുൻപ് ആദ്യത്തെ സ്ഥിരീകരണ കോഡിനായി കുറച്ച് സമയം കാത്തിരിക്കൂ.',
-'confirmemail_send' => 'സ്ഥിരീകരണ കോഡ് (confirmation code) മെയിൽ ചെയ്യുക',
+'confirmemail_send' => 'സ്ഥിരീകരണ കോഡ്  ഇമെയിലിൽ അയയ്ക്കുക',
 'confirmemail_sent' => 'സ്ഥിരീകരണ ഇ-മെയിൽ അയച്ചിരിക്കുന്നു.',
 'confirmemail_oncreate' => 'ഒരു സ്ഥിരീകരണ കോഡ് താങ്കളുടെ ഇ-മെയിൽ വിലാസത്തിലേക്ക് അയച്ചിട്ടുണ്ട്.
 ലോഗിൻ ചെയ്യുന്നതിനു ഈ കോഡ് ആവശ്യമില്ല. പക്ഷെ വിക്കിയിൽ ഇ-മെയിലുമായി ബന്ധപ്പെട്ട സേവനങ്ങൾ ഉപയോഗിക്കുന്നതിനു മുൻപ് പ്രസ്തുത കോഡ് ഉപയോഗിച്ച് ഇ-മെയിൽ സ്ഥിരീകരിച്ചിരിക്കണം.',
@@ -3562,6 +3626,8 @@ $5
 'confirmrecreate-noreason' => 'താങ്കൾ തിരുത്താനാരംഭിച്ചതിനു ശേഷം, ഉപയോക്താവ് [[User:$1|$1]] ([[User talk:$1|സംവാദം]]) ഈ താൾ മായ്ച്ചിരിക്കുന്നു. ഈ താൾ പുനഃസൃഷ്ടിക്കണം എന്നത് സ്ഥിരീകരിക്കുക.',
 'recreate' => 'പുനഃസൃഷ്ടിക്കുക',
 
+'unit-pixel' => 'ബിന്ദു',
+
 # action=purge
 'confirm_purge_button' => 'ശരി',
 'confirm-purge-top' => 'ഈ താളിന്റെ കാഷെ ക്ലീയർ ചെയ്യട്ടെ?',
@@ -3597,6 +3663,19 @@ $5
 'autoredircomment' => '[[$1]] എന്ന താളിലേക്ക് തിരിച്ചുവിടുന്നു',
 'autosumm-new' => "'$1' താൾ സൃഷ്ടിച്ചിരിക്കുന്നു",
 
+# Size units
+'size-bytes' => '$1 ബൈ',
+'size-kilobytes' => '$1 കെ.ബി.',
+'size-megabytes' => '$1 എം.ബി.',
+'size-gigabytes' => '$1 ജി.ബി.',
+'size-terabytes' => '$1 ടി.ബി.',
+
+# Bitrate units
+'bitrate-bits' => '$1ബി.പി.എസ്.',
+'bitrate-kilobits' => '$1കെ.ബി.പി.എസ്.',
+'bitrate-megabits' => '$1എം.ബി.പി.എസ്.',
+'bitrate-gigabits' => '$1ജി.ബി.പി.എസ്.',
+
 # Live preview
 'livepreview-loading' => 'ശേഖരിക്കുന്നു...',
 'livepreview-ready' => 'ശേഖരിച്ചുകൊണ്ടിരിക്കുന്നു… തയ്യാർ!',
@@ -3629,7 +3708,7 @@ $5
 
 # Watchlist editing tools
 'watchlisttools-view' => 'ബന്ധപ്പെട്ട മാറ്റങ്ങൾ കാട്ടുക',
-'watchlisttools-edit' => 'à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95 à´\95à´¾à´\9fàµ\8dà´\9fുക, തിരുത്തുക',
+'watchlisttools-edit' => 'à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95 à´\95ാണുക, തിരുത്തുക',
 'watchlisttools-raw' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയുടെ മൂലരൂപം തിരുത്തുക',
 
 # Signatures
@@ -3667,6 +3746,11 @@ $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 സ്ക്രിപ്റ്റ് പഥം]',
 
 # Special:FilePath
 'filepath' => 'പ്രമാണത്തിലേക്കുള്ള വിലാസം',
@@ -3790,9 +3874,9 @@ $5
 'revdelete-uname-unhid' => 'ഉപയോക്തൃനാമം മറച്ചത് ഒഴിവാക്കിയിരിക്കുന്നു',
 'revdelete-restricted' => 'കാര്യനിർവാഹകർക്ക് പ്രവർത്തന അതിരുകൾ ഏർപ്പെടുത്തിയിരിക്കുന്നു',
 'revdelete-unrestricted' => 'കാര്യനിർവാഹകർക്ക് ഏർപ്പെടുത്തിയ പ്രവർത്തന അതിരുകൾ നീക്കം ചെയ്തിരിക്കുന്നു',
-'logentry-move-move' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d $3 à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ $4 à´\86à´¯ി മാറ്റിയിരിക്കുന്നു',
+'logentry-move-move' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d $3 à´\8eà´¨àµ\8dà´¨ à´¤à´¾àµ¾ $4 à´\8eà´¨àµ\8dനാà´\95àµ\8dà´\95ി മാറ്റിയിരിക്കുന്നു',
 'logentry-move-move-noredirect' => '$3 എന്ന താൾ $4 എന്ന തലക്കെട്ടിലേയ്ക്ക് തിരിച്ചുവിടലില്ലാതെ $1 മാറ്റി',
-'logentry-move-move_redir' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനുമുകളിലേയ്ക്ക് മാറ്റിയിരിക്കുന്നു',
+'logentry-move-move_redir' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനു മുകളിലേയ്ക്ക് മാറ്റിയിരിക്കുന്നു',
 'logentry-move-move_redir-noredirect' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനുമുകളിലേയ്ക്ക്, തിരിച്ചുവിടൽ ഇല്ലാതെ മാറ്റിയിരിക്കുന്നു',
 'logentry-patrol-patrol' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
 'logentry-patrol-patrol-auto' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 സ്വതേ അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
@@ -3856,4 +3940,15 @@ $5
 'api-error-uploaddisabled' => 'ഈ വിക്കിയിൽ അപ്‌ലോഡിങ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുകയാണ്.',
 'api-error-verification-error' => 'ഈ പ്രമാണത്തിൽ പിഴവുണ്ട്, അല്ലെങ്കിൽ തെറ്റായ എക്സ്‌റ്റെൻഷനാണുള്ളത്.',
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|ഒരു സെക്കന്റ്|$1 സെക്കന്റ്}}',
+'duration-minutes' => '{{PLURAL:$1|ഒരു മിനിറ്റ്|$1 മിനിറ്റ്}}',
+'duration-hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
+'duration-days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
+'duration-weeks' => '{{PLURAL:$1|ഒരു ആഴ്ച്ച|$1 ആഴ്ച്ച}}',
+'duration-years' => '{{PLURAL:$1|ഒരു വർഷം|$1 വർഷം}}',
+'duration-decades' => '{{PLURAL:$1|ഒരു ദശാബ്ദം|$1 ദശാബ്ദം}}',
+'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
+'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
+
 );
index 7d8b499..614cd34 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Mongolian (Ð\9cонгол)
+/** Mongolian (монгол)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -303,7 +303,7 @@ $1',
 'ok' => 'OK',
 'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" хуудаснаас авсан',
-'youhavenewmessages' => 'Таньд $1 ($2) байна.',
+'youhavenewmessages' => 'Таньд $1 ($2) байна.',
 'newmessageslink' => 'шинэ мессеж',
 'newmessagesdifflink' => 'сүүлийн өөрчлөлт',
 'youhavenewmessagesmulti' => 'Таньд $1 дээр шинэ мессеж ирсэн байна',
@@ -316,7 +316,7 @@ $1',
 'toc' => 'Агуулга',
 'showtoc' => 'үзүүлэх',
 'hidetoc' => 'нуух',
-'collapsible-collapse' => 'ЭвÑ\85Ñ\8dх',
+'collapsible-collapse' => 'Ð\91Ñ\83Ñ\83лгах',
 'collapsible-expand' => 'Тэлэх',
 'thisisdeleted' => '$1-г харах эсвэл сэргээх үү?',
 'viewdeleted' => '$1-г харах уу?',
@@ -402,8 +402,8 @@ $1',
 'cannotdelete-title' => '"$1" хуудсыг устгаж чадсангүй',
 'badtitle' => 'Болохгүй гарчиг',
 'badtitletext' => 'Оруулсан хуудасны нэр тань хүчингүй, хоосон, эсвэл буруу холбосон интер-хэл буюу интер-викигийн нэр байна. Нэрэнд хэрэглэгдэж болохгүй тэмдэгт орсон байж болзошгүй.',
-'perfcached' => 'Дараах тоо баримт нь нөөц хуулбар учраас хуучирсан мэдээлэлтэй байж магадгүй. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Дараах тоо баримт нөөц хуулбар бөгөөд хамгийн сүүлд $1-д шинэчлэгдсэн. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Дараах тоо баримт нь нөөц хуулбар учраас хуучирсан мэдээлэлтэй байж магадгүй. Дээд тал нь {{PLURAL:$1|нэг илэрц|$1 илэрцүүд}} нөөцөд бэлэн байна.',
+'perfcachedts' => 'Дараах тоо баримт нь нөөц хуулбар учраас хуучирсан мэдээлэлтэй байж магадгүй. Дээд тал нь {{PLURAL:$1|нэг илэрц|$1 илэрцүүд}} нөөцөд бэлэн байна.',
 'querypage-no-updates' => 'Одоогийн байдлаар энэ хуудсанд шинэчлэлүүд хаагдсан байна. Энд байгаа тоо баримт одоохондоо сэргээгдэхгүй.',
 'wrong_wfQuery_params' => 'wfQuery()-д буруу параметр оруулсан байна<br />
 Функц: $1<br />
@@ -477,7 +477,7 @@ $2',
 'nocookieslogin' => '{{SITENAME}}-д нэвтрэхэд күүкиг хэрэглэдэг.
 Та күүкиг идэвхижүүлээгүй байна.
 Түүнийг идэвхижүүлж дахин оролдоно уу.',
-'nocookiesfornew' => 'Ð\9aүүкийг Ð°Ñ\88иглаж Ð±Ð°Ð¹Ð³Ð°Ð° Ñ\8dÑ\81Ñ\8dÑ\85ийг Ñ\88алгаж Ò¯Ð·Ð½Ñ\8d Ò¯Ò¯. Ð¥Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87ийн Ñ\8dÑ\85 Ñ\81Ñ\83Ñ\80валжийг Ð±Ð°Ñ\82алгаажÑ\83Ñ\83лж Ñ\87адÑ\81ангүй Ñ\82Ñ\83л Ð±Ò¯Ñ\80Ñ\82гÑ\8dл Ñ\85ийгдÑ\81Ñ\8dнгүй.',
+'nocookiesfornew' => 'Ð¥Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87ийн Ð±Ò¯Ñ\80Ñ\82гÑ\8dл Ñ\85ийгдÑ\81Ñ\8dнгүй. Ð\9aүүкийг Ð·Ó©Ð² Ñ\82оÑ\85иÑ\80Ñ\83Ñ\83лÑ\81ан Ñ\8dÑ\81Ñ\8dÑ\85ийг Ñ\88алгаад Ñ\8dнÑ\8d Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ð°Ñ\85ин Ñ\83нÑ\88Ñ\83Ñ\83лааÑ\80ай.',
 'noname' => 'Та хүчинтэй хэрэглэгчийн нэрийг өгөөгүй байна.',
 'loginsuccesstitle' => 'Амжилттай нэвтэрлээ',
 'loginsuccess' => "'''Та {{SITENAME}} руу \"\$1\" нэрээр нэвтэрлээ.'''",
@@ -496,11 +496,11 @@ $2',
 'password-login-forbidden' => 'Ийм хэрэглэгчийн, нууц үгээр нэвтрэхийг хориглож байна.',
 'mailmypassword' => 'Мэйл хаягаар шинэ нууц үгийг илгээ',
 'passwordremindertitle' => '{{SITENAME}}-д нэвтрэх түр зуурын шинэ нууц үг',
-'passwordremindertext' => 'Хэн нэгэн (магадгүй та, IP хаяг нь $1) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. Түр нууц үг "$3" хэрэглэгч "$2"-д олгогдлоо.
-Хэрэв та үүнийг хүссэн бол холбогдож шинэ нууц үгээ одоо сонгоно уу.
-Таны түр зуурын нууц үг {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа цуцлагдах болно.
+'passwordremindertext' => 'Хэн нэгэн (магадгүй та, $1 гэх IP хаягаас) {{SITENAME}} ($4) хуудсанд нэвтрэх шинэ нууц үг явуулах хүсэлтийг тавьсан байна. "$3" гэсэн түр хугацаанд хэрэглэж болох нууц үгийг хэрэглэгч "$2"-д олгов.
+Хэрэв та ингэхийг хүссэн бол нэвтэрч ороод шинэ нууц үгээ сонгоно уу.
+Таны түр зуурын нууц үгний хугацаа {{PLURAL:$5|нэг өдрийн|$5 өдрийн}} дараа дуусах болно.
 
-Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ санаж солихыг хүсэхгүй байгаа бол та энэ мэйлийг тоохгүйгээр хуучин нууц үгээ хэвээр хэрэглэж болно.',
+Хэрэв энэ хүсэлтийг өөр хүн тавьсан, эсвэл та хуучин нууц үгээ олоод, солихыг хүсэхгүй байгаа бол та энэ мэйлийг үл ойшоон хуучин нууц үгээ хэрэглэсэн хэвээр байж болно.',
 'noemail' => 'Хэрэглэгч "$1" нь мэйл хаягаа бүртгүүлээгүй байна.',
 'noemailcreate' => 'Та хүчинтэй и-мэйл хаягаа өгөх ёстой',
 'passwordsent' => '"$1"-н бүртгүүлсэн мэйл хаяг руу шинэ нууц үг илгээгдлээ.
@@ -524,10 +524,10 @@ $2',
 'accountcreated' => 'Бүртгэл үүсгэгдлээ',
 'accountcreatedtext' => '$1 хэрэглэгчийн бүртгэл үүсгэгдлээ.',
 'createaccount-title' => '{{SITENAME}}-н бүртгэлийн үүсгэл',
-'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" нэртэй, "$3" нууц үгтэй бүртгэлийг энэ мэйл хаягт үүсгэжээ.
+'createaccount-text' => 'Хэн нэгэн {{SITENAME}}-д ($4) "$2" гэсэн нэрээр, "$3" гэсэн нууц үгтэйгээр таны мэйл хаягийг ашиглан бүртгүүлжээ.
 Та одоо нэвтэрч өөрийн нууц үгээ солих хэрэгтэй.
 
-Хэрэв энэ бүртгэлийг алдаа гаргаж үүсгэсэн бол энэ мэдэгдлийг үл ойшоож болно.',
+Хэрэв буруугаар бүртгүүлсэн бол энэ мэдэгдлийг үл ойшоож болно.',
 'usernamehasherror' => 'Хэрэглэгчийн нэрэнд хаш тэмдэгт орж болохгүй',
 'login-throttled' => 'Та хэт олон удаа нэвтрэх гэж оролдсон байна.
 Хүлээж байгаад дахин оролдого уу.',
@@ -572,7 +572,7 @@ $2',
 'passwordreset-emailtitle' => '{{SITENAME}}-н бүртгэлийн мэдээлэл',
 'passwordreset-emailelement' => 'Хэрэглэгчийн нэр: $1
 Түр зуурын нууц үг: $2',
-'passwordreset-emailsent' => 'СанÑ\83Ñ\83лгÑ\8bн Ñ\86аÑ\85им Ñ\88Ñ\83Ñ\83дан Ñ\8fвÑ\83Ñ\83ллаа.',
+'passwordreset-emailsent' => 'Танд Ñ\81анамж Ð±Ð¾Ð»Ð³Ð¾Ð½ Ð½Ñ\8dг Ð¸Ð¼Ð°Ð¹Ð» Ñ\8fвÑ\83Ñ\83ллаа',
 'passwordreset-emailsent-capture' => 'Доор харуулснаар цахим шуудангийн сануулгыг явууллаа.',
 'passwordreset-emailerror-capture' => 'Цахим шуудангийн сануулга доор харуулсны дагуу хийгдсан боловч $1 хэрэглэгчид хүрч чадсангүй, алдаа гарлаа.',
 
@@ -685,11 +685,12 @@ $2',
 'userpage-userdoesnotexist-view' => '"$1" гэсэн хэрэглэгч бүртгэгдээгүй байна.',
 'blocked-notice-logextract' => 'Энэхүү хэрэглэгч одоогоор түгжигдсэн байна.
 Лавлагааны зориулалтаар түгжээний лог дээрх хамгийн сүүлийн нэмэлтийг доор оруулав:',
-'clearyourcache' => "'''Санамж - Хадгалсныхаа дараа шинэ тохиргоогоо харахын тулд вэб хөтөчийнхөө хийсвэр санах ойг орхих хэрэгтэй болж магадгүй.'''
-'''Файрфокс / Сафари:''' ''Shift''-г дарж байхдаа ''Reload'' дээр дарах, эсвэл ''Ctrl-F5'' буюу ''Ctrl-R'' гэж дарах (Макинтош дээр ''Command-R'');
-'''Конкерор: ''' ''Reload'' товч дээр дар, эсвэл ''F5''-г дар;
-'''Опера:''' ''Tools→Preferences'' дээр хийсвэр санах ойг бүрэн арилгах;
-'''Интернэт Эксплорер:''' ''Ctrl'' -г дарж байхдаа ''Refresh'' дээр дар, эсвэл ''Ctrl-F5'' гэж дар.",
+'clearyourcache' => "'''Санамж - Хадгалсныхаа дараа шинэ тохиргоогоо харахын тулд вэб хөтөчийнхөө хийсвэр санах ойг орхих хэрэгтэй болж магадгүй.
+* '''Google Chrome хөтчид :''' ''Ctrl-Shift-R'' товч дээр зэрэг дарна ( Макитош компьютерүүдэд ''⌘-Shift-R'' дээр дарна)
+* '''Internet Explorer хөтчид :'''  ''Ctrl'' дээр дараастай байж байгаад ''Refresh'' дээр дарна, эсвэл ''Ctrl-F5'' дээр дарна
+* '''Konqueror веб хөтчид :''' ''Reload'' товч дээр эсвэл ''F5'' дээр дарна
+* '''Opera веб хөтчид :''' ''Tools → Preferences'' руу орж дундын нөөцлөгчийг хоослоорой
+\\",
 'usercssyoucanpreview' => "'''Зөвлөгөө:''' \"{{int:showpreview}}\" товчийг ашиглан та өөрийн шинэ CSS-г хадгалахаасаа өмнө шалгах боломжтой.",
 'userjsyoucanpreview' => "'''Зөвлөгөө:''' \"{{int:showpreview}}\" товчийг ашиглан та өөрийн шинэ ЖаваСкриптийг хадгалахаасаа өмнө шалгах боломжтой.",
 'usercsspreview' => "'''Та өөрийн хэрэглэгчийн CSS-г зөвхөн урьдчилан харж байгаа гэдгээ санаарай.'''
@@ -703,7 +704,9 @@ $2',
 Өөрсдийн .css болон .js хуудсуудыг нэрлэхэд жижиг үсэг хэрэглэдэг болохыг сануулж байна. Жишээ нь: {{ns:user}}:Foo/vector.css гэж л хэрэглэх бөгөөд {{ns:user}}:Foo/Vector.css гэхгүй.",
 'updated' => '(Шинэчлэгдсэн)',
 'note' => "'''Анхааруулга:'''",
-'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал; засварууд одоохондоо хадгалагдаагүй байна!'''",
+'previewnote' => "'''Энэ бол зөвхөн урьдчилж харсан байдал.'''
+Таны хийсэн өөрчлөлтүүдийг одоохондоо хадгалаагүй байгаа!",
+'continue-editing' => 'Үргэлжлүүлэн янзлах',
 'previewconflict' => 'Энэ урьдчилж харсан байдал нь дээд талын засварлах талбарын текстийг хадгалахад харагдах байдлыг харуулна.',
 'session_fail_preview' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй. Дахин оролдож үзнэ үү. Ингээд ч болохгүй байвал сайтаас гарч дахин нэвтэрч орж үзнэ үү.'''",
 'session_fail_preview_html' => "'''Уучлаарай! Мэдээлэл алдагдснаас болж таны засварыг боловсруулж чадсангүй.'''
@@ -716,6 +719,7 @@ $2',
 Энэ нь алдаа ихтэй вэбийн нэргүй прокси хэрэглэх үед заримдаа гардаг.'''",
 'edit_form_incomplete' => "'''Таны хийсэн өөрлөлтийн зарим хэсэг нь серверт хүрээгүй бололтой, алдаатай эсэхийг шалгаад дахин оролдоно уу'''",
 'editing' => '$1-г засварлаж байна',
+'creating' => '$1-г үүсгэж байна',
 'editingsection' => '$1-г засварлаж байна (хэсэг)',
 'editingcomment' => '$1-г засварлаж байна (шинэ хэсэг)',
 'editconflict' => 'Засварын зөрөлдөөн боллоо: $1',
@@ -795,7 +799,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Эдгээр аргументуудыг тооцсонгүй.",
 'post-expand-template-argument-category' => 'Орхигдсон загварын аргументуудтай хуудаснууд',
 'parser-template-loop-warning' => 'Загвар тойрч буйг тогтоов: [[$1]]',
-'parser-template-recursion-depth-warning' => 'Загварын рекурсийн гүний хязгаараас ихэдлээ ($1)',
+'parser-template-recursion-depth-warning' => 'Загварын рекурсийн хэмжээний хязгаараас хэтрэв ($1)',
 'language-converter-depth-warning' => 'Хэл хооронд хөрвүүлэх гүний хязгаараас хэтрэв ($1)',
 
 # "Undo" feature
@@ -803,7 +807,7 @@ $2 дуудлагаас доош байх ёстой, харин одоо $1 б
 Доорх харьцуулалтыг шалгаж үнэхээр хиймээр байгаа зүйл мөн үү гэдгээ нотлоорой. Дараа нь засварыг дуусгахын тулд өөрчлөлтүүдээ хадгална уу.',
 'undo-failure' => 'Хоорондын засваруудаас болж засвар цуцлагдах боломжгүй байна.',
 'undo-norev' => 'Засвар оршдогүүй эсвэл устгагдсан тул цуцлаж чадсангүй.',
-'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|Яриа]]) хэрэглэгчийн $1 засварыг цуцлах',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Хэрэглэгчийн бүртгэлийг үүсгэж чадсангүй.',
@@ -833,7 +837,7 @@ $3-н тодорхойлсон шалтгаан нь ''$2''",
 'history-show-deleted' => 'Зөвхөн устгагдсаныг',
 'histfirst' => 'Эхний',
 'histlast' => 'Сүүлийн',
-'historysize' => '($1 байт)',
+'historysize' => '($1 байт)',
 'historyempty' => '(хоосон байна)',
 
 # Revision feed
@@ -851,29 +855,29 @@ $3-н тодорхойлсон шалтгаан нь ''$2''",
 'rev-deleted-user-contribs' => '[хэрэглэгчийн нэр эсвэл IP хаягыг арилгасан байна - засварыг хувь нэмрээс нуув]',
 'rev-deleted-text-permission' => "Энэ хуудасны засвар '''устгагдсан'''.
 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Устгалын логт] дэлгэрэнгүй мэдээлэл байж магадгүй.",
-'rev-deleted-text-unhide' => "Энэ хуудасны засвар '''устгагдсан байна'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Устгалын логт] дэлгэрэнгүй мэдээлэл байж магадгүй.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8bн Ñ\85Ñ\83вÑ\8cд Ñ\82а хүсвэл [$1 энэ засварыг үзэх] боломжтой.",
-'rev-suppressed-text-unhide' => "Энэ хуудасны засвар '''далдлагдсан байна'''.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Далдлагааны логт] дэлгэрэнгүй мэдээлэл байж магадгүй.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8bн Ñ\85Ñ\83вÑ\8cд Ñ\82а хүсвэл [$1 энэ засварыг үзэх] боломжтой.",
-'rev-deleted-text-view' => "Энэ хуудасны засвар '''устгагдсан'''.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8bн Ñ\85Ñ\83вÑ\8cд Ñ\82а Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ñ\83Ñ\81Ñ\82галÑ\8bн Ð»Ð¾Ð³Ñ\82] Ð´Ñ\8dлгÑ\8dÑ\80Ñ\8dнгүй Ð¼Ñ\8dдÑ\8dÑ\8dлÑ\8dл Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯й.",
+'rev-deleted-text-unhide' => "Энэ хуудасны эргэцүүлэл '''устгагдсан байна'''.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Устгалын логоос] дэлгэрэнгүй мэдээллийг орж харж болно.
¢а хүсвэл [$1 энэ засварыг үзэх] боломжтой.",
+'rev-suppressed-text-unhide' => "Энэ хуудасны эргэцүүлэл '''далдлагдсан байна'''.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Далдалсан логоос]. дэлгэрэнгүй мэдээллийг авах боломжтой.
¢а хүсвэл [$1 энэ засварыг үзэх] боломжтой.",
+'rev-deleted-text-view' => "Энэ хуудасны эргэцүүлэл '''устгагдсан'''.
\93Ñ\8dÑ\81Ñ\8dн Ñ\87 Ñ\82а Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Ñ\83Ñ\81Ñ\82гаÑ\81ан Ð»Ð¾Ð³Ð¾Ð¾Ñ\81]. Ð´Ñ\8dлгÑ\8dÑ\80Ñ\8dнгүй Ð¼Ñ\8dдÑ\8dÑ\8dллийг Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой.",
 'rev-suppressed-text-view' => "Энэ хуудасны засвар '''далдлагдсан'''.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8bн Ñ\85Ñ\83вÑ\8cд Ñ\82а Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ð´Ð°Ð»Ð´Ð»Ð°Ð³Ð°Ð°Ð½Ñ\8b Ð»Ð¾Ð³Ñ\82] Ð´Ñ\8dлгÑ\8dÑ\80Ñ\8dнгүй Ð¼Ñ\8dдÑ\8dÑ\8dлÑ\8dл Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯й.",
\93Ñ\8dÑ\81Ñ\8dн Ñ\87 Ñ\82а Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой;  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}далдалÑ\81ан Ð»Ð¾Ð³Ð¾Ð¾Ñ\81] Ð´Ñ\8dлгÑ\8dÑ\80Ñ\8dнгүй Ð¼Ñ\8dдÑ\8dÑ\8dллийг Ñ\85аÑ\80аÑ\85 Ð±Ð¾Ð»Ð¾Ð¼Ð¶Ñ\82ой.",
 'rev-deleted-no-diff' => "Аль нэг засвар нь '''устгагдсан''' тул та ялгааг үзэх боломжгүй байна.
 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Устгалын логт] дэлгэрэнгүй мэдээлэл байж магадгүй.",
 'rev-suppressed-no-diff' => "Ямар нэг засвар '''устгагдсан''' тул та энэхүү өөрчлөлтийг харах боломжгүй.",
-'rev-deleted-unhide-diff' => "ЯлгаанÑ\8b Ð°Ð»Ñ\8c Ð½Ñ\8dг Ð·Ð°Ñ\81ваÑ\80 '''устгагдсан''' байна.
-[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Устгалын логт] дэлгэрэнгүй мэдээлэл байж магадгүй.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\8bн Ñ\85Ñ\83вÑ\8cд Ñ\82а хүсвэл [$1 энэ ялгааг] үзэх боломжтой.",
-'rev-suppressed-unhide-diff' => "ЭнÑ\8dÑ\85Ò¯Ò¯ Ó©Ó©Ñ\80Ñ\87лөлÑ\82ийн Ð·Ð°Ñ\80им Ð·Ð°Ñ\81ваÑ\80Ñ\8bг '''далдалсан''' байна.
-[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Далдалгааны логт] дэлгэрэнгүй мэдээллийг харах боломжтой.
\90дминиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80 Ð±Ð¾Ð» Ñ\82а [$1 Ñ\8dнÑ\8dÑ\85Ò¯Ò¯ Ó©Ó©Ñ\80Ñ\87лөлÑ\82ийг Ñ\85аÑ\80аÑ\85ааÑ\80] Ò¯Ñ\80гÑ\8dлжлүүлэх боломжтой.",
-'rev-deleted-diff-view' => "ЭнÑ\8dÑ\85Ò¯Ò¯ Ó©Ó©Ñ\80Ñ\87лөлÑ\82 Ð´Ð°Ñ\85Ñ\8c Ð·Ð°Ñ\81ваÑ\80Ñ\83Ñ\83дÑ\8bн Ð½Ñ\8dгийг '''Ñ\83Ñ\81Ñ\82гасан''' байна.
-Та администратор тул өөрчлөлтийг харах боломжтой; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} устгалын лог]-с дэлгэрэнгүй мэдээлэл авах боломжтой.",
-'rev-suppressed-diff-view' => "ЭнÑ\8dÑ\85Ò¯Ò¯ Ó©Ó©Ñ\80Ñ\87лөлÑ\82 Ð´Ð°Ñ\85Ñ\8c Ð·Ð°Ñ\81ваÑ\80Ñ\83Ñ\83дÑ\8bн Ð½Ñ\8dгийг '''далдалсан''' байна.
-Та администратор тул өөрчлөлтийг харах боломжтой; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} далдалгааны лог]-с дэлгэрэнгүй мэдээлэл авах боломжтой.",
+'rev-deleted-unhide-diff' => "ТанÑ\8b Ñ\8fлгаÑ\81ан Ñ\8dÑ\80гÑ\8dÑ\86үүлÑ\8dлийн Ð°Ð»Ñ\8c Ð½Ñ\8dг Ð½Ñ\8c  '''устгагдсан''' байна.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Устгасан логоос] дэлгэрэнгүй мэдээллийг аваарай.
¢а хүсвэл [$1 энэ ялгааг] үзэх боломжтой.",
+'rev-suppressed-unhide-diff' => "ТанÑ\8b Ñ\8fлгаÑ\81ан Ñ\8dÑ\80гÑ\8dÑ\86үүлÑ\8dлийн Ð°Ð»Ñ\8c Ð½Ñ\8dг Ð½Ñ\8c  '''далдлагдсан''' байна.
+[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Далдалсан логоос] дэлгэрэнгүй мэдээллийг аваарай.
¢Ð° Ñ\85Ò¯Ñ\81вÑ\8dл [$1 Ñ\8dнÑ\8d Ñ\8fлгааг] Ò¯Ð·эх боломжтой.",
+'rev-deleted-diff-view' => "ТанÑ\8b Ñ\8fлгаÑ\81ан Ñ\8dÑ\80гÑ\8dÑ\86үүлÑ\8dлийн Ð°Ð»Ñ\8c Ð½Ñ\8dг Ð½Ñ\8c '''Ñ\83Ñ\81Ñ\82гагдсан''' байна.
+Та уг ялгаврыг харах боломжтой; [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} устгасан логоос] дэлгэрэнгүй мэдээлэлийг аваарай.",
+'rev-suppressed-diff-view' => "ТанÑ\8b Ñ\8fлгаÑ\81ан Ñ\8dÑ\80гÑ\8dÑ\86үүлÑ\8dлийг Ð°Ð»Ñ\8c Ð½Ñ\8dг Ð½Ñ\8c '''далдлагдсан''' байна.
+Та уг ялгаврыг харах боломжтой; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} далдалсан логоос] дэлгэрэнгүй мэдээллийг аваарай.",
 'rev-delundel' => 'үзүүлэх/нуух',
 'rev-showdeleted' => 'үзүүлэх',
 'revisiondelete' => 'Засваруудыг устгах/сэргээх',
@@ -942,8 +946,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Хязгаарлалтын лог',
-'suppressionlogtext' => 'Ð\94ооÑ\80Ñ\85 Ð½Ñ\8c Ñ\81иÑ\81Ñ\82емийн Ð¾Ð¿ÐµÑ\80аÑ\82оÑ\80Ñ\83Ñ\83дааÑ\81 Ð½Ñ\83Ñ\83Ñ\81ан Ð°Ð³Ñ\83Ñ\83лгаÑ\82ай Ñ\85олбооÑ\82ой Ñ\83Ñ\81Ñ\82гал Ð±Ð° Ñ\82үгжÑ\8dÑ\8dнүүдийн Ð¶Ð°Ð³Ñ\81аалÑ\82 Ñ\8eм.
-[[Special:IPBlockList|IP түгжээний жагсаалтыг]] үзэж одоо хэрэгжиж буй хорио ба түгжээг харна уу.',
+'suppressionlogtext' => 'Энд Ð°Ð´Ð¼Ð¸Ð½Ñ\83Ñ\83дааÑ\81 Ð½Ñ\83Ñ\83Ñ\81ан Ð°Ð³Ñ\83Ñ\83лгаÑ\82ай Ñ\85олбооÑ\82ой Ñ\83Ñ\81Ñ\82гал Ð±Ð° Ñ\82үгжÑ\8dÑ\8dнүүдийн Ð¶Ð°Ð³Ñ\81аалÑ\82Ñ\83Ñ\83д Ð±Ð°Ð¹Ð½Ð°.
+[[Special:BlockList|түгжээний жагсаалтаас]] одоогоор хэрэгжиж буй хорио ба түгжээг харна уу.',
 
 # History merging
 'mergehistory' => 'Хуудсуудын түүхийг нэгтгэх',
@@ -972,13 +976,12 @@ $1",
 
 # Merge log
 'mergelog' => 'Нэгтгэлийн лог',
-'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
+'pagemerge-logentry' => '[[$1]]-г [[$2]] руу нэгтгэлээ ($3 хүртэлх засварууд)',
 'revertmerge' => 'Нэгтгэлийг буцаах',
 'mergelogpagetext' => 'Доорх нь нэг хуудасны түүхийг өөр түүхтэй нэгтгэсэн хамгийн сүүлийн нэгтгэлүүд юм.',
 
 # Diffs
-'history-title' => '"$1"-н засварын түүх',
-'difference' => '(Засварууд хоорондын ялгаа)',
+'history-title' => '"$1"-н хянасан түүх',
 'difference-multipage' => '(Хуудсууд хоорондын ялгаа)',
 'lineno' => '$1-р мөр:',
 'compareselectedversions' => 'Сонгосон хувилбаруудыг харьцуулах',
@@ -991,7 +994,7 @@ $1",
 'searchresults' => 'Хайлтын үр дүн',
 'searchresults-title' => '"$1" гэх хайлтын үр дүн',
 'searchresulttext' => '{{SITENAME}}-с хайх тухай дэлгэрэнгүй мэдээллийг [[{{MediaWiki:Helppage}}|{{int:help}}]] хуудаснаас авна уу.',
-'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
+'searchsubtitle' => 'Та \'\'\'[[:$1]]\'\'\' гэж хайлаа ([[Special:Prefixindex/$1|"$1-р эхлэсэн бүх хуудас]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"-д холбогдсон бүх хуудас]])',
 'searchsubtitleinvalid' => "Та '''$1''' гэж хайлаа",
 'toomanymatches' => 'Хэт олон илэрц илэрлээ. Өөр үгээр хайна уу.',
 'titlematches' => 'Хуудасны гарчигтай таарсан хуудсууд',
@@ -1019,7 +1022,7 @@ $1",
 'searchprofile-images-tooltip' => 'Файлуудаас хайх',
 'searchprofile-everything-tooltip' => 'Бүх агуулгаас хайх (үүнд ярианы хуудсуудыг оролцуулах)',
 'searchprofile-advanced-tooltip' => 'Сонгосон нэрний зайнуудаас хайх',
-'search-result-size' => '$1 ($2 үг)',
+'search-result-size' => '$1 (нийт $2 үг)',
 'search-result-category-size' => '{{PLURAL:$1|1 гишүүн|$1 гишүүн}} ({{PLURAL:$2|1 дэд ангилал|$2 дэд ангилал}}, {{PLURAL:$3|1 файл|$3 файл}})',
 'search-result-score' => 'Холбоо хамаарал: $1%',
 'search-redirect' => '(чиглүүлэгч $1)',
@@ -1164,7 +1167,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 Бусад хэрэглэгчид тантай болбогдох тохиолдолд таны цахим шуудан илэрч харагдахгүй.',
 'prefs-help-email-required' => 'Мэйл хаяг шаардлагатай байна.',
 'prefs-info' => 'Ердийн мэдээлэл',
-'prefs-i18n' => 'Олон Улсжуулалт',
+'prefs-i18n' => 'Олон улсад нийцүүлэх',
 'prefs-signature' => 'Гарын үсэг',
 'prefs-dateformat' => 'Огнооны хэлбэр',
 'prefs-timeoffset' => 'Цагын зөрөө',
@@ -1187,14 +1190,14 @@ $1 тэмдэгтээс богино байх ёстой.',
 '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' => 'Үүний гишүүн:',
 'userrights-groupsmember-auto' => 'Дараахийн далд гишүүн:',
 'userrights-groups-help' => 'Та энэ хэрэглэгчийн гишүүн болсон бүлгүүдийг өөрчлөх боломжтой.
¥Ð°Ð¹Ñ\80Ñ\86гийг Ñ\82Ñ\8dмдÑ\8dглÑ\8dÑ\81Ñ\8dн Ð±Ð°Ð¹Ð²Ð°Ð» Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87 Ñ\82Ñ\8dÑ\80 Ð±Ò¯Ð»Ñ\8dгÑ\82 Ð±Ð°Ð¹Ð³Ð°Ð°, Ñ\82Ñ\8dмдÑ\8dглÑ\8dÑ\8dгүй Ð±Ð°Ð¹Ð²Ð°Ð» бүлэгт байхгүй гэсэн үг.
-<nowiki>*</nowiki> гэдэг нь нэгэнт нэмсэн бол бүлгийг авч болохгүй, эсвэл түүний эсрэгээр байна гэсэн үг.',
\94Ó©Ñ\80вөлжин Ð½Ò¯Ð´Ð¸Ð¹Ð³ Ð±Ó©Ð³Ð»Ó©Ñ\81өн Ð±Ð°Ð¹Ð²Ð°Ð» Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87 Ñ\82Ñ\83Ñ\85айн Ð±Ò¯Ð»Ñ\8dгÑ\82 Ð±Ð°Ð¹Ð³Ð°Ð°, Ð±Ó©Ð³Ð»Ó©Ó©Ð³Ò¯Ð¹ Ð±Ð¾Ð» Ñ\83г бүлэгт байхгүй гэсэн үг.
+* A * гэдэг нь нэгэнт нэмсэн бол бүлгийг авч болохгүй, эс бөгөөс болно гэсэн үг.',
 'userrights-reason' => 'Шалтгаан:',
 'userrights-no-interwiki' => 'Таньд өөр викинүүдэд хэрэглэгчдийн эрхийг өөрчлөх зөвшөөрөл байхгүй.',
 'userrights-nodatabase' => '$1 мэдээллийн сан байхгүй, эсвэл дотоодынх биш байна.',
@@ -1335,14 +1338,14 @@ $1 тэмдэгтээс богино байх ёстой.',
 'nchanges' => '$1 өөрчлөлт',
 'recentchanges' => 'Сүүлийн өөрчлөлтүүд',
 'recentchanges-legend' => 'Сүүлийн өөрчлөлтүүдийн сонголтууд',
-'recentchangestext' => 'Энэхүү хуудсанд викид хийсэн хамгийн сүүлийн өөрчлөлтүүдийг үзүүлж байна.',
+'recentchanges-summary' => 'Энэхүү хуудсанд викид хийсэн хамгийн сүүлийн өөрчлөлтүүдийг үзүүлж байна.',
 'recentchanges-feed-description' => 'Вики дахь хамгийн сүүлийн өөрчлөлтүүдийг хянах.',
 'recentchanges-label-newpage' => 'Энэ засвар шинэ хуудсыг үүсгэсэн байна',
 'recentchanges-label-minor' => 'Энэ нь бага зэргийн засвар байна',
 'recentchanges-label-bot' => 'Энэ засварыг бот гүйцэтгэсэн байна',
 'recentchanges-label-unpatrolled' => 'Энэ засварыг одоогийн байдлаар манаагүй байна',
 'rcnote' => "Доорх нь $5, $4-ий байдлаарх сүүлийн '''$2''' өдрийн турших '''$1''' засвар юм.",
-'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэл харуулагдсан) юм.",
+'rcnotefrom' => "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
 'rclistfrom' => '$1-с хойших шинэ засваруудыг үзүүлэх',
 'rcshowhideminor' => 'Бага зэргийн засваруудыг $1',
 'rcshowhidebots' => 'Роботуудыг $1',
@@ -1359,7 +1362,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'newpageletter' => 'Ш',
 'boteditletter' => 'р',
 'number_of_watching_users_pageview' => '[$1 хэрэглэгч харж байна]',
-'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлах)',
+'rc_categories' => 'Ангиллуудад хязгаарлах ("|" тэмдгээр тусгаарлана)',
 'rc_categories_any' => 'Хамаагүй',
 'rc-change-size-new' => 'Өөрчилсний дараа $1 {{PLURAL:$1|байт|байт}}',
 'newsectionsummary' => '/* $1 */ шинэ хэсэг',
@@ -1384,8 +1387,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 'upload-tryagain' => 'Өөрчилсан файлын тодорхойлолтыг явуулах',
 'uploadnologin' => 'Нэвтрээгүй байна',
 'uploadnologintext' => 'Та файл оруулахын тулд [[Special:UserLogin|нэвтэрч орсон]] байх шаардлагатай.',
-'upload_directory_missing' => 'Ð\9eÑ\80Ñ\83Ñ\83лалÑ\82Ñ\8bн Ð»Ð°Ð²Ð»Ð°Ñ\85 ï¼\88$1ï¼\89 Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80вÑ\8dÑ\80 Ò¯Ò¯Ñ\81гÑ\8dÑ\8dгүй Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯Ð¹ Ð±Ð°Ð¹Ð½Ð°.',
-'upload_directory_read_only' => 'Файл Ð¾Ñ\80Ñ\83Ñ\83лаÑ\85 ÐºÐ°Ñ\82алог ï¼\88$1ï¼\89 Ð½Ñ\8c Ð²Ñ\8dбÑ\81еÑ\80веÑ\80Ñ\82 Ð±Ð¸Ñ\87игдÑ\8dх боломгүй байна.',
+'upload_directory_missing' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ð¾Ð»Ð´Ð¾Ñ\85гүй Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ò¯Ò¯Ð½Ð¸Ð¹Ð³ Ò¯Ò¯Ñ\81гÑ\8dж Ñ\87адÑ\81ангүй.',
+'upload_directory_read_only' => 'Ð\90плоÑ\83д Ñ\81ан ($1) Ñ\80Ñ\83Ñ\83 Ð²Ñ\8dбÑ\81еÑ\80веÑ\80 Ð±Ð¸Ñ\87их боломгүй байна.',
 'uploaderror' => 'Файл оруулахад алдаа гарлаа',
 'upload-recreate-warning' => "'''Анхаар: Тэрхүү нэртэй файл нь устгагдсан эсвэл зөөгдсөн байна..'''
 
@@ -1422,9 +1425,9 @@ $1 тэмдэгтээс богино байх ёстой.',
 'filetype-bad-ie-mime' => 'Интернэт Эксплорер нь зөвшөөрөгдөхгүй, аюултай байх боломжтой файлын төрөл болох "$1" гэж илрүүлэх тул энэ файлыг оруулах боломжгүй байна.',
 'filetype-unwanted-type' => "'''\".\$1\"''' нь хүсэгдэхгүй файлын төрөл байна.
 Ашиглахыг зөвлөж буй {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
-'filetype-banned-type' => "'''\".\$1\"''' нь зөвшөөрөгдөхгүй файлын төрөл байна.
-Зөвшөөрөгдөх {{PLURAL:\$3|файлын төрөл|файлын төрлүүд}} нь \$2.",
-'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|нь зөвшөөрөгдөхгүй файлын төрөл байна.|нь зөвшөөрөгдөхгүй файлын төрөл байна}}.
+Зөвшөөрөгдөх {{PLURAL:$3|файлын төрөлд|файлын төрөлд}} $2.',
+'filetype-missing' => 'Энэ файлд өргөтгөл байхгүй байна (".jpg" гэх мэт).',
 'empty-file' => 'Таны явуулсан файл хоосон байв.',
 'file-too-large' => 'Таны явуулсан файл хэтэрхий том байв.',
 'filename-tooshort' => 'Файлын нэр хэтэрхий богино байна.',
@@ -1465,8 +1468,8 @@ $1 тэмдэгтээс богино байх ёстой.',
 Файлаа оруулахыг хүсч байвал шинэ нэр өгөөд дахин оролдоно уу.
 [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Энэ файл нь дараах {{PLURAL:$1|файлтай|файлуудтай}} ижил байна:',
-'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файл урьд өмнө устгагдсан байна.
\94аÑ\85ин оруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
+'file-deleted-duplicate' => 'Энэ файлтай ([[:$1]]) яг ижилхэн файлыг урьд өмнө устгасан байна.
\94аÑ\85иРоруулахынхаа өмнө тэрхүү файлын устгалын түүхийг харна уу.',
 'uploadwarning' => 'Хуулах үеийн анхааруулга',
 'uploadwarning-text' => 'Доорх файлын тодорхойлолтыг өөрчлөөд дахин оролдоно уу.',
 'savefile' => 'Файлыг хадгалах',
@@ -1494,6 +1497,20 @@ file_uploads тохиргоогоо шалгана уу.',
 Та үүнийг дахин оруулахын өмнө $1-г шалгаж үзнэ үү.',
 'filename-bad-prefix' => "Таны оруулж байгаа файлын нэр '''\"\$1\"'''-р эхэлж байна. Энэ нь файлыг тодорхойлойлоогүй, голдуу дижитал аппаратын автоматаар гаргадаг нэр болно.
 Файланд түүнийг илүү сайн тодорхойлсон нэр өгнө үү.",
+'filename-prefix-blacklist' => ' #<!-- leave this line exactly as it is --> <pre>
+# Syntax is as follows:
+#   * Everything from a "#" character to the end of the line is a comment
+#   * Every non-blank line is a prefix for typical filenames assigned automatically by digital cameras
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # зарим гар утаснууд
+IMG # ерөнхий
+JD # Jenoptik
+MGP # Pentax
+PICT # бусад.
+ #</pre> <!-- leave this line exactly as it is -->',
 'upload-success-subj' => 'Файлыг амжилттай орууллаа',
 'upload-success-msg' => '[$2]-с амжилттай оруулав. Энд байна: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Оруулах үеийн асуудал',
@@ -1515,10 +1532,13 @@ URL нь хүчинтэй, мөн түүн руу орж болж байгаа 
 'upload-too-many-redirects' => 'URL-д хэт олон чиглүүлэгч байв',
 'upload-unknown-size' => 'Үл мэдэгдэх хэмжээ',
 'upload-http-error' => 'HTTP алдаа гарав: $1',
+'upload-copy-upload-invalid-domain' => 'Энэ хаяг дээрээс хуулах боломжгүй байна.',
 
 # 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 файл аль хэдийн байж байна.',
@@ -1530,6 +1550,13 @@ URL нь хүчинтэй, мөн түүн руу орж болж байгаа 
 'backend-fail-closetemp' => 'Түр зуурын файлыг хааж чадсангүй.',
 'backend-fail-read' => '$1 файлыг уншиж чадсангүй.',
 'backend-fail-create' => '$1 файлыг үүсгэж чадсангүй.',
+'backend-fail-maxsize' => '$1 файлын хэмжээ {{PLURAL:$2|нэг байтаас|$2 байтаас}} хэтэрсэн тул хадгалж болохгүй байна. \\',
+'backend-fail-readonly' => '"\'\'$2\'\'" - оос болоод нөөцийн сангийн "$1" системийг зөвхөн унших боломжтой байна. \\',
+'backend-fail-synced' => 'Дотоод нөөцийн сангийн систем дэх "$1" файл тогтворгүй төлөвт байна',
+'backend-fail-connect' => '"$1" нөөцийн сангийн системтэй холбогдож чадсангүй.',
+'backend-fail-internal' => '"$1" нөөцийн сангийн системд үл танигдах алдаа гарлаа.',
+'backend-fail-contenttype' => '"$1" дахь файлын агуулгын төрлийг таньж чадсангүй.',
+'backend-fail-usable' => '$1 файлд хангалттай зөвшөөрөл олгогдоогүй эсвэл агуулах хавтасгүйн улмаас хадгалж чадсангүй.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Хандах эрхгүй байна',
@@ -1613,7 +1640,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 [[Special:WhatLinksHere/$2|Бүтэн жагсаалт]] мөн байгаа.',
 'nolinkstoimage' => 'Энэ файлд холбогдсон хуудас байхгүй байна.',
 'morelinkstoimage' => 'Энэ файлд руух [[Special:WhatLinksHere/$1|илүү олон холбоос]] үзэх.',
-'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]]):',
+'duplicatesoffile' => 'Дараах {{PLURAL:$1|файл|$1 файл}} нь энэ файлтай яг ижилхэн байна ([[Special:FileDuplicateSearch/$2|дэлгэрэнгүй мэдээлэл]])',
 'sharedupload' => 'Энэ файл нь $1-ийнх бөгөөд бусад төслүүдэд ашиглах боломжтой',
 'sharedupload-desc-there' => 'Энэ файл нь $1-нх бөгөөд бусад төслүүд үүнийг хэрэглэх боломжтой.
 Дэлгэрэнгүй мэдээллийг [$2 файлын тайлбарын хуудаснаас] харна уу.',
@@ -1675,7 +1702,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 
 # Random page
 'randompage' => 'Санамсаргүй хуудас',
-'randompage-nopages' => 'ЭнÑ\8d Ð½Ñ\8dÑ\80ний Ð·Ð°Ð¹Ð´ Ñ\85Ñ\83Ñ\83даÑ\81 Ð±Ð°Ð¹Ñ\85гүй Ð±Ð°Ð¹Ð½Ð°.',
+'randompage-nopages' => 'Ð\94аÑ\80ааÑ\85 {{PLURAL:$2|нÑ\8dÑ\80ний Ð·Ð°Ð¹Ð½Ð´|нÑ\8dÑ\80ний Ð·Ð°Ð¹Ð½Ð´}} Ñ\85Ñ\83Ñ\83даÑ\81 Ð±Ð°Ð¹Ñ\85гүй Ð±Ð°Ð¹Ð½Ð° : $1. \\',
 
 # Random redirect
 'randomredirect' => 'Санамсаргүй чиглүүлэгч',
@@ -1701,15 +1728,15 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'statistics-users-active-desc' => 'Сүүлийн {{PLURAL:$1|өдөрт|$1 өдөрт}} үйлдэл хийсэн хэрэглэгчид',
 'statistics-mostpopular' => 'Хамгийн олон удаа үзсэн хуудсууд',
 
-'disambiguations' => 'Салаа утгатай үгнүүд',
+'disambiguations' => 'Өөр агуулгатай хуудсуудтай холбоотой хуудсууд',
 'disambiguationspage' => 'Template:Салаа утгатай',
 'disambiguations-text' => "Дараах хуудсууд '''салаа утгатай үгнүүдийн хуудас''' руу холбогдоно.
 Тэдгээр нь зөв сэдэв руу холбогдох ёстой.<br />
 [[MediaWiki:Disambiguationspage]]-с холбогдсон загвар хэрэглэж байвал хуудас нь салаа утгатай үгнүүдийн хуудас гэж тооцогдоно.",
 
 'doubleredirects' => 'Давхар чиглүүлэгчүүд',
-'doubleredirectstext' => 'Энэ хуудас нь өөр чиглүүлэгч хуудас руу чиглүүлдэг хуудсуудыг жагсаана.
\9cÓ©Ñ\80 Ñ\82Ñ\83Ñ\81 Ð±Ò¯Ñ\80 Ð½Ñ\8c Ñ\8dÑ\85ний Ð±Ð° Ñ\85оÑ\91Ñ\80 Ð´Ð°Ñ\85Ñ\8c Ñ\87иглүүлÑ\8dгÑ\87 Ñ\80Ò¯Ò¯Ñ\85 Ñ\85олбооÑ\81Ñ\8bг Ð±Ð¾Ð»Ð¾Ð½ Ñ\8dÑ\85ний Ñ\87иглүүлÑ\8dгÑ\87ийн Ñ\87иглÑ\8dÑ\85 Ñ\91Ñ\81Ñ\82ой, Ñ\85оÑ\91Ñ\80 Ð´Ð°Ñ\85Ñ\8c Ñ\87иглүүлÑ\8dгÑ\87ийн Ñ\87иглÑ\8dÑ\85 "жинÑ\85Ñ\8dнÑ\8d" Ñ\87иглÑ\8dÑ\85 Ñ\91Ñ\81Ñ\82ой Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ð·Ð°Ð°на.',
+'doubleredirectstext' => 'Энэ хуудсанд өөр хуудсуудыг давхар заасан хуудсуудыг жагсаасан байна
\9cÓ©Ñ\80 Ñ\82Ñ\83Ñ\81 Ð±Ò¯Ñ\80 Ð½Ñ\8c Ñ\8dÑ\85ний Ð·Ð°Ð°Ñ\81ан Ð±Ð¾Ð»Ð¾Ð½ Ñ\82үүний Ð´Ð°Ñ\80ааÑ\85 Ð·Ð°Ð°Ñ\81ан Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83дÑ\8bг Ð¶Ð°Ð³Ñ\81аан Ð±Ð¸Ñ\87Ñ\81Ñ\8dний Ñ\81аÑ\86Ñ\83Ñ\83 Ñ\83г Ñ\85оÑ\91Ñ\80 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bн Ñ\8dÑ\86Ñ\81ийн Ñ\87иглүүлÑ\81Ñ\8dн "жинÑ\85Ñ\8dнÑ\8d" Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ò¯Ð·Ò¯Ò¯Ð»Ñ\81Ñ\8dн Ð±Ð°Ð¹на.',
 'double-redirect-fixed-move' => '[[$1]] зөөгдөж, [[$2]] руух чиглүүлэгч боллоо',
 'double-redirect-fixer' => 'Чиглүүлэгчийг засварлагч',
 
@@ -1734,7 +1761,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'nviews' => '$1 удаа үзсэн',
 'specialpage-empty' => 'Энэ мэдүүлэгт үр дүн гарсангүй.',
 'lonelypages' => 'Өнчин хуудсууд',
-'lonelypagestext' => 'Ð\94аÑ\80ааÑ\85 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83д Ð½Ñ\8c {{SITENAME}}-н Ð±Ñ\83Ñ\81ад Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83дааÑ\81 Ñ\85олбогдоогүй байна.',
+'lonelypagestext' => 'ЭнÑ\8d Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83д {{SITENAME}}-даÑ\85Ñ\8c Ð±Ñ\83Ñ\81ад Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83дÑ\82ай Ñ\85олбогдоогүй Ñ\8dÑ\81вÑ\8dл Ð·Ð°Ð°Ð³Ð°Ð°Ñ\81 Ñ\85Ñ\8dÑ\82Ñ\8dÑ\80Ñ\81Ñ\8dн байна.',
 'uncategorizedpages' => 'Ангилагдаагүй хуудсууд',
 'uncategorizedcategories' => 'Ангилагдаагүй ангиллууд',
 'uncategorizedimages' => 'Ангилагдаагүй зургууд',
@@ -1807,8 +1834,8 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # Special:AllPages
 'allpages' => 'Бүх хуудас',
 'alphaindexline' => '$1-с $2 хүртэл',
-'nextpage' => 'Дараагийн хуудас ($1)',
-'prevpage' => 'Өмнөх хуудас ($1)',
+'nextpage' => 'Дараагийн хуудас ($1)',
+'prevpage' => 'Өмнөх хуудас ($1)',
 'allpagesfrom' => 'Хамгийн эхэлж харуулах хуудас:',
 'allpagesto' => 'Дараах гэж дуусах хуудсуудыг үзүүлэх:',
 'allarticles' => 'Бүх хуудас',
@@ -1841,7 +1868,8 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'linksearch-ns' => 'Нэрний зай:',
 'linksearch-ok' => 'Хайх',
 'linksearch-text' => '"*.wikipedia.org" зэрэг орлуулагч тэмдэгт хэрэглэх боломжтой.<br />
-Зөвшөөрөгдөх протокол: <tt>$1</tt>',
+Дор хаяж дээд түвшиний домайн хэрэгтэй байна, жишээ нь "*.org".<br />
+Дэмжигдэх протоколууд : <tt>$1</tt> (эдгээрээс алийг нь ч хайлтад бүү оруул).',
 'linksearch-line' => '$1 нь $2-с холбогдсон',
 'linksearch-error' => 'Орлуулагч тэмдэгт хост нэрийн эхлэлд л гарах боломжтой.',
 
@@ -1891,7 +1919,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'emailpagetext' => 'Энэ хэрэглэгч рүү мэйл илгээхэд доорхийг бөглөнө.
 Таны өөрийн [[Special:Preferences|хэрэглэгчийн тохиргоонд]] оруулсан мэйл хаяг нь "Хэнээс" гэсэн хэсэгт гарах тул хүлээн авагч хариугаа тань руу шууд илгээх боломжтой.',
 'usermailererror' => 'Мэйл нь буцаж ирсэн шалтгаан:',
-'defemailsubject' => '{{SITENAME}} Ð¸-мÑ\8dйл',
+'defemailsubject' => '{{SITENAME}} Ð´Ð°Ñ\85Ñ\8c "$1" Ñ\85Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87ийн Ð¸-мÑ\8dйл Ñ\85аÑ\8fг',
 'usermaildisabled' => 'Хэрэглэгчийн и-мэйлийг идэвхигүйжүүлэв',
 'usermaildisabledtext' => 'Та энэ викигийн бусад хэрэглэгч руу и-мэйл явуулах боломжгүй',
 'noemailtitle' => 'Мэйл хаяггүй байна',
@@ -1915,7 +1943,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 # User Messenger
 'usermessage-summary' => 'Системийн мессеж үлдээв.',
 'usermessage-editor' => 'Системийн мессежийг засварлагч',
-'usermessage-template' => 'МедиаВики:ХэрэглэгчийнМэдэгдэл',
+'usermessage-template' => 'МедиаВики:ХэрэглэгчийнМэдээ',
 
 # Watchlist
 'watchlist' => 'Миний хянаж буй хуудсууд',
@@ -1942,7 +1970,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'watchmethod-list' => 'хяналтад буй хуудсуудад саяхан өөрчлөлт орсон эсэхийг шалгаж байна',
 'watchlistcontains' => 'Таны хянах жагсаалтанд $1 хуудас байна.',
 'iteminvalidname' => "'$1' зүйлд асуудал гарлаа, хүчингүй нэр...",
-'wlnote' => "Ð\94ооÑ\80Ñ\85 Ð½Ñ\8c Ñ\81үүлийн {{PLURAL:$2|Ñ\86агÑ\82|'''$2''' Ñ\86агÑ\82}} Ñ\85ийгдÑ\81Ñ\8dн {{PLURAL:$1|Ñ\81үүлийн|Ñ\81үүлийн '''$1'''}} Ó©Ó©Ñ\80Ñ\87лөлÑ\82 Ñ\8eм.",
+'wlnote' => "Энд Ð½Ñ\8c {{PLURAL:$2|Ñ\86агийн|'''$2''' Ñ\86агийн}} Ó©Ð¼Ð½Ó© Ñ\85амгийн Ñ\81үүлд Ñ\85ийÑ\81Ñ\8dн {{PLURAL:$1|Ó©Ó©Ñ\80Ñ\87лөлÑ\82| '''$1''' Ó©Ó©Ñ\80Ñ\87лөлÑ\82үүд}} Ð±Ð°Ð¹Ð½Ð°.",
 'wlshowlast' => 'Сүүлийн $1 цагийн $2 өдрийн $3-г харуул',
 'watchlist-options' => 'Хянаж буй хуудсуудын жагсаалтны сонголтууд',
 
@@ -1962,27 +1990,36 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 'enotif_anon_editor' => '$1 бүртгэлгүй хэрэглэгч',
 'enotif_body' => '$WATCHINGUSERNAME танаа,
 
-{{SITENAME}}-н $PAGETITLE хуудаст $PAGEEDITOR $PAGEEDITDATE-нд $CHANGEDORCREATED үйлдэл хийжээ. Одоогийн засварыг $PAGETITLE_URL хуудсаас харна уу.
+To change your watchlist settings, visit
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+{{SITENAME}}-н $PAGETITLE хуудаст $PAGEEDITOR $PAGEEDITDATE-нд $CHANGEDORCREATED үйлдэл хийжээ. $PAGETITLE_URL -руу орж одоогоор хийгдээд байгаа засварыг харна уу.
 
 $NEWPAGE
 
-Засварлагчийн тойм: $PAGESUMMARY $PAGEMINOREDIT
+Зассан тойм: $PAGESUMMARY $PAGEMINOREDIT
 
-Засварлагчтай холбоо барих:
-мэйл: $PAGEEDITOR_EMAIL
+Засвар хийсэн хүний холбогдъё гэвэл:
µÐ¼Ñ\8dйл: $PAGEEDITOR_EMAIL
 вики: $PAGEEDITOR_WIKI
 
-Та энэ хуудаст зочлохгүй бол өөр өөрчлөлтүүдийн талаарх мэдээлэл өгөхгүй болно.
-Мөн та хянаж буй хуудсуудын мэдээллэх бүртгэлийг өөрчилж болно.
+Өөр шинээр хийгдэх өөрчлөлтүүдийн талаарх уг хуудсан орж л байж мэдэх боломжтой.
+Мөн та үзсэн хуудсынхаа шинээр хийгдэх өөрчлөлтүүдийг сануулах тохиргоог шинэчилж болно. 
 
-             {{SITENAME}}-н мэдээллэх систем
+                        {{SITENAME}} -н сануулгын систем
 
 --
-Хянаж буй хуудсуудынхаа тохиргоог өөрчлөхийн тулд дараах хуудаст зочилно уу:
-{{canonicalurl:{{#special:EditWatchlist}}}}
+Имейл хаягаар шинэчлэл хийсэн талаар мэдээлэл явуулах тохиргоог 
+{{canonicalurl:{{#special:Preferences}}}} хаягаар орж хийнэ үү
+
+Хянаж буй хуудсын жагсаалтын тохиргоог
+{{canonicalurl:{{#special:EditWatchlist}}}} хаягаар орж хийнэ үү
 
-Дэлгэрэнгүй мэдээлэл:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
+Хянаж буй хуудын жагсаалтаас хаяг хасах тохиолдолд
+$UNWATCHURL
+
+Санал сэтгэгдэл болон тулгарсан бэрхшээлээ :
+{{canonicalurl:{{MediaWiki:Helppage}}}} хаягаар орж бичнэ үү',
 
 # Delete
 'deletepage' => 'Хуудсыг устга',
@@ -2012,10 +2049,10 @@ $NEWPAGE
 ** Зохиогчийн эрхэд халдсан
 ** Вандализм',
 'delete-edit-reasonlist' => 'Устгах шалтгаануудыг засварлах',
-'delete-toobig' => 'ЭнÑ\8d Ñ\85Ñ\83Ñ\83даÑ\81нÑ\8b Ð·Ð°Ñ\81ваÑ\80Ñ\8bн Ñ\82Ò¯Ò¯Ñ\85 Ð¼Ð°Ñ\88 Ñ\82ом Ð±Ð°Ð¹Ð³Ð°Ð° Ð±Ó©Ð³Ó©Ó©Ð´ $1 Ð³Ð°Ñ\80Ñ\83й Ð·Ð°Ñ\81ваÑ\80Ñ\82ай байна.
-{{SITENAME}}-д Ñ\81анамÑ\81аÑ\80гүй Ð±Ð°Ð¹Ð´Ð»Ð°Ð°Ñ\80 Ð¼Ñ\83Ñ\83гааÑ\80 Ð½Ó©Ð»Ó©Ó©Ð»Ð¶ Ð±Ð¾Ð»Ð·Ð¾Ñ\88гүй Ñ\82Ñ\83л Ñ\8dдгÑ\8dÑ\8dÑ\80 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83дÑ\8bг Ñ\83Ñ\81Ñ\82гаÑ\85 Ñ\8fвдлыг хорьсон байна.',
-'delete-warning-toobig' => 'Энэ хуудасны засварын түүх маш том байгаа бөгөөд $1 гаруй засвартай байна.
-Устгавал {{SITENAME}}-н мэдээллийн сангийн үйл ажиллагаанд нөлөөлж магадгүй тул та анхаар сэрэмжтэйгээр дараах үйлдлээ гүйцэтгэнэ үү.',
+'delete-toobig' => 'Уг Ñ\85Ñ\83Ñ\83даÑ\81нÑ\8b Ð·Ð°Ñ\81ваÑ\80Ñ\8bн Ñ\82Ò¯Ò¯Ñ\85 Ð¼Ð°Ñ\88 Ð¸Ñ\85, $1 {{PLURAL:$1|заÑ\81ваÑ\80|гаÑ\80Ñ\83й Ð·Ð°Ñ\81ваÑ\80Ñ\82ай}} байна.
+{{SITENAME}}-н Ð°Ñ\8eÑ\83лгүй Ð±Ð°Ð¹Ð´Ð»Ñ\8bн Ò¯Ò¯Ð´Ð½Ñ\8dÑ\8dÑ\81 Ð´Ñ\8dÑ\8dÑ\80Ñ\85 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ñ\83Ñ\81Ñ\82гаÑ\85ыг хорьсон байна.',
+'delete-warning-toobig' => 'Энэ хуудасны засварын түүх маш том байгаа бөгөөд {{PLURAL:$1| гаруй засвар| гаруй засварууд}} байна.
+Устгавал {{SITENAME}}-н мэдээллийн сангийн үйл ажиллагаанд нөлөөлж магадгүй тул та анхаарна уу.',
 
 # Rollback
 'rollback' => 'Засваруудыг буцаах',
@@ -2041,7 +2078,8 @@ $NEWPAGE
 
 # Protect
 'protectlogpage' => 'Хамгаалалтын лог',
-'protectlogtext' => 'доорх нь түгжигдсэн ба түгжигдээгүй хуудасны лист.',
+'protectlogtext' => 'Энд хуудсын хамгаалалтын өөрчлөлтүүдийн жагсаалтууд байна.
+[[Special:ProtectedPages|хамгаалагдсан хуудсын жагсаалт]] -руу орж одоогоор хүчинтэй байгаа хуудасны хамгаалалтыг харна уу.',
 'protectedarticle' => '"[[$1]]"-г хамгааллаа',
 'modifiedarticleprotection' => '"[[$1]]"-н хамгаалалтын түвшинг өөрчиллөө',
 'unprotectedarticle' => '"[[$1]]"-ны хамгаалалтыг цуцлав',
@@ -2108,15 +2146,18 @@ $NEWPAGE
 'undeletepage' => 'Устгагдсан хуудсуудыг харах ба сэргээх',
 'undeletepagetitle' => "'''Дараах нь [[:$1|$1]]-н устгагдсан засварууд юм.'''",
 'viewdeletedpage' => 'Устгагдсан хуудсуудыг харах',
-'undeletepagetext' => 'Дараах хуудсууд устгагдсан боловч одоогоор сэргээж болохоор төлөвт байна.',
+'undeletepagetext' => '{{PLURAL:$1|Энэ хуудас|Дараах $1 хуудсууд}} устгагдсан хэдий ч нөөцөд байгаа учраас сэргээх боломжтой.
+Нөөцийг үе үе цэвэрлэдэг болохыг анхаараарай.',
 'undelete-fieldset-title' => 'Засваруудыг сэргээх',
-'undeleteextrahelp' => "Бүхэл хуудсыг сэргээхийн тулд бүх жижиг дөрвөлжингүүдийг сонгохгүй үлдээгээд '''''Сэргээх''''' товчийг дар. Зарим хувилбаруудыг сэргээхийн тулд сэргээх хувилбаруудын өмнөх жижиг дөрвөлжинг идэвхжүүлээд '''''Сэргээх''''' товчийг дар. '''''Дахин эхлүүлэх''''' товчийг дарснаар тайлбарын талбар ба бүх жижиг дөрвөлжингүүд хоосон болно",
+'undeleteextrahelp' => "Бүхэл хуудсыг сэргээхийн тулд бүх жижиг дөрвөлжингүүдийг сонгохгүй үлдээгээд '''''{{int:undeletebtn}}''''' товчийг дар.
+Зарим хувилбаруудыг сэргээхийн тулд сэргээх хувилбаруудын өмнөх жижиг дөрвөлжинг идэвхжүүлээд '''''{{int:undeletebtn}}''''' товчийг дар.",
 'undeleterevisions' => '$1 хувилбар архивлагдлаа',
-'undeletehistory' => 'Хэрэв та энэ хуудсыг сэргээвэл түүний өмнөх бүх хувилбарууд нь түүх рүү сэргээгдэж бичигдэнэ. Хэрэв үүнийг устгаснаас хойш үүнтэй адил нэртэй шинэ хуудас үүсгэгдсэн бол сэргээгдсэн хувилбарууд түүх хэсэгт гарч ирэх боловч одоо байгаа бодит хуудсыг автоматаар солихгүй.',
+'undeletehistory' => 'Хэрэв энэ хуудсыг сэргээвэл өмнөх бүх залруулгууд түүх байдлаар сэргээгдэх болно .
+Хэрэв адил нэртэй шинэ хуудас үүсгэгдсэн байгаа бол сэргээгдсэн хувилбарууд түүх хэсэгт гарч ирэх боловч одоо байгаа хуудсыг шууд солихгүй.',
 'undeleterevdel' => 'Дээд хуудас буюу файлын засвар бага зэргээр устгагдах явдал гарах бол хуудас сэргээгдэхгүй.
 Ийм тохиолдолд та хамгийн сүүлд устгагдсан засварыг нууцлахаа, эсвэл тэмдэглэхээ болих шаардлагатай.',
 'undeletehistorynoadmin' => 'Энэ өгүүлэл устгагдсан. Үүний устгагдсан шалтгаан нь устгалын өмнө энэ хуудсыг засварласан хэрэглэгчдийн тухай мэдээллүүдтэй хамт доорх тайланд өгөгдсөн байгаа. Эдгээр устгагдсан хувилбаруудад яг юу байсныг зөвхөн администраторууд л харж чадна.',
-'undelete-revision' => '$3 хэрэглэгчийн $1-н ($2-ий байдлаарх) устгасан засвар',
+'undelete-revision' => '$3 хэрэглэгчийн засварласан $1 хуудасны ($4, $5-ийн байдлаарх) засварыг устгав.',
 'undeleterevision-missing' => 'Хүчингүй эсвэл алга болсон засвар.
 Таньд буруу холбоос байна, эсвэл засвар сэргээгдсэн, эсвэл архиваас устгагдсан байж болзошгүй.',
 'undelete-nodiff' => 'Өмнөх засвар олдсонгүй.',
@@ -2160,7 +2201,7 @@ $1',
 'contributions' => 'Хэрэглэгчийн хувь нэмэр',
 'contributions-title' => '$1 хэрэглэгчийн хувь нэмэр',
 'mycontris' => 'Миний оруулсан хувь нэмэр',
-'contribsub2' => 'Хэрэглэгчийн нэр: $1 ($2)',
+'contribsub2' => 'Хэрэглэгч: $1 ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(дээд)',
 'month' => 'Дараах сараас (өмнөх засварууд нь ч орно):',
@@ -2239,8 +2280,8 @@ $1',
 'ipb-change-block' => 'Эдгээр тохиргоотойгоор энэ хэрэглэгчийг дахин түгжих',
 'badipaddress' => 'Хүчингүй IP хаяг',
 'blockipsuccesssub' => 'Түгжээ амжилттай боллоо.',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] түгжигдсэн.
-<br />Түгжилтийн тоймыг [[Special:BlockList|түгжигдсэн IP-ийн жагсаалт]]аас үзнэ үү.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] түгжигдсэн байна.
+<br />Түгжсэн тоймыг [[Special:BlockList|түгжигдсэн IP-ийн жагсаалт]] аас харна уу.',
 'ipb-edit-dropdown' => 'Түгжих шалтгаануудыг засварлах',
 'ipb-unblock-addr' => '$1-н түгжээг тайлах',
 'ipb-unblock' => 'Хэрэглэгчийн нэр эсвэл IP хаягийн түгжээг тайлах',
@@ -2280,9 +2321,9 @@ $1',
 Лавлагааны зориулалтаар далдлагааны логийг доор оруулав:',
 'blocklogentry' => '[[$1]] нь $2 $3 хугацаатайгаар түгжигдсэн',
 'reblock-logentry' => '[[$1]]-н түгжээний тохиргоог $2 $3 хугацаатай болгож өөрчилсөн',
-'blocklogtext' => 'Энэ нь хэрэглэгчийг түгжсэн болон тайлсан үйлдлийн лог юм.
-Автоматаар түгжигдсэн IP хаягууд жагсаагдаагүй.
-[[Special:BlockList|IP хаягийн түгжээний жагсаалтыг]] харж одоо түгжигдсэн хаягуудыг харна уу.',
+'blocklogtext' => 'Энд хэрэглэгчийг түгжсэн болон түгжээг тайлсан лог байна.
+Автоматаар түгжигдсэн IP хаягууд жагсаагтад ороогүй болно.
+[[Special:BlockList|IP Ñ\85аÑ\8fгийн Ñ\82үгжÑ\8dÑ\8dний Ð¶Ð°Ð³Ñ\81аалÑ\82Ñ\8bг]] Ñ\85аÑ\80ж Ð¾Ð´Ð¾Ð¾ Ñ\82үгжигдÑ\81Ñ\8dн Ñ\8dÑ\81вÑ\8dл Ñ\85оÑ\80ионд Ð±Ð°Ð¹Ð³Ð°Ð° Ñ\85аÑ\8fгÑ\83Ñ\83дÑ\8bг Ñ\85аÑ\80на Ñ\83Ñ\83.',
 'unblocklogentry' => '$1 идэвхтэй',
 'block-log-flags-anononly' => 'зөвхөн нэргүй хэрэглэгчид',
 'block-log-flags-nocreate' => 'Бүртгэл үүсгэх боломжгүй',
@@ -2605,8 +2646,8 @@ $1',
 
 # Spam protection
 'spamprotectiontitle' => 'Спамаас хамгаалах шүүлтүүр',
-'spamprotectiontext' => 'ТанÑ\8b Ñ\85адгалаÑ\85Ñ\8bг Ñ\85Ò¯Ñ\81Ñ\81Ñ\8dн Ñ\85Ñ\83Ñ\83даÑ\81 Ñ\81памааÑ\81 Ñ\85амгаалаÑ\85 Ñ\88үүлÑ\82Ò¯Ò¯Ñ\80Ñ\8dÑ\8dÑ\80 Ñ\85аагдлаа.
­Ð½Ñ\8d Ð½Ñ\8c Ð³Ð°Ð´Ð½Ñ\8b Ñ\81айÑ\82 Ñ\80Ñ\83Ñ\83Ñ\85 Ñ\85олбооÑ\81нÑ\8b Ñ\83лмааÑ\81 Ð³Ð°Ñ\80Ñ\81ан Ð±Ð°Ð¹Ð¶ Ð¼Ð°Ð³Ð°Ð´Ð³Ò¯й.',
+'spamprotectiontext' => 'СпамааÑ\81 Ñ\85амгаалаÑ\85 Ñ\88үүлÑ\82Ò¯Ò¯Ñ\80 Ñ\82анÑ\8b Ñ\85адгалаÑ\85Ñ\8bг Ñ\85Ò¯Ñ\81Ñ\81Ñ\8dн Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг Ñ\85ааÑ\81ан Ð±Ð°Ð¹Ð½а.
¥Ð°Ñ\80 Ð´Ð°Ð½Ñ\81ад Ð¾Ñ\80Ñ\81он Ð³Ð°Ð´Ð½Ñ\8b Ñ\81айÑ\82Ñ\82ай Ñ\85олбооÑ\82ой Ð±Ð°Ð¹Ñ\81нааÑ\81 Ð±Ð¾Ð»Ñ\81он Ð±Ð¾Ð»Ð¾Ð»Ñ\82ой.',
 'spamprotectionmatch' => 'Дараах текст нь манай спамаас хамгаалах шүүлтүүрт баригдлаа: $1',
 'spambot_username' => 'МедиаВикигийн спамыг цэвэрлэх',
 'spam_reverting' => '$1 руух холбоосгүй хамгийн сүүлийн хувилбар руу шилжүүлж байна',
@@ -2628,7 +2669,7 @@ $1',
 'markaspatrolleddiff' => 'Хяналтанд авъя',
 'markaspatrolledtext' => 'Үүнийг хяналтанд авъя',
 'markedaspatrolled' => 'Хяналтанд авсан',
-'markedaspatrolledtext' => 'СонгоÑ\81он нэмэлт/өөрчлөлтийг хяналтанд авлаа.',
+'markedaspatrolledtext' => 'Уг Ñ\81онгоÑ\81он [[:$1]]  нэмэлт/өөрчлөлтийг хяналтанд авлаа.',
 'rcpatroldisabled' => 'Сүүлийн өөрчлөлтүүдийн эргүүл хаагдсан байна',
 'rcpatroldisabledtext' => 'Сүүлийн өөрчлөлтүүдийн эргүүл одоогоор хаагдсан байна.',
 'markedaspatrollederror' => 'Хяналтанд авч чадсангүй',
@@ -2656,8 +2697,8 @@ $1',
 'nextdiff' => 'Удаах засвар →',
 
 # Media information
-'mediawarning' => "'''Анхаар''':Энэ файл нь хор нөлөөтэй код агуулсан байж болзошгүй, хэрвээ ачааллавал таны системийн аюулгүй байдал доройтож болзошгүй.",
-'imagemaxsize' => 'Доорх шаардлагын дагуу зургын хуудсанд хязгаарлалт хийлээ:',
+'mediawarning' => "'''Анхаар''': Энэ файл нь хор нөлөөтэй код агуулсан байж болзошгүй, үүнийг ачааллах аваас системийн хамгаалалт тань доройтож болзошгүй.",
+'imagemaxsize' => "Зурагны хэмжээний хязгаар :<br />''(файлын тайлбар хуудсууд)''",
 'thumbsize' => 'Жижиг зургийн хэмжээ:',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|хуудас|хуудас}}',
 'file-info' => 'файлын хэмжээ: $1, MIME төрөл: $2',
@@ -2689,7 +2730,7 @@ $1',
 # Bad image list
 'bad_image_list' => 'Формат дараах байдлаар байна:
 
-Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
+Зөвхөн жагсаагдсан зүйлс (*-аар эхлэх мөрүүд) тооцогдоно.
 Мөр дэх эхний линк муу файл руух холбоос байж таарна.
 Үүнтэй адил мөр дэх бусад линкүүд тооцогдохгүй. Өөрөөр хэлбэл, файлын орж болзошгүй хуудсууд юм.',
 
@@ -2699,8 +2740,8 @@ $1',
 Хэрэв энэ файл анхныхаа байдлаас өөрчлөгдсөн бол зарим мэдээлэл нь одоогийн хувилбартайгаа нийцэхгүй байж магадгүй.',
 'metadata-expand' => 'Дэлгэрэнгүй мэдээллийг харуулах',
 'metadata-collapse' => 'Дэлгэрэнгүй мэдээллийг нуух',
-'metadata-fields' => 'Энэ мэдэгдэлд байгаа EXIF мэдээллийн талбарууд мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81ад Ð½Ñ\8c Ð°Ð½Ñ\85нааÑ\81аа Ñ\85аÑ\80агдаÑ\85гүй Ð±Ð°Ð¹Ð½а.
+'metadata-fields' => 'Энэ мэдэгдэлд байгаа зурагний мэдээллийн талбарууд нь мэдээллийн хүснэгт буулгагдсан үед зургын хуудсанд харагдана.
\91Ñ\83Ñ\81дÑ\8bг Ð°Ð½Ñ\85нÑ\8b Ñ\82оÑ\85иÑ\80гоогооÑ\80 Ð½Ñ\83Ñ\83Ñ\86алÑ\81ан Ð±Ð°Ð¹Ð³Ð°а.
 * make
 * model
 * datetimeoriginal
@@ -2748,8 +2789,8 @@ $1',
 'exif-colorspace' => 'Өнгөний завсар',
 'exif-componentsconfiguration' => 'Бүх бүрэлдэхүүн хэсгүүдийн утга',
 'exif-compressedbitsperpixel' => 'Зургийн файлыг шахах арга',
-'exif-pixelydimension' => 'Зургийн хүчинтэй өргөн',
-'exif-pixelxdimension' => 'Зургийн хүчинтэй өндөр',
+'exif-pixelydimension' => 'Зургийн өргөн',
+'exif-pixelxdimension' => 'Зургийн өндөр',
 'exif-usercomment' => 'Хэрэглэгчдийн тэмдэглэл',
 'exif-relatedsoundfile' => 'Холбоотой дуун файл',
 'exif-datetimeoriginal' => 'Мэдээллийг үүсгэсэн огноо ба цаг',
@@ -2758,14 +2799,14 @@ $1',
 'exif-subsectimeoriginal' => 'ОгнооЦагАнхны дэдсекунд',
 'exif-subsectimedigitized' => 'ОгнооЦагДижитал дэдсекунд',
 'exif-exposuretime' => 'Гэрэл өгөх хугацаа',
-'exif-exposuretime-format' => '$1 секунд ($2)',
+'exif-exposuretime-format' => '$1 секунд ($2)',
 'exif-fnumber' => 'Харьцангуй диафрагм',
 'exif-exposureprogram' => 'Гэрэл өгөх хугацааны программ',
 'exif-spectralsensitivity' => 'Спектралийн мэдрэмтгий байдал',
 'exif-isospeedratings' => 'ISO хурдны үнэлгээ',
-'exif-shutterspeedvalue' => 'Хөшигний хурд',
-'exif-aperturevalue' => 'Дурангийн өрц',
-'exif-brightnessvalue' => 'Ð\93Ñ\8dÑ\80Ñ\8dлÑ\82Ñ\8dлÑ\82',
+'exif-shutterspeedvalue' => 'Хөшигний APEX хурд \\',
+'exif-aperturevalue' => 'Дурангийн өрц  \\',
+'exif-brightnessvalue' => 'ТодÑ\80ол Ð±Ò¯Ð´Ñ\8dгÑ\80Ñ\8dл',
 'exif-exposurebiasvalue' => 'Гэрэл өгөх хурдны тохиргооны хэмжээ',
 'exif-maxaperturevalue' => 'Газрын диафрагмын дээд өргөн',
 'exif-subjectdistance' => 'Субъектийн орших зай',
@@ -2838,9 +2879,9 @@ $1',
 'exif-orientation-3' => '180° эргүүллээ',
 'exif-orientation-4' => 'Босоогоор эргүүлэх',
 'exif-orientation-5' => 'Цагийн зүүний эсрэгээр 90° эргүүлж босоогоор эргүүллээ',
-'exif-orientation-6' => 'Цагийн зүүний дагуу 90° эргүүллээ',
+'exif-orientation-6' => 'Цагийн зүүний дагуу 90° эргүүлсэн байдал',
 'exif-orientation-7' => 'Цагийн зүүний дагуу 90° эргүүлж босоогоор эргүүллээ',
-'exif-orientation-8' => 'Цагийн зүүний эсрэгээр 90° эргүүллээ',
+'exif-orientation-8' => 'Цагийн зүүний эсрэг 90° эргүүлсэн байдал',
 
 'exif-planarconfiguration-1' => 'Chunky формат',
 
@@ -2947,9 +2988,9 @@ $1',
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'Километр',
 'exif-gpsdestdistance-m' => 'Милл',
-'exif-gpsdestdistance-n' => 'тохой урт',
+'exif-gpsdestdistance-n' => 'бээр',
 
-'exif-objectcycle-b' => 'Өглөө Ð¾Ñ\80ойн Ð°Ð»Ð¸Ð½Ð´ ч',
+'exif-objectcycle-b' => 'ӨдөÑ\80 Ñ\87 Ñ\88өнө ч',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Бодит чиглэл',
@@ -3196,6 +3237,16 @@ $5
 'blankpage' => 'Хоосон хуудас',
 'intentionallyblankpage' => 'Энэхүү хуудсыг албаар хоосон үлдээв.',
 
+# External image whitelist
+'external_image_whitelist' => '#Энэ мөрийг яг хэвээр нь үлдээнэ үү<pre>
+#Доорх хэсэгт regular expression-ээр бичсэн хэсгүүдийг (//-н дунд л байх хэсэг) оруул
+#Эдгээрийг гадаад (шууд холбосон) зургуудын URL-тай тохируулах болно
+#Тохирсон бол зураг болж харагдана, үгүй бол зураг руух холбоос л гарна
+#"#"-аар эхлэсэн мөрүүдийг коммент гэж тооцоно
+#Том жижиг үсэг үл харгалзана
+
+#Дээрх хэсэгт regular expression-ээр бичсэн хэсгүүдийг оруул. Энэ мөрийг яг хэвээр нь үлдээнэ үү</pre>',
+
 # Special:Tags
 'tags' => 'Хүчинтэй өөрчлөлтийн тагууд',
 'tag-filter' => '[[Special:Tags|Тагийн]] шүүлтүүр:',
index d0c529b..7be1c24 100644 (file)
@@ -28,6 +28,7 @@
  * @author Rahuldeshmukh101
  * @author Rdeshmuk
  * @author Sankalpdravid
+ * @author Sau6402
  * @author Shantanoo
  * @author Shreewiki
  * @author Shreyas19
@@ -69,47 +70,49 @@ $namespaceAliases = array(
 
 # !!# sqlविचारा is not in normalised form, which is Sqlविचारा or Sqlविचारा
 $specialPageAliases = array(
-       'Activeusers'               => array( 'à¤\95ारà¥\8dयरतसदस्य' ),
+       'Activeusers'               => array( 'सà¤\95à¥\8dरिय_सदस्य' ),
        'Allmessages'               => array( 'सर्व_निरोप' ),
        'Allpages'                  => array( 'सर्व_पाने' ),
        'Ancientpages'              => array( 'जुनी_पाने' ),
-       'Blankpage'                 => array( 'कोरेपान' ),
-       'Block'                     => array( 'प्रतिबंध', 'अंकपत्ताप्रतिबंध', 'सदस्यप्रतिबंध' ),
-       'Blockme'                   => array( 'मलाप्रतिबंधकरा' ),
-       'Booksources'               => array( 'पुस्तकस्रोत' ),
+       'Blankpage'                 => array( 'कोरे_पान' ),
+       'Block'                     => array( 'प्रतिबंध', 'अंकपत्ता_प्रतिबंध', 'सदस्य_प्रतिबंध' ),
+       'Blockme'                   => array( 'मला_प्रतिबंध_करा' ),
+       'Booksources'               => array( 'पुस्तक_स्रोत' ),
        'BrokenRedirects'           => array( 'चुकीची_पुनर्निर्देशने' ),
        'Categories'                => array( 'वर्ग' ),
-       'ChangePassword'            => array( 'परवलीचाशब्दबदला' ),
-       'Confirmemail'              => array( 'विपत्रनक्कीकरा' ),
+       'ChangeEmail'               => array( 'विपत्र_बदला' ),
+       'ChangePassword'            => array( 'परवलीचा_शब्द_बदला' ),
+       'ComparePages'              => array( 'पानांची_तुलना' ),
+       'Confirmemail'              => array( 'विपत्र_नक्की_करा' ),
        'Contributions'             => array( 'योगदान' ),
-       'CreateAccount'             => array( 'सदस्यनोंद' ),
+       'CreateAccount'             => array( 'सदस्य_नोंद' ),
        'Deadendpages'              => array( 'टोकाची_पाने' ),
-       'DeletedContributions'      => array( 'वगळलेलीयोगदाने' ),
-       'Disambiguations'           => array( 'नि:संदिग्धीकरण' ),
+       'DeletedContributions'      => array( 'वगळलेली_योगदाने' ),
+       'Disambiguations'           => array( 'निसंदिग्धीकरण' ),
        'DoubleRedirects'           => array( 'दुहेरी_पुनर्निर्देशने' ),
-       'Emailuser'                 => array( 'विपत्रवापरकर्ता' ),
+       'Emailuser'                 => array( 'विपत्र_वापरकर्ता' ),
        'Export'                    => array( 'निर्यात' ),
-       'Fewestrevisions'           => array( 'कमीतकमीआवर्तने' ),
-       'FileDuplicateSearch'       => array( 'दुहेरीसंचिकाशोध' ),
+       'Fewestrevisions'           => array( 'कमीत_कमी_आवर्तने' ),
+       'FileDuplicateSearch'       => array( 'दुहेरी_संचिका_शोध' ),
        'Filepath'                  => array( 'संचिकेचा_पत्ता_(पाथ)' ),
        'Import'                    => array( 'आयात' ),
-       'Invalidateemail'           => array( 'à¤\9aà¥\82à¤\95दिनाà¤\82à¤\95विपत्र' ),
-       'BlockList'                 => array( 'प्रतिबंधनसुची' ),
+       'Invalidateemail'           => array( 'à¤\85à¤\97à¥\8dराहà¥\8dय_विपत्र' ),
+       'BlockList'                 => array( 'प्रतिबंधन_सुची' ),
        'LinkSearch'                => array( 'दुवाशोध' ),
        'Listadmins'                => array( 'प्रबंधकांची_यादी' ),
        'Listbots'                  => array( 'सांगकाम्यांची_यादी' ),
        'Listfiles'                 => array( 'चित्रयादी' ),
        'Listgrouprights'           => array( 'गट_अधिकार_यादी' ),
-       'Listredirects'             => array( 'पुर्ननिर्देशनसुची' ),
+       'Listredirects'             => array( 'पुर्ननिर्देशन_सुची' ),
        'Listusers'                 => array( 'सदस्यांची_यादी' ),
-       'Lockdb'                    => array( 'à¤\95à¥\81लà¥\81पबà¤\82द_à¤\95रा_(डà¥\87à¤\9fाबà¥\87स)' ),
+       'Lockdb'                    => array( 'डà¥\87à¤\9fाबà¥\87स_à¤\95à¥\81लà¥\81पबà¤\82द_à¤\95रा' ),
        'Log'                       => array( 'नोंद', 'नोंदी' ),
-       'Lonelypages'               => array( 'à¤\8fà¤\95लपाने' ),
+       'Lonelypages'               => array( 'à¤\8fà¤\95ाà¤\95à¥\80_पाने' ),
        'Longpages'                 => array( 'मोठी_पाने' ),
        'MergeHistory'              => array( 'इतिहास_एकत्र_करा' ),
-       'MIMEsearch'                => array( 'माईमशोध' ),
+       'MIMEsearch'                => array( 'माईम‌_शोध' ),
        'Mostcategories'            => array( 'सर्वात_जास्त_वर्ग' ),
-       'Mostimages'                => array( 'सर्वाधिकसांधलेलीसंचिका' ),
+       'Mostimages'                => array( 'सर्वाधिक_सांधलेली_संचिका' ),
        'Mostlinked'                => array( 'सर्वात_जास्त_जोडलेली' ),
        'Mostlinkedcategories'      => array( 'सर्वात_जास्त_जोडलेले_वर्ग', 'सर्वात_जास्त_वापरलेले_वर्ग' ),
        'Mostlinkedtemplates'       => array( 'सर्वात_जास्त_जोडलेले_साचे', 'सर्वात_जास्त_वापरलेले_साचे' ),
@@ -118,15 +121,15 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'माझे_योगदान' ),
        'Mypage'                    => array( 'माझे_पान' ),
        'Mytalk'                    => array( 'माझ्या_चर्चा' ),
-       'Newimages'                 => array( 'नवीन_चित्रे' ),
+       'Newimages'                 => array( 'नवà¥\80न_सà¤\82à¤\9aिà¤\95ा', 'नवà¥\80न_à¤\9aितà¥\8dरà¥\87' ),
        'Newpages'                  => array( 'नवीन_पाने' ),
        'Popularpages'              => array( 'प्रसिद्ध_पाने' ),
        'Preferences'               => array( 'पसंती' ),
        'Prefixindex'               => array( 'उपसर्गसुची' ),
        'Protectedpages'            => array( 'सुरक्षित_पाने' ),
        'Protectedtitles'           => array( 'सुरक्षित_शीर्षके' ),
-       'Randompage'                => array( 'à¤\85विशिषà¥\8dà¤\9f', 'à¤\85विशिषà¥\8dà¤\9f_पृष्ठ' ),
-       'Randomredirect'            => array( 'अविशिष्टपुर्ननिर्देशन' ),
+       'Randompage'                => array( 'à¤\95à¥\8bणतà¥\87हà¥\80', 'à¤\95à¥\8bणतà¥\87हà¥\80_पृष्ठ' ),
+       'Randomredirect'            => array( 'अविशिष्ट_पुर्ननिर्देशन' ),
        'Recentchanges'             => array( 'अलीकडील_बदल' ),
        'Recentchangeslinked'       => array( 'सांधलेलेअलिकडीलबदल' ),
        'Revisiondelete'            => array( 'आवर्तनवगळा' ),
@@ -136,27 +139,27 @@ $specialPageAliases = array(
        'Statistics'                => array( 'सांख्यिकी' ),
        'Tags'                      => array( 'खूणा' ),
        'Uncategorizedcategories'   => array( 'अवर्गीकृत_वर्ग' ),
-       'Uncategorizedimages'       => array( 'अवर्गीकृत_चित्रे' ),
+       'Uncategorizedimages'       => array( 'à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त_सà¤\82à¤\9aिà¤\95ा', 'à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त_à¤\9aितà¥\8dरà¥\87' ),
        'Uncategorizedpages'        => array( 'अवर्गीकृत_पाने' ),
        'Uncategorizedtemplates'    => array( 'अवर्गीकृत_साचे' ),
        'Undelete'                  => array( 'काढणे_रद्द_करा' ),
        'Unlockdb'                  => array( 'विदागारताळेउघडा' ),
        'Unusedcategories'          => array( 'न_वापरलेले_वर्ग' ),
        'Unusedimages'              => array( 'न_वापरलेली_चित्रे' ),
-       'Unusedtemplates'           => array( 'नà¤\89पयà¥\8bà¤\97ातà¤\86णलà¥\87लासाà¤\9aा' ),
-       'Unwatchedpages'            => array( 'अप्रेक्षीतपाने' ),
+       'Unusedtemplates'           => array( 'à¤\89पयà¥\8bà¤\97ात_नसलà¥\87लà¥\87_साà¤\9aà¥\87' ),
+       'Unwatchedpages'            => array( 'अप्रेक्षीत_पाने' ),
        'Upload'                    => array( 'चढवा' ),
-       'Userlogin'                 => array( 'सदस्यप्रवेश' ),
-       'Userlogout'                => array( 'सदस्यबहिर्गमन' ),
+       'Userlogin'                 => array( 'सदस्य_प्रवेश' ),
+       'Userlogout'                => array( 'सदस्य‌_बहिर्गमन' ),
        'Userrights'                => array( 'खातेदाराचे_अधिकार' ),
        'Version'                   => array( 'आवृत्ती' ),
        'Wantedcategories'          => array( 'हवे_असलेले_वर्ग' ),
-       'Wantedfiles'               => array( 'संचिकाहवी' ),
+       'Wantedfiles'               => array( 'संचिका_हवी' ),
        'Wantedpages'               => array( 'हवे_असलेले_लेख' ),
-       'Wantedtemplates'           => array( 'साचाहवा' ),
-       'Watchlist'                 => array( 'पहारà¥\8dâ\80\8dयाà¤\9aà¥\80_सà¥\82à¤\9aà¥\80' ),
+       'Wantedtemplates'           => array( 'साचा_हवा' ),
+       'Watchlist'                 => array( 'नितà¥\8dयâ\80\8c_पहाणà¥\8dयाà¤\9aà¥\80_सà¥\82à¤\9aà¥\80' ),
        'Whatlinkshere'             => array( 'येथे_काय_जोडले_आहे' ),
-       'Withoutinterwiki'          => array( 'विनाà¤\86à¤\82तरविà¤\95ि' ),
+       'Withoutinterwiki'          => array( 'à¤\86à¤\82तरविà¤\95ि_शिवाय' ),
 );
 
 $magicWords = array(
@@ -340,7 +343,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' => 'सूचना विरोपात माझा विरोपाचा (ई-मेल ) पत्ता दाखवा',
@@ -356,7 +359,7 @@ $messages = array(
 'tog-watchlisthidebots' => 'पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा',
 'tog-watchlisthideminor' => 'माझ्या पहाऱ्याच्या सूचीतून छोटे बदल लपवा',
 'tog-watchlisthideliu' => 'पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा',
-'tog-watchlisthideanons' => 'पहाâ\80\8dऱ्याच्या सूचीतून अनामिक सदस्यांची संपादने लपवा',
+'tog-watchlisthideanons' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£्याच्या सूचीतून अनामिक सदस्यांची संपादने लपवा',
 'tog-watchlisthidepatrolled' => 'पहाऱ्याच्या सूचीतून तपासलेली संपादने लपवा',
 'tog-ccmeonemails' => 'मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा',
 'tog-diffonly' => 'निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.',
@@ -516,7 +519,7 @@ $messages = array(
 'talkpage' => 'चर्चा पृष्ठ',
 'talkpagelinktext' => 'चर्चा',
 'specialpage' => 'विशेष पृष्ठ',
-'personaltools' => 'वैयक्तिक साधने',
+'personaltools' => 'वैयक्तिक साधने',
 'postcomment' => 'नवीन चर्चा',
 'articlepage' => 'लेख पृष्ठ',
 'talk' => 'चर्चा',
@@ -600,7 +603,7 @@ $1',
 'page-rss-feed' => '"$1" आर.एस.एस.रसद (RSS Feed)',
 'page-atom-feed' => '"$1" ऍटम रसद (Atom Feed)',
 'feed-atom' => 'ॲटम',
-'feed-rss' => 'आर.एस.एस.',
+'feed-rss' => 'आर.एस.एस.',
 'red-link-title' => '$1 (पान अस्तित्वात नाही)',
 'sort-descending' => 'उतरत्या क्रमाने लावा',
 'sort-ascending' => 'चढत्या क्रमाने लावा',
@@ -686,14 +689,14 @@ MySQL returned error "$3: $4".',
 'viewsourcetext' => 'तुम्ही या पानाचा स्रोत पाहू शकता व प्रत करू शकता:',
 'viewyourtext' => 'तुम्ही या पानाचे स्त्रोत पाहू शकता व प्रत करू शकता',
 'protectedinterface' => 'हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.',
-'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे(Software) संपर्कमाध्यम मजकुर असलेले पान संपादीत करित  आहात.या पानावरील बदल इतर उपयोगकर्त्यांच्या  उपयोगकर्ता-संपर्कमाध्यमाचे स्वरूप पालटवू शकते.भाषांतरणांकरिता कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr बीटाविकि] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
+'editinginterface' => "'''सावधान:''' तुम्ही संचेतनाचे (Software) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते. भाषांतरासाठी  कृपया मिडीयाविकि स्थानिकीकरण प्रकल्पाच्या [//translatewiki.net/wiki/Main_Page?setlang=mr translatewiki.net] सुविधेचा उपयोग करण्याबद्दल विचार करा.",
 'sqlhidden' => 'छूपी एस्क्यूएल पृच्छा (SQL query hidden)',
 'cascadeprotected' => 'हे पान संपादनांपासून सुरक्षित केले गेलेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे, की जे पान/जी पाने शिडी पर्यायाने सुरक्षित आहेत:
 $2',
 'namespaceprotected' => "'''$1''' नामविश्वातील पाने बदलण्याची आपणांस परवानगी नाही.",
 'customcssprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे सीएसएस पान संपादीत करण्याची परवानगी नाही.',
 'customjsprotected' => 'या पानावर इतर सदस्याच्या व्यक्तिगत पसंती असल्यामुळे, तुम्हाला हे JavaScript पान संपादीत करण्याची परवानगी नाही.',
-'ns-specialprotected' => 'विशà¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¸à¤\82पादà¥\80त करता येत नाहीत.',
+'ns-specialprotected' => 'विशà¥\87ष à¤ªà¤¾à¤¨à¥\87 à¤¸à¤\82पादित करता येत नाहीत.',
 'titleprotected' => "या शीर्षकाचे पान सदस्य [[User:$1|$1]]ने निर्मीत करण्यापासून सुरक्षित केलेले आहे.
 ''$2'' हे कारण नमूद केलेले आहे.",
 
@@ -785,8 +788,8 @@ $2',
 
 जर ही नोंदणी चुकीने झाली असेल तर तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.',
 'usernamehasherror' => 'सदस्यनामात "हॅश" वर्ण असू शकत नाहीत.',
-'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
-कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
+'login-throttled' => 'तुम्ही प्रवेश करण्यासाठी खूप प्रयत्न केले आहेत.
+कृपया पुन्हा प्रयत्न करण्याआधी थांबा',
 'login-abort-generic' => 'तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.',
 'loginlanguagelabel' => 'भाषा: $1',
 'suspicious-userlogout' => 'तुमचे अदाखल होणे प्रतिबंधित झाले कारण असे दिसते की ते तुटलेल्या न्याहाळकाद्वारे पाठवले गेले.',
@@ -881,7 +884,7 @@ $2',
 'showlivepreview' => 'थेट झलक',
 'showdiff' => 'बदल दाखवा',
 'anoneditwarning' => "'''इशारा:''' तुम्ही विकिपीडियाचे सदस्य म्हणून प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंक पत्ता (आयपी) नोंदला जाईल.",
-'anonpreviewwarning' => "\"'''सावधान:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤®à¥\8dहणà¥\82न à¤ªà¥\8dरवà¥\87श (लà¥\89à¤\97-à¤\87न) à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¸à¤\82पादन à¤\87तिहासात à¤¤à¥\81मà¤\9aा à¤\86य.पà¥\80. à¤\85à¤\82à¤\95पतà¥\8dता (à¤\85â\80\8dà¥\85ड्रेस) नोंदला जाईल.\"",
+'anonpreviewwarning' => "\"'''सावधान:''' à¤¤à¥\81मà¥\8dहà¥\80 à¤µà¤¿à¤\95िपà¥\80डियाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤®à¥\8dहणà¥\82न à¤ªà¥\8dरवà¥\87श (लà¥\89à¤\97-à¤\87न) à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¸à¤\82पादन à¤\87तिहासात à¤¤à¥\81मà¤\9aा à¤\85à¤\82à¤\95पतà¥\8dता (à¤\86य.पà¥\80. à¥²ड्रेस) नोंदला जाईल.\"",
 'missingsummary' => "'''आठवण:''' तूम्ही संपादन सारांश पुरवलेला नाही.आपण जतन करा वर पुन्हा टीचकी मारली तर तेत्या शिवाय जतन होईल.",
 'missingcommenttext' => 'कृपया खाली प्रतिक्रीया भरा.',
 'missingcommentheader' => "'''आठवण:''' आपण या लेखनाकरिता विषय किंवा अधोरेषा दिलेली नाही. आपण पुन्हा जतन करा अशी सूचना केली तर, तुमचे संपादन त्याशिवायच जतन होईल.",
@@ -936,7 +939,7 @@ $2',
 'noarticletext-nopermission' => 'या लेखात सध्या काहीही मजकूर नाही.
 तुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}|मथळ्याच्या शोध घेऊ शकता]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर याद्या शोधा],
 किंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.',
-'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\87 à¤¨à¥\8bà¤\82दà¥\80à¤\95à¥\84त à¤¨à¤¾à¤¹à¥\80.à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादà¥\80त किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
+'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" à¤¸à¤¦à¤¸à¥\8dय à¤\96ातà¥\8dयाà¤\9aà¥\80 à¤¨à¥\8bà¤\82द à¤¨à¤¾à¤¹à¥\80. à¤\95à¥\83पया à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादित किंवा नव्याने तयार करू इच्छिता का या बद्दल विचार करा.',
 'userpage-userdoesnotexist-view' => 'सदस्यखाते "$1"  हे नोंदलेले नाही.',
 'blocked-notice-logextract' => 'हा सदस्य सध्या प्रतिबंधित आहे.
 सर्वांत नवीन प्रतिबंधन यादी खाली संदर्भासाठी दिली आहे:',
@@ -956,6 +959,7 @@ $2',
 'updated' => '(बदल झाला आहे.)',
 'note' => "'''सूचना:'''",
 'previewnote' => "'''लक्षात ठेवा की ही फक्त झलक आहे''', बदल अजून जतन करण्यात आलेले नाहीत.",
+'continue-editing' => 'संपादन चालु राहुदे',
 'previewconflict' => 'वरील संपादन क्षेत्रातील मजकूर जतन केल्यावर या झलकेप्रमाणे दिसेल.',
 'session_fail_preview' => "'''क्षमस्व! सत्र विदेच्या क्षयामुळे आम्ही तुमची संपादन प्रक्रीया पार पाडू शकलो नाही.कृपया पुन्हा प्रयत्न करा.जर एवढ्याने काम झाले नाही तर सदस्य खात्यातून बाहेर पडून पुन्हा प्रवेश करून पहा.'''",
 'session_fail_preview_html' => "'''क्षमस्व! सत्र विदेच्या क्षयामुळे आम्ही तुमची संपादन प्रक्रीया पार पाडू शकलो नाही.'''
@@ -968,6 +972,7 @@ $2',
 असे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
 'edit_form_incomplete' => '”’तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा.',
 'editing' => '$1 चे संपादन होत आहे.',
+'creating' => '$1 ची निर्मिती सुरु आहे',
 'editingsection' => '$1 (विभाग) संपादन',
 'editingcomment' => '$1 चे संपादन (प्रतिक्रिया)',
 'editconflict' => 'वादग्रस्त संपादन: $1',
@@ -1217,7 +1222,8 @@ $1",
 
 # Diffs
 'history-title' => '"$1" चा संपादन इतिहास',
-'difference' => '(आवर्तनांमधील फरक)',
+'difference-title' => '"$1" च्या विविध उजळण्या',
+'difference-title-multipage' => '"$1" व "$2" या पानान मधला फरक',
 'difference-multipage' => '(पानांमधील फरक)',
 'lineno' => 'ओळ $1:',
 'compareselectedversions' => 'निवडलेल्या आवृत्त्यांमधील बदल पहा',
@@ -1232,7 +1238,7 @@ $1",
 'searchresulttext' => '{{SITENAME}} वरील माहिती कशी शोधावी, याच्या माहिती करता पहा - [[{{MediaWiki:Helppage}}|{{SITENAME}} वर शोध कसा घ्यावा]].',
 'searchsubtitle' => 'तुम्ही \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|"$1" ने सुरू होणारी सर्व पाने]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ला जोडणारी सर्व पाने]]) याचा शोध घेत आहात.',
 'searchsubtitleinvalid' => "तुम्ही '''$1''' या शब्दाचा शोध घेत आहात.",
-'toomanymatches' => 'à¤\96à¥\82प à¤\8fà¤\95सारà¤\96à¥\80 à¤\89तà¥\8dतरà¥\87 à¤®à¤¿à¤³à¤¾à¤²à¥\80, à¤\95à¥\83पया à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤µà¥\87à¤\97ळà¥\8dया à¤¤à¤°à¥\8dâ\80\8dहà¥\87नà¥\87 à¤\95रà¥\82न à¤ªà¤¹à¤¾',
+'toomanymatches' => 'à¤\96à¥\82प à¤\8fà¤\95सारà¤\96à¥\80 à¤\89तà¥\8dतरà¥\87 à¤®à¤¿à¤³à¤¾à¤²à¥\80, à¤\95à¥\83पया à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤µà¥\87à¤\97ळà¥\8dया à¤¤à¤±à¥\8dहà¥\87नà¥\87 à¤\95रà¥\82न à¤ªà¤¹à¤¾',
 'titlematches' => 'पानाचे शीर्षक जुळते',
 'notitlematches' => 'कोणत्याही पानाचे शीर्षक जुळत नाही',
 'textmatches' => 'पानातील मजकुर जुळतो',
@@ -1421,9 +1427,9 @@ $1",
 'userrights' => 'सदस्य अधिकार व्यवस्थापन',
 'userrights-lookup-user' => 'सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.',
 'userrights-user-editname' => 'सदस्य नाव टाका:',
-'editusergroup' => 'सदस्य गट (ग्रूप्स) संपादीत करा',
+'editusergroup' => 'सदस्याचे गट संपादित करा',
 'editinguser' => "सदस्य '''[[User:$1|$1]]''' $2 चे सदस्य अधिकारात बदल केला जात आहे.",
-'userrights-editusergroup' => 'सदस्य मंडळे संपादीत करा',
+'userrights-editusergroup' => 'सदस्याचे गट संपादित करा',
 'saveusergroups' => 'सदस्य गट जतन करा',
 'userrights-groupsmember' => '(चा) सभासद:',
 'userrights-groupsmember-auto' => 'चा निर्विवाद सदस्य:',
@@ -1572,7 +1578,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|बदल|बदल}}',
 'recentchanges' => 'अलीकडील बदल',
 'recentchanges-legend' => 'अलीकडील बदल पर्याय',
-'recentchangestext' => 'विकितील अलीकडील बदल या पानावर दिसतात.',
+'recentchanges-summary' => 'विकितील अलीकडील बदल या पानावर दिसतात.',
 'recentchanges-feed-description' => 'या रसदीमधील विकीवर झालेले सर्वात अलीकडील बदल पहा.',
 'recentchanges-label-newpage' => 'या संपादनाने नवीन पान तयार झाले',
 'recentchanges-label-minor' => 'हा एक छोटा बदल आहे',
@@ -1611,7 +1617,7 @@ $1",
 'recentchangeslinked-title' => '"$1" च्या संदर्भातील बदल',
 'recentchangeslinked-noresult' => 'जोडलेल्या पानांमध्ये दिलेल्या कालावधीत काहीही बदल झालेले नाहीत.',
 'recentchangeslinked-summary' => "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.
-तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल]] à¤ªà¤¾à¤¨à¥\87 '''ठळà¤\95''' à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
+तà¥\81मà¤\9aà¥\8dया [[Special:Watchlist|नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल]] à¤ªà¤¾à¤¨à¥\87 '''ठळà¤\95''' à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
 'recentchangeslinked-page' => 'पृष्ठ नाव:',
 'recentchangeslinked-to' => 'याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा',
 
@@ -2035,7 +2041,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'listusers-editsonly' => 'फक्त संपादनांसहित सदस्य दाखवा',
 'listusers-creationsort' => 'निर्मितीच्या तारखेप्रमाणे लावा',
 'usereditcount' => '$1 {{PLURAL:$1|संपादन|संपादने}}',
-'usercreated' => '{{GENDER:$3|बनावला}} या $1 अत $2',
+'usercreated' => 'सदस्य खाते $3, $1 तारखेला, $2 वाजता बनवले गेले',
 'newpages' => 'नवीन पाने',
 'newpages-username' => 'सदस्य नाव:',
 'ancientpages' => 'जुनी पाने',
@@ -2085,6 +2091,9 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'allpagesbadtitle' => 'दिलेले शीर्षक चुकीचे किंवा आंतरभाषीय किंवा आंतरविकि शब्दाने सुरू होणारे होते. त्यात एक किंवा अधिक शीर्षकात न वापरता येणारी अक्षरे असावीत.',
 'allpages-bad-ns' => '{{SITENAME}}मध्ये "$1" हे नामविश्व नाही.',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'आखेरचे दृश्य',
+
 # Special:Categories
 'categories' => 'वर्ग',
 'categoriespagetext' => 'विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.
@@ -2190,9 +2199,9 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'watchnologin' => 'प्रवेश केलेला नाही',
 'watchnologintext' => 'तुमची पहाऱ्याची सूची बदलायची असेल तर तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असलाच पाहीजे.',
 'addwatch' => 'पहाऱ्याच्या सूचीमध्ये टाका',
-'addedwatchtext' => '"[[:$1]]"  à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया  [[Special:Watchlist|पहाऱà¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\8dयà¥\87]] टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि   [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
+'addedwatchtext' => '"[[:$1]]"  à¤¹à¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया  [[Special:Watchlist|नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80]]मधà¥\8dयà¥\87 टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील पुढील बदल येथे दाखवले जातील, आणि   [[Special:RecentChanges|अलीकडील बदलांमध्ये]] पान ठळक दिसेल.
 
-पहाऱ्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
+नितà¥\8dय à¤ªà¤¹à¤¾à¤£्याच्या सूचीतून पान काढायचे असेल तर "पहारा काढा" वर टिचकी द्या.',
 'removewatch' => 'पहाऱ्याच्या सूचीतून वगळा',
 'removedwatchtext' => '"[[:$1]]" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.',
 'watch' => 'पहारा',
@@ -2201,7 +2210,7 @@ Input:contenttype/subtype, e.g. <tt>image/jpeg</tt>.',
 'unwatchthispage' => 'पहारा काढून टाका',
 'notanarticle' => 'मजकुर विरहीत पान',
 'notvisiblerev' => 'आवृत्ती वगळण्यात आलेली आहे',
-'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावाधà¥\80त, à¤¤à¥\81मà¥\8dहà¥\80 à¤ªà¤¹à¤¾à¤°à¤¾ à¤ à¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¬à¤¾à¤¬ à¤¸à¤\82पादà¥\80त झाली नाही.',
+'watchnochange' => 'पà¥\8dरदरà¥\8dशित à¤\95ालावधà¥\80त, à¤¤à¥\81मà¥\8dहà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयासाठà¥\80 à¤ à¥\87वलà¥\87लà¥\80 à¤\95à¥\8bणतà¥\80हà¥\80 à¤¬à¤¾à¤¬ à¤¸à¤\82पादित झाली नाही.',
 'watchlist-details' => '{{PLURAL:$1|$1 पान|$1 पाने}} पहाऱ्याच्या सूचीमध्ये, चर्चा पाने मोजलेले नाहीत.',
 'wlheader-enotif' => '* विपत्र सूचना सुविधा ऊपलब्ध केली.',
 'wlheader-showupdated' => "* तुम्ही पानांस दिलेल्या शेवटच्या भेटी पासून बदललेली पाने '''ठळक''' दाखवली आहेत.",
@@ -2241,18 +2250,18 @@ $NEWPAGE
 विपत्र: $PAGEEDITOR_EMAIL
 विकि: $PAGEEDITOR_WIKI
 
-तà¥\81मà¥\8dहà¥\80 à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80 à¤¤à¥\8bपरà¥\8dयà¤\82त à¤ªà¥\81ढà¥\87 à¤¹à¥\8bणाऱà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\82à¤\9aà¥\80 à¤\87तर à¤\95à¥\8bणतà¥\80हà¥\80 à¤µà¥\87à¤\97ळà¥\80 à¤¸à¥\82à¤\9aना à¤¨à¤¸à¥\87ल. à¤¤à¥\81मà¥\8dहà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल à¤ªà¤¹à¤¾à¤°à¤¾ à¤ à¥\87वलेल्या पानांकरिताच्या सूचना पताकांचे पुर्नयोजन करु शकता.
+तà¥\81मà¥\8dहà¥\80 à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80 à¤¤à¥\8bपरà¥\8dयà¤\82त à¤ªà¥\81ढà¥\87 à¤¹à¥\8bणाऱà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\82à¤\9aà¥\80 à¤\87तर à¤\95à¥\8bणतà¥\80हà¥\80 à¤µà¥\87à¤\97ळà¥\80 à¤¸à¥\82à¤\9aना à¤¨à¤¸à¥\87ल. à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80मधà¥\80ल à¤\85सलेल्या पानांकरिताच्या सूचना पताकांचे पुर्नयोजन करु शकता.
 
-तà¥\81मà¤\9aà¥\80 à¤®à¥\88तà¥\8dरà¥\80पà¥\82रà¥\8dण {{SITENAME}} à¤¸à¥\81चना प्रणाली
+तà¥\81मà¤\9aà¥\80 à¤®à¥\88तà¥\8dरà¥\80पà¥\82रà¥\8dण {{SITENAME}} à¤¸à¥\82चना प्रणाली
 
 --
 
-तà¥\81मà¤\9aà¥\87 à¤ªà¤¹à¤¾à¤±à¥\8dयातà¥\80ल पानांची मांडणावळ (कोंदण) बदलू शकता, {{canonicalurl:{{#special:EditWatchlist}}}} ला भेट द्या
+तà¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया पानांची मांडणावळ (कोंदण) बदलू शकता, {{canonicalurl:{{#special:EditWatchlist}}}} ला भेट द्या
 
-हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\81à¤\9aà¥\80तà¥\81न à¤\95ाधà¥\81न à¤\9fाà¤\95णà¥\8dयासाठà¥\80 à¤\96लील दुव्यावर टिचकी मारा.
+हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\81न à¤\95ाढà¥\82न à¤\9fाà¤\95णà¥\8dयासाठà¥\80 à¤\96ालील दुव्यावर टिचकी मारा.
 $UNWATCHURL
 
-पà¥\81ढà¥\80ल à¤¸à¤¹à¤¾à¤¯à¥\8dय à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरà¥\80या:
+पà¥\81ढà¥\80ल à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय à¤\86णि à¤ªà¥\8dरतिà¤\95à¥\8dरिया:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -3165,7 +3174,7 @@ $1',
 'exif-countrycreated' => 'देश ज्याच्यात चित्र घेतले',
 'exif-countrycodecreated' => 'ज्या देशात छायाचित्र घेतले त्या देशाचे कोड',
 'exif-provinceorstatecreated' => 'जिथे छायाचित्र काढले तो प्रांत वा देश',
-'exif-citycreated' => 'à¤\9bायाà¤\9aितà¥\8dर à¤\98à¥\87तलà¥\87 â\80\8dâ\80\8dâ\80\8dâ\80\8d(काढले) ते शहर',
+'exif-citycreated' => 'à¤\9bायाà¤\9aितà¥\8dर à¤\9cà¥\8dया à¤¶à¤¹à¤°à¤¾à¤¤ à¤\98à¥\87तलà¥\87 (काढले) ते शहर',
 'exif-sublocationcreated' => 'शहराज्या ज्या परिसरात छायाचित्र काढले तो परिसर',
 'exif-worldregiondest' => 'जगाचा दर्शित केलेला भूभाग(प्रदेश)',
 'exif-countrydest' => 'दर्शविलेला देश',
@@ -3275,7 +3284,7 @@ $1',
 'exif-lightsource-0' => 'अज्ञात',
 'exif-lightsource-1' => 'सूर्यप्रकाश',
 'exif-lightsource-2' => 'फ्लूरोसेंट',
-'exif-lightsource-3' => 'à¤\9fà¤\82à¤\97सà¥\8dà¤\9fà¥\8dन (à¤\87नà¤\95à¥\85नà¥\8dâ\80\8dडà¥\87सà¥\87à¤\82à¤\9f प्रकाश)',
+'exif-lightsource-3' => 'à¤\9fà¤\82à¤\97सà¥\8dà¤\9fà¥\8dन (पà¥\8dरदà¥\80पà¥\8dत प्रकाश)',
 'exif-lightsource-4' => "लख'''लखाट''' (फ्लॅश)",
 'exif-lightsource-9' => 'चांगले हवामान',
 'exif-lightsource-10' => 'ढगाळ हवामान',
@@ -3306,12 +3315,12 @@ $1',
 'exif-focalplaneresolutionunit-2' => 'इंच',
 
 'exif-sensingmethod-1' => 'अव्यक्त',
-'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87नà¥\8dâ\80\8dसर',
-'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
-'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87नà¥\8dâ\80\8dसर',
-'exif-sensingmethod-5' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87णà¥\8dशà¥\80यल à¤\8fरà¥\80या à¤¸à¥\87à¤\82सà¥\89र',
-'exif-sensingmethod-7' => 'à¤\9fà¥\8dरायà¥\8dâ\80\8dà¤\8fलिनà¥\80यर à¤¸à¥\87à¤\82सर',
-'exif-sensingmethod-8' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87à¤\82शà¥\80यल à¤²à¤¿à¤¨à¥\80यर à¤¸à¥\87नà¥\8dâ\80\8dसर',
+'exif-sensingmethod-2' => 'वन à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87à¤\82सर',
+'exif-sensingmethod-3' => 'टू चीप कलर एरीया सेन्सर',
+'exif-sensingmethod-4' => 'थà¥\8dरà¥\80 à¤\9aà¥\80प à¤\95लर à¤\8fरà¥\80या à¤¸à¥\87à¤\82सर',
+'exif-sensingmethod-5' => 'कलर सिक्वेण्शीयल एरीया सेंसर',
+'exif-sensingmethod-7' => 'ट्रायलिनीयर सेंसर',
+'exif-sensingmethod-8' => 'à¤\95लर à¤¸à¤¿à¤\95à¥\8dवà¥\87à¤\82शà¥\80यल à¤²à¤¿à¤¨à¥\80यर à¤¸à¥\87à¤\82सर',
 
 'exif-filesource-3' => 'स्थिरचित्र  अंकीय छाउ (डिजीटल स्टील कॅमेरा)',
 
@@ -3332,11 +3341,11 @@ $1',
 'exif-scenecapturetype-2' => 'उभे',
 'exif-scenecapturetype-3' => 'रात्रीचे दृश्य',
 
-'exif-gaincontrol-0' => 'नाही',
-'exif-gaincontrol-1' => 'लà¤\98à¥\81 à¤µà¥\83दà¥\8dधà¥\80 à¤µà¤°',
-'exif-gaincontrol-2' => 'बà¥\83हतà¥\8dâ\80\8c à¤µà¥\83दà¥\8dधà¥\80 à¤µà¤°',
-'exif-gaincontrol-3' => 'लà¤\98à¥\81 à¤µà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
-'exif-gaincontrol-4' => 'बà¥\83हतà¥\8dâ\80\8c à¤µà¥\83दà¥\8dधà¥\80 à¤\96ालà¥\80',
+'exif-gaincontrol-0' => 'à¤\95ाहà¥\80हà¥\80 à¤¨à¤¾à¤¹à¥\80',
+'exif-gaincontrol-1' => 'दà¥\8dयà¥\81ति à¤¥à¥\8bडà¥\80 à¤µà¤¾à¤¢à¤µà¤¾',
+'exif-gaincontrol-2' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 à¤µà¤¾à¤¢à¤µà¤¾',
+'exif-gaincontrol-3' => 'दà¥\8dयà¥\81ति à¤¥à¥\8bडà¥\80 à¤\95मà¥\80 à¤\95रा',
+'exif-gaincontrol-4' => 'दà¥\8dयà¥\81ति à¤\85धिà¤\95 à¤\95मà¥\80 à¤\95रा',
 
 'exif-contrast-0' => 'सामान्य',
 'exif-contrast-1' => 'नरम',
@@ -3524,7 +3533,7 @@ $5
 'confirm-watch-button' => 'ठीक आहे',
 'confirm-watch-top' => 'हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?',
 'confirm-unwatch-button' => 'ठीक',
-'confirm-unwatch-top' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
+'confirm-unwatch-top' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढायà¤\9aà¥\87?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← मागील पान',
@@ -3564,18 +3573,18 @@ $5
 
 # Friendlier slave lag warnings
 'lag-warn-normal' => '$1 {{PLURAL:$1|सेकंदाच्या|सेकंदांच्या}} आतले बदल या यादी नसण्याची शक्यता आहे.',
-'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णारà¥\8dâ\80\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त à¤¨ à¤¦à¤¾à¤\96वलà¥\87 à¤\9cाणà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\86हà¥\87.',
+'lag-warn-high' => 'विदा à¤µà¤¿à¤¦à¤¾à¤¦à¤¾à¤¤à¥\8dयास à¤²à¤¾à¤\97णाऱà¥\8dया à¤\85तà¥\8dयà¥\81à¤\9aà¥\8dà¤\9a à¤\95ालावधà¥\80 à¤®à¥\81ळà¥\87, $1 {{PLURAL:$1|सà¥\87à¤\95à¤\82दापà¥\87à¤\95à¥\8dषा|सà¥\87à¤\95à¤\82दाà¤\82पà¥\87à¤\95à¥\8dषा}} à¤¨à¤µà¥\87 à¤¬à¤¦à¤² à¤¯à¤¾ à¤¸à¥\82à¤\9aà¥\80त à¤\95दाà¤\9aित à¤¦à¤¾à¤\96वलà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\9cाणार.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'चर्चा पाने सोडून, {{PLURAL:$1|1 शीर्षक पान|$1 शीर्षक पाने}} तुमच्या पहाऱ्याच्या सूचीमध्ये आहेत.',
-'watchlistedit-noitems' => 'पहारà¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤¨à¥\8bà¤\82दलà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80.',
+'watchlistedit-noitems' => 'नितà¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80त à¤\95à¥\8bणतà¥\87हà¥\80 à¤¶à¥\80रà¥\8dषà¤\95 à¤ªà¤¾à¤¨ à¤¨à¥\8bà¤\82दलà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80.',
 'watchlistedit-normal-title' => 'पहाऱ्याची सूचीचे संपादन करा',
-'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळा',
+'watchlistedit-normal-legend' => 'शà¥\80रà¥\8dषà¤\95पानà¥\87 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤\95ाढा',
 'watchlistedit-normal-explain' => 'तुमच्या पहार्‍याच्या सूचीतील अंतर्भूत नामावळी खाली निर्देशीत केली आहे. शीर्षक वगळण्याकरिता, त्या पुढील खिडकी निवडा, आणि शीर्षक वगळावर टिचकी मारा. तुम्ही [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.',
 'watchlistedit-normal-submit' => 'शिर्षक वगळा',
-'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 à¤¶à¤¿à¤°à¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¤¿र्षके होती }}:',
-'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रा.',
-'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त à¤\95रा.',
+'watchlistedit-normal-done' => 'तà¥\81मà¤\9aà¥\8dया à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\82न à¤µà¤\97ळलà¥\87लà¥\80 {{PLURAL:$1|1 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¥\8bतà¥\87 |$1 à¤¶à¥\80र्षके होती }}:',
+'watchlistedit-raw-title' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रा',
+'watchlistedit-raw-legend' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित à¤\95रा',
 'watchlistedit-raw-explain' => 'तुमच्या पहाऱ्याच्या सूचीतील अंतर्भूत नामावली खाली निर्देशित केली आहे, एका ओळीत एक नाव या पद्धतीने; ह्या यादीतील नावे वगळून किंवा भर घालून संपादित करून नामावली अद्ययावत(परिष्कृत) करता येते.
 पहाऱ्याची सूची अद्ययावत करा येथे टिचकी मारा.
 तुम्ही [[Special:EditWatchlist|प्रस्थापित संपादकाचा उपयोग]] सुद्धा करू शकता.',
@@ -3588,7 +3597,7 @@ $5
 # Watchlist editing tools
 'watchlisttools-view' => 'सुयोग्य बदल पहा',
 'watchlisttools-edit' => 'पहाऱ्याची  सूची पहा आणि संपादित करा',
-'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤ªà¤¹à¤¾à¤±à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादà¥\80त करा',
+'watchlisttools-raw' => 'à¤\95à¤\9aà¥\8dà¤\9aà¥\80 à¤¨à¤¿à¤¤à¥\8dय à¤ªà¤¹à¤¾à¤£à¥\8dयाà¤\9aà¥\80 à¤¸à¥\82à¤\9aà¥\80 à¤¸à¤\82पादित करा',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|चर्चा]])',
@@ -3625,6 +3634,9 @@ $5
 'version-software' => 'स्थापित संगणक प्रणाली (Installed software)',
 'version-software-product' => 'उत्पादन',
 'version-software-version' => 'आवृत्ती',
+'version-entrypoints' => 'आत येणारी यू॰आर॰एल',
+'version-entrypoints-header-entrypoint' => 'आत येण्याचा मार्ग',
+'version-entrypoints-header-url' => 'यू॰आर॰एल',
 
 # Special:FilePath
 'filepath' => 'संचिका मार्ग',
@@ -3808,4 +3820,16 @@ $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|शतकापूर्वी|शतकांपूर्वी }}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'सर्व्हर "$1" वरील कुलूप उघडू शकत नाही',
 );
index 3fb2ad6..d1b99aa 100644 (file)
@@ -46,125 +46,125 @@ $namespaceGenderAliases = array();
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Ажедмӓшвлӓм ыдыралаш',
-'tog-justify'                 => 'Текстӹм ӹлӹштӓш кымдык тӧрлӓш',
-'tog-hideminor'               => 'Изи тӧрлӹмӓшвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
-'tog-hidepatrolled'           => 'Патрулируйымы тӧрлӹмӓшвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
-'tog-newpageshidepatrolled'   => 'Патрулирыйымы ӹлӹшташвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
-'tog-extendwatchlist'         => 'Вангӹмашӹн (анжымашын) кымда списокшы, кышты остатка веле агыл, а цилӓ вашталтымашым пыртымы',
-'tog-usenewrc'                => 'У вашталтымашвлӓн яжорак списокым кычылтман (JavaScript келеш)',
-'tog-numberheadings'          => 'Артикль лӹмвлӓм автоматически нумеруяш',
-'tog-showtoolbar'             => 'Текстӹм тӧрлӹмӹ годым кӱшӹл панельӹм анжыкташ (JavaScript)',
-'tog-editondblclick'          => 'Ӹлӹшташвлӓм кок гӓнӓ темдӓл, тӧрлӓш (JavaScript)',
-'tog-editsection'             => '«Тӧрлӓш» ажедмӓшӹм м цилӓ секцилӓнок анжыкташ',
+'tog-underline' => 'Ажедмӓшвлӓм ыдыралаш',
+'tog-justify' => 'Текстӹм ӹлӹштӓш кымдык тӧрлӓш',
+'tog-hideminor' => 'Изи тӧрлӹмӓшвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
+'tog-hidepatrolled' => 'Патрулируйымы тӧрлӹмӓшвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
+'tog-newpageshidepatrolled' => 'Патрулирыйымы ӹлӹшташвлӓм у вашталтымашвлӓ лошты шӹлташ, анжыкташ агыл',
+'tog-extendwatchlist' => 'Вангӹмашӹн (анжымашын) кымда списокшы, кышты остатка веле агыл, а цилӓ вашталтымашым пыртымы',
+'tog-usenewrc' => 'У вашталтымашвлӓн яжорак списокым кычылтман (JavaScript келеш)',
+'tog-numberheadings' => 'Артикль лӹмвлӓм автоматически нумеруяш',
+'tog-showtoolbar' => 'Текстӹм тӧрлӹмӹ годым кӱшӹл панельӹм анжыкташ (JavaScript)',
+'tog-editondblclick' => 'Ӹлӹшташвлӓм кок гӓнӓ темдӓл, тӧрлӓш (JavaScript)',
+'tog-editsection' => '«Тӧрлӓш» ажедмӓшӹм м цилӓ секцилӓнок анжыкташ',
 'tog-editsectiononrightclick' => 'Секцим тӧрлӹмӹ годым артикль лӹмӹм каля доно вургымлашты темдӓлӓш (JavaScript)',
-'tog-showtoc'                 => 'Кӧргӹштӹш лӹмвлӓм анжыкташ (3 гӹц шукырак артикль лӹмӓн ӹлӹштӓшвлӓштӹ)',
-'tog-rememberpassword'        => 'Мӹньӹн шотыш нӓлмӹ сирмӓшем ти компьютерӹштӹ ӓштӓш (максимум $1 {{PLURAL:$1|кечы|кечы}})',
-'tog-watchcreations'          => 'Мӹньӹн ӹштӹмӹ ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
-'tog-watchdefault'            => 'Мӹньӹн вашталтымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
-'tog-watchmoves'              => 'Мӹньӹн лӹмӹм вашталтымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
-'tog-watchdeletion'           => 'Мӹньӹн карангдымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
-'tog-minordefault'            => 'Пäлдӹртӹмӹ агыл тöрлӹмäшвлäм когонжок керäлеш шотлаш агыл',
-'tog-previewontop'            => 'Текстӹм анзыц анжен лӓкмӹм тӧрлӹмӹ окня анзыкы шӹндӓш',
-'tog-previewonfirst'          => 'Текстӹм анзыц анжен лӓкмӹм тӧрлӓш тӹнгӓлмӹ анзыц анжыкташ',
-'tog-nocache'                 => 'Ӹлӹштӓшвлӓн кешированим цӓрӓш',
-'tog-enotifwatchlistpages'    => 'Мам вӓнгӹмӹ списокын ӹлӹштӓшӹштӹ вашталтымы, тӹдӹм эл. почта доно увертӓрӓш',
-'tog-enotifusertalkpages'     => 'Мам персональный ӹлӹштӓшӹштӹ дискуссилӓн пачмы, тӹ вашталтмашым эл. почта доно увертӓрӓш',
-'tog-enotifminoredits'        => 'Изи вашталтымашвлӓ гишӓнӓт эл. почта доно увертӓрӓш',
-'tog-enotifrevealaddr'        => 'Мӹньӹн эл. адресем увертӓрӹмвлӓштӹ анжыкташ',
-'tog-shownumberswatching'     => 'Манярын ӹлӹштӓшӹм вӓнгӹмӹ списокышкышты пыртенӹт, анжыкташ',
-'tog-oldsig'                  => 'Ылшы сирӹмӹ подписьӹм анзыцок анжен лӓктӓш',
-'tog-fancysig'                => 'Вики-пӓлӹкӹн ӹшке подписьшӹ (автоматический ажедмӓш гӹц пасна)',
-'tog-externaleditor'          => 'Тӱнӹш тӧрлӹшӹм кычылташ (компьютерӹн йори настройкыжы келеш)',
-'tog-externaldiff'            => 'Вариантвлӓн тӓнгӓштӓрӹмӹ годым тӱнӹш программым кычылташ (компьютерӹн йори настройкыжы келеш)',
-'tog-showjumplinks'           => '«ванжаш» палшышы ажедмӓшвлӓм чӱктӓш',
-'tog-uselivepreview'          => 'Текстӹм пӹсӹн анзыц анжен лӓкмӹм кычылташ (эксперимент семӹнь JavaScript)',
-'tog-forceeditsummary'        => 'Мам тӧрлӹмӹ тӹ «нырын» охыр ылмыжы гишӓн пӓлдӹртӓш',
-'tog-watchlisthideown'        => 'Мам тӧрленӓм, тӹдӹм вӓнгӹмӹ спискышты шӹлтӓш, анжыкташ агыл',
-'tog-watchlisthidebots'       => 'Ботвлӓм тӧрлӹмӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
-'tog-watchlisthideminor'      => 'Изи тӧрлӹмӓшвлӓм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
-'tog-watchlisthideliu'        => 'Лӹмӹштӹм анжыктышывлӓн тӧрлӹмӹштӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
-'tog-watchlisthideanons'      => 'Кӱ лӹмжӹм анжыктыде, тӹдӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
-'tog-watchlisthidepatrolled'  => 'Патрулируйымы тӧрлӹмӓшвлӓм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
-'tog-ccmeonemails'            => 'Кӱлӓн сирмӓшӹм сирем, тӹдӹн копижӹм мӹлӓм колташ',
-'tog-diffonly'                => 'Кок верси доно тӓнгӓштӓрен ӹлӹштӓшӹн текстшӹм колташ агыл',
-'tog-showhiddencats'          => 'Шӹлтӹмӹ категоривлӓм анжыкташ',
-'tog-norollbackdiff'          => 'Лишӹц колтымын вариантвлӓн айыртемӹштӹм анжыкташ агыл',
-
-'underline-always'  => 'Соок',
-'underline-never'   => 'Нигнамат',
+'tog-showtoc' => 'Кӧргӹштӹш лӹмвлӓм анжыкташ (3 гӹц шукырак артикль лӹмӓн ӹлӹштӓшвлӓштӹ)',
+'tog-rememberpassword' => 'Мӹньӹн шотыш нӓлмӹ сирмӓшем ти компьютерӹштӹ ӓштӓш (максимум $1 {{PLURAL:$1|кечы|кечы}})',
+'tog-watchcreations' => 'Мӹньӹн ӹштӹмӹ ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
+'tog-watchdefault' => 'Мӹньӹн вашталтымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
+'tog-watchmoves' => 'Мӹньӹн лӹмӹм вашталтымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
+'tog-watchdeletion' => 'Мӹньӹн карангдымы ӹлӹштӓшвлӓэм вӓнгӹмӹ списокыш пырташ',
+'tog-minordefault' => 'Пäлдӹртӹмӹ агыл тöрлӹмäшвлäм когонжок керäлеш шотлаш агыл',
+'tog-previewontop' => 'Текстӹм анзыц анжен лӓкмӹм тӧрлӹмӹ окня анзыкы шӹндӓш',
+'tog-previewonfirst' => 'Текстӹм анзыц анжен лӓкмӹм тӧрлӓш тӹнгӓлмӹ анзыц анжыкташ',
+'tog-nocache' => 'Ӹлӹштӓшвлӓн кешированим цӓрӓш',
+'tog-enotifwatchlistpages' => 'Мам вӓнгӹмӹ списокын ӹлӹштӓшӹштӹ вашталтымы, тӹдӹм эл. почта доно увертӓрӓш',
+'tog-enotifusertalkpages' => 'Мам персональный ӹлӹштӓшӹштӹ дискуссилӓн пачмы, тӹ вашталтмашым эл. почта доно увертӓрӓш',
+'tog-enotifminoredits' => 'Изи вашталтымашвлӓ гишӓнӓт эл. почта доно увертӓрӓш',
+'tog-enotifrevealaddr' => 'Мӹньӹн эл. адресем увертӓрӹмвлӓштӹ анжыкташ',
+'tog-shownumberswatching' => 'Манярын ӹлӹштӓшӹм вӓнгӹмӹ списокышкышты пыртенӹт, анжыкташ',
+'tog-oldsig' => 'Ылшы сирӹмӹ подписьӹм анзыцок анжен лӓктӓш',
+'tog-fancysig' => 'Вики-пӓлӹкӹн ӹшке подписьшӹ (автоматический ажедмӓш гӹц пасна)',
+'tog-externaleditor' => 'Тӱнӹш тӧрлӹшӹм кычылташ (компьютерӹн йори настройкыжы келеш)',
+'tog-externaldiff' => 'Вариантвлӓн тӓнгӓштӓрӹмӹ годым тӱнӹш программым кычылташ (компьютерӹн йори настройкыжы келеш)',
+'tog-showjumplinks' => '«ванжаш» палшышы ажедмӓшвлӓм чӱктӓш',
+'tog-uselivepreview' => 'Текстӹм пӹсӹн анзыц анжен лӓкмӹм кычылташ (эксперимент семӹнь JavaScript)',
+'tog-forceeditsummary' => 'Мам тӧрлӹмӹ тӹ «нырын» охыр ылмыжы гишӓн пӓлдӹртӓш',
+'tog-watchlisthideown' => 'Мам тӧрленӓм, тӹдӹм вӓнгӹмӹ спискышты шӹлтӓш, анжыкташ агыл',
+'tog-watchlisthidebots' => 'Ботвлӓм тӧрлӹмӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
+'tog-watchlisthideminor' => 'Изи тӧрлӹмӓшвлӓм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
+'tog-watchlisthideliu' => 'Лӹмӹштӹм анжыктышывлӓн тӧрлӹмӹштӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
+'tog-watchlisthideanons' => 'Кӱ лӹмжӹм анжыктыде, тӹдӹм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
+'tog-watchlisthidepatrolled' => 'Патрулируйымы тӧрлӹмӓшвлӓм вӓнгӹмӹ списокышты шӹлтӓш, анжыкташ агыл',
+'tog-ccmeonemails' => 'Кӱлӓн сирмӓшӹм сирем, тӹдӹн копижӹм мӹлӓм колташ',
+'tog-diffonly' => 'Кок верси доно тӓнгӓштӓрен ӹлӹштӓшӹн текстшӹм колташ агыл',
+'tog-showhiddencats' => 'Шӹлтӹмӹ категоривлӓм анжыкташ',
+'tog-norollbackdiff' => 'Лишӹц колтымын вариантвлӓн айыртемӹштӹм анжыкташ агыл',
+
+'underline-always' => 'Соок',
+'underline-never' => 'Нигнамат',
 'underline-default' => 'Браузерӹн настройкыжым кычылташ',
 
 # Font style option in Special:Preferences
-'editfont-style'     => 'Тӧрлӹмӓштӹ шрифтӹн типшӹ',
-'editfont-default'   => 'Браузерӹн настройкывлӓн шрифтӹштӹ',
+'editfont-style' => 'Тӧрлӹмӓштӹ шрифтӹн типшӹ',
+'editfont-default' => 'Браузерӹн настройкывлӓн шрифтӹштӹ',
 'editfont-sansserif' => 'Шрифт ыдыралтышвлӓ гӹц пасна',
-'editfont-serif'     => 'Шрифт ыдыралтышвлӓ доно',
+'editfont-serif' => 'Шрифт ыдыралтышвлӓ доно',
 
 # 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|Лӹвӓл категорим $1 анжыктымы|Лӹвӓл категоривлӓм $1 анжыктымы|Лӹвӓл категорим $1}} анжыктымы $2.}}',
+'pagecategories' => '{{PLURAL:$1|Категори|Категоривлӓ}}',
+'category_header' => 'Категори «$1» ӹлӹштӓшвлӓ',
+'subcategories' => 'Лӹвӓл категоривлӓ',
+'hidden-categories' => '{{PLURAL:$1|Шӹлтӹмӹ категори| Шӹлтӹмӹ категоривлӓ}}',
+'category-subcat-count' => '{{PLURAL:$2|Ти категориштӹ лач ти лӹвӓл категори веле.|{{PLURAL:$1|Лӹвӓл категорим $1 анжыктымы|Лӹвӓл категоривлӓм $1 анжыктымы|Лӹвӓл категорим $1}} анжыктымы $2.}}',
 'category-article-count' => '{{PLURAL:$2|Ти категориштӹ ик ӹлыштӓш веле. |{{PLURAL:$1|Анжыктымы$1 ӹлӹшташ|Анжыктымы$1 ӹлӹштӓшӹм|Анжыктымы$1 ӹлыштӓшвлӓм}}ти категори гӹц$2.}}',
 'listingcontinuesabbrev' => '(пакыла)',
 
-'newwindow'  => '(у окняшты)',
-'cancel'     => 'Вашталташ',
-'mytalk'     => 'Мӹньӹн кӓнгӓшӹмӹ ӹлӹштӓшем',
+'newwindow' => '(у окняшты)',
+'cancel' => 'Вашталташ',
+'mytalk' => 'Мӹньӹн кӓнгӓшӹмӹ ӹлӹштӓшем',
 'navigation' => 'Навигаци',
 
 # Cologne Blue skin
@@ -172,217 +172,216 @@ $messages = array(
 'qbedit' => 'Торлӓш',
 
 # Vector skin
-'vector-action-delete'   => 'Карангдаш',
-'vector-action-move'     => 'Лӹмӹм вашталташ',
-'vector-action-protect'  => 'Ӹшӹклӓш',
-'vector-view-create'     => 'Ӹштӓш',
-'vector-view-edit'       => 'Тӧрлӹмӓш',
-'vector-view-history'    => 'Историм анжымаш',
-'vector-view-view'       => 'Лыдмаш',
+'vector-action-delete' => 'Карангдаш',
+'vector-action-move' => 'Лӹмӹм вашталташ',
+'vector-action-protect' => 'Ӹшӹклӓш',
+'vector-view-create' => 'Ӹштӓш',
+'vector-view-edit' => 'Тӧрлӹмӓш',
+'vector-view-history' => 'Историм анжымаш',
+'vector-view-view' => 'Лыдмаш',
 'vector-view-viewsource' => 'Сек пӹтӓриш кодым анжалаш',
 
-'errorpagetitle'   => 'Самынь',
-'returnto'         => 'Мӹнгеш ӹлӹштӓшӹш $1.',
-'tagline'          => 'гӹц материал {{grammar:genitive|{{SITENAME}}}}',
-'help'             => 'Палшык',
-'search'           => 'Кӹчӓлӓш',
-'searchbutton'     => 'Моаш',
-'searcharticle'    => 'Ванжаш',
-'history'          => 'Истори',
-'history_short'    => 'Истори',
+'errorpagetitle' => 'Самынь',
+'returnto' => 'Мӹнгеш ӹлӹштӓшӹш $1.',
+'tagline' => 'гӹц материал {{grammar:genitive|{{SITENAME}}}}',
+'help' => 'Палшык',
+'search' => 'Кӹчӓлӓш',
+'searchbutton' => 'Моаш',
+'searcharticle' => 'Ванжаш',
+'history' => 'Истори',
+'history_short' => 'Истори',
 'printableversion' => 'Пецӓтлӓш верси',
-'permalink'        => 'Соок ылшы (постоянный) ажедмӓш',
-'edit'             => 'Торлӓш',
-'create'           => 'Ӹштӓш',
-'editthispage'     => 'Ти ӹлӹштӓшӹм тӧрлӓш',
-'delete'           => 'Карангдаш',
-'protect'          => 'Ӹшӹклӓш',
-'protect_change'   => 'вашталташ',
-'newpage'          => 'У ӹлӹштӓш',
-'talkpage'         => 'Ти ӹлӹштӓш гишӓн хытыраш',
+'permalink' => 'Соок ылшы (постоянный) ажедмӓш',
+'edit' => 'Торлӓш',
+'create' => 'Ӹштӓш',
+'editthispage' => 'Ти ӹлӹштӓшӹм тӧрлӓш',
+'delete' => 'Карангдаш',
+'protect' => 'Ӹшӹклӓш',
+'protect_change' => 'вашталташ',
+'newpage' => 'У ӹлӹштӓш',
+'talkpage' => 'Ти ӹлӹштӓш гишӓн хытыраш',
 'talkpagelinktext' => 'Кӓнгӓшӹмӓш',
-'personaltools'    => 'Персональный инструментвлӓ',
-'talk'             => 'Дискусси',
-'views'            => 'Анжымашвлӓ',
-'toolbox'          => 'Инструментвлӓ',
-'otherlanguages'   => 'Вес йӹлмӹвлӓ доно',
-'redirectedfrom'   => '($1 гӹц колтымы)',
-'redirectpagesub'  => 'Вес вӓр гӹц колтымы ӹлӹштӓш',
-'lastmodifiedat'   => 'Ти ӹлӹштӓшӹн остатка вашталтымашвлӓжӹ: $2, $1.',
-'jumpto'           => 'Ванжаш:',
+'personaltools' => 'Персональный инструментвлӓ',
+'talk' => 'Дискусси',
+'views' => 'Анжымашвлӓ',
+'toolbox' => 'Инструментвлӓ',
+'otherlanguages' => 'Вес йӹлмӹвлӓ доно',
+'redirectedfrom' => '($1 гӹц колтымы)',
+'redirectpagesub' => 'Вес вӓр гӹц колтымы ӹлӹштӓш',
+'lastmodifiedat' => 'Ти ӹлӹштӓшӹн остатка вашталтымашвлӓжӹ: $2, $1.',
+'jumpto' => 'Ванжаш:',
 'jumptonavigation' => 'навигаци',
-'jumptosearch'     => 'кӹчӓлӓш',
+'jumptosearch' => 'кӹчӓлӓш',
 
 # 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:genitive|{{SITENAME}}}}',
-'aboutpage'            => 'Project:Сирӹмӓш',
-'copyright'            => 'Тидӹ, тидӹ семӹнь ылеш $1.',
-'copyrightpage'        => '{{ns:project}}:Авторын праважы',
-'disclaimers'          => 'Вӓшештӹмӹ шая (ответственность) гӹц карангмаш',
-'disclaimerpage'       => 'Project:Вӓшештӹмӓш (ответственность) гӹц карангмаш',
-'edithelp'             => 'Тӧрлӓш манын палшык',
-'edithelppage'         => 'Help:Тӧрлӓш манын палшык',
-'helppage'             => 'Help:Палшык',
-'mainpage'             => 'Тӹнг ӹлӹштӓш',
+'aboutsite' => 'Тидӹ гишӓн сирӹмӓш {{grammar:genitive|{{SITENAME}}}}',
+'aboutpage' => 'Project:Сирӹмӓш',
+'copyright' => 'Тидӹ, тидӹ семӹнь ылеш $1.',
+'copyrightpage' => '{{ns:project}}:Авторын праважы',
+'disclaimers' => 'Вӓшештӹмӹ шая (ответственность) гӹц карангмаш',
+'disclaimerpage' => 'Project:Вӓшештӹмӓш (ответственность) гӹц карангмаш',
+'edithelp' => 'Тӧрлӓш манын палшык',
+'edithelppage' => 'Help:Тӧрлӓш манын палшык',
+'helppage' => 'Help:Палшык',
+'mainpage' => 'Тӹнг ӹлӹштӓш',
 'mainpage-description' => 'Тӹнг ӹлӹштӓш',
-'privacy'              => 'Весӹвлӓлӓн шайышташ ак ли ылмы политика',
-'privacypage'          => 'Project:Весӹвлӓлӓн шайышташ ак ли ылмы политика',
+'privacy' => 'Весӹвлӓлӓн шайышташ ак ли ылмы политика',
+'privacypage' => 'Project:Весӹвлӓлӓн шайышташ ак ли ылмы политика',
 
 'badaccess' => 'Коргӹш сирӓлтмӓштӹдӓ тама самынь улы',
 
-'retrievedfrom'       => 'Кышец нӓлмӹ «$1»',
-'youhavenewmessages'  => 'Тӓ нӓлӹндӓ $1 ($2).',
-'newmessageslink'     => 'у увервлӓ',
+'retrievedfrom' => 'Кышец нӓлмӹ «$1»',
+'youhavenewmessages' => 'Тӓ нӓлӹндӓ $1 ($2).',
+'newmessageslink' => 'у увервлӓ',
 'newmessagesdifflink' => 'пӹтӓртӹш вашталтымаш',
-'editsection'         => 'тӧрлӓш',
-'editold'             => 'тӧрлӓш',
-'editlink'            => 'тӧрлӓш',
-'viewsourcelink'      => 'сек пӹтӓриш кодым анжалаш',
-'editsectionhint'     => 'Секцим тӧрлӓш: $1',
-'toc'                 => 'Кӧргӹштӹжӹ',
-'showtoc'             => 'анжыкташ',
-'hidetoc'             => 'карангдаш',
-'site-rss-feed'       => '$1 — RSS-вола',
-'site-atom-feed'      => '$1 — Atom-вола',
-'page-rss-feed'       => '«$1» — RSS-вола',
-'page-atom-feed'      => '«$1» — Atom-вола',
-'red-link-title'      => '$1 (техень ӹлӹштӓш уке)',
+'editsection' => 'тӧрлӓш',
+'editold' => 'тӧрлӓш',
+'editlink' => 'тӧрлӓш',
+'viewsourcelink' => 'сек пӹтӓриш кодым анжалаш',
+'editsectionhint' => 'Секцим тӧрлӓш: $1',
+'toc' => 'Кӧргӹштӹжӹ',
+'showtoc' => 'анжыкташ',
+'hidetoc' => 'карангдаш',
+'site-rss-feed' => '$1 — RSS-вола',
+'site-atom-feed' => '$1 — Atom-вола',
+'page-rss-feed' => '«$1» — RSS-вола',
+'page-atom-feed' => '«$1» — Atom-вола',
+'red-link-title' => '$1 (техень ӹлӹштӓш уке)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Ӹлӹштӓш',
-'nstab-user'     => 'Ӹлӹштӓшым сирӹшӹ',
-'nstab-special'  => 'Спецӹлӹштӓш',
-'nstab-project'  => 'Проект гишӓн',
-'nstab-image'    => 'Файл',
+'nstab-main' => 'Ӹлӹштӓш',
+'nstab-user' => 'Ӹлӹштӓшым сирӹшӹ',
+'nstab-special' => 'Спецӹлӹштӓш',
+'nstab-project' => 'Проект гишӓн',
+'nstab-image' => 'Файл',
 'nstab-template' => 'Шаблон',
 'nstab-category' => 'Категори',
 
 # General errors
-'missing-article'    => 'Информаци базышты ядмы текст уке, кыдым моаш лиэш ылын «$1» $2.
+'missing-article' => 'Информаци базышты ядмы текст уке, кыдым моаш лиэш ылын «$1» $2.
 
 Тенге ӹлӹштӓшӹн вашталтымашвлӓштӹ тошты ажедмӓшвлӓм анжыктымы
 годым лиӓлтеш.
 Ядмаш тиштӹ агыл гӹнь , лин кердеш, тӹнӓм тӓ программышты тамахань самыньым монда. Пуры лидӓ, тидӹ гишӓн увертӓрӹдӓ [[Special:ListUsers/sysop|администратор]], анжыктен URL.',
 'missingarticle-rev' => '(верси № $1)',
-'badtitletext'       => 'Ядмы ӹлӹштӓшдӓн лӹмжӹ самынь, охыр, лин кердеш тӧр агыл лӹмӹм ӓль интервикым анжыктендӓ,  ӓнят лӹмӹштӹ кычылташ лидӹмӹ символым сирендӓ.',
-'viewsource'         => 'Анжен лӓктӓш',
+'badtitletext' => 'Ядмы ӹлӹштӓшдӓн лӹмжӹ самынь, охыр, лин кердеш тӧр агыл лӹмӹм ӓль интервикым анжыктендӓ,  ӓнят лӹмӹштӹ кычылташ лидӹмӹ символым сирендӓ.',
+'viewsource' => 'Анжен лӓктӓш',
 
 # Login and logout pages
-'yourname'                => 'Сирӹшӹн лӹмжӹ:',
-'yourpassword'            => 'Пароль:',
-'remembermypassword'      => 'Ти компьютерӹштӹ мӹньӹн учетный сирмӓшем ӓштӓш (максимум $1 {{PLURAL:$1|кечы|кечы}})',
-'login'                   => 'Системыш сирӓлтдӓ',
+'yourname' => 'Сирӹшӹн лӹмжӹ:',
+'yourpassword' => 'Пароль:',
+'remembermypassword' => 'Ти компьютерӹштӹ мӹньӹн учетный сирмӓшем ӓштӓш (максимум $1 {{PLURAL:$1|кечы|кечы}})',
+'login' => 'Системыш сирӓлтдӓ',
 'nav-login-createaccount' => 'Коргӹшкӹ сирӓлтдӓ/регистрируялтда',
-'userlogin'               => 'Кӧргӹшкӹ сирӓлтдӓ ӓль регистрируялтда',
-'logout'                  => 'Сеансым пӹтӓрӓш',
-'userlogout'              => 'Сеансым кашарташ',
-'nologinlink'             => 'Учётный сирмӓшӹм ӹштӹдӓ',
-'mailmypassword'          => 'У парольым колташ',
+'userlogin' => 'Кӧргӹшкӹ сирӓлтдӓ ӓль регистрируялтда',
+'logout' => 'Сеансым пӹтӓрӓш',
+'userlogout' => 'Сеансым кашарташ',
+'nologinlink' => 'Учётный сирмӓшӹм ӹштӹдӓ',
+'mailmypassword' => 'У парольым колташ',
 
 # Edit page toolbar
-'bold_sample'     => 'Пеле кӹжгӹн сирӹмӹ',
-'bold_tip'        => 'Пеле кӹжгӹн сирӹмӹ',
-'italic_sample'   => 'Пылен сирӹмӹ',
-'italic_tip'      => 'Пылен сирӹмы',
-'link_sample'     => 'Ажедмӓшвлӓн лӹмвлӓштӹ',
-'link_tip'        => 'Кӧргӹштӹш ажедмӓш',
-'extlink_sample'  => 'http://www.example.com ажедмӓшвлӓ',
-'extlink_tip'     => 'Тӱнӹш ажедмӓш (префиксӹм идӓ монды  http:// )',
+'bold_sample' => 'Пеле кӹжгӹн сирӹмӹ',
+'bold_tip' => 'Пеле кӹжгӹн сирӹмӹ',
+'italic_sample' => 'Пылен сирӹмӹ',
+'italic_tip' => 'Пылен сирӹмы',
+'link_sample' => 'Ажедмӓшвлӓн лӹмвлӓштӹ',
+'link_tip' => 'Кӧргӹштӹш ажедмӓш',
+'extlink_sample' => 'http://www.example.com ажедмӓшвлӓ',
+'extlink_tip' => 'Тӱнӹш ажедмӓш (префиксӹм идӓ монды  http:// )',
 'headline_sample' => 'Текстӹн лӹмжӹ',
-'headline_tip'    => '2-шы кӱкшӹцӓн тӹнг лӹм',
-'nowiki_sample'   => 'Тишкӹ форматируйымы агыл текствлӓм шӹндӹдӓ',
-'nowiki_tip'      => 'Вики-форматированим мондаш',
-'image_tip'       => 'Кӧргӹш пыртен шӹндӹмӹ файл',
-'media_tip'       => 'Медиа-файлыш ажедмӓш',
-'sig_tip'         => ' Кынам лӹм лӹвӓлӓн киддӓм-пиштендӓ, дата',
-'hr_tip'          => 'Горизонталь вола (шӹренжок идӓ кычылт)',
+'headline_tip' => '2-шы кӱкшӹцӓн тӹнг лӹм',
+'nowiki_sample' => 'Тишкӹ форматируйымы агыл текствлӓм шӹндӹдӓ',
+'nowiki_tip' => 'Вики-форматированим мондаш',
+'image_tip' => 'Кӧргӹш пыртен шӹндӹмӹ файл',
+'media_tip' => 'Медиа-файлыш ажедмӓш',
+'sig_tip' => ' Кынам лӹм лӹвӓлӓн киддӓм-пиштендӓ, дата',
+'hr_tip' => 'Горизонталь вола (шӹренжок идӓ кычылт)',
 
 # Edit pages
-'summary'                          => 'Мам вашталтымы:',
-'subject'                          => 'Тема/вуй лӹм:',
-'minoredit'                        => 'Изи тӧрлӹмӓш',
-'watchthis'                        => 'Ти ӹлыштӓшӹм вӓнгӓш манын списокыш пырташ',
-'savearticle'                      => 'Ӹлӹштӓшӹм темӓш',
-'preview'                          => 'Анзыц анжен лӓктӓш',
-'showpreview'                      => 'Анзыц анжен лӓкмӓш',
-'showdiff'                         => 'Пыртымы вашталтымашвлӓ',
-'anoneditwarning'                  => "'''ӓштӹдӓ''':  Тӓ кӧргӹш сирӓлтделда. Системылан ӹшке донда пӓлӹмӹм ӹштӹделда.  Тӓмдӓн IP-адресдӓ ти ӹлыштӓшӹн вашталтымашвлӓн историэшӹжӹ кодеш.",
-'summary-preview'                  => 'Сирӹмӹ лиэш:',
-'newarticle'                       => '(У)',
-'newarticletext'                   => "Ажедмӹ доно тӓ эче ӹштӹмӹ агыл ӹлӹшташӹш вӓрештӹндӓ. Тӹдӹм ӹштӓш манын,  ӱлнӹрӓк ылшы окняэш лӹмӹм сирӓлтӹдӓ. (шукыракым пӓлен нӓлаш, анжал. [[{{MediaWiki:Helppage}}|палшыкын ӹлӹштӓшӹм]])
+'summary' => 'Мам вашталтымы:',
+'subject' => 'Тема/вуй лӹм:',
+'minoredit' => 'Изи тӧрлӹмӓш',
+'watchthis' => 'Ти ӹлыштӓшӹм вӓнгӓш манын списокыш пырташ',
+'savearticle' => 'Ӹлӹштӓшӹм темӓш',
+'preview' => 'Анзыц анжен лӓктӓш',
+'showpreview' => 'Анзыц анжен лӓкмӓш',
+'showdiff' => 'Пыртымы вашталтымашвлӓ',
+'anoneditwarning' => "'''ӓштӹдӓ''':  Тӓ кӧргӹш сирӓлтделда. Системылан ӹшке донда пӓлӹмӹм ӹштӹделда.  Тӓмдӓн IP-адресдӓ ти ӹлыштӓшӹн вашталтымашвлӓн историэшӹжӹ кодеш.",
+'summary-preview' => 'Сирӹмӹ лиэш:',
+'newarticle' => '(У)',
+'newarticletext' => "Ажедмӹ доно тӓ эче ӹштӹмӹ агыл ӹлӹшташӹш вӓрештӹндӓ. Тӹдӹм ӹштӓш манын,  ӱлнӹрӓк ылшы окняэш лӹмӹм сирӓлтӹдӓ. (шукыракым пӓлен нӓлаш, анжал. [[{{MediaWiki:Helppage}}|палшыкын ӹлӹштӓшӹм]])
 Самынь тишкӹ вӓрештӹндӓ гӹнь лач браузердӓн '''мӹнгеш''' кнопкыжым веле темдӓлдӓ.",
-'noarticletext'                    => "Кӹзӹт ти ӹлӹштӓшӹштӹ текст уке. Ти лӹмӹм [[Special:Search/{{PAGENAME}}|тӓ вес лӹм доно вес ӹлӹштӓшвлӓштӹ мон кердӹдӓ<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тӓ вес лӹм доно вес ӹлӹштӓшвлӓштӹ мон кердӹда -]] журналвлӓн вес сирмӓшвлӓштӓт моаш лиэш], ӓль
+'noarticletext' => "Кӹзӹт ти ӹлӹштӓшӹштӹ текст уке. Ти лӹмӹм [[Special:Search/{{PAGENAME}}|тӓ вес лӹм доно вес ӹлӹштӓшвлӓштӹ мон кердӹдӓ<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тӓ вес лӹм доно вес ӹлӹштӓшвлӓштӹ мон кердӹда -]] журналвлӓн вес сирмӓшвлӓштӓт моаш лиэш], ӓль
 '''[{{fullurl:{{FULLPAGENAME}}|action=edit}}  техень лӹм доно ӹлӹштӓшӹм пачаш лиэш]'''</span>.",
-'previewnote'                      => "'''Тидӹ анзыц анжымаш веле, текстӹм эче сирӹмӹ агыл!'''",
-'editing'                          => 'Редактируйымаш: $1',
-'editingsection'                   => 'Тӧрлӹмаш  $1 (пӧлкӓ)',
-'copyrightwarning'                 => 'Пуры лидӓ, ӓшӹшкӹдӓ пиштӹда! Цилӓ мам тӧрлӹмӹ, ушештӹмӹ дӓ вашталтымы, $2 (см. $1) негӹцеш ӹштӹмы семӹнь анжымы лиэш. Мам сиредӓ, тӹдӹм кычылтмы  дӓ тӧрлӹмӹ ваштареш ылыда гӹнь пуры лидӓ, тишӓк идӓ сирӹ.<br /> Тенгеок мам сиредӓ  тӹдӹн авторжы ылыда дӓ мам копируедӓ, тидӹ ирӹкӓн кычылтмашты лишӓшлык<br />.
+'previewnote' => "'''Тидӹ анзыц анжымаш веле, текстӹм эче сирӹмӹ агыл!'''",
+'editing' => 'Редактируйымаш: $1',
+'editingsection' => 'Тӧрлӹмаш  $1 (пӧлкӓ)',
+'copyrightwarning' => 'Пуры лидӓ, ӓшӹшкӹдӓ пиштӹда! Цилӓ мам тӧрлӹмӹ, ушештӹмӹ дӓ вашталтымы, $2 (см. $1) негӹцеш ӹштӹмы семӹнь анжымы лиэш. Мам сиредӓ, тӹдӹм кычылтмы  дӓ тӧрлӹмӹ ваштареш ылыда гӹнь пуры лидӓ, тишӓк идӓ сирӹ.<br /> Тенгеок мам сиредӓ  тӹдӹн авторжы ылыда дӓ мам копируедӓ, тидӹ ирӹкӓн кычылтмашты лишӓшлык<br />.
 
 Автор пӓшӓлӓнжӹ публикаяш разрешеним пуде гӹнь, тишӓк идӓ сирӹ!!!',
-'templatesused'                    => '{{PLURAL:$1|Кычылтмы шаблон|Кычылтмы шаблонвлӓ}} ӹлӹштӓшӹн ти версиштӹжӹ:',
-'templatesusedpreview'             => '{{PLURAL:$1|Кычылтмы шаблон|Кычылтмы шаблонвлӓ }} анзыц анжымы ӹлӹштӓшӹштӹ:',
-'template-protected'               => '(ӹшӹклӓлтеш, перегӓлтеш)',
-'template-semiprotected'           => '(лаштыкын-лыштыкын ӹшӹклӓлтеш)',
-'hiddencategories'                 => 'Ти ӹлӹштӓш $1 {{PLURAL:$1|шӹлтӹмӹ категориш|шӹлтӹмӹ  категоривлӓш|шӹлтӹмӹ категориш пыра}}:',
+'templatesused' => '{{PLURAL:$1|Кычылтмы шаблон|Кычылтмы шаблонвлӓ}} ӹлӹштӓшӹн ти версиштӹжӹ:',
+'templatesusedpreview' => '{{PLURAL:$1|Кычылтмы шаблон|Кычылтмы шаблонвлӓ }} анзыц анжымы ӹлӹштӓшӹштӹ:',
+'template-protected' => '(ӹшӹклӓлтеш, перегӓлтеш)',
+'template-semiprotected' => '(лаштыкын-лыштыкын ӹшӹклӓлтеш)',
+'hiddencategories' => 'Ти ӹлӹштӓш $1 {{PLURAL:$1|шӹлтӹмӹ категориш|шӹлтӹмӹ  категоривлӓш|шӹлтӹмӹ категориш пыра}}:',
 'permissionserrorstext-withaction' => "Тидӹм (действим) ӹштӓш манын  тӓмдӓн разрешенидӓ уке«'''$2'''» семеш {{PLURAL:$1|ти ӓмӓл|ӓмӓлвлӓ доно}}:",
 
 # History pages
-'viewpagelogs'           => 'Ти ӹлӹштӓшлӓн журналвлӓм анжыкташ',
-'currentrev-asof'        => 'Кӹзӹтшӹ верси $1-штӹ',
-'revisionasof'           => 'Верси $1',
-'previousrevision'       => '← Тошты/первирӓкшӹ верси',
-'nextrevision'           => 'Весӹ→',
-'currentrevisionlink'    => 'Ти ылшы верси',
-'cur'                    => 'кӹзӹтшӹ',
-'last'                   => 'анзыц ылшы',
-'histlegend'             => "Ынгылдарымашвлӓ: (кӹзӹтшӹ) —кӹзӹтшӹ верси гӹц айыртемӓлтеш ; (анзыл.) — анзылныш верси гӹц айыртемӓлтеш; '''и''' — изи вашталтымаш",
+'viewpagelogs' => 'Ти ӹлӹштӓшлӓн журналвлӓм анжыкташ',
+'currentrev-asof' => 'Кӹзӹтшӹ верси $1-штӹ',
+'revisionasof' => 'Верси $1',
+'previousrevision' => '← Тошты/первирӓкшӹ верси',
+'nextrevision' => 'Весӹ→',
+'currentrevisionlink' => 'Ти ылшы верси',
+'cur' => 'кӹзӹтшӹ',
+'last' => 'анзыц ылшы',
+'histlegend' => "Ынгылдарымашвлӓ: (кӹзӹтшӹ) —кӹзӹтшӹ верси гӹц айыртемӓлтеш ; (анзыл.) — анзылныш верси гӹц айыртемӓлтеш; '''и''' — изи вашталтымаш",
 'history-fieldset-title' => 'Историм анжалаш',
-'histfirst'              => 'сек тоштывлӓ',
-'histlast'               => 'шукердшӹ агыл',
+'histfirst' => 'сек тоштывлӓ',
+'histlast' => 'шукердшӹ агыл',
 
 # Revision deletion
-'rev-delundel'   => 'анжыкташ/шӹлтӓш',
+'rev-delundel' => 'анжыкташ/шӹлтӓш',
 'revdel-restore' => 'ужаш лимӹм вашталташ',
 
 # Merge log
 'revertmerge' => 'Пайылаш',
 
 # Diffs
-'history-title'           => '$1 — вашталтымашвлӓн историштӹ',
-'difference'              => '(Версивлӓ лошты вашталтмашвлӓ)',
-'lineno'                  => 'Сирӹмӹ корны $1:',
+'history-title' => '$1 — вашталтымашвлӓн историштӹ',
+'lineno' => 'Сирӹмӹ корны $1:',
 'compareselectedversions' => 'Айырен нӓлмӹ версивлӓм тӓнгӓштӓрӓш',
-'editundo'                => 'ярал агыл/вашталташ',
+'editundo' => 'ярал агыл/вашталташ',
 
 # Search results
-'searchresults'             => 'Кӹчӓлмӓшӹн результатшы',
-'searchresults-title'       => 'Кӹчӓлӓш «$1»',
-'searchresulttext'          => 'Ӹлӹштӓшӹшты шукырак информацим нӓлӓш манын [[{{MediaWiki:Helppage}}| палшыкым анжал]]',
-'searchsubtitle'            => 'Кӹчӓлмӹ годым«[[:$1]]» ([[Special:Prefixindex/$1|кыды, ти лӹм доно тӹнгӓлӓлтеш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|кыдывлӓ ти лӹмӹм анжыктенӹт]])',
-'searchsubtitleinvalid'     => 'Ядмы семӹнь «$1»',
-'notitlematches'            => 'Ӹлӹштӓшвлӓн лӹм икань агыл',
-'notextmatches'             => 'Ӹлӹштӓшӹн текствлӓ доно икань агыл',
-'prevn'                     => '{{PLURAL:$1|анзылнышы $1|анзылнышывлӓ $1|анзылнышывлӓ $1}}',
-'nextn'                     => '{{PLURAL:$1|паштек кешӹ $1|паштек кешӹвлӓ $1|паштек кешӹвлӓ $1}}',
-'viewprevnext'              => 'Анжен лӓктӓш ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|$2 шамак|$2 шамаквлӓ|$2 шамак}})',
-'search-redirect'           => '(вес вӓрӹш ажед колташ $1)',
-'search-section'            => '(кӹдеж $1)',
-'search-suggest'            => 'Анят тӓ $1 шанендӓ:',
-'search-interwiki-caption'  => 'Техеньок проектвлӓ',
-'search-interwiki-default'  => '$1 результ.:',
-'search-interwiki-more'     => '(эче)',
-'search-mwsuggest-enabled'  => 'согоньвлӓ доно',
+'searchresults' => 'Кӹчӓлмӓшӹн результатшы',
+'searchresults-title' => 'Кӹчӓлӓш «$1»',
+'searchresulttext' => 'Ӹлӹштӓшӹшты шукырак информацим нӓлӓш манын [[{{MediaWiki:Helppage}}| палшыкым анжал]]',
+'searchsubtitle' => 'Кӹчӓлмӹ годым«[[:$1]]» ([[Special:Prefixindex/$1|кыды, ти лӹм доно тӹнгӓлӓлтеш]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|кыдывлӓ ти лӹмӹм анжыктенӹт]])',
+'searchsubtitleinvalid' => 'Ядмы семӹнь «$1»',
+'notitlematches' => 'Ӹлӹштӓшвлӓн лӹм икань агыл',
+'notextmatches' => 'Ӹлӹштӓшӹн текствлӓ доно икань агыл',
+'prevn' => '{{PLURAL:$1|анзылнышы $1|анзылнышывлӓ $1|анзылнышывлӓ $1}}',
+'nextn' => '{{PLURAL:$1|паштек кешӹ $1|паштек кешӹвлӓ $1|паштек кешӹвлӓ $1}}',
+'viewprevnext' => 'Анжен лӓктӓш ($1 {{int:pipe-separator}} $2) ($3)',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 шамак|$2 шамаквлӓ|$2 шамак}})',
+'search-redirect' => '(вес вӓрӹш ажед колташ $1)',
+'search-section' => '(кӹдеж $1)',
+'search-suggest' => 'Анят тӓ $1 шанендӓ:',
+'search-interwiki-caption' => 'Техеньок проектвлӓ',
+'search-interwiki-default' => '$1 результ.:',
+'search-interwiki-more' => '(эче)',
+'search-mwsuggest-enabled' => 'согоньвлӓ доно',
 'search-mwsuggest-disabled' => 'согоньвлӓдеок',
-'nonefound'                 => "'''Шотыш нӓлдӓ.''' Нимат ак лиӓлт гӹнь, керӓл шамакым цилӓ вӓреок кӹчӓлӓш ак тӹнгӓл. Кӹчӓлжӹ манын,   ''all:'' префиксӹм кычылтда.  Тенге тӓ лӹмвлӓм мода (кӱ тишкӹ сирӓ, нӹнӹн Кӓнгӓшӹмӓшвлӓштӹмӓт, шаблонвлӓмӓт дӓ молымат), уке гӹнь, шукырак лӹмӹм анжыктыда",
-'powersearch'               => 'Кымдан кӹчӓлмӓш',
-'powersearch-legend'        => 'Кымдан кӹчӓлмӓш',
-'powersearch-ns'            => 'Кымдецвлӓштӹ лӹмвлӓм кӹчӓлмӓш:',
-'powersearch-redir'         => 'Ажедмӓшвлӓм анжыкташ',
-'powersearch-field'         => 'Кӹчӓлӓш',
+'nonefound' => "'''Шотыш нӓлдӓ.''' Нимат ак лиӓлт гӹнь, керӓл шамакым цилӓ вӓреок кӹчӓлӓш ак тӹнгӓл. Кӹчӓлжӹ манын,   ''all:'' префиксӹм кычылтда.  Тенге тӓ лӹмвлӓм мода (кӱ тишкӹ сирӓ, нӹнӹн Кӓнгӓшӹмӓшвлӓштӹмӓт, шаблонвлӓмӓт дӓ молымат), уке гӹнь, шукырак лӹмӹм анжыктыда",
+'powersearch' => 'Кымдан кӹчӓлмӓш',
+'powersearch-legend' => 'Кымдан кӹчӓлмӓш',
+'powersearch-ns' => 'Кымдецвлӓштӹ лӹмвлӓм кӹчӓлмӓш:',
+'powersearch-redir' => 'Ажедмӓшвлӓм анжыкташ',
+'powersearch-field' => 'Кӹчӓлӓш',
 
 # Preferences page
-'preferences'   => 'Настройкывлӓ',
+'preferences' => 'Настройкывлӓ',
 'mypreferences' => 'Настройкывлӓ',
 
 # Groups
@@ -397,54 +396,54 @@ $messages = array(
 'action-edit' => 'ти ӹлӹштӓшӹм тӧрлӹмӓш',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|вашталтымаш|вашталтымашвлӓ|вашталтымаш}}',
-'recentchanges'                  => 'У тӧрлӹмӓшвлӓ',
-'recentchanges-legend'           => 'У тӧрлӹмашвлӓн настройкышты',
+'nchanges' => '$1 {{PLURAL:$1|вашталтымаш|вашталтымашвлӓ|вашталтымаш}}',
+'recentchanges' => 'У тӧрлӹмӓшвлӓ',
+'recentchanges-legend' => 'У тӧрлӹмашвлӓн настройкышты',
 'recentchanges-feed-description' => 'Ти лиништӹ Викиштӹш вашталтмашвлӓм анжалаш.',
-'rcnote'                         => "{{PLURAL:$1|Пӹтӓртӹш вашталтымаш'''$1''' вашталтымаш|Пӹтӓртыш '''$1''' вашталтымашвлӓ|Пӹтӓртӹш '''$1''' вашталтымашвлӓ}}  '''$2''' {{PLURAL:$2|кечӹштӹ|кечӹштӹ|кечӹвлӓштӹ}}, ти моментеш $5 $4.",
-'rclistfrom'                     => '$1 доно вашталтмашвлӓм анжыкташ',
-'rcshowhideminor'                => '$1 изи тӧрлӹмаш',
-'rcshowhidebots'                 => '$1 бот',
-'rcshowhideliu'                  => '$1 тинӓрӹн сирӓлтӹнӹт',
-'rcshowhideanons'                => '$1 анонимвлӓ',
-'rcshowhidemine'                 => '$1 ӹшке тӧрлӹмӓшвлӓэт',
-'rclinks'                        => 'Пӹтӓрӹтш  $1кечӹвлаштӹш $2 вашталтмашвлӓм  анжыкташ<br />$3',
-'diff'                           => 'ма-шон',
-'hist'                           => 'истори',
-'hide'                           => 'шӹлтӓш',
-'show'                           => 'анжыкташ',
-'minoreditletter'                => 'м',
-'newpageletter'                  => 'У',
-'boteditletter'                  => 'б',
-'rc-enhanced-expand'             => 'Цилӓ анжыкташ (JavaScript кычылтда)',
-'rc-enhanced-hide'               => 'Цилӓ анжыкташ агыл',
+'rcnote' => "{{PLURAL:$1|Пӹтӓртӹш вашталтымаш'''$1''' вашталтымаш|Пӹтӓртыш '''$1''' вашталтымашвлӓ|Пӹтӓртӹш '''$1''' вашталтымашвлӓ}}  '''$2''' {{PLURAL:$2|кечӹштӹ|кечӹштӹ|кечӹвлӓштӹ}}, ти моментеш $5 $4.",
+'rclistfrom' => '$1 доно вашталтмашвлӓм анжыкташ',
+'rcshowhideminor' => '$1 изи тӧрлӹмаш',
+'rcshowhidebots' => '$1 бот',
+'rcshowhideliu' => '$1 тинӓрӹн сирӓлтӹнӹт',
+'rcshowhideanons' => '$1 анонимвлӓ',
+'rcshowhidemine' => '$1 ӹшке тӧрлӹмӓшвлӓэт',
+'rclinks' => 'Пӹтӓрӹтш  $1кечӹвлаштӹш $2 вашталтмашвлӓм  анжыкташ<br />$3',
+'diff' => 'ма-шон',
+'hist' => 'истори',
+'hide' => 'шӹлтӓш',
+'show' => 'анжыкташ',
+'minoreditletter' => 'м',
+'newpageletter' => 'У',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'Цилӓ анжыкташ (JavaScript кычылтда)',
+'rc-enhanced-hide' => 'Цилӓ анжыкташ агыл',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Кӹлдӓлтшӹ тӧрлӹмӓшвлӓ',
-'recentchangeslinked-feed'    => 'Кӹлдӓлтшӹ тӧрлӹмшвлӓ',
-'recentchangeslinked-title'   => 'Кӹлдӓлтшӹ торлӹмӓшвлӓ $1 доно',
+'recentchangeslinked' => 'Кӹлдӓлтшӹ тӧрлӹмӓшвлӓ',
+'recentchangeslinked-feed' => 'Кӹлдӓлтшӹ тӧрлӹмшвлӓ',
+'recentchangeslinked-title' => 'Кӹлдӓлтшӹ торлӹмӓшвлӓ $1 доно',
 'recentchangeslinked-summary' => "Тиштӹ шукердӹ агыл ӹштӹмӹ вашталтмашвлӓ анжыкталтыт, кышты ти ӹлыштӓш ажедеш (ӓль ти категоришкӹ пырышывлӓ). Ӹлӹштӓшвлӓ, кыдывлӓ пырат [[Special:Watchlist|тӓмдӓн вангӹмӹ списокда]] графаш,  '''айырымы ылыт'''.",
-'recentchangeslinked-page'    => 'Ӹлӹштӓшӹн лӹмжӹ:',
-'recentchangeslinked-to'      => 'Анешлӓ, тӹ ӹлыштӓшвлӓштӹш вашталтымашвлӓм анжыкташ, кыдывлӓ ти ӹлӹштӓшӹшкӹ ажедӹт',
+'recentchangeslinked-page' => 'Ӹлӹштӓшӹн лӹмжӹ:',
+'recentchangeslinked-to' => 'Анешлӓ, тӹ ӹлыштӓшвлӓштӹш вашталтымашвлӓм анжыкташ, кыдывлӓ ти ӹлӹштӓшӹшкӹ ажедӹт',
 
 # Upload
-'upload'        => 'Файлым темӓш',
+'upload' => 'Файлым темӓш',
 'uploadlogpage' => 'Оптымашвлӓн журналышты',
 'uploadedimage' => 'оптымы «[[$1]]»',
 
 # File description page
-'filehist'                  => 'Файлын историжӹ',
-'filehist-help'             => 'Файл тӹнӓм махань ылын, тидӹм ужаш манын датым темдӓлдӓ.',
-'filehist-current'          => 'кӹзӹтшӹ',
-'filehist-datetime'         => 'Дата/жеп',
-'filehist-thumb'            => 'Миниатюра',
-'filehist-thumbtext'        => '$1 гӹц версилӓн миниатюра вариантжы',
-'filehist-user'             => 'Сирӹшӹ',
-'filehist-dimensions'       => 'Объектӹн размержӹ',
-'filehist-comment'          => 'Пӓлӹквлӓ',
-'imagelinks'                => 'Файлышкы ажедмӓшвлӓ',
-'linkstoimage'              => '{{PLURAL:$1|Паштек $1 вес ӹлӹштӓш ажедеш| $1 вес ӹлӹштӓшвлӓ ажедӹт|Вес  $1 ӹлӹштӓшвлӓ ти файлыш}} ажедӹт:',
-'sharedupload'              => 'Ти $1 файлым вес проектвлӓштӹ кычылташ лиэш',
+'filehist' => 'Файлын историжӹ',
+'filehist-help' => 'Файл тӹнӓм махань ылын, тидӹм ужаш манын датым темдӓлдӓ.',
+'filehist-current' => 'кӹзӹтшӹ',
+'filehist-datetime' => 'Дата/жеп',
+'filehist-thumb' => 'Миниатюра',
+'filehist-thumbtext' => '$1 гӹц версилӓн миниатюра вариантжы',
+'filehist-user' => 'Сирӹшӹ',
+'filehist-dimensions' => 'Объектӹн размержӹ',
+'filehist-comment' => 'Пӓлӹквлӓ',
+'imagelinks' => 'Файлышкы ажедмӓшвлӓ',
+'linkstoimage' => '{{PLURAL:$1|Паштек $1 вес ӹлӹштӓш ажедеш| $1 вес ӹлӹштӓшвлӓ ажедӹт|Вес  $1 ӹлӹштӓшвлӓ ти файлыш}} ажедӹт:',
+'sharedupload' => 'Ти $1 файлым вес проектвлӓштӹ кычылташ лиэш',
 'uploadnewversion-linktext' => 'Файлын у версижӹм темӓш',
 
 # Random page
@@ -454,30 +453,30 @@ $messages = array(
 'statistics' => 'Статистика',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|байт|байтан|байтвлӓ}}',
-'nmembers'      => '$1 {{PLURAL:$1|объект|объектӹн|объект}}',
-'prefixindex'   => 'Ӹлыштӓшвлӓн лӹмӹштӹн тӹнгӓлтӹш доно анжыктымы',
-'newpages'      => 'У ӹлӹштӓшвлӓ',
-'move'          => 'Вес лӹмӹм пуаш',
-'movethispage'  => 'Ти ӹлыштӓшӹн лӹмжӹм вашталташ',
+'nbytes' => '$1 {{PLURAL:$1|байт|байтан|байтвлӓ}}',
+'nmembers' => '$1 {{PLURAL:$1|объект|объектӹн|объект}}',
+'prefixindex' => 'Ӹлыштӓшвлӓн лӹмӹштӹн тӹнгӓлтӹш доно анжыктымы',
+'newpages' => 'У ӹлӹштӓшвлӓ',
+'move' => 'Вес лӹмӹм пуаш',
+'movethispage' => 'Ти ӹлыштӓшӹн лӹмжӹм вашталташ',
 'pager-newer-n' => '{{PLURAL:$1|урак|ураквлӓ|ураквлӓ гӹц}} $1',
 'pager-older-n' => '{{PLURAL:$1|тоштырак|тоштыраквлӓ|тоштыраквлӓ гӹц}} $1',
 
 # Book sources
-'booksources'               => 'Книгӓн кӹлвлӓжӹ (источник)',
+'booksources' => 'Книгӓн кӹлвлӓжӹ (источник)',
 'booksources-search-legend' => 'Книгӓ гишӓн информацим кӹчӓлмӓш',
-'booksources-go'            => 'Моаш',
+'booksources-go' => 'Моаш',
 
 # Special:Log
 'log' => 'Журналвлӓ',
 
 # Special:AllPages
-'allpages'       => 'Цилӓ ӹлӹштӓш',
+'allpages' => 'Цилӓ ӹлӹштӓш',
 'alphaindexline' => '$1 гӹц $2 якте',
-'prevpage'       => 'Анзыл ӹлӹштӓш ($1)',
-'allpagesfrom'   => 'Анжыкташ тӹ ӹлӹштӓшвлӓм , кыдывлӓ тӹнгӓлӓлтӹт:',
-'allpagesto'     => 'Лыкмашым тишӓк шагалташ:',
-'allarticles'    => 'Цилӓ ӹлӹштӓш',
+'prevpage' => 'Анзыл ӹлӹштӓш ($1)',
+'allpagesfrom' => 'Анжыкташ тӹ ӹлӹштӓшвлӓм , кыдывлӓ тӹнгӓлӓлтӹт:',
+'allpagesto' => 'Лыкмашым тишӓк шагалташ:',
+'allarticles' => 'Цилӓ ӹлӹштӓш',
 'allpagessubmit' => 'Ӹштӓш',
 
 # Special:LinkSearch
@@ -493,111 +492,111 @@ $messages = array(
 'emailuser' => 'Сирӹшӹлӓн сирмӓш',
 
 # Watchlist
-'watchlist'         => 'Вӓнгӹмӹ список',
-'mywatchlist'       => 'Вӓнгӹмӹ сирмӓш, список',
-'addedwatchtext'    => 'Ӹлӹштӓшӹм«[[:$1]]» тӓмдӓн вӓнгӹмӹ [[Special:Watchlist|ӹлӹштӓшӹшкӹдӓ пыртымы]]. Тидӹ паштек ӹштӹмӹ ӹлӹштӓшӹн вашталтымашвлӓ  ти списокышты анжыктымы дӓ тенгеок кӹжгӹ буквавлӓ доно у вашталтымашвлӓн списокышты пӓлдӹртӹмӹ лиэш[[Special:RecentChanges| пӓлдӹртӹмӹ лит]] нӹнӹм  айыраш куштылгырак лижӹ манын.',
-'removedwatchtext'  => 'Ӹлӹштӓш «[[:$1]]» тӓмдӓн вӓнгӹмӹ ӹлӹштӓшдӓ гӹц [[Special:Watchlist|карангдымы]].',
-'watch'             => 'Вӓнгӓш',
-'watchthispage'     => 'Ти ӹлӹштӓшӹм вӓнгӓш',
-'unwatch'           => 'Вӓнгӓш агыл',
+'watchlist' => 'Вӓнгӹмӹ список',
+'mywatchlist' => 'Вӓнгӹмӹ сирмӓш, список',
+'addedwatchtext' => 'Ӹлӹштӓшӹм«[[:$1]]» тӓмдӓн вӓнгӹмӹ [[Special:Watchlist|ӹлӹштӓшӹшкӹдӓ пыртымы]]. Тидӹ паштек ӹштӹмӹ ӹлӹштӓшӹн вашталтымашвлӓ  ти списокышты анжыктымы дӓ тенгеок кӹжгӹ буквавлӓ доно у вашталтымашвлӓн списокышты пӓлдӹртӹмӹ лиэш[[Special:RecentChanges| пӓлдӹртӹмӹ лит]] нӹнӹм  айыраш куштылгырак лижӹ манын.',
+'removedwatchtext' => 'Ӹлӹштӓш «[[:$1]]» тӓмдӓн вӓнгӹмӹ ӹлӹштӓшдӓ гӹц [[Special:Watchlist|карангдымы]].',
+'watch' => 'Вӓнгӓш',
+'watchthispage' => 'Ти ӹлӹштӓшӹм вӓнгӓш',
+'unwatch' => 'Вӓнгӓш агыл',
 'watchlist-details' => 'Тӓмдӓн вӓнгӹмӹ списокыштыда $1 {{PLURAL:$1|ӹлӹштӓш|ӹлӹштӓшвлӓ|ӹлӹштӓш}}, Кӓнгӓшӹмӓш ӹлыштӓшвлӓ гӹц пасна.',
-'wlshowlast'        => 'Анжыкташ эртӹш  $1 час $2 кечӹвлӓн $3',
+'wlshowlast' => 'Анжыкташ эртӹш  $1 час $2 кечӹвлӓн $3',
 'watchlist-options' => 'Вӓнгӹмӹ списокын настройкыжы',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Вӓнгӹмӹ списокыш пырташ...',
+'watching' => 'Вӓнгӹмӹ списокыш пырташ...',
 'unwatching' => 'Вӓнгӹмӹ список гӹц карангдаш...',
 
 # Delete
-'deletepage'            => 'Ӹлӹштӓшӹм карангдаш',
-'confirmdeletetext'     => 'Тӓ ӹлӹштӓшӹн (изображенин) цилӓ информацижӹм  дӓ базышты ылшы вашталтымашвлӓн историм ӹштӹл шуаш ядыда. Пуры лидӓ, дӓ лачокат ма тенге ӹштӹнедӓ, шаналтыда. Махань последствивлӓ тидӹ паштек вычат, ынгылышашлык ылыда дӓ тидӹм  ти кӹдешӹтӹ анжыктымы правилывлӓштӹ анжалда [[{{MediaWiki:Policy-url}}]].',
-'actioncomplete'        => 'Лачокат ӹштӹмӹ',
-'deletedtext'           => '«$1» карангдымы.
+'deletepage' => 'Ӹлӹштӓшӹм карангдаш',
+'confirmdeletetext' => 'Тӓ ӹлӹштӓшӹн (изображенин) цилӓ информацижӹм  дӓ базышты ылшы вашталтымашвлӓн историм ӹштӹл шуаш ядыда. Пуры лидӓ, дӓ лачокат ма тенге ӹштӹнедӓ, шаналтыда. Махань последствивлӓ тидӹ паштек вычат, ынгылышашлык ылыда дӓ тидӹм  ти кӹдешӹтӹ анжыктымы правилывлӓштӹ анжалда [[{{MediaWiki:Policy-url}}]].',
+'actioncomplete' => 'Лачокат ӹштӹмӹ',
+'deletedtext' => '«$1» карангдымы.
 Анжы: $2 тидӹ мам карангдымы тӹ списокым анжыкта',
-'dellogpage'            => 'Мам карангдымы анжыктышы сирмӓш',
-'deletecomment'         => 'Ӓмӓлжӹ:',
-'deleteotherreason'     => 'Вес ӓмӓл/ынгылдарал:',
+'dellogpage' => 'Мам карангдымы анжыктышы сирмӓш',
+'deletecomment' => 'Ӓмӓлжӹ:',
+'deleteotherreason' => 'Вес ӓмӓл/ынгылдарал:',
 'deletereasonotherlist' => 'Вес ӓмӓл',
 
 # Rollback
 'rollbacklink' => 'лишӹц колташ',
 
 # Protect
-'protectlogpage'              => 'Ӹшӹклӹмӹ журнал',
-'protectedarticle'            => 'ӹлӹштӓш ӹшӹклӓлтеш «[[$1]]»',
-'modifiedarticleprotection'   => 'ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтымы «[[$1]]»',
-'protectcomment'              => 'Ӓмӓлжӹ:',
-'protectexpiry'               => 'Жепшӹ пӹтӓ:',
-'protect_expiry_invalid'      => 'Ӹшӹклӹмӹ жепӹм самынь анжыктымы.',
-'protect_expiry_old'          => 'Пӹтӹм жепшӹ эртен',
-'protect-text'                => "Тиштӹ тӓ ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм анжал дӓ вашталтен кердӹдӓ'''$1'''.",
-'protect-locked-access'       => "Тӓмдӓн учетный карточкыдан ӹшӹклӹмӓш кӱкшӹцӹм вашталташ манын ситӓлык праважы уке. Ти ӹлӹштӓшӹм шӹндӹдӓ'''$1''':",
-'protect-cascadeon'           => 'Ти ӹлӹштӓшӹм {{PLURAL:$1|-шкы пыртымат, ӹшӹклӓлтеш, кыды ӱлнӹрӓк ылшы ӹлӹштӓшӹш|ӹлӹштӓшвлӓшкӹ ажедеш, кышкы }} каскадан ӹшӹклӹмашӹм шӹндӹмӹ. Тӓ ти ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтен кердӹдӓ, но тидӹ каскадан ӹшӹклӹмашӹм ак тӹкӓл лиэш.',
-'protect-default'             => 'Ӹшӹклӹмӹ агыл',
-'protect-fallback'            => 'Разрешени келеш «$1»',
+'protectlogpage' => 'Ӹшӹклӹмӹ журнал',
+'protectedarticle' => 'ӹлӹштӓш ӹшӹклӓлтеш «[[$1]]»',
+'modifiedarticleprotection' => 'ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтымы «[[$1]]»',
+'protectcomment' => 'Ӓмӓлжӹ:',
+'protectexpiry' => 'Жепшӹ пӹтӓ:',
+'protect_expiry_invalid' => 'Ӹшӹклӹмӹ жепӹм самынь анжыктымы.',
+'protect_expiry_old' => 'Пӹтӹм жепшӹ эртен',
+'protect-text' => "Тиштӹ тӓ ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм анжал дӓ вашталтен кердӹдӓ'''$1'''.",
+'protect-locked-access' => "Тӓмдӓн учетный карточкыдан ӹшӹклӹмӓш кӱкшӹцӹм вашталташ манын ситӓлык праважы уке. Ти ӹлӹштӓшӹм шӹндӹдӓ'''$1''':",
+'protect-cascadeon' => 'Ти ӹлӹштӓшӹм {{PLURAL:$1|-шкы пыртымат, ӹшӹклӓлтеш, кыды ӱлнӹрӓк ылшы ӹлӹштӓшӹш|ӹлӹштӓшвлӓшкӹ ажедеш, кышкы }} каскадан ӹшӹклӹмашӹм шӹндӹмӹ. Тӓ ти ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтен кердӹдӓ, но тидӹ каскадан ӹшӹклӹмашӹм ак тӹкӓл лиэш.',
+'protect-default' => 'Ӹшӹклӹмӹ агыл',
+'protect-fallback' => 'Разрешени келеш «$1»',
 'protect-level-autoconfirmed' => 'У дӓ регистрируялтшы агыл сирӹшӹвла гӹц ӹшӹклӓш',
-'protect-level-sysop'         => 'Администраторвлӓ веле',
-'protect-summary-cascade'     => 'каскадан',
-'protect-expiring'            => 'жепшӹ пӹтӓ $1 (UTC)',
-'protect-cascade'             => 'Ти ӹлӹштӓшӹшкӹ пыртымы ӹлӹштӓшвлӓм ӹшӹклӓш (каскадан ӹшӹклӹмӓш)',
-'protect-cantedit'            => 'Ти текстӹм тӧрлӓш правада укеӓт, тӓ ти ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтен ада керд.',
-'restriction-type'            => 'Прававлӓ:',
-'restriction-level'           => 'Пыраш лимӹ кӱкшӹц:',
+'protect-level-sysop' => 'Администраторвлӓ веле',
+'protect-summary-cascade' => 'каскадан',
+'protect-expiring' => 'жепшӹ пӹтӓ $1 (UTC)',
+'protect-cascade' => 'Ти ӹлӹштӓшӹшкӹ пыртымы ӹлӹштӓшвлӓм ӹшӹклӓш (каскадан ӹшӹклӹмӓш)',
+'protect-cantedit' => 'Ти текстӹм тӧрлӓш правада укеӓт, тӓ ти ӹлӹштӓшӹн ӹшӹклӹмӹ кӱкшӹцшӹм вашталтен ада керд.',
+'restriction-type' => 'Прававлӓ:',
+'restriction-level' => 'Пыраш лимӹ кӱкшӹц:',
 
 # Undelete
 'undeletelink' => 'анжен лӓктӓш/угӹц ӹштӓш',
 
 # Namespace form on various pages
-'namespace'      => 'Лӹмвлӓн кымдецӹштӹ:',
-'invert'         => 'Мам айырендӓ, мынгеш шӹндӓш',
+'namespace' => 'Лӹмвлӓн кымдецӹштӹ:',
+'invert' => 'Мам айырендӓ, мынгеш шӹндӓш',
 'blanknamespace' => '(Тӹнг)',
 
 # Contributions
-'contributions'       => 'Лӓктӹшет',
+'contributions' => 'Лӓктӹшет',
 'contributions-title' => 'Сирӹшӹн лӓктӹшӹжӹ $1',
-'mycontris'           => 'Мӹньын лӓктӹшем',
-'contribsub2'         => 'Лӓктӹш $1 ($2)',
-'uctop'               => '(пӹтӓртӹш)',
-'month'               => 'Тӹлзӹ гӹц (ирӹрӓкӓт):',
-'year'                => 'Ти и гӹц (ирӹрӓкӓт):',
+'mycontris' => 'Мӹньын лӓктӹшем',
+'contribsub2' => 'Лӓктӹш $1 ($2)',
+'uctop' => '(пӹтӓртӹш)',
+'month' => 'Тӹлзӹ гӹц (ирӹрӓкӓт):',
+'year' => 'Ти и гӹц (ирӹрӓкӓт):',
 
-'sp-contributions-newbies'  => 'Лач тӹ лӓктӹшвлӓм веле анжыкташ, кыдывлӓм у сирӹмӓшвлӓштӹ шотыш нӓлмӹ',
+'sp-contributions-newbies' => 'Лач тӹ лӓктӹшвлӓм веле анжыкташ, кыдывлӓм у сирӹмӓшвлӓштӹ шотыш нӓлмӹ',
 'sp-contributions-blocklog' => 'блокировкывлӓ',
-'sp-contributions-search'   => 'Лӓктӹшӹм кӹчӓлмӓш',
+'sp-contributions-search' => 'Лӓктӹшӹм кӹчӓлмӓш',
 'sp-contributions-username' => 'IP-сирӹшӹн адрес дон лӹмжӹ:',
-'sp-contributions-submit'   => 'Моаш',
+'sp-contributions-submit' => 'Моаш',
 
 # What links here
-'whatlinkshere'            => 'Тишкӹ ажедмӓшвлӓ  (ссылкывлӓ)',
-'whatlinkshere-title'      => 'Ӹлӹштӓшвлӓ, кыдывлӓ ажедӹт «$1»',
-'whatlinkshere-page'       => 'Ӹлӹштӓш:',
-'linkshere'                => "Ти ӹлӹштӓшвлӓ тишкӹ ажедӹт '''[[:$1]]''':",
-'isredirect'               => 'вес вӓре колтымым анжыктышы ӹлӹштӓш',
-'istemplate'               => 'кӧргӹш пыртымы',
-'isimage'                  => 'изображени докы ажедмӓш',
-'whatlinkshere-prev'       => '{{PLURAL:$1|анзылнышы|анзылнышывлӓ|анзылнышывла}} $1',
-'whatlinkshere-next'       => '{{PLURAL:$1|пакылашы|пакылашывлӓ|пакылашывлӓ}} $1',
-'whatlinkshere-links'      => '← ажедмӓшвлӓ',
+'whatlinkshere' => 'Тишкӹ ажедмӓшвлӓ  (ссылкывлӓ)',
+'whatlinkshere-title' => 'Ӹлӹштӓшвлӓ, кыдывлӓ ажедӹт «$1»',
+'whatlinkshere-page' => 'Ӹлӹштӓш:',
+'linkshere' => "Ти ӹлӹштӓшвлӓ тишкӹ ажедӹт '''[[:$1]]''':",
+'isredirect' => 'вес вӓре колтымым анжыктышы ӹлӹштӓш',
+'istemplate' => 'кӧргӹш пыртымы',
+'isimage' => 'изображени докы ажедмӓш',
+'whatlinkshere-prev' => '{{PLURAL:$1|анзылнышы|анзылнышывлӓ|анзылнышывла}} $1',
+'whatlinkshere-next' => '{{PLURAL:$1|пакылашы|пакылашывлӓ|пакылашывлӓ}} $1',
+'whatlinkshere-links' => '← ажедмӓшвлӓ',
 'whatlinkshere-hideredirs' => '$1 вес вӓрӹш колтымаш',
-'whatlinkshere-hidetrans'  => '$1 кӧргӹш пыртымывлӓ',
-'whatlinkshere-hidelinks'  => '$1 ажедмӓшвлӓ',
-'whatlinkshere-filters'    => 'Фильтрвлӓ',
+'whatlinkshere-hidetrans' => '$1 кӧргӹш пыртымывлӓ',
+'whatlinkshere-hidelinks' => '$1 ажедмӓшвлӓ',
+'whatlinkshere-filters' => 'Фильтрвлӓ',
 
 # Block/unblock
-'blockip'                  => 'Блокируяш',
-'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'              => 'Блокируйымы IP-адресвлӓ дон шотыш нӓлмӹ сирӹмӓшвлӓ',
-'blocklink'                => 'блокируяш',
-'unblocklink'              => 'блокировкым пачаш',
-'change-blocklink'         => 'блокировкым вашталташ',
-'contribslink'             => 'лӓктӹш, мам ӹштендӓ тӹдӹ',
-'blocklogpage'             => 'Блокировкывлӓн журналышты',
-'blocklogentry'            => 'периодеш [[$1]] блокируйымы$2 $3',
-'unblocklogentry'          => 'блокировкым пачмы $1',
+'blockip' => 'Блокируяш',
+'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' => 'Блокируйымы IP-адресвлӓ дон шотыш нӓлмӹ сирӹмӓшвлӓ',
+'blocklink' => 'блокируяш',
+'unblocklink' => 'блокировкым пачаш',
+'change-blocklink' => 'блокировкым вашталташ',
+'contribslink' => 'лӓктӹш, мам ӹштендӓ тӹдӹ',
+'blocklogpage' => 'Блокировкывлӓн журналышты',
+'blocklogentry' => 'периодеш [[$1]] блокируйымы$2 $3',
+'unblocklogentry' => 'блокировкым пачмы $1',
 'block-log-flags-nocreate' => 'учётный сирмӓшвлӓн регистрацим запрещӓйӹмӹ',
 
 # Move page
-'movepagetext'     => 'Ӱлнӹш формым кычылт, тӓ ӹлӹштӓшлӓн у лӹмӹм пуэдӓ дӓ тӹ годымок вашталтымашвлӓн журналышты у вӓрӹш шӹндедӓ. Тошты лӹм у лӹмӹн  вес вӓрӹшкӹ колтышы семӹнь лиэш. Тошты лӹмӹшкӹ пыртымы вес вӓрӹшкӹ колтымашвлӓм автоматически уэмден кердӹдӓ. Тидӹм ада ӹштӹ гӹнь, пуры лидӓ, контролируен лӓкдӓ [[Special:DoubleRedirects|коктым]] дон [[Special:BrokenRedirects|кӹрмӹ вес вӓре ажедмӓшвлӓм]]. Кышкы ажедмӓшвлӓ анжыктышашлык ылыт, тӓ тидӹ верц вӓшештедӓ. Шотыш нӓлдӓ, у лӹм доно ӹлӹштӓш улы гӹнь, тӹдӹн лӹмжӹ «ак вашталт»;  вес вӓрӹшкӹ колтымаш ӓль охыр дӓ тӧрлӹмӓшвлӓн историштӹ уке ылмы гӹц пасна.
+'movepagetext' => 'Ӱлнӹш формым кычылт, тӓ ӹлӹштӓшлӓн у лӹмӹм пуэдӓ дӓ тӹ годымок вашталтымашвлӓн журналышты у вӓрӹш шӹндедӓ. Тошты лӹм у лӹмӹн  вес вӓрӹшкӹ колтышы семӹнь лиэш. Тошты лӹмӹшкӹ пыртымы вес вӓрӹшкӹ колтымашвлӓм автоматически уэмден кердӹдӓ. Тидӹм ада ӹштӹ гӹнь, пуры лидӓ, контролируен лӓкдӓ [[Special:DoubleRedirects|коктым]] дон [[Special:BrokenRedirects|кӹрмӹ вес вӓре ажедмӓшвлӓм]]. Кышкы ажедмӓшвлӓ анжыктышашлык ылыт, тӓ тидӹ верц вӓшештедӓ. Шотыш нӓлдӓ, у лӹм доно ӹлӹштӓш улы гӹнь, тӹдӹн лӹмжӹ «ак вашталт»;  вес вӓрӹшкӹ колтымаш ӓль охыр дӓ тӧрлӹмӓшвлӓн историштӹ уке ылмы гӹц пасна.
 Тидӹ теве мам анжыкта, самынь у лӹмӹм пуэндӓ гӹнь, изиш анзыцырак ӹлӹштӓшӹн махань лӹмжӹ ылын, тӹ лӹмӹшкок вашталтен кердӹдӓ,  но ти улы ылшы ӹлӹштӓшӹм тӓ ӹштӹл шуэн ада керд.
 «ӒШТӸДӒ!»
 У лӹмӹм пумаш  «популярный» ӹлӹштӓшвлӓлӓн пиш кого вычыдымашвлӓм канден кердеш.
@@ -606,19 +605,19 @@ $messages = array(
 *Техень лӹмӓн кӓнгӓшӹмӓш ӹлӹштӓш тӹтежӓт улы ӓль
 *ӱлнӹрӓк ылшы  ныреш кагырикӹм ыдыралделда.
 Техень годым, келеш гӹнь, тӓ ти ӹлыштӓшӹм вес вӓрӹшкӹ кид доно шӹндӹшӓшлык ӓль ушештӹшӓшлык ылыда.',
-'movearticle'      => 'Ӹлӹштӓш лӹмӹм вашталташ',
-'newtitle'         => 'У лӹм:',
-'move-watch'       => 'Ти ӹлыштӓшӹм вӓнгӹмӓшӹн списокыш пыртымыла',
-'movepagebtn'      => 'Ӹлӹштӓшӹн лӹмжӹм вашталташ',
-'pagemovedsub'     => 'Ӹлӹштӓшӹн лӹмжӹм вашталтымы',
-'movepage-moved'   => "'''Ӹлӹштӓшӹн  «$1» лӹмжӹ ӹнде«$2»'''",
-'articleexists'    => 'Техень лӹмӓн ӹлӹштӓш тӹтежӓт улы. Пуры лидӓ, вес лӹмӹм айырыда.',
-'talkexists'       => "'''Ӹлӹштӓш лӹм вашталтымы, но техень лӹмӓн ӹлӹштӓш тӹтежӓт улы, кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ ак ли. Пуры лидӓ, кид доно нӹнӹм ушыда.'''",
-'movedto'          => 'техеньӹш вашталтымы',
-'movetalk'         => 'Ти кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ',
-'movelogpage'      => 'Лӹмвлӓм вашталтымы журнал',
-'movereason'       => 'Ӓмӓлжӹ:',
-'revertmove'       => 'лишӹц колтымаш',
+'movearticle' => 'Ӹлӹштӓш лӹмӹм вашталташ',
+'newtitle' => 'У лӹм:',
+'move-watch' => 'Ти ӹлыштӓшӹм вӓнгӹмӓшӹн списокыш пыртымыла',
+'movepagebtn' => 'Ӹлӹштӓшӹн лӹмжӹм вашталташ',
+'pagemovedsub' => 'Ӹлӹштӓшӹн лӹмжӹм вашталтымы',
+'movepage-moved' => "'''Ӹлӹштӓшӹн  «$1» лӹмжӹ ӹнде«$2»'''",
+'articleexists' => 'Техень лӹмӓн ӹлӹштӓш тӹтежӓт улы. Пуры лидӓ, вес лӹмӹм айырыда.',
+'talkexists' => "'''Ӹлӹштӓш лӹм вашталтымы, но техень лӹмӓн ӹлӹштӓш тӹтежӓт улы, кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ ак ли. Пуры лидӓ, кид доно нӹнӹм ушыда.'''",
+'movedto' => 'техеньӹш вашталтымы',
+'movetalk' => 'Ти кӓнгӓшӹмӓш ӹлӹштӓшӹн лӹмжӹм вашталташ',
+'movelogpage' => 'Лӹмвлӓм вашталтымы журнал',
+'movereason' => 'Ӓмӓлжӹ:',
+'revertmove' => 'лишӹц колтымаш',
 
 # Export
 'export' => 'Артикльвлӓм экспортируйымаш',
@@ -627,67 +626,67 @@ $messages = array(
 'thumbnail-more' => 'Когоэмдӓш',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Тӓмдӓн сирӹмӹ ӹлӹштӓшда',
-'tooltip-pt-mytalk'               => 'Тӓмдӓн Кӓнгӓшӹмӓш ӹлӹштӓшдӓ',
-'tooltip-pt-preferences'          => 'Мӹньӹн настройкывлӓэм',
-'tooltip-pt-watchlist'            => 'Мам вӓнгенӓм, тӹдӹн сирмӓшӹжӹ',
-'tooltip-pt-mycontris'            => 'Мам тӧрлендӓ , тӹдӹн списокшы',
-'tooltip-pt-login'                => 'Тиштӹ регистрируялташ лиэш, но обязательны агыл',
-'tooltip-pt-logout'               => 'Пӓшан сеансшым пӹтӓрӓш',
-'tooltip-ca-talk'                 => 'Мам ӹлӹштӓшӹштӹ сирӹмӹ, тӹдӹ гишӓн хытыраш',
-'tooltip-ca-edit'                 => 'Ти ӹлӹштӓшӹм вашталташ лиэш. Пуры лидӓ, «переген кодаш» графам темдӓлмешкӹдӓ «анзыц анжалаш» графам кычылтда.',
-'tooltip-ca-addsection'           => 'У трансляцин пӧлкӓм ӹштӓш',
-'tooltip-ca-viewsource'           => 'Ти ӹлӹштӓш вашталтымашвлӓ гӹц ӹшӹклӓлтеш, тенге гӹнят тӓ махань тӹдӹ пӹтӓри ылын анжал дӓ копируен кердӹдӓ',
-'tooltip-ca-history'              => 'Мам ӹлӹштӓшӹштӹ вашталтымы',
-'tooltip-ca-protect'              => 'Ӹлӹштӓшӹм вашталтымашвлӓ гыц ӹшӹклӓш',
-'tooltip-ca-delete'               => 'Ти ӹлӹштӓшӹм ӹштӹл шуаш',
-'tooltip-ca-move'                 => 'Ӹлӹштӓшлӓн вес лӹмӹм пуаш',
-'tooltip-ca-watch'                => 'Ти ӹлыштӓшӹм вӓнгӹшӹвлӓн сирмӓшӹш пырташ',
-'tooltip-ca-unwatch'              => 'Ти ӹлыштӓшӹм вӓнгӹмы сирмӓшдӓ гӹц ӹштӹл шуаш',
-'tooltip-search'                  => 'Кӹчӓлӓш {{SITENAME}}',
-'tooltip-search-go'               => 'Техень лӹм донок ылшы вес ӹлӹштӓшӹш ванжаш',
-'tooltip-search-fulltext'         => 'Техень текстӓн ӹлӹштӓшвлӓшкӹ ванжаш',
-'tooltip-n-mainpage'              => 'Тӹнг ӹлӹштӓшӹш ванжаш',
-'tooltip-n-mainpage-description'  => 'Тӹнг ӹлӹштӓшӹш ванжаш',
-'tooltip-n-portal'                => 'Тӹдӹ, мам ӹштен кердӹдӓ дӓ кышты ма вӓрлӓнӓ, тӹдӹ гишӓн проект',
-'tooltip-n-currentevents'         => 'Ма лиӓлтӹн, тӹдӹм анжыктышы сирмӓш',
-'tooltip-n-recentchanges'         => 'Техень текстӓн ӹлӹштӓшвлӓшкӹ ванжаш',
-'tooltip-n-randompage'            => 'Самынь вӓрештшӹ ӹлӹштӓшӹм анжен лӓктӓш',
-'tooltip-n-help'                  => '«{{SITENAME}}» проект доно справочник',
-'tooltip-t-whatlinkshere'         => 'Цилӓ ӹлӹштӓшӹн список, кыдывлӓ ти ӹлӹштӓшӹш ажедӹт',
-'tooltip-t-recentchangeslinked'   => 'Тӹ ӹлӹштӓшвлӓштӹ остатка вашталтмашвлӓ, кышкы ти ӹлӹштӓш ажедеш',
-'tooltip-feed-rss'                => 'Ти ӹлӹштӓшлӓн RSS-шты трансляци',
-'tooltip-feed-atom'               => 'Ти ӹлӹштӓшлӓн Atom-шты трансляци',
-'tooltip-t-contributions'         => 'Мам ти сирӹшӹ вашталтен, ӹлӹштӓшвлӓн список',
-'tooltip-t-emailuser'             => 'Ти сирӹшӹлӓн сирмӓшӹм колташ',
-'tooltip-t-upload'                => 'Изображенивлӓ дон мультимеди-файлым темӓш',
-'tooltip-t-specialpages'          => 'Спецӹлӹштӓшвлӓн список',
-'tooltip-t-print'                 => 'Ти ӹлӹштӓшӹн пецӓтлӹмӹ версижӹ',
-'tooltip-t-permalink'             => 'Соок ти ӹлӹтӓшӹн вариантышкыжы ажедмӓш',
-'tooltip-ca-nstab-main'           => 'Ӹлӹштӓшӹн кӧргӹжӹ',
-'tooltip-ca-nstab-user'           => 'Сирӹшӹн ӹшке ӹлӹштӓшӹжӹ',
-'tooltip-ca-nstab-special'        => 'Тидӹ спецӹлӹштӓш, кыдым редактируяш ак ли',
-'tooltip-ca-nstab-project'        => 'Проектӹн ӹлӹштӓшӹжӹ',
-'tooltip-ca-nstab-image'          => 'Файлын ӹлӹштӓшӹжӹ',
-'tooltip-ca-nstab-template'       => 'Шаблонын ӹлӹшташӹжӹ',
-'tooltip-ca-nstab-category'       => 'Категорин ӹлӹштӓшӹжӹ',
-'tooltip-minoredit'               => 'Ти вашталтымаш кого агылат, вашталташ',
-'tooltip-save'                    => 'Тӧрлӹмашдӓм ӹшӹклен кодаш',
-'tooltip-preview'                 => 'Переген кодаш кнопкым темдӓлмӹда анзыц, пуры лидӓ, анзыц анжалмым кычылтда!',
-'tooltip-diff'                    => 'Мам тӧрлӹмӹдӓ якте текстӹштӹ сирӹмӹ ылын, тӹ вашталтымашвлӓм анжыкташ',
+'tooltip-pt-userpage' => 'Тӓмдӓн сирӹмӹ ӹлӹштӓшда',
+'tooltip-pt-mytalk' => 'Тӓмдӓн Кӓнгӓшӹмӓш ӹлӹштӓшдӓ',
+'tooltip-pt-preferences' => 'Мӹньӹн настройкывлӓэм',
+'tooltip-pt-watchlist' => 'Мам вӓнгенӓм, тӹдӹн сирмӓшӹжӹ',
+'tooltip-pt-mycontris' => 'Мам тӧрлендӓ , тӹдӹн списокшы',
+'tooltip-pt-login' => 'Тиштӹ регистрируялташ лиэш, но обязательны агыл',
+'tooltip-pt-logout' => 'Пӓшан сеансшым пӹтӓрӓш',
+'tooltip-ca-talk' => 'Мам ӹлӹштӓшӹштӹ сирӹмӹ, тӹдӹ гишӓн хытыраш',
+'tooltip-ca-edit' => 'Ти ӹлӹштӓшӹм вашталташ лиэш. Пуры лидӓ, «переген кодаш» графам темдӓлмешкӹдӓ «анзыц анжалаш» графам кычылтда.',
+'tooltip-ca-addsection' => 'У трансляцин пӧлкӓм ӹштӓш',
+'tooltip-ca-viewsource' => 'Ти ӹлӹштӓш вашталтымашвлӓ гӹц ӹшӹклӓлтеш, тенге гӹнят тӓ махань тӹдӹ пӹтӓри ылын анжал дӓ копируен кердӹдӓ',
+'tooltip-ca-history' => 'Мам ӹлӹштӓшӹштӹ вашталтымы',
+'tooltip-ca-protect' => 'Ӹлӹштӓшӹм вашталтымашвлӓ гыц ӹшӹклӓш',
+'tooltip-ca-delete' => 'Ти ӹлӹштӓшӹм ӹштӹл шуаш',
+'tooltip-ca-move' => 'Ӹлӹштӓшлӓн вес лӹмӹм пуаш',
+'tooltip-ca-watch' => 'Ти ӹлыштӓшӹм вӓнгӹшӹвлӓн сирмӓшӹш пырташ',
+'tooltip-ca-unwatch' => 'Ти ӹлыштӓшӹм вӓнгӹмы сирмӓшдӓ гӹц ӹштӹл шуаш',
+'tooltip-search' => 'Кӹчӓлӓш {{SITENAME}}',
+'tooltip-search-go' => 'Техень лӹм донок ылшы вес ӹлӹштӓшӹш ванжаш',
+'tooltip-search-fulltext' => 'Техень текстӓн ӹлӹштӓшвлӓшкӹ ванжаш',
+'tooltip-n-mainpage' => 'Тӹнг ӹлӹштӓшӹш ванжаш',
+'tooltip-n-mainpage-description' => 'Тӹнг ӹлӹштӓшӹш ванжаш',
+'tooltip-n-portal' => 'Тӹдӹ, мам ӹштен кердӹдӓ дӓ кышты ма вӓрлӓнӓ, тӹдӹ гишӓн проект',
+'tooltip-n-currentevents' => 'Ма лиӓлтӹн, тӹдӹм анжыктышы сирмӓш',
+'tooltip-n-recentchanges' => 'Техень текстӓн ӹлӹштӓшвлӓшкӹ ванжаш',
+'tooltip-n-randompage' => 'Самынь вӓрештшӹ ӹлӹштӓшӹм анжен лӓктӓш',
+'tooltip-n-help' => '«{{SITENAME}}» проект доно справочник',
+'tooltip-t-whatlinkshere' => 'Цилӓ ӹлӹштӓшӹн список, кыдывлӓ ти ӹлӹштӓшӹш ажедӹт',
+'tooltip-t-recentchangeslinked' => 'Тӹ ӹлӹштӓшвлӓштӹ остатка вашталтмашвлӓ, кышкы ти ӹлӹштӓш ажедеш',
+'tooltip-feed-rss' => 'Ти ӹлӹштӓшлӓн RSS-шты трансляци',
+'tooltip-feed-atom' => 'Ти ӹлӹштӓшлӓн Atom-шты трансляци',
+'tooltip-t-contributions' => 'Мам ти сирӹшӹ вашталтен, ӹлӹштӓшвлӓн список',
+'tooltip-t-emailuser' => 'Ти сирӹшӹлӓн сирмӓшӹм колташ',
+'tooltip-t-upload' => 'Изображенивлӓ дон мультимеди-файлым темӓш',
+'tooltip-t-specialpages' => 'Спецӹлӹштӓшвлӓн список',
+'tooltip-t-print' => 'Ти ӹлӹштӓшӹн пецӓтлӹмӹ версижӹ',
+'tooltip-t-permalink' => 'Соок ти ӹлӹтӓшӹн вариантышкыжы ажедмӓш',
+'tooltip-ca-nstab-main' => 'Ӹлӹштӓшӹн кӧргӹжӹ',
+'tooltip-ca-nstab-user' => 'Сирӹшӹн ӹшке ӹлӹштӓшӹжӹ',
+'tooltip-ca-nstab-special' => 'Тидӹ спецӹлӹштӓш, кыдым редактируяш ак ли',
+'tooltip-ca-nstab-project' => 'Проектӹн ӹлӹштӓшӹжӹ',
+'tooltip-ca-nstab-image' => 'Файлын ӹлӹштӓшӹжӹ',
+'tooltip-ca-nstab-template' => 'Шаблонын ӹлӹшташӹжӹ',
+'tooltip-ca-nstab-category' => 'Категорин ӹлӹштӓшӹжӹ',
+'tooltip-minoredit' => 'Ти вашталтымаш кого агылат, вашталташ',
+'tooltip-save' => 'Тӧрлӹмашдӓм ӹшӹклен кодаш',
+'tooltip-preview' => 'Переген кодаш кнопкым темдӓлмӹда анзыц, пуры лидӓ, анзыц анжалмым кычылтда!',
+'tooltip-diff' => 'Мам тӧрлӹмӹдӓ якте текстӹштӹ сирӹмӹ ылын, тӹ вашталтымашвлӓм анжыкташ',
 'tooltip-compareselectedversions' => 'Ти кок айырымы верси лошты махань айыртем, анжалаш',
-'tooltip-watch'                   => 'Ти ӹлӹштӓшӹм вӓнгӹмӹ списокыш пырташ',
-'tooltip-rollback'                => 'Мам анзыцда тӧрлӹшӹ ӹштен, тӹдым ик гӓнӓ темдӓлок ӹштӹл шуаш',
-'tooltip-undo'                    => 'Тӧрлӹмӹм ӹштӹл шуаш, анзыц анжалмым  дӓ  лиэш гӹнь вашталтымашын  ӓмӓлжӹм анжыкташ',
+'tooltip-watch' => 'Ти ӹлӹштӓшӹм вӓнгӹмӹ списокыш пырташ',
+'tooltip-rollback' => 'Мам анзыцда тӧрлӹшӹ ӹштен, тӹдым ик гӓнӓ темдӓлок ӹштӹл шуаш',
+'tooltip-undo' => 'Тӧрлӹмӹм ӹштӹл шуаш, анзыц анжалмым  дӓ  лиэш гӹнь вашталтымашын  ӓмӓлжӹм анжыкташ',
 
 # Browsing diffs
 'previousdiff' => '← Анзыл тӧрлӹмӓш',
-'nextdiff'     => 'Вес тӧрлӹмӓш →',
+'nextdiff' => 'Вес тӧрлӹмӓш →',
 
 # Media information
 'file-info-size' => '$1 × $2 пиксел,  файлын размержӹ: $3, MIME-тип: $4',
-'file-nohires'   => 'Кого разрешени доно верси уке.',
-'svg-long-desc'  => 'SVG-файл, номинально $1 × $2 пиксель,  файлын размержӹ: $3',
+'file-nohires' => 'Кого разрешени доно верси уке.',
+'svg-long-desc' => 'SVG-файл, номинально $1 × $2 пиксель,  файлын размержӹ: $3',
 'show-big-image' => 'Кӱкшӹрӓк разрешениӓн изображени',
 
 # Bad image list
@@ -698,11 +697,11 @@ $messages = array(
 Тидӹ паштек ажедмӓшвлӓ, кыдывлӓм ти корнышты анжыктымы, исключени семӹнь анжымы лит дӓ тӹшкӹ ти изображеним шӹндӓш лиэш.',
 
 # Metadata
-'metadata'          => 'Метадата',
-'metadata-help'     => 'Дигитальный камеры  дӓ сканер доно шӹндӹмӹ файлыштыш дополнительный информаци. Ӹштӹмӹ паштек файлым редактируйымы гӹнь, тӹнӓм кыды-тидӹ параметржӹ анжыктымы изображенилан ак вӓшештӹ.',
-'metadata-expand'   => 'Дополнительный информацим анжыкташ',
+'metadata' => 'Метадата',
+'metadata-help' => 'Дигитальный камеры  дӓ сканер доно шӹндӹмӹ файлыштыш дополнительный информаци. Ӹштӹмӹ паштек файлым редактируйымы гӹнь, тӹнӓм кыды-тидӹ параметржӹ анжыктымы изображенилан ак вӓшештӹ.',
+'metadata-expand' => 'Дополнительный информацим анжыкташ',
 'metadata-collapse' => 'Дополнительный информацим шӹлтӓш',
-'metadata-fields'   => 'Ти списокышты ылшы метадатывлӓн нырыштым изображенин ӹлӹштӓшӹштӹ анжыктымы лиэш, весӹвлӓжӹ шӹлтӹмӹ лит.
+'metadata-fields' => 'Ти списокышты ылшы метадатывлӓн нырыштым изображенин ӹлӹштӓшӹштӹ анжыктымы лиэш, весӹвлӓжӹ шӹлтӹмӹ лит.
 * make
 * model
 * datetimeoriginal
@@ -718,18 +717,18 @@ $messages = array(
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'Тӱнӹш программым кычылт, ти файлым тӧрлӓш',
+'edit-externally' => 'Тӱнӹш программым кычылт, ти файлым тӧрлӓш',
 'edit-externally-help' => '(шукыракым анжал: [//www.mediawiki.org/wiki/Manual:External_editors установкын правилывлӓжӹ])',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'цилӓ',
 'namespacesall' => 'цилӓ',
-'monthsall'     => 'цилӓ',
+'monthsall' => 'цилӓ',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Список гӹц нӓлмӹ ӹлӹштӓшӹштӹш вашталтымашвлӓ',
 'watchlisttools-edit' => 'Анжалаш/списокым тӧрлӓш',
-'watchlisttools-raw'  => 'Текст семӹнь тӧрлӓш',
+'watchlisttools-raw' => 'Текст семӹнь тӧрлӓш',
 
 # Special:SpecialPages
 'specialpages' => 'Спецӹлӹштӓшвлӓ',
index c410805..58f4aa3 100644 (file)
@@ -198,7 +198,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sorokkan suntingan yang telah dironda daripada senarai perubahan terkini',
 'tog-newpageshidepatrolled' => 'Sorokkan laman yang telah dironda daripada senarai laman baru',
 'tog-extendwatchlist' => 'Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini',
-'tog-usenewrc' => 'Guna peningkatan perubahan terkini (perlukan JavaScript)',
+'tog-usenewrc' => 'Perubahan kumpulan mengikut laman dalam perubahan terkini dan senarai pantau (memerlukan JavaScript)',
 'tog-numberheadings' => 'Nomborkan tajuk secara automatik',
 'tog-showtoolbar' => 'Tunjukkan bar sunting (JavaScript)',
 'tog-editondblclick' => 'Klik ganda untuk sunting halaman (JavaScript)',
@@ -583,6 +583,10 @@ Pertanyaan: $2',
 'filereadonlyerror' => 'Fail "$1" tidak dapat diubah suai kerana repositori fail "$2" berada dalam ragam baca sahaja.
 
 Pentadbir yang menguncinya memberikan penjelasan yang berikut: "$3".',
+'invalidtitle-knownnamespace' => 'Tajuk tidak sah dengan ruang nama "$2" dan teks "$3"',
+'invalidtitle-unknownnamespace' => 'Tajuk tidak sah dengan nombor ruang nama tidak dikenali $1 dan teks "$2"',
+'exception-nologin' => 'Belum log masuk',
+'exception-nologin-text' => 'Halaman atau tindakan ini memerlukan anda untuk log masuk ke dalam wiki ini.',
 
 # Virus scanner
 'virus-badscanner' => "Konfigurasi rosak: pengimbas virus yang tidak diketahui: ''$1''",
@@ -858,7 +862,8 @@ Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
 'updated' => '(Dikemas kini)',
 'note' => "'''Catatan:'''",
 'previewnote' => "'''Ingatlah bahawa ini hanya pralihat.'''
-Perubahan anda belum disimpan! [[#editform|→ Terus menyunting]]",
+Perubahan anda belum disimpan!",
+'continue-editing' => 'Teruskan menyunting',
 'previewconflict' => 'Paparan ini merupakan teks di bahagian atas dalam kotak sunting teks. Teks ini akan disimpan sekiranya anda memilih berbuat demikian.',
 'session_fail_preview' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi. Sila cuba lagi. Jika masalah ini berlanjutan, [[Special:UserLogout|log keluar]] dahulu, kemudian log masuk sekali lagi.'''",
 'session_fail_preview_html' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi.'''
@@ -952,6 +957,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Gelung unstrip dikesan',
+'parser-unstrip-recursion-limit' => 'Had rekursi unstrip dilampaui ($1)',
 
 # "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.',
@@ -1096,7 +1107,7 @@ Mohon semak log.',
 # Suppression log
 'suppressionlog' => 'Log penahanan',
 'suppressionlogtext' => 'Berikut adalah daftar penghapusan dan sekatan yang melibatkan kandungan yang disembunyikan daripada pentadbir.
-Lihat [[Special:BlockList|senarai sekatan IP]] untuk senarai larangan dan sekatan semasa.',
+Lihat [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan sekatan semasa.',
 
 # History merging
 'mergehistory' => 'Gabungkan sejarah laman',
@@ -1131,7 +1142,8 @@ Sila pastikan bahawa perubahan ini akan mengekalkan kesinambungan sejarah laman.
 
 # Diffs
 'history-title' => 'Sejarah semakan bagi "$1"',
-'difference' => '(Perbezaan antara semakan)',
+'difference-title' => 'Perbezaan antara semakan-semakan "$1"',
+'difference-title-multipage' => 'Perbezaan antara laman "$1" dan "$2"',
 'difference-multipage' => '(Perbezaan antara laman)',
 'lineno' => 'Baris $1:',
 'compareselectedversions' => 'Bandingkan versi-versi yang dipilih',
@@ -1227,6 +1239,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 'prefs-beta' => 'Ciri-ciri beta',
 'prefs-datetime' => 'Tarikh dan waktu',
 'prefs-labs' => 'Ciri-ciri makmal',
+'prefs-user-pages' => 'Laman pengguna',
 'prefs-personal' => 'Profil',
 'prefs-rc' => 'Perubahan terkini',
 'prefs-watchlist' => 'Senarai pantau',
@@ -1490,7 +1503,7 @@ Tindakan ini tidak boleh dibatalkan.',
 'nchanges' => '$1 perubahan',
 'recentchanges' => 'Perubahan terkini',
 'recentchanges-legend' => 'Pilihan perubahan terkini',
-'recentchangestext' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada laman ini.',
+'recentchanges-summary' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada laman ini.',
 'recentchanges-feed-description' => 'Jejaki perubahan terkini dalam {{SITENAME}} pada suapan ini.',
 'recentchanges-label-newpage' => 'Suntingan ini mencipta laman baru',
 'recentchanges-label-minor' => 'Ini ialah suntingan kecil',
@@ -1690,14 +1703,15 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
 'backend-fail-writetemp' => 'Fail sementara tidak dapat ditulisi.',
 'backend-fail-closetemp' => 'Fail sementara tidak dapat ditutup.',
 'backend-fail-read' => 'Fail $1 tidak dapat dibaca.',
-'backend-fail-create' => 'Fail $1 tidak dapat diwujudkan.',
-'backend-fail-maxsize' => 'Fail $1 tidak boleh dibuat kerana melebihi $2 bait.',
+'backend-fail-create' => 'Fail $1 tidak dapat ditulis.',
+'backend-fail-maxsize' => 'Fail $1 tidak boleh ditulis kerana melebihi $2 bait.',
 'backend-fail-readonly' => 'Backend storan "$1" kini dalam mod baca sahaja. Sebab yang diberikan ialah: "$2"',
 'backend-fail-synced' => 'Fail "$1" berada dalam keadaan yang tidak sejajar dalam backend storan dalaman',
 'backend-fail-connect' => 'Tidak dapat bersambung dengan backend storan "$1".',
 'backend-fail-internal' => 'Berlakunya ralat yang tidak dikenali dalam backend storan "$1".',
 'backend-fail-contenttype' => 'Jenis kandungan fail untuk disimpan di "$1" tidak dapat ditentukan.',
 'backend-fail-batchsize' => 'Backend storan diberi $1 operasi fail dalam satu kelompok; hadnya ialah $2 operasi.',
+'backend-fail-usable' => 'Fail $1 tidak boleh ditulis kerana kebenaran tidak memadai atau tertinggal direktori/penyimpan.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Tidak dapat bersambung dengan pangkalan data jurnal untuk backend storan "$1".',
@@ -2014,6 +2028,7 @@ serta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:',
 'alllogstext' => 'Yang berikut ialah gabungan bagi semua log yang ada bagi {{SITENAME}}. Anda boleh menapis senarai ini dengan memilih jenis log, nama pengguna (peka huruf besar), atau nama laman yang terjejas (juga peka huruf besar).',
 'logempty' => 'Tiada item yang sepadan dalam log.',
 'log-title-wildcard' => 'Cari semua tajuk yang bermula dengan teks ini',
+'showhideselectedlogentries' => 'Tunjukkan/sorokkan entri-entri log yang terpilih',
 
 # Special:AllPages
 'allpages' => 'Semua laman',
@@ -2033,6 +2048,11 @@ serta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:',
 'allpages-bad-ns' => '{{SITENAME}} tidak mempunyai ruang nama "$1".',
 'allpages-hide-redirects' => 'Sorokkan lencongan',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Anda sedang melihat versi dalam cache laman ini yang mungkin selama $1.',
+'cachedspecial-viewing-cached-ts' => 'Anda sedang melihat versi dalam cache laman ini yang mungkin tidak lengkap sepenuhnya.',
+'cachedspecial-refresh-now' => 'Lihat yang terkini.',
+
 # Special:Categories
 'categories' => 'Kategori',
 'categoriespagetext' => '{{PLURAL:$1|Kategori|Kategori-kategori}} berikut mengandungi laman-laman atau media.
@@ -2479,7 +2499,7 @@ dirosakkan).',
 'badipaddress' => 'Alamat IP tidak sah',
 'blockipsuccesssub' => 'Sekatan berjaya',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] telah disekat.
-<br />Sila lihat [[Special:BlockList|senarai sekatan IP]] untuk maklumat lanjut.',
+<br />Sila lihat [[Special:BlockList|senarai sekatan]] untuk menyemak sekatan.',
 'ipb-blockingself' => 'Anda akan menyekat diri sendiri! Pastikah anda mahu berbuat demikian?',
 'ipb-confirmhideuser' => 'Anda akan menyekat seorang pengguna yang menghidupkan "sorokkan pengguna". Ini akan menindaskan nama pengguna itu di semua senarai dan entri log. Pastikah anda mahu berbuat demikian?',
 'ipb-edit-dropdown' => 'Sunting sebab sekatan',
@@ -2530,9 +2550,9 @@ dirosakkan).',
 Log sekatan disediakan di bawah sebagai rujukan:',
 'blocklogentry' => 'menyekat [[$1]] sehingga $2 $3',
 'reblock-logentry' => 'menukar tetapan sekatan [[$1]] yang tamat pada $2 $3',
-'blocklogtext' => 'Ini adalah log bagi sekatan dan penyahsekatan.
-Alamat IP yang disekat secara automatik tidak disenaraikan di sini.
-Sila lihat juga [[Special:BlockList|senarai sekatan IP]] yang sedang berkuatkuasa.',
+'blocklogtext' => 'Ini adalah log bagi tindakan menyekat dan menyahsekat pengguna.
+Alamat-alamat IP yang disekat secara automatik tidak disenaraikan di sini.
+Sila lihat juga [[Special:BlockList|senarai sekatan]] untuk senarai larangan dan sekatan yang sedang berkuatkuasa.',
 'unblocklogentry' => 'menyahsekat $1',
 'block-log-flags-anononly' => 'pengguna tanpa nama sahaja',
 'block-log-flags-nocreate' => 'pembukaan akaun dimatikan',
@@ -2863,7 +2883,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'tooltip-rollback' => 'Balikkan semua suntingan oleh penyumbang terakhir pada laman ini dengan satu klik.',
 'tooltip-undo' => 'Balikkan suntingan ini dan buka borang sunting dalam mod pralihat. Sebab boleh dinyatakan dalam ruangan ringkasan.',
 'tooltip-preferences-save' => 'Simpan keutamaan',
-'tooltip-summary' => 'Masukkan ringkasan pendek',
+'tooltip-summary' => 'Berikan ringkasan',
 
 # Stylesheets
 'common.css' => '/* CSS yang terletak di sini akan digunakan pada semua kulit */',
@@ -2899,6 +2919,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'spambot_username' => 'Pembersihan spam MediaWiki',
 'spam_reverting' => 'Membalikkan kepada versi terakhir yang tidak mengandungi pautan ke $1',
 'spam_blanking' => 'Mengosongkan semua semakan yang mengandungi pautan ke $1',
+'spam_deleting' => 'Menghapuskan semua semakan yang mengandungi pautan ke $1',
 
 # Info page
 'pageinfo-title' => 'Maklumat untuk "$1"',
@@ -3618,6 +3639,11 @@ Anda patut telah menerima [{{SERVER}}{{SCRIPTPATH}}/COPYING sebuah salinan bagi
 'version-software' => 'Perisian yang dipasang',
 'version-software-product' => 'Produk',
 'version-software-version' => 'Versi',
+'version-entrypoints' => 'URL titik permulaan',
+'version-entrypoints-header-entrypoint' => 'Titik permulaan',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Laluan rencana]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Laluan skrip]',
 
 # Special:FilePath
 'filepath' => 'Laluan fail',
@@ -3806,4 +3832,17 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'api-error-uploaddisabled' => 'Ciri muat naik dimatikan di wiki ini.',
 'api-error-verification-error' => 'Fail ini mungkin tercemar atau tersalah sambungannya.',
 
+# Durations
+'duration-seconds' => '$1 saat',
+'duration-minutes' => '$1 minit',
+'duration-hours' => '$1 jam',
+'duration-days' => '$1 hari',
+'duration-weeks' => '$1 minggu',
+'duration-years' => '$1 tahun',
+'duration-decades' => '$1 dekad',
+'duration-centuries' => '$1 abad',
+'duration-millennia' => '$1 alaf',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Selak-selak tidak dapat diperoleh di pelayan $1.',
 );
index 4a931db..8c479ca 100644 (file)
@@ -934,7 +934,8 @@ Ftakar li l-paġni .css u .js personalizzati għandhom l-ewwel ittra tat-titlu 
 'updated' => '(Aġġornata)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Ftakar li din hija biss dehra proviżorja.'''
-It-tibdiliet tiegħek għadhom ma ġewx salvati! [[#editform|→ Kompli immodifika]]",
+It-tibdiliet tiegħek għadhom ma ġewx salvati!",
+'continue-editing' => 'Kompli l-modifika',
 'previewconflict' => "Din il-previżjoni turi l-kliem li jinsab fiż-żona ta' modifika superjuri u turi kif tidher kieku l-paġna kella tiġi modifikata.",
 'session_fail_preview' => "'''Jiddispjaċina imma l-modifika tiegħek ma setgħetx tiġi pproċessata minħabba li ntilfet l-informazzjoni tas-sessjoni.
 Jekk jogħġbok, erġa' pprova. Jekk xorta tibqa' ma taħdimx, ipprova [[Special:UserLogout|oħroġ]] u erġa' idħol.'''",
@@ -1201,7 +1202,7 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 
 # Diffs
 'history-title' => 'Kronoloġija tal-modifiki ta\' "$1"',
-'difference' => '(Differenzi bejn ir-reviżjonijiet)',
+'difference-title' => 'Differenza bejn ir-reviżjonijiet ta\' "$1"',
 'difference-multipage' => '(Differenzi bejn il-paġni)',
 'lineno' => 'Linja $1:',
 'compareselectedversions' => 'Qabbel il-verżjonijiet magħżula',
@@ -1557,7 +1558,7 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 'nchanges' => '{{PLURAL:$1|modifika $1 |$1 modifiki}}',
 'recentchanges' => 'Tibdil riċenti',
 'recentchanges-legend' => 'Opzjonijiet tat-tibdil riċenti',
-'recentchangestext' => 'Din il-paġna turi l-modifiki l-aktar riċenti għal kontenut tas-sit.',
+'recentchanges-summary' => 'Din il-paġna turi l-modifiki l-aktar riċenti għal kontenut tas-sit.',
 'recentchanges-feed-description' => "Dan il-feed jirraporta l-modifiki l-aktar riċenti fil-kontenut ta' dan is-sit.",
 'recentchanges-label-newpage' => 'Din il-modifika ħolqot paġna ġdida',
 'recentchanges-label-minor' => 'Din hi modifika minuri',
@@ -2393,7 +2394,7 @@ $1',
 'namespace' => 'Spazju tal-isem:',
 'invert' => 'Inverti l-għażla',
 'tooltip-invert' => 'Agħżel din il-kaxxa biex taħbi l-modifiki lejn paġni li jinsabu fl-ispazji tal-isem magħżula (u l-ispazju tal-isem assoċjat jekk hu magħżul)',
-'namespace_association' => 'Spazju tal-isem assoċjata',
+'namespace_association' => 'Spazju tal-isem assoċjat',
 'tooltip-namespace_association' => "Agħżel din il-kaxxa sabiex tinkludi l-paġna ta' diskussjoni jew l-oġġett tal-ispazju tal-isem assoċjat mal-ispazju tal-isem magħżul",
 'blanknamespace' => '(Prinċipali)',
 
@@ -3702,6 +3703,7 @@ Stampi huwa mogħrija b'risoluzzjoni sħiħa, tipi tal-fajl oħrajn jibdew bil-p
 'sqlite-no-fts' => "$1 mingħajr il-possibilità ta' tfittxija kompluta fit-test",
 
 # New logging system
+'logentry-delete-delete' => '$1 ħassar il-paġna $3',
 'revdelete-restricted' => "limiti applikati 'l amministraturi",
 'revdelete-unrestricted' => "neħħi l-limiti 'l amministraturi",
 'logentry-move-move' => '$1 mexxa l-paġna $3 għal $4',
index 990892b..8047db0 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',
@@ -538,7 +539,6 @@ Legenda: (atu) = defrénças de la berson atual,
 
 # Diffs
 'history-title' => 'Stórico de eidiçones de "$1"',
-'difference' => '(Defréncias antre rebisones)',
 'lineno' => 'Lhinha $1:',
 'compareselectedversions' => 'Cumparar las bersones marcadas',
 'showhideselectedversions' => 'Amostrar/ocultar bersones selecionadas',
index 07dd16a..1459d46 100644 (file)
@@ -643,7 +643,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 
 # Diffs
 'history-title' => '"$1" ၏ တည်းဖြတ်မူ ရာဇဝင်များ',
-'difference' => 'တည်းဖြတ်မူများ အကြား ကွဲပြားမှုများ',
 'difference-multipage' => '(စာမျက်နှာများကြားမှ ကွဲပြားချက်များ)',
 'lineno' => 'စာကြောင်း $1 -',
 'compareselectedversions' => 'ရွေးချယ်ထားသော မူများကို နှိုင်းယှဉ်ရန်',
@@ -939,7 +938,7 @@ Your e-mail address is not revealed when other users contact you.
 'nchanges' => 'ပြောင်းလဲချက် $1 {{PLURAL:$1|ခု|ခု}}',
 'recentchanges' => 'လတ်​တ​လောအ​ပြောင်း​အ​လဲ​',
 'recentchanges-legend' => 'လတ်တလောအပြောင်းအလဲများအတွက် ရွေးချယ်စရာများ',
-'recentchangestext' => 'ဤစာမျက်နှာတွင် ဝီကီ၏ လတ်တလောပြောင်းလဲမှုများကို နောက်ကြောင်းခံလိုက်ရန်',
+'recentchanges-summary' => 'ဤစာမျက်နှာတွင် ဝီကီ၏ လတ်တလောပြောင်းလဲမှုများကို နောက်ကြောင်းခံလိုက်ရန်',
 'recentchanges-feed-description' => 'ဤ feed ထဲတွင် ဝီကီ၏ လတ်တလောပြောင်းလဲမှုများကို နောက်ကြောင်းခံလိုက်ရန်',
 'recentchanges-label-newpage' => 'ဤတည်းဖြတ်မှုသည် စာမျက်နှာအသစ်ကို ဖန်တီးခဲ့သည်။',
 'recentchanges-label-minor' => 'အရေးမကြီးသော ​ပြင်​ဆင်​မှု ​ဖြစ်​သည်​',
index 8f4e6a0..ff028d5 100644 (file)
@@ -690,7 +690,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 {{FULLPAGENAME}}|action=edit}} витнемс-петнемс те лопанть]</span>.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
-'previewnote' => "'''Те - ансяк васнянь невтевкс; полавтоматне зярс апак вансто!'''",
+'previewnote' => "'''Кирдть мельсэ, Те ансяк васнянь невтевкс.'''
+Полавтоматне зярс апак вансто!",
 'editing' => 'Витнят-петнят $1',
 'editingsection' => 'Витнеме-петнеме $1 (секциянть)',
 'editingcomment' => 'Витнят-петнят $1 (од явкс)',
@@ -812,7 +813,6 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 
 # Diffs
 'history-title' => 'Историясь ламо вановксонть "$1"',
-'difference' => '(Явовкс ванокснень юткова)',
 'lineno' => 'Киксэсь $1:',
 'compareselectedversions' => 'Кочказь версиятнень аравтомс карадо-каршо',
 'editundo' => 'Велявтомс мекев мезе витнинь-петнинь',
@@ -896,7 +896,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'prefs-personal' => 'Теицядо',
 'prefs-rc' => 'Чиень полавтнемат',
 'prefs-watchlist' => 'Ванома лемрисьме',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Весемеде куватьс $1 {{PLURAL:$1|чис|чис}}',
 'prefs-watchlist-edits-max' => 'Весемеде покш цётось: 1000',
 'prefs-misc' => 'Минеть-сюнот',
 'prefs-resetpass' => 'Салава валонь полавтома',
@@ -1011,7 +1011,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'right-mergehistory' => 'Вейтьсэндямс лопатнень юрост-путовксост',
 'right-userrights' => 'Витнемс-петнемс совицянь весе видечитнень',
 'right-siteadmin' => 'Датабазань сёлгомо ды панжомо',
-'right-passwordreset' => 'Ð\9bиÑ\8fлгавÑ\82омÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81овамо Ð²Ð°Ð» ([[Special:PasswordReset|баÑ\88ка Ð»Ð¾Ð¿Ð°]])',
+'right-passwordreset' => 'Ð\92аномÑ\81 Ñ\82еиÑ\86Ñ\8fнÑ\8c Ñ\81алава Ð²Ð°Ð»Ð¾Ð½Ñ\8c Ð¿Ð¾Ð»Ð°Ð²Ñ\82ома Ðµ-Ñ\81Ñ\91Ñ\80маÑ\82',
 
 # User rights log
 'rightslog' => 'Уськетеицянть видечинть кемекстома',
@@ -1036,15 +1036,20 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'action-deleterevision' => 'нардамс те лиякстомтоманть',
 'action-browsearchive' => 'вешнемс нардань лопатнестэ',
 'action-undelete' => 'вельмевтемс мекев те лопанть',
+'action-suppressionlog' => 'ваномс те теицянть тевнеде сёрмадовкс',
+'action-block' => 'кардамс те совицянть витнемадо-петнемадо',
 'action-import' => 'совавтомс те лопанть лия Викистэ',
 'action-importupload' => 'совавтомс те лопанть файлань йовкстамо юртсто',
 'action-mergehistory' => 'вейтьсэндямс те лопанть юронзо-путовксонзо',
+'action-userrights' => 'витнемс-петнемс совицянь весе видечитнень',
+'action-userrights-interwiki' => 'витнемс-петнемс лия викитнесэ теицянь видечитнень',
+'action-sendemail' => 'кучомс е-сёрмат',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|полавтнема|полавтнемат}}',
 'recentchanges' => 'Чыяконь полавтнемат-лиякстомтомат',
 'recentchanges-legend' => 'Улконь полавтнематнень аравтнемаст',
-'recentchangestext' => '',
+'recentchanges-summary' => '',
 'recentchanges-feed-description' => 'Мельга ваннынк кода ульнесть витьнемат-петнемат wiki-сэ те максовксонть.',
 'recentchanges-label-newpage' => 'Те витнемась-петнемась од лопа тейсь',
 'recentchanges-label-minor' => 'Те а покшкэ витнемась-петнемась',
@@ -1088,6 +1093,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'uploadnologin' => 'Эзить сова',
 'uploaderror' => 'Йовкстамсто манявома',
 'upload-permitted' => 'Файлань форматт, конат меревить: $1.',
+'upload-preferred' => 'Файлань типт, конатне паро мельсэ учовить: $1.',
+'upload-prohibited' => 'Файлань типт, конатне кардазь: $1.',
 'uploadlog' => 'Файлань йовкстамодо журнал',
 'uploadlogpage' => 'Файлань йовкстамодо журнал',
 'filename' => 'Файлань лем',
@@ -1123,12 +1130,23 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'upload-options' => 'Йовкстамонь параметрат',
 'watchthisupload' => 'Ваномс те лопанть мельга',
 'upload-success-subj' => 'Совавтовсь кода эряви',
+'upload-failure-subj' => 'Ёвкстамосо стакачи',
+'upload-warning-subj' => 'Ёвкстамодо кардамонь пачтямо',
 
 'upload-proto-error' => 'Аволь истямо протокол',
 'upload-file-error' => 'Потмонь ильведькс',
 'upload-misc-error' => 'Файлань ёвкстамонь апак содань ильведевкс',
 'upload-too-many-redirects' => 'URL адрессэнть пек ламо печтевтемат',
 'upload-unknown-size' => 'Апак содань покшолмазо',
+'upload-http-error' => 'Лиссь HTTP ильведевкс: $1',
+
+# File backend
+'backend-fail-backup' => '$1 файланть эйстэ тееве ванстовкс копия',
+'backend-fail-delete' => '"$1" файлась эзь нардаво.',
+'backend-fail-store' => '$1 файлась эзь ванстово $2 янонтень.',
+'backend-fail-move' => '$1 файлась эзь печтевтеве $2 файлакс.',
+'backend-fail-read' => '"$1" файлась эзь ловново.',
+'backend-fail-create' => '"$1" файлась эзь шкаво.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Совамось кардазь',
@@ -1239,7 +1257,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'statistics-users-active' => 'Чистэ лисийть-совийть',
 'statistics-mostpopular' => 'Весемеде сеедьстэ ванозь лопат',
 
-'disambiguations' => 'Лопат, конат сёрмадстовтовить ламосмустев терминтт',
+'disambiguations' => 'Лопат, конатне сюлмазь чарькодевтемань ламо терминэнь лопас',
 'disambiguationspage' => 'Template:смустень коряс явома',
 
 'doubleredirects' => 'Кавксть ютавтозь',
@@ -1312,8 +1330,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'booksources-go' => 'Адя',
 
 # Special:Log
-'specialloguserlabel' => 'Теицясь:',
-'speciallogtitlelabel' => 'Ð\9aонÑ\8fкÑ\81озо:',
+'specialloguserlabel' => 'ТопавÑ\82Ñ\8bцясь:',
+'speciallogtitlelabel' => 'Ð\9dоÑ\80авомаÑ\82аÑ\80ка (конÑ\8fкÑ\81озо Ñ\8dли Ñ\82еиÑ\86Ñ\8fзо):',
 'log' => 'Совамо-лисема тевть (регистрациясь)',
 'all-logs-page' => 'Весемень туртов весе совамодо-кемекстамодо журналт',
 'logempty' => 'Сови-лиси журналсто а муевить тень марто вейкеть тевть',
@@ -1346,7 +1364,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'sp-deletedcontributions-contribs' => 'путовксонзо',
 
 # Special:LinkSearch
-'linksearch' => 'Ушонь сюлмавомапенеть',
+'linksearch' => 'Ушо ёндонь сюлмавомапенень вешнема',
 'linksearch-pat' => 'Вешнемкс парцун:',
 'linksearch-ns' => 'Лем потмозо:',
 'linksearch-ok' => 'Вешнэмс',
@@ -1378,8 +1396,10 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'mailnologin' => 'Кучомс сёрма парго арась',
 'emailuser' => 'Кучомс е-сёрма те теицянтень',
 'emailpage' => 'Кучт э-сёрма теицянтень',
-'defemailsubject' => '{{SITENAME}} е-сёрма',
+'defemailsubject' => '{{SITENAME}} е-сёрма "$1"-нь пельде',
+'usermaildisabled' => 'Теицянь е-сёрмась пекстазь',
 'noemailtitle' => 'Е-сёрма парго арась',
+'emailusername' => 'Теицянь леметь:',
 'emailusernamesubmit' => 'Максомс',
 'emailfrom' => 'Кинь пельде:',
 'emailto' => 'Кинень:',
@@ -1394,6 +1414,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'watchlist' => 'Мезе мельга мон ванстнян',
 'mywatchlist' => 'Мезе мельга мон ванстнян',
 'watchlistfor2' => '$1-нь туртов $2',
+'nowatchlist' => 'Ванома керьксэзэть мезеяк апак путо.',
 'watchnologin' => 'Апак сова',
 'addedwatchtext' => 'Лопась «[[:$1]]» совавтозь [[Special:Watchlist|ванома потмозот]].
 Седе тов те лопасонть ды мартонзо сюлмавозь кортнема лопасонть теезь витьнематне тешкставтовить те потмонтень, истяжо кармить кикстазь те лопасонть[[Special:RecentChanges|потмо од витнематне]], истя седе шождасто сынь неявить.',
@@ -1517,6 +1538,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 # Namespace form on various pages
 'namespace' => 'Лем потмозо:',
 'invert' => 'Кочказень таркас апаконь кочкамо',
+'namespace_association' => 'Мартонзо сюлмазь лемпотмо',
 'blanknamespace' => '(Прявкс)',
 
 # Contributions
@@ -1572,6 +1594,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 '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' => 'Лия/поладкс тувтал:',
+'ipb-confirm' => 'Кемекстамс саймес саеманть',
 'badipaddress' => 'Амаштовикс IP адрес',
 'blockipsuccesssub' => 'Саймес озавтовсь',
 'ipb-edit-dropdown' => 'Витнемс-петнемс саймес озавтомань тувталтнэнь',
@@ -1580,6 +1603,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'ipb-blocklist-contribs' => '$1 лопас путовкст',
 'unblockip' => 'Нолдамс теицянть сайместэ',
 'ipusubmit' => 'Нардамс те саймас аравтоманть',
+'blocklist' => 'Саймес саень теицят',
 'ipblocklist' => 'Саймес саень теицят',
 'ipblocklist-legend' => 'Вешнемс саймас саезь теиця',
 'blocklist-target' => 'Норовамо тарка',
@@ -1655,7 +1679,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'revertmove' => 'велявтодо',
 'delete_and_move' => 'Нардык ды печтевтик',
 'delete_and_move_confirm' => 'Нардыка те лопанть',
-'delete_and_move_reason' => 'Печтевтемга нардазь',
+'delete_and_move_reason' => '«[[$1]]» нардазель од таркань теемга',
 'immobile-source-namespace' => '"$1" лемпотмосонть лопатне а печтевтевить',
 'immobile-target-namespace' => '"$1" лемпотмонтень лопатне а печтевтевить',
 'immobile-source-page' => 'Те лопась одокс а лемдеви.',
@@ -1922,8 +1946,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-orientation-1' => 'Свалшкань',
 'exif-orientation-3' => 'Велявтомс 180°',
 'exif-orientation-5' => 'Чаравтозь 90° чинь каршо, мейле велявтозь прянзо лангс',
-'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и Ð¼ÐµÐ»Ñ\8cга',
-'exif-orientation-8' => 'Чаравтозь 90° чинь каршо',
+'exif-orientation-6' => 'ЧаÑ\80авÑ\82озÑ\8c 90° Ñ\87и ÐºÐ°Ñ\80Ñ\88о',
+'exif-orientation-8' => 'Чаравтозь 90° чи мельга',
 
 'exif-componentsconfiguration-0' => 'арась',
 
@@ -2169,4 +2193,13 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 # New logging system
 'newuserlog-byemail' => 'салава валот кучозь е-сёрмасо',
 
+# Feedback
+'feedback-subject' => 'Мезде:',
+'feedback-message' => 'Пачтямнэсь:',
+'feedback-cancel' => 'А теемс',
+'feedback-close' => 'Анок',
+
+# API errors
+'api-error-unknownerror' => 'Апак содань ильведевкс: «$1».',
+
 );
index b798ebc..bab6db7 100644 (file)
@@ -10,6 +10,7 @@
  * @author Ali1986
  * @author Ebraminio
  * @author Firuz
+ * @author Mehdi
  * @author Mjbmr
  * @author Parthava (on mzn.wikipedia.org)
  * @author Spacebirdy
@@ -73,7 +74,7 @@ $namespaceAliases = array(
 );
 
 $magicWords = array(
-       'redirect'                => array( '0', '#بور', '#تغییرمسیر', '#REDIRECT' ),
+       'redirect'                => array( '0', '#بور', '#تغییرمسیر', '#تغییر_مسیر', '#REDIRECT' ),
        'notoc'                   => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
        'nogallery'               => array( '0', '__بی‌نگارخنه__', '__بی‌نگارخانه__', '__NOGALLERY__' ),
        'forcetoc'                => array( '0', '__بافهرست__', '__FORCETOC__' ),
@@ -243,7 +244,10 @@ $messages = array(
 'category-empty' => 'ای رج ره ده‌له ئه‌سا هیچی دأنیه',
 'hidden-categories' => '{{PLURAL:$1|خف رج|خف رجون}}',
 'hidden-category-category' => 'خف رجون',
+'category-subcat-count' => '{{PLURAL:$2|اینتا رج همینتا زیر رج ره داینه.|{{PLURAL:$1|اینتا زیررج|اینتا $1 زیررج}} اینتا رج ره {{PLURAL:$1|داینه|دایننه}}؛ اینتا رج در کل حاوی $2 زیررج هسه.}}',
+'category-subcat-count-limited' => 'اینتا رج {{PLURAL:$1|اتا زیر رج|$1 زبررج}} ره شامل بونه.',
 'category-article-count' => '{{PLURAL:$2|این رج همینتا صفحه ره دانّه.|ای  {{PLURAL:$1صفحه|صفحه|$1 ئون}}، $2 جه اینجه دَرنه.}}',
+'category-article-count-limited' => '{{PLURAL:$1|صفحهٔ|$1 صفحهٔ}} که این بن درنه اینتا رج دله قرار هایتنه.',
 'listingcontinuesabbrev' => '(دمباله)',
 'index-category' => 'صفحه‌ئون نمایه بَیی',
 'noindex-category' => 'صفحه‌ئون نمایه نَیی',
@@ -272,7 +276,7 @@ $messages = array(
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'اÛ\8cضاÙ\81Ù\87 Ù\87کردÙ\86 Ø¹Ù\88Ù\86Ù\88ان',
+'vector-action-addsection' => 'ترÙ\86Ù\87 Ú¯Ù¾ Ø¨Ø²Ù\88ئن',
 'vector-action-delete' => 'پاک هاکردن',
 'vector-action-move' => 'دکش هاکردن',
 'vector-action-protect' => 'زلفن بزوئن',
@@ -359,7 +363,7 @@ $2، $1',
 'edithelp' => 'دچی‌ین رانما',
 'edithelppage' => 'Help:دَچی‌ین',
 'helppage' => 'Help:راهنما',
-'mainpage' => 'گت ولگ',
+'mainpage' => 'گت صفحه',
 'mainpage-description' => 'گت صفحه',
 'policy-url' => 'Project:سیاستون',
 'portal' => 'کارورون ِلوش',
@@ -448,7 +452,7 @@ $2، $1',
 'readonly' => 'پایگاه داده زلفن بزه‎بیّه',
 'enterlockreason' => 'دلیلی زلفین بزوئن وسّه بارین، که حاوی تقریبی از زمونی بائه که زلفین بَیته وانه',
 'missingarticle-rev' => '(نسخهٔ شماره: $1)',
-'missingarticle-diff' => '(فرق و فـَسِل: $1، $2)',
+'missingarticle-diff' => '(فرق: $1، $2)',
 'readonly_lag' => 'پایگاه داده به طور خودکار زلفین بزه‌بیّه تا پشتیبون ِنسخه‌ئون با اصلی نسخه هماهنگ بواشِن',
 'internalerror' => 'خطای دله‌یی',
 'internalerror_info' => 'خطای دله‌یی: $1',
@@ -493,7 +497,7 @@ $2، $1',
 'userloginnocreate' => 'دله بموئن',
 'logout' => 'دربوردن',
 'userlogout' => 'دربوردن',
-'notloggedin' => 'سیستم ره دله نی یه موئین',
+'notloggedin' => 'سیستم ره دله نیه مونی',
 'nologin' => 'عضو نی؟ $1.',
 'nologinlink' => 'عضو بواشین',
 'createaccount' => 'ترنه حساب وا هکاردن',
@@ -537,7 +541,7 @@ $2، $1',
 # Edit pages
 'summary' => 'گوزارش کار:',
 'subject' => 'موضوع یا عنوان:',
-'minoredit' => 'اینتا اتّا پـچیک دچی‌یه هسته',
+'minoredit' => 'اینتا ویرایش خله جزئی بیه',
 'watchthis' => 'این صفحه ره دمبال هـاکاردن',
 'savearticle' => 'جادکتن ِصفحه',
 'preview' => 'پیش نمایش',
@@ -563,8 +567,9 @@ $2، $1',
 آخرین مورد سیاهه قطع دسترسی زیر بموئه:',
 'previewnote' => 'شِمه یاد بوئه که اینتا اتا پیش‌نمایِش هسه. 
  شِمه دگاردسته‌ئون جانـَکِته که و‌نه، ونه اِسا ذخیره‌بیّـِن دوکمه ره بَزنین!',
-'editing' => 'دچی‌ین => $1',
+'editing' => 'درحال  $1 ره دچی‌ین',
 'editingsection' => 'دچی‌ین $1 (تیکه)',
+'editingcomment' => '$1 دچی‌ین(نو تیکه)',
 'yourtext' => 'شمه بنویشته',
 'copyrightwarning' => 'خـاهش بونه شمه یاد دواشه که همه چیزایی که {{SITENAME}} دله وانه، تحت $2 حیساب وونه. (ویشتر بخوندستن وسه $1 ره هارشین)<br />
 اگه نخانّی شمه بنویشته‌ئون اینجه دس بزه یا ات نفر دیگه شمه بنویشته ره کوپی نکانه، اصلأ شه بنویشته ره اینجه نی‌یلین.',
@@ -595,8 +600,13 @@ $2، $1',
 
 # Revision deletion
 'rev-delundel' => 'نشون هدائن/فرو بوردن',
+'revdelete-text' => "'''نسخه‌ئون و حذف بئی موارد ره بشنه سیاهه جا و صفحه تاریخچه دله بدین، ولی اتی قسمت از وشونه محتواره بقیه کارورون نتوننه بوینن.'''
+{{SITENAME}} بقیه مدیرون بتوننه اینتا پنهون بئیه محتوا ره هارشن و وشونه حذف بئیون ره احیاء هاکنن، مگر اینکه اتی سری محدودیت ونه رو اعمال بئی باشه.",
 'revdel-restore' => 'دیاری تغییر هدائن',
 
+# History merging
+'mergehistory' => 'صفحه‌ئون تاریخچه ره اتا هاکردن',
+
 # Merge log
 'revertmerge' => 'سِوا هاکردن',
 
@@ -642,7 +652,7 @@ $2، $1',
 'prefs-help-email-required' => 'ایمیل نشونی لازم هسه.',
 
 # User rights
-'userrights-user-editname' => 'کارور نوم ره بنویش هاکنین',
+'userrights-user-editname' => 'اتا کاروری نوم وارد هاکنین:',
 
 # Groups
 'group-sysop' => 'مدیرون',
@@ -666,6 +676,11 @@ $2، $1',
 
 # Recent changes
 'recentchanges' => 'تازه دگاردسته‌ئون',
+'recentchanges-legend' => 'تازه دگاردسته‌ئون گوزینه‌ها',
+'recentchanges-summary' => 'ویکی تازه دگاردسته‌ئون ره اینتا صفحه دله دمبال هاکنین.',
+'recentchanges-label-newpage' => 'اینتا ویرایش اته نو صفحه ایجاد هاکرده',
+'recentchanges-label-minor' => 'اینتا ویرایش خله جزئی بیه',
+'recentchanges-label-bot' => 'اینتا ویرایش‌ره اته ربات انجام هدائه',
 'rcnote' => "اینجه {{PLURAL:$1|دگاردسته‌یی|'''$1''' دگاردسته‌ئونی}} که $4، $5 جه، '''$2''' روز پیش‌تر دچی‎یه بینه ره اشنّی",
 'rclistfrom' => 'نِمایش تازه‌دگاردسته‌ئون با شروع از $1',
 'rcshowhideminor' => 'پچیک دچی‌یه‌ئون $1',
@@ -673,15 +688,16 @@ $2، $1',
 'rcshowhideliu' => 'ثبت‌نوم هاکرده کارورون $1',
 'rcshowhideanons' => 'ناشناس ِکارورون $1',
 'rcshowhidepatr' => 'گشت‌بخارد ِدچی‌یه‌ئون $1',
-'rcshowhidemine' => 'Ù\85Ù\86Ù\87 Ø¯Ú\86Û\8câ\80\8cÛ\8cÙ\87â\80\8cئÙ\88Ù\86 $1',
+'rcshowhidemine' => 'مه دچی‌یه‌ئون $1',
 'rclinks' => 'نـِشون هـِدائن  $1 پایانی دَچی‌‌یه‌ئون، $2 اِسـا روز ره دلـه؛ $3',
-'diff' => 'فرق و فـَسِل',
+'diff' => 'فرق',
 'hist' => 'تاریخچه',
-'hide' => 'Ù\81Ù\80Ù\90رÙ\88 Ø¨Ù\88ردن',
+'hide' => 'Ù¾Ù\86Ù\87Ù\88Ù\86 Ù\87اکن',
 'show' => 'نـِشـون هـاده',
-'minoreditletter' => 'Ø®Ù\88رد',
+'minoreditletter' => 'جز',
 'newpageletter' => 'نو',
 'boteditletter' => 'ربات',
+'newsectionsummary' => '/* $1 */ نو تیکه',
 
 # Recent changes linked
 'recentchangeslinked' => 'واری دأچیـه‌ن‌ئون',
@@ -780,6 +796,8 @@ $2، $1',
 'watchlist' => 'مه دمبال‌هاکرده‌‌ئون ِلیست',
 'mywatchlist' => 'مه دمبال‌هاکرده‌‌ئون ِلیست',
 'watchnologin' => 'سیستم ره دله نی ئه موئین',
+'addedwatchtext' => "«[[:$1]]» شمه [[Special:Watchlist|دمبال هاکردئون لیست]] دله اضافه بیه.
+اینتا صفحه دگاردسته‌ئون و ونه گپ آینده دله اینتا لیست دله شمه وسه فهرست بوننه؛ یان شه بماند، اینتا صفحه، [[Special:RecentChanges|تازه دگاردسته‌ئون]] فهرست دله شمه وسه '''پررنگ‌تر''' نمایش هدا بونه تا وره راحت تر بوینین.",
 'watch' => 'دمبال هاکردن',
 'watchthispage' => 'این صفحه ره دِمبال هاکارد‌ن',
 'unwatch' => 'ده‌مـبـال نـه‌کـارده‌ن',
@@ -789,6 +807,7 @@ $2، $1',
 'wlheader-enotif' => '*تونی ایمیل جه مطلع بواشین.',
 'wlheader-showupdated' => "*صفحه‌ئونی که بعد از آخرین سربزوئنتون عوض بینه '''پر رنگ''' نشون هدائه بیّه.",
 'wlnote' => "ایجه {{PLURAL:$1|پایانی دأچیه‌ن|پایانی '''$1''' دأچیه‌ن‌ئونی}} هأسه که ای $2 ساعت ده‌له دأکه‌ته.",
+'watchlist-options' => 'دمبال هاکردن گوزینه‌ها',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ده‌مـبـال هـه‌کـارده‌ن...',
@@ -803,6 +822,9 @@ $2، $1',
 
 # Delete
 'deletepage' => 'صفحه پاک هاکردن',
+'excontent' => 'صفحه محتوا وِ بیه: «$1»',
+'excontentauthor' => 'صفحه محتوا وِ بیه: «$1» (فقط «[[Special:Contributions/$2|$2]]» وِنه کایر بیه)',
+'exbeforeblank' => 'قبل اینکه صفحه محتوا خالی بوه ونه محتوا وِ بیه: «$1»',
 'dellogpage' => 'وه ره بییته‌ئون گوزارش',
 
 # Rollback
@@ -813,6 +835,13 @@ $2، $1',
 'revertpage-nouser' => '"چیزونی که (ونـه کـاروری نـوم پـاک بَیّه) دچی‌یه دگـاردسته بیّه همونتایی که [[User:$1|$1]] آخرسری دچی‌ین دلـه هاکرده"',
 'rollback-success' => 'چیزونی که $1 دچی‌ین دگاردسته بیّه همونتایی که $2 آخرسری دچی‌ین دلـه هاکرده',
 
+# Protect
+'protectedarticle' => '«[[$1]]» ره محافظت هاکرده',
+'modifiedarticleprotection' => '«[[$1]]» محافظت تنظیمات ره تغییر هدائه',
+'movedarticleprotection' => '«[[$2]]» محافظت تنظیمات ره «[[$1]]» رو منتقل هاکرده',
+'protect-expiry-indefinite' => 'بی‌پایون',
+'protect-cantedit' => 'شما نتوننی اینتا صفحه محافظت وضعیت ره تغییر هادین، شما اجازه این کار ره ندایننی.',
+
 # Restrictions (nouns)
 'restriction-edit' => 'دچی‌ین',
 'restriction-upload' => 'باربی‌یشتن',
@@ -822,6 +851,7 @@ $2، $1',
 
 # Namespace form on various pages
 'namespace' => 'نوم‌جا:',
+'invert' => 'برعکس انتخاب هاکن',
 'blanknamespace' => '(مـار)',
 
 # Contributions
@@ -851,6 +881,7 @@ $2، $1',
 'blockip-legend' => 'کارور ره دَوستن',
 'ipbsubmit' => 'ای کارور دأبه‌س بأوه',
 'ipblocklist' => 'IP نـه‌شـونـی‌ئون ئو کـارورنـوم‌ئونی کـه دأبـه‌سـتـوونـه',
+'infiniteblock' => 'بی‌پایون',
 'blocklink' => 'دَوستن',
 'unblocklink' => 'وا هـه‌کـارده‌ن',
 'change-blocklink' => 'قطع دسترسی تغییر هدائن',
@@ -878,7 +909,7 @@ $2، $1',
 'allmessages-filter-all' => 'همه',
 
 # Thumbnails
-'thumbnail-more' => 'گت بأوه',
+'thumbnail-more' => 'گت بوو',
 
 # Special:Import
 'import-interwiki-submit' => 'بیاردن',
@@ -891,7 +922,7 @@ $2، $1',
 'tooltip-pt-mycontris' => 'مه کایری‌ئون لیست',
 'tooltip-pt-login' => 'شه‌ما به‌ته‌ر هـأسـه که سـیـسـتـه‌م ده‌لـه بـیـه‌ئی، هـرچـأن زوری نـیـه',
 'tooltip-pt-logout' => 'سیستم جه دأیابـوری',
-'tooltip-ca-talk' => 'صÙ\81Ø­Ù\87 Ø¯Ø±Ø¨Ø§Ø±Ù\87 گپ بَزوئن',
+'tooltip-ca-talk' => 'اÛ\8cÙ\86 ØµÙ\81Ø­Ù\87 Ø®Ù\8eÙ\88رÛ\8c گپ بَزوئن',
 'tooltip-ca-edit' => 'شِما بتوندی این صفحه ره دَچینی.',
 'tooltip-ca-addsection' => 'أتـا نـه گـب را دأکـه‌تـه‌ن',
 'tooltip-ca-viewsource' => 'این صفحه ره نتوندی دَچینی.
@@ -995,6 +1026,7 @@ $5
 # Auto-summaries
 'autosumm-blank' => 'صفحه ره اسپه هاکرده',
 'autosumm-replace' => "صفحه ره اینتا جه عوض هاکرد: '$1'",
+'autoredircomment' => 'به [[$1]] مسیر ره تغییر هدائه',
 
 # Special:Version
 'version-specialpages' => 'شا صفحه‌ئون',
@@ -1004,6 +1036,7 @@ $5
 'specialpages-group-maintenance' => 'چله‌بندی صفحه‌ئون',
 
 # New logging system
+'logentry-move-move_redir-noredirect' => '$1 ، $3 ره بدون اینکه مسیر تغییری درس بوه به $4 که مسیر تغییر بیه منتقل هاکرده',
 'logentry-newusers-newusers' => '$1  بساتن اتا حساب کاروری',
 'logentry-newusers-create' => '$1  بساتن اتا حساب کاروری',
 
index 37fa51c..86ed4e1 100644 (file)
@@ -36,6 +36,9 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Neneuhcāyōtl_tēixnāmiquiliztli',
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $namespaceAliases = array(
        'Media'         => NS_MEDIA,
        'Especial'      => NS_SPECIAL,
@@ -586,7 +589,6 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 
 # Diffs
 'history-title' => '"$1" ītlachiyaliz tlahcuilōlloh',
-'difference' => '(Ahneneuhquiliztli tlapatlaliznepantlah)',
 'lineno' => 'Pāntli $1:',
 'editundo' => 'Tichuelōz',
 'diff-multi' => '({{PLURAL:$1|Cē tlapatlaliztli nepantlah ahmo motta in ōquichīuh|$1 Tlapatlaliztli nepantlah ahmo mottah in ōquinchīuh}}  {{PLURAL:$2|cē tlatequitiltilīlli|$2 tlatequitiltilīltin}})',
@@ -764,7 +766,7 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 'nchanges' => '$1 {{PLURAL:$1|tlapatlaliztli|tlapatlaliztli}}',
 'recentchanges' => 'Yancuīc tlapatlaliztli',
 'recentchanges-legend' => 'Yancuīc tlapatlaliztechcopa tlanequiliztli',
-'recentchangestext' => 'Ìpan inìn tlaìxtlapalli xikỉta in okảchi yankuik ìtlatlaìxpảtilis in wiki.',
+'recentchanges-summary' => 'Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.',
 'rcnote' => "Nicān {{PLURAL:$1|cah '''1''' tlapatlaliaztli|cateh in xōcoyōc '''$1''' tlapatlaliztli}} īpan xōcoyōc {{PLURAL:$2|tōnalli|'''$2''' tōnaltin}} īhuīcpa $5, $4.",
 'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
 'rcshowhideminor' => '$1 tlapatlalitzintli',
index f4377de..2f002b9 100644 (file)
@@ -25,19 +25,16 @@ $dateFormats = array(
 $messages = array(
 # User preference toggles
 '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-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)',
+'tog-extendwatchlist' => 'Khok-chhiong kàm-sī-toaⁿ kàu hián-sī só͘-ū ê kái-piàn',
+'tog-usenewrc' => 'Ka-kiông pán ê chòe-kīn-ê-kái-piàn (su-iàu JavaScript)',
 'tog-numberheadings' => 'Phiau-tê chū-tōng pian-hō',
 'tog-showtoolbar' => 'Hián-sī pian-chi̍p ke-si-tiâu (su-iàu JavaScript)',
 'tog-editondblclick' => 'Siang-ji̍h ia̍h-bīn to̍h ē-tàng pian-chi̍p (su-iàu JavaScript)',
 'tog-editsection' => 'Ji̍h [siu-kái] chit-ê liân-kiat to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h',
 'tog-editsectiononrightclick' => 'Chiàⁿ-ji̍h (right click) toāⁿ-lo̍h (section) phiau-tê to̍h ē-tàng pian-chi̍p toāⁿ-lo̍h (su-iàu JavaScript)',
 'tog-showtoc' => 'Hián-sī bo̍k-chhù (3-ê phiau-tê í-siōng ê ia̍h)',
-'tog-rememberpassword' => 'Kì tiâu bi̍t-bé, āu-chōa iōng ( $1 {{PLURAL:$1|day|kang}} lāi)',
+'tog-rememberpassword' => 'Kì tiâu bi̍t-bé, āu-chōa iōng (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Kā goá khui ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té',
 'tog-watchdefault' => 'Kā goá pian-chi̍p kòe ê ia̍h ka-ji̍p kàm-sī-toaⁿ lāi-té',
 'tog-watchmoves' => 'Kā goá soá ê ia̍h ka-ji̍p kàm-sī-toaⁿ',
@@ -46,37 +43,22 @@ $messages = array(
 'tog-previewontop' => 'Sûn-khoàⁿ ê lōe-iông tī pian-chi̍p keh-á thâu-chêng',
 'tog-previewonfirst' => 'Thâu-pái pian-chi̍p seng khoàⁿ-māi',
 'tog-nocache' => 'Koaiⁿ-tiāu ia̍h ê cache',
-'tog-enotifwatchlistpages' => 'Kam-sī-tuann ū ē bûn-tsiunn nā ū kái-piàn, kià tiān-tsú-phue hōo guá.',
-'tog-enotifusertalkpages' => 'Guá ê thó-lūn ia̍h  nā ū lâng kái,  kià tiān-tsú-phue hōo guá.',
-'tog-enotifminoredits' => 'Sió pian-chi̍p mā kià tiān-tsú-phue hōo guá.',
-'tog-enotifrevealaddr' => 'Hō͘ pat-lâng khoàⁿ ê tio̍h oá ê tiān-chú-phoe tē-chí',
-'tog-shownumberswatching' => 'Hián-sī tng leh khoàⁿ ê iōng-chiá sò͘-bo̍k',
-'tog-oldsig' => 'Chit-má ê chhiam-miâ:',
 'tog-fancysig' => 'Chhiam-miâ mài chò liân-kiat',
-'tog-externaleditor' => 'Iōng gōa-pō· pian-chi̍p-khì (kan-na hō͘ ko-chhiú, he ài tī lí ê tiān-náu koh siat-tēng. [//www.mediawiki.org/wiki/Manual:External_editors Siông-chêng.])',
-'tog-externaldiff' => 'Iōng gōa-pō· diff (kan-na hō͘ ko-chhiú, he ài tī lí ê tiān-noá koh siat-tēng. [//www.mediawiki.org/wiki/Manual:External_editors Siông-chêng.])',
-'tog-showjumplinks' => 'Hō͘ "thiàu khì" chit ê liân-chiap ē-sái',
-'tog-uselivepreview' => 'Ēng sui khoàⁿ-māi (ài ū JavaScript) (chhì-giām--ê)',
+'tog-externaleditor' => 'Iōng gōa-pō· pian-chi̍p-khì',
+'tog-externaldiff' => 'Iōng gōa-pō· diff',
 'tog-forceeditsummary' => 'Pian-chi̍p khài-iàu bô thiⁿ ê sî-chūn, kā goá thê-chhéⁿ',
 'tog-watchlisthideown' => 'Kàm-sī-toaⁿ bián hián-sī goá ê pian-chi̍p',
 'tog-watchlisthidebots' => 'Kàm-sī-toaⁿ bián hián-sī ki-khì pian-chi̍p',
 'tog-watchlisthideminor' => 'Kàm-sī-toaⁿ bián hián-sī sió siu-kái',
-'tog-watchlisthideliu' => 'Kàm-sī-toaⁿ bián hián-sī iōng-chiá ū teng-ji̍p ê pian-chi̍p',
-'tog-watchlisthideanons' => 'Kàm-sī-toaⁿ bián hián-sī bû-bêng-sī ê pian-chi̍p',
-'tog-watchlisthidepatrolled' => 'Kàm-sī-toaⁿ bián hián-sī khoàⁿ-koè--ê pian-chi̍p',
 'tog-ccmeonemails' => 'Kià hō͘ pa̍t-lâng ê email sūn-soà kià copy hō͘ goá',
 'tog-diffonly' => 'Diff ē-pêng bián hián-sī ia̍h ê loē-iông',
-'tog-showhiddencats' => 'Hián-sī chhàng khí--lâi ê lūi-pia̍t',
-'tog-norollbackdiff' => 'ká tńg-khí liáu bián-koán cheng-chha goā-chē',
 
 'underline-always' => 'Tiāⁿ-tio̍h',
 'underline-never' => 'Tiāⁿ-tio̍h mài',
 'underline-default' => 'Tòe liû-lám-khì ê default',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Pian-chi̍p sî ēng ê jī-thé hêng-sek:',
 'editfont-default' => 'Tòe liû-lám-khì ê default',
-'editfont-monospace' => 'Monospaced jī-thé',
 'editfont-sansserif' => 'Sans-serif jī-thé',
 'editfont-serif' => 'Serif jī-thé',
 
@@ -133,7 +115,7 @@ $messages = array(
 'dec' => '12g',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Lūi-pia̍t|ê lūi-pia̍t}}',
+'pagecategories' => '{{PLURAL:$1|Lūi-pia̍t|Lūi-pia̍t}}',
 'category_header' => 'Tī "$1" chit ê lūi-pia̍t ê bûn-chiuⁿ',
 'subcategories' => 'Ē-lūi-pia̍t',
 'category-media-header' => 'Tī lūi-pia̍t "$1" ê mûi-thé',
@@ -155,7 +137,6 @@ $messages = array(
 'article' => 'Loē-iông ia̍h',
 'newwindow' => '(ē khui sin thang-á hián-sī)',
 'cancel' => 'Chhú-siau',
-'moredotdotdot' => 'Iáu-ū',
 'mypage' => 'Góa ê ia̍h',
 'mytalk' => 'Góa ê thó-lūn',
 'anontalk' => 'Chit ê IP ê thó-lūn-ia̍h',
@@ -211,7 +192,7 @@ $messages = array(
 'create-this-page' => 'Khai-sí siá chit ia̍h',
 'delete' => 'Thâi',
 'deletethispage' => 'Thâi chit ia̍h',
-'undelete_short' => 'Kiù {{PLURAL:$1| ê siu-káit|$1  ê siu-kái}}',
+'undelete_short' => 'Kiù $1 ê siu-kái',
 'viewdeleted_short' => 'Khoàⁿ {{PLURAL:$1|chi̍t-ê thâi tiàu--ê pian-chi̍p|$1 ê thâi tiàu--ê pian-chi̍p}}',
 'protect' => 'Pó-hō·',
 'protect_change' => 'kái-piàn',
@@ -240,7 +221,7 @@ $messages = array(
 'redirectedfrom' => '(Tùi $1 choán--lâi)',
 'redirectpagesub' => 'Choán-ia̍h',
 'lastmodifiedat' => 'Chit ia̍h tī $1,  $2 ū kái--koè',
-'viewcount' => 'Pún-ia̍h kàu taⁿ ū {{PLURAL:$1| pái|$1 pái}}  ê sú-iōng.',
+'viewcount' => 'Pún-ia̍h kàu taⁿ ū $1 pái access.',
 'protectedpage' => 'Siū pó-hō͘ ê ia̍h',
 'jumpto' => 'Thiàu khì:',
 'jumptonavigation' => 'Se̍h chām',
@@ -302,7 +283,7 @@ Chhiáⁿ khoàⁿ [[Special:Version|pán-pún ia̍h]].',
 'thisisdeleted' => 'Khoàⁿ a̍h-sī kiù $1?',
 'viewdeleted' => 'Beh khoàⁿ $1?',
 'restorelink' => '{{PLURAL:$1|chi̍t ê thâi-tiàu ê pian-chi̍p|$1 thâi-tiàu ê pian-chi̍p}}',
-'feedlinks' => 'Tēng khoàⁿ:',
+'feedlinks' => 'Chhī-liāu:',
 'feed-invalid' => 'Bô-hāu ê tēng khoàⁿ lūi-hêng.',
 'feed-unavailable' => 'Bô thê-kiong liân-ha̍p tēng khoàⁿ.',
 'site-rss-feed' => '$1 ê RSS tēng khoàⁿ',
@@ -344,11 +325,6 @@ Téng chi̍t ê cha-sûn sī :
 <blockquote><tt>$1</tt></blockquote>
 tī hâm-sò͘  "<tt>$2</tt>".
 Chu-liāu-khò͘ thoân hoê ê chhò-ngō͘ "<tt>$3: $4</tt>".',
-'dberrortextcl' => '發生一个查詢資料庫語法錯誤,頂一个欲查詢資料庫是:
-"$1"
-佇"$2"
-資料庫送回一个錯誤"$3: $4"',
-'laggedslavemode' => "'''提醒你:'''這頁可能無包括最近改的。",
 'readonly' => 'Chu-liāu-khò· só tiâu leh',
 'enterlockreason' => 'Phah beh hong-só ê lí-iû, pau-koah ko͘-kè siáⁿ-mi̍h sî-chūn ē kái-tû hong-só.',
 'readonlytext' => 'Chu-liāu-khò· hiān-chú-sî só tiâu leh, bô khai-hòng hō· lâng siu-kái. Che tāi-khài sī in-ūi teh pān î-siu khang-khòe, oân-sêng liáu-āu èng-tong tō ē hôe-ho̍k chèng-siông. Hū-chek ê hêng-chèng jîn-oân lâu chit-ê soat-bêng: $1',
@@ -357,9 +333,6 @@ Chu-liāu-khò͘ thoân hoê ê chhò-ngō͘ "<tt>$3: $4</tt>".',
 Che it-poaⁿ sī in-ūi koè-sî ê cheng-chha ia̍h sī le̍k-sú liân-kiat ê ia̍h í-keng hông thâi tiàu.
 
 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' => '資料庫已經自動鎖牢咧,從屬資料庫伺服器當咧更新綴到主伺服器',
 'internalerror' => 'Loē-pō͘ ê chhò-ngō͘',
 'internalerror_info' => 'Loē-pō͘ ê chhò-ngō͘: $1',
 'fileappenderrorread' => 'Ka-ji̍p(append) ê sî bô-hoat-tō͘ thak "$1".',
@@ -373,203 +346,106 @@ Nā m̄-sī hit chióng chêng-hêng, lí khó-lêng tú tio̍h nńg-thé ê chh
 'unexpected' => 'Koài-koài ê pió-tat: "$1"="$2"。',
 'formerror' => 'Chhò-gō·: bô-hoat-tō· kā pió sàng chhut khì.',
 'badarticleerror' => 'Bē-tàng tiàm chit ia̍h chip-hêng chit ê tōng-chok.',
-'cannotdelete' => 'Bô-hoat-tō· kā  "$1" hit ê ia̍h a̍h-sī iáⁿ-siōng thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)',
-'cannotdelete-title' => '無法度共"$1"這頁刣掉',
+'cannotdelete' => 'Bô-hoat-tō· kā hit ê ia̍h a̍h-sī iáⁿ-siōng thâi tiāu. (Khó-lêng pa̍t-lâng í-keng kā thâi tiāu ah.)',
 'badtitle' => 'M̄-chiâⁿ piau-tê',
 'badtitletext' => 'Iau-kiû ê piau-tê sī bô-hāu ê, khang ê, a̍h-sī liân-kiat chhò-gō· ê inter-language/inter-wiki piau-tê.',
-'perfcached' => 'Ē-kha ê chu-liāu ùi khoài-chhú(cache) lâi--ê, só·-í khó-lêng m̄-sī siōng sin ê. Khoài-chhú lāi-té siōng chē khǹg {{PLURAL:$1| chi̍t tiâu|$1 tiâu}}.',
-'perfcachedts' => 'Ē-kha ê chu-liāu ùi khoài-chhú(cache) lâi--ê, tī $1 keng-sin--koè. Khoài-chhú lāi-té siōng chē khǹg {{PLURAL:$4| chi̍t tiâu |$4 tiâu}}.',
+'perfcached' => 'Ē-kha ê chu-liāu tùi lâi--ê, só·-í bī-pit oân-choân hoán-èng siōng sin ê chōng-hóng. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Ē-kha ê chu-liāu tùi lâi--ê, tī $1 keng-sin--koè. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Chit-má bē-sái kái chit ia̍h.
 Chia ê chu-liāu bē-tàng sui tiông-sin chéng-lí.',
 'wrong_wfQuery_params' => 'Chhò-ngō͘ ê chham-sò͘ chhoân hō͘ wfQuery()<br />
 Hâm-sò͘: $1<br />
 Cha-sûn: $2',
 'viewsource' => 'Khoàⁿ goân-sú lōe-iông',
-'viewsource-title' => '看$1的內容',
 'actionthrottled' => 'Tōng-chok hông tóng leh.',
 'actionthrottledtext' => 'Ūi-tio̍h thê-hông lah-sap ê chhú-tì,  lí ū hông hān-chè tī té sî-kan lāi chò siuⁿ chē pái chit ê tōng-chok,  taⁿ lí í-keng chhiau-koè hān-chè.
 Chhiáⁿ tī kúi hun-cheng hāu chiah koh chhì.',
 'protectedpagetext' => 'Chit ia̍h hông só tiâu leh, bē pian-chi̍p tit.',
 'viewsourcetext' => 'Lí ē-sái khoàⁿ ia̍h khó͘-pih chit ia̍h ê goân-sú loē-iông:',
-'viewyourtext' => "你會使共'''你的編輯'''的內容拷備來這頁:",
 'protectedinterface' => 'Chit ia̍h thê-kiong nńg-thé kài-bīn ēng ê bûn-jī. Ūi beh ī-hông lâng chau-that, só͘-í ū siū tio̍h pó-hō͘.',
-'editinginterface' => "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. 
-Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn.
-Nā ūi-tio̍h hoan-e̍k, chhiáⁿ khó-lū sú-iōng [//translatewiki.net/wiki/Main_Page?setlang=nan translatewiki.net], MediaWiki ê chāi-tē hoà sū-kang.",
+'editinginterface' => "'''Sè-jī:''' Lí tng teh siu-kái 1 bīn thê-kiong nńg-thé kài-bīn bûn-jī ê ia̍h. Jīn-hô kái-piàn to ē éng-hióng tio̍h kî-thaⁿ iōng-chiá ê sú-iōng kài-bīn.",
 'sqlhidden' => '(Tshàng SQL tsa-sûn)',
 'cascadeprotected' => 'Chit-ê ia̍h í-keng hông pó-hō͘ bē kái tit. In-ūi i tī ē-bīn {{PLURAL:$1|ê|ê}} liân-só pó-hō͘ lāi-té:
 $2',
 'namespaceprotected' => "Lí bô khoân-lī kái '''$1'''  miâ-khong-kan ê ia̍h",
-'customcssprotected' => '你無權限通改這CSS頁面,因為伊包括著其他用戶的個人設定。',
-'customjsprotected' => '你無權限通改這javaScript頁面,因為伊包括著其他用戶的個人設定。',
-'ns-specialprotected' => '特殊頁袂使改得',
-'titleprotected' => "這个標題已經予[[User:$1|$1]]保護牢咧袂使用。理由是''$2''。",
-'filereadonlyerror' => '無法度改"$1" 這个檔案,因為"$2"這个儲存庫佇讀的模式。
-共封鎖的管理員有解說講:"$3"。',
 
 # Virus scanner
-'virus-badscanner' => "毋著的設定: 毋知影的病毒掃瞄器:''$1''",
-'virus-scanfailed' => '掃描失敗(號碼 $1)',
 'virus-unknownscanner' => 'M̄-chai siáⁿ pēⁿ-to̍k:',
 
 # Login and logout pages
 'logouttext' => "'''Lí í-keng teng-chhut.'''
 
-Lí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī  pa̍t-ê sin-hūn [[Special:UserLogin|têng teng-ji̍p]].
+Lí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī pa̍t-ê sin-hūn têng teng-ji̍p.
 Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
 'welcomecreation' => '==Hoan-gêng $1!==
-Í-keng khui hó lí ê kháu-chō.  M̄-hó bē-kì-tit chhiâu lí tī [[Special:Preferences|{{SITENAME}} ê iōng-chiá siat-tēng]].',
+Í-keng khui hó lí ê kháu-chō.  M̄-hó bē-kì-tit chhiâu lí ê iōng-chiá siat-tēng.',
 'yourname' => 'Lí ê iōng-chiá miâ-chheng:',
 'yourpassword' => 'Lí ê bi̍t-bé:',
 'yourpasswordagain' => 'Têng phah bi̍t-bé:',
-'remembermypassword' => 'Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (tī $1 {{PLURAL:$1|day|days}} kang lāi)',
-'securelogin-stick-https' => '登入後繼續以HTTPS連接',
-'yourdomainname' => '你的網域',
-'externaldberror' => '這可能是因為驗證資料庫錯誤,抑是你hông禁止改你的外部口座。',
+'remembermypassword' => 'Kì tiâu góa ê bi̍t-bé (āu-chhiú teng-ji̍p iōng) (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'login' => 'Teng-ji̍p',
 'nav-login-createaccount' => 'Teng-ji̍p / khui sin kháu-chō',
 'loginprompt' => 'Thiⁿ ē-kha ê chu-liāu thang khui sin hō·-thâu a̍h-sī teng-ji̍p {{SITENAME}}.',
 'userlogin' => 'Teng-ji̍p / khui sin kháu-chō',
-'userloginnocreate' => 'Teng-ji̍p',
 'logout' => 'Teng-chhut',
 'userlogout' => 'Teng-chhut',
 'notloggedin' => 'Bô teng-ji̍p',
-'nologin' => "Bô poàⁿ ê kháu-chō? '''$1'''.",
+'nologin' => "Bô-thang teng-ji̍p? '''$1'''.",
 'nologinlink' => 'Khui 1 ê kháu-chō',
 'createaccount' => 'Khui sin kháu-chō',
 'gotaccount' => "Í-keng ū kháu-chō? '''$1'''.",
 'gotaccountlink' => 'Teng-ji̍p',
-'userlogin-resetlink' => '袂記得你登入的資料?',
 'createaccountmail' => 'Thàu koè tiān-chú-phoe',
-'createaccountreason' => 'Lí-iû:',
 'badretype' => 'Lí su-ji̍p ê 2-cho· bi̍t-bé bô tùi.',
 'userexists' => 'Lí beh ti̍h ê iōng-chiá miâ-chheng í-keng ū lâng iōng. Chhiáⁿ kéng pa̍t-ê miâ.',
 'loginerror' => 'Teng-ji̍p chhò-gō·',
 'createaccounterror' => 'Bô hoat-tō͘ khui kháu-chō: $1',
-'nocookiesnew' => '口座開好矣,毋過你猶未登入,
-{{SITENAME}}用cookies記錄用者,
-你無拍開cookies功能,
-請拍開,通記錄你的用者名稱佮密碼。',
-'nocookieslogin' => '{{SITENAME}}用 Cookies 記錄用戶,你共關掉,請拍開閣重新登入。',
-'nocookiesfornew' => '這个用者口座猶未開,阮無法度確認伊的來源,
-請確定你您已經拍開cookies功能了,重新載入這頁閣重試。',
-'noname' => '你無拍一个有效的用者名稱。',
 'loginsuccesstitle' => 'Teng-ji̍p sêng-kong',
 'loginsuccess' => 'Lí hiān-chhú-sî í-keng teng-ji̍p {{SITENAME}} chò "$1".',
-'nosuchuser' => 'Chia bô iōng-chiá hō-chò "$1". Miâ-jī  ū hun toā-siá, sio-siá . Chhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī [[Special:UserLogin/signup|khui sin káu-chō]].',
+'nosuchuser' => 'Chia bô iōng-chiá hō-chò "$1". Chhiáⁿ kiám-cha lí ê phèng-im, a̍h-sī iōng ē-kha ê pió lâi khui sin iōng-chiá ê kháu-chō.',
 'nosuchusershort' => 'Bô "$1" chit ê iōng-chiá miâ.
 Tùi khoàⁿ-māi,  lí phah--ê.',
 'nouserspecified' => 'Lí ài chí-tēng chi̍t ê iōng-chiá miâ.',
-'login-userblocked' => '這个用者已經hông封鎖,無允准登入。',
 'wrongpassword' => 'Lí su-ji̍p ê bi̍t-bé ū têng-tâⁿ. Chhiáⁿ têng chhì.',
 'wrongpasswordempty' => 'Bi̍t-bé keh-á khang-khang. Chhiáⁿ têng chhì.',
-'passwordtooshort' => '密碼至少愛有{{PLURAL:$1|一个字元|$1字元}}',
-'password-name-match' => '你的密碼袂使佮你的用者名稱相仝',
-'password-login-forbidden' => '這个用者名稱佮密碼已經hông禁止',
 'mailmypassword' => 'Kià sin bi̍t-bé hō· góa',
 'passwordremindertitle' => '{{SITENAME}} the-chheN li e bit-be',
-'passwordremindertext' => '有人(可能是你,佇$1 IP地址)已經佇{{SITENAME}}申請新密碼 ($4)。
-用者"$2"的一个臨時密碼已經設定做"$3"。
-若毋是你申請的,你需要馬上登入並且選擇一个新密碼。
-你的臨時密碼會佇{{PLURAL:$5|一工|$5工}}內過期。
-
-若是別人申請的,抑是你已經想起你的密碼,而且不想欲改,
-你會使莫管這个信息而且繼續用你的舊密碼。',
 'noemail' => 'Kì-lo̍k bô iōng-chiá "$1" ê e-mail chū-chí.',
-'noemailcreate' => '你愛提供一个有效的電子批地址',
 'passwordsent' => 'Ū kià sin bi̍t-bé khì "$1" chù-chheh ê e-mail chū-chí. Siu--tio̍h liáu-āu chhiáⁿ têng teng-ji̍p.',
-'blocked-mailpassword' => '你的IP地址hông封鎖,袂當編輯,為著安全起見,袂當使用密碼恢復功能。',
-'eauthentsent' => '一張確認的批已經寄去提示的電子批地址。
-佇其它批寄去彼的口座進前,你愛先照彼張批的指示,才通確定彼个口座是你的。',
-'throttled-mailpassword' => '密碼提醒的資料已經佇{{PLURAL:$1|點鐘|$1點鐘}}前寄出。為著防止濫使用,限定佇{{PLURAL:$1|點鐘|$1點鐘}}內只通送一擺密碼提醒。',
 'mailerror' => 'Kià phoe tú tio̍h chhò-gō·: $1',
-'acct_creation_throttle_hit' => 'Tī koè-khì 24 tiám-cheng lāi,  ū chit ê iōng lí IP bāng-chí ê lâng í-keng khui {{PLURAL:$1|1 account|$1 kháu-chō}}. He sī hit ê sî-kan lāi thang chò ê.
-Tiō-sī kóng, tī chit-má iōng chit ê IP bāng-chí ê lâng bē-sái koh khui jīm-hô kháu-chō.',
-'emailauthenticated' => 'Lí ê e-mail chū-chí tī $2 $3 khak-jīn sêng-kong.',
+'acct_creation_throttle_hit' => 'Pháiⁿ-sè, lí taⁿ í-keng khui $1 ê kháu-chō ā. Bē-sái koh-chài khui.',
+'emailauthenticated' => 'Lí ê e-mail chū-chí tī $1 khak-jīn sêng-kong.',
 'emailnotauthenticated' => 'Lí ê e-mail chū-chí iáu-bōe khak-jīn ū-hāu, só·-í ē--kha ê e-mail kong-lêng bē-ēng-tit.',
 'noemailprefs' => 'Tī lí ê siat-piān chí-tēng chi̍t ê tiān-chú-phoe tē-chí thang hō͘ chia ê kong-lêng ē-tàng ēng.',
 'emailconfirmlink' => 'Chhiáⁿ khak-jīn lí ê e-mail chū-chí ū-hāu',
-'invalidemailaddress' => '電子批的地址無正確,規格毋著,
-請拍一个符合規格的地址抑是放空格。',
-'cannotchangeemail' => '口座的e-mail住址無法度佇這个wiki改',
-'emaildisabled' => '這个網站袂當寄電子批。',
-'accountcreated' => '口座開好矣',
-'accountcreatedtext' => '$1的口座開好矣',
-'createaccount-title' => '佇{{SITENAME}}開好口座',
-'createaccount-text' => '有人佇{{SITENAME}}用你的電子批地址開一个名"$2"的口座($4),密碼是 "$3",
-你這馬應該去登入,而且去改密碼。
-
-若是彼个口座開毋著,你會使莫管這个訊息。',
-'usernamehasherror' => '用者名稱袂使有#字元',
-'login-throttled' => '你已經試傷濟擺登入的動作,
-請小等一下才閣試。',
-'login-abort-generic' => '你的登入無成功,中途退出。',
-'loginlanguagelabel' => '話語:$1',
-'suspicious-userlogout' => '你登出的要求已經被拒絕,因為伊看起來是對無連線的瀏覽器抑是快取代理傳送來的。',
 
 # E-mail sending
-'php-mail-error-unknown' => '佇PHP的 mail() 函數的未知錯誤',
 'user-mail-no-addy' => 'Siūⁿ beh kià tiān-chú-phoe, m̄-koh bô siá tē-chí.',
 
 # Change password dialog
 'resetpass' => 'Kái bi̍t-bé',
-'resetpass_announce' => '你是對一張電子批的臨時編碼登入的。欲完成登入,你愛佇遮設定新密碼:',
 'resetpass_header' => 'Kái káu-chō ê bi̍t-bé.',
 'oldpassword' => 'Kū bi̍t-bé:',
 'newpassword' => 'Sin bi̍t-bé:',
 'retypenew' => 'Têng phah sin bi̍t-bé:',
-'resetpass_submit' => '設定密碼而且登入',
-'resetpass_success' => '你的密碼已經改成功!
-這馬你咧登入...',
 'resetpass_forbidden' => 'Bi̍t-bé bē-sái piàn.',
-'resetpass-no-info' => '你愛登入了,才通直接進入這頁',
 'resetpass-submit-loggedin' => 'Kái bi̍t-bé',
 'resetpass-submit-cancel' => 'Chhú-siau',
-'resetpass-wrong-oldpass' => '無效的臨時抑是現在的密碼,
-你可能已經成功更過你的密碼,抑是申請一个新的臨時密碼。',
 'resetpass-temp-password' => 'Lîm-sî ê bi̍t-bé:',
 
 # Special:PasswordReset
 'passwordreset' => 'Têng siat bi̍t-bé',
-'passwordreset-text' => '完成這个表,就通收著一封提醒你口座詳情的電子批。',
 'passwordreset-legend' => 'Têng siat bi̍t-bé',
-'passwordreset-disabled' => '佇這个Wiki已經禁止重設密碼',
-'passwordreset-pretext' => '{{PLURAL:$1||拍下跤資料內底的一个}}',
 'passwordreset-username' => 'Lí ê iōng-chiá miâ-chheng:',
-'passwordreset-domain' => '網域:',
-'passwordreset-capture' => '敢欲看產生的電子批?',
-'passwordreset-capture-help' => '若你選這个框,電子批(包括臨時的密碼)會予你看著,而且傳送予用者。',
 'passwordreset-email' => 'Tiān-chú-phoe tē-chí:',
-'passwordreset-emailtitle' => '佇{{SITENAME}}面頂的的口座詳細',
-'passwordreset-emailtext-ip' => '有人(可能是你,對$1這IP)要求發一个{{SITENAME}}($4)口座詳情的提示。彼个用戶{{PLURAL:$3|是|是}}佮下跤電子批地址有關係:
-
-$2
-
-{{PLURAL:$3|這个臨時密碼|遮的臨時密碼}}會佇{{PLURAL:$5|一工 |$5工}}內到期。
-你這馬應該登入,而且選擇一个新密碼。若是別人做的要求,抑是你已經記
-起來你的密碼,你閣無想欲改,你會當免管這个信息,而且繼續用你的密碼。',
-'passwordreset-emailtext-user' => '佇{{SITENAME}}的用者$1要求發一个{{SITENAME}}($4)口座詳情的提示。彼个用者{{PLURAL:$3|是|是}}佮下跤電子批地址有關係:
-
-$2
-
-{{PLURAL:$3|這个臨時密碼|遮的臨時密碼}}會佇{{PLURAL:$5|一工 |$5工}}內到期。
-你這馬應該登入,而且選一个新密碼。若是別人做的要求,抑是你已經記
-起來你的密碼,你閣無想欲改,你會當免管這个信息,而且繼續用你的密碼。',
 'passwordreset-emailelement' => 'Iōng-chiá: $1
 Lîm-sî ê bi̍t-bé: $2',
 'passwordreset-emailsent' => 'Chit hong thê-chhíⁿ ê  tiān-chú-phoe í-keng kià chhut.',
-'passwordreset-emailsent-capture' => '一張提醒的電子批已經寄出,佇下面通看著。',
-'passwordreset-emailerror-capture' => '一張提醒的電子批已經寫好,佇下面通看著,毋過送袂到用者: $1。',
 
 # Special:ChangeEmail
 'changeemail' => 'Kái tiān-chú-phoe ê tē-chí',
-'changeemail-header' => '改口座的電子批地址。',
-'changeemail-text' => '共這个表寫了,才通改你的電子批地址,你嘛愛拍密碼來確定你欲改。',
-'changeemail-no-info' => '你愛登入了,才通直接進入這頁。',
 'changeemail-oldemail' => 'Chit-má ê E-mail tē-chí:',
 'changeemail-newemail' => 'Sin E-mail ê chū-chí:',
-'changeemail-none' => '(無)',
-'changeemail-submit' => '改電子批',
 'changeemail-cancel' => 'Chhú-siau',
 
 # Edit page toolbar
@@ -584,12 +460,9 @@ Lîm-sî ê bi̍t-bé: $2',
 'headline_sample' => 'Thâu-tiâu bûn-jī',
 'headline_tip' => 'Tē-2-chân (level 2) ê phiau-tê',
 'nowiki_sample' => 'Chia siá bô keh-sek ê bûn-jī',
-'nowiki_tip' => '無照Wiki的規格',
 'image_sample' => 'Iann-siong-e-le.jpg',
 'image_tip' => 'Giap tī lāi-bīn ê iáⁿ-siōng',
-'media_tip' => '檔案連結',
 'sig_tip' => 'Lí ê chhiam-miâ kap sî-kan ìn-á',
-'hr_tip' => '橫線 (小心使用)',
 
 # Edit pages
 'summary' => 'Khài-iàu:',
@@ -599,108 +472,33 @@ Lîm-sî ê bi̍t-bé: $2',
 'savearticle' => 'Pó-chûn chit ia̍h',
 'preview' => 'Seng khoàⁿ-māi',
 'showpreview' => 'Seng khoàⁿ-māi',
-'showlivepreview' => '即時先看覓',
 'showdiff' => 'Khòaⁿ kái-piàn ê pō·-hūn',
 'anoneditwarning' => "'''Kéng-kò:''' Lí bô teng-ji̍p. Lí ê IP chū-chí ē kì tī pún ia̍h ê pian-chi̍p le̍k-sú lāi-bīn.",
-'anonpreviewwarning' => "''你並無登入,保存頁面的時陣,會共你的IP地址記錄佇這頁的編輯歷史。''",
-'missingsummary' => "'''提醒:'''你無拍一个編輯標題,若你閣點「{{int:savearticle}}」一擺,你的編輯會無不帶標題保存起來。",
-'missingcommenttext' => '請佇下跤拍意見',
-'missingcommentheader' => "'''提醒:'''你無為你的意見寫一个標題,
-若你閣點「{{int:savearticle}}」一擺,你的編輯會無帶標題保存起來。",
 'summary-preview' => 'Khài-iàu ê preview:',
 'subject-preview' => 'Ū-lám tê-bo̍k/piau-tê:',
-'blockedtitle' => '用者hông封鎖',
-'blockedtext' => "'''你的用者名稱抑是IP地址已經hông封鎖'''
-
-這擺的封鎖是由$1所做的,
-原因是''$2''。
-
-* 這擺封鎖開始的時間是:$8
-* 這擺封鎖到期的時間是:$6
-* hông封鎖的用者:$7
-
-妳會使聯絡$1抑是其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]]來討論這擺封鎖。
-除非你有佇你的[[Special:Preferences|口座設定]]當中,有設一个有效的電子批地址,若無,你是袂當使用「寄電子批予用者」的功能。若有,這个功能是無封鎖。
-你這馬IP地址是$3,被封鎖用者ID是 #$5,
-請佇你的詢問當中包括以上資料。",
-'autoblockedtext' => "你的IP地址已經自動封鎖,因為彼个地址是一个予$1封鎖掉的用者咧用。
-
-理由是:
-:''$2''
-
-* 這擺封鎖開始的時間是:$8
-* 這擺封鎖到期的時間是:$6
-* hông封鎖的用者:$7
-
-你會使聯絡$1抑是其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論這擺的封鎖。
-除非你有佇你的[[Special:Preferences|用者設定]]當中,設一个有效的電子批地址,若無你是袂當使用「寄電子批予這个用戶」的功能。你並無hông封鎖寄電子批。
-
-你這馬的IP地址是$3,被封鎖用者ID是 #$5,
-請佇你的查詢當中,註明面頂所有的資料。",
 'blockednoreason' => '無寫理由',
 'whitelistedittext' => 'Lí ài $1 chiah ē-sái siu-kái.',
-'confirmedittext' => '佇改這頁進前,你愛確認你的電子批地址,
-請透過[[Special:Preferences|用者設便]]的設定來驗證你的電子批地址。',
-'nosuchsectiontitle' => 'Chhoé bô toān-lo̍h',
-'nosuchsectiontext' => '你欲改的段落已經無佇咧,
-可能佇你看頁面的時陣,已經徙位抑是刣掉。',
 'loginreqtitle' => 'Su-iàu Teng-ji̍p',
 'loginreqlink' => 'Teng-ji̍p',
 'loginreqpagetext' => 'Lí ài $1 chiah thang khoàⁿ pat ia̍h.',
 'accmailtitle' => 'Bi̍t-bé kià chhut khì ah.',
-'accmailtext' => "Hō͘ [[User talk:$1|$1]] ê chi̍t ê iōng loān-sò͘ sán-seng ê bi̍t-bé í-keng kìa khì $2.
-
-Kháu-chō ê sin bi̍t-bé thang tī teng-ji̍p liáu tī ''[[Special:ChangePassword|siu-kái bi̍t-bé]]'' ia̍h kái tiāu.",
+'accmailtext' => '$1 ê bi̍t-bé í-keng kìa khì $2.',
 'newarticle' => '(Sin)',
 'newarticletext' => "Lí tòe 1 ê liân-kiat lâi kàu 1 bīn iáu-bōe chûn-chāi ê ia̍h. Beh khai-sí pian-chi̍p chit ia̍h, chhiáⁿ tī ē-kha ê bûn-jī keh-á lāi-té phah-jī. ([[{{MediaWiki:Helppage}}|Bo̍k-lio̍k]] kà lí án-choáⁿ chìn-hêng.) Ká-sú lí bô-tiuⁿ-tî lâi kàu chia, ē-sai chhi̍h liû-lám-khì ê '''téng-1-ia̍h''' tńg--khì.",
-'anontalkpagetext' => "''Pún thó-lūn-ia̍h bô kò·-tēng ê kháu-chō/hō·-thâu, kan-na ū 1 ê IP chū-chí (chhin-chhiūⁿ 123.456.789.123). In-ūi bô kāng lâng tī bô kāng sî-chūn ū khó-lêng tú-hó kong-ke kāng-ê IP, lâu tī chia ê oē ū khó-lêng hō· bô kāng lâng ê! Beh pī-bián chit khoán būn-tê, ē-sái khì [[Special:UserLogin/signup|khui 1 ê hō·-thâu a̍h-sī teng-ji̍p]].''",
-'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-view' => '用者口座「$1」猶未開',
-'blocked-notice-logextract' => '這个用者這馬hông封鎖,
-下跤有最近封鎖的紀錄通參考:',
-'clearyourcache' => "'''Chù-ì:''' Pó-chûn liáu-āu, tio̍h ē-kì leh kā liû-lám-khì ê cache piàⁿ tiāu chiah khoàⁿ-ē-tio̍h kái-piàn. 
-*'''Firefox / Safari:''' chhi̍h tiâu \"Shift\" kâng-sî-chūn tiám-kik ''Reload/têng-sin chài-ji̍p'' a̍h-sī chhi̍h ''Ctrl-F5'' \"Ctrl-R\" kî-tiong chi̍t ê (''⌘-R'' tī Mac) 
-* '''Google Chrome:''' chhi̍h ''Ctrl-Shift-R'' (''⌘-R-Shift-R'' tī Mac)
+'anontalkpagetext' => "----''Pún thó-lūn-ia̍h bô kò·-tēng ê kháu-chō/hō·-thâu, kan-na ū 1 ê IP chū-chí (chhin-chhiūⁿ 123.456.789.123). In-ūi bô kāng lâng tī bô kāng sî-chūn ū khó-lêng tú-hó kong-ke kāng-ê IP, lâu tī chia ê oē ū khó-lêng hō· bô kāng lâng ê! Beh pī-bián chit khoán būn-tê, ē-sái khì [[Special:UserLogin|khui 1 ê hō·-thâu a̍h-sī teng-ji̍p]].''",
+'clearyourcache' => "'''Chù-ì:''' Pó-chûn liáu-āu, tio̍h ē-kì leh kā liû-lám-khì ê cache piàⁿ tiāu chiah khoàⁿ-ē-tio̍h kái-piàn: *'''Firefox / Safari:''' chhi̍h tiâu \"Shift\" kâng-sî-chūn tiám-kik ''Reload/têng-sin chài-ji̍p'' a̍h-sī chhi̍h ''Ctrl-F5'' \"Ctrl-R\" kî-tiong chi̍t ê (''Command-R'' tī Mac) 
+* '''Google Chrome:''' chhi̍h ''Ctrl-Shift-R'' (''Command-Shift-R'' tī Mac)
 '''Internet Explorer :'''chhi̍h tiâu \"Ctrl\" kâng-sî-chūn tiám-kek ''Refresh/têng-sin chài-ji̍p'' a̍h-sī chhi̍h \"Ctrl-F5\" 
 * '''Konqueror:'''  tiám-kek ''Reload/têng-sin chài-ji̍p'' a̍h-sī chhi̍h ''F5''
 * '''Opera:''' piàⁿ-tiāu cache tī ''Tools(ke-si) → Preferences(siat-piān)''",
-'usercssyoucanpreview' => "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái chhi̍h 'Seng khoàⁿ-māi' kiám-cha sin ê CSS.",
-'userjsyoucanpreview' => "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái tiám-kek \"{{int:showpreview}}\" ; chhì lí ê sin JavaScript.",
-'usercsspreview' => "'''Thê-chhíⁿ lí,  che chí-sī sian khoàⁿ-māi  lí ê su-jîn CSS'''
-'''Che iáu-bōe pó-chûn--khí-lâi !'''",
+'usercssyoucanpreview' => "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái chhi̍h 'Seng khoàⁿ-māi' kiám-cha sin ê CSS a̍h-sī JavaScript.",
+'userjsyoucanpreview' => "'''Phiat-pō·''': Pó-chûn chìn-chêng ē-sái chhi̍h 'Seng khoàⁿ-māi' kiám-cha sin ê CSS a̍h-sī JavaScript.",
+'usercsspreview' => "'''Sè-jī! Lí hiān-chú-sî khoàⁿ--ê sī lí ê su-jîn css ê preview; che iáu-bōe pó-chûn--khí-lâi!'''",
 'userjspreview' => "'''Sè-jī! Lí hiān-chú-sî chhì khoàⁿ--ê sī lí ka-kī ê javascript; che iáu-bōe pó-chûn--khí-lâi!'''",
-'sitecsspreview' => "'''提醒你,這只是先看覓你的私人CSS'''
-'''猶未保存!'''",
-'sitejspreview' => "'''提醒你,這只是先看覓這个JavaScrpt程式'''
-'''猶未保存!'''",
-'userinvalidcssjstitle' => "'''提醒:'''遐無面板\"\$1\",
-家己設的 .css 佮 .js 頁愛用小寫標題,親像,
-{{ns:user}}:Foo/vector.css 無仝
-{{ns:user}}:Foo/Vector.css。",
-'updated' => '(改過矣)',
 '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 ![[#editform|→kè-sio̍k pian-chi̍p]]",
-'previewconflict' => '這个先看覓會反應你文字編輯區的內容,顯示佇面頂。佇你保存了就會公開。',
+'previewnote' => "'''Thê-chhéⁿ lí che sī 1 bīn kiám-cha chho͘-phe ēng--ê \"seng-khoàⁿ-ia̍h\", iáu-bōe pó-chûn--khí-lâi!'''",
 '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見資料,阮無法度處理你的編輯。'''
-
-''因為{{SITENAME}}有開放原始 HTML 碼,先看覓先看無,以防止 JavaScript 的攻擊。''
-
-'''若這改編輯過程無問題,請閣試一改。若閣有問題,請[[Special:UserLogout|登出]]了後,才閣重登入。'''",
-'token_suffix_mismatch' => "'''因為你用者端的編輯毀損一寡標點符號字元,你的編輯無被接受。'''
-這種情況會出現佇你用網路上匿名代理服務的時陣。",
-'edit_form_incomplete' => "'''一寡部份的編輯無送到伺服器,請檢查你的編輯是毋是完整,才閣試。'''",
 'editing' => 'Siu-kái $1',
-'creating' => '當咧建立$1',
 'editingsection' => 'Pian-chi̍p $1 (section)',
 'editingcomment' => 'Teh pian-chi̍p $1 (lâu-oē)',
 'editconflict' => 'Siu-kái sio-chhiong: $1',
@@ -710,98 +508,35 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 '''Kan-na''' téng-koân keh-á ê bûn-jī ē tī lí chhi̍h \"{{int:savearticle}}\" liáu-āu pó-chûn khí lâi.",
 'yourtext' => 'Lí ê bûn-jī',
 'storedversion' => 'Chu-liāu-khò· ê pán-pún',
-'nonunicodebrowser' => "'''提醒:你的瀏覽器佮Unicode編碼袂合。''
-遮有一个工作區會使予你通安全編輯頁面: 
-非ASCII字元會以十六進位編碼模式出現佇編輯框當中。",
 'editingold' => "'''KÉNG-KÒ: Lí tng teh siu-kái chit ia̍h ê 1 ê kū siu-tēng-pún. Lí nā kā pó-chûn khí lâi, chit ê siu-tēng-pún sòa-āu ê jīm-hô kái-piàn ē bô khì.'''",
 'yourdiff' => 'Chha-pia̍t',
-'copyrightwarning' => "請注意你佇{{SITENAME}}的所有貢獻攏會照$2發布(看$1的說明)。
-若你無希望你寫的文字hông隨意改抑是傳送,請毋莫佇遮送出。<br />
-你嘛向阮保證你送出來的內容是你家己寫的,抑是對無版權抑有授權的遐抄來的。
-'''毋通無授權就送出有版權作品!'''",
-'copyrightwarning2' => "請注意你佇{{SITENAME}}的所有貢獻,可能會予別的用者修改抑徙走,
-若你無希望你寫的文字hông無情修改,就毋莫佇遮提交。<br />
-你嘛向阮保證這是你家己寫的,抑是對無版權抑有授權(看$1的說明)的遐抄來的。
-'''毋通無授權就送出有版權作品!'''",
-'longpageerror' => "'''錯誤: 你送出來的文章長度有{{PLURAL:$1|1 KB|$1 KB}} ,這大過{{PLURAL:$2|1 KB|$2 KB}}的上大界限。'''
-伊無法度保存。",
-'readonlywarning' => "'''CHÙ-Ì: Chu-liāu-khò· taⁿ só tiâu leh thang pān î-siu khang-khòe, só·-í lí hiān-chú-sî bô thang pó-chûn jīn-hô phian-chi̍p hāng-bo̍k. Lí ē-sái kā siong-koan pō·-hūn tah--ji̍p-khì 1-ê bûn-jī tóng-àn pó-chûn, āu-chhiú chiah koh kè-sio̍k.'''
-
-Kā só tiâu ê koán-lí-goân ū lâu oē: $1",
-'protectedpagewarning' => "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái siu-kái.'''
-Ē-kha ū choè-kīn ê kì-lo̍k thang chham-khó:",
-'semiprotectedpagewarning' => "'''注意:'''這頁hông保護牢咧,只有有註冊的用者通編輯。
-下跤有最近的記錄通參考:",
-'cascadeprotectedwarning' => "'''注意:'''這頁已經hông保護牢咧,只有有管理員權限的用者才有法度改,因為這頁佇{{PLURAL:$1|頁|頁}}的連鎖保護內底:",
-'titleprotectedwarning' => "'''注意:這頁已經hông保護牢咧,需要有[[Special:ListGroupRights|指定權限]]的才會當創建。'''
-下跤有最近的記錄通參考:",
-'templatesused' => 'Chit ia̍h iōng {{PLURAL:$1|Template|Templates}} chia ê pang-bô· :',
-'templatesusedpreview' => 'Chit ê preview iōng chia ê {{PLURAL:$1|Template|pang-bô͘}}',
-'templatesusedsection' => 'Chit ê toāⁿ-lo̍k iōng chia ê {{PLURAL:$1|Template|pang-bô͘}}',
+'readonlywarning' => "'''CHÙ-Ì: Chu-liāu-khò· taⁿ só tiâu leh thang pān î-siu khang-khòe, só·-í lí hiān-chú-sî bô thang pó-chûn jīn-hô phian-chi̍p hāng-bo̍k. Lí ē-sái kā siong-koan pō·-hūn tah--ji̍p-khì 1-ê bûn-jī tóng-àn pó-chûn, āu-chhiú chiah koh kè-sio̍k.'''",
+'protectedpagewarning' => "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái siu-kái.'''",
+'templatesused' => 'Chit ia̍h iōng chia ê pang-bô·:',
+'templatesusedpreview' => 'Chit ê preview iōng chia ê pang-bô͘:',
+'templatesusedsection' => 'Chit ê section iōng chia ê pang-bô͘:',
 'template-protected' => '(pó-hō͘)',
 'template-semiprotected' => '(poàⁿ pó-hō͘)',
-'hiddencategories' => '這頁是屬於{{PLURAL:$1|一个隱藏類別|$1个隱藏類別}}的成員:',
-'nocreatetitle' => '欲創建頁hông限制',
-'nocreatetext' => '{{SITENAME}}限制創建新頁的功能。你會當倒退佮改現有的頁,抑是[[Special:UserLogin|登入抑是開一个口座]]。',
-'nocreate-loggedin' => '你無授權去創建新頁。',
-'sectioneditnotsupported-title' => '編輯段落是袂當得',
-'sectioneditnotsupported-text' => '段落編輯佇這頁袂當得',
-'permissionserrors' => '授權錯誤',
-'permissionserrorstext' => '你無允准去做彼,因為下跤
-{{PLURAL:$1|原因|原因}}:',
 'permissionserrorstext-withaction' => 'Lí bô ún-chún chò $2, in-ūi ē-kha
 {{PLURAL:$1|iân-kò͘|iân-kò͘}}:',
-'recreate-moveddeleted-warn' => "'''Sè-jī: Lí taⁿ chún-pī beh khui ê ia̍h, chêng bat hō͘ lâng thâi tiāu koè.''' 
-
-Lí tio̍h chim-chiok soà-chiap pian-chi̍p chit ia̍h ê pit-iàu-sèng. 
-Chia ū chit ia̍h ê san-tû kì-lo̍k hō͘ lí chham-khó:",
-'moveddeleted-notice' => '這頁已經予人刣掉,
-下跤有刣掉佮徙走的記錄通參考。',
-'log-fulllog' => '看全部的記錄',
-'edit-hook-aborted' => '取消編輯,
-無講啥物原因',
-'edit-gone-missing' => '無法度改新這頁,
-伊可能拄hông刣掉。',
+'recreate-moveddeleted-warn' => "'''Sè-jī: Lí taⁿ chún-pī beh khui ê ia̍h, chêng bat hō͘ lâng thâi tiāu koè.''' Lí tio̍h chim-chiok soà-chiap pian-chi̍p chit ia̍h ê pit-iàu-sèng. Chia ū chit ia̍h ê san-tû kì-lo̍k (deletion log) hō͘ lí chham-khó:",
 'edit-conflict' => 'Siu-kái sio-chhiong',
-'edit-no-change' => '你的編輯閬過,因為攏無改著字。',
-'edit-already-exists' => '無法度開新頁,
-已經有彼頁。',
 'defaultmessagetext' => 'Siat piān ê bûn-jī',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => "'''警示:'''這頁用傷濟擺函數呼叫。
-
-伊應該少過{{PLURAL:$2|擺|擺}},這馬有{{PLURAL:$1|擺|擺}}。",
-'expensive-parserfunction-category' => '用傷濟擺函數呼叫的頁',
 'post-expand-template-inclusion-warning' => "'''Kéng-pò:'''Pau ji̍t lâi ê pán-bôo sioⁿ koè tsē ia̍h tuā.
 Ū chi̍t-koá-á ē bô pau ji̍t lâi.",
-'post-expand-template-inclusion-category' => '頁的枋模所包的量已經超過',
-'post-expand-template-argument-warning' => "'''警示''':這个頁至少包括一个枋模的參數超過展開時的大細。
-遮的參數會忽略過。",
-'post-expand-template-argument-category' => '包括跳過枋模參數的頁面',
-'parser-template-loop-warning' => '踅圓框的枋模: [[$1]]',
-'parser-template-recursion-depth-warning' => '已經超過枋模的recusion深度限制($1)',
-'language-converter-depth-warning' => '已經超過字詞轉換器的深度限制($1)',
 
 # "Undo" feature
 'undo-success' => 'Pian-chi̍p í-keng chhú-siau. Chhiáⁿ khak-tēng, liáu-āu kā ē-kha ho̍k-goân ê kái-piàn pó-chûn--khí-lâi.',
 'undo-failure' => 'Pian-chi̍p bē-tàng chhú-siau, in-ūi chhiong tio̍h kî-kan chhah-ji̍p ê pian-chi̍p.',
-'undo-norev' => '這个編輯袂當取消,因為無這个修訂本,抑是hông刣掉。',
 'undo-summary' => 'Chhú-siau [[Special:Contributions/$2|$2]] ([[User talk:$2|thó-lūn]]) ê siu-tēng-pún $1',
 
-# Account creation failure
-'cantcreateaccounttitle' => '無法度開口座',
-'cantcreateaccount-text' => "對這个 IP 地址 ('''$1''') 開口座已經予 [[User:$3|$3]] 禁止。
-
-$3共禁止的原因是 ''$2''。",
-
 # History pages
 'viewpagelogs' => 'Khoàⁿ chit ia̍h ê logs',
 'nohistory' => 'Chit ia̍h bô pian-chi̍p-sú.',
 'currentrev' => 'Hiān-chú-sî ê siu-tēng-pún',
-'currentrev-asof' => '$1的上新修訂本',
 'revisionasof' => '$1 ê siu-tēng-pún',
-'revision-info' => '$2佇$1的修訂本',
 'previousrevision' => '←Khah kū ê siu-tēng-pún',
 'nextrevision' => 'Khah sin ê siu-tēng-pún→',
 'currentrevisionlink' => 'khoàⁿ siōng sin ê siu-tēng-pún',
@@ -811,526 +546,104 @@ $3共禁止的原因是 ''$2''。",
 'page_first' => 'Tùi thâu-chêng',
 'page_last' => 'Tùi āu-piah',
 'histlegend' => 'Pán-pún pí-phēng: tiám-soán beh pí-phēng ê pán-pún ê liú-á, liáu-āu chhi̍h ENTER a̍h-sī ē-kha hit tè sì-kak.<br />Soat-bêng: (taⁿ) = kap siōng sin pán-pún pí-phēng, (chêng) = kap chêng-1-ê pán-pún pí-phēng, ~ = sió siu-kái.',
-'history-fieldset-title' => '看歷史',
-'history-show-deleted' => '只有刣掉的',
 'histfirst' => 'Tùi thâu-chêng',
 'histlast' => 'Tùi āu-piah',
-'historysize' => '({{PLURAL:$1|1位元組|$1位元組}})',
-'historyempty' => '(空的)',
-
-# Revision feed
-'history-feed-title' => '修改的歷史',
-'history-feed-description' => '這頁佇本站的修改歷史',
-'history-feed-item-nocomment' => '$1 tī $2',
-'history-feed-empty' => '無你欲挃的頁,
-伊可能hông刣掉抑是改名,
-試[[Special:Search|搜揣本站]],通創建新頁。',
-
-# Revision deletion
-'rev-deleted-comment' => '(編輯概要已經清掉)',
-'rev-deleted-user' => '用者名稱已經清掉',
-'rev-deleted-event' => '動作的記錄已經清掉',
-'rev-deleted-user-contribs' => '[用者名稱抑是IP地址已經徙掉 - 佇貢獻當中隱藏編輯]',
-'rev-deleted-text-permission' => "這頁的修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄],有詳細的訊息。",
-'rev-deleted-text-unhide' => "這頁的修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄],
-若你欲繼續行,你照仝會使[$1看這个修訂本]。",
-'rev-suppressed-text-unhide' => "這頁的修訂本已經hông'''壓縮掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 壓縮記錄],
-若你欲繼續行,你照仝會使[$1看這个修訂本]。",
-'rev-deleted-text-view' => "這頁的修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄],有詳細的訊息。",
-'rev-suppressed-text-view' => "這頁的修訂本已經hông'''壓縮掉'''。
-你會使佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 壓縮記錄]看詳細。",
-'rev-deleted-no-diff' => "你無法度看精差,因為其中一个修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄]有通看詳細。",
-'rev-suppressed-no-diff' => "你無法度看精差,因為其中一个修訂本已經hông'''刣掉\"。",
-'rev-deleted-unhide-diff' => "欲做精差比並的一个修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄],
-若你欲繼續行,你照仝會使[$1看這个精差比並]。",
-'rev-suppressed-unhide-diff' => '精差比並的其中一个修訂本已經hông壓縮掉。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 壓縮記錄]通看詳細,
-若你欲繼續行,你照仝會使[$1看這个精差比並]。',
-'rev-deleted-diff-view' => "欲做精差比並的一个修訂本已經hông'''刣掉'''。
-佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刣掉記錄],通看這个精差比並。",
-'rev-suppressed-diff-view' => "欲做精差比並的一个修訂本已經hông'''壓縮掉'''。
-你會使佇[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 壓縮記錄],看這个精差比並。",
-'rev-delundel' => '顯示/掩',
-'rev-showdeleted' => '顯示',
-'revisiondelete' => '刣掉/取消刣掉 修訂本',
-'revdelete-nooldid-title' => '目標是無效的修訂本',
-'revdelete-nooldid-text' => '你欲用這个功能進前無指定欲改的修訂本,抑是無你指定的修訂本,抑是你欲改現時的版本隱藏起來。',
-'revdelete-nologtype-title' => '無指定記錄的類型',
-'revdelete-nologtype-text' => '你無指定佗一个記錄類型欲做這个動作',
-'revdelete-nologid-title' => '無效的記錄項目',
-'revdelete-nologid-text' => '你無指定佗一个記錄項目欲進行這个動作,抑是無你指定的項目。',
-'revdelete-no-file' => '無你指定的檔案',
-'revdelete-show-file-confirm' => '你敢確定欲看"<nowiki>$1</nowiki>"佇 $2 $3 刣掉的修訂本?',
-'revdelete-show-file-submit' => '是',
-'revdelete-selected' => "'''[[:$1]]{{PLURAL:$2|所選的修訂本|所選的修訂本}}:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|所選的記錄項目|所選的記錄項目}}:'''",
-'revdelete-text' => "'''佇頁面歷史佮記錄猶看有刣掉的修訂本佮彼件物,毋過內容部份是無予大眾看。'''
-佇{{SITENAME}}的其他管理員是會當看隱藏的內容,而且除非有另外附加的限制,伊用這个仝款介面通取消刣掉。",
-'revdelete-confirm' => '請確定你欲按呢做,你嘛了解後果,而且你欲做的這个動作符合[[{{MediaWiki:Policy-url}}|政策]]。',
-'revdelete-suppress-text' => "掩崁'''只'''佇下跤情況下才使用:
-* 可能是誹謗信息
-* 無適當的個人資料
-*:''厝的地址、電話號碼、社會安全號碼抑身份證號碼等等。''",
-'revdelete-legend' => '設定通看的制限',
-'revdelete-hide-text' => '隱藏修訂本文本',
-'revdelete-hide-image' => '隱藏檔案內容',
-'revdelete-hide-name' => '隱藏動作佮目標',
-'revdelete-hide-comment' => '隱藏編輯概要',
-'revdelete-hide-user' => '隱藏編輯者的名稱抑 IP 地址',
-'revdelete-hide-restricted' => '對系統管理員佮其他人攏掩崁資料',
-'revdelete-radio-same' => '(毋共改)',
-'revdelete-radio-set' => '是',
-'revdelete-radio-unset' => '毋是',
-'revdelete-suppress' => '對系統管理員佮其他人攏掩崁資料',
-'revdelete-unsuppress' => '共恢復的修訂本徙掉限制',
-'revdelete-log' => '理由:',
-'revdelete-submit' => '對所選的{{PLURAL:$1|修訂本}}來施實',
-'revdelete-success' => "'''改修訂本是毋是通予人看,已經改好矣'''",
-'revdelete-failure' => "'''改修訂本是毋是通予人看的動作無成功'''
-$1",
-'logdelete-success' => "'''事件的可見性質已經成功設定'''",
-'logdelete-failure' => "'''事件的可見性質無法度設定:'''
-$1",
-'revdel-restore' => '改敢看會著',
-'revdel-restore-deleted' => '刣掉去的修訂本',
-'revdel-restore-visible' => '看會著的修訂本',
-'pagehist' => '頁的歷史',
-'deletedhist' => '已經刣掉的歷史',
-'revdelete-hide-current' => '當咧隱藏佇$1 $2的項目錯誤:這是這馬的修訂本,袂使隱藏。',
-'revdelete-show-no-access' => '當咧顯示佇$1 $2的項目錯誤:這个項目已經標示做"有限制",
-你袂當處理。',
-'revdelete-modify-no-access' => "當欲改$1 $2項目的錯誤:這个項目已經標示做''有限制'',
-你袂當處理。",
-'revdelete-modify-missing' => '當咧改項目編號 $1錯誤:伊對資料庫當中消失!',
-'revdelete-no-change' => "'''提醒''':佇$1 $2的項目已經有人請求可見性質的設定。",
-'revdelete-concurrent-change' => '錯誤佇欲改$1 $2的項目:當你欲改伊的設定時,已經有另外的人共改過。
-請檢查記錄。',
-'revdelete-only-restricted' => '錯誤佇欲隱藏$1 $2的項目時發生:你袂當一方面選擇一項另外的可見性質,閣不准管理員看彼項目。',
-'revdelete-reason-dropdown' => '*捷用的刣掉理由
-** 侵犯版權
-** 不適合的個人資料
-** 可能是誹謗資料',
-'revdelete-otherreason' => '其他/另外的理由:',
-'revdelete-reasonotherlist' => '其他理由',
-'revdelete-edit-reasonlist' => '編輯刣掉的理由',
-'revdelete-offender' => '修訂本的編輯者:',
-
-# Suppression log
-'suppressionlog' => '隱藏記錄',
-'suppressionlogtext' => '下跤是管理員為著隱藏文章所做的刣掉抑封鎖的清單。
-若欲看這馬禁止使用、封鎖的清單,請看[[Special:BlockList|IP封鎖清單]]。',
-
-# History merging
-'mergehistory' => '合併兩个頁的修改歷史:',
-'mergehistory-header' => '這頁通予你合併一个頁的歷史到另外一个新的頁。
-會當予這改變更通接紲歷史頁。',
-'mergehistory-box' => '合併兩个頁的修訂本:',
-'mergehistory-from' => '來源頁:',
-'mergehistory-into' => '目標頁:',
-'mergehistory-list' => '可以合併的編輯歷史',
-'mergehistory-merge' => '下跤[[:$1]]的修訂本會使合併到[[:$2]]。用彼个選項鈕仔去合併只有佇指定時間進前所創建的修訂本。愛注意的是若使用導航連結就會重設這一欄。',
-'mergehistory-go' => '顯示通合併的編輯',
-'mergehistory-submit' => '合併修訂本',
-'mergehistory-empty' => '無修訂本通合併',
-'mergehistory-success' => '[[:$1]]的{{PLURAL:$3|篇|篇}}修訂本已經成功合併到[[:$2]]。',
-'mergehistory-fail' => '無法度進行歷史的合併,請重新檢查彼頁佮時間參數。',
-'mergehistory-no-source' => '無$1這个來源頁',
-'mergehistory-no-destination' => '無$1這个目標頁',
-'mergehistory-invalid-source' => '來源頁愛有一个有效的標題',
-'mergehistory-invalid-destination' => '目標頁愛有一个有效的標題',
-'mergehistory-autocomment' => '已經合併[[:$1]]到[[:$2]]',
-'mergehistory-comment' => '已經合併[[:$1]]到[[:$2]]: $3',
-'mergehistory-same-destination' => '來源頁佮目標頁袂使相仝',
-'mergehistory-reason' => '理由:',
-
-# Merge log
-'mergelog' => '合併記錄',
-'pagemerge-logentry' => '已經共[[$1]]合併到[[$2]] (修訂本到$3)',
-'revertmerge' => '取消合併',
-'mergelogpagetext' => '下跤是最近共一頁的歷史合併到另一个的列表',
 
 # Diffs
-'history-title' => '改"$1"的歷史',
-'difference' => '(Bô kâng pán-pún ê cheng-chha)',
-'difference-multipage' => '(頁中間的精差)',
 'lineno' => 'Tē $1 chōa:',
 'compareselectedversions' => 'Pí-phēng soán-te̍k ê pán-pún',
-'showhideselectedversions' => '顯示/隱藏 選定的修訂版本',
 'editundo' => 'chhú-siau',
-'diff-multi' => '(由{{PLURAL:$2|个用者|$2个用者}}的{{PLURAL:$1|一个中央修訂本|$1个中央修訂本}}無顯示)',
-'diff-multi-manyusers' => '({{PLURAL:$2|个用者|$2个用者}}的{{PLURAL:$1|一个中途修訂本|$1个中途修訂本}}無顯示)',
 
 # Search results
 'searchresults' => 'Kiám-sek kiat-kó',
 'searchresults-title' => 'Chhoé "$1" ê kiat-kó',
 'searchresulttext' => 'Koan-hē kiám-sek {{SITENAME}} ê siông-sè pō·-sò·, chhiáⁿ chham-khó [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => '揣\'\'\'[[:$1]]\'\'\'([[Special:Prefixindex/$1|所有以 "$1" 做頭的頁]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|所有連結到 "$1" 的頁]])',
-'searchsubtitleinvalid' => '揣"$1"',
-'toomanymatches' => '揣著傷濟,請試另外一款方式',
 'titlematches' => 'Phiau-tê ū-tùi ê bûn-chiuⁿ',
 'notitlematches' => 'Bô sio-tùi ê ia̍h-piau-tê',
 'textmatches' => 'Lōe-iông ū-tùi ê bûn-chiuⁿ',
 'notextmatches' => 'Bô sio-tùi ê bûn-chiuⁿ lōe-iông',
 'prevn' => 'chêng {{PLURAL:$1|$1}} hāng',
 'nextn' => 'āu {{PLURAL:$1|$1}} hāng',
-'prevn-title' => '前$1个{{PLURAL:$1|結果|結果}}',
-'nextn-title' => '後$1个{{PLURAL:$1|結果|結果}}',
 'shown-title' => 'Múi ia̍h hián-sī $1 {{PLURAL:$1|kiat-kó|kiat-kó}}',
 'viewprevnext' => 'Khoàⁿ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => '搜揣的選項',
-'searchmenu-exists' => "'''佇這个wiki遐,有一个頁叫做「[[:$1]]」'''",
-'searchmenu-new' => "'''佇這个 wiki建立「[[:$1]]」這个頁!'''",
 'searchhelp-url' => 'Help:Bo̍k-lio̍k',
-'searchmenu-prefix' => '[[Special:PrefixIndex/$1|看頁標題頭前相仝的頁]]',
 'searchprofile-articles' => 'Loē-iông ia̍h',
-'searchprofile-project' => '幫助佮事工頁',
 'searchprofile-images' => 'To-mûi-thé',
 'searchprofile-everything' => 'Só͘-ū ê',
 'searchprofile-advanced' => 'chìn-chi̍t-pō͘',
 'searchprofile-articles-tooltip' => 'Tī $1 chhoé',
-'searchprofile-project-tooltip' => '揣$1內底的',
 'searchprofile-images-tooltip' => 'Chhoé tóng-àn',
-'searchprofile-everything-tooltip' => '搜索全部(包括討論頁)',
-'searchprofile-advanced-tooltip' => '佇自定的名空間中搜揣',
-'search-result-size' => '$1 ({{PLURAL:$2|1 jī-goân|$2 jī-goân}})',
-'search-result-category-size' => '{{PLURAL:$1|一个成員|$1成員}} ({{PLURAL:$2|一个下類別|$2个下類別}},{{PLURAL:$3|一个檔案|$3个檔案}})',
-'search-result-score' => '相關度: $1%',
-'search-redirect' => '(改向 $1)',
 'search-section' => '(toān-lo̍h $1)',
-'search-suggest' => '你是欲:$1',
-'search-interwiki-caption' => '姊妹事工',
-'search-interwiki-default' => '$1項結果:',
-'search-interwiki-more' => '(閣有)',
-'search-mwsuggest-enabled' => '有建議',
-'search-mwsuggest-disabled' => '無建議',
-'search-relatedarticle' => '相關的',
-'mwsuggest-disable' => '停掉AJAX的建議',
-'searcheverything-enable' => '揣所有的名空間',
-'searchrelated' => '相關的',
 'searchall' => 'choân-pō·',
-'showingresults' => "Ē-kha tùi #'''$2''' khai-sí hián-sī {{PLURAL:$1| hāng| hāng}} kiat-kó.",
-'showingresultsnum' => "Ē-kha tùi #'''$2''' khai-sí hián-sī {{PLURAL:$3| hāng| hāng}} kiat-kó.",
-'showingresultsheader' => "對'''$4'''的{{PLURAL:$5|第'''$1'''到第'''$3'''項結果|第'''$1 - $2'''項,總共'''$3'''項結果}}",
-'nonefound' => "'''注意''':只有一寡名空間是預設會去揣。試''all:''去揣所有的頁(包括討論頁、枋模等等),抑是頭前指定名空間。",
-'search-nonefound' => '揣無欲愛的',
+'showingresults' => 'Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.',
+'showingresultsnum' => 'Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$3</b> hāng kiat-kó.',
 'powersearch' => 'Kiám-sek',
 'powersearch-legend' => 'Kiám-sek',
-'powersearch-ns' => '佇下跤的名空間揣:',
-'powersearch-redir' => '轉頁清單',
-'powersearch-field' => '揣',
-'powersearch-togglelabel' => '選定:',
-'powersearch-toggleall' => '所有的',
-'powersearch-togglenone' => '無',
-'search-external' => '外部的搜揣',
-'searchdisabled' => '{{SITENAME}}因為性能方面的原因,全文搜揣已經暫時停用。你會使暫時透過Google搜揣。請注意怹的索引可能過時。',
 
 # Quickbar
 'qbsettings' => 'Quickbar ê siat-tēng',
-'qbsettings-none' => '無',
-'qbsettings-fixedleft' => '倒手爿固定',
-'qbsettings-fixedright' => '正手爿固定',
-'qbsettings-floatingleft' => '倒手爿無固定',
-'qbsettings-floatingright' => '正手爿無固定',
-'qbsettings-directionality' => '固定,照你話語文字的方向。',
 
 # Preferences page
 'preferences' => 'Siat-tēng',
 'mypreferences' => 'Góa ê siat-tēng',
-'prefs-edits' => '編輯幾擺:',
 'prefsnologin' => 'Bô teng-ji̍p',
-'prefsnologintext' => 'Lí it-tēng ài <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} teng-ji̍p]</span> chiah ē-tàng chhiâu iōng-chiá ê siat-tēng.',
+'prefsnologintext' => 'Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] chiah ē-tàng chhiâu iōng-chiá ê siat-tēng.',
 'changepassword' => 'Oāⁿ bi̍t-bé',
 'prefs-skin' => 'Phôe',
 'skin-preview' => 'Chhì khoàⁿ',
 'datedefault' => 'Chhìn-chhái',
-'prefs-beta' => 'Beta版功能',
 'prefs-datetime' => 'Ji̍t-kî kap sî-kan',
-'prefs-labs' => '試驗中的功能',
 'prefs-personal' => 'Iōng-chiá chu-liāu',
 'prefs-rc' => 'Chòe-kīn ê kái-piàn & stub ê hián-sī',
 'prefs-watchlist' => 'Kàm-sī-toaⁿ',
 'prefs-watchlist-days' => 'Kàm-sī-toaⁿ hián-sī kúi kang lāi--ê:',
-'prefs-watchlist-days-max' => '上濟$1 {{PLURAL:$1|工|工}}',
 'prefs-watchlist-edits' => 'Khok-chhiong ê kàm-sī-toaⁿ tio̍h hián-sī kúi hāng pian-chi̍p:',
-'prefs-watchlist-edits-max' => '上大的數目:1000',
-'prefs-watchlist-token' => '監視列表的密鑰:',
 'prefs-misc' => 'Kî-thaⁿ ê siat-tēng',
-'prefs-resetpass' => '改密碼',
-'prefs-changeemail' => '改電子批的地址',
-'prefs-setemail' => '設定一个電子批地址',
-'prefs-email' => '電子批的選項',
-'prefs-rendering' => '外觀',
 'saveprefs' => 'Pó-chûn siat-tēng',
 'resetprefs' => 'Têng siat-tēng',
-'restoreprefs' => '全部攏恢復做設便的',
 'prefs-editing' => 'Pian-chi̍p',
-'prefs-edit-boxsize' => '編輯框的寸尺',
 'rows' => 'Chōa:',
 'columns' => 'Nôa',
 'searchresultshead' => 'Chhiau-chhōe kiat-kó ê siat-tēng',
 'resultsperpage' => '1 ia̍h hián-sī kúi kiāⁿ:',
-'stub-threshold' => '<a href="#" class="stub">短頁連結</a>的門檻值 (位元組):',
-'stub-threshold-disabled' => '莫用',
 'recentchangesdays' => 'Hián-sī kúi ji̍t chòe-kīn ê kái-piàn:',
 'recentchangesdays-max' => 'siōng-choē $1 {{PLURAL:$1|kang|kang}}',
-'recentchangescount' => 'Beh hián-sī kúi tiâu chòe-kīn kái--ê:',
-'prefs-help-recentchangescount' => '這包括最近改的、頁的歷史佮記錄',
-'prefs-help-watchlist-token' => '佇這个欄位加入一个密鑰,伊佇你訂看監視清單 RSS內底嘛會產生。
-任何人若知影這个欄位的密鑰,就會當看你的監視清單,請選一个安全的數字。
-遮有一个隨意產生的數字你通用:$1',
+'recentchangescount' => 'Hián-sī kúi tiâu chòe-kīn ê kái-piàn:',
 'savedprefs' => 'Lí ê iōng-chiá siat-tēng í-keng pó-chûn khí lâi ah.',
 'timezonelegend' => 'Sî-khu',
-'localtime' => 'Chāi-tē sî-kan sī:',
-'timezoneuseserverdefault' => '使用Wiki設便的($1)',
-'timezoneuseoffset' => '其他 (指定偏差量)',
-'timezoneoffset' => 'Sî-chha¹:',
-'servertime' => 'Server sî-kan hiān-chāi sī:',
+'localtime' => 'Chāi-tē sî-kan sī',
+'timezoneoffset' => 'Sî-chha¹',
+'servertime' => 'Server sî-kan hiān-chāi sī',
 'guesstimezone' => 'Tùi liû-lám-khì chhau--lâi',
-'timezoneregion-africa' => '非洲',
-'timezoneregion-america' => '美洲',
-'timezoneregion-antarctica' => '南極洲',
-'timezoneregion-arctic' => '北極',
-'timezoneregion-asia' => '亞洲',
-'timezoneregion-atlantic' => '大西洋',
-'timezoneregion-australia' => '澳洲',
-'timezoneregion-europe' => '歐洲',
-'timezoneregion-indian' => '印度洋',
-'timezoneregion-pacific' => '太平洋',
 'allowemail' => 'Ún-chún pa̍t-ê iōng-chiá kià email kòe-lâi',
-'prefs-searchoptions' => '搜揣的選項',
-'prefs-namespaces' => '名空間',
 'defaultns' => 'Tī chiah ê miâ-khong-kan chhiau-chhōe:',
-'default' => '設便',
 'prefs-files' => 'Tóng-àn',
-'prefs-custom-css' => ' 家己設的CSS',
-'prefs-custom-js' => ' 家己設的JavaScript',
-'prefs-common-css-js' => '共 CSS/JavaScript 分享佇所有的外觀:',
-'prefs-reset-intro' => '你會當用這頁去改做原本設便的。
-這个動作無法度取消。',
-'prefs-emailconfirm-label' => '電子批的確定:',
-'prefs-textboxsize' => '編輯框的大細',
 'youremail' => 'Lí ê email:',
-'username' => '用者名稱:',
-'uid' => '用者編號:',
-'prefs-memberingroups' => '{{PLURAL:$1|這陣人|這陣人}}的成員:',
-'prefs-registration' => '註冊時間:',
 'yourrealname' => 'Lí ê chin miâ:',
 'yourlanguage' => 'Kài-bīn gú-giân:',
-'yourvariant' => '頁內容的語文:',
-'prefs-help-variant' => '你希望這个Wiki的內容顯示的時陣所使用的語文',
 'yournick' => 'Lí ê sió-miâ (chhiam-miâ iōng):',
-'prefs-help-signature' => '佇討論頁的評論應該愛用「<nowiki>~~~~</nowiki>」簽名,彼會轉變做你的簽名佮戳印一个時間。',
-'badsig' => '錯誤的原始簽名,
-請檢查HTML標籤。',
-'badsiglength' => '你的簽名傷過長,
-伊的長度袂使超過{{PLURAL:$1|个|个}}字元。',
-'yourgender' => '性別:',
-'gender-unknown' => '無表明',
-'gender-male' => '查埔',
-'gender-female' => '查某',
-'prefs-help-gender' => '選項:用佇軟體的性別指定,
-這項資料會公開。',
-'email' => '電子批',
-'prefs-help-realname' => '你的真實名字無一定愛,
-若你欲提供,伊會附佇你貢 獻的作品。',
 'prefs-help-email' => 'Tiān-chú-phoe ê chū-chí m̄-sī it-tēng ài, m̄-koh tī lí bē-kì bi̍t-bé beh tîng siat-tīng tō ài.',
 'prefs-help-email-others' => 'Lí ē-sái thàu--koè lí ê ia̍h , thó-lūn-ia̍h ê liân kiat hō͘ lâng ēng e-mail kah lí liân-lo̍k.
 Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--lâi.',
-'prefs-help-email-required' => '愛有電子批地址',
-'prefs-info' => '基本資料',
-'prefs-i18n' => '國際化',
-'prefs-signature' => '簽名',
-'prefs-dateformat' => '顯示日期的規格',
-'prefs-timeoffset' => '佮標準時間的偏差',
-'prefs-advancedediting' => '進一步的選項',
-'prefs-advancedrc' => '進一步的選項',
-'prefs-advancedrendering' => '進一步的選項',
-'prefs-advancedsearchoptions' => '進一步的選項',
-'prefs-advancedwatchlist' => '進一步的選項',
-'prefs-displayrc' => '顯示的選項',
-'prefs-displaysearchoptions' => '顯示的選項',
-'prefs-displaywatchlist' => '顯示的選項',
-'prefs-diffs' => '精差',
-
-# User preference: e-mail validation using jQuery
-'email-address-validity-valid' => '電子批地址看起來是有效的',
-'email-address-validity-invalid' => '拍一个有效的電子批地址',
-
-# User rights
-'userrights' => '用者的權限管理',
-'userrights-lookup-user' => '管理用者的分組',
-'userrights-user-editname' => '輸入一个用者名稱:',
-'editusergroup' => '設定用者的分組',
-'editinguser' => "改用者'''[[User:$1|$1]]'''$2 的使用權利",
-'userrights-editusergroup' => '設定用者的分組',
-'saveusergroups' => '保存用者的分組',
-'userrights-groupsmember' => '成員:',
-'userrights-groupsmember-auto' => '自本的成員:',
-'userrights-groups-help' => '你會當改用者所屬的分組:
-* 頭前有勾起來的代表用者屬的分組
-* 頭前無勾起來的代表用者無屬彼个分組
-* 有 * 的項目,表示你會當加,袂當共減倒轉來,抑是會當共減,袂當共加倒轉來',
-'userrights-reason' => '理由:',
-'userrights-no-interwiki' => '你無權去設定其它wiki上的用者權利。',
-'userrights-nodatabase' => '無$1資料庫抑是非本地的',
-'userrights-nologin' => '你愛管理員的口座[[Special:UserLogin|登入]]了後,才會當指定用者權利。',
-'userrights-notallowed' => '你口座的無授權你會當加添用者權利',
-'userrights-changeable-col' => '你會當改的分組',
-'userrights-unchangeable-col' => '你袂當改的分組',
-
-# Groups
-'group' => '分組:',
-'group-user' => '用者:',
-'group-autoconfirmed' => '自動確認的用者',
-'group-bot' => '機器人',
-'group-sysop' => '管理員',
-'group-bureaucrat' => '行政人員',
-'group-suppress' => '監督',
-'group-all' => '(全部)',
-
-'group-user-member' => '{{GENDER:$1|用者}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|自動確認的用者}}',
-'group-bot-member' => '{{GENDER:$1|機器人}}',
-'group-sysop-member' => '{{GENDER:$1|管理員}}',
-'group-bureaucrat-member' => '{{GENDER:$1|監督人員}}',
-'group-suppress-member' => '{{GENDER:$1|監督}}',
-
-'grouppage-user' => '{{ns:project}}:用者',
-'grouppage-autoconfirmed' => '{{ns:project}}:自動確認的用者',
-'grouppage-bot' => '{{ns:project}}:機器人',
+
 'grouppage-sysop' => '{{ns:project}}:Hêng-chèng jîn-oân',
-'grouppage-bureaucrat' => '{{ns:project}}:行政人員',
-'grouppage-suppress' => '{{ns:project}}:監督',
-
-# Rights
-'right-read' => '看頁',
-'right-edit' => '改頁',
-'right-createpage' => '開新頁(無包括討論頁)',
-'right-createtalk' => '開新討論頁',
-'right-createaccount' => '開新用者口座',
-'right-minoredit' => '標示做小編輯',
-'right-move' => '徙頁',
-'right-move-subpages' => '徙頁,連伊的次頁',
-'right-move-rootuserpages' => '徙用者root的頁',
-'right-movefile' => '徙檔案',
-'right-suppressredirect' => '徙頁的時陣,無共原本的頁改做轉頁',
-'right-upload' => '上載檔案',
-'right-reupload' => '取代原本的檔案',
-'right-reupload-own' => '取代別人上載的原本檔案',
-'right-reupload-shared' => '莫用共用媒體檔案庫上的檔案',
-'right-upload_by_url' => '對一个網址(URL)上載檔案',
-'right-purge' => '直接清掉網站頁的cache,毋免閣確定',
-'right-autoconfirmed' => '編輯半保護的頁',
-'right-bot' => '看做是一个自動程序',
-'right-nominornewtalk' => '佇討論頁的小編輯無發新訊息',
-'right-apihighlimits' => '佇API查詢的時陣,用較懸的限制量',
-'right-writeapi' => '用API編寫',
-'right-delete' => '刣頁',
-'right-bigdelete' => '刣掉頁的誠濟歷史',
-'right-deleterevision' => '刣掉佮取消刣掉頁的指定修訂本',
-'right-deletedhistory' => '看已經刣掉的歷史項目,無包括相關的文本',
-'right-deletedtext' => '看已經刣掉修訂本當中,刣掉的文字佮變化',
-'right-browsearchive' => '揣刣掉的頁',
-'right-undelete' => '共刣掉的頁救倒轉來',
-'right-suppressrevision' => '恢復由管理員隱藏掉的修訂本',
-'right-suppressionlog' => '看私人的記錄',
-'right-block' => '封鎖其他用者,予怹袂當編輯',
-'right-blockemail' => '封鎖一个用者,予伊袂當寄電子批',
-'right-hideuser' => '封鎖一个用者名稱,無對大眾公開',
-'right-ipblock-exempt' => '跳過IP封鎖、自動封鎖佮範圍封鎖',
-'right-proxyunbannable' => '跳過Proxy的自動封鎖',
-'right-unblockself' => '取消怹的封鎖',
-'right-protect' => '改保護層級而且編輯hông保護的頁',
-'right-editprotected' => '編輯保護中的頁(無連鎖保護)',
-'right-editinterface' => '編輯用者介面',
-'right-editusercssjs' => '編輯其他用者的CSS佮JavaScript檔案',
-'right-editusercss' => '編輯其他用者的CSS檔案',
-'right-edituserjs' => '編輯其他用者的JavaScript檔案',
-'right-rollback' => '共某一頁的頂一个用戶所做的編輯鉸轉去',
-'right-markbotedits' => '共復原編輯標示做機械人編輯',
-'right-noratelimit' => '無受著頻率限制的影響',
-'right-import' => '對別个Wiki匯入頁',
-'right-importupload' => '對一个上載檔案匯入頁',
-'right-patrol' => '共其它的編輯攏標示做已巡過',
-'right-autopatrol' => '家己的編輯自動標示做巡過',
-'right-patrolmarks' => '看最近巡查編輯的標記',
-'right-unwatchedpages' => '看頁無人監視的清單',
-'right-mergehistory' => '相佮一寡頁的歷史',
-'right-userrights' => '編輯所有用者的權利限制',
-'right-userrights-interwiki' => '編輯對其它wiki來的用者權限',
-'right-siteadmin' => '封鎖閣開鎖資料庫',
-'right-override-export-depth' => '輸出頁,包括連到的頁到5層深',
-'right-sendemail' => '寄電子批予其他用者',
-'right-passwordreset' => '看重設密碼的電子批',
 
 # User rights log
-'rightslog' => '用者使用權記錄',
 'rightslogtext' => 'Chit-ê log lia̍t-chhut kái-piàn iōng-chiá koân-lī ê tōng-chok.',
-'rightslogentry' => '共 $1 的權利限制對 $2 改做 $3',
-'rightslogentry-autopromote' => '自動對$2提升至$3',
-'rightsnone' => '(無)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read' => '看這頁',
 'action-edit' => 'Siu-kái chit ia̍h',
-'action-createpage' => '開新頁',
-'action-createtalk' => '開討論頁',
-'action-createaccount' => '開這个用者口座',
-'action-minoredit' => '標示做小編輯',
-'action-move' => '徙這頁',
-'action-move-subpages' => '徙這頁,佮伊的次頁',
-'action-move-rootuserpages' => '徙用者root的頁',
-'action-movefile' => '徙這个檔案',
-'action-upload' => '上載這个檔案',
-'action-reupload' => '取代原本的檔案',
-'action-reupload-shared' => '莫用共用媒體檔案庫面頂的檔案',
-'action-upload_by_url' => '對一个網址(URL)上載這个檔案',
-'action-writeapi' => '使用API編寫',
-'action-delete' => '刣掉這頁',
-'action-deleterevision' => '刣掉這个修訂本',
-'action-deletedhistory' => '看這頁予人刣掉的歷史',
-'action-browsearchive' => '揣刣掉的頁',
-'action-undelete' => '共刣掉的頁救倒轉來',
-'action-suppressrevision' => '看而且取消這个藏起來的修訂本',
-'action-suppressionlog' => '看這个私人記錄',
-'action-block' => '封鎖這个用者,予伊袂當編輯',
-'action-protect' => '改這頁的保護層級',
-'action-rollback' => '共某一頁的頂一个用戶所做的編輯鉸轉去',
-'action-import' => '對別个Wiki匯入這頁',
-'action-importupload' => '對一个上載檔案匯入這頁',
-'action-patrol' => '標示其它的編輯是巡過的',
-'action-autopatrol' => '你的編輯標示做已巡查過',
-'action-unwatchedpages' => '看無予人監視的頁列單',
-'action-mergehistory' => '相佮這頁的歷史',
-'action-userrights' => '編輯所有用者的權限',
-'action-userrights-interwiki' => '編輯對其它wiki來的用者權限',
-'action-siteadmin' => '封鎖抑開鎖資料庫',
-'action-sendemail' => '寄電子批',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|kái|kái}}',
 'recentchanges' => 'Chòe-kīn ê kái-piàn',
-'recentchanges-legend' => '最近編輯的選項',
-'recentchangestext' => '佇這頁,看阮這个Wiki最近改的',
-'recentchanges-feed-description' => '訂看這个Wiki最近改的',
 'recentchanges-label-newpage' => 'Chit ê siu-kái ē sán-seng sin ia̍h',
 'recentchanges-label-minor' => 'Che sī sió siu-kái',
-'recentchanges-label-bot' => '這个編輯是機器人做的',
-'recentchanges-label-unpatrolled' => '這个編輯猶未巡過',
-'rcnote' => "下面是佇$4 $5,最近{{PLURAL:$2|工|'''$2'''工}}內的{{PLURAL:$1|'''1'''改|頂'''$1'''改}}修改記錄。",
 'rcnotefrom' => 'Ē-kha sī <b>$2</b> kàu taⁿ ê kái-piàn (ke̍k-ke hián-sī <b>$1</b> hāng).',
 'rclistfrom' => 'Hián-sī tùi $1 kàu taⁿ ê sin kái-piàn',
 'rcshowhideminor' => '$1 sió siu-kái',
-'rcshowhidebots' => '$1機器人所做的',
 'rcshowhideliu' => '$1 teng-ji̍p ê iōng-chiá',
 'rcshowhideanons' => '$1 bû-bêng-sī',
-'rcshowhidepatr' => '$1巡過的編輯',
 'rcshowhidemine' => '$1 góa ê pian-chi̍p',
 'rclinks' => 'Hían-sī $2 ji̍t lāi siōng sin ê $1 hāng kái-piàn<br />$3',
 'diff' => 'Cheng-chha',
@@ -1340,276 +653,45 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 'minoreditletter' => '~',
 'newpageletter' => '!',
 'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1个愛注意的{{PLURAL:$1|用者|用者}}]',
-'rc_categories' => '分類界線(以"|"分開)',
-'rc_categories_any' => '任何',
-'rc-change-size-new' => '改了後有$1 {{PLURAL:$1|字元|字元}} 。',
-'newsectionsummary' => '/* $1 */ 新段落',
-'rc-enhanced-expand' => '看內容(愛有JavaScript)',
-'rc-enhanced-hide' => '藏內容',
-'rc-old-title' => '原本用"$1"開頁',
 
 # Recent changes linked
 'recentchangeslinked' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-feed' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-toolbox' => 'Siong-koan ê kái-piàn',
-'recentchangeslinked-title' => '佮「$1」有關係的修改',
 'recentchangeslinked-noresult' => 'Lí chí-tēng ê tiâu-kiaⁿ lāi-té chhōe bô jīn-hô kái-piàn.',
-'recentchangeslinked-summary' => "這是佮指定的頁面有連結、閣最近有改過的別頁清單(抑是指定分類的成員)。
-佇[[Special:Watchlist|你的監視單]]內底的頁會用'''粗體'''顯示。",
-'recentchangeslinked-page' => 'Ia̍h ê miâ:',
-'recentchangeslinked-to' => '顯示另外拍入頁伊的相關修改',
 
 # Upload
 'upload' => 'Kā tóng-àn chiūⁿ-bāng',
 'uploadbtn' => 'Kā tóng-àn chiūⁿ-bāng',
 'reuploaddesc' => 'Tò khì sàng-chiūⁿ-bāng ê pió.',
-'upload-tryagain' => '送出改過了後的檔案描述',
 'uploadnologin' => 'Bô teng-ji̍p',
 'uploadnologintext' => 'Bô [[Special:UserLogin|teng-ji̍p]] bē-sái-tit kā tóng-àn sàng-chiūⁿ-bāng.',
-'upload_directory_missing' => '無上傳的目錄($1),彼袂當由網頁伺服器建立。',
-'upload_directory_read_only' => '無上載目錄($1),抑是網頁伺服器無權寫入',
 'uploaderror' => 'Upload chhò-gō·',
-'upload-recreate-warning' => "'''注意:一个仝名的檔案捌hông刣掉抑是徙去別位。'''
-
-這頁有刣掉佮徙走的記錄通參考:",
-'uploadtext' => "用下跤的表來共檔案上載。
-若欲看抑是揣往過上載的檔案,會使進入[[Special:FileList|檔案上載清單]],(重)上載嘛會記錄佇[[Special:Log/upload|上傳記錄]],若刣掉就會記錄佇[[Special:Log/delete|刪除記錄]]。
-
-若欲佇頁加入檔案,用下跤的一種方式來連結:
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用檔案的完整版本
-* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替換文字]]</nowiki></tt>'''用一个囥佇倒爿的一个200 像素圖相框,「替換文字」做說明
-* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接連結到檔案,毋過無顯示檔案",
-'upload-permitted' => '准許的檔案類型: $1',
-'upload-preferred' => '建議的檔案類型: $1',
-'upload-prohibited' => '禁止的檔案類型: $1。',
-'uploadlog' => '上載記錄',
-'uploadlogpage' => '上載記錄',
 'uploadlogpagetext' => 'Í-hā sī chòe-kīn sàng-chiūⁿ-bāng ê tóng-àn ê lia̍t-toaⁿ.',
 'filename' => 'Tóng-àn',
 'filedesc' => 'Khài-iàu',
 'fileuploadsummary' => 'Khài-iàu:',
-'filereuploadsummary' => '改換檔案的說明:',
-'filestatus' => '版權狀況:',
-'filesource' => '來源:',
 'uploadedfiles' => 'Tóng-àn í-keng sàng chiūⁿ-bāng',
 'ignorewarning' => 'Mài chhap kéng-kò, kā tóng-àn pó-chûn khí lâi.',
 'ignorewarnings' => 'Mài chhap kéng-kò',
-'minlength1' => '檔案的名上少愛有一字',
-'illegalfilename' => '檔案名“$1”有袂用得用佇標題的字,
-請改名了後重新上載。',
-'filename-toolong' => '檔案的名長度袂使超過240位元組',
 'badfilename' => 'Iáⁿ-siōng ê miâ í-keng kái chò "$1".',
-'filetype-mime-mismatch' => '副檔名 ".$1" 佮 ($2)的MIME類型無合。',
-'filetype-badmime' => 'MIME類別"$1"的檔案袂當上載',
-'filetype-bad-ie-mime' => '袂當上載這个檔案,因為 Internet Explorer 會共伊偵測做 "$1",彼種袂使,可能是有所危害的檔案類型。',
-'filetype-unwanted-type' => "'''\".\$1\"'''是袂當上載的檔案類型,
-適當的{{PLURAL:\$3|檔案類型|檔案類型}}是\$2。",
-'filetype-banned-type' => "    '''「.$1」'''{{PLURAL:$4|毋是會用得的檔案類型|毋是會用得的檔案類型}}。 
-會用得的{{PLURAL:$3|檔案類型|檔案類型}} $2。",
-'filetype-missing' => '彼个檔案名稱無副檔名 (親像 ".jpg")。',
-'empty-file' => '你送出來的檔案是空的',
-'file-too-large' => '你送出來的檔案傷過大',
-'filename-tooshort' => '檔案名傷短',
-'filetype-banned' => '這類的檔案被禁止',
-'verification-error' => '這个檔案無通過驗證',
-'hookaborted' => '你欲做的編輯因為擴展鈎(extension hook)去跳開。',
-'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]]",
-'filepageexists' => "這个檔案的描述頁已經佇'''<tt>[[:$1]]</tt>'''建立,毋過這个名稱的檔案猶未有,
-你所輸入的概要袂顯示佇彼个描述頁當中,若欲概要佇遐看會著,你愛手動編輯。
-[[$1|thumb]]",
-'fileexists-extension' => "一个親像檔名的檔案已經佇咧: [[$2|thumb]]
-* 上載檔案的檔名: '''<tt>[[:$1]]</tt>'''
-* 這馬檔案的檔名: '''<tt>[[:$2]]</tt>'''
-請選一个無仝的名。",
-'fileexists-thumbnail-yes' => "這个檔案若親像是一幅圖的縮小版本''(縮圖)''。 [[$1|thumb]]
-請檢查檔案'''<tt>[[:$1]]</tt>''',
-若檢查的檔案是仝幅圖的縮圖,就毋免閣上載一幅縮圖。",
-'file-thumbnail-no' => "以'''<tt>$1</tt>'''做名的檔案,
-伊敢若是某幅圖的縮小版本''(縮圖)''。
-你欲就上載完整大小的版本,若無請改檔案名稱。",
-'fileexists-forbidden' => '已經有一个仝名的檔案,而且袂檔覆寫,
-若你欲上載你的檔案,請退倒轉去,閣用一个新名來。
-[[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => '已經有一个仝名的檔案佇分享檔案庫,
-若你欲上載你的檔案,請退倒轉去,閣用一个新名來。
-[[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => '這个檔案佮下跤的{{PLURAL:$1|个檔案|个檔案}}是仝款的:',
-'file-deleted-duplicate' => '一个仝名的檔案 ([[:$1]]) 佇進前捌予人刣掉,
-你應當佇欲閣重新上載進前,先檢查彼个檔案的刣掉記錄。',
 'uploadwarning' => 'Upload kéng-kò',
-'uploadwarning-text' => '請改下跤的檔案描述才閣試',
 'savefile' => 'Pó-chûn tóng-àn',
 'uploadedimage' => 'thoân "[[$1]]" chiūⁿ-bāng',
-'overwroteimage' => '已經上載「[[$1]]」的新版本',
 'uploaddisabled' => 'Pháiⁿ-sè, sàng chiūⁿ-bāng ê kong-lêng bô khui.',
-'copyuploaddisabled' => '袂當透過網址上載',
-'uploadfromurl-queued' => '你的上載已經咧排隊',
-'uploaddisabledtext' => '袂當上載檔案',
-'php-uploaddisabledtext' => '佇PHP袂當上載檔案,
-請檢查file_uploads 設定。',
-'uploadscripted' => '這个檔案內底有HTML抑是腳本代碼,網路瀏覽器可能會錯誤翻譯。',
-'uploadvirus' => '彼个檔案有一个病毒!
-細情:$1',
-'uploadjava' => '彼个檔案是有 Java  .class 的 ZIP 檔案,
-袂當上載 Java 檔案,是因為怹可能會閃過系統安全關卡。',
-'upload-source' => '來源檔案',
 'sourcefilename' => 'Tóng-àn goân miâ:',
-'sourceurl' => '來源網址(URL):',
 'destfilename' => 'Tóng-àn sin miâ:',
-'upload-maxfilesize' => '檔案上大:$1',
-'upload-description' => '檔案說明',
-'upload-options' => '上載選項',
-'watchthisupload' => 'Kàm-sī chit ê tóng-àn',
-'filewasdeleted' => '進前有上載一个仝名的檔案,而且後來予人刣掉,
-佇欲閣上載進前,你應該先檢查$1。',
-'filename-bad-prefix' => "你上載的檔案名是以'''「$1」'''做頭,這一般是數位相機自動編的,彼無啥意義,
-請替你的檔案號一个較有意義的名。",
+'watchthisupload' => 'Kàm-sī chit ia̍h',
 'upload-success-subj' => 'Sàng-chiūⁿ-bāng sêng-kong',
-'upload-success-msg' => '你對[$2]遐的上載已經成功,伊佇:[[:{{ns:file}}:$1]]',
-'upload-failure-subj' => '上載問題',
-'upload-failure-msg' => '你[$2]的上載出現問題:
-
-$1',
-'upload-warning-subj' => '上載警示',
-'upload-warning-msg' => '你對[$2]遐的上載出問題,你會當回轉去[[Special:Upload/stash/$1|上載表]]修改問題。',
-
-'upload-proto-error' => '毋著的協議(protocol)',
-'upload-proto-error-text' => '遠程上載愛網址(URL)是以 <code>http://</code> 抑 <code>ftp://</code> 做頭。',
-'upload-file-error' => '內部的錯誤',
-'upload-file-error-text' => '佇伺服器欲開一个臨時檔案的時陣,發生一个內部錯誤,
-請佮[[Special:ListUsers/sysop|管理員]]聯絡。',
-'upload-misc-error' => '毋知原因的上載錯誤',
-'upload-misc-error-text' => '佇上載的時陣發生錯誤,毋知啥原因。
-請確認網址(URL)是正確的,了才閣試。
-若猶閣有問題,請聯絡[[Special:ListUsers/sysop|管理員]]。',
-'upload-too-many-redirects' => '網址(URL)包傷濟个轉向',
-'upload-unknown-size' => '大小毋知',
-'upload-http-error' => '發生一个HTTP錯誤:$1',
-'upload-copy-upload-invalid-domain' => '無開放對這个網站(domain)上載檔案。',
 
 # File backend
-'backend-fail-stream' => '無法度串流檔案$1',
-'backend-fail-backup' => '無法度備份檔案$1',
-'backend-fail-notexists' => '無$1這个檔案',
-'backend-fail-hashes' => '無法度讀著檔案散列值(hashe)通比並',
-'backend-fail-notsame' => '已經有$1仝名、無仝款的檔案。',
-'backend-fail-invalidpath' => '$1這个囥的路徑怪怪',
 'backend-fail-delete' => 'Bô-hoat-tō· kā tóng-àn "$1" thâi tiāu',
-'backend-fail-alreadyexists' => '已經有$1這个檔案。',
-'backend-fail-store' => '無法度恢復佇$2的檔案$1。',
-'backend-fail-copy' => '無法度共佇$1的檔案khop去$2。',
-'backend-fail-move' => '無法度共佇$1的檔案徙去$2。',
-'backend-fail-opentemp' => '無法度建立臨時檔案',
-'backend-fail-writetemp' => '無法度寫入去臨時檔案',
-'backend-fail-closetemp' => '無法度徙掉臨時檔案',
-'backend-fail-read' => '無法度讀$1這个檔案',
-'backend-fail-create' => '無法度建立$1這个檔案。',
-'backend-fail-maxsize' => '無法度建立$1檔案,因為伊超過{{PLURAL:$2|$2位元|$2位元}}。',
-'backend-fail-readonly' => '囥「$1」的位,這馬只會當讀,因為「$2」。',
-'backend-fail-synced' => '"$1"這个檔案佇內部的囥位無一致。',
-'backend-fail-connect' => '無法度連接到囥"$1"的位。',
-'backend-fail-internal' => '囥"$1"的位有一寡問題。',
-'backend-fail-contenttype' => '無法度確定欲囥佇"$1"的檔案內容類型。',
-'backend-fail-batchsize' => '囥位一批$1个檔案
-{{PLURAL:$1|遍動作|遍動作}},上濟$2遍{{PLURAL:$2|動作|動作}}。',
-
-# File journal errors
-'filejournal-fail-dbconnect' => '無法度連接到佇囥位"$1"的資料庫。',
-'filejournal-fail-dbquery' => '無法度更新佇囥位"$1"的資料庫。',
-
-# Lock manager
-'lockmanager-notlocked' => '無法度開鎖"$1",伊無予人封鎖牢咧。',
-'lockmanager-fail-closelock' => '無法度共卡牢咧的檔案 "$1"收起來。',
-'lockmanager-fail-deletelock' => '無法度共卡牢咧的檔案 "$1"刣掉。',
-'lockmanager-fail-acquirelock' => '無法度套牢檔案 "$1"。',
-'lockmanager-fail-openlock' => '無法度開"$1"這个hông套牢的檔案。',
-'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檢查時陣,拄著一个問題。',
-'zip-wrong-format' => '指定的檔案毋是一个ZIP檔案。',
-'zip-bad' => '檔案已經歹去抑是無法度讀的ZIP檔案,
-伊無法正確來檢查,看有妥當無。',
-'zip-unsupported' => '這个是一个 ZIP 檔案,伊用著 MediaWiki 無支持的ZIP功能,
-伊袂當正確檢查看有妥當無。',
-
-# Special:UploadStash
-'uploadstash' => '上載囥位',
-'uploadstash-summary' => '這个頁面提供的檔案已經上載(抑是當咧上載),毋過猶未佇wiki發布,遮的檔案除了上載的用者以外,別人看袂著。',
-'uploadstash-clear' => '清掉囥咧的檔案',
-'uploadstash-nofiles' => '你無囥咧的檔案。',
-'uploadstash-badtoken' => '彼个動作做無成功,可能是你的編輯資料已經過期,請閣試一擺。',
-'uploadstash-errclear' => '欲清掉檔案無成功。',
-'uploadstash-refresh' => '更新檔案清單。',
-'invalid-chunk-offset' => '無效的區位偏移量',
-
-# img_auth script messages
-'img-auth-accessdenied' => '拒絕讀寫',
-'img-auth-nopathinfo' => '欠PATH_INFO,
-你的伺服器無設講免這个資料,
-伊它可能是因為是CGI的,而且不支源img_auth,
-會使參考[https://www.mediawiki.org/wiki/Manual:Image_Authorization 圖片認證。]',
-'img-auth-notindir' => '你欲用的路徑無佇事先設定的上載目錄當中。',
-'img-auth-badtitle' => '無法度對"$1"產生一个有效的標題',
-'img-auth-nologinnWL' => '你猶未登入,"$1"無佇白名單(whitelist)面頂。',
-'img-auth-nofile' => '無"$1"這个檔案',
-'img-auth-isdir' => '你想欲讀目錄"$1",
-毋過只會當讀檔案。',
-'img-auth-streaming' => '當咧串流(streaming)"$1"',
-'img-auth-public' => 'img_auth.php的功能是予私用wiki通輸出檔案,
-這個wiki的設定是一个公共wiki,
-為著安全因素,img_auth.php已經停用。',
-'img-auth-noread' => '用者無授權去讀"$1"',
-'img-auth-bad-query-string' => '網址(URL)有無效的查詢字串',
-
-# HTTP errors
-'http-invalid-url' => '無效的網址(URL):$1',
-'http-invalid-scheme' => '無支援有「$1」的網址(URL)',
-'http-request-error' => 'HTTP請求失敗,毋知啥物原因的錯誤。',
-'http-read-error' => 'HTTP讀了錯誤',
-'http-timed-out' => 'HTTP請求已經超過時間',
-'http-curl-error' => '取網址(URL)的時陣有錯誤:$1',
-'http-host-unreachable' => '連袂到網址(URL)',
-'http-bad-status' => '欲做HTTP的時陣出現問題:$1 $2',
-
-# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6' => '連袂到網址(URL)',
-'upload-curl-error6-text' => '提供的網址(URL)無法連結,
-請確定網址是正確的而且網站有開。',
-'upload-curl-error28' => '上載已經超過時間',
-'upload-curl-error28-text' => '網站的回應傷久,
-請確定彼个網站有開,抑小等一下才閣試,
-你會使佇較閒的時陣才試。',
 
 'license' => 'Siū-khoân:',
 'license-header' => 'Siū-khoân',
-'nolicense' => '無選半項',
-'license-nopreview' => '(袂當先看覓)',
-'upload_source_url' => ' (一个有效閣開放予大眾的網址(URL))',
-'upload_source_file' => '(佇你電腦的一个檔案)',
 
 # Special:ListFiles
-'listfiles-summary' => '這个特殊頁顯示所有上載的檔案,
-若有過濾用者,只有彼个用者上載閣上新的版本才顯示。',
-'listfiles_search_for' => '照檔案名稱揣:',
-'imgfile' => '檔案',
 'listfiles' => 'Iáⁿ-siōng lia̍t-toaⁿ',
-'listfiles_thumb' => '小圖',
 'listfiles_date' => 'Ji̍t-kî',
 'listfiles_name' => 'Miâ',
 'listfiles_user' => 'Iōng-chiá',
@@ -1620,80 +702,14 @@ $1',
 # File description page
 'file-anchor-link' => 'Tóng-àn',
 'filehist' => 'Tóng-àn ê le̍k-sú',
-'filehist-help' => '揤日期/時間就通看彼時陣的檔案',
-'filehist-deleteall' => '全部刣掉',
-'filehist-deleteone' => '刣掉',
-'filehist-revert' => '回轉',
 'filehist-current' => 'hiān-chāi',
 'filehist-datetime' => 'Ji̍t-kî/ Sî-kan',
-'filehist-thumb' => '小圖',
-'filehist-thumbtext' => '細張圖佇$1的版本',
-'filehist-nothumb' => '無小圖',
-'filehist-user' => 'Iōng-chiá',
-'filehist-dimensions' => '長闊',
-'filehist-filesize' => '檔案大細',
-'filehist-comment' => '註釋',
-'filehist-missing' => '檔案無看',
-'imagelinks' => 'Ēng tio̍h ê  tóng-àn',
-'linkstoimage' => 'Ē-bīn ê {{PLURAL:$1|ia̍h liân kàu|$1 ia̍h liân kàu}}  chit ê tóng-àn:',
-'linkstoimage-more' => '超過$1{{PLURAL:$1|頁連接|頁連接}}到這个檔案,
-下跤只是連接到這个檔案的{{PLURAL:$1|頭頁連結|頭$1頁連結}}清單,
-有一个[[Special:WhatLinksHere/$2|全部的清單]]。',
+'imagelinks' => 'Iáⁿ-siōng liân-kiat',
+'linkstoimage' => 'Í-hā ê ia̍h liân kàu chit ê iáⁿ-siōng:',
 'nolinkstoimage' => 'Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.',
-'morelinkstoimage' => '看連接到這个檔案的[[Special:WhatLinksHere/$1|其他連結]]',
-'linkstoimage-redirect' => '$1 (檔案轉向) $2',
-'duplicatesoffile' => '下跤{{PLURAL:$1|个|个}}檔案佮這个仝款([[Special:FileDuplicateSearch/$2|詳細]]):',
-'sharedupload' => '這个檔案是對$1遐來的,伊可能用佇別个事工。',
-'sharedupload-desc-there' => '這个檔案對$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' => '上載這个檔案的新版本',
-'shared-repo-from' => '來自 $1',
-'shared-repo' => '一個共享的檔案庫',
-
-# File reversion
-'filerevert' => '回轉$1',
-'filerevert-legend' => '回轉檔案',
-'filerevert-intro' => "你當咧回轉檔案'''[[Media:$1|$1]]'''到[$4佇$2 $3的版本]。",
-'filerevert-comment' => '理由:',
-'filerevert-defaultcomment' => '已經回轉到$1 $2的版本',
-'filerevert-submit' => '回轉',
-'filerevert-success' => "'''[[Media:$1|$1]]'''已經回轉到[$4 佇$2 $3的版本]。",
-'filerevert-badversion' => '這个檔案所提供的時間截記,無進前的本地版本。',
-
-# File deletion
-'filedelete' => '刣掉$1',
-'filedelete-legend' => '刣掉檔案',
-'filedelete-intro' => "你當咧刣掉檔案'''[[Media:$1|$1]]''',佮伊的歷史。",
-'filedelete-intro-old' => "你當咧刣掉'''[[Media:$1|$1]]'''佇[$4 $2 $3]的版本",
-'filedelete-comment' => '理由:',
-'filedelete-submit' => '刣掉',
-'filedelete-success' => "'''$1'''已經刣掉",
-'filedelete-success-old' => "'''[[Media:$1|$1]]'''佇$2 $3 的版本已經刣掉",
-'filedelete-nofile' => "無'''$1'''這个",
-'filedelete-nofile-old' => "揣無'''$1'''指定的保存版本",
-'filedelete-otherreason' => '其他/另外的理由:',
-'filedelete-reason-otherlist' => '其他理由',
-'filedelete-reason-dropdown' => '*一般刣掉的理由
-** 違反著作權
-** 相仝',
-'filedelete-edit-reasonlist' => '編輯刣掉的理由',
-'filedelete-maintenance' => '佇維護的時陣,暫時袂當刣掉檔案佮救倒轉來檔案。',
-'filedelete-maintenance-title' => '袂當刣掉檔案',
 
 # MIME search
 'mimesearch' => 'MIME chhiau-chhoē',
-'mimesearch-summary' => '這个頁面有用MIME類型的檔案過濾器,
-輸入︰內容類型/次類型,親像 <tt>image/jpeg</tt>。',
-'mimetype' => 'MIME 類型:',
-'download' => '下載',
 
 # Unwatched pages
 'unwatchedpages' => 'Bô lâng kàm-sī ê ia̍h',
@@ -1703,81 +719,40 @@ $1',
 
 # Unused templates
 'unusedtemplates' => 'Bô iōng ê pang-bô·',
-'unusedtemplatestext' => '這个頁面排列出佇{{ns:template}}名空間內底,閣無予別頁面用著的頁。
-請會記得佇刣掉遮的枋模進前,看有別的連接鏈連著。',
-'unusedtemplateswlh' => '其他的連結',
 
 # Random page
 'randompage' => 'Sûi-chāi kéng ia̍h',
-'randompage-nopages' => '下面無頁
-{{PLURAL:$2|名空間|名空間}}:$1.',
 
 # Random redirect
 'randomredirect' => 'Sûi-chāi choán-ia̍h',
-'randomredirect-nopages' => '佇 "$1" 名空間內底無轉向的頁。',
 
 # Statistics
 'statistics' => 'Thóng-kè',
-'statistics-header-pages' => '頁的統計',
-'statistics-header-edits' => '改的統計',
-'statistics-header-views' => '看的統計',
 'statistics-header-users' => 'Iōng-chiá thóng-kè sò·-ba̍k',
-'statistics-header-hooks' => '其他的統計',
-'statistics-articles' => '內容頁',
-'statistics-pages' => '文章',
-'statistics-pages-desc' => '佇Wiki所有的頁,包括討論頁、轉頁等等。',
-'statistics-files' => '上載檔案',
-'statistics-edits' => '自設立{{SITENAME}}以後,對頁的編輯總數',
-'statistics-edits-average' => '每頁的平均編輯數量',
-'statistics-views-total' => '看的總量',
-'statistics-views-total-desc' => '看空頁抑是特殊頁的數量無算在內。',
-'statistics-views-peredit' => '佇編輯的時陣看的數量',
-'statistics-users' => '已經註冊[[Special:ListUsers|用者]]',
-'statistics-users-active' => '猶咧出工的用者',
-'statistics-users-active-desc' => '佇前{{PLURAL:$1|一工|$1工}}有操作過的用者。',
-'statistics-mostpopular' => '上濟人看的頁',
 
 'disambiguations' => 'Khu-pia̍t-ia̍h',
 'disambiguationspage' => 'Template:disambig
 Template:KhPI
 Template:Khu-pia̍t-iah
 Template:Khu-pia̍t-ia̍h',
-'disambiguations-text' => "下面的頁攏有連接到'''區別頁''',
-In應該連接到適當的頁面。<br />一个頁面若有用[[MediaWiki:Disambiguationspage]]內底的枋模,就會算做是區別頁。",
 
 'doubleredirects' => 'Siang-thâu choán-ia̍h',
-'doubleredirectstext' => '這个頁排列出所有轉向去到捌个的轉頁,
-每一列有轉向去第一个佮第二个轉頁的連結,佮第二个轉頁的目標,彼个目標一般著是應該的頁面, 第一个轉向連結應該去的所在。
-<del>拍叉的</del>是已經處理好的項目。',
-'double-redirect-fixed-move' => '[[$1]]已經徙位,
-伊這馬轉去[[$2]]。',
-'double-redirect-fixed-maintenance' => '修改對[[$1]]到[[$2]]的兩擺轉向。',
-'double-redirect-fixer' => '轉向的改向',
 
 'brokenredirects' => 'Choán-ia̍h kò·-chiòng',
 'brokenredirectstext' => 'Í-hā ê choán-ia̍h liân kàu bô chûn-chāi ê ia̍h:',
-'brokenredirects-edit' => '修改',
-'brokenredirects-delete' => '刣掉',
 
 'withoutinterwiki' => 'Bô gí-giân liân-kiat ê ia̍h',
 'withoutinterwiki-summary' => 'Ē-kha ê ia̍h bô kî-thaⁿ gí-giân pán-pún ê liân-kiat:',
-'withoutinterwiki-legend' => '前綴',
-'withoutinterwiki-submit' => '顯示',
 
 'fewestrevisions' => 'Siōng bô siu-tēng ê bûn-chiuⁿ',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|jī-goân|jī-goân}}',
 'ncategories' => '$1 {{PLURAL:$1|ê lūi-pia̍t |ê lūi-pia̍t}}',
-'nlinks' => '$1 {{PLURAL:$1|ê|ê}} liân-kiat',
-'nmembers' => '$1 {{PLURAL:$1|成員|成員}}',
-'nrevisions' => '$1 {{PLURAL:$1|ê|ê}} siu-tēng-pún',
-'nviews' => '看$1{{PLURAL:$1|擺|擺}}',
-'nimagelinks' => '用佇$1 {{PLURAL:$1|篇文章|篇文章}}',
-'ntransclusions' => '用佇$1 {{PLURAL:$1|篇文章|篇文章}}',
-'specialpage-empty' => '這个報表空空。',
+'nlinks' => '$1 ê liân-kiat',
+'nmembers' => '$1 ê sêng-oân',
+'nrevisions' => '$1 ê siu-tēng-pún',
 'lonelypages' => 'Ko·-ia̍h',
-'lonelypagestext' => '下跤的頁面無予佇{{SITENAME}}的其它頁面連結抑是用著。',
 'uncategorizedpages' => 'Bô lūi-pia̍t ê ia̍h',
 'uncategorizedcategories' => 'Bô lūi-pia̍t ê lūi-pia̍t',
 'uncategorizedimages' => 'Bô lūi-pia̍t ê iáⁿ-siōng',
@@ -1787,263 +762,96 @@ In應該連接到適當的頁面。<br />一个頁面若有用[[MediaWiki:Disamb
 'popularpages' => 'Sî-kiâⁿ ê ia̍h',
 'wantedcategories' => 'wantedcategories',
 'wantedpages' => 'Beh ti̍h ê ia̍h',
-'wantedpages-badtitle' => '佇清單內底的怪怪標題:$1',
-'wantedfiles' => '欲挃的檔案',
-'wantedfiletext-cat' => '下跤是無彼个檔案,毋過有頁面用著。有个佇外部檔案庫嘛可能寫佇清單,彼種失誤應該<del>排除</del>。另外,頁面包的檔案若無,嘛會寫佇[[:$1]]清單。',
-'wantedfiletext-nocat' => '下跤的是有頁面用著,毋過無彼个檔案。有个佇外部檔案庫嘛可能寫出來,彼種失誤應該<del>排除</del>。',
-'wantedtemplates' => '欲挃的枋模',
 'mostlinked' => 'Siōng chia̍p liân-kiat ê ia̍h',
 'mostlinkedcategories' => 'Siōng chia̍p liân-kiat ê lūi-pia̍t',
 'mostlinkedtemplates' => 'Siōng chia̍p liân-kiat ê pang-bô͘',
 'mostcategories' => 'Siōng chē lūi-pia̍t ê ia̍h',
 'mostimages' => 'Siōng chia̍p liân-kiat ê iáⁿ-siōng',
 'mostrevisions' => 'Siōng chia̍p siu-kái ê ia̍h',
-'prefixindex' => 'Só͘-ū chiàu sû-thâu sek-ín liáu ê  ia̍h',
-'prefixindex-namespace' => '照頭排的所有頁面($1名空間)',
+'prefixindex' => 'Sû-thâu sek-ín',
 'shortpages' => 'Té-ia̍h',
-'longpages' => '長頁',
 'deadendpages' => 'Khu̍t-thâu-ia̍h',
 'deadendpagestext' => 'Ē-kha ê ia̍h bô liân kàu wiki lāi-té ê kî-thaⁿ ia̍h.',
 'protectedpages' => 'Siū pó-hō͘ ê ia̍h',
-'protectedpages-indef' => '干焦無限期保護的頁',
-'protectedpages-cascade' => '干焦連鎖保護的頁',
 'protectedpagestext' => 'Ē-kha ê ia̍h siū pó-hō͘, bē-tit soá-ūi ia̍h pian-chi̍p',
-'protectedpagesempty' => '照遐的參數保護的,這馬無半頁。',
-'protectedtitles' => '保護牢著的標題',
-'protectedtitlestext' => '下跤的標題袂當寫。',
-'protectedtitlesempty' => '照遐的參數保護的標題,這馬無半頁。',
 'listusers' => 'Iōng-chiá lia̍t-toaⁿ',
-'listusers-editsonly' => '干焦顯示有改過的用者',
-'listusers-creationsort' => '照開始寫的日期排',
-'usereditcount' => '改過$1{{PLURAL:$1|擺|擺}}',
-'usercreated' => ' {{GENDER:$3|}}佇$1 $2創建',
 'newpages' => 'Sin ia̍h',
 'newpages-username' => 'Iōng-chiá miâ-chheng:',
 'ancientpages' => 'Kó·-ia̍h',
 'move' => 'Sóa khì',
 'movethispage' => 'Sóa chit ia̍h',
-'unusedimagestext' => 'Ē-kha ê tóng-àn bô poàⁿ ia̍h ū teh iōng. M̄-koh ia̍h lâu leh. 
-Chhiáⁿ chù-ì: kî-thaⁿ ê bāng-chām ū khó-lêng iōng URL ti̍t-chiap liân kàu iáⁿ-siōng, só·-í sui-jiân bô teh iōng, mā sī ē lia̍t tī chia.',
+'unusedimagestext' => '<p>Chhiáⁿ chù-ì: kî-thaⁿ ê bāng-chām ū khó-lêng iōng URL ti̍t-chiap liân kàu iáⁿ-siōng, só·-í sui-jiân chhiâng-chāi teh iōng, mā sī ē lia̍t tī chia.</p>',
 'unusedcategoriestext' => 'Ū ē-kha chiah-ê lūi-pia̍t-ia̍h, m̄-koh bô kî-thaⁿ ê bûn-chiuⁿ a̍h-sī lūi-pia̍t lī-iōng.',
-'notargettitle' => '無目標',
-'notargettext' => '你無指定目標頁面抑是用者通做這个動作',
-'nopagetitle' => '無這个目標頁',
-'nopagetext' => '無你指定的目標頁。',
-'pager-newer-n' => '{{PLURAL:$1|較新一个|較新$1个 }}',
-'pager-older-n' => '{{PLURAL:$1|較舊一个|較舊$1个}}',
-'suppress' => '監督',
-'querypage-disabled' => '這个特殊頁因為效能的原因已經無咧用。',
 
 # Book sources
 'booksources' => 'Tô͘-su chu-liāu',
-'booksources-search-legend' => '揣圖書資料',
-'booksources-go' => '來去',
-'booksources-text' => '下跤是連接去賣新冊抑舊冊網站的清單,並而可能有你欲揣的冊的其他資料:',
-'booksources-invalid-isbn' => '提供的ISBN號碼無正確,請檢查拷備來源是毋是有錯誤。',
 
 # Special:Log
-'specialloguserlabel' => '操作者:',
-'speciallogtitlelabel' => 'Bo̍k-piau (sû-tiâu ia̍h iōng-chiá) :',
-'log' => '記錄',
-'all-logs-page' => '所有公開的記錄',
-'alllogstext' => '顯示所有佇 {{SITENAME}} 有提供的記錄,
-你會當看你所選的記錄類別、用者名稱(大小寫有差)抑是相關的頁(大小寫有差)。',
+'specialloguserlabel' => 'Iōng-chiá:',
+'speciallogtitlelabel' => 'Sû-tiâu:',
 'logempty' => 'Log lāi-bīn bô sio-tùi ê hāng-bo̍k.',
-'log-title-wildcard' => '去揣以這个文字做頭的標題',
 
 # Special:AllPages
 'allpages' => 'Só·-ū ê ia̍h',
 'alphaindexline' => '$1 kàu $2',
 'nextpage' => 'Āu 1 ia̍h ($1)',
-'prevpage' => '前一頁($1)',
 'allpagesfrom' => 'Tùi chit ia̍h khai-sí hián-sī:',
-'allpagesto' => '顯示到這頁:',
 'allarticles' => 'Só·-ū ê bûn-chiuⁿ',
 'allinnamespace' => 'Só·-ū ê ia̍h ($1 miâ-khong-kan)',
 'allnotinnamespace' => 'Só·-ū ê ia̍h (bô tī $1 miâ-khong-kan)',
 'allpagesprev' => 'Téng 1 ê',
 'allpagesnext' => 'ē 1 ê',
 'allpagessubmit' => 'Lâi-khì',
-'allpagesprefix' => '顯示頁標題有:',
-'allpagesbadtitle' => '指定的頁面標題無適當,抑是有用著別个語言抑是別个Wiki。
-伊可能是有一字抑一字以上的字是袂當用佇標題。',
-'allpages-bad-ns' => '佇{{SITENAME}}無"$1"這个名空間。',
-'allpages-hide-redirects' => '掩轉頁',
 
 # Special:Categories
 'categories' => 'Lūi-pia̍t',
-'categoriespagetext' => 'Ē-kha {{PLURAL:$1| ê ūi-pia̍t|ê ūi-pia̍t}} ū ia̍h ia̍h-sī mûi-thé.
-[[Special:UnusedCategories|Bô iōng tio̍h ê ūi-pia̍t]] tō bô tī chiah hián-sī.
-Lēng-goā thang chham-khó [[Special:WantedCategories|beh ti̍h ê lūi-pia̍t]].',
+'categoriespagetext' => 'Chit ê wiki ū ē-kha chia ê lūi-pia̍t.
+[[Special:UnusedCategories|Unused categories]] are not shown here.
+Also see [[Special:WantedCategories|wanted categories]].',
 'categoriesfrom' => 'Tùi chit ê lūi-pia̍t khai-sí hián-sī:',
-'special-categories-sort-count' => '按數量排',
-'special-categories-sort-abc' => '按字母排',
 
 # Special:DeletedContributions
 'deletedcontributions' => 'Hō͘ lâng thâi tiāu ê kòng-hiàn',
 'deletedcontributions-title' => 'Hō͘ lâng thâi tiāu ê kòng-hiàn',
-'sp-deletedcontributions-contribs' => '貢獻',
 
 # Special:LinkSearch
-'linksearch' => 'Chhoē chām-goā ê liân-kiat',
-'linksearch-pat' => '揣的方式:',
-'linksearch-ns' => '名空間:',
-'linksearch-ok' => '揣',
-'linksearch-text' => '會當用親像“*.wikipedia.org”的萬用字元,
-上少愛對上頂層的網域,親像“*.org”。<br />
-支援的協議:<tt>$1</tt>(莫加佇你的搜揣)。',
-'linksearch-line' => '$1 是對$2連接來的',
-'linksearch-error' => '萬用字元干焦會當用佇主機名的頭前。',
-
-# Special:ListUsers
-'listusersfrom' => '對這个用者開始顯示:',
-'listusers-submit' => '顯示',
-'listusers-noresult' => '揣無用者',
-'listusers-blocked' => '(封鎖牢咧)',
-
-# Special:ActiveUsers
-'activeusers' => '有咧活動的用者清單',
-'activeusers-intro' => '這是佇過去$1 {{PLURAL:$1|工y|工}}有做過一寡活動的用者清單。',
-'activeusers-count' => '佇{{PLURAL:$3|一工|$3工}}內的$1改編輯',
-'activeusers-from' => '對這个用者開始顯示:',
-'activeusers-hidebots' => '掩機器人',
-'activeusers-hidesysops' => '掩管理員',
-'activeusers-noresult' => '揣無用者',
-
-# Special:Log/newusers
-'newuserlogpage' => '用者建立的記錄',
-'newuserlogpagetext' => '這是開用者口座的記錄',
-
-# Special:ListGroupRights
-'listgrouprights' => '用者陣的權利',
-'listgrouprights-summary' => '下跤是佇這个wiki分的用者陣清單,佮相關的使用權。
-每一陣的權利,通去看[[{{MediaWiki:Listgrouprights-helppage}}|其他資料]]。',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">授權的權利</span>
-* <span class="listgrouprights-revoked">扣除的權利</span>',
-'listgrouprights-group' => '分組',
-'listgrouprights-rights' => '權利',
-'listgrouprights-helppage' => 'Help:分組的權利',
-'listgrouprights-members' => '(成員列單)',
-'listgrouprights-addgroup' => '加入的{{PLURAL:$2|个|个}}組: $1',
-'listgrouprights-removegroup' => '徙走的{{PLURAL:$2|个|个}}組: $1',
-'listgrouprights-addgroup-all' => '加入所有的組',
-'listgrouprights-removegroup-all' => '離開所有的組',
-'listgrouprights-addgroup-self' => '共家己加入去{{PLURAL:$2|个|个}}組:$1',
-'listgrouprights-removegroup-self' => '共家己對{{PLURAL:$2|个|个}}組徙走:$1',
-'listgrouprights-addgroup-self-all' => '共家己加入所有的組',
-'listgrouprights-removegroup-self-all' => '共家己對所有的組徙走',
+'linksearch' => 'Chhiau-chhoē chām-goā liân-kiat',
 
 # E-mail user
 'mailnologin' => 'Bô siu-phoe ê chū-chí',
 'mailnologintext' => 'Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] jī-chhiáⁿ ū 1 ê ū-hāu ê e-mail chū-chí tī lí ê [[Special:Preferences|iōng-chiá siat-tēng]] chiah ē-tàng kià e-mail hō· pa̍t-ūi iōng-chiá.',
 'emailuser' => 'Kià e-mail hō· iōng-chiá',
 'emailpage' => 'E-mail iōng-chiá',
-'emailpagetext' => 'Lí ē-tàng iōng ē-kha ê pió kià chi̍t tiuⁿ phe hō͘ chit ê iōng-chiá.
-Lí ê [[Special:Preferences|siat-tēng]] ê tiān-chú-phe tē-chí ē chhut-hiān tī tiān-chú-phe ê "Kià-phe-chiá" (From) hit ūi. Án-ne siu-phe-chiá chiah ū hoat-tō· kā lí hôe-phe.',
-'usermailererror' => '退批錯誤:',
-'defemailsubject' => '{{SITENAME}}的用者 $1 送的電子批',
-'usermaildisabled' => '你的電子批已經停掉',
-'usermaildisabledtext' => '你袂當佇這个wiki寄批予別人',
+'emailpagetext' => 'Ká-sú chit ê iōng-chiá ū siat-tēng 1 ê ū-hāu ê e-mail chū-chí, lí tō ē-tàng ēng ē-kha chit tiuⁿ FORM hoat sìn-sek hō· i. Lí siat-tēng ê e-mail chū-chí ē chhut-hiān tī e-mail ê "Kià-phoe-jîn" (From) hit ūi. Án-ne siu-phoe-jîn chiah ū hoat-tō· kā lí hôe-phoe.',
 'noemailtitle' => 'Bô e-mail chū-chí',
-'noemailtext' => 'Chit ūi iōng-chiá pēng-bô lâu ū-hāu ê e-mail chū-chí.',
-'nowikiemailtitle' => '無電子批',
-'nowikiemailtext' => '這个用者無欲收電子批。',
-'emailnotarget' => '無彼个收批的人,抑是收批的用者名稱毋著。',
-'emailtarget' => '拍入欲收批的用者名稱',
-'emailusername' => '用者名稱:',
-'emailusernamesubmit' => '送出',
-'email-legend' => '送一張電子批去予佇{{SITENAME}}的另外一位用者',
-'emailfrom' => 'Lâi chū:',
-'emailto' => 'Khì hō·:',
-'emailsubject' => 'Tê-bo̍k:',
+'noemailtext' => 'Chit ūi iōng-chiá pēng-bô lâu ū-hāu ê e-mail chū-chí, bô tio̍h-sī i bô beh chiap-siū pat-ūi iōng-chiá ê e-mail.',
+'emailfrom' => 'Lâi chū',
+'emailto' => 'Khì hō·',
+'emailsubject' => 'Tê-bo̍k',
 'emailmessage' => 'Sìn-sit:',
 'emailsend' => 'Sàng chhut-khì',
-'emailccme' => '共我的訊息用電子批寄一份予我',
-'emailccsubject' => '你送予$1訊息的副本:$2',
 'emailsent' => 'E-mail sàng chhut-khì ah',
 'emailsenttext' => 'Lí ê e-mail í-keng sàng chhut-khì ah.',
-'emailuserfooter' => '這張由$1寄予$2的電子批已經用{{SITENAME}}的「電子批用者」功能送出。',
-
-# User Messenger
-'usermessage-summary' => '留系統信息',
-'usermessage-editor' => '系統信息',
 
 # Watchlist
 'watchlist' => 'Kàm-sī-toaⁿ',
 'mywatchlist' => 'Góa ê kàm-sī-toaⁿ',
-'watchlistfor2' => '予$1 $2',
 'nowatchlist' => 'Lí ê kàm-sī-toaⁿ bô pòaⁿ hāng.',
-'watchlistanontext' => '請$1去看抑是改你的監視清單。',
 'watchnologin' => 'Bô teng-ji̍p',
 'watchnologintext' => 'Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] chiah ē-tàng siu-kái lí ê kàm-sī-toaⁿ.',
-'addwatch' => '加入去監視單',
 'addedwatchtext' => "\"[[:\$1]]\" chit ia̍h í-keng ka-ji̍p lí ê [[Special:Watchlist|kàm-sī-toaⁿ]]. Bī-lâi chit ia̍h a̍h-sī siong-koan ê thó-lūn-ia̍h nā ū kái-piàn, ē lia̍t tī hia. Tông-sî tī [[Special:RecentChanges|Chòe-kīn ê kái-piàn]] ē iōng '''chho·-thé''' hián-sī ia̍h ê piau-tê, án-ne khah bêng-hián. Ká-sú lí beh chiōng chit ia̍h tùi lí ê kàm-sī-toaⁿ tû tiāu, khì khòng-chè-tiâu chhi̍h \"Mài kàm-sī\" chiū ē-sái-tit.",
-'removewatch' => '對監視單徙走',
-'removedwatchtext' => '"[[:$1]]" chit ia̍h í-keng tùi lí ê [[Special:Watchlist|kàm-sī-toaⁿ]] soá cháu.',
+'removedwatchtext' => '"[[:$1]]" chit ia̍h í-keng tùi lí ê kàm-sī-toaⁿ tû tiāu.',
 'watch' => 'kàm-sī',
 'watchthispage' => 'Kàm-sī chit ia̍h',
 'unwatch' => 'Mài kàm-sī',
 'unwatchthispage' => 'Mài koh kàm-sī',
-'notanarticle' => '毋是內容頁面',
-'notvisiblerev' => '別个用者的頂一个修訂本已經予人刣掉',
 'watchnochange' => 'Lí kàm-sī ê hāng-bo̍k tī hián-sī ê sî-kî í-lāi lóng bô siu-kái kòe.',
 'watchlist-details' => 'Kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.',
-'wlheader-enotif' => '*會當用電子批通知',
-'wlheader-showupdated' => '自你頂回看的、到今有改過的會用較大烏字顯示',
 'watchmethod-recent' => 'tng teh kíam-cha choè-kīn ê siu-kái, khoàⁿ ū kàm-sī ê ia̍h bô',
 'watchmethod-list' => 'tng teh kiám-cha kàm-sī ê ia̍h khoàⁿ chòe-kīn ū siu-kái bô',
-'watchlistcontains' => 'Lí ê kàm-sī-toaⁿ siu {{PLURAL:$1|ia̍h|ia̍h}} .',
-'iteminvalidname' => "項目'$1'有問題,名稱無適當...",
-'wlnote' => "Ē-kha sī tī $3, $4 chìn-chêng {{PLURAL:chi tiám-cheng|'''$2''' tiám-cheng}} í-lâi ê {{PLURAL:$1| chi̍t piàn|'''$1''' piàn}} siu-kái.",
+'watchlistcontains' => 'Lí ê kàm-sī-toaⁿ siu $1 ia̍h.',
+'wlnote' => "Ē-kha sī '''$2''' tiám-cheng í-lāi siōng sin ê $1 ê kái-piàn.",
 'wlshowlast' => 'Hián-sī chêng $1 tiám-cheng $2 ji̍t $3',
-'watchlist-options' => '監視單的選項',
-
-# Displayed when you click the "watch" button and it is in the process of watching
-'watching' => '共監視',
-'unwatching' => '莫監視',
-'watcherrortext' => '佇你改"$1"監視設定的時陣,發生一个問題',
-
-'enotif_mailer' => '{{SITENAME}} 的電子批通知系統',
-'enotif_reset' => '共全部的頁攏當做巡過',
-'enotif_newpagetext' => '這是新的一頁',
-'enotif_impersonal_salutation' => '{{SITENAME}}用者',
-'changed' => '改過',
-'created' => '寫過',
-'enotif_subject' => '佇{{SITENAME}}的$PAGETITLE這頁捌予$CHANGEDORCREATED$PAGEEDITOR',
-'enotif_lastvisited' => '看$1,自你頂回來到今所有改的',
-'enotif_lastdiff' => '看$1這回改的',
-'enotif_anon_editor' => '無名氏用者$1',
-'enotif_body' => '敬愛的$WATCHINGUSERNAME:
-
-
-{{SITENAME}}的$PAGETITLE頁面已經佇$PAGEEDITDATE予$PAGEEDITOR$CHANGEDORCREATED,請看 $PAGETITLE_URL 這个這馬的版本。
-
-$NEWPAGE
-
-編輯的摘要:$PAGESUMMARY $PAGEMINOREDIT
-
-聯絡這位編輯者:
-
-電子批:$PAGEEDITOR_EMAIL
-本站:$PAGEEDITOR_WIKI
-
-以後佇你閣看這頁進前,若有閣改過,嘛袂通知你。
-你會當共你的監視表重設頁面的通知記號。
-
-{{SITENAME}}通知系統敬上
-
---
-欲改你的電子批設定,請看
-{{canonicalurl:{{#special:Preferences}}}}
-
-欲改你的監視表設定,請看
-{{canonicalurl:{{#special:EditWatchlist}}}}
-
-欲對你的監視單徙掉某頁,請看
-$UNWATCHURL
-
-回饋佮進一步的幫助:
-{{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
 'deletepage' => 'Thâi ia̍h',
@@ -2052,29 +860,12 @@ $UNWATCHURL
 'excontentauthor' => "loē-iông sī: '$1' (î-it ê kòng-hiàn-chiá sī '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => "chìn-chêng ê lōe-iông sī: '$1'",
 'exblank' => 'ia̍h khang-khang',
-'delete-confirm' => '刣掉$1',
-'delete-legend' => '刣掉',
-'historywarning' => 'Kéng-kò: Lí beh thâi ê ia̍h ū {{PLURAL:$1| ê siu-tèng le̍k-sú|ê siu-tèng le̍k-sú}}:',
+'historywarning' => 'Kéng-kò: Lí beh thâi ê ia̍h ū le̍k-sú:',
 'confirmdeletetext' => 'Lí tih-beh kā 1 ê ia̍h a̍h-sī iáⁿ-siōng (pau-koat siong-koan ê le̍k-sú) éng-kiú tùi chu-liāu-khò· thâi tiāu. Chhiáⁿ khak-tēng lí àn-sǹg án-ne chò, jī-chhiáⁿ liáu-kái hiō-kó, jī-chhiáⁿ bô ûi-hoán [[{{MediaWiki:Policy-url}}]].',
 'actioncomplete' => 'Chip-hêng sêng-kong',
-'actionfailed' => '做無成',
 'deletedtext' => '"$1" í-keng thâi tiāu. Tùi $2 khoàⁿ-ē-tio̍h chòe-kīn thâi ê kì-lo̍k.',
-'dellogpage' => '刣掉的記錄',
 'dellogpagetext' => 'Í-hā lia̍t chhut chòe-kīn thâi tiāu ê hāng-bo̍k.',
-'deletionlog' => '刣掉的記錄',
-'reverted' => '轉轉去前一个版本',
 'deletecomment' => 'Lí-iû:',
-'deleteotherreason' => '其他/另外的理由:',
-'deletereasonotherlist' => '其他的理由',
-'deletereason-dropdown' => '*一般刣掉的理由
-** 作者的要求
-** 違反著作權
-** 破壞',
-'delete-edit-reasonlist' => '編輯刣掉的理由',
-'delete-toobig' => '這个頁面有誠濟的編輯歷史,超過$1{{PLURAL:$1|擺|擺}}的修改。
-為著防止意外佇{{SITENAME}}造成擾亂,欲刣掉這款的頁面有限制。',
-'delete-warning-toobig' => '這頁有誠濟修改歷史,超過$1改的{{PLURAL:$1|修訂本|修訂本}}。
-共伊刣掉可能會破壞{{SITENAME}}的資料庫運作;愛細膩操作。',
 
 # Rollback
 'rollback' => 'Kā siu-kái ká tńg khì',
@@ -2082,156 +873,34 @@ $UNWATCHURL
 'rollbacklink' => 'ká tńg khì',
 'rollbackfailed' => 'Ká bē tńg khì',
 'cantrollback' => 'Bô-hoat-tō· kā siu-kái ká-tńg--khì; téng ūi kòng-hiàn-chiá sī chit ia̍h î-it ê chok-chiá.',
-'alreadyrolled' => 'Bô-hoat-tō· kā [[User:$2|$2]] ([[User talk:$2|Thó-lūn]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tùi [[:$1]] ê siu-kái ká-tńg-khì; 
-í-keng ū lâng siu-kái a̍h-sī ká-tńg chit ia̍h. 
-Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
-'editcomment' => "Pian-chi̍p kài-iàu sī: \"''\$1''\".",
-'revertpage' => '回轉[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯到頂一个[[User:$1|$1]]的修訂版本',
-'revertpage-nouser' => '回轉(無用者名)的編輯到頂一个[[User:$1|$1]]的修訂版本',
-'rollback-success' => '回轉$1的編輯,
-轉轉去頂一个$2的修訂版本。',
-
-# Edit tokens
-'sessionfailure-title' => '登入的資訊失效',
-'sessionfailure' => '你的登入連線敢若有問題,
-為著防止連線被駭客(hijack),這个操作已經取消,
-請先轉去前一頁,重新載入彼頁,才閣試。',
+'alreadyrolled' => 'Bô-hoat-tō· kā [[User:$2|$2]] ([[User talk:$2|Thó-lūn]]) tùi [[:$1]] ê siu-kái ká-tńg-khì; í-keng ū lâng siu-kái a̍h-sī ká-tńg chit ia̍h. Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|Thó-lūn]]).',
+'editcomment' => "Siu-kái phêng-lūn sī: \"''\$1''\".",
 
 # Protect
-'protectlogpage' => '保護的記錄',
-'protectlogtext' => '下跤是保護頁有改過的清單,
-請參考[[Special:ProtectedPages|保護頁清單]]看這馬有保護的頁。',
 'protectedarticle' => 'pó-hō͘ "[[$1]]"',
-'modifiedarticleprotection' => '改"[[$1]]"的保護等級',
-'unprotectedarticle' => '已經解除"[[$1]]"的保護',
-'movedarticleprotection' => '已經共"[[$2]]"的保護設定徙去"[[$1]]"',
-'protect-title' => 'Kái "$1" ê pó-hō· tíng-kip.',
-'protect-title-notallowed' => '看"$1"的保護等級',
+'protect-title' => 'Pó-hō· "$1"',
 'prot_1movedto2' => '[[$1]] sóa khì tī [[$2]]',
-'protect-badnamespace-title' => '袂當保護的名空間',
-'protect-badnamespace-text' => '佇這个名空間的頁面袂當共保護。',
 'protect-legend' => 'Khak-tēng beh pó-hō·',
 'protectcomment' => 'Lí-iû:',
-'protectexpiry' => '到期:',
-'protect_expiry_invalid' => '到期時間毋著',
-'protect_expiry_old' => '到期時間已經過去',
-'protect-unchain-permissions' => '解除更加保護的選項',
-'protect-text' => "你會當佇遮看佮改頁面的'''$1'''保護等級。",
-'protect-locked-blocked' => "你袂當佇封鎖的時陣改保護等級,
-下跤是'''$1'''這馬的保護等級:",
-'protect-locked-dblock' => "佇資料庫鎖牢咧的時陣,袂當改保護等級。
-下面是'''$1'''這頁這馬的保護等級:",
-'protect-locked-access' => "你的口座無改保護等級的權利,
-下面是'''$1'''這頁這馬的保護等級:",
-'protect-cascadeon' => '這頁這馬予人保護牢咧,因為伊包括佇下面{{PLURAL:$1|一个|幾个}}頁面的連鎖保護牢咧,
-你會當改這頁的保護等級,毋過對連鎖保護無影響。',
-'protect-default' => '所有用者攏會當',
-'protect-fallback' => '要求會當"$1"',
-'protect-level-autoconfirmed' => '禁止新的佮猶未註冊的用者',
-'protect-level-sysop' => '干焦管理員',
-'protect-summary-cascade' => '連鎖',
-'protect-expiring' => '佇$1會過期',
-'protect-expiring-local' => '佇$1到期',
-'protect-expiry-indefinite' => '無限',
 'protect-cascade' => 'Cascading protection - pó-hō͘ jīm-hô pau-hâm tī chit ia̍h ê ia̍h.',
-'protect-cantedit' => '你袂當改這頁的保護層級,因為你無授權共改。',
-'protect-othertime' => '其他的時間:',
-'protect-othertime-op' => '其他的時間',
-'protect-existing-expiry' => '到期的時間: $2 $3',
-'protect-otherreason' => '其他/另外的理由:',
-'protect-otherreason-op' => '其他的理由',
-'protect-dropdown' => '*一般保護的理由
-** 過量的破壞
-** 過量的灌水
-** 無生產量的編輯戰
-** 高流量頁面',
-'protect-edit-reasonlist' => '編輯保護的理由',
-'protect-expiry-options' => '一點鐘:1 hour,一工:1 day,一禮拜:1 week,兩禮拜:2 weeks,一個月:1 month,三個月:3 months,六個月:6 months,1年:1 year,無限:infinite',
-'restriction-type' => '允准:',
-'restriction-level' => '限制層級:',
-'minimum-size' => '上細',
-'maximum-size' => '上大:',
-'pagesize' => '(位元組)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Siu-kái',
 'restriction-move' => 'Sóa khì',
-'restriction-create' => '開始寫',
-'restriction-upload' => '上載',
-
-# Restriction levels
-'restriction-level-sysop' => '全保護',
-'restriction-level-autoconfirmed' => '半保護',
-'restriction-level-all' => '任何一級',
 
 # Undelete
 'undelete' => 'Kiù thâi tiāu ê ia̍h',
 'undeletepage' => 'Khoàⁿ kap kiù thâi tiāu ê ia̍h',
-'undeletepagetitle' => "'''下跤包括[[:$1]]的刣掉修訂本'''",
-'viewdeletedpage' => '看刣掉的頁',
-'undeletepagetext' => '下跤的{{PLURAL:$1|篇頁|篇頁}}已經予人刣掉,毋過猶留佇檔案庫,而且會使救倒轉來。
-檔案庫內底可能會定時清掉。',
-'undelete-fieldset-title' => '恢復修訂本',
-'undeleteextrahelp' => "欲恢復頁面的全部歷史,就共所有的選格仔留空白,閣點擊 '''''{{int:undeletebtn}}''''' ,
-欲恢復某一个版本,就共彼个版本進前的選格仔選起來,閣點擊'''''{{int:undeletebtn}}''''' 。",
-'undeleterevisions' => '$1{{PLURAL:$1|版本|版本}}的保存檔',
-'undeletehistory' => '若你共頁面恢復,所有的修訂本嘛會恢復佇歷史頁。
-若佇這頁刣掉了後,已經有一个仝名的新頁建立,按呢恢復的修訂本會囥佇歷史的頭前。',
-'undeleterevdel' => '若會變做上新的頁抑是修訂本已經部份刣掉,就無法共刣掉的頁搝倒轉來。
-若拄著這種情形,你莫共上新的修訂本選起來抑是莫共藏起來。',
-'undeletehistorynoadmin' => '這頁已經予人刣掉,
-刣掉的原因顯示佇下面的編輯摘要,猶有刣掉進前,有編輯這頁的用者明細。
-遮的修訂本的文字只有管理員才會當看。',
-'undelete-revision' => '$1予$3(佇$4 $5)刣掉的修訂本。',
-'undeleterevision-missing' => '毋著抑是無去的修訂本,
-你的連結毋著,抑是彼个修訂本己經對保管庫轉回抑徙掉。',
-'undelete-nodiff' => '無頂一个修訂本。',
-'undeletebtn' => '恢復',
-'undeletelink' => '看/恢復',
 'undeleteviewlink' => 'Khoàⁿ',
-'undeletereset' => '設便',
-'undeleteinvert' => '選項以外',
-'undeletecomment' => '理由:',
-'undeletedrevisions' => '{{PLURAL:$1|1个|$1个}}修訂本已經恢復',
-'undeletedrevisions-files' => '{{PLURAL:$1|1个|$1个}}版訂本佮{{PLURAL:$2|1个|$2个}}檔案已經恢復',
-'undeletedfiles' => '{{PLURAL:$1|1个|$1个}}檔案已經恢復',
-'cannotundelete' => '恢復刣掉的頁失敗,
-有別人可能已經先共恢復。',
-'undeletedpage' => "'''$1已經恢復'''
-
-參考[[Special:Log/delete|刣掉記錄]]有最近刣掉佮恢復的記錄。",
-'undelete-header' => '看[[Special:Log/delete|刣掉記錄]]有寫最近刣掉的頁。',
-'undelete-search-title' => '揣刣掉的頁',
-'undelete-search-box' => '揣刣掉的頁',
-'undelete-search-prefix' => '對這頁開始顯示:',
-'undelete-search-submit' => '揣',
-'undelete-no-results' => '佇刣掉頁的文件內底無彼頁。',
-'undelete-filename-mismatch' => '無法度恢復時間戳印是$1的修訂本:檔案名稱無合。',
-'undelete-bad-store-key' => '無法度恢復時間戳印是$1的修訂本:檔案佇刣掉進前就無去。',
-'undelete-cleanup-error' => '佇刣掉無咧用的歷史檔案"$1"的時陣,有錯誤。',
-'undelete-missing-filearchive' => '因為資料庫內底無ID $1的歷史檔案,無法度共恢復,
-伊可能已經予人恢復。',
-'undelete-error' => '刣掉的頁欲恢復有錯誤',
-'undelete-error-short' => '刣掉的檔案欲恢復有錯誤:$1',
-'undelete-error-long' => '刣掉的檔案欲恢復的時陣有錯誤:
-
-$1',
-'undelete-show-file-confirm' => '你敢確定欲看"<nowiki>$1</nowiki>"佇 $2 $3 刣掉的修訂本?',
-'undelete-show-file-submit' => '是',
 
 # Namespace form on various pages
 'namespace' => 'Miâ-khong-kan:',
 'invert' => 'Soán-hāng í-gōa',
-'tooltip-invert' => '鉤選這个框仔會共所選的名空間內底有改的頁掩起來(佮相關有選的命空間)',
-'namespace_association' => '相關的名空間',
-'tooltip-namespace_association' => '鉤選這个框仔,嘛會包括討論名空間抑頁空間,佮伊的相關名空間',
 'blanknamespace' => '(Thâu-ia̍h)',
 
 # Contributions
 'contributions' => 'Iōng-chiá ê kòng-hiàn',
-'contributions-title' => '用者佇$1的貢獻',
 'mycontris' => 'Góa ê kòng-hiàn',
-'contribsub2' => '$1的貢獻($2)',
 'nocontribs' => 'Chhōe bô tiâu-kiāⁿ ū-tùi ê hāng-bo̍k.',
 'uctop' => '(siōng téng ê)',
 'month' => 'Kàu tó 1 kó͘ goe̍h ûi-chí:',
@@ -2239,197 +908,47 @@ $1',
 
 'sp-contributions-newbies' => 'Kan-taⁿ hián-sī sin kháu-chō ê kòng-kiàn',
 'sp-contributions-newbies-sub' => 'Sin lâi--ê',
-'sp-contributions-newbies-title' => '新用者的貢獻',
-'sp-contributions-blocklog' => '封鎖記錄',
 'sp-contributions-deleted' => 'Hō͘ lâng thâi tiāu ê kòng-hiàn',
-'sp-contributions-uploads' => '上載',
-'sp-contributions-logs' => '記錄',
 'sp-contributions-talk' => 'thó-lūn',
-'sp-contributions-userrights' => '用者的使用權管理',
-'sp-contributions-blocked-notice' => '這个用者這馬hông封鎖,
-下跤有最近封鎖的紀錄通參考:',
-'sp-contributions-blocked-notice-anon' => '這个IP地址這馬予人封鎖咧,
-下跤有最近封鎖的紀錄通參考:',
 'sp-contributions-search' => 'Chhoē chhut kòng-kiàn',
 'sp-contributions-username' => 'IP Chū-chí a̍h iōng-chiá miâ:',
-'sp-contributions-toponly' => '干焦看頂一回改的',
 'sp-contributions-submit' => 'Chhoē',
 
 # What links here
 'whatlinkshere' => 'Tó-ūi liân kàu chia',
-'whatlinkshere-title' => '連到"$1"的頁',
-'whatlinkshere-page' => '頁:',
 'linkshere' => "Í-hā '''[[:$1]]''' liân kàu chia:",
 'nolinkshere' => "Bô poàⁿ ia̍h liân kàu '''[[:$1]]'''.",
-'nolinkshere-ns' => '佇所選的名空間內底,無頁面連結到[[:$1]]。',
 'isredirect' => 'choán-ia̍h',
-'istemplate' => '包括',
-'isimage' => '檔案連結',
 'whatlinkshere-prev' => '{{PLURAL:$1|chêng|chêng $1 ê}}',
 'whatlinkshere-next' => '{{PLURAL:$1|āu|āu $1 ê}}',
 'whatlinkshere-links' => '← Liân kàu chia',
-'whatlinkshere-hideredirs' => '$1 改向',
-'whatlinkshere-hidetrans' => '$1包括',
-'whatlinkshere-hidelinks' => '$1 連到遮',
-'whatlinkshere-hideimages' => '$1圖像的連結',
-'whatlinkshere-filters' => '過濾器',
 
 # Block/unblock
-'autoblockid' => '自動封鎖 #$1',
-'block' => '封鎖用者',
-'unblock' => '解除對用者的封鎖',
 'blockip' => 'Hong-só iōng-chiá',
-'blockip-title' => '封鎖用者',
-'blockip-legend' => '封鎖用者',
-'blockiptext' => '用下跤的表來封鎖某一个IP地址抑是用者名稱的寫作。
-這只會當為著防止破壞,佮符合[[{{MediaWiki:Policy-url}}|守則]]的情況下才會當按呢做。
-佇下跤寫一个具體的理由(親像,指出一个予人破壞的頁)。',
 'ipadressorusername' => 'IP Chū-chí a̍h iōng-chiá miâ:',
-'ipbexpiry' => '到期:',
 'ipbreason' => 'Lí-iû:',
-'ipbreasonotherlist' => '其他理由',
-'ipbreason-dropdown' => '*一般封鎖的理由
-** 寫假資料
-** 共頁的內容徙掉
-** 連結到外部廣告
-** 佇頁面亂使寫
-** 威脅的行為/騷擾別人
-** 亂使用濟的口座
-** 袂當接受的用者名稱',
-'ipb-hardblock' => '防止有登入的用者對這个IP地址做編輯',
-'ipbcreateaccount' => '防止建立新口座',
-'ipbemailban' => '封鎖一个用者去寄電子批',
-'ipbenableautoblock' => '自動封鎖這个用者頂一回用的IP地址,佮後來遐的想欲編輯的IP地址',
 'ipbsubmit' => 'Hong-só chit ūi iōng-chiá',
-'ipbother' => '其他時間:',
-'ipboptions' => '兩點鐘:2 hours,一工:1 day,三工:3 days,一禮拜:1 week,兩禮拜:2 weeks,一個月:1 month,兩個月:3 months,六個月:6 months,一年:1 year,永久:infinite',
-'ipbotheroption' => '其他',
-'ipbotherreason' => '其他/另外的理由:',
-'ipbhidename' => '佇編輯佮清單共用者名稱藏起來',
-'ipbwatchuser' => '看這个用者的用者頁佮討論頁',
-'ipb-disableusertalk' => '禁止這个用者佇封鎖的時陣修改家己的討論頁',
-'ipb-change-block' => '照遮的設定閣共用者封鎖',
-'ipb-confirm' => '確定封鎖',
 'badipaddress' => 'Bô-hāu ê IP chū-chí',
 'blockipsuccesssub' => 'Hong-só sêng-kong',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] í-keng pī hong-só. <br />Khì [[Special:BlockList|IP hong-só lia̍t-toaⁿ]] review hong-só ê IP.',
-'ipb-blockingself' => '你欲封鎖你家己!你敢確定欲按呢做?',
-'ipb-confirmhideuser' => '你是欲封鎖一个用者佮隱藏伊的用者名稱,這會隱藏用者名稱出現佇所有的表佮記錄的項目當中,你敢確定欲按呢做?',
-'ipb-edit-dropdown' => '編輯封鎖的理由',
-'ipb-unblock-addr' => '解除封鎖$1',
-'ipb-unblock' => '拍開一个用者名稱抑是IP地址的封鎖',
-'ipb-blocklist' => '看這馬的封鎖',
-'ipb-blocklist-contribs' => '$1的貢獻',
-'unblockip' => '解除對用者的封鎖',
-'unblockiptext' => '用下跤的表,來恢復進前予人封鎖的IP地址、抑是用者名稱的寫作',
-'ipusubmit' => 'Chhú-siau chit ê hong-só',
-'unblocked' => '[[User:$1|$1]] 已經解除封鎖。',
-'unblocked-range' => '$1已經解除封鎖',
-'unblocked-id' => '對$1的封鎖已經徙掉',
-'blocklist' => '封鎖牢咧的用者',
-'ipblocklist' => 'Siū hong-só ê iōng-chiá',
-'ipblocklist-legend' => '揣一个封鎖的用者',
-'blocklist-userblocks' => '隱藏口座的封鎖',
-'blocklist-tempblocks' => '隱藏臨時的封鎖',
-'blocklist-addressblocks' => '隱藏孤一个的IP封鎖',
-'blocklist-rangeblocks' => '隱藏區段IP的封鎖',
-'blocklist-timestamp' => '戳印的時間',
-'blocklist-target' => '目標',
-'blocklist-expiry' => '到期',
-'blocklist-by' => '封鎖管理員',
-'blocklist-params' => '封鎖的參數',
-'blocklist-reason' => '理由',
-'ipblocklist-submit' => '揣',
-'ipblocklist-localblock' => '本地封鎖',
-'ipblocklist-otherblocks' => '其他的{{PLURAL:$1|封鎖|封鎖}}',
-'infiniteblock' => '無限',
-'expiringblock' => '佇$1  $2 到期',
-'anononlyblock' => '只限無名氏',
-'noautoblockblock' => '自動封鎖袂當用',
-'createaccountblock' => '停止開口座',
-'emailblock' => '電子批封鎖牢咧',
-'blocklist-nousertalk' => '袂當改家己的討論頁',
-'ipblocklist-empty' => '封鎖清單空的',
-'ipblocklist-no-results' => '請求的IP地址抑是用者名稱無予人封鎖牢咧。',
+'ipusubmit' => 'Chhú-siau hong-só chit ê chū-chí',
+'ipblocklist' => 'Siū hong-só ê IP chū-chí kap iōng-chiá miâ-chheng',
 'blocklink' => 'hong-só',
-'unblocklink' => '取消封鎖',
-'change-blocklink' => '改封鎖',
 'contribslink' => 'kòng-hiàn',
-'emaillink' => '寄電子批',
-'autoblocker' => 'Chū-tōng kìm-chí lí sú-iōng, in-ūi lí kap "[[User:$1|$1]]" kong-ke kāng 1 ê IP chū-chí.
-$1 ê kìm-chí lí-iû sī in-ūi "$2".',
-'blocklogpage' => '封鎖記錄',
-'blocklog-showlog' => '這个用者進前予人封鎖牢咧,
-下跤有封鎖的記錄會當參考:',
-'blocklog-showsuppresslog' => '這个用者進前予人封鎖牢咧閣共隱藏,
-下跤有封鎖的記錄會當參考:',
+'autoblocker' => 'Chū-tōng kìm-chí lí sú-iōng, in-ūi lí kap "$1" kong-ke kāng 1 ê IP chū-chí (kìm-chí lí-iû "$2").',
 'blocklogentry' => 'hong-só [[$1]], siat kî-hān chì $2 $3',
-'reblock-logentry' => '改[[$1]]的封鎖到期時間 $2 $3',
 'blocklogtext' => 'Chit-ê log lia̍t-chhut block/unblock ê tōng-chok. Chū-tōng block ê IP chū-chí bô lia̍t--chhut-lâi ([[Special:BlockList]] ū hiān-chú-sî ū-hāu ê block/ban o·-miâ-toaⁿ).',
-'unblocklogentry' => '解除封鎖$1',
-'block-log-flags-anononly' => '只會當是無名氏用者',
 'block-log-flags-nocreate' => 'Khui kháu-chō thêng-iōng ah',
-'block-log-flags-noautoblock' => '自動封鎖袂當用',
-'block-log-flags-noemail' => '電子批封鎖牢咧',
-'block-log-flags-nousertalk' => '袂當改家己的討論頁',
-'block-log-flags-angry-autoblock' => '已經有加強版的自動封鎖',
-'block-log-flags-hiddenname' => '用者名稱藏起來矣',
-'range_block_disabled' => '管理員使用區段IP封鎖的功能已經停用。',
-'ipb_expiry_invalid' => '到期的時間毋著',
-'ipb_expiry_temp' => '隱藏用者名稱的封鎖是永久性的。',
-'ipb_hide_invalid' => '無法度封鎖這个口座,伊可能做過誠濟擺的編輯。',
-'ipb_already_blocked' => '"$1"是封鎖牢咧',
-'ipb-needreblock' => '$1已經封鎖牢咧,你敢欲敢這个設定?',
-'ipb-otherblocks-header' => '其他的{{PLURAL:$1|封鎖|封鎖}}',
-'unblock-hideuser' => '你無法度解封這个用者,因為in的名稱予人隱藏起來。',
-'ipb_cant_unblock' => '錯誤:無$1的封鎖,伊可能已經解除封鎖。',
-'ipb_blocked_as_range' => '錯誤: IP地址$1無予人直接封鎖,所以無通解除封鎖。
-毋過,伊佇$2範圍內底,彼範圍為當共解除封鎖。',
-'ip_range_invalid' => '毋著的網址(IP)範圍',
-'ip_range_toolarge' => '超過 /$1 的封鎖範圍是袂當的。',
-'blockme' => '封鎖我',
-'proxyblocker' => '代理封鎖器',
-'proxyblocker-disabled' => '這个功能袂當用。',
-'proxyblockreason' => '你的IP地址是一个開放的代理,伊已經予人封鎖。
-請聯絡你的網路服務提供商、抑是你單位的技術支援者,閣共in講這个嚴重的安全問題。',
-'proxyblocksuccess' => '完成。',
-'sorbsreason' => '你的IP地址佇{{SITENAME}}是當做DNSBL的開放代理服務器之一。',
-'sorbs_create_account_reason' => '你的IP地址佇{{SITENAME}}是當做DNSBL的開放代理服務器之一。
-你袂當建立口座',
-'cant-block-while-blocked' => '你若予人封鎖牢咧,你就袂封鎖別个用者。',
-'cant-see-hidden-user' => '你想欲封鎖的用者已經予人封鎖抑是隱藏,
-因為你無授權隱藏用戶,你袂當看抑是改這个用者的封鎖。',
-'ipbblocked' => '你袂當封鎖抑是解除封鎖別个用者,因為你本身就封鎖牢咧。',
-'ipbnounblockself' => '你袂當對家己解除封鎖',
 
 # Developer tools
-'lockdb' => '封鎖資料庫',
-'unlockdb' => '解除對資料庫的封鎖',
-'lockdbtext' => '封鎖資料庫會停止所有的用者去改頁、改設定、改監視單佮其他佇資料庫的修改,
-請確定你欲按呢做,閣愛佇你維修了解除封鎖。',
-'unlockdbtext' => '解除封鎖會予所有的用者通編輯、改設定、改監視單佮其他通改資料庫的代誌,
-請確認這是你欲做的動作。',
-'lockconfirm' => '是,我確實欲封鎖資料庫。',
-'unlockconfirm' => '是,我確實欲解除封鎖資料庫。',
-'lockbtn' => '封鎖資料庫',
-'unlockbtn' => '解除對資料庫的封鎖',
 'locknoconfirm' => 'Lí bô kau "khak-tēng" ê keh-á.',
-'lockdbsuccesssub' => '資料庫封鎖成功',
-'unlockdbsuccesssub' => '已經共資料庫的封鎖解除',
-'lockdbsuccesstext' => '資料庫已經封鎖牢咧。<br />
-維修了,愛會記得[[Special:UnlockDB|解除封鎖]]。',
-'unlockdbsuccesstext' => '資料庫已經解除封鎖',
-'lockfilenotwritable' => '資料庫的記錄檔案袂當寫入去,
-欲封鎖抑解除封鎖,需要網路伺服器愛會當寫入。',
-'databasenotlocked' => '資料庫無封鎖牢咧。',
-'lockedbyandtime' => '( {{GENDER:$1|$1}}佇$2 $3做的)',
 
 # Move page
 'move-page' => '徙$1',
 'move-page-legend' => 'Sóa ia̍h',
-'movepagetext' => "Ē-kha chit ê pió iōng lâi kái 1 ê ia̍h ê piau-tê (miâ-chheng); só·-ū siong-koan ê le̍k-sú ē tòe leh sóa khì sin piau-tê.
+'movepagetext' => "Ē-kha chit ê form> iōng lâi kái 1 ê ia̍h ê piau-tê (miâ-chheng); só·-ū siong-koan ê le̍k-sú ē tòe leh sóa khì sin piau-tê.
 Kū piau-tê ē chiâⁿ-chò 1 ia̍h choán khì sin piau-tê ê choán-ia̍h.
-Liân khì kū piau-tê ê liân-kiat (link) bē khì tāng--tio̍h; ē-kì-tit chhiau-chhōe [[Special:DoubleRedirects|siang-thâu (double)]] ê a̍h-sī [[Special:BrokenRedirects|kò·-chiòng ê choán-ia̍h]].
+Liân khì kū piau-tê ê liân-kiat (link) bē khì tāng--tio̍h; ē-kì-tit chhiau-chhōe siang-thâu (double) ê a̍h-sī kò·-chiòng ê choán-ia̍h.
 Lí ū chek-jīm khak-tēng liân-kiat kè-sio̍k liân tio̍h ūi.
 
 Sin piau-tê nā í-keng tī leh (bô phian-chi̍p koè ê khang ia̍h, choán-ia̍h bô chún-sǹg), tō bô-hoat-tō· soá khì hia.
@@ -2438,223 +957,58 @@ Che piaú-sī nā ū têng-tâⁿ, ē-sái kā sin ia̍h soà tńg-khì goân-l
 '''SÈ-JĪ!'''
 Tùi chē lâng tha̍k ê ia̍h lâi kóng, soá-ūi sī toā tiâu tāi-chì.
 Liâu--lo̍h-khì chìn-chêng, chhiáⁿ seng khak-tēng lí ū liáu-kái chiah-ê hiō-kó.",
-'movepagetext-noredirectfixer' => "用下跤的表通改頁的名,閣改伊的歷史版本徙去新的,
-舊名稱這頁會轉向新頁,
-嘛愛去檢查看有[[Special:DoubleRedirects|轉兩遍]],抑是[[Special:BrokenRedirects|轉無去]],
-你有責任確定連接有指到應該去的位。
-
-請注意若新名稱的頁已經佇咧,徙的動作'''袂做''',除非彼是空的抑是轉頁閣無編輯過,
-這表示,你若創毋著,你會當改倒轉去,而且袂去崁掉一个存在的頁。
-
-'''注意!'''
-這佇熱門的頁是一个激烈、意外的改變,佇你做進前,請你確定你了解這个後果。",
 'movepagetalktext' => "Siong-koan ê thó-lūn-ia̍h (chún ū) oân-nâ ē chū-tōng tòe leh sóa-ūi. Í-hā ê chêng-hêng '''bô chún-sǹg''': *Beh kā chit ia̍h tùi 1 ê miâ-khong-kan (namespace) soá khì lēng-gōa 1 ê miâ-khong-kan, *Sin piau-tê í-keng ū iōng--kòe ê thó-lūn-ia̍h, he̍k-chiá *Ē-kha ê sió-keh-á bô phah-kau. Í-siōng ê chêng-hêng nā-chún tī leh, lí chí-hó iōng jîn-kang ê hong-sek sóa ia̍h a̍h-sī kā ha̍p-pèng (nā ū su-iàu).",
 'movearticle' => 'Sóa ia̍h:',
-'moveuserpage-warning' => "'''注意:'''你咧徙用著的頁,請注意這干焦徙振動頁,''無''改用者名。",
 'movenologin' => 'Bô teng-ji̍p',
 'movenologintext' => 'Lí it-tēng ài sī chù-chheh ê iōng-chiá jī-chhiáⁿ ū [[Special:UserLogin|teng-ji̍p]] chiah ē-tàng sóa ia̍h.',
-'movenotallowed' => '你無授權通去徙頁',
-'movenotallowedfile' => '你無授權通去徙檔案',
-'cant-move-user-page' => '你無授權通去徙用者頁(無包括伊的下頁)',
-'cant-move-to-user-page' => '你無授權通去徙用者頁(下頁例外)',
 'newtitle' => 'Khì sin piau-tê:',
 'move-watch' => 'Kàm-sī chit ia̍h',
 'movepagebtn' => 'Sóa ia̍h',
 'pagemovedsub' => 'Sóa-ūi sêng-kong',
-'movepage-moved' => '\'\'\'"$1" 已經徙去 "$2"\'\'\'',
-'movepage-moved-redirect' => '已經建立一个轉向的頁。',
-'movepage-moved-noredirect' => '建立轉頁無成。',
 'articleexists' => 'Kāng miâ ê ia̍h í-keng tī leh, a̍h-sī lí kéng ê miâ bô-hāu. Chhiáⁿ kéng pa̍t ê miâ.',
-'cantmove-titleprotected' => '你袂當徙頁去這位,因為新名稱的建立予人保護牢咧。',
 'talkexists' => "'''Ia̍h ê loē-bûn ū soá cháu, m̄-koh siong-koan ê thó-lūn-ia̍h bô toè leh soá, in-ūi sin piau-tê pun-té tō ū hit ia̍h. Chhiáⁿ iōng jîn-kang ê hoat-tō· kā ha̍p-pèng.'''",
 'movedto' => 'sóa khì tī',
 'movetalk' => 'Sūn-sòa sóa thó-lūn-ia̍h',
-'move-subpages' => '徙子頁(上到$1頁)',
-'move-talk-subpages' => '徙討論頁的子頁(上到$1頁)',
-'movepage-page-exists' => '頁面 $1 已經佇咧,袂當自動崁過。',
 'movepage-page-moved' => '$1 í-keng sóa khì tī $2.',
-'movepage-page-unmoved' => '$1這頁袂當徙去$2',
-'movepage-max-pages' => '上濟$1{{PLURAL:$1|頁|頁}}已經徙位,袂有閣甲濟會自動徙位。',
-'movelogpage' => '徙位記錄',
 'movelogpagetext' => 'Ē-kha lia̍t-chhut hông soá-ūi ê ia̍h.',
-'movesubpage' => '{{PLURAL:$1|子頁|子頁}}',
-'movesubpagetext' => '這頁有$篇{{PLURAL:$1|子頁|子頁}}佇下跤。',
-'movenosubpage' => '這頁無下頁',
 'movereason' => 'Lí-iû:',
-'revertmove' => '回轉',
-'delete_and_move' => '刣掉而且徙走',
-'delete_and_move_text' => '==需要刣掉==
-目標頁面"[[:$1]]"已經有矣,
-你敢真正欲為著徙頁共彼頁刣掉?',
-'delete_and_move_confirm' => '無毋著,共刣掉彼頁。',
-'delete_and_move_reason' => '為著徙位,[[$1]]已經刣掉。',
 'selfmove' => 'Goân piau-tê kap sin piau-tê sio-siâng; bô hoat-tō· sóa.',
-'immobile-source-namespace' => '佇"$1"名空間內底袂使徙頁。',
-'immobile-target-namespace' => '袂當共頁徙去$1名空間。',
-'immobile-target-namespace-iw' => '跨維基的連結袂當用佇徙頁。',
-'immobile-source-page' => '這頁袂當徙振動。',
-'immobile-target-page' => '無法度徙去指定的標題',
-'imagenocrossnamespace' => '檔案只會當佇"檔案"名空間內底徙位。',
-'nonfile-cannot-move-to-file' => '袂當共毋是檔案的物件徙來"檔案"名空間。',
-'imagetypemismatch' => '新檔案尾的類型無符合伊的類型。',
-'imageinvalidfilename' => '目標的檔案名稱無適當',
-'fix-double-redirects' => '改新所有指到原本標題的轉向。',
-'move-leave-redirect' => '留一个轉向',
 'protectedpagemovewarning' => "'''KÉNG-KÒ: Pún ia̍h só tiâu leh. Kan-taⁿ ū hêng-chèng te̍k-koân ê iōng-chiá (sysop) ē-sái soá tín-tāng.'''
 Ē-kha ū choè-kīn ê kì-lio̍k thang chham-khó:",
-'semiprotectedpagemovewarning' => "'''注意:'''這頁予人保護牢咧,只有有註冊的用者通徙振動,
-下跤有最近的記錄通參考:",
-'move-over-sharedrepo' => '== 檔案已經存在 ==
-[[:$1]]已經佇共享資源,共檔案徙到這个標題會蓋掉共享的檔案。',
-'file-exists-sharedrepo' => '仝名的檔案已經佇共享資源,
-請用另外一个檔案名稱。',
 
 # Export
 'export' => 'Su-chhut ia̍h',
-'exporttext' => '你會當共某一頁抑是一組頁的文字佮修改歷史以 XML 格式輸出,
-按呢就會當佇別个用MediaWiki的Wiki網站,佇[[Special:Import|輸入頁]]做輸入。
-
-欲輸出頁面,請佇下跤的文字框拍頁的標題,每一逝一个標題,閣選擇你敢欲這馬的修訂本佮所有過去的修訂本、頁的歷史項目,抑是這馬的修訂本佮上尾的編輯信息。
-
-另外你嘛會當連結輸出檔案,親像你會當用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]輸出「[[{{MediaWiki:Mainpage}}]]」這頁。',
-'exportall' => '輸出所有的頁',
 'exportcuronly' => 'Hān hiān-chhú-sî ê siu-téng-pún, mài pau-koat kui-ê le̍k-sú',
-'exportnohistory' => "----
-'''注意:'''因為性能的原因,對這个表輸出頁面的全部歷史已經停止。",
-'exportlistauthors' => '包括每一頁的貢獻者全部清單',
-'export-submit' => '輸出',
-'export-addcattext' => '對這類別加頁面:',
-'export-addcat' => '加頁面',
-'export-addnstext' => '對這个名空間加頁面:',
-'export-addns' => '加頁面',
-'export-download' => '保存做檔案',
-'export-templates' => '包括枋模',
-'export-pagelinks' => '包刮到第幾層的轉頁:',
 
 # Namespace 8 related
 'allmessages' => 'Hē-thóng sìn-sit',
 'allmessagesname' => 'Miâ',
 'allmessagesdefault' => 'Siat piān ê bûn-jī',
 'allmessagescurrent' => 'Bo̍k-chêng ê bûn-jī',
-'allmessagestext' => 'Che sī MediaWiki: miâ-khong-kan lāi-té ê hē-thóng sìn-sit chheng-toaⁿ.
-Lí nā beh tàu saⁿ-kang hoan-e̍k. Chhiáⁿ kàu [//www.mediawiki.org/wiki/Localisation MediaWiki chāi-tè-hoà] kap [//translatewiki.net translatewiki.net] bāng-chām.',
-'allmessagesnotsupportedDB' => "這頁袂當用得,因為'''\$wgUseDatabaseMessages'''已經停用。",
-'allmessages-filter-legend' => '過濾器',
-'allmessages-filter' => '以家己設的去過濾:',
-'allmessages-filter-unmodified' => '無修改過',
-'allmessages-filter-all' => '全部',
-'allmessages-filter-modified' => '修改',
-'allmessages-prefix' => '欲做過濾的頭前文字:',
-'allmessages-language' => '話語:',
-'allmessages-filter-submit' => '來去',
+'allmessagestext' => 'Chia lia̍t chhut só·-ū tī MediaWiki: miâ-khong-kan ê hē-thóng sìn-sit.',
 
 # Thumbnails
 'thumbnail-more' => 'Hòng-tōa',
 'filemissing' => 'Bô tóng-àn',
-'thumbnail_error' => '產生小圖時錯誤:$1',
-'djvu_page_error' => 'DjVu頁面超出範圍',
-'djvu_no_xml' => '無法度對DjVu檔案內底取得XML',
-'thumbnail-temp-create' => '無法度建立臨時的小圖檔案',
-'thumbnail-dest-create' => '袂當共小圖囥去欲囥的位',
-'thumbnail_invalid_params' => '無適當的小圖參數',
-'thumbnail_dest_directory' => '無法度建立目標的目錄',
-'thumbnail_image-type' => '圖相的類型無支援',
-'thumbnail_gd-library' => '未完成的GD設定: 欠功能$1',
-'thumbnail_image-missing' => '檔案敢若無看:$1',
 
 # Special:Import
 'import' => 'Su-ji̍p ia̍h',
-'importinterwiki' => '跨 wiki 輸入',
-'import-interwiki-text' => '選一个Wiki佮頁標題來輸入,
-修訂本日期佮修改者名稱會保留,
-所有跨Wiki的輸入動作會記佇[[Special:Log/import|輸入記錄]]。',
-'import-interwiki-source' => '來源Wiki/頁面:',
-'import-interwiki-history' => '拷備這頁的所有修訂本',
-'import-interwiki-templates' => '包括所有的枋模',
-'import-interwiki-submit' => '輸入',
-'import-interwiki-namespace' => '目標名空間:',
-'import-upload-filename' => '檔案名稱:',
-'import-comment' => '註釋:',
-'importtext' => '請佇來源的Wiki,使用[[Special:Export|輸出功能]]輸出檔案,
-匟入去你的電腦了,閣共上載到遮。',
-'importstart' => '當咧輸入頁面...',
-'import-revision-count' => '$1份{{PLURAL:$1|修訂本|修訂本}}',
-'importnopages' => '無頁通輸入。',
-'imported-log-entries' => '輸入的$1 {{PLURAL:$1|log entry|記錄條目}}。',
-'importfailed' => '輸入失敗: <nowiki>$1</nowiki>',
-'importunknownsource' => '毋捌的輸入來源類型',
-'importcantopen' => '無法度拍開輸入的檔案',
-'importbadinterwiki' => '毋著的跨Wiki連結',
-'importnotext' => '空的抑是無字',
-'importsuccess' => '輸入完成!',
-'importhistoryconflict' => '有衝突的修訂本佇咧(可能是進前捌輸入這頁)',
-'importnosources' => '毋捌定義跨Wiki輸入的來源,而且直接上載歷史是袂當用。',
-'importnofile' => '無輸入的檔案有上載。',
-'importuploaderrorsize' => '輸入的檔案上載失敗,
-檔案大過通上載的量。',
-'importuploaderrorpartial' => '上載輸入檔案已經失敗。
-只有部份檔案已經上載。',
-'importuploaderrortemp' => '上載輸入檔案已經失敗。
-臨時檔案鋏仔已經無去。',
-'import-parse-failure' => 'XML輸入語法失敗',
-'import-noarticle' => '無頁通輸入!',
-'import-nonewrevisions' => '所有的修訂本進前已經輸入了。',
-'xml-error-string' => '$1佇$2行,$3欄 (位元組$4):$5',
-'import-upload' => '上載XML資料',
-'import-token-mismatch' => '失去連線的資料,
-請閣試一擺。',
-'import-invalid-interwiki' => '袂使對所指定的Wiki輸入。',
-'import-error-edit' => '"$1"這頁無輸入,因為你無允准通共改。',
-'import-error-create' => '"$1"這頁無輸入,因為你無允准通建立。',
-'import-error-interwiki' => '"$1"這頁無輸入,因為彼个名稱已經保留予外部連結(跨Wiki連結)。',
-'import-error-special' => '無共頁面"$1"輸入,因為名稱是留予名空間,袂當用佇頁面。',
-'import-error-invalid' => '無輸入"$1"這頁,因為名稱無適合。',
-
-# Import log
-'importlogpage' => '輸入記錄',
-'importlogpagetext' => '管理上的輸入別个wiki頁面佮編輯歷史。',
-'import-logentry-upload' => '透過上載檔案輸入[[$1]]',
-'import-logentry-upload-detail' => '$1份{{PLURAL:$1|修訂本|修訂本}}',
-'import-logentry-interwiki' => '跨Wiki的$1',
-'import-logentry-interwiki-detail' => '對$2來的$1份{{PLURAL:$1|修訂本|修訂本}}',
-
-# JavaScriptTest
-'javascripttest' => 'JavaScript試用',
-'javascripttest-disabled' => '這个功能袂當用。',
-'javascripttest-title' => '試用$1',
-'javascripttest-pagetext-noframework' => '這頁市保留予試用JavaScrips。',
-'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' => 'Lí chit ê iōng-chiá ê ia̍h',
-'tooltip-pt-anonuserpage' => '你編輯本站所用IP所對應的用者頁',
 'tooltip-pt-mytalk' => 'Lí ê thó-lūn ia̍h',
-'tooltip-pt-anontalk' => '這个IP地址為著編輯所做的討論',
 'tooltip-pt-preferences' => 'Lí ê siat-tēng',
-'tooltip-pt-watchlist' => '你監視的頁有改過的列表',
 'tooltip-pt-mycontris' => 'Lí ê kòng-hiàn lia̍t-toaⁿ',
 'tooltip-pt-login' => 'Hi-bāng lí teng-ji̍p; m̄-ko bô kiông-chè',
 'tooltip-pt-anonlogin' => 'Hi-bāng lí teng-ji̍p; m̄-ko bô kiông-chè',
 'tooltip-pt-logout' => 'Teng-chhut',
 'tooltip-ca-talk' => 'Loē-iông ê thó-lūn',
 'tooltip-ca-edit' => 'Lí ē-sái kái chit ia̍h. Beh chhûn chìn-chiân, chhiáⁿ chhi̍h  sing-khoàⁿ-māi ê liú-á',
-'tooltip-ca-addsection' => '寫新的一段',
 'tooltip-ca-viewsource' => 'Chit ia̍h pó-hō͘ tiâu leh.
 Lí ē-sái khoàⁿ i ê goân-sú-bé.',
 'tooltip-ca-history' => 'Chit ia̍h ê chá-chêng pán-pún',
-'tooltip-ca-protect' => '保護這頁',
-'tooltip-ca-unprotect' => '改這頁的保護',
-'tooltip-ca-delete' => 'Thâi chit ia̍h',
-'tooltip-ca-undelete' => '恢復這頁予人刣掉進前的編輯',
-'tooltip-ca-move' => '徙這頁',
-'tooltip-ca-watch' => '共這頁加入你的監視單',
 'tooltip-ca-unwatch' => 'Lí ê kàm-sī-toaⁿ soá tiàu chit ia̍h.',
 'tooltip-search' => 'Chhoé {{SITENAME}}',
-'tooltip-search-go' => '跳去佮這完全仝名的頁',
 'tooltip-search-fulltext' => 'Chhoé ū chia-ê jī ê ia̍h',
 'tooltip-p-logo' => 'Khì thâu-ia̍h',
 'tooltip-n-mainpage' => 'Khì thâu-ia̍h',
@@ -2666,591 +1020,68 @@ Lí ē-sái khoàⁿ i ê goân-sú-bé.',
 'tooltip-n-help' => 'Beh chhoé ê só͘-chāi',
 'tooltip-t-whatlinkshere' => 'Só͘-ū liân kàu chia ê liat-toaⁿ',
 'tooltip-t-recentchangeslinked' => 'Liân kàu chit ia̍h koh choè-kīn ū kái koè--ê',
-'tooltip-feed-rss' => '訂看這頁的RSS',
-'tooltip-feed-atom' => '這頁有Atom訂看的',
 'tooltip-t-contributions' => 'Khoàⁿ chit ê iōng-chiá ê kòng-hiàn lia̍t-toaⁿ',
-'tooltip-t-emailuser' => '寄一張e-mail予這个用者',
 'tooltip-t-upload' => 'Í-keng sàng chiūⁿ-bāng ê tóng-àn',
 'tooltip-t-specialpages' => 'Só͘-ū te̍k-sû-ia̍h ê lia̍t-toaⁿ',
 'tooltip-t-print' => 'Chit ia̍h ê ìn-soat pán-pún',
 'tooltip-t-permalink' => 'Chi̍t ia̍h kái--koè pán-pún ê éng-kiú liân-kiat',
 'tooltip-ca-nstab-main' => 'khoàⁿ ia̍h ê loē-iông',
 'tooltip-ca-nstab-user' => 'Khoàⁿ iōng-chiá ê Ia̍h',
-'tooltip-ca-nstab-media' => '看媒體頁',
-'tooltip-ca-nstab-special' => '這是一篇特殊頁,你袂當編輯。',
-'tooltip-ca-nstab-project' => '看事工頁',
 'tooltip-ca-nstab-image' => 'Khoàⁿ tóng-àn ia̍h',
-'tooltip-ca-nstab-mediawiki' => '看系統訊息',
-'tooltip-ca-nstab-template' => '看枋模',
-'tooltip-ca-nstab-help' => '看幫贊頁',
 'tooltip-ca-nstab-category' => 'Khoàⁿ lūi-pia̍t ia̍h',
-'tooltip-minoredit' => '共這做一个小修改記號',
 'tooltip-save' => 'Pó-chhûn lí chò ê kái-piàn',
 'tooltip-preview' => 'Chhiáⁿ tī pó-chûn chìn-chêng,  sian khoàⁿ lí chò ê kái-piàn !',
-'tooltip-diff' => '顯示你對這頁所改的',
-'tooltip-compareselectedversions' => '看選擇的兩个修訂本差偌濟',
-'tooltip-watch' => '共這頁加入你的監視單',
-'tooltip-watchlistedit-normal-submit' => '莫監視',
-'tooltip-watchlistedit-raw-submit' => '改監視單',
-'tooltip-recreate' => '重建立頁,就算講伊欲予人刣掉',
-'tooltip-upload' => '開始上載',
 'tooltip-rollback' => 'Ji̍h "Hoê-choán" ē-sái thè tńg-khì téng-chi̍t-ê kái ê lâng ê ia̍h.',
-'tooltip-undo' => '『取消』會使回轉這个編輯而且會使先看覓編輯的結果,閣會使佇概要加入原因。',
 'tooltip-preferences-save' => '保存設定',
 'tooltip-summary' => 'Siá chi̍t-ê kán-tan soat-bêng',
 
-# Metadata
-'notacceptable' => '網站伺服器無提供你客戶端通讀的資料格式。',
-
 # Attribution
-'anonymous' => '{{SITENAME}} ê {{PLURAL:$1|ê bô kì-miâ ê iōng-chiá|ê bô kì-miâ ê iōng-chiá}} .',
+'anonymous' => '{{SITENAME}} bô kì-miâ ê iōng-chiá',
 'siteuser' => '{{SITENAME}} iōng-chiá $1',
-'anonuser' => '{{SITENAME}}的無名氏用者 $1',
-'lastmodifiedatby' => '這頁頂回佇$1 $2予$3改過。',
 'othercontribs' => 'Kin-kù $1 ê kòng-hiàn.',
-'others' => '其他',
-'siteusers' => '{{SITENAME}} {{PLURAL:$2|iōng-chiá|iōng-chiá}} $1',
-'anonusers' => '{{SITENAME}}無名氏{{PLURAL:$2|用者|用者}}$1',
-'creditspage' => '頁面感謝',
-'nocredits' => '這頁無感謝名單的信息。',
-
-# Spam protection
-'spamprotectiontitle' => '垃圾過濾器',
-'spamprotectiontext' => '你欲保存的文字予垃圾過濾器阻擋。
-這可能是因為有一个連接是連到其他的黑名單網站。',
-'spamprotectionmatch' => '下跤的文字引起垃圾過濾器:$1',
-'spambot_username' => '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' => '幾个作者',
-'pageinfo-views' => '看幾擺',
-'pageinfo-viewsperedit' => '看每一个編輯',
+'siteusers' => '{{SITENAME}} iōng-chiá $1',
 
 # Patrolling
 'markaspatrolleddiff' => 'Phiau-sī sûn--kòe',
-'markaspatrolledtext' => 'kā chit ia̍h kì-hō chò sûn--koè = 共這頁記號做巡過',
-'markedaspatrolled' => 'kì-hō chò sûn--koè = 記號做巡過',
-'markedaspatrolledtext' => 'Soán-te̍k  ê siu-tēng-pún [[:$1]]  í-keng kì-hō chò sûn--kòe.',
-'rcpatroldisabled' => '巡最近改的功能已經關掉',
-'rcpatroldisabledtext' => '巡最近改過的功能這馬停用。',
-'markedaspatrollederror' => '袂使記號做巡查過',
-'markedaspatrollederrortext' => '你愛指定一个修訂本是巡過的',
-'markedaspatrollederror-noautopatrol' => '你袂當記號你家己改的修訂本是巡過的',
-
-# Patrol log
-'patrol-log-page' => '巡查記錄',
-'patrol-log-header' => '這是一个已經巡查過的修訂本記錄',
-'log-show-hide-patrol' => '$1巡查記錄',
+'markedaspatrolledtext' => 'Í-keng phiau-sī chit ê siu-tēng-pún ū lâng sûn--kòe.',
 
 # Image deletion
 'deletedrevision' => 'Kū siu-tēng-pún $1 thâi-tiāu ā.',
-'filedeleteerror-short' => '欲刣掉檔案的時陣有錯誤:$1',
-'filedeleteerror-long' => '佇欲刣掉檔案的時陣有錯誤:
-
-$1',
-'filedelete-missing' => '"$1"這个檔案袂當刣掉,無彼个檔案。',
-'filedelete-old-unregistered' => '指定的"$1"檔案修訂本無佇資料庫內底。',
-'filedelete-current-unregistered' => '指定的"$1"檔案無佇資料庫內底。',
-'filedelete-archive-read-only' => '佇網站伺服器的存檔目錄 "$1" 袂當寫入去。',
 
 # Browsing diffs
-'previousdiff' => '← Khì chêng 1 ê siu-kái',
-'nextdiff' => 'Khì āu 1 ê siu-kái →',
+'previousdiff' => '← Khì chêng 1 ê diff',
+'nextdiff' => 'Khì āu 1 ê diff →',
 
 # Media information
-'mediawarning' => "'''注意''':這款檔案類型可能有惡意的資料。
-執行彼,可能對你的系統帶來危害。",
-'imagemaxsize' => "Iáⁿ-siōng toā-sè ê hān-chè:<br />''(ēng tī tóng-àn soeh-bêng-ia̍h)''",
+'imagemaxsize' => 'Iáⁿ-siōng biô-su̍t-ia̍h ê tô· ke̍k-ke hián-sī jōa tōa tiuⁿ:',
 'thumbsize' => 'Sok-tô· (thumbnail) jōa tōa tiuⁿ:',
-'widthheightpage' => '$1 × $2, {{PLURAL:$3|頁|頁}}',
-'file-info' => '檔案大細:$1,MIME類型:$2',
-'file-info-size' => '$1 × $2  像素,檔案大細:$3,MIME類型:$4',
-'file-info-size-pages' => '$1 × $2 像素,檔案大細: $3,檔案類型: $4, $5 {{PLURAL:$5|頁|頁}}',
 'file-nohires' => 'Bô khah koân ê kái-sek-tō͘.',
-'svg-long-desc' => 'SVG 檔案,一般的長闊:$1 × $2 像素,檔案大小:$3',
-'show-big-image' => '檔案解析度',
-'show-big-image-preview' => '這張先看覓的大細:$1',
-'show-big-image-other' => '其他{{PLURAL:$2|解析度|解析度}}:$1。',
-'show-big-image-size' => '$1 × $2像素',
-'file-info-gif-looped' => '循環',
-'file-info-gif-frames' => '$1{{PLURAL:$1|幅|幅}}',
-'file-info-png-looped' => '循環',
-'file-info-png-repeat' => '播送$1 {{PLURAL:$1|擺|擺}}',
-'file-info-png-frames' => '$1{{PLURAL:$1|幅|幅}}',
 
 # Special:NewFiles
 'newimages' => 'Sin iáⁿ-siōng oē-lóng',
-'imagelisttext' => "Í-hā sī '''$1''' {{PLURAL:$1|tiuⁿ|tiuⁿ}} iáⁿ-siōng ê lia̍t-toaⁿ, chiàu $2 pâi-lia̍t.",
-'newimages-summary' => '這个特殊頁顯示頂一个上載的檔案。',
-'newimages-legend' => '過濾器',
-'newimages-label' => '檔案名稱(抑伊的部份名稱)',
-'showhidebots' => '($1機器人)',
-'noimages' => '無物件通看。',
+'imagelisttext' => "Í-hā sī '''$1''' tiuⁿ iáⁿ-siōng ê lia̍t-toaⁿ, $2 pâi-lia̍t.",
 'ilsubmit' => 'Kiám-sek',
 'bydate' => 'chiàu ji̍t-kî',
-'sp-newimages-showfrom' => ' 顯示$2, $1後尾的新檔案',
-
-# 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' => '規格照下跤:
-
-只有(以 * 做頭)排列出的項目會處理。
-每一逝的第一个連結是bad file的連結。
-了後仝一逝後壁的連結會看做是例外,也就是彼个檔案會使佇佗位的頁面通顯示。',
 
 # Metadata
-'metadata' => '元資訊',
-'metadata-help' => '這个檔案有其他的資訊,可能是翕相機抑是掃描器寫的,
-若檔案有人改過,一寡說明就無完全反應改過的檔案',
 'metadata-expand' => 'Hián-sī iù-chiat',
 'metadata-collapse' => 'Am iù-chiat',
-'metadata-fields' => '這个信息所排來出的影相元資料,是會佇欲顯示元資料表的時陣顯示。
-其他的元資料是先藏起來。
-* make
-* model
-* datetimeoriginal
-* exposuretime
-* fnumber
-* isospeedratings
-* focallength
-* artist
-* copyright
-* imagedescription
-* gpslatitude
-* gpslongitude
-* gpsaltitude',
-
-# EXIF tags
-'exif-imagewidth' => '闊',
-'exif-imagelength' => '懸',
-'exif-bitspersample' => '代表每一个像素色水的位元數',
-'exif-compression' => '壓縮方式',
-'exif-photometricinterpretation' => '像素合成',
-'exif-orientation' => '方向',
-'exif-samplesperpixel' => '像素數目',
-'exif-planarconfiguration' => '資料排列',
-'exif-ycbcrsubsampling' => '黃色對洋紅的二次抽樣比率',
-'exif-ycbcrpositioning' => 'Y佮C定位',
-'exif-xresolution' => '水平方向數目',
-'exif-yresolution' => '直的方向數目',
-'exif-stripoffsets' => '圖像資料區',
-'exif-rowsperstrip' => '每帶幾逝',
-'exif-stripbytecounts' => '每一條壓縮帶的位元組',
-'exif-jpeginterchangeformat' => 'JPEG SOI 偏徙',
-'exif-jpeginterchangeformatlength' => 'JPEG 資料的位元組',
-'exif-whitepoint' => '白點的色度',
-'exif-primarychromaticities' => '主要的色度',
-'exif-ycbcrcoefficients' => '色水空間轉換矩陣係數',
-'exif-referenceblackwhite' => '烏白參照數值對',
-'exif-datetime' => '檔案改的日期佮時間',
-'exif-imagedescription' => '影相標題',
-'exif-make' => '相機製造商',
-'exif-model' => '相機款式',
-'exif-software' => '使用的軟體',
-'exif-artist' => '著作者',
-'exif-copyright' => '著作權所有人',
-'exif-exifversion' => 'Exif 版本',
-'exif-flashpixversion' => '支援的 Flashpix 版本',
-'exif-colorspace' => '顏色空間',
-'exif-componentsconfiguration' => '每一个成分的意思',
-'exif-compressedbitsperpixel' => '圖像的壓縮模式',
-'exif-pixelydimension' => '圖像闊度',
-'exif-pixelxdimension' => '圖像懸度',
-'exif-usercomment' => '用者的說明',
-'exif-relatedsoundfile' => '相關的聲音檔案',
-'exif-datetimeoriginal' => '產生資料的時間',
-'exif-datetimedigitized' => '數位化的時間',
-'exif-subsectime' => '日期分秒',
-'exif-subsectimeoriginal' => '原本的日期時間秒',
-'exif-subsectimedigitized' => '數位化的時間秒',
-'exif-exposuretime' => '曝光時間',
-'exif-exposuretime-format' => '$1 秒 ($2)',
-'exif-fnumber' => '光圈(F數值)',
-'exif-exposureprogram' => '曝光模式',
-'exif-spectralsensitivity' => '感光',
-'exif-isospeedratings' => 'ISO 速率',
-'exif-shutterspeedvalue' => 'APEX快門速度',
-'exif-aperturevalue' => 'APEX光圈',
-'exif-brightnessvalue' => 'APEX光度',
-'exif-exposurebiasvalue' => '曝光補償',
-'exif-maxaperturevalue' => '上大陸地光圈',
-'exif-subjectdistance' => '物距',
-'exif-meteringmode' => '測量模式',
-'exif-lightsource' => '光源',
-'exif-flash' => '閃光燈',
-'exif-focallength' => '焦距',
-'exif-subjectarea' => '主體區域',
-'exif-flashenergy' => '閃光燈強度',
-'exif-focalplanexresolution' => 'X軸焦面的解析度',
-'exif-focalplaneyresolution' => 'Y軸焦面的解析度',
-'exif-focalplaneresolutionunit' => '焦平面的解析度單位',
-'exif-subjectlocation' => '主題位置',
-'exif-exposureindex' => '曝光指數',
-'exif-sensingmethod' => '感光模式',
-'exif-filesource' => '檔案源',
-'exif-scenetype' => '場景類型',
-'exif-customrendered' => '自訂的圖像處理',
-'exif-exposuremode' => '曝光模式',
-'exif-whitebalance' => '白平衡',
-'exif-digitalzoomratio' => '數字變焦比率',
-'exif-focallengthin35mmfilm' => '35公厘的底片焦距',
-'exif-scenecapturetype' => '情景的攝影類型',
-'exif-gaincontrol' => '場景控制',
-'exif-contrast' => '對比度',
-'exif-saturation' => '飽水度',
-'exif-sharpness' => '銳化',
-'exif-devicesettingdescription' => '設定裝置的說明',
-'exif-subjectdistancerange' => '主體距離範圍',
-'exif-imageuniqueid' => '獨一的影像編碼',
-'exif-gpsversionid' => 'GPS 標籤(tag)版本',
-'exif-gpslatituderef' => '北緯抑南緯',
-'exif-gpslatitude' => '緯度',
-'exif-gpslongituderef' => '東經抑西經',
-'exif-gpslongitude' => '經度',
-'exif-gpsaltituderef' => '海拔正負參照',
-'exif-gpsaltitude' => '海拔',
-'exif-gpstimestamp' => 'GPS 時間(原子時鐘)',
-'exif-gpssatellites' => '測量用的衛星',
-'exif-gpsstatus' => '接收器狀態',
-'exif-gpsmeasuremode' => '測量模式',
-'exif-gpsdop' => '測量精度',
-'exif-gpsspeedref' => '速度單位',
-'exif-gpsspeed' => 'GPS 接收器速度',
-'exif-gpstrackref' => '運動方位參照',
-'exif-gpstrack' => '運動方位',
-'exif-gpsimgdirectionref' => '圖像方位參照',
-'exif-gpsimgdirection' => '圖像方位',
-'exif-gpsmapdatum' => '使用地理測繪數據',
-'exif-gpsdestlatituderef' => '目標緯度參照',
-'exif-gpsdestlatitude' => '目標緯度',
-'exif-gpsdestlongituderef' => '目標經度參照',
-'exif-gpsdestlongitude' => '目標經度',
-'exif-gpsdestbearingref' => '目標方位參照',
-'exif-gpsdestbearing' => '目標方位',
-'exif-gpsdestdistanceref' => '目標距離參照',
-'exif-gpsdestdistance' => '目標距離',
-'exif-gpsprocessingmethod' => 'GPS 處理方法名稱',
-'exif-gpsareainformation' => 'GPS 區域名稱',
-'exif-gpsdatestamp' => 'GPS 日期',
-'exif-gpsdifferential' => 'GPS 偏差修正',
-'exif-jpegfilecomment' => 'JPEG 檔案註解',
-'exif-keywords' => '關鍵字',
-'exif-worldregioncreated' => '翕的所在',
-'exif-countrycreated' => '翕的國家',
-'exif-countrycodecreated' => '翕的國家編碼',
-'exif-provinceorstatecreated' => '翕的省抑是州',
-'exif-citycreated' => '翕的都市',
-'exif-sublocationcreated' => '翕的行政區',
-'exif-worldregiondest' => '顯示所在',
-'exif-countrydest' => '顯示國家',
-'exif-countrycodedest' => '顯示國家編碼',
-'exif-provinceorstatedest' => '顯示省抑州',
-'exif-citydest' => '顯示都市',
-'exif-sublocationdest' => '顯示行政區',
-'exif-objectname' => '標題簡稱',
-'exif-specialinstructions' => '特別的說明',
-'exif-headline' => '標題',
-'exif-credit' => '署名/提供者',
-'exif-source' => '來源',
-'exif-editstatus' => '圖像的編輯狀態',
-'exif-urgency' => '緊急性',
-'exif-fixtureidentifier' => '配備名稱',
-'exif-locationdest' => '位置說明',
-'exif-locationdestcode' => '位置的編碼',
-'exif-objectcycle' => '媒體的時間',
-'exif-contact' => '聯絡資料',
-'exif-writer' => '作者',
-'exif-languagecode' => '話語',
-'exif-iimversion' => 'IIM版本',
-'exif-iimcategory' => '類別',
-'exif-iimsupplementalcategory' => '補充的分類',
-'exif-datetimeexpires' => '佇這日以後莫用',
-'exif-datetimereleased' => '發表佇',
-'exif-originaltransmissionref' => '原傳輸位置的編碼',
-'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-webstatement' => '網上的版權說明',
-'exif-originaldocumentid' => '原本文件的唯一鑑識碼',
-'exif-licenseurl' => '版權授權的連結',
-'exif-morepermissionsurl' => '其他的許可信息',
-'exif-attributionurl' => '利用這个作品的時陣,請連結到',
-'exif-preferredattributionname' => '利用這个作品的時陣,請共掛名',
-'exif-pngfilecomment' => 'PNG檔案註解',
-'exif-disclaimer' => '無負責聲明',
-'exif-contentwarning' => '內容警告',
-'exif-giffilecomment' => 'GIF檔案註解',
-'exif-intellectualgenre' => '項目的類型',
-'exif-subjectnewscode' => '主題代碼',
-'exif-scenecode' => 'IPTC現場代碼',
-'exif-event' => '事件的描述',
-'exif-organisationinimage' => '組織的描述',
-'exif-personinimage' => '所描述的人',
-'exif-originalimageheight' => '佇剪裁進前的懸度',
-'exif-originalimagewidth' => '佇剪裁進前的闊度',
-
-# EXIF attributes
-'exif-compression-1' => '無壓縮',
-'exif-compression-2' => 'CCITT第3組一維修改霍夫曼進程長度編碼',
-'exif-compression-3' => 'CCITT第3組傳真編碼',
-'exif-compression-4' => 'CCITT第4組傳真編碼',
-
-'exif-copyrighted-true' => '版權保護',
-'exif-copyrighted-false' => '公共領域',
-
-'exif-unknowndate' => '毋知日期',
-
-'exif-orientation-1' => '一般',
-'exif-orientation-2' => '兩爿相換',
-'exif-orientation-3' => '踅180度',
-'exif-orientation-4' => '面頂下跤相換',
-'exif-orientation-5' => '倒踅90度,閣面頂下跤相換',
-'exif-orientation-6' => '倒踅90度',
-'exif-orientation-7' => '正踅90度,閣面頂下跤相換',
-'exif-orientation-8' => '正踅90度',
-
-'exif-planarconfiguration-1' => '矮肥格式',
-'exif-planarconfiguration-2' => '平的格式',
-
-'exif-colorspace-65535' => '色水無校正過',
-
-'exif-componentsconfiguration-0' => '無彼个',
-
-'exif-exposureprogram-0' => '無定義',
-'exif-exposureprogram-1' => '說明書',
-'exif-exposureprogram-2' => '一般方式',
-'exif-exposureprogram-3' => '光圈優先',
-'exif-exposureprogram-4' => '快門優先',
-'exif-exposureprogram-5' => '藝術模式(景深優先)',
-'exif-exposureprogram-6' => '運動模式(快門速度優先)',
-'exif-exposureprogram-7' => '肖像模式(適合背景佇焦距以外的近距離攝影)',
-'exif-exposureprogram-8' => '風景模式(適合背景佇焦距內的風景攝影)',
-
-'exif-subjectdistance-value' => '$1公尺',
-
-'exif-meteringmode-0' => '無清楚',
-'exif-meteringmode-1' => '平均',
-'exif-meteringmode-2' => '中心加權平均',
-'exif-meteringmode-3' => '點',
-'exif-meteringmode-4' => '多點',
-'exif-meteringmode-5' => '模式',
-'exif-meteringmode-6' => '局部',
-'exif-meteringmode-255' => '其他',
-
-'exif-lightsource-0' => '毋知',
-'exif-lightsource-1' => '日光',
-'exif-lightsource-2' => '螢光燈',
-'exif-lightsource-3' => '電火球',
-'exif-lightsource-4' => '閃光燈',
-'exif-lightsource-9' => '好天',
-'exif-lightsource-10' => '烏雲',
-'exif-lightsource-11' => '深色有影',
-'exif-lightsource-12' => '日光螢光燈(色溫 D 5700    7100K)',
-'exif-lightsource-13' => '溫白色螢光燈(N 4600    5400K)',
-'exif-lightsource-14' => '冷白色螢光燈(W 3900    4500K)',
-'exif-lightsource-15' => '白色螢光 (WW 3200    3700K)',
-'exif-lightsource-17' => '標準燈光A',
-'exif-lightsource-18' => '標準燈光B',
-'exif-lightsource-19' => '標準燈光C',
-'exif-lightsource-24' => 'ISO攝影棚鎢燈',
-'exif-lightsource-255' => '其他光源',
-
-# Flash modes
-'exif-flash-fired-0' => '閃光燈無閃',
-'exif-flash-fired-1' => '有閃閃光燈',
-'exif-flash-return-0' => '無頻閃觀測器功能',
-'exif-flash-return-2' => '頻閃觀測器無測著光',
-'exif-flash-return-3' => '頻閃觀測器有測著光',
-'exif-flash-mode-1' => '一定閃閃光燈',
-'exif-flash-mode-2' => '一定無閃閃光燈',
-'exif-flash-mode-3' => '自動模式',
-'exif-flash-function-1' => '無閃光燈功能',
-'exif-flash-redeye-1' => '紅眼消退模式',
-
-'exif-focalplaneresolutionunit-2' => '英吋',
-
-'exif-sensingmethod-1' => '無定義',
-'exif-sensingmethod-2' => '一塊彩色區域偵測器',
-'exif-sensingmethod-3' => '兩塊彩色區域偵測器',
-'exif-sensingmethod-4' => '三塊彩色區域偵測器',
-'exif-sensingmethod-5' => '連續彩色區域偵測器',
-'exif-sensingmethod-7' => '三線偵測器',
-'exif-sensingmethod-8' => '連續彩色線性偵測器',
-
-'exif-filesource-3' => '數位相機',
-
-'exif-scenetype-1' => '直接翕相相片',
-
-'exif-customrendered-0' => '一般的方法',
-'exif-customrendered-1' => '家己設計的方法',
-
-'exif-exposuremode-0' => '自動曝光',
-'exif-exposuremode-1' => '手動曝光',
-'exif-exposuremode-2' => '自動曝光感測調整',
-
-'exif-whitebalance-0' => '自動白平衡',
-'exif-whitebalance-1' => '手動白平衡',
-
-'exif-scenecapturetype-0' => '標準',
-'exif-scenecapturetype-1' => '風景',
-'exif-scenecapturetype-2' => '肖像',
-'exif-scenecapturetype-3' => '夜景',
-
-'exif-gaincontrol-0' => '無',
-'exif-gaincontrol-1' => '加一屑',
-'exif-gaincontrol-2' => '加較濟',
-'exif-gaincontrol-3' => '減一屑',
-'exif-gaincontrol-4' => '減較濟',
-
-'exif-contrast-0' => '一般',
-'exif-contrast-1' => '柔',
-'exif-contrast-2' => '利',
-
-'exif-saturation-0' => '一般',
-'exif-saturation-1' => '低飽滿度',
-'exif-saturation-2' => '高飽滿度',
-
-'exif-sharpness-0' => '一般',
-'exif-sharpness-1' => '柔',
-'exif-sharpness-2' => '利',
-
-'exif-subjectdistancerange-0' => '無清楚',
-'exif-subjectdistancerange-1' => '倚咧',
-'exif-subjectdistancerange-2' => '近看',
-'exif-subjectdistancerange-3' => '遠看',
-
-# Pseudotags used for GPSLatitudeRef and GPSDestLatitudeRef
-'exif-gpslatitude-n' => '北緯',
-'exif-gpslatitude-s' => '南緯',
-
-# Pseudotags used for GPSLongitudeRef and GPSDestLongitudeRef
-'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' => '互相測量',
-
-'exif-gpsmeasuremode-2' => '二維測量',
-'exif-gpsmeasuremode-3' => '三維測量',
-
-# Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => '每點鐘的公里數',
-'exif-gpsspeed-m' => '每點鐘的英里數',
-'exif-gpsspeed-n' => '每點鐘的海里數(節)',
-
-# Pseudotags used for GPSDestDistanceRef
-'exif-gpsdestdistance-k' => '公里',
-'exif-gpsdestdistance-m' => '英里',
-'exif-gpsdestdistance-n' => '海里',
-
-'exif-gpsdop-excellent' => '優($1)',
-'exif-gpsdop-good' => '良($1)',
-'exif-gpsdop-moderate' => '中度($1)',
-'exif-gpsdop-fair' => '一般($1)',
-'exif-gpsdop-poor' => '差($1)',
-
-'exif-objectcycle-a' => '只有早起',
-'exif-objectcycle-p' => '只有暗時',
-'exif-objectcycle-b' => '通早起佮暗時',
-
-# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-'exif-gpsdirection-t' => '真正的方位',
-'exif-gpsdirection-m' => '地磁的方位',
-
-'exif-ycbcrpositioning-1' => '靠中央',
-'exif-ycbcrpositioning-2' => '聯合選址',
-
-'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' => '戰爭、衝突佮動亂',
-'exif-iimcategory-wea' => '氣候',
-
-'exif-urgency-normal' => '一般($1)',
-'exif-urgency-low' => '低($1)',
-'exif-urgency-high' => '懸($1)',
-'exif-urgency-other' => '用者定義的重要性($1)',
 
 # External editor support
 'edit-externally' => 'Iōng gōa-pō· èng-iōng nńg-thé pian-chi̍p chit-ê tóng-àn',
-'edit-externally-help' => '(Khoàⁿ [//www.mediawiki.org/wiki/Manual:External_editors siat-tēng soat-bêng] ê chu-liāu.)',
+'edit-externally-help' => 'Chham-khó [http://www.mediawiki.org/wiki/Manual:External_editors Help:External_editors] ê soat-bêng.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'choân-pō͘',
 'namespacesall' => 'choân-pō·',
 'monthsall' => 'choân-pō͘',
-'limitall' => '全部',
 
 # E-mail address confirmation
 'confirmemail' => 'Khak-jīn e-mail chū-chí',
-'confirmemail_noemail' => '佇你的[[Special:Preferences|設定]],你無設一个會用得的電子批地址。',
 'confirmemail_text' => 'Sú-iōng e-mail kong-lêng chìn-chêng tio̍h seng khak-jīn lí ê e-mail chū-chí ū-hāu. Chhi̍h ē-pêng hit-ê liú-á thang kià 1 tiuⁿ khak-jīn phoe hō· lí. Hit tiuⁿ phoe lāi-bīn ū 1 ê te̍k-sû liân-kiat. Chhiáⁿ iōng liû-lám-khì khui lâi khoàⁿ, án-ne tō ē-tit khak-jīn lí ê chū-chí ū-hāu.',
-'confirmemail_pending' => '確定的編碼已經用電子批寄予你,
-若你才拄開你的口座,佇你欲閣愛新確定的編碼進前,你會使先等幾分鐘,等批送到。',
 'confirmemail_send' => 'Kià khak-jīn phoe',
 'confirmemail_sent' => 'Khak-jīn phoe kià chhut-khì ah.',
-'confirmemail_oncreate' => '一个確認代碼已經送去你的電子批地址,
-這个代碼無需要登入,毋過你若欲用著wiki的電子批功能,你就需要提供這个代碼。',
-'confirmemail_sendfailed' => '{{SITENAME}}無法寄你確定資料的批,
-請檢查你的電子批地址是毋是有怪字。
-
-送批系統的退回通知:$1',
 'confirmemail_invalid' => 'Bô-hāu ê khak-jīn pian-bé. Pian-bé khó-lêng í-keng kòe-kî.',
-'confirmemail_needlogin' => '你愛$1去確定你的電子批地址。',
 'confirmemail_success' => 'í ê e-mail chū-chí khak-jīn oân-sêng. Lí ē-sái teng-ji̍p, khai-sí hiáng-siū chit ê wiki.',
 'confirmemail_loggedin' => 'Lí ê e-mail chū-chí í-keng khak-jīn ū-hāu.',
 'confirmemail_error' => 'Pó-chûn khak-jīn chu-sìn ê sî-chūn hoat-seng būn-tê.',
@@ -3261,18 +1092,14 @@ Chhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si
 
 $3
 
-Nā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.  
-
-$5
-
-Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.',
+Nā-chún *m̄-sī* lí, chhiáⁿ mài tòe liân-kiat khì.  Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.',
 'confirmemail_body_changed' => 'Ū lâng (IP $1, tāi-khài sī lí pún-lâng) tī {{SITENAME}} ēng chit-ê e-mail chū-chí chù-chheh 1 ê kháu-chō "$2".
 
 Chhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si̍t-chāi sī lí ê:
 
 $3
 
-Nā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.  
+Nā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.
 
 $5
 
@@ -3283,319 +1110,47 @@ Chhiáⁿ khui ē-kha chit-ê liân-kiat, thang khak-jīn chit-ê kháu-chō si
 
 $3
 
-Nā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.  
+Nā-chún *m̄-sī* lí, chhiáⁿ khui ē-kha chit-ê liân-kiat,  chhú-siau khak-jīn ê e-mail.
 
 $5
 
 Chit tiuⁿ phoe ê khak-jīn-bé ē chū-tōng tī $4 kòe-kî.',
-'confirmemail_invalidated' => '電子批的確認已經取消。',
-'invalidateemail' => '取消電子批的確認。',
-
-# Scary transclusion
-'scarytranscludedisabled' => '[跨wiki的轉換代碼袂當用]',
-'scarytranscludefailed' => '[讀$1模板失敗]',
-'scarytranscludetoolong' => '[URL 地址傷長]',
-
-# Delete conflict
-'deletedwhileediting' => "'''注意''':這頁佇你開始改了後,已經予人刣掉!",
-'confirmrecreate' => "用者[[User:$1|$1]] ([[User talk:$1|talk]])佇你開始改這頁了後,刣掉這頁,原因是:
-: ''$2''
-請你確定欲閣建立這頁。",
-'confirmrecreate-noreason' => '用者[[User:$1|$1]] ([[User talk:$1|討論]])佇你開始改這頁了後,刣掉這頁。請你確定敢欲重建立這頁。',
-'recreate' => '重做',
 
 # action=purge
-'confirm_purge_button' => '好矣',
 'confirm-purge-top' => 'Kā chit ia̍h ê cache piàⁿ tiāu?',
-'confirm-purge-bottom' => '清理一頁會共快取(cache)摒掉,閣一定顯示上新的修訂版本。',
-
-# action=watch/unwatch
-'confirm-watch-button' => '好',
-'confirm-watch-top' => '共這頁加入去你的監視單?',
-'confirm-unwatch-button' => '好',
-'confirm-unwatch-top' => '共這頁對你的監視單徙走?',
-
-# Multipage image navigation
-'imgmultipageprev' => '前一頁',
-'imgmultipagenext' => '後一頁',
-'imgmultigo' => '來去',
-'imgmultigoto' => '來去$1這頁',
 
 # Table pager
-'ascending_abbrev' => '細到大',
-'descending_abbrev' => '大到細',
 'table_pager_next' => 'Aū-chi̍t-ia̍h',
 'table_pager_prev' => 'Téng-chi̍t-ia̍h',
 'table_pager_first' => 'Thâu-chi̍t-ia̍h',
 'table_pager_last' => 'Siāng-bóe-ia̍h',
 'table_pager_limit' => 'Múi 1 ia̍h hián-sī $1 hāng',
-'table_pager_limit_label' => '每頁的項目:',
 'table_pager_limit_submit' => 'Lâi-khì',
-'table_pager_empty' => '無結果',
 
 # Auto-summaries
 'autosumm-blank' => 'Kā ia̍h ê loē-iông the̍h tiāu',
-'autosumm-replace' => '用"$1"共內容換掉',
 'autoredircomment' => 'Choán khì [[$1]]',
-'autosumm-new' => 'Sin ia̍h: $1...',
-
-# Live preview
-'livepreview-loading' => '當咧讀',
-'livepreview-ready' => '讀....好矣!',
-'livepreview-failed' => 'Live先看覓失敗!
-試一般的先看覓。',
-'livepreview-error' => '連接失敗: $1 "$2",
-試一般的先看覓。',
-
-# Friendlier slave lag warnings
-'lag-warn-normal' => '佇過去$1{{PLURAL:$1|秒|秒}}新改的,可能無寫佇這个清單。',
-'lag-warn-high' => '因為資料庫的過度延遲,過去$1{{PLURAL:$1|秒|秒}}內的修改無一定會顯示佇清單內底。',
+'autosumm-new' => 'Sin ia̍h: $1',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Lí ê kàm-sī-toaⁿ ū {{PLURAL:$1|$1 ia̍h|$1 ia̍h}}, thó-lūn-ia̍h bô sǹg chāi-lāi.',
-'watchlistedit-noitems' => '你的監視單無半項。',
-'watchlistedit-normal-title' => '改監視單',
-'watchlistedit-normal-legend' => '共文章標題對監視單徙走',
-'watchlistedit-normal-explain' => '你監視的文章標題顯示佇下跤。若欲徙走一个標題,點擊伊邊仔的框仔,閣點擊「{{int:Watchlistedit-normal-submit}}」。你嘛會當[[Special:EditWatchlist/raw|編輯原始監視清單]]。',
+'watchlistedit-numitems' => 'Lí ê kàm-sī-toaⁿ ū $1 ia̍h, thó-lūn-ia̍h bô sǹg chāi-lāi.',
 'watchlistedit-normal-submit' => 'Mài kàm-sī',
-'watchlistedit-normal-done' => 'Í-keng ū {{PLURAL:$1| ia̍h| ia̍h}} ùi lí ê kám-sī-toaⁿ soá cháu:',
-'watchlistedit-raw-title' => '改進前的監視單',
-'watchlistedit-raw-legend' => '改進前的監視單',
-'watchlistedit-raw-explain' => '下跤是你監視文章的標題,你會當透過改這个表去加入抑是徙走標題;一逝一个標題。
-改了後,點擊 {{int:Watchlistedit-raw-submit}}。
-你嘛會當去用 [[Special:EditWatchlist|標準編輯器]]。',
-'watchlistedit-raw-titles' => '標題:',
-'watchlistedit-raw-submit' => '改監視單',
-'watchlistedit-raw-done' => '你的監視單有改新。',
-'watchlistedit-raw-added' => '已經加入{{PLURAL:$1|1个|$个}}標題:',
-'watchlistedit-raw-removed' => '已經徙走{{PLURAL:$1|1个|$个}}標題:',
+'watchlistedit-normal-done' => 'Í-keng ū $1 ia̍h ùi lí ê kám-sī-toaⁿ soá cháu:',
 
 # Watchlist editing tools
-'watchlisttools-view' => '看相關的修改',
 'watchlisttools-edit' => 'Khoàⁿ koh kái kàm-sī-toaⁿ',
 'watchlisttools-raw' => 'Kái tshing-chheng ê kàm-sī-toaⁿ',
 
-# Signatures
-'signature' => '[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|留話]])',
-
 # Core parser functions
-'unknown_extension_tag' => '無清楚的擴展標籤 "$1"',
 'duplicate-defaultsort' => '\'\'\'Thê-chhíⁿ lí:\'\'\'Siat-piān ê pâi-lia̍t hong-sek "$2" thè-oāⁿ chìn-chêng ê siat-piān ê pâi-lia̍t hong-sek "$1".',
 
 # Special:Version
 'version' => 'Pán-pún',
-'version-extensions' => '已經裝的擴展',
-'version-specialpages' => '特殊頁',
-'version-parserhooks' => '語法鈎',
-'version-variables' => '變數',
-'version-antispam' => '防止廣告',
-'version-skins' => '皮',
-'version-other' => '其他',
-'version-mediahandlers' => '媒體處理器',
-'version-hooks' => '鈎',
-'version-extension-functions' => '擴展函數',
-'version-parser-extensiontags' => '語法擴展標籤',
-'version-parser-function-hooks' => '語法函數鈎',
-'version-hook-name' => '鈎名',
-'version-hook-subscribedby' => '用佇',
-'version-version' => '(版本 $1)',
-'version-license' => '授權',
-'version-poweredby-credits' => "這个 Wiki 是由 '''[//www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
-'version-poweredby-others' => '其他',
-'version-license-info' => 'MediaWiki是自由的軟體;你會當照自由軟體基金會所發佈的GNU通用公共授權條款規定,來發佈閣/抑修改本程式;無論你根據的是本授權的第二版抑是(你家己選擇的)日後的版本。
-
-MediaWiki是為著使用的目的才發佈,毋過無負任何擔保責任;也無對適售性抑是特定目的適用性的默示性擔保。詳情請看GNU通用公共授權。
-
-你應該有收著附佇本程式的[{{SERVER}}{{SCRIPTPATH}}/COPYING GNU通用公共授權的副本];若無,請寫批到自由軟件基金會: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' => '版本',
 
 # Special:FilePath
 'filepath' => 'Tóng-àn ê soàⁿ-lō·',
-'filepath-page' => '檔案:',
-'filepath-submit' => '來去',
-'filepath-summary' => '這个特殊頁會送回一个檔案的完整路徑。
-圖像會用完整的解析度顯示,其它的檔案類型嘛會用相關的程式啟動。',
-
-# Special:FileDuplicateSearch
-'fileduplicatesearch' => '揣有仝款的檔案',
-'fileduplicatesearch-summary' => '照亂數值去揣仝款的檔案。',
-'fileduplicatesearch-legend' => '揣仝款的',
-'fileduplicatesearch-filename' => '檔案名稱:',
-'fileduplicatesearch-submit' => '揣',
-'fileduplicatesearch-info' => '$1 × $2 像素<br />檔案大細:$3<br />MIME類型:$4',
-'fileduplicatesearch-result-1' => '檔案 "$1" 無有完全相仝的。',
-'fileduplicatesearch-result-n' => '檔案 "$1" 有{{PLURAL:$2|1个完全相仝的|$2个完全相仝的}}。',
-'fileduplicatesearch-noresults' => '揣無叫"$1"的檔案。',
 
 # Special:SpecialPages
 'specialpages' => 'Te̍k-sû-ia̍h',
-'specialpages-note' => '----
-* 一般的特殊頁。
-* <span class="mw-specialpagecached">有限制的特殊頁。</span>',
-'specialpages-group-maintenance' => '維修報告',
-'specialpages-group-other' => '其他的特殊頁',
-'specialpages-group-login' => '登入',
-'specialpages-group-changes' => '最近改的記錄',
-'specialpages-group-media' => '媒體報告佮上載',
-'specialpages-group-users' => '用者佮使用權',
-'specialpages-group-highuse' => '捷捷用著的頁面',
-'specialpages-group-pages' => '頁的清單',
-'specialpages-group-pagetools' => '頁的家私',
-'specialpages-group-wiki' => 'Wiki資料佮家私',
-'specialpages-group-redirects' => '共特殊頁轉向',
-'specialpages-group-spam' => '反垃圾工具',
-
-# Special:BlankPage
-'blankpage' => '空的頁',
-'intentionallyblankpage' => '這頁是刁持留空的。',
-
-# External image whitelist
-'external_image_whitelist' => ' #留佮這行仝款的字<pre>
-#佇下面(//的中間部份)拍正規表示式部份
-#遮會佮外部(已經超連結的)影相相配合
-#遐有相配合著會會顯示做影相,若無就只會顯示做連結
-#有 # 做頭的行會當做是註解
-#大小寫無差
-
-#佇這行面頂拍所有的正規表示式部份,留佮這行仝款的字</pre>',
-
-# Special:Tags
-'tags' => '有效的標籤',
-'tag-filter' => '[[Special:Tags|標籤]]過濾器:',
-'tag-filter-submit' => '過濾器',
-'tags-title' => '標籤',
-'tags-intro' => '這頁是標籤的清單,標示編輯的動作佮意義。',
-'tags-tag' => '標籤名稱',
-'tags-display-header' => '佇修改清單的出現方式',
-'tags-description-header' => '意思的完整解說',
-'tags-hitcount-header' => '有貼標籤的修改',
-'tags-edit' => '修改',
-'tags-hitcount' => '$1 {{PLURAL:$1|改|改}}',
-
-# Special:ComparePages
-'comparepages' => '比並頁',
-'compare-selector' => '比並頁的修訂本',
-'compare-page1' => '第一頁',
-'compare-page2' => '第二頁',
-'compare-rev1' => '第一修訂本',
-'compare-rev2' => '第二修訂本',
-'compare-submit' => '比較',
-'compare-invalid-title' => '你指定的標題無適當。',
-'compare-title-not-exists' => '無你指定的標題',
-'compare-revision-not-exists' => '無你指定的修訂本',
-
-# Database error messages
-'dberr-header' => '這个Wiki遇著問題',
-'dberr-problems' => '失禮!
-這馬這个站有技術上的問題。',
-'dberr-again' => '先等幾分鐘,才閣載入',
-'dberr-info' => '(無法連接到資料庫伺服器: $1)',
-'dberr-usegoogle' => '佇這馬,你會當先透過 Google 揣。',
-'dberr-outofdate' => '請注意,in索引出來的內容可能毋是上新的。',
-'dberr-cachederror' => '這是你欲挃的頁的快取副本,而且可能毋是上新的。',
-
-# HTML forms
-'htmlform-invalid-input' => '你拍的內底有一寡問題。',
-'htmlform-select-badoption' => '你寫的數量,無適合。',
-'htmlform-int-invalid' => '你寫的毋是數量。',
-'htmlform-float-invalid' => '你寫的毋是數量。',
-'htmlform-int-toolow' => '你寫的數量低過上細的量 $1。',
-'htmlform-int-toohigh' => '你寫的數量超過上大的量 $1。',
-'htmlform-required' => '這个數量愛寫',
-'htmlform-submit' => '送出',
-'htmlform-reset' => '取消修改',
-'htmlform-selectorother-other' => '其他',
-
-# SQLite database support
-'sqlite-has-fts' => '帶全文搜揣的版本$1',
-'sqlite-no-fts' => '無帶全文搜揣的版本$1',
-
-# New logging system
-'logentry-delete-delete' => '$1刣掉頁面$3',
-'logentry-delete-restore' => '$1恢復頁面$3',
-'logentry-delete-event' => '$1已經改$3內底{{PLURAL:$5|項|項}}記錄的可見性:$4',
-'logentry-delete-revision' => '$1改$3內底{{PLURAL:$5|$5个修訂本|$5个修訂本}}的可見性:$4',
-'logentry-delete-event-legacy' => '$1改頁$3的記錄事件的可見性 ',
-'logentry-delete-revision-legacy' => '$1改頁$3的修訂本可見性 ',
-'logentry-suppress-delete' => '$1藏掉頁面$3',
-'logentry-suppress-event' => '$1私下改$3的{{PLURAL:$5|$5項紀錄|$5項紀錄}}的可見性:$4',
-'logentry-suppress-revision' => '$1私下改$3的{{PLURAL:$5|$5个修訂本|$5个修訂本}}的可見性:$4',
-'logentry-suppress-event-legacy' => '$1私下改頁$3可見性的記錄事件',
-'logentry-suppress-revision-legacy' => '$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
-'feedback-bugornote' => '若你欲詳細寫一个技術問題,請[$1 報告一隻臭蟲]。
-抑是,你會當用下跤簡單的表,你的意見會加佇頁面“[$3 $2]”,而且有你的用戶名佮你用的佗一種瀏覽器。',
-'feedback-subject' => '題目:',
-'feedback-message' => '信息:',
-'feedback-cancel' => '取消',
-'feedback-submit' => '送出回饋',
-'feedback-adding' => '當咧加回饋到頁面...',
-'feedback-error1' => '錯誤:對API送來的結果(無法判斷)。',
-'feedback-error2' => '錯誤:編輯失敗',
-'feedback-error3' => '錯誤:API 無回應',
-'feedback-thanks' => '多謝,你的回饋已經貼佇"[$2 $1]"的頁面。',
-'feedback-close' => '完成',
-'feedback-bugcheck' => '誠好,拄檢查過,彼無佇[$1發現過的臭蟲]內底。',
-'feedback-bugnew' => '我已經檢查過。報告一个新臭蟲。',
-
-# API errors
-'api-error-badaccess-groups' => '你無允准上載檔案到這个Wiki網站。',
-'api-error-badtoken' => '內部錯誤:標記失效。',
-'api-error-copyuploaddisabled' => '佇這个伺服器無用透過網址(URL)上載的功能。',
-'api-error-duplicate' => '佇網站內底另外有{{PLURAL:$1|[$2个]|[$2个]}}仝款的檔案。',
-'api-error-duplicate-archive' => '佇網站內底{{PLURAL:$1|[$2个]|[$2个]}}仝款的檔案,毋過已經刣掉。',
-'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' => '你欲做的編輯因為擴展鈎(extension hook)去跳開。',
-'api-error-http' => '內部錯誤:連接袂到伺服器。',
-'api-error-illegal-filename' => '無合用的檔案名稱。',
-'api-error-internal-error' => '內部錯誤:佇處理你的上載的時陣,這个Wiki拄著一寡問題。',
-'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' => '佇這个Wiki袂當上載。',
-'api-error-verification-error' => '這个檔案可能已經毀掉,抑是檔案尾仔名稱毋著。',
 
 );
index 1517cac..5ebe516 100644 (file)
@@ -98,6 +98,7 @@ $specialPageAliases = array(
        'Booksources'               => array( 'Bokkilder' ),
        'BrokenRedirects'           => array( 'Ødelagte_omdirigeringer' ),
        'Categories'                => array( 'Kategorier' ),
+       'ChangeEmail'               => array( 'Endre_e-post' ),
        'ChangePassword'            => array( 'Endre_passord', 'TIlbakestill_passord' ),
        'ComparePages'              => array( 'Sammenlign_sider' ),
        'Confirmemail'              => array( 'Bekreft_e-postadresse' ),
@@ -107,6 +108,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Slettede_bidrag' ),
        'Disambiguations'           => array( 'Pekere' ),
        'DoubleRedirects'           => array( 'Doble_omdirigeringer' ),
+       'EditWatchlist'             => array( 'Rediger_overvåkningsliste' ),
        'Emailuser'                 => array( 'E-post' ),
        'Export'                    => array( 'Eksporter' ),
        'Fewestrevisions'           => array( 'Færrest_revisjoner' ),
@@ -138,9 +140,11 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'Mine_bidrag' ),
        'Mypage'                    => array( 'Min_side' ),
        'Mytalk'                    => array( 'Min_diskusjon' ),
+       'Myuploads'                 => array( 'Mine_opplastinger' ),
        'Newimages'                 => array( 'Nye_filer', 'Nye_bilder' ),
        'Newpages'                  => array( 'Nye_sider' ),
        'PasswordReset'             => array( 'Nullstill_passord' ),
+       'PermanentLink'             => array( 'Permanent_lenke' ),
        'Popularpages'              => array( 'Populære_sider' ),
        'Preferences'               => array( 'Innstillinger' ),
        'Prefixindex'               => array( 'Prefiksindeks' ),
index ebabdf9..675b8a9 100644 (file)
@@ -56,7 +56,7 @@ $namespaceAliases = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#wiederleiden', '#WEITERLEITUNG', '#REDIRECT' ),
-       'notoc'                   => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__NOTOC__' ),
+       'notoc'                   => array( '0', '__KEENINHOLTVERTEKEN__', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
        'forcetoc'                => array( '0', '__WIESINHOLTVERTEKEN__', '__INHALTSVERZEICHNIS_ERZWINGEN__', '__FORCETOC__' ),
        'toc'                     => array( '0', '__INHOLTVERTEKEN__', '__INHALTSVERZEICHNIS__', '__TOC__' ),
        'noeditsection'           => array( '0', '__KEENÄNNERNLINK__', '__ABSCHNITTE_NICHT_BEARBEITEN__', '__NOEDITSECTION__' ),
@@ -71,7 +71,7 @@ $magicWords = array(
        'pagename'                => array( '1', 'SIETNAAM', 'SEITENNAME', 'PAGENAME' ),
        'pagenamee'               => array( '1', 'SIETNAAME', 'SEITENNAME_URL', 'PAGENAMEE' ),
        'namespace'               => array( '1', 'NAAMRUUM', 'NAMENSRAUM', 'NAMESPACE' ),
-       'img_thumbnail'           => array( '1', 'duum', 'miniatur', 'thumbnail', 'thumb' ),
+       'img_thumbnail'           => array( '1', 'duum', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
        'img_right'               => array( '1', 'rechts', 'right' ),
        'img_left'                => array( '1', 'links', 'left' ),
        'img_none'                => array( '1', 'keen', 'ohne', 'none' ),
@@ -80,7 +80,7 @@ $magicWords = array(
        'sitename'                => array( '1', 'STEEDNAAM', 'PROJEKTNAME', 'SITENAME' ),
        'ns'                      => array( '0', 'NR:', 'NS:' ),
        'localurl'                => array( '0', 'STEEDURL:', 'LOKALE_URL:', 'LOCALURL:' ),
-       'localurle'               => array( '0', 'STEEDURLE:', 'LOCALURLE:' ),
+       'localurle'               => array( '0', 'STEEDURLE:', 'LOKALE_URL_C:', 'LOCALURLE:' ),
        'grammar'                 => array( '0', 'GRAMMATIK:', 'GRAMMAR:' ),
 );
 
@@ -1056,7 +1056,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 
 # Diffs
 'history-title' => 'Versionshistorie vun „$1“',
-'difference' => '(Ünnerscheed twischen de Versionen)',
 'lineno' => 'Reeg $1:',
 'compareselectedversions' => 'Ünnerscheed twischen den utwählten Versionen wiesen',
 'showhideselectedversions' => 'Utwählt Versionen wiesen/versteken',
@@ -1396,7 +1395,7 @@ Dat kann nich wedder ungeschehn maakt warrn.',
 'nchanges' => '{{PLURAL:$1|Een Ännern|$1 Ännern}}',
 'recentchanges' => 'Toletzt ännert',
 'recentchanges-legend' => 'Optionen för toletzt ännert',
-'recentchangestext' => 'Op disse Sied warrt de Sieden wiest, de toletzt ännert worrn sünd.',
+'recentchanges-summary' => 'Op disse Sied warrt de Sieden wiest, de toletzt ännert worrn sünd.',
 'recentchanges-feed-description' => 'Behool mit dissen Feed de ne’esten Ännern op dit Wiki in’t Oog.',
 'recentchanges-label-newpage' => "Düsse Ännern stell en ne'e Siet op",
 'recentchanges-label-minor' => 'Dat is en lütte Ännern',
index 59a7423..0f2f267 100644 (file)
@@ -170,14 +170,14 @@ $magicWords = array(
        'revisiontimestamp'       => array( '1', 'REVISIETIEDSTEMPEL', 'VERSIETIJD', 'REVISIONTIMESTAMP' ),
        'revisionuser'            => array( '1', 'VERSIEGEBRUKER', 'VERSIEGEBRUIKER', 'REVISIONUSER' ),
        'plural'                  => array( '0', 'MEERVOUD:', 'PLURAL:' ),
-       'fullurl'                 => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'FULLURL:' ),
-       'fullurle'                => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'FULLURLE:' ),
+       'fullurl'                 => array( '0', 'HELEURL', 'VOLLEDIGEURL', 'VOLLEDIGEURL:', 'FULLURL:' ),
+       'fullurle'                => array( '0', 'HELEURLE', 'VOLLEDIGEURLE', 'VOLLEDIGEURLE:', 'FULLURLE:' ),
        'lcfirst'                 => array( '0', 'KLEERSTE:', 'LCFIRST:' ),
        'ucfirst'                 => array( '0', 'GLEERSTE:', 'HLEERSTE:', 'UCFIRST:' ),
        'lc'                      => array( '0', 'KL:', 'LC:' ),
        'uc'                      => array( '0', 'HL:', 'UC:' ),
        'raw'                     => array( '0', 'RAUW:', 'RUW:', 'RAW:' ),
-       'displaytitle'            => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'DISPLAYTITLE' ),
+       'displaytitle'            => array( '1', 'TEUNTITEL', 'TOONTITEL', 'TITELTONEN', 'WEERGEGEVENTITEL', 'DISPLAYTITLE' ),
        'newsectionlink'          => array( '1', '__NIEJESECTIEVERWIEZING__', '__NIEUWESECTIELINK__', '__NIEUWESECTIEKOPPELING__', '__NEWSECTIONLINK__' ),
        'nonewsectionlink'        => array( '1', '__GIENNIEJKOPJENVERWIEZING__', '__GEENNIEUWKOPJEVERWIJZING__', '__GEENNIEUWESECTIELINK__', '__NONEWSECTIONLINK__' ),
        'currentversion'          => array( '1', 'DISSEVERSIE', 'HUIDIGEVERSIE', 'CURRENTVERSION' ),
@@ -1242,7 +1242,6 @@ Kiek de logboeken nao.',
 
 # Diffs
 'history-title' => 'Geschiedenisse van "$1"',
-'difference' => '(Verschil tussen bewarkingen)',
 'difference-multipage' => "(Verschil tussen pagina's)",
 'lineno' => 'Regel $1:',
 'compareselectedversions' => 'Vergeliek de ekeuzen versies',
@@ -1599,7 +1598,7 @@ Disse informasie is zichtbaor veur aandere gebrukers.',
 'nchanges' => '$1 {{PLURAL:$1|wieziging|wiezigingen}}',
 'recentchanges' => 'Leste wiezigingen',
 'recentchanges-legend' => 'Opsies veur leste wiezigingen',
-'recentchangestext' => "Op disse pagina ku'j de leste wiezigingen van disse wiki bekieken.",
+'recentchanges-summary' => 'Op disse pagina ku-j de leste wiezigingen van disse wiki bekieken.',
 'recentchanges-feed-description' => 'Zeuk naor de alderleste wiezingen op disse wiki in disse voer.',
 'recentchanges-label-newpage' => 'Mit disse bewarking is n nieje pagina an-emaakt',
 'recentchanges-label-minor' => 'Dit is n kleine wieziging',
index cdff247..3fd32e1 100644 (file)
@@ -993,7 +993,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" को पुनरावलोकन इतिहास',
-'difference' => '(पुनरावलोकनहरुको बीचमा भिन्नता)',
 'difference-multipage' => '(पृष्ठहरुमा भिन्नता)',
 'lineno' => 'पंक्ति $1:',
 'compareselectedversions' => 'छानिएका संस्करणहरू दाँज्नुहोस्',
@@ -1355,7 +1354,7 @@ HTML ट्यागहरु जाँच्नुहोस् ।',
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तन|परिवर्तनहरु}}',
 'recentchanges' => 'नयाँ परिवर्तनहरु',
 'recentchanges-legend' => 'हालैको परिवर्तन विकल्पहरु',
-'recentchangestext' => 'विकिका भर्खरका परिवर्तनहरुलाई यस पृष्ठमा पहिल्याउने',
+'recentchanges-summary' => 'विकिका भर्खरका परिवर्तनहरुलाई यस पृष्ठमा पहिल्याउने',
 'recentchanges-feed-description' => 'यो फिडमा रहेको विकीको सवैभन्दा अन्तिम परिवर्तनहरुको जानकारी राख्नुहोस्',
 'recentchanges-label-newpage' => 'यो सम्पादनले नयाँ पृष्ठ निर्माण गरेको छ',
 'recentchanges-label-minor' => 'यो साधारण सम्पादन हो',
index b9b35a8..536cd20 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Annabel
+ * @author AvatarTeam
  * @author B4bol4t
  * @author DasRakel
  * @author Effeietsanders
@@ -134,6 +135,7 @@ $magicWords = array(
        'pagenamee'               => array( '1', 'PAGINANAAME', 'PAGENAMEE' ),
        'namespace'               => array( '1', 'NAAMRUIMTE', 'NAMESPACE' ),
        'namespacee'              => array( '1', 'NAAMRUIMTEE', 'NAMESPACEE' ),
+       'namespacenumber'         => array( '1', 'NAAMRUIMTENUMMER', 'NAMESPACENUMBER' ),
        'talkspace'               => array( '1', 'OVERLEGRUIMTE', 'TALKSPACE' ),
        'talkspacee'              => array( '1', 'OVERLEGRUIMTEE', 'TALKSPACEE' ),
        'subjectspace'            => array( '1', 'ONDERWERPRUIMTE', 'ARTIKELRUIMTE', 'SUBJECTSPACE', 'ARTICLESPACE' ),
@@ -175,7 +177,6 @@ $magicWords = array(
        'localurl'                => array( '0', 'LOKALEURL', 'LOCALURL:' ),
        'localurle'               => array( '0', 'LOKALEURLE', 'LOCALURLE:' ),
        'articlepath'             => array( '0', 'ARTIKELPAD', 'ARTICLEPATH' ),
-       'pageid'                  => array( '0', 'PAGINAID', 'PAGEID' ),
        'servername'              => array( '0', 'SERVERNAAM', 'SERVERNAME' ),
        'scriptpath'              => array( '0', 'SCRIPTPAD', 'SCRIPTPATH' ),
        'stylepath'               => array( '0', 'STIJLPAD', 'STYLEPATH' ),
@@ -223,6 +224,7 @@ $magicWords = array(
        'padleft'                 => array( '0', 'LINKSOPVULLEN', 'PADLEFT' ),
        'padright'                => array( '0', 'RECHTSOPVULLEN', 'PADRIGHT' ),
        'special'                 => array( '0', 'speciaal', 'special' ),
+       'speciale'                => array( '0', 'speciaale', 'speciale' ),
        'defaultsort'             => array( '1', 'STANDAARDSORTERING:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                => array( '0', 'BESTANDSPAD:', 'FILEPATH:' ),
        'tag'                     => array( '0', 'label', 'tag' ),
@@ -351,7 +353,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Gemarkeerde wijzigingen verbergen in recente wijzigingen',
 'tog-newpageshidepatrolled' => "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
 'tog-extendwatchlist' => 'Uitgebreide volglijst gebruiken om alle wijzigingen te bekijken, en niet alleen de laatste',
-'tog-usenewrc' => 'Uitgebreide Recente Wijzigingen-pagina gebruiken (vereist JavaScript)',
+'tog-usenewrc' => 'Wijzigingen per pagina weergeven in recente wijzigingen en volglijst (vereist JavaScript)',
 'tog-numberheadings' => 'Koppen automatisch nummeren',
 'tog-showtoolbar' => 'Bewerkingswerkbalk weergeven (vereist JavaScript)',
 'tog-editondblclick' => 'Dubbelklikken voor bewerken (vereist JavaScript)',
@@ -376,8 +378,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',
@@ -457,9 +459,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',
@@ -521,7 +523,7 @@ $messages = array(
 'searchbutton' => 'Zoeken',
 'go' => 'OK',
 'searcharticle' => 'OK',
-'history' => 'Paginageschiedenis',
+'history' => 'Geschiedenis',
 'history_short' => 'Geschiedenis',
 'updatedmarker' => 'bewerkt sinds mijn laatste bezoek',
 'printableversion' => 'Printervriendelijke versie',
@@ -630,8 +632,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',
@@ -665,14 +667,14 @@ 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”',
-'laggedslavemode' => "'''Waarschuwing:''' de pagina kan verouder zijn.",
+"$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',
 'readonlytext' => 'De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud. Na afronding wordt de functionaliteit hersteld.
@@ -694,7 +696,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".',
@@ -705,7 +707,7 @@ Mogelijk is deze al door iemand anders verwijderd.',
 'cannotdelete-title' => 'Pagina "$1" kan niet verwijderd worden',
 'badtitle' => 'Ongeldige paginanaam',
 'badtitletext' => 'De naam van de opgevraagde pagina was ongeldig, leeg of bevatte een verkeerde intertaal- of interwikinaamverwijzing.
-Wellicht bevat de paginanaam niet toegestane karakters.',
+Wellicht bevat de paginanaam niet toegestane tekens.',
 'perfcached' => 'Deze gegevens komen uit een cache en zijn mogelijk niet actueel. Er {{PLURAL:$1|is maximaal één resultaat|zijn maximaal $1 resultaten}} beschikbaar in de cache.',
 'perfcachedts' => 'Deze gegevens komen uit een cache die voor het laatst is bijgewerkt op $2 om $3. Er {{PLURAL:$4|is maximaal één resultaat|zijn maximaal $4 resultaten}} beschikbaar in de cache.',
 'querypage-no-updates' => 'Deze pagina wordt niet bijgewerkt.
@@ -724,7 +726,7 @@ Bewerken is niet mogelijk.',
 'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
 'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
 'protectedinterface' => 'Deze pagina bevat tekst voor berichten van de software en is beveiligd om misbruik te voorkomen.',
-'editinginterface' => "'''Waarschuwing:''' U bewerkt een pagina die interfacetekst voor de software bevat.
+'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
 Overweeg voor vertalingen om [//translatewiki.net/wiki/Main_Page?setlang=nl translatewiki.net] te gebruiken, het vertaalproject voor MediaWiki.",
 'sqlhidden' => '(SQL-zoekopdracht verborgen)',
@@ -739,6 +741,10 @@ De gegeven reden is ''$2''.",
 'filereadonlyerror' => 'Het was niet mogelijk het bestand "$1" aan te passen omdat de bestandsrepository "$2" op dit moment alleen-lezen is.
 
 De opgegeven reden is "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Ongeldige titel met naamruimte "$2" en tekst "$3"',
+'invalidtitle-unknownnamespace' => 'Ongeldige titel met onbekend naamruimtenummer $1 en tekst "$2"',
+'exception-nologin' => 'Niet aangemeld',
+'exception-nologin-text' => 'Om deze pagina te bekijken of deze handeling uit te kunnen voeren moet u aangemeld zijn bij deze wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Onjuiste configuratie: onbekende virusscanner: ''$1''.",
@@ -850,7 +856,7 @@ Het wachtwoord voor "$2" is "$3".
 Meld u aan en wijzig uw wachtwoord.
 
 Negeer dit bericht als deze gebruiker zonder uw medeweten is aangemaakt.',
-'usernamehasherror' => 'Een gebruikersnaam mag het karakter hekje ("#") niet bevatten.',
+'usernamehasherror' => 'Een gebruikersnaam mag het teken hekje ("#") niet bevatten.',
 'login-throttled' => 'U hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
 Wacht even voordat u het opnieuw probeert.',
 'login-abort-generic' => 'U bent niet aangemeld. De procedure is afgebroken.',
@@ -961,7 +967,7 @@ Uw IP-adres wordt opgeslagen als u wijzigingen op deze pagina maakt.",
 'missingsummary' => "'''Herinnering:''' u hebt geen bewerkingssamenvatting opgegeven.
 Als u nogmaals op \"{{int:savearticle}}\" klikt wordt de bewerking zonder samenvatting opgeslagen.",
 'missingcommenttext' => 'Plaats uw opmerking hieronder.',
-'missingcommentheader' => "'''Let op:''' U hebt geen onderwerp/kop voor deze opmerking opgegeven.
+'missingcommentheader' => "'''Let op:''' u hebt geen onderwerp/kop voor deze opmerking opgegeven.
 Als u opnieuw op \"{{int:savearticle}}\" klikt, wordt uw wijziging zonder een onderwerp/kop opgeslagen.",
 'summary-preview' => 'Bewerkingssamenvatting nakijken:',
 'subject-preview' => 'Onderwerp/kop nakijken:',
@@ -1031,10 +1037,10 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 * '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5'' of ''Ctrl-R'' (''⌘-Shift-R'' op een Mac)
 * '''Google Chrome:''' druk op ''Ctrl-Shift-R'' (''⌘-Shift-R'' op een Mac)
 * '''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl u op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
-* '''Konqueror: '''klik op ''Reload'' of druk op ''F5''
+* '''Konqueror:''' klik op ''Reload'' of druk op ''F5''
 * '''Opera:''' leeg uw cache in ''Extra → Voorkeuren''",
-'usercssyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
-'userjsyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
+'usercssyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe CSS te testen alvorens op te slaan.",
+'userjsyoucanpreview' => "'''Tip:''' gebruik de knop \"{{int:showpreview}}\" om uw nieuwe JavaScript te testen alvorens op te slaan.",
 'usercsspreview' => "'''Dit is alleen een voorvertoning van uw persoonlijke CSS.'''
 '''Deze is nog niet opgeslagen!'''",
 'userjspreview' => "'''Let op: u test nu uw persoonlijke JavaScript.'''
@@ -1048,7 +1054,8 @@ Uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns
 'updated' => '(Bijgewerkt)',
 'note' => "'''Opmerking:'''",
 'previewnote' => "'''Let op: dit is een controlepagina.'''
-Uw tekst is niet opgeslagen! [[#editform|→ Doorgaan met bewerken]]",
+Uw tekst is niet opgeslagen!",
+'continue-editing' => 'Doorgaan met bewerken',
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
 'session_fail_preview' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
@@ -1075,10 +1082,10 @@ U dient uw bewerkingen in te voegen in de bestaande tekst.
 '''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als u op \"{{int:savearticle}}\" klikt.",
 'yourtext' => 'Uw tekst',
 'storedversion' => 'Opgeslagen versie',
-'nonunicodebrowser' => "'''Waarschuwing: Uw browser kan niet goed overweg met unicode.'''
-Hiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.",
-'editingold' => "'''Waarschuwing: U bewerkt een oude versie van deze pagina.'''
-Als u uw bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.",
+'nonunicodebrowser' => "'''Waarschuwing: uw browser kan niet goed overweg met Unicode.'''
+Hiermee wordt door de MediaWiki-software rekening gehouden zodat u toch zonder problemen pagina's kunt bewerken: niet-ASCII tekens worden in het bewerkingsveld weergegeven als hexadecimale codes.",
+'editingold' => "'''Waarschuwing: u bewerkt een oude versie van deze pagina.'''
+Als u uw bewerking opslaat, gaan alle wijzigingen verloren die na deze versie zijn gemaakt.",
 'yourdiff' => 'Wijzigingen',
 'copyrightwarning' => "Let op: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de \$2 (zie \$1 voor details).
 Als u niet wilt dat uw tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor \"Pagina opslaan\".<br />
@@ -1090,7 +1097,7 @@ U belooft ook dat u de oorspronkelijke auteur bent van dit materiaal of dat u he
 '''Gebruik geen materiaal dat beschermd wordt door auteursrecht, tenzij u daarvoor toestemming hebt!'''",
 'longpageerror' => "'''Fout: de tekst die u hebt toegevoegd is {{PLURAL:$1|één kilobyte|$1 kilobyte}} groot, wat groter is dan het maximum van {{PLURAL:$2|één kilobyte|$2 kilobyte}}.'''
 Opslaan is niet mogelijk.",
-'readonlywarning' => "'''Waarschuwing: de database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus u kunt deze nu niet opslaan.'''
+'readonlywarning' => "'''Waarschuwing: u kunt deze bewerking nu niet opslaan omdat de database is geblokkeerd voor bewerkingen wegens onderhoudswerkzaamheden.'''
 Het is misschien verstandig om uw tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.
 
 Een beheerder heeft de database geblokkeerd om de volgende reden: $1",
@@ -1148,6 +1155,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Er is een "unstrip"-lus gedetecteerd',
+'parser-unstrip-recursion-limit' => 'De recursielimiet ($1) voor "unstrip" is overschreden',
 
 # "Undo" feature
 'undo-success' => 'Deze bewerking kan ongedaan gemaakt worden.
@@ -1155,7 +1168,7 @@ Hieronder staat de tekst waarin de wijziging ongedaan is gemaakt.
 Controleer voor het opslaan of het resultaat gewenst is.',
 'undo-failure' => 'De wijziging kan niet ongedaan gemaakt worden vanwege andere strijdige wijzigingen.',
 'undo-norev' => 'De bewerking kon niet ongedaan gemaakt worden, omdat die niet bestaat of is verwijderd.',
-'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt.',
+'undo-summary' => 'Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) ongedaan gemaakt',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registreren is mislukt.',
@@ -1229,7 +1242,7 @@ U kunt deze verschillen bekijken. Er kunnen details te vinden zijn in het [{{ful
 'rev-showdeleted' => 'weergeven',
 'revisiondelete' => 'Versies verwijderen of terugplaatsen',
 'revdelete-nooldid-title' => 'Ongeldige doelversie',
-'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
+'revdelete-nooldid-text' => 'U hebt geen doelversie(s) voor deze handeling opgegeven. De aangegeven versie bestaat niet of u probeert de laatste versie te verbergen.',
 'revdelete-nologtype-title' => 'Er is geen logboektype opgegeven',
 'revdelete-nologtype-text' => 'U hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
 'revdelete-nologid-title' => 'Ongeldige logboekregel',
@@ -1256,7 +1269,7 @@ Andere beheerders van {{SITENAME}} kunnen de verborgen inhoud benaderen en de ve
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nee',
 'revdelete-suppress' => 'Gegevens voor zowel beheerders als anderen onderdrukken',
-'revdelete-unsuppress' => 'Beperkingen op teruggezette wijzigingen verwijderen',
+'revdelete-unsuppress' => 'Beperkingen op teruggeplaatste wijzigingen verwijderen',
 'revdelete-log' => 'Reden:',
 'revdelete-submit' => 'Toepassen op de geselecteerde {{PLURAL:$1|bewerking|bewerkingen}}',
 'revdelete-success' => "'''De zichtbaarheid van de wijziging is bijgewerkt.'''",
@@ -1268,7 +1281,7 @@ $1",
 'revdel-restore' => 'Zichtbaarheid wijzigen',
 'revdel-restore-deleted' => 'verwijderde versies',
 'revdel-restore-visible' => 'zichtbare versies',
-'pagehist' => 'paginageschiedenis',
+'pagehist' => 'Geschiedenis',
 'deletedhist' => 'verwijderde geschiedenis',
 'revdelete-hide-current' => 'Er is een fout opgetreden bij het verbergen van het object van $1 om $2 uur: dit is de huidige versie.
 Deze versie kan niet verborgen worden.',
@@ -1293,7 +1306,7 @@ Controleer de logboeken.',
 # Suppression log
 'suppressionlog' => 'Verbergingslogboek',
 'suppressionlogtext' => 'De onderstaande lijst bevat de verwijderingen en blokkades die voor beheerders verborgen zijn.
-In de [[Special:BlockList|IP-blokkeerlijst]] zijn de huidige blokkades te bekijken.',
+In de [[Special:BlockList|blokkadelijst]] zijn de huidige blokkades te bekijken.',
 
 # History merging
 'mergehistory' => "Geschiedenis van pagina's samenvoegen",
@@ -1327,8 +1340,9 @@ Let op dat het gebruiken van de navigatieverwijzingen deze kolom opnieuw instelt
 'mergelogpagetext' => 'Hieronder ziet u een lijst van recente samenvoegingen van een paginageschiedenis naar een andere.',
 
 # Diffs
-'history-title' => 'Geschiedenis van "$1"',
-'difference' => '(Verschil tussen bewerkingen)',
+'history-title' => '$1: versiegeschiedenis',
+'difference-title' => '$1: verschil tussen versies',
+'difference-title-multipage' => "$1 en $2: verschil tussen pagina's",
 'difference-multipage' => "(Verschil tussen pagina's)",
 'lineno' => 'Regel $1:',
 'compareselectedversions' => 'Geselecteerde versies vergelijken',
@@ -1341,7 +1355,7 @@ Let op dat het gebruiken van de navigatieverwijzingen deze kolom opnieuw instelt
 'searchresults' => 'Zoekresultaten',
 'searchresults-title' => 'Zoekresultaten voor "$1"',
 'searchresulttext' => 'Voor meer informatie over zoeken op {{SITENAME}}, zie [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'U zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'searchsubtitle' => 'U hebt gezocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
 'searchsubtitleinvalid' => "U hebt gezocht naar '''$1'''",
 'toomanymatches' => 'Er waren te veel resultaten.
 Probeer een andere zoekopdracht.',
@@ -1390,7 +1404,7 @@ Probeer een andere zoekopdracht.',
 'showingresultsnum' => "Hieronder {{PLURAL:$3|staat '''1''' resultaat|staan '''$3''' resultaten}} vanaf #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Resultaat '''$1''' van '''$3'''|Resultaten '''$1 - $2''' van '''$3'''}} voor '''$4'''",
 'nonefound' => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
-Als u in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
+Als u in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt, worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
 U kunt ook een naamruimte als voorvoegsel gebruiken.",
 'search-nonefound' => 'Er zijn geen resultaten voor uw zoekopdracht.',
 'powersearch' => 'Uitgebreid zoeken',
@@ -1428,6 +1442,7 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'prefs-beta' => 'Bètafunctionaliteit',
 'prefs-datetime' => 'Datum en tijd',
 'prefs-labs' => 'Alphafunctionaliteit',
+'prefs-user-pages' => "Gebruikerspagina's",
 'prefs-personal' => 'Gebruikersprofiel',
 'prefs-rc' => 'Recente wijzigingen',
 'prefs-watchlist' => 'Volglijst',
@@ -1458,7 +1473,7 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 'recentchangescount' => 'Standaard aantal weer te geven bewerkingen:',
 'prefs-help-recentchangescount' => "Dit geldt voor recente wijzigingen, paginageschiedenis en logboekpagina's.",
 'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor uw volglijst aangemaakt.
-Iedereen die deze sleutel kent kan uw volglijst lezen, dus kies een veilige sleutel.
+Iedereen die deze sleutel kent, kan uw volglijst lezen. Kies dus een veilige sleutel.
 Hier volgt een willekeurig gegenereerde waarde die u kunt gebruiken: $1',
 'savedprefs' => 'Uw voorkeuren zijn opgeslagen.',
 'timezonelegend' => 'Tijdzone:',
@@ -1513,7 +1528,8 @@ Deze moet minder dan $1 {{PLURAL:$1|karakters|karakters}} bevatten.',
 'prefs-help-gender' => 'Optioneel: dit wordt gebruikt om gebruikers correct aan te spreken in de software.
 Deze informatie is zichtbaar voor andere gebruikers.',
 'email' => 'E-mail',
-'prefs-help-realname' => 'Echte naam is optioneel, als u deze opgeeft kan deze naam gebruikt worden om u erkenning te geven voor uw werk.',
+'prefs-help-realname' => 'Echte naam is optioneel.
+Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor uw werk.',
 'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om u uw wachtwoord te e-mailen als u het bent vergeten.',
 'prefs-help-email-others' => 'U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een verwijzing op uw gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.',
 'prefs-help-email-required' => 'Hiervoor is een e-mailadres nodig.',
@@ -1553,7 +1569,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
 'userrights-reason' => 'Reden:',
 'userrights-no-interwiki' => "U hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
 'userrights-nodatabase' => 'De database $1 bestaat niet of is geen lokale database.',
-'userrights-nologin' => 'U moet zich [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
+'userrights-nologin' => 'U moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
 'userrights-notallowed' => 'U hebt geen rechten om gebruikersrechten toe te voegen of te verwijderen.',
 'userrights-changeable-col' => 'Groepen die u kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die u niet kunt beheren',
@@ -1691,7 +1707,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
 'nchanges' => '$1 {{PLURAL:$1|bewerking|bewerkingen}}',
 'recentchanges' => 'Recente wijzigingen',
 'recentchanges-legend' => 'Opties voor recente wijzigingen',
-'recentchangestext' => 'Op deze pagina kunt u de recente wijzigingen in deze wiki bekijken.',
+'recentchanges-summary' => 'Op deze pagina kunt u de recentste wijzigingen in deze wiki bekijken.',
 'recentchanges-feed-description' => 'Met deze feed kunt u de recentste wijzigingen in deze wiki bekijken.',
 'recentchanges-label-newpage' => 'Met deze bewerking is een nieuwe pagina aangemaakt',
 'recentchanges-label-minor' => 'Dit is een kleine bewerking',
@@ -1729,7 +1745,7 @@ Deze informatie is zichtbaar voor andere gebruikers.',
 'recentchangeslinked-toolbox' => 'Verwante wijzigingen',
 'recentchangeslinked-title' => 'Wijzigingen verwant aan "$1"',
 'recentchangeslinked-noresult' => "Er zijn in de opgegeven periode geen bewerkingen geweest op de pagina's waarheen vanaf hier verwezen wordt.",
-'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of vanuit pagina's in een aangegeven pagina een categorie.
+'recentchangeslinked-summary' => "Deze speciale pagina geeft de laatste bewerkingen weer op pagina's waarheen verwezen wordt vanaf een aangegeven pagina of vanaf pagina's in een aangegeven pagina een categorie.
 Pagina's die op [[Special:Watchlist|uw volglijst]] staan worden '''vet''' weergegeven.",
 'recentchangeslinked-page' => 'Paginanaam:',
 'recentchangeslinked-to' => "Wijzigingen aan pagina's met verwijzingen naar deze pagina bekijken",
@@ -1791,7 +1807,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.',
@@ -1909,14 +1925,15 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
 'backend-fail-writetemp' => 'Het was niet mogelijk naar een tijdelijk bestand te schrijven.',
 'backend-fail-closetemp' => 'Het was niet mogelijk een tijdelijk bestand te sluiten.',
 'backend-fail-read' => 'Het was niet mogelijk het bestand $1 te lezen.',
-'backend-fail-create' => 'Het was niet mogelijk het bestand $1 aan te maken.',
-'backend-fail-maxsize' => 'Het was niet mogelijk het bestand $1 aan te maken omdat het groter is dan {{PLURAL:$2|één byte|$2 bytes}}.',
+'backend-fail-create' => 'Het was niet mogelijk naar het bestand $1 te schrijven.',
+'backend-fail-maxsize' => 'Het was niet mogelijk naar het bestand $1 te schrijven omdat het groter is dan {{PLURAL:$2|één byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Het opslagbackend "$1" kan op dit moment alleen gelezen worden. De opgegeven reden was: "$2"',
 'backend-fail-synced' => 'Het bestand "$1" bevindt zich in een inconsistente toestand in de interne opslagbackends.',
 'backend-fail-connect' => 'Het was niet mogelijk een verbinding te maken met het opslagbackend "$1".',
 'backend-fail-internal' => 'Er is een onbekende fout opgetreden in het opslagbackend "$1".',
-'backend-fail-contenttype' => 'Kon het inhoudstype van het bestand om op "$1" op te slaan niet bepalen.',
+'backend-fail-contenttype' => 'Het inhoudstype van het bestand om in de opslag "$1" op te slaan kon niet bepaald worden.',
 'backend-fail-batchsize' => 'Taak met $1 {{PLURAL:$1|bestandshandeling|bestandshandelingen}} in het opslagbackend; de limiet is $2 {{PLURAL:$2|handeling|handelingen}}.',
+'backend-fail-usable' => 'Het was niet mogelijk naar het bestand $1 te schrijven vanwege onvoldoende rechten of niet-aanwezige mappen of containers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Het was niet mogelijk een verbinding te maken met de journaldatabase voor het opslagbackend "$1".',
@@ -2134,8 +2151,8 @@ Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjab
 'disambiguations' => "Pagina's die verwijzen naar doorverwijspagina's",
 'disambiguationspage' => 'Template:Doorverwijspagina',
 'disambiguations-text' => "Hieronder staan pagina's die verwijzen naar een '''doorverwijspagina'''.
-Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.
-<br />Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]]",
+Deze horen waarschijnlijk direct naar het juiste onderwerp te verwijzen.<br />
+Een pagina wordt gezien als doorverwijspagina als er een sjabloon op staat dat opgenomen is op [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dubbele doorverwijzingen',
 'doubleredirectstext' => "Deze lijst bevat pagina's die doorverwijzen naar andere doorverwijspagina's.
@@ -2222,7 +2239,7 @@ Een bestand kan hier dus ten onrechte opgenomen zijn.',
 'notargettitle' => 'Geen doelpagina',
 'notargettext' => 'U hebt niet opgegeven voor welke pagina of gebruiker u deze handeling wilt uitvoeren.',
 'nopagetitle' => 'Te hernoemen pagina bestaat niet',
-'nopagetext' => 'De pagina die u wilt hernoemen bestaat niet.',
+'nopagetext' => 'De doelpagina die u hebt opgegeven bestaat niet.',
 'pager-newer-n' => '{{PLURAL:$1|1 nieuwere|$1 nieuwere}}',
 'pager-older-n' => '{{PLURAL:$1|1 oudere|$1 oudere}}',
 'suppress' => 'Toezicht',
@@ -2245,6 +2262,7 @@ Controleer of u wellicht een fout hebt gemaakt bij de invoer.',
 U kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).',
 'logempty' => 'Er zijn geen regels in het logboek die voldoen aan deze criteria.',
 'log-title-wildcard' => "Pagina's zoeken die met deze tekens beginnen",
+'showhideselectedlogentries' => 'Geselecteerde logboekregels weergeven of verbergen',
 
 # Special:AllPages
 'allpages' => "Alle pagina's",
@@ -2261,10 +2279,15 @@ U kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlette
 'allpagessubmit' => 'OK',
 'allpagesprefix' => "Pagina's bekijken die beginnen met:",
 'allpagesbadtitle' => 'De opgegeven paginanaam is ongeldig of had een intertaal- of interwikivoorvoegsel.
-Mogelijk bevatte de naam karakters die niet gebruikt mogen worden in paginanamen.',
+Mogelijk bevatte de naam tekens die niet gebruikt mogen worden in paginanamen.',
 'allpages-bad-ns' => '{{SITENAME}} heeft geen naamruimte "$1".',
 'allpages-hide-redirects' => 'Doorverwijzingen verbergen',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'U bekijkt een cacheversie van deze pagina, die maximaal $1 oud is.',
+'cachedspecial-viewing-cached-ts' => 'U bekijkt een cacheversie van deze pagina, die mogelijk niet volledig is bijgewerkt.',
+'cachedspecial-refresh-now' => 'Meest recente weergeven.',
+
 # Special:Categories
 'categories' => 'Categorieën',
 'categoriespagetext' => "De volgende {{PLURAL:$1|categorie bevat|categorieën bevatten}} pagina's of mediabestanden.
@@ -2348,13 +2371,13 @@ De ontvanger kan dus direct naar u reageren.',
 'emailtarget' => 'Voer de geadresseerde in',
 'emailusername' => 'Gebruikersnaam:',
 'emailusernamesubmit' => 'Opslaan',
-'email-legend' => 'Een e-mail versturen naar een andere gebruiker van {{SITENAME}}',
+'email-legend' => 'Een e-mail verzenden naar een andere gebruiker van {{SITENAME}}',
 'emailfrom' => 'Van:',
 'emailto' => 'Aan:',
 'emailsubject' => 'Onderwerp:',
 'emailmessage' => 'Bericht:',
 'emailsend' => 'Verzenden',
-'emailccme' => 'Een kopie van dit bericht naar mijn e-mailadres sturen.',
+'emailccme' => 'Een kopie van dit bericht naar mijn e-mailadres zenden.',
 'emailccsubject' => 'Kopie van uw bericht aan $1: $2',
 'emailsent' => 'E-mail verzonden',
 'emailsenttext' => 'Uw e-mail is verzonden.',
@@ -2412,19 +2435,19 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 'enotif_anon_editor' => 'anonieme gebruiker $1',
 'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zie $PAGETITLE_URL voor de huidige versie.
+De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR. Zie $PAGETITLE_URL voor de huidige versie.
 
 $NEWPAGE
 
 Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
 
 Contactgegevens van de auteur:
-E-mail: $PAGEEDITOR_EMAIL
+E-mailadres: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
 Tenzij u deze pagina bezoekt, komen er geen verdere berichten. Op uw volglijst kunt u voor alle gevolgde pagina\'s de waarschuwingsinstellingen opschonen.
 
-             Groet van uw {{SITENAME}}-waarschuwingssysteem.
+Groet van uw {{SITENAME}}-waarschuwingssysteem.
 
 --
 U kunt uw e-mailinstellingen wijzigen op:
@@ -2436,7 +2459,7 @@ U kunt uw volglijstinstellingen wijzigen op:
 U kunt de pagina van uw volglijst verwijderen via de volgende verwijzing:
 $UNWATCHURL
 
-Feedback en andere assistentie:
+Terugkoppeling en verdere assistentie:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2503,7 +2526,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'modifiedarticleprotection' => 'heeft het beveiligingsniveau voor "[[$1]]" gewijzigd',
 'unprotectedarticle' => 'heeft de beveiliging van "[[$1]]" opgeheven',
 'movedarticleprotection' => 'heeft beveiligingsinstellingen verplaatst van "[[$2]]" naar "[[$1]]"',
-'protect-title' => 'Instellen van beveiligingsniveau voor "$1"',
+'protect-title' => 'Beveiligingsniveau instellen voor "$1"',
 'protect-title-notallowed' => 'Beveiligingsniveau voor "$1" bekijken',
 'prot_1movedto2' => '[[$1]] is hernoemd naar [[$2]]',
 'protect-badnamespace-title' => 'Niet te beveiligen naamruimte',
@@ -2516,7 +2539,7 @@ Zie de [[Special:ProtectedPages|lijst met beveiligde pagina's]] voor alle beveil
 'protect-unchain-permissions' => 'Overige beveiligingsinstellingen beschikbaar maken',
 'protect-text' => "Hier kunt u het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
 'protect-locked-blocked' => "U kunt het beveiligingsniveau niet wijzigen terwijl u geblokkeerd bent.
-Hier zijn de huidige instellingen voor de pagina '''$1''':",
+Dit zijn de huidige instellingen voor de pagina '''$1''':",
 'protect-locked-dblock' => "Het beveiligingsniveau kan niet worden gewijzigd, omdat de database gesloten is.
 Hier zijn de huidige instellingen voor de pagina '''$1''':",
 'protect-locked-access' => "U hebt geen rechten om het beveiligingsniveau te wijzigen.
@@ -2587,7 +2610,7 @@ Mogelijk hebt u een verkeerde verwijzing of is de versie hersteld of verwijderd
 'undeletelink' => 'bekijken/terugplaatsen',
 'undeleteviewlink' => 'bekijken',
 'undeletereset' => 'Fomulier wissen',
-'undeleteinvert' => 'Omgekeerde selectie',
+'undeleteinvert' => 'Selectie omkeren',
 'undeletecomment' => 'Reden:',
 'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
@@ -2606,7 +2629,7 @@ In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen
 'undelete-filename-mismatch' => 'Bestandsversie van tijdstip $1 kon niet hersteld worden: bestandsnaam klopte niet',
 'undelete-bad-store-key' => 'Bestandsversie van tijdstip $1 kon niet hersteld worden: het bestand miste al voordat het werd verwijderd.',
 'undelete-cleanup-error' => 'Fout bij het herstellen van ongebruikt archiefbestand "$1".',
-'undelete-missing-filearchive' => 'Het lukt niet om ID $1 terug te plaatsen, omdat deze niet in de database te vinden is.
+'undelete-missing-filearchive' => 'Het is niet mogelijk om ID $1 terug te plaatsen, omdat deze niet in de database te vinden is.
 Misschien is deze versie al teruggeplaatst.',
 'undelete-error' => 'Er is een fout opgetreden tijdens het verwijderen van de pagina',
 'undelete-error-short' => 'Fout bij het herstellen van bestand: $1',
@@ -2618,7 +2641,7 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Naamruimte:',
-'invert' => 'Omgekeerde selectie',
+'invert' => 'Selectie omkeren',
 'tooltip-invert' => 'Vink dit aan om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)',
 'namespace_association' => 'Gekoppelde naamruimte',
 'tooltip-namespace_association' => 'Vink dit aan om ook wijzigingen weer te geven in de overleg- of onderwerpnaamruimte die bij de geselecteerde naamruimte hoort',
@@ -2710,7 +2733,7 @@ Geef hieronder een reden op (bijvoorbeeld welke pagina's gevandaliseerd zijn).",
 'badipaddress' => 'Geen geldig IP-adres',
 'blockipsuccesssub' => 'De blokkering is ingesteld',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] is geblokkeerd.<br />
-Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blokkades.',
+Zie de [[Special:BlockList|blokkadelijst]] voor recente blokkades.',
 'ipb-blockingself' => 'U staat op het punt uzelf te blokkeren. Weet u zeker dat u dat wilt doen?',
 'ipb-confirmhideuser' => 'U staat op het punt een verborgen gebruiker te blokkeren. Hiervoor worden gebruikersnamen in alle lijsten en logboekregels verborgen. Weet u het zeker?',
 'ipb-edit-dropdown' => 'Lijst van redenen bewerken',
@@ -2744,8 +2767,8 @@ Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blo
 'expiringblock' => 'vervalt op $1 om $2',
 'anononlyblock' => 'alleen anoniemen',
 'noautoblockblock' => 'autoblokkeren uitgeschakeld',
-'createaccountblock' => 'registreren gebruikers geblokkeerd',
-'emailblock' => 'e-mail geblokkeerd',
+'createaccountblock' => 'registreren gebruikers uitgeschakeld',
+'emailblock' => 'e-mail uitgeschakeld',
 'blocklist-nousertalk' => 'kan eigen overlegpagina niet bewerken',
 'ipblocklist-empty' => 'De blokkeerlijst is leeg.',
 'ipblocklist-no-results' => 'Dit IP-adres of deze gebruikersnaam is niet geblokkeerd.',
@@ -2760,16 +2783,16 @@ Zie de [[Special:BlockList|Lijst van geblokkeerde IP-adressen]] voor recente blo
 Het blokkeerlogboek wordt hieronder ter referentie weergegeven:',
 'blocklog-showsuppresslog' => 'Deze gebruiker is voorheen geblokkeerd geweest en er zijn (delen van) bewerkingen van deze gebruiker verborgen.
 Het verbergingslogboek wordt hieronder ter referentie weergegeven:',
-'blocklogentry' => 'blokkeerde [[$1]] met als vervaltijd $2 $3',
+'blocklogentry' => 'heeft [[$1]] geblokkeerd met als vervaltijd $2 $3',
 'reblock-logentry' => 'heeft de blokkade voor [[$1]] gewijzigd met als vervaldatum $2 $3',
 'blocklogtext' => 'Hier ziet u een lijst van de recente blokkeringen en deblokkeringen.
 Automatische blokkeringen en deblokkeringen komen niet in het logboek.
-Zie ook [[Special:BlockList|Geblokkeerde IP-adressen en gebruikers]].',
+Zie ook de [[Special:BlockList|blokkadelijst]] voor de op dit moment actieve blokkades.',
 'unblocklogentry' => 'heeft de blokkade van $1 opgeheven',
 'block-log-flags-anononly' => 'alleen anoniemen',
 'block-log-flags-nocreate' => 'registreren gebruikers geblokkeerd',
 'block-log-flags-noautoblock' => 'autoblokkeren is uitgeschakeld',
-'block-log-flags-noemail' => 'e-mail geblokkeerd',
+'block-log-flags-noemail' => 'e-mail uitgeschakeld',
 'block-log-flags-nousertalk' => 'kan eigen overlegpagina niet bewerken',
 'block-log-flags-angry-autoblock' => 'uitgebreide automatische blokkade ingeschakeld',
 'block-log-flags-hiddenname' => 'gebruiker verborgen',
@@ -2806,8 +2829,7 @@ Omdat u het recht 'hideuser' niet hebt, kunt u de blokkade van de gebruiker niet
 # Developer tools
 'lockdb' => 'Database blokkeren',
 'unlockdb' => 'Blokkering van de database opheffen',
-'lockdbtext' => "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
-
+'lockdbtext' => "Als u de database blokkeert, kunnen gebruikers geen pagina's meer bewerken, geen voorkeuren wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
 Bevestig dat u deze handeling wilt uitvoeren en dat u de database vrijgeeft nadat het onderhoud is uitgevoerd.",
 'unlockdbtext' => "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.
 
@@ -2856,8 +2878,7 @@ Zorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
 * De overlegpagina onder de nieuwe naam al bestaat;
 * U het onderstaande vinkje deselecteert.",
 'movearticle' => 'Te hernoemen pagina:',
-'moveuserpage-warning' => "'''Waarschuwing:''' U gaat een gebruikerspagina hernoemen.
-Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
+'moveuserpage-warning' => "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
 'movenologin' => 'Niet aangemeld',
 'movenologintext' => 'U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
 'movenotallowed' => "U hebt geen rechten om pagina's te hernoemen.",
@@ -2910,9 +2931,9 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
 'imageinvalidfilename' => 'De nieuwe bestandsnaam is ongeldig',
 'fix-double-redirects' => 'Alle doorverwijzingen bijwerken die verwijzen naar de originele paginanaam',
 'move-leave-redirect' => 'Een doorverwijzing achterlaten',
-'protectedpagemovewarning' => "'''Waarschuwing:''' Deze pagina kan alleen door beheerders hernoemd worden.
+'protectedpagemovewarning' => "'''Waarschuwing:''' deze pagina kan alleen door beheerders hernoemd worden.
 De laatste logboekregel staat hieronder:",
-'semiprotectedpagemovewarning' => "'''Let op:''' Deze pagina kan alleen door geregistreerde gebruikers hernoemd worden.
+'semiprotectedpagemovewarning' => "'''Let op:''' deze pagina kan alleen door geregistreerde gebruikers hernoemd worden.
 De laatste logboekregel staat hieronder:",
 'move-over-sharedrepo' => '== Het bestand bestaat al ==
 [[:$1]] bestaat al in een gedeelde mediadatabank.
@@ -2949,7 +2970,7 @@ In het laatste geval kunt u ook een verwijzing gebruiken, bijvoorbeeld [[{{#Spec
 'allmessagescurrent' => 'Huidige inhoud',
 'allmessagestext' => 'Hieronder staan de systeemberichten uit de MediaWiki-naamruimte.
 Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//translatewiki.net translatewiki.net] als u wilt bijdragen aan de algemene vertaling voor MediaWiki.',
-'allmessagesnotsupportedDB' => "Deze pagina kan niet gebruikt worden, omdat '''\$wgUseDatabaseMessages''' is uitgeschakeld.",
+'allmessagesnotsupportedDB' => "Deze pagina kan niet worden gebruikt, omdat '''\$wgUseDatabaseMessages''' is uitgeschakeld.",
 'allmessages-filter-legend' => 'Filter',
 'allmessages-filter' => 'Filteren op aangepast:',
 'allmessages-filter-unmodified' => 'Ongewijzigd',
@@ -3023,7 +3044,7 @@ Een tijdelijke map is niet aanwezig.',
 # Import log
 'importlogpage' => 'Importlogboek',
 'importlogpagetext' => "Administratieve import van pagina's met geschiedenis van andere wiki's.",
-'import-logentry-upload' => 'importeerde [[$1]] via een bestandsupload',
+'import-logentry-upload' => 'heeft [[$1]] geïmporteerd via een bestandsupload',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|versie|versies}}',
 'import-logentry-interwiki' => 'importeerde $1 via transwiki',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|versie|versies}} van $2',
@@ -3051,9 +3072,10 @@ Een tijdelijke map is niet aanwezig.',
 'tooltip-pt-anonlogin' => 'U wordt van harte uitgenodigd om u aan te melden als gebruiker, maar dit is niet verplicht',
 'tooltip-pt-logout' => 'Afmelden',
 'tooltip-ca-talk' => 'Overleg over deze pagina',
-'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
+'tooltip-ca-edit' => 'U kunt deze pagina bewerken. Gebruik de knop "Bewerking ter controle bekijken" voordat u de pagina opslaat',
 'tooltip-ca-addsection' => 'Nieuw kopje toevoegen',
-'tooltip-ca-viewsource' => 'Deze pagina is beveiligd. U kunt wel de broncode bekijken.',
+'tooltip-ca-viewsource' => 'Deze pagina is beveiligd.
+U kunt wel de broncode bekijken.',
 'tooltip-ca-history' => 'Eerdere versies van deze pagina',
 'tooltip-ca-protect' => 'Deze pagina beveiligen',
 'tooltip-ca-unprotect' => 'De beveiliging voor deze pagina wijzigen',
@@ -3062,7 +3084,7 @@ Een tijdelijke map is niet aanwezig.',
 'tooltip-ca-move' => 'Deze pagina hernoemen',
 'tooltip-ca-watch' => 'Deze pagina aan mijn volglijst toevoegen',
 'tooltip-ca-unwatch' => 'Deze pagina van mijn volglijst verwijderen',
-'tooltip-search' => '{{SITENAME}} doorzoeken',
+'tooltip-search' => 'Zoeken in {{SITENAME}}',
 'tooltip-search-go' => 'Naar een pagina met deze naam gaan als die bestaat',
 'tooltip-search-fulltext' => "Alle pagina's op deze tekst doorzoeken",
 'tooltip-p-logo' => 'Naar de hoofdpagina gaan',
@@ -3164,8 +3186,9 @@ Een tijdelijke map is niet aanwezig.',
 Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'spamprotectionmatch' => 'De volgende tekst veroorzaakte een alarm van de spamfilter: $1',
 'spambot_username' => 'MediaWiki opschoning spam',
-'spam_reverting' => 'Bezig met terugdraaien naar de laatste versie die geen verwijzing heeft naar $1',
-'spam_blanking' => 'Alle wijzigingen met een verwijzing naar $1 worden verwijderd',
+'spam_reverting' => 'Teruggedraaid naar de laatste versie die geen verwijzing bevat naar $1',
+'spam_blanking' => 'Alle versies bevatten een verwijzing naar $1. Pagina leeggemaakt',
+'spam_deleting' => 'Alle versies bevatten verwijzingen naar $1. Pagina verwijderd',
 
 # Info page
 'pageinfo-title' => 'Informatie over "$1"',
@@ -3195,7 +3218,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'markaspatrolleddiff' => 'Als gecontroleerd markeren',
 'markaspatrolledtext' => 'Deze pagina als gecontroleerd markeren',
 'markedaspatrolled' => 'Gemarkeerd als gecontroleerd',
-'markedaspatrolledtext' => 'De geselecteerde versie van [[:$1]] is gemarkeerd als gecontroleerd.',
+'markedaspatrolledtext' => 'De geselecteerde bewerking van [[:$1]] is gemarkeerd als gecontroleerd.',
 'rcpatroldisabled' => 'De controlemogelijkheid op recente wijzigingen is uitgeschakeld.',
 'rcpatroldisabledtext' => 'De mogelijkheid om recente wijzigingen als gecontroleerd aan te merken is op dit ogenblik uitgeschakeld.',
 'markedaspatrollederror' => 'Kan niet als gecontroleerd worden aangemerkt',
@@ -3224,8 +3247,7 @@ $1',
 
 # Media information
 'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die uw systeem schade kan berokkenen.",
-'imagemaxsize' => "Maximale afmetingen van afbeeldingen:<br />
-''(voor op de beschrijvingspagina)''",
+'imagemaxsize' => "Maximale afmetingen van afbeeldingen:<br />''(voor op de beschrijvingspagina)''",
 'thumbsize' => 'Grootte miniatuurafbeelding:',
 'widthheight' => '$1 × $2',
 'widthheightpage' => "$1 × $2, $3 {{PLURAL:$3|pagina|pagina's}}",
@@ -3273,8 +3295,8 @@ Alle volgende verwijzingen die op dezelfde regel staan, worden behandeld als uit
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Dit bestand bevat aanvullende informatie, die door een fotocamera, scanner of fotobewerkingsprogramma toegevoegd kan zijn.
-Als het bestand aangepast is, komen details mogelijk niet overeen met het gewijzigde bestand.',
+'metadata-help' => 'Dit bestand bevat aanvullende gegevens, die waarschijnlijk door een fotocamera, scanner of fotobewerkingsprogramma toegevoegd zijn.
+Als het bestand is aangepast, komen sommige details mogelijk niet overeen met het gewijzigde bestand.',
 'metadata-expand' => 'Uitgebreide gegevens bekijken',
 'metadata-collapse' => 'Uitgebreide gegevens verbergen',
 'metadata-fields' => 'De afbeeldingsmetadatavelden in dit bericht worden ook weergegeven op een afbeeldingspagina als de metadatatabel ingeklapt is.
@@ -3813,11 +3835,11 @@ 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' => 'Veranderingen die nieuwer zijn dan $1 {{PLURAL:$1|seconde|seconden}} worden misschien niet weergegeven in deze lijst.',
+'lag-warn-normal' => 'Wijzigingen in de afgelopen {{PLURAL:$1|seconde|$1 seconden}} worden misschien niet weergegeven in deze lijst.',
 'lag-warn-high' => 'Door een hoge database-servertoevoer zijn wijzigingen nieuwer dan $1 {{PLURAL:$1|seconde|seconden}} mogelijk niet beschikbaar in de lijst.',
 
 # Watchlist editor
@@ -3826,7 +3848,7 @@ Probeer normale voorvertoning.',
 'watchlistedit-normal-title' => 'Volglijst bewerken',
 'watchlistedit-normal-legend' => 'Pagina’s van uw volglijst verwijderen',
 'watchlistedit-normal-explain' => 'Hieronder worden de pagina’s op uw volglijst weergegeven.
-Klik op het vierkantje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
+Klik op het vinkvakje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
 U kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].',
 'watchlistedit-normal-submit' => "Pagina's verwijderen",
 'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van uw volglijst:',
@@ -3867,7 +3889,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Onbekende tag "$1"',
-'duplicate-defaultsort' => 'Waarschuwing: De standaardsortering "$2" krijgt voorrang voor de sortering "$1".',
+'duplicate-defaultsort' => '\'\'\'Waarschuwing:\'\'\' de standaardsortering "$2" krijgt voorrang voor de sortering "$1".',
 
 # Special:Version
 'version' => 'Versie',
@@ -3897,6 +3919,11 @@ Samen met dit programma hoort u een [{{SERVER}}{{SCRIPTPATH}}/COPYING kopie van
 'version-software' => 'Geïnstalleerde software',
 'version-software-product' => 'Product',
 'version-software-version' => 'Versie',
+'version-entrypoints' => "URL's voor ingangen",
+'version-entrypoints-header-entrypoint' => 'Ingang',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Article path]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Script path]',
 
 # Special:FilePath
 'filepath' => 'Bestandslocatie',
@@ -4006,7 +4033,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'logentry-delete-event' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
 'logentry-delete-revision' => '$1 heeft de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
 'logentry-delete-event-legacy' => '$1 heeft de zichtbaarheid van logboekregels van $3 gewijzigd',
-'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd.',
+'logentry-delete-revision-legacy' => '$1 heeft de zichtbaarheid van versies van de pagina $3 gewijzigd',
 'logentry-suppress-delete' => '$1 heeft de pagina $3 onderdrukt',
 'logentry-suppress-event' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een logboekregel|$5 logboekregels}} van $3 gewijzigd: $4',
 'logentry-suppress-revision' => '$1 heeft heimelijk de zichtbaarheid van {{PLURAL:$5|een versie|$5 versies}} van de pagina $3 gewijzigd: $4',
@@ -4021,8 +4048,8 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'revdelete-restricted' => 'heeft beperkingen aan beheerders opgelegd',
 'revdelete-unrestricted' => 'heeft beperkingen voor beheerders opgeheven',
 'logentry-move-move' => '$1 heeft pagina $3 naar $4 hernoemd',
-'logentry-move-move-noredirect' => '$1 hernoemde pagina $3 naar $4 zonder een doorverwijzing achter te laten',
-'logentry-move-move_redir' => '$1 hernoemde pagina $3 naar $4 over een doorverwijzing',
+'logentry-move-move-noredirect' => '$1 heeft de pagina $3 hernoemd naar $4 zonder een doorverwijzing achter te laten',
+'logentry-move-move_redir' => '$1 heeft pagina $3 hernoemd naar $4 over een doorverwijzing',
 'logentry-move-move_redir-noredirect' => '$1 heeft pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
 'logentry-patrol-patrol' => '$1 heeft versie $4 van pagina $3 als gecontroleerd gemarkeerd',
 'logentry-patrol-patrol-auto' => '$1 heeft versie $4 van pagina $3 automatisch als gecontroleerd gemarkeerd',
@@ -4034,7 +4061,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 
 # Feedback
 'feedback-bugornote' => 'Als u zover bent om een technisch probleem in detail te beschrijven, [$1 rapporteer dan een bug].
-Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw commentaar zal worden toegevoegd aan de pagina "[$3 $2]", samen met uw gebruikersnaam en de browser die u gebruikt.',
+Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt dan toegevoegd aan de pagina "[$3 $2]", samen met uw gebruikersnaam en de browser die u gebruikt.',
 'feedback-subject' => 'Onderwerp:',
 'feedback-message' => 'Bericht:',
 'feedback-cancel' => 'Annuleren',
@@ -4086,4 +4113,17 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw commentaar za
 'api-error-uploaddisabled' => 'Uploaden is niet mogelijk in deze wiki.',
 'api-error-verification-error' => 'Dit bestand is mogelijk beschadigd of heeft een onjuiste extensie.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|seconde|seconden}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuut|minuten}}',
+'duration-hours' => '$1 {{PLURAL:$1|uur|uren}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagen}}',
+'duration-weeks' => '$1 {{PLURAL:$1|week|weken}}',
+'duration-years' => '$1 {{PLURAL:$1|jaar|jaar}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennia}}',
+'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Het was niet mogelijk een vergrendeling te krijgen op server $1.',
 );
index 3a2fe29..6d5496a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
+/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -342,7 +342,7 @@ $messages = array(
 # Font style option in Special:Preferences
 'editfont-style' => 'Endre stilen for skrifttypen i området:',
 'editfont-default' => 'Nettlesar i utgangspunktet',
-'editfont-monospace' => 'Skrift med fast breidde',
+'editfont-monospace' => 'Skrift med fast breidd',
 'editfont-sansserif' => 'Skrifttype utan seriffar',
 'editfont-serif' => 'Skrifttype med seriffar',
 
@@ -640,7 +640,7 @@ Ho kan allereie vere sletta av andre.',
 'cannotdelete-title' => 'Kan ikkje sletta sida «$1»',
 'badtitle' => 'Feil i tittelen',
 'badtitletext' => 'Den ønskte tittelen var ulovleg, tom eller feillenkja frå ein annan wiki. Kanskje inneheld han eitt eller fleire teikn som ikkje kan brukast i sidetitlar.',
-'perfcached' => 'Det følgjande er frå mellomlageret åt tenaren og er ikkje nødvendigvis oppdatert. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcached' => 'Dei følgjande dataa er frå mellomlageret åt tenaren og er ikkje utan vidare oppdatert. Høgst {{PLURAL:$1|eitt resultat er tilgjengeleg|$1 resultat er tilgjengelege}} i mellomlageret.',
 'perfcachedts' => 'Desse dataa er mellomlagra, og vart sist oppdaterte $1. Høgst {{PLURAL:$4|eitt resultat er tilgjengeleg|$4 resultat er tilgjengelege}} i mellomlageret.',
 'querypage-no-updates' => 'Oppdatering av denne sida er slått av, og data her vil ikkje verte fornya.',
 'wrong_wfQuery_params' => 'Feil parameter gjevne til wfQuery()<br />Funksjon: $1<br />Førespurnad: $2',
@@ -650,6 +650,7 @@ Ho kan allereie vere sletta av andre.',
 'actionthrottledtext' => 'For å hindre spamming kan du ikkje utføre denne handlinga for mange gonger på kort tid. Ver venleg og prøv igjen litt seinare.',
 'protectedpagetext' => 'Denne sida er verna for å hindre endring.',
 'viewsourcetext' => 'Du kan sjå og kopiere kjeldekoden til denne sida:',
+'viewyourtext' => "Du kan sjå og kopiera kjelda til '''endringane dine''' på sida:",
 'protectedinterface' => 'Denne sida inneheld tekst som er brukt av brukargrensesnittet for programvara, og er difor låst for å hindre hærverk.',
 'editinginterface' => "'''Åtvaring:''' Du endrar på ei side som inneheld tekst som er brukt av brukargrensesnittet for programvara. Endringar på denne sida påverkar utsjånaden til sida for dei andre brukarane. Dersom du ynskjer å setje om, ver venleg og vurder å bruke [//translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for omsetjing av MediaWiki.",
 'sqlhidden' => '(SQL-førespurnaden er gøymd)',
@@ -661,6 +662,8 @@ $2',
 'ns-specialprotected' => 'Sider i {{ns:special}}-namnerommet kan ikkje endrast.',
 'titleprotected' => "Denne sidetittelen er verna mot oppretting av [[User:$1|$1]].
 Grunnen som er gjeven er: ''$2''.",
+'invalidtitle-knownnamespace' => 'Ugyldig tittel med namnerommet «$2» og teksten «$3»',
+'invalidtitle-unknownnamespace' => 'Ugyldig tittel med ukjend namneromstal $1 og teksten «$2»',
 
 # Virus scanner
 'virus-badscanner' => "Dårleg konfigurasjon: ukjend virusskanner: ''$1''",
@@ -743,6 +746,7 @@ Grunna dette vil ikkje vitjande som nyttar denne IP-adressa kunna oppretta nye k
 'emailconfirmlink' => 'Stadfest e-post-adressa di',
 'invalidemailaddress' => 'E-postadressa kan ikkje nyttast sidan formatet truleg er feil. Skriv ei fungerande adresse eller tøm feltet.',
 'cannotchangeemail' => 'Epost-adresser knytta til brukarkonti kan ikkje endrast på denne wikien.',
+'emaildisabled' => 'Denne nettstaden kan ikkje senda e-postar.',
 'accountcreated' => 'Brukarkonto oppretta',
 'accountcreatedtext' => 'Brukarkontoen til $1 er oppretta.',
 'createaccount-title' => 'Oppretting av brukarkonto på {{SITENAME}}',
@@ -904,7 +908,12 @@ eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}
 'userpage-userdoesnotexist-view' => 'Brukarkontoen «$1» er ikkje oppretta.',
 'blocked-notice-logextract' => 'Denne brukaren er for tida blokkert.
 Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
-'clearyourcache' => "Merk: Etter lagring vil det kanskje vera naudsynt at nettlesaren slettar mellomlageret sitt for at endringane skal tre i kraft.''' '''Firefox og Safari:''' Hald ''Shift'' nede medan du trykkjer anten ''Ctrl-F5'' eller ''Ctrl-R'' (''Command-R'' på Mac). '''Konqueror:''' Trykk ''Oppdater'' eller på ''F5''. '''Opera:''' Tøm mellomlageret i ''Verktøy → Innstillingar''. '''Internet Explorer:''' Hald nede ''Ctrl'' medan du trykkjer ''Oppdater'', eler trykk ''Ctrl-F5.''",
+'clearyourcache' => "'''Merk:''' Etter lagring vil det kanskje vera naudsynt at nettlesaren slettar mellomlageret sitt for at endringane skal tre i kraft.
+* '''Firefox og Safari:''' Haldt nede ''Shift'' medan du klikkar på ''Oppdater'', eller trykk anten ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på Mac)
+* '''Google Chrome:''' Trykk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på Mac)
+* '''Internet Explorer:''' Haldt nede ''Ctrl'' medan du klikkar ''Oppdater'', eller trykk ''Ctrl-F5.''
+* '''Konqueror:''' Klikk ''Oppdater'' eller trykk ''F5''. 
+* '''Opera:''' Tøm mellomlageret i ''Verktøy → Innstillingar''.",
 'usercssyoucanpreview' => "'''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste den nye CSS- eller JavaScript-koden din før du lagrar.",
 'userjsyoucanpreview' => "''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste den nye CSS- eller JavaScript-koden din før du lagrar.",
 'usercsspreview' => "'''Hugs at dette berre er ei førehandsvising av din eigen CSS og at han ikkje er lagra enno!'''",
@@ -916,7 +925,9 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'userinvalidcssjstitle' => "'''Åtvaring:''' Det finst ikkje noka sidedrakt som heiter «$1». Hugs på at vanlege .css- og .js-sider brukar titlar med små bokstavar, til dømes {{ns:user}}:Døme/vector.css, og ikkje {{ns:user}}:Døme/Vector.css.",
 'updated' => '(Oppdatert)',
 'note' => "'''Merk:'''",
-'previewnote' => "'''Hugs at dette berre er ei førehandsvising og at teksten ikkje er lagra!'''",
+'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.'''
@@ -927,6 +938,7 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'token_suffix_mismatch' => "'''Endringa di vart avvist fordi klienten/nettlesaren din lagar teiknfeil i teksten. Dette vart gjort for å hindre øydelegging av teksten på sida. Slikt kan av og til hende når ein brukar feilprogrammerte og vevbaserte anonyme proxytenester.'''",
 'edit_form_incomplete' => 'Delar av redigeringsskjemaet nådde ikkje fram til tenaren; dobbelsjekk at redigeringa er korrekt, og prøv om att.',
 'editing' => 'Endrar $1',
+'creating' => 'Opprettar $1',
 'editingsection' => 'Endrar $1 (bolk)',
 'editingcomment' => 'Endrar $1 (ny bolk)',
 'editconflict' => 'Endringskonflikt: $1',
@@ -950,14 +962,13 @@ Teksten må du ha skrive sjølv, eller kopiert frå ein ressurs som er kompatibe
 Teksten må du ha skrive sjølv eller ha kopiert frå ein ressurs som er kompatibel med vilkåra eller ikkje verna av opphavsrett (sjå $1 for detaljar).
 
 '''LEGG ALDRI INN MATERIALE SOM ANDRE HAR OPPHAVSRETT TIL UTAN LØYVE FRÅ DEI!'''",
-'longpageerror' => "'''Feil: Teksten du har prøvd å lagre er $1 kilobyte
-lang, altså lenger enn $2 kilobyte som er maksimum. Han kan difor ikkje lagrast.'''",
+'longpageerror' => "'''Feil: Teksten du sende inn er {{PLURAL:$1|éin kilobyte|$1 kilobyte}} stor, noko som er større enn øvstegrensa på {{PLURAL:$2|éin kilobyte|$2 kilobyte}}.''' Han kan difor ikkje lagrast.",
 'readonlywarning' => "'''ÅTVARING: Databasen er skriveverna på grunn av vedlikehald, så du kan ikkje lagre endringane dine akkurat no. Det kan vera lurt å  kopiere teksten din til ei tekstfil, så du kan lagre han her seinare.'''
 
 Systemadministratoren som låste databasen gav følgjande årsak: $1",
-'protectedpagewarning' => "'''ÅTVARING: Denne sida er verna, slik at berre administratorar kan endre ho.'''
+'protectedpagewarning' => "'''ÅTVARING: Denne sida er verna, slik at berre administratorar kan endra henne.'''
 Det siste loggelementet er oppgjeve under som referanse:",
-'semiprotectedpagewarning' => "'''Merk:''' Denne sida er verna slik at berre registrerte brukarar kan endre henne.
+'semiprotectedpagewarning' => "'''Merk:''' Denne sida er verna slik at berre registrerte brukarar kan endra henne.
 Det siste loggelementet er oppgjeve under som referanse:",
 'cascadeprotectedwarning' => "'''Åtvaring:''' Denne sida er verna så berre brukarar med administratortilgang kan endre henne. Dette er fordi ho er inkludert i {{PLURAL:$1|denne djupverna sida|desse djupverna sidene}}:",
 'titleprotectedwarning' => "'''Åtvaring: Denne sida er verna, så berre [[Special:ListGroupRights|nokre brukarar]] kan opprette henne.'''
@@ -1067,16 +1078,16 @@ Som administrator kan du sjå han. Det finst kanskje meir informasjon i [{{fullu
 'rev-deleted-no-diff' => "Du kan ikkje vise denne skilnaden fordi ein av versjonane er vorten '''sletta'''.
 Det finst kanskje detaljar i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} sletteloggen].",
 'rev-suppressed-no-diff' => "Du kan ikkje sjå denne skilnaden av di ein av versjonane er vorten '''sletta'''.",
-'rev-deleted-unhide-diff' => "Éin av versjonane i denne skilnaden er vorten '''sletta'''.
-Det finst kanskje detaljar i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} sletteloggen].
-Som administrator kan du framleis [$1 sjå skilnaden] om du ynskjer å halda fram.",
-'rev-suppressed-unhide-diff' => "Ei av sideversjonane i denne lista over versjonar har vorte '''skjult'''.
-Det kan vera detaljar i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} skjulingsloggen].
-Som administrator kan du framleis [$1 sjå versjonen] om du ynskjer det.",
-'rev-deleted-diff-view' => "Ei av endringane i dette oversynet er '''sletta'''.
-Som administrator kan du sjå oversynet; detaljar finn du i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
-'rev-suppressed-diff-view' => "Ei av endringane i dette oversynet er '''løynd'''.
-Som administrator kan du sjå dette oversynet; detaljar finn du i [{{fullurl:{{#Special:Log}}/suppcess|page={{FULLPAGENAMEE}}}} historikkfjerningsloggen].",
+'rev-deleted-unhide-diff' => "Ein av versjonane i denne skilnaden er vorten '''sletta'''.
+Det finst detaljar i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} sletteloggen].
+Du kan framleis [$1 sjå skilnaden] om du ynskjer å halda fram.",
+'rev-suppressed-unhide-diff' => "Ein av sideversjonane i denne lista over versjonar er vorten '''løynd'''.
+Det finst detaljar i [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} løyneloggen].
+Du kan framleis [$1 sjå skilnaden] om du ynskjer å halda fram.",
+'rev-deleted-diff-view' => "Ein av versjonane i skilnaden er vorten '''sletta'''.
+Du kan sjå skilnaden; detaljar finst i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
+'rev-suppressed-diff-view' => "Ei av endringane i skilnaden er vorten '''løynd'''.
+Du kan sjå skilnaden; detaljar finst i [{{fullurl:{{#Special:Log}}/suppcess|page={{FULLPAGENAMEE}}}} løyneloggen].",
 'rev-delundel' => 'vis/gøym',
 'rev-showdeleted' => 'syn',
 'revisiondelete' => 'Slett/attopprett versjonar',
@@ -1117,7 +1128,7 @@ $1",
 'logdelete-success' => "'''Visinga av loggoppføringar er endra.'''",
 'logdelete-failure' => "'''Korleis loggen skal vera synleg kunne ikkje verta stilt inn:'''
 $1",
-'revdel-restore' => 'endra synlegheita',
+'revdel-restore' => 'endra synlegdomen',
 'revdel-restore-deleted' => 'sletta versjonar',
 'revdel-restore-visible' => 'synlege versjonar',
 'pagehist' => 'Sidehistorikk',
@@ -1137,7 +1148,7 @@ Sjekk gjerne loggføringa.',
 ** Brot på opphavsrettar
 ** Ikkje høveleg personleg informasjon
 ** Mogleg falskt sladder',
-'revdelete-otherreason' => 'Annan årsak, eller tilleggsårsak:',
+'revdelete-otherreason' => 'Anna årsak, eller tilleggsårsak:',
 'revdelete-reasonotherlist' => 'Annan grunn',
 'revdelete-edit-reasonlist' => 'Endre grunnar til sletting',
 'revdelete-offender' => 'Forfattar av denne versjonen:',
@@ -1145,7 +1156,7 @@ Sjekk gjerne loggføringa.',
 # Suppression log
 'suppressionlog' => 'Logg over historikkfjerningar',
 'suppressionlogtext' => 'Under er ei liste over slettingar og blokkeringar som er gøymde frå administratorane.
-Sjå [[Special:IPBlockList|blokkeringslista]] for oversikta over gjeldande blokkeringar.',
+Sjå [[Special:BlockList|blokkeringslista]] for oversikta over gjeldande blokkeringar.',
 
 # History merging
 'mergehistory' => 'Flett sidehistorikkar',
@@ -1177,8 +1188,9 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'mergelogpagetext' => 'Nedanfor finn du ei liste over dei siste flettingane av ein sidehistorikk til ein annan.',
 
 # Diffs
-'history-title' => 'Historikken til «$1»',
-'difference' => '(Skilnad mellom versjonar)',
+'history-title' => '$1: Versjonshistorikk',
+'difference-title' => '$1: Skilnad mellom versjonar',
+'difference-title-multipage' => '$1 og $2: Skilnad mellom sidene',
 'difference-multipage' => '(Skilnad mellom sider)',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Samanlikn valde versjonar',
@@ -1261,6 +1273,7 @@ Ver merksam på at registra deira kan vera utdaterte.',
 'qbsettings-fixedright' => 'Høgre',
 'qbsettings-floatingleft' => 'Flytande venstre',
 'qbsettings-floatingright' => 'Flytande høgre',
+'qbsettings-directionality' => 'Fast, avhengig av kva retning språket ditt vert lese',
 
 # Preferences page
 'preferences' => 'Innstillingar',
@@ -1275,6 +1288,7 @@ Ver merksam på at registra deira kan vera utdaterte.',
 'prefs-beta' => 'Betafunksjonar',
 'prefs-datetime' => 'Dato og klokkeslett',
 'prefs-labs' => 'Testfunksjonar',
+'prefs-user-pages' => 'Brukarsider',
 'prefs-personal' => 'Brukaropplysningar',
 'prefs-rc' => 'Siste endringar',
 'prefs-watchlist' => 'Overvakingsliste',
@@ -1533,7 +1547,7 @@ Dette kan ikke tilbakestillast.',
 'nchanges' => '{{PLURAL:$1|Éi endring|$1 endringar}}',
 'recentchanges' => 'Siste endringar',
 'recentchanges-legend' => 'Alternativ for siste endringar',
-'recentchangestext' => 'På denne sida ser du dei sist endra sidene i {{SITENAME}}.',
+'recentchanges-summary' => 'På denne sida ser du dei sist endra sidene i {{SITENAME}}.',
 'recentchanges-feed-description' => 'Fylg med på dei siste endringane på denne wikien med dette abonnementet.',
 'recentchanges-label-newpage' => 'Denne redigeringa oppretta ei ny side',
 'recentchanges-label-minor' => 'Dette er ei mindre endring',
@@ -1562,6 +1576,7 @@ Dette kan ikke tilbakestillast.',
 'newsectionsummary' => '/* $1 */ ny bolk',
 'rc-enhanced-expand' => 'Vis detaljar (krev JavaScript)',
 'rc-enhanced-hide' => 'Skjul detaljar',
+'rc-old-title' => 'opphavleg oppretta som «$1»',
 
 # Recent changes linked
 'recentchangeslinked' => 'Relaterte endringar',
@@ -1610,8 +1625,9 @@ For å bruke ei fil på ei side, bruk ei lenkje på eit liknande format:
 'ignorewarnings' => 'Oversjå åtvaringar',
 'minlength1' => 'Filnamn må ha minst eitt teikn.',
 'illegalfilename' => 'Filnamnet «$1» inneheld teikn som ikkje er tillatne i sidetitlar. Skift namn på fila og prøv på nytt.',
+'filename-toolong' => 'Filnamn kan ikkje vera lengre enn 240 byte.',
 'badfilename' => 'Namnet på fila har vorte endra til «$1».',
-'filetype-mime-mismatch' => 'Filendinga samsvarar ikkje med ein MIME-type.',
+'filetype-mime-mismatch' => 'Filendinga «.$1» samsvarar ikkje med MIME-typen som er funnen i fila ($2).',
 'filetype-badmime' => 'Filer av MIME-typen «$1» kan ikkje lastast opp.',
 'filetype-bad-ie-mime' => 'Kan ikkje lasta opp fila då Internet Explorer ville merka ho som "$1", ein ikkje-tillate og potensielt farleg filtype.',
 'filetype-unwanted-type' => "«'''.$1'''» er ein uynskt filtype.
@@ -1668,7 +1684,7 @@ Om du framleis ønskjer å laste opp fila, gå tilbake og last ho opp med eit an
 'uploadvirus' => 'Fila innheld virus! Detaljar: $1',
 'upload-source' => 'Kjeldefil',
 'sourcefilename' => 'Filsti:',
-'sourceurl' => 'URL til kjelda:',
+'sourceurl' => 'Kjelde-URL:',
 'destfilename' => 'Målfilnamn:',
 'upload-maxfilesize' => 'Maksimal filstorleik: $1',
 'upload-description' => 'Filskildring',
@@ -1709,6 +1725,11 @@ $1',
 'upload-unknown-size' => 'Ukjend storleik',
 'upload-http-error' => 'Ein HTTP-feil oppstod: $1',
 
+# File backend
+'backend-fail-invalidpath' => '$1 er ikkje ein gyldig lagringsstig.',
+'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
+'backend-fail-alreadyexists' => 'Fila $1 finst frå før.',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Tilgjenge avslått',
 'img-auth-nopathinfo' => 'PATH_INFO manglar.
@@ -1933,7 +1954,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 'deadendpages' => 'Blindvegsider',
 'deadendpagestext' => 'Desse sidene har ikkje lenkjer til andre sider på {{SITENAME}}.',
 'protectedpages' => 'Verna sider',
-'protectedpages-indef' => 'Berre vern på ubestemt tid',
+'protectedpages-indef' => 'Berre vern på uavgrensa tid',
 'protectedpages-cascade' => 'Berre djupvern',
 'protectedpagestext' => 'Desse sidene er verna mot flytting og endring',
 'protectedpagesempty' => 'Ingen sider er verna på den valde måten akkurat no.',
@@ -1980,8 +2001,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',
@@ -1993,6 +2014,10 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 'allpagesprefix' => 'Vis sider med prefikset:',
 'allpagesbadtitle' => 'Det oppgjevne sidenamnet var ugyldig eller hadde eit interwiki-prefiks. Det kan også ha hatt eitt eller fleire teikn som ikkje kan brukast i sidenamn.',
 'allpages-bad-ns' => '{{SITENAME}} har ikkje namnerommet «$1».',
+'allpages-hide-redirects' => 'Gøym omdirigeringar',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Sjå siste.',
 
 # Special:Categories
 'categories' => 'Kategoriar',
@@ -2215,6 +2240,7 @@ Sjå [[Special:ProtectedPages|lista over verna sider]] for lista over vern som n
 'unprotectedarticle' => 'fjerna vern av «[[$1]]»',
 'movedarticleprotection' => 'flytta verneinnstillingar frå «[[$2]]» til «[[$1]]»',
 'protect-title' => 'Vernar «$1»',
+'protect-title-notallowed' => 'Sjå vernenivået til «$1»',
 'prot_1movedto2' => '«[[$1]]» flytt til «[[$2]]»',
 'protect-legend' => 'Stadfest vern',
 'protectcomment' => 'Grunngjeving:',
@@ -2234,14 +2260,15 @@ Her er dei noverande innstillingane for sida '''$1''':",
 'protect-level-sysop' => 'Berre administratorar',
 'protect-summary-cascade' => 'djupvern',
 'protect-expiring' => 'endar $1 (UTC)',
-'protect-expiry-indefinite' => 'ubestemt',
+'protect-expiring-local' => 'endar $1',
+'protect-expiry-indefinite' => 'uavgrensa',
 'protect-cascade' => 'Vern alle sidene som er inkludert på denne sida (djupvern)',
 'protect-cantedit' => 'Du kan ikkje endre vernenivået på sida fordi du ikkje har tilgang til å endre henne.',
 'protect-othertime' => 'Anna tid:',
 'protect-othertime-op' => 'anna tid',
 'protect-existing-expiry' => 'Gjeldande utløpstid: $3 $2',
-'protect-otherreason' => 'Annan/ytterlegare årsak:',
-'protect-otherreason-op' => 'Annan årsak',
+'protect-otherreason' => 'Anna/ytterlegare årsak:',
+'protect-otherreason-op' => 'Anna årsak',
 'protect-dropdown' => '*Vanlege verneårsaker
 ** Gjenteke hærverk
 ** Gjenteke spam
@@ -2273,9 +2300,8 @@ Her er dei noverande innstillingane for sida '''$1''':",
 'viewdeletedpage' => 'Sjå sletta sider',
 'undeletepagetext' => '{{PLURAL:$1|Den følgjande sida er sletta, men ho|Dei følgjande $1 sidene er sletta, men dei}} finst enno i arkivet og kan attopprettast. Arkivet blir periodevis sletta.',
 'undelete-fieldset-title' => 'Attenderull endringar',
-'undeleteextrahelp' => "For å attenderulle heile sida, la alle boksane vere som dei er, og klikk '''''Rull attende'''''.
-For å berre attenderulle delar, kryss av boksane til endringane, og klikk '''''Rull attende'''''.
-Å klikke '''''Nullstill''''' vil føre til at alle tekstfelt og boksar vert blanke.",
+'undeleteextrahelp' => "For å attoppretta heile historikken til sida, lat alle boksane vera vera tomme og trykk '''''{{int:undeletebtn}}'''''.
+For å berre attopretta delar av historikken, haka av boksane til dei relevante endringane og trykk '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => '{{PLURAL:$1|Éin versjon arkivert|$1 versjonar arkiverte}}',
 'undeletehistory' => 'Om du gjenopprettar sida vil alle endringar i historikken også bli gjenoppretta. Dersom ei ny side med same namn er oppretta etter slettinga, vil dei gjenoppretta endringane dukke opp før denne i endringshistorikken.',
 'undeleterevdel' => 'Gjenoppretting kan ikkje utførast om det resulterer i at den øvste endringa delvis vert sletta. I slike tilfelle må du fjerne merkinga av den siste sletta endringa.',
@@ -2299,6 +2325,7 @@ Innhaldet i dei sletta versjonane er berre tilgjengeleg for administratorar.',
 
 Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
 'undelete-header' => 'Sjå [[Special:Log/delete|sletteloggen]] for dei sist sletta sidene.',
+'undelete-search-title' => 'Søk i sletta sider',
 'undelete-search-box' => 'Søk i sletta sider',
 'undelete-search-prefix' => 'Vis sider frå og med:',
 'undelete-search-submit' => 'Søk',
@@ -2307,6 +2334,7 @@ Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er
 'undelete-bad-store-key' => 'Kan ikkje gjenopprette filutgåva med tidstrykk $1: fil mangla før sletting',
 'undelete-cleanup-error' => 'Feil ved sletting av den ubrukte arkivfila «$1».',
 'undelete-missing-filearchive' => 'Kunne ikkje attopprette filarkivet med nummer $1 fordi det ikkje ligg i databasen. Det kan allereie ver attoppretta.',
+'undelete-error' => 'Feil under attoppretting av sida.',
 'undelete-error-short' => 'Veil ved sletting av fila: $1',
 'undelete-error-long' => 'Feil ved attoppretting av fila:
 
@@ -2566,7 +2594,7 @@ I desse falla lyt du flytte eller flette saman sida manuelt.",
 
 Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje rom for flytting?',
 'delete_and_move_confirm' => 'Ja, slett sida',
-'delete_and_move_reason' => 'Sletta for å gi rom for flytting frå "[[$1]]"',
+'delete_and_move_reason' => 'Sletta for å gje rom for flytting frå «[[$1]]»',
 'selfmove' => 'Kjelde- og måltitlane er like; kan ikkje flytte sida over seg sjølv.',
 'immobile-source-namespace' => 'Kan ikkje flytte sider i namnerommet «$1»',
 'immobile-target-namespace' => 'Kan ikkje flytte sider til namnerommet «$1»',
@@ -2744,6 +2772,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'tooltip-diff' => 'Vis skilnaden mellom din versjon og lagra versjon, utan å lagre.',
 'tooltip-compareselectedversions' => 'Sjå endringane mellom dei valde versjonane av denne sida.',
 'tooltip-watch' => 'Legg denne sida til i overvakingslista di [alt-w]',
+'tooltip-watchlistedit-raw-submit' => 'Oppdater overvakingslista',
 'tooltip-recreate' => 'Ved å trykkje på «Nyopprett» vert sida oppretta på nytt.',
 'tooltip-upload' => 'Start opplastinga',
 'tooltip-rollback' => '«Attenderull»-knappen attenderullar endringar på denne sida med eitt klikk til den førre utgåva av ein annan brukar',
@@ -2869,6 +2898,7 @@ $1',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|rame|ramer}}',
 'file-info-png-looped' => '↓oppatteke',
 'file-info-png-repeat' => 'spela av {{PLURAL:$1|éin gong|$1 gonger}}',
+'file-info-png-frames' => '$1 {{PLURAL:$1|bilete|bilete}}',
 
 # Special:NewFiles
 'newimages' => 'Filgalleri',
@@ -2882,6 +2912,13 @@ $1',
 'bydate' => 'etter dato',
 'sp-newimages-showfrom' => 'Vis nye filer frå og med $2 $1',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekund|$1 sekund}}',
+'minutes' => '{{PLURAL:$1|$1 minutt|$1 minutt}}',
+'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
+'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
+'ago' => '$1 sidan',
+
 # Bad image list
 'bad_image_list' => 'Formatet er slik:
 
@@ -3043,6 +3080,7 @@ Andre er gøymde som standard.
 'exif-headline' => 'Overskrift',
 'exif-credit' => 'Opphavrettseigar/filgjevar',
 'exif-source' => 'Kjelde',
+'exif-writer' => 'Forfattar',
 'exif-languagecode' => 'Språk',
 'exif-iimversion' => 'IIM-versjon',
 'exif-iimcategory' => 'Kategori',
@@ -3197,6 +3235,10 @@ Andre er gøymde som standard.
 'exif-gpslongitude-e' => 'Austleg lengdegrad',
 'exif-gpslongitude-w' => 'Vestleg lengdegrad',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '{{PLURAL:$1|Éin|$1}} meter over havet',
+'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|Éin|$1}} meter under havet',
+
 'exif-gpsstatus-a' => 'Måling pågår',
 'exif-gpsstatus-v' => 'Målingsinteroperabilitet',
 
@@ -3213,6 +3255,8 @@ Andre er gøymde som standard.
 'exif-gpsdestdistance-m' => 'Miles',
 'exif-gpsdestdistance-n' => 'Nautiske mil',
 
+'exif-gpsdop-good' => 'God ($1)',
+
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Verkeleg retning',
 'exif-gpsdirection-m' => 'Magnetisk retning',
@@ -3321,16 +3365,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',
@@ -3512,14 +3556,25 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 # New logging system
 'logentry-delete-delete' => '$1 sletta sida $3',
 'logentry-delete-restore' => '$1 attoppretta sida $3',
+'logentry-delete-event' => '$1 endra synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
+'logentry-delete-revision' => '$1 endra synlegdomen av {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-delete-event-legacy' => '$1 endra synlegdomen av loggoppføringar på $3',
+'logentry-delete-revision-legacy' => '$1 endra synlegdomen av versjonar på sida $3',
+'logentry-suppress-delete' => '$1 gøymde sida $3',
 'revdelete-content-hid' => 'innhald gøymt',
 'revdelete-summary-hid' => 'endringsamandrag gøymt',
+'revdelete-uname-hid' => 'brukarnamn gøymt',
+'revdelete-content-unhid' => 'innhald gjort synleg',
+'revdelete-summary-unhid' => 'endringssamandrag gjort synleg',
+'revdelete-uname-unhid' => 'brukarnamn gjort synleg',
 'revdelete-restricted' => 'la til avgrensingar for administratorar',
 'revdelete-unrestricted' => 'fjerna avgrensingar for administratorar',
 'logentry-move-move' => '$1 flytte sida $3 til $4',
 'logentry-move-move-noredirect' => '$1 flytte sida $3 til $4 utan å lata etter ei omdirigering',
 'logentry-move-move_redir' => '$1 flytte sida $3 til $4 over ei omdirigering',
 'logentry-move-move_redir-noredirect' => '$1 flytte sida $3 til $4 over ei omdirigering utan å lata etter ei omdirigering',
+'logentry-patrol-patrol' => '$1 merkte versjon $4 av sida $3 som patruljert',
+'logentry-patrol-patrol-auto' => '$1 merkte automatisk versjon $4 av sida $3 som patruljert',
 'logentry-newusers-newusers' => '$1 oppretta ein brukarkonto',
 'logentry-newusers-create' => '$1 oppretta ein brukarkonto',
 'logentry-newusers-create2' => '$1 oppretta brukarkontoen $3',
@@ -3535,6 +3590,8 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'feedback-error1' => 'Feil: Ukjent resultat frå API',
 'feedback-error2' => 'Feil: Brigdinga gjekk ikkje',
 'feedback-error3' => 'Feil: Saknar svar frå API',
+'feedback-thanks' => 'Takk! Attendemeldinga di er lagd inn på sida «[$2 $1]».',
+'feedback-close' => 'Gjort',
 
 # API errors
 'api-error-badaccess-groups' => 'Du har ikkje løyve til å lasta opp filer til wikien.',
@@ -3566,4 +3623,15 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'api-error-uploaddisabled' => 'Det er ikkje høve til å lasta opp filer til wikien.',
 'api-error-verification-error' => 'Fila kan vera øydelagd eller ha rang filending.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minutt|minutt}}',
+'duration-hours' => '$1 {{PLURAL:$1|time|timar}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|veke|veker}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|tiår|tiår}}',
+'duration-centuries' => '$1 {{PLURAL:$1|hundreår|hundreår}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tusenår|tusenår}}',
+
 );
index e02b2fa..ca3f1b8 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
+/** Norwegian (bokmål)‬ (‪norsk (bokmål)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Jeblad
  */
 
 $fallback = 'nb';
@@ -921,7 +922,6 @@ Forsikre deg om at denne endringen vil opprettholde historisk sidekontinuitet.',
 
 # Diffs
 'history-title' => 'Revisjonshistorikk for «$1»',
-'difference' => '(Forskjell mellom revisjoner)',
 'difference-multipage' => '(Forskjell mellom sider)',
 'lineno' => 'Linje $1:',
 'compareselectedversions' => 'Sammenlign valgte revisjoner',
@@ -1271,7 +1271,7 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 'nchanges' => '$1 {{PLURAL:$1|endring|endringer}}',
 'recentchanges' => 'Siste endringer',
 'recentchanges-legend' => 'Alternativ for siste endringer',
-'recentchangestext' => 'Vis de siste endringene til denne siden',
+'recentchanges-summary' => 'Vis de siste endringene til denne siden',
 'recentchanges-feed-description' => 'Følg med på siste endringer i denne wikien med denne matingen.',
 'recentchanges-label-newpage' => 'Denne redigeringen opprettet en ny side',
 'recentchanges-label-minor' => 'Dette er en mindre endring',
@@ -2008,7 +2008,7 @@ Dette er de nåværende innstillingene for siden '''$1''':",
 Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.',
 'protect-default' => 'Tillat alle brukere',
 'protect-fallback' => 'Må ha «$1»-tillatelse',
-'protect-level-autoconfirmed' => 'Blokker nye og uregistrerte brukere',
+'protect-level-autoconfirmed' => 'Eastte anonyma ja ođđa geavaheddjiid',
 'protect-level-sysop' => 'Kun administratorer',
 'protect-summary-cascade' => 'dypbeskyttelse',
 'protect-expiring' => 'utløper $1 (UTC)',
index d373e02..94b5b1f 100644 (file)
@@ -542,7 +542,6 @@ fetola tshenolo',
 
 # Diffs
 'history-title' => 'Histori ya diphetogo tša "$1"',
-'difference' => '(Phapang magareng ga dipoeletšo)',
 'lineno' => 'Mothalo $1:',
 'compareselectedversions' => 'Bapetša diphapang tšeo di kgethilwego',
 'editundo' => 'dirolla',
@@ -660,7 +659,7 @@ Ga re fane ka e-poso ya gago go bašumiši ba bangwe ge ba polela le wena ka yon
 'nchanges' => '$1 {{PLURAL:$1|phetogo|diphetogo}}',
 'recentchanges' => 'Diphetogo tša bjale',
 'recentchanges-legend' => 'Dikgetho tša diphetogo tša bjale',
-'recentchangestext' => 'Lebalana diphetogo tše di mphsa-mphsa go wiki  letlakaleng le.',
+'recentchanges-summary' => 'Lebalana diphetogo tše di mphsa-mphsa go wiki  letlakaleng le.',
 'recentchanges-feed-description' => "Lebalana diphetogo tše di mphsa-mphsa go wiki  ka ''feed'' ye.",
 'recentchanges-label-newpage' => 'Phetogo ye e hlomile letlala le lefsa',
 'recentchanges-label-minor' => 'Ye ke phetogo ye nnyenyane',
index b887d73..188f114 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Occitan (Occitan)
+/** Occitan (occitan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -645,6 +645,7 @@ Informatz-ne un [[Special:ListUsers/sysop|administrator]] aprèp aver notada l
 'badarticleerror' => 'Aquesta accion pòt pas èsser efectuada sus aquesta pagina.',
 'cannotdelete' => 'Impossible de suprimir la pagina o lo fichièr « $1 ».
 Benlèu la supression ja es estada efectuada per qualqu’un mai.',
+'cannotdelete-title' => 'Impossible de suprimir la pagina "$1"',
 'badtitle' => 'Títol marrit',
 'badtitletext' => 'Lo títol de la pagina demandada es invalid, void o s’agís d’un títol interlenga o interprojècte mal ligat. Benlèu conten un o maites caractèrs que pòdon pas èsser utilizats dins los títols.',
 'perfcached' => 'Aquò es una version en amagatal e es benlèu pas a jorn. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -654,6 +655,7 @@ Benlèu la supression ja es estada efectuada per qualqu’un mai.',
 Foncion : $1<br />
 Requèsta : $2',
 'viewsource' => 'Vejatz lo tèxte font',
+'viewsource-title' => 'Veire la font de $1',
 'actionthrottled' => 'Accion limitada',
 'actionthrottledtext' => "Per luchar contra lo spam, l’utilizacion d'aquesta accion es limitada a un cèrt nombre de còps dins una sosta pro corta. S'avèra qu'avètz depassat aqueste limit. Ensajatz tornamai dins qualques minutas.",
 'protectedpagetext' => 'Aquesta pagina es estada protegida per empachar sa modificacion.',
@@ -913,6 +915,7 @@ La darrièra entrada del jornal dels blocatges es indicada çaijós a títol d
 'updated' => '(Mes a jorn)',
 'note' => "'''Nòta :'''",
 'previewnote' => "'''Atencion, aqueste tèxte es sonque una previsualizacion e es pas encara estat salvat !'''",
+'continue-editing' => "Contunhar l'edicion",
 'previewconflict' => 'Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.',
 'session_fail_preview' => "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.
 Ensajatz tornarmai.
@@ -925,6 +928,7 @@ S'aquò fracassa encara, [[Special:UserLogout|desconnectatz-vos]], puèi connect
 S'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
 'token_suffix_mismatch' => "'''Vòstra modificacion es pas estada acceptada perque vòstre navigador a mesclat los caractèrs de ponctuacion dins l’identificant d’edicion. La modificacion es estada regetada per empachar la corrupcion del tèxte de l’article. Aqueste problèma se produtz quand utilizatz un mandatari (proxy) anonim problematic.'''",
 'editing' => 'Modificacion de $1',
+'creating' => 'Creacion de $1',
 'editingsection' => 'Modificacion de $1 (seccion)',
 'editingcomment' => 'Modificacion de $1 (seccion novèla)',
 'editconflict' => 'Conflicte de modificacion : $1',
@@ -981,6 +985,7 @@ Sembla que siá estada suprimida.',
 'edit-no-change' => 'Vòstra modificacion es estada ignorada perque cap de cambiament es pas estat fach dins lo tèxte.',
 'edit-already-exists' => 'La pagina novèla a pogut èsser creada .
 Existís ja.',
+'defaultmessagetext' => 'Messatge per defaut',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Atencion : Aquesta pagina conten tròp d’apèls dispendioses de foncions del parser.
@@ -1169,7 +1174,6 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 
 # Diffs
 'history-title' => 'Istoric de las versions de « $1 »',
-'difference' => '(Diferéncias entre las versions)',
 'difference-multipage' => '(Diferéncias entre las paginas)',
 'lineno' => 'Linha $1 :',
 'compareselectedversions' => 'Comparar las versions seleccionadas',
@@ -1517,12 +1521,13 @@ Tanben podètz causir de permetre a d’autres de vos contactar per vòstra pagi
 'action-userrights' => 'modificar totes los dreches d’utilizaire',
 'action-userrights-interwiki' => 'modificar los dreches d’utilizaire e los sus d’autres wikis',
 'action-siteadmin' => 'varrolhar o desvarrolhar la banca de donadas',
+'action-sendemail' => 'mandar corrièrs electronics',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cambiament|cambiaments}}',
 'recentchanges' => 'Darrièrs cambiaments',
 'recentchanges-legend' => 'Opcions dels darrièrs cambiaments',
-'recentchangestext' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
+'recentchanges-summary' => 'Vaquí sus aquesta pagina, los darrièrs cambiaments de {{SITENAME}}.',
 'recentchanges-feed-description' => "Seguissètz los darrièrs cambiaments d'aqueste wiki dins un flux.",
 'recentchanges-label-newpage' => 'Aquesta modificacion a creat una pagina novèla',
 'recentchanges-label-minor' => 'Aqueste cambiament es menor',
@@ -1780,6 +1785,7 @@ La tièra seguenta aficha {{PLURAL:$1|lo primièr ligam de pagina|los $1 primiè
 Una [[Special:WhatLinksHere/$2|tièra completa]] es disponibla.',
 'nolinkstoimage' => 'Cap de pagina compòrta pas de ligam cap a aqueste imatge.',
 'morelinkstoimage' => 'Vejatz [[Special:WhatLinksHere/$1|mai de ligams]] cap a aqueste imatge.',
+'linkstoimage-redirect' => '$1 (redireccion de fichièr) $2',
 'duplicatesoffile' => "{{PLURAL:$1|Lo fichièr seguent es un duplicata|Los fichièrs seguents son de duplicatas}} d'aqueste fichièr ([[Special:FileDuplicateSearch/$2|mai de detalhs]]):",
 'sharedupload' => 'Aqueste fichièr proven de $1 e pòt èsser utilizat per d’autres projèctes.',
 'sharedupload-desc-there' => "Aqueste fichièr proven de $1 e pòt èsser utilizat per d'autres projèctes. Vejatz [$2 sa pagina de descripcion] per mai d'entresenhas.",
@@ -1876,6 +1882,7 @@ Una pagina es tractada coma una pagina d’omonimia s'utiliza un modèl qu'es li
 Cada entrada conten de ligams cap a la primièra e la segonda redireccions, e mai la primièra linha de tèxte de la segonda pagina, çò que provesís, de costuma, la « vertadièra » pagina cibla, cap a la quala la primièra redireccion deuriá redirigir.
 Las entradas <del>barradas</del> son estadas resolgudas.',
 'double-redirect-fixed-move' => '[[$1]] es estat renomenat, aquò es ara una redireccion cap a [[$2]]',
+'double-redirect-fixed-maintenance' => 'Correccion de  la doble redireccion de [[$1]] a [[$2]]',
 'double-redirect-fixer' => 'Corrector de redireccion',
 
 'brokenredirects' => 'Redireccions copadas',
@@ -2094,8 +2101,10 @@ L'adreça electronica qu'avètz indicada dins [[Special:Preferences|vòstras pre
 'watchnologin' => 'Vos sètz pas identificat(ada)',
 'watchnologintext' => 'Vos cal èsser [[Special:UserLogin|connectat(ada)]]
 per modificar vòstra lista de seguiment.',
+'addwatch' => 'Ajustar a la lista de seguiment',
 'addedwatchtext' => 'La pagina "[[:$1]]" es estada aponduda a vòstra [[Special:Watchlist|lista de seguiment]].
 Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associada seràn repertoriadas aicí, e la pagina apareisserà <b>en gras</b> dins la [[Special:RecentChanges|tièra dels darrièrs cambiaments]] per èsser localizada mai aisidament.',
+'removewatch' => 'Suprimir de la lista de seguiment',
 'removedwatchtext' => 'La pagina « [[:$1]] » es estada levada de vòstra [[Special:Watchlist|lista de seguiment]].',
 'watch' => 'Seguir',
 'watchthispage' => 'Seguir aquesta pagina',
@@ -2419,6 +2428,7 @@ Podètz consultar la [[Special:BlockList|lista dels comptes e de las adreças IP
 a partir d'una adreça IP precedentament blocada.",
 'ipusubmit' => 'Suprimir aqueste blocatge',
 'unblocked' => '[[User:$1|$1]] es estat desblocat',
+'unblocked-range' => '$1 es estat desblocat',
 'unblocked-id' => 'Lo blocatge $1 es estat levat',
 'blocklist' => 'Utilizaires o adreças IP blocats',
 'ipblocklist' => 'Utilizaires o adreças IP blocats',
@@ -2787,6 +2797,13 @@ Aquò es probablament causat per un ligam sus lista negra que punta cap a un sit
 'spam_reverting' => 'Restabliment de la darrièra version que conten pas de ligam cap a $1',
 'spam_blanking' => 'Totas las versions que contenon de ligams cap a $1 son blanquidas',
 
+# Info page
+'pageinfo-subjectpage' => 'Pagina',
+'pageinfo-edits' => "Nombre d'edicions",
+'pageinfo-authors' => "Nombre d'autors distints",
+'pageinfo-views' => 'Nombre de vistas',
+'pageinfo-viewsperedit' => 'Visitas per modificacions',
+
 # Skin names
 'skinname-standard' => 'Estandard',
 'skinname-nostalgia' => 'Nostalgia',
@@ -3154,6 +3171,7 @@ Los autres ligams sus la meteissa linha son considerats coma d'excepcions, per e
 'exif-gpsdirection-m' => 'Nòrd magnetic',
 
 'exif-iimcategory-edu' => 'Educacion',
+'exif-iimcategory-evn' => 'Environament',
 'exif-iimcategory-hth' => 'Santat',
 'exif-iimcategory-lab' => 'Tribailh',
 'exif-iimcategory-pol' => 'Politic',
@@ -3264,6 +3282,7 @@ Confirmatz que desiratz tornar crear aqueste article.",
 'table_pager_first' => 'Primièra pagina',
 'table_pager_last' => 'Darrièra pagina',
 'table_pager_limit' => 'Far veire $1 elements per pagina',
+'table_pager_limit_label' => 'Elements per pagina:',
 'table_pager_limit_submit' => 'Accedir',
 'table_pager_empty' => 'Cap de resultat',
 
@@ -3405,6 +3424,7 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 # Special:ComparePages
 'compare-page1' => 'Pagina 1',
 'compare-page2' => 'Pagina 2',
+'compare-submit' => 'Comparar',
 
 # Database error messages
 'dberr-header' => 'Aqueste wiki a un problèma',
index ad8d236..036e10b 100644 (file)
@@ -72,101 +72,104 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'ସଚଳ_ସଭ୍ୟ' ),
-       'Allmessages'               => array( 'ସବୁ_ମେସେଜ' ),
-       'Allpages'                  => array( 'ସବୁ_ପୃଷ୍ଠା' ),
-       'Ancientpages'              => array( 'ପୁରୁଣା_' ),
-       'Blankpage'                 => array( 'ଖାଲି_ପୃଷ୍ଠା' ),
-       'Block'                     => array( 'ଅଟକାଇଦେବେ', 'ଆଇପି_ଅଟକାଇଦେବେ', 'ଇଉଜରକୁ_ଅଟକାଇଦେବେ' ),
-       'Blockme'                   => array( 'ମୋତେ_ଅଟକାଇଦିଅନ୍ତୁ' ),
-       'Booksources'               => array( 'ଲେଖା_ନିଆଯାଇଥିବା_ବହି' ),
-       'BrokenRedirects'           => array( 'ଭଙ୍ଗା_ଲେଉଟାଣି' ),
+       'Activeusers'               => array( 'ସଚଳସଭ୍ୟ' ),
+       'Allmessages'               => array( 'ସବୁସନ୍ଦେଶ' ),
+       'Allpages'                  => array( 'ସବୁପୃଷ୍ଠା' ),
+       'Ancientpages'              => array( 'ପୁରୁଣାପୃଷ୍ଠା' ),
+       'Badtitle'                  => array( 'ଖରାପନାମ' ),
+       'Blankpage'                 => array( 'ଖାଲିପୃଷ୍ଠା' ),
+       'Block'                     => array( 'ଅଟକାଇବେ', 'ଆଇପିଅଟକାଇବେ', 'ସଭ୍ୟଅଟକାଇବେ' ),
+       'Blockme'                   => array( 'ମୋତେଅଟକାଇବେ' ),
+       'Booksources'               => array( 'ବହିସ୍ରୋତ' ),
+       'BrokenRedirects'           => array( 'ଭଙ୍ଗାଲେଉଟାଣି' ),
        'Categories'                => array( 'ଶ୍ରେଣୀ' ),
-       'ChangeEmail'               => array( 'ଇମେଲ_ବଦଳାଇବେ' ),
-       'ChangePassword'            => array( 'ପାସବାରà­\8dଡ଼_ବଦଳାà¬\87ବେ' ),
-       'ComparePages'              => array( 'ପୃଷ୍ଠାକୁ_ତଉଲିବେ' ),
-       'Confirmemail'              => array( 'ଇମେଲ_ଥୟ_କରିବେ' ),
+       'ChangeEmail'               => array( 'ଇମେଲବଦଳାଇବେ' ),
+       'ChangePassword'            => array( 'ପାସୱାରà­\8dଡ଼ବଦଳାà¬\87ବà­\87', 'ପାସୱାରà­\8dଡ଼ସà­\87à¬\9fà¬\95ରିବେ' ),
+       'ComparePages'              => array( 'ପୃଷ୍ଠାକୁତଉଲିବେ' ),
+       'Confirmemail'              => array( 'ଇମେଲଥୟକରିବେ' ),
        'Contributions'             => array( 'ଅବଦାନ' ),
-       'CreateAccount'             => array( 'ଖାତା_ଖୋଲିବେ' ),
-       'Deadendpages'              => array( 'ଆଗକୁ_ରାହା_ନଥିବା_ପୃଷ୍ଠା' ),
-       'DeletedContributions'      => array( 'ହଟାଇ_ଦିଆଯାଇଥିବା_ଅବଦାନ' ),
-       'Disambiguations'           => array( 'ଆବୁରୁଜାବୁରୁ_କଥା' ),
-       'DoubleRedirects'           => array( 'ଦୁଇଥର_ଲେଉଟାଣି' ),
-       'Emailuser'                 => array( 'ସଭ୍ୟଙ୍କୁ_ମେଲ_କରନ୍ତୁ' ),
-       'Export'                    => array( 'ରପ୍ତାନି_କରିବା' ),
-       'Fewestrevisions'           => array( 'ସବୁଠୁ_କମ_ସଙ୍କଳନ' ),
-       'FileDuplicateSearch'       => array( 'ନକଲି_ଫାଇଲ_ଖୋଜା' ),
+       'CreateAccount'             => array( 'ଖାତାଖୋଲିବେ' ),
+       'Deadendpages'              => array( 'ଆଗକୁରାହାନଥିବାପୃଷ୍ଠା' ),
+       'DeletedContributions'      => array( 'ହଟାଇଦିଆଯାଇଥିବାଅବଦାନ' ),
+       'Disambiguations'           => array( 'ବହୁବିକଳ୍ପୀ' ),
+       'DoubleRedirects'           => array( 'ଦୁଇଥରଲେଉଟାଣି' ),
+       'EditWatchlist'             => array( 'ଧ୍ୟାନସୂଚୀବଦଳାଇବେ' ),
+       'Emailuser'                 => array( 'ସଭ୍ୟଙ୍କୁମେଲକରିବେ' ),
+       'Export'                    => array( 'ରପ୍ତାନି' ),
+       'Fewestrevisions'           => array( 'ସବୁଠୁକମସଙ୍କଳନ' ),
+       'FileDuplicateSearch'       => array( 'ଫାଇଲନକଲିଖୋଜା' ),
        'Filepath'                  => array( 'ଫାଇଲରାସ୍ତା' ),
        'Import'                    => array( 'ଆମଦାନି' ),
-       'Invalidateemail'           => array( 'କାମକରୁନଥିବା_ଇମେଲ' ),
-       'BlockList'                 => array( 'ତାଲିକାକୁ__ଅଟକାଇଦେବା' ),
-       'LinkSearch'                => array( 'ଲିଙ୍କ_ଖୋଜା' ),
-       'Listadmins'                => array( 'ପରିଛା_ତାଲିକା' ),
-       'Listbots'                  => array( 'ବଟ_ମାନଙ୍କ_ତାଲିକା' ),
-       'Listfiles'                 => array( 'ଫାଇଲ_ତାଲିକା' ),
-       'Listgrouprights'           => array( 'ଗୋଠ_ନିୟମ_ତାଲିକା' ),
-       'Listredirects'             => array( 'ଲେଉଟାଣି_ତାଲିକା' ),
-       'Listusers'                 => array( 'ଇଉଜର_ତାଲିକା' ),
-       'Lockdb'                    => array( 'ଡାଟାବେସ‌_କିଳିଦେବା' ),
+       'Invalidateemail'           => array( 'କାମକରୁନଥିବାଇମେଲ' ),
+       'JavaScriptTest'            => array( 'ଜାଭାସ୍କ୍ରିପ୍ଟଟେଷ୍ଟ' ),
+       'BlockList'                 => array( 'ତାଲିକାଅଟକାଇବେ' ),
+       'LinkSearch'                => array( 'ଲିଙ୍କଖୋଜା' ),
+       'Listadmins'                => array( 'ପରିଛାତାଲିକା' ),
+       'Listbots'                  => array( 'ବଟତାଲିକା' ),
+       'Listfiles'                 => array( 'ଫାଇଲତାଲିକା' ),
+       'Listgrouprights'           => array( 'ଗୋଠନିୟମତାଲିକା' ),
+       'Listredirects'             => array( 'ଲେଉଟାଣିତାଲିକା' ),
+       'Listusers'                 => array( 'ସଭ୍ୟତାଲିକା' ),
+       'Lockdb'                    => array( 'ଡାଟାବେସ‌କିଳିଦେବା' ),
        'Log'                       => array( 'ଲଗ' ),
-       'Lonelypages'               => array( 'ଏକୁଟିଆ_ପୃଷ୍ଠା' ),
-       'Longpages'                 => array( 'ଲମ୍ବା_ପୃଷ୍ଠା' ),
-       'MergeHistory'              => array( 'ଇତିହାସକୁ_ମିଶାଇଦେବା' ),
+       'Lonelypages'               => array( 'ଏକୁଟିଆପୃଷ୍ଠା' ),
+       'Longpages'                 => array( 'ଲମ୍ବାପୃଷ୍ଠା' ),
+       'MergeHistory'              => array( 'ଇତିହାସକୁମିଶାଇବେ' ),
        'MIMEsearch'                => array( 'MIME_ଖୋଜା' ),
-       'Mostcategories'            => array( 'ଅଧିକ_ଶ୍ରେଣୀ' ),
-       'Mostimages'                => array( 'ଅଧିକ_ଯୋଡ଼ା_ଫାଇଲ' ),
-       'Mostlinked'                => array( 'ଅଧିକ_ଯୋଡ଼ା_ପୃଷ୍ଠା' ),
-       'Mostlinkedcategories'      => array( 'ଅଧିକ_ଯୋଡ଼ା_ଶ୍ରେଣୀ' ),
-       'Mostlinkedtemplates'       => array( 'ଅଧିକ_ଯୋଡ଼ା_ଛାଞ୍ଚ' ),
-       'Mostrevisions'             => array( 'ଅଧିକ_ସଙ୍କଳନ' ),
-       'Movepage'                  => array( 'ପà­\83ଷà­\8dଠାà¬\95à­\81_à¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ବା' ),
-       'Mycontributions'           => array( 'ମୋ_ଅବଦାନ' ),
-       'Mypage'                    => array( 'ମୋ_ପୃଷ୍ଠା' ),
-       'Mytalk'                    => array( 'ମୋ_ଆଲୋଚନା' ),
-       'Myuploads'                 => array( 'ମୋ_ଅପଲୋଡ଼' ),
-       'Newimages'                 => array( 'ନୂଆ_ଫାଇଲ' ),
-       'Newpages'                  => array( 'ନୂଆ_ପୃଷ୍ଠା' ),
-       'PermanentLink'             => array( 'à¬\9aିରà¬\95ାଳର_ଲିà¬\99à­\8dà¬\95' ),
-       'Popularpages'              => array( 'ଜଣାଶୁଣା_ପୃଷ୍ଠା' ),
-       'Preferences'               => array( 'ପସନ୍ଦସବୁ' ),
-       'Prefixindex'               => array( 'ଆଗରେ_ଯୋଡ଼ାହେବା_ଇଣ୍ଡେକ୍ସ' ),
-       'Protectedpages'            => array( 'କିଳାଯାଇଥିବା_ପୃଷ୍ଠା' ),
-       'Protectedtitles'           => array( 'କିଳାଯାଇଥିବା_ନାଆଁ' ),
-       'Randompage'                => array( 'à¬\87à¬\86ଡà­\81_à¬\87à¬\86ଡà­\81' ),
-       'Randomredirect'            => array( 'ଜାହିତାହି_ଫେରଣାଲେଉଟାଣି' ),
-       'Recentchanges'             => array( 'ନଗଦ_ବଦଳ' ),
-       'Recentchangeslinked'       => array( 'ଜୋଡ଼ାଥିବା_ନଗଦ_ବଦଳ' ),
+       'Mostcategories'            => array( 'ଅଧିକଶ୍ରେଣୀଥିବା' ),
+       'Mostimages'                => array( 'ଅଧିକଯୋଡ଼ାଫାଇଲ' ),
+       'Mostlinked'                => array( 'ଅଧିକଯୋଡ଼ାପୃଷ୍ଠା' ),
+       'Mostlinkedcategories'      => array( 'ଅଧିକଯୋଡ଼ାଶ୍ରେଣୀ' ),
+       'Mostlinkedtemplates'       => array( 'ଅଧିକଯୋଡ଼ାଛାଞ୍ଚ' ),
+       'Mostrevisions'             => array( 'ଅଧିକସଙ୍କଳନ' ),
+       'Movepage'                  => array( 'ପà­\83ଷà­\8dଠାà¬\98à­\81à¬\9eà­\8dà¬\9aାà¬\87ବà­\87' ),
+       'Mycontributions'           => array( 'ମୋଅବଦାନ' ),
+       'Mypage'                    => array( 'ମୋପୃଷ୍ଠା' ),
+       'Mytalk'                    => array( 'ମୋଆଲୋଚନା' ),
+       'Myuploads'                 => array( 'ମୋଅପଲୋଡ଼' ),
+       'Newimages'                 => array( 'ନୂଆଫାଇଲ' ),
+       'Newpages'                  => array( 'ନୂଆପୃଷ୍ଠା' ),
+       'PermanentLink'             => array( 'ଚିରକାଳଲିଙ୍କ' ),
+       'Popularpages'              => array( 'ଜଣାଶୁଣାପୃଷ୍ଠା' ),
+       'Preferences'               => array( 'ପସନ୍ଦ' ),
+       'Prefixindex'               => array( 'ଆଗରେଯୋଡ଼ାହେବାଇଣ୍ଡେକ୍ସ' ),
+       'Protectedpages'            => array( 'କିଳାଯାଇଥିବାପୃଷ୍ଠା' ),
+       'Protectedtitles'           => array( 'କିଳାଯାଇଥିବାନାମ' ),
+       'Randompage'                => array( 'à¬\9cାହିତାହି', 'à¬\9cାହିତାହିପà­\83ଷà­\8dଠା' ),
+       'Randomredirect'            => array( 'ଜାହିତାହିଲେଉଟାଣି' ),
+       'Recentchanges'             => array( 'ନଗଦବଦଳ' ),
+       'Recentchangeslinked'       => array( 'ଜୋଡ଼ାଥିବାନଗଦବଦଳ', 'ପାଖାପାଖିବଦଳ' ),
        'Revisiondelete'            => array( 'ସଙ୍କଳନଲିଭାଇଦିଅଦେବେ' ),
        'RevisionMove'              => array( 'ସଙ୍କଳନ' ),
        'Search'                    => array( 'ଖୋଜନ୍ତୁ' ),
-       'Shortpages'                => array( 'ଛୋଟ_ପୃଷ୍ଠା' ),
-       'Specialpages'              => array( 'ବିଶେଷ_ପୃଷ୍ଠା' ),
+       'Shortpages'                => array( 'ଛୋଟପୃଷ୍ଠା' ),
+       'Specialpages'              => array( 'ବିଶେଷପୃଷ୍ଠା' ),
        'Statistics'                => array( 'ଗଣନା' ),
        'Tags'                      => array( 'ଚିହ୍ନସମୂହ' ),
        'Unblock'                   => array( 'ଫିଟାଇଦେବେ' ),
-       'Uncategorizedcategories'   => array( 'ଅସଜଡ଼ା_ଶ୍ରେଣୀ' ),
-       'Uncategorizedimages'       => array( 'ସà¬\9cଡ଼ା_ଶà­\8dରà­\87ଣà­\80ର_ଫାଇଲ' ),
+       'Uncategorizedcategories'   => array( 'ଅସଜଡ଼ାଶ୍ରେଣୀ' ),
+       'Uncategorizedimages'       => array( 'à¬\85ସà¬\9cଡ଼ାଶà­\8dରà­\87ଣà­\80ରଫାଇଲ' ),
        'Uncategorizedpages'        => array( 'ଅସଜଡ଼ା_ଫାଇଲସବୁ' ),
-       'Uncategorizedtemplates'    => array( 'ଅସଜଡ଼ା_ଛାଞ୍ଚ' ),
-       'Undelete'                  => array( 'ଲିଭାନà­\8dତà­\81_ନାହିà¬\81' ),
+       'Uncategorizedtemplates'    => array( 'ଅସଜଡ଼ାଛାଞ୍ଚ' ),
+       'Undelete'                  => array( 'à¬\85ଣଲିଭା' ),
        'Unlockdb'                  => array( 'DBଖୋଲିବା' ),
-       'Unusedcategories'          => array( 'ବ୍ୟବହାର_ହୋଇନଥିବା_ଶ୍ରେଣୀ' ),
-       'Unusedimages'              => array( 'ବ୍ୟବହାର_ହୋଇନଥିବା_ଫାଇଲ' ),
-       'Unusedtemplates'           => array( 'ବ୍ୟବହାର_ହୋଇନଥିବା_ଛାଞ୍ଚ' ),
-       'Unwatchedpages'            => array( 'ଦେଖାଯାଇନଥିବା_ପୃଷ୍ଠାସବୁ' ),
+       'Unusedcategories'          => array( 'ବ୍ୟବହାରହୋଇନଥିବାଶ୍ରେଣୀ' ),
+       'Unusedimages'              => array( 'ବ୍ୟବହାରହୋଇନଥିବାଫାଇଲ' ),
+       'Unusedtemplates'           => array( 'ବ୍ୟବହାରହୋଇନଥିବାଛାଞ୍ଚ' ),
+       'Unwatchedpages'            => array( 'ଦେଖାଯାଇନଥିବାପୃଷ୍ଠାସବୁ' ),
        'Upload'                    => array( 'ଅପଲୋଡ଼' ),
-       'UploadStash'               => array( 'ଷ୍ଟାସ_ଅପଲୋଡ଼_କରନ୍ତୁ' ),
-       'Userlogin'                 => array( 'ସଭ୍ୟ_ଲଗ_ଇନ' ),
-       'Userlogout'                => array( 'ସଭ୍ୟ_ଲଗ_ଆଉଟ' ),
-       'Userrights'                => array( 'ସଭ୍ୟ_ଅଧିକାର' ),
+       'UploadStash'               => array( 'ଷ୍ଟାସଅପଲୋଡ଼' ),
+       'Userlogin'                 => array( 'ସଭ୍ୟଲଗଇନ' ),
+       'Userlogout'                => array( 'ସଭ୍ୟଲଗଆଉଟ' ),
+       'Userrights'                => array( 'ସଭ୍ୟଅଧିକାର' ),
        'Version'                   => array( 'ସଂସ୍କରଣ' ),
-       'Wantedcategories'          => array( 'ଦରକାରି_ଶ୍ରେଣୀ' ),
-       'Wantedfiles'               => array( 'ଦରକାରି_ଫାଇଲ' ),
-       'Wantedpages'               => array( 'ଦରକାରି_ପୃଷ୍ଠା' ),
-       'Wantedtemplates'           => array( 'ଦରକାରି_ଛାଞ୍ଚ' ),
-       'Watchlist'                 => array( 'ଦେଖଣା_ତାଲିକା' ),
-       'Whatlinkshere'             => array( 'ଏଠାରେ_କଣ_ଲିଙ୍କ_ଅଛି' ),
-       'Withoutinterwiki'          => array( 'ଇଣ୍ଟରଉଇକି_ବିନା' ),
+       'Wantedcategories'          => array( 'ଦରକାରିଶ୍ରେଣୀ' ),
+       'Wantedfiles'               => array( 'ଦରକାରିଫାଇଲ' ),
+       'Wantedpages'               => array( 'ଦରକାରିପୃଷ୍ଠା' ),
+       'Wantedtemplates'           => array( 'ଦରକାରିଛାଞ୍ଚ' ),
+       'Watchlist'                 => array( 'ଦେଖଣାତାଲିକା' ),
+       'Whatlinkshere'             => array( 'ଏଠାରେକଣଲିଙ୍କଅଛି' ),
+       'Withoutinterwiki'          => array( 'ଇଣ୍ଟରଉଇକିବିନା' ),
 );
 
 $magicWords = array(
@@ -328,8 +331,8 @@ $messages = array(
 'january' => 'ଜାନୁଆରୀ',
 'february' => 'ଫେବୃଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
-'april' => 'à¬\8fପà­\8dରିଲ',
-'may_long' => 'ମà­\87',
+'april' => 'à¬\85ପà­\8dରà­\87ଲ',
+'may_long' => 'ମà¬\87',
 'june' => 'ଜୁନ',
 'july' => 'ଜୁଲାଇ',
 'august' => 'ଅଗଷ୍ଟ',
@@ -340,8 +343,8 @@ $messages = array(
 'january-gen' => 'ଜାନୁଆରୀ',
 'february-gen' => 'ଫେବୃଆରୀ',
 'march-gen' => 'ମାର୍ଚ୍ଚ',
-'april-gen' => 'à¬\8fପà­\8dରିଲ',
-'may-gen' => 'ମà­\87',
+'april-gen' => 'à¬\85ପà­\8dରà­\87ଲ',
+'may-gen' => 'ମà¬\87',
 'june-gen' => 'ଜୁନ',
 'july-gen' => 'ଜୁଲାଇ',
 'august-gen' => 'ଅଗଷ୍ଟ',
@@ -352,8 +355,8 @@ $messages = array(
 'jan' => 'ଜାନୁଆରୀ',
 'feb' => 'ଫେବୃଆରୀ',
 'mar' => 'ମାର୍ଚ୍ଚ',
-'apr' => 'à¬\8fପà­\8dରିଲ',
-'may' => 'ମà­\87',
+'apr' => 'à¬\85ପà­\8dରà­\87ଲ',
+'may' => 'ମà¬\87',
 'jun' => 'ଜୁନ',
 'jul' => 'ଜୁଲାଇ',
 'aug' => 'ଅଗଷ୍ଟ',
@@ -517,10 +520,10 @@ $1',
 'newmessageslink' => 'ନୂଆ ମେସେଜ',
 'newmessagesdifflink' => 'ଶେଷ ବଦଳ',
 'youhavenewmessagesmulti' => '$1 ତାରିଖରେ ନୂଆ ଚିଠିଟିଏ ଆସିଛି',
-'editsection' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
-'editold' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editsection' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
+'editold' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
 'viewsourceold' => 'ମୂଳାଧାର ଦେଖିବେ',
-'editlink' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'editlink' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
 'viewsourcelink' => 'ମୂଳାଧାର ଦେଖିବେ',
 'editsectionhint' => '$1 ଭାଗଟିକୁ ବଦଳାଇବେ',
 'toc' => 'ଭିତର ଚିଜ',
@@ -1220,7 +1223,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" ପାଇଁ ସଙ୍କଳନ ଇତିହାସ',
-'difference' => '(ସଙ୍କଳନ ଭିତରେ ଥିବା ତଫାତ)',
 'difference-multipage' => '(ପୃଷ୍ଠା ଭିତରେ ଥିବା ତଫାତ)‌',
 'lineno' => '$1 କ ଧାଡ଼ି:',
 'compareselectedversions' => 'ବଛାହୋଇଥିବା ସଙ୍କଳନ ଗୁଡ଼ିକୁ ତଉଲିବେ',
@@ -1537,7 +1539,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 
 # User rights log
 'rightslog' => 'ସଭ୍ୟଙ୍କ ଅଧିକାରର ଲଗ',
-'rightslogtext' => 'ସଭ୍ୟଙ୍କ ଅଧିକାର ବଦଳର ଏହା ଏକ ଇତିହାସ ।',
+'rightslogtext' => 'ସଭ୍ୟଙ୍କ ଅଧିକାର ବଦଳର ଏହା ଏକ ଇତିହାସ ।',
 'rightslogentry' => '$1 ପାଇଁ ଗୋଠ ସଭ୍ୟପଦର ଅବସ୍ଥା $2 ରୁ $3କୁ ବଦଳାଇଦିଆଗଲା',
 'rightslogentry-autopromote' => '$2 ରୁ $3କୁ ଆପେଆପେ ଉନ୍ନୀତ କରାଗଲା',
 'rightsnone' => '(କିଛି ନାହିଁ)',
@@ -1583,7 +1585,7 @@ HTML ଟାଗ ପରଖିନିଅନ୍ତୁ ।',
 'nchanges' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
 'recentchanges' => 'ନଗଦ ବଦଳ',
 'recentchanges-legend' => 'ଏବେ କରାଯାଇଥିବା ଅଦଳବଦଳ',
-'recentchangestext' => 'ଏହି ପୃଷ୍ଠାରେ ଏହି ଉଇକିରେ ନଗଦ ବଦଳର ନିଘା ରଖିବେ',
+'recentchanges-summary' => 'ଏହି ପୃଷ୍ଠାରେ ଏହି ଉଇକିରେ ନଗଦ ବଦଳର ନିଘା ରଖିବେ',
 'recentchanges-feed-description' => 'ଏହି ଉଇକିରେ ଏହି ଫିଡ଼ଟିର ନଗଦ ବଦଳ ଦେଖାଇବେ ।',
 'recentchanges-label-newpage' => 'ଏହି ବଦଳ ନୂଆ ଫରଦଟିଏ ତିଆରିକଲା',
 'recentchanges-label-minor' => 'ଏହା ଗୋଟିଏ ଛୋଟ ବଦଳ',
@@ -2004,7 +2006,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' => 'ଭାଷାର ଲିଙ୍କ ନଥିବା ପୃଷ୍ଠାମାନ',
@@ -2115,6 +2117,9 @@ A page is treated as disambiguation page if it uses a template which is linked f
 ଏଥିରେ ଥିବା ଗୋଟିଏ ବା ଦୁଇଟି ଅକ୍ଷର ଶିରୋନାମା ଭାବରେ ବ୍ୟବହାର କରାଯାଇ ପାରିବ ନାହିଁ ।',
 'allpages-bad-ns' => '{{SITENAME}}ରେ "$1" ନେମସ୍ପେସଟିଏ ନାହିଁ ।',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ନୂତନତମ ଦେଖନ୍ତୁ ।',
+
 # Special:Categories
 'categories' => 'ଶ୍ରେଣୀସମୂହ',
 'categoriespagetext' => 'ତଳଲିଖିତ {{PLURAL:$1|ଶ୍ରେଣୀ|ଶ୍ରେଣୀସମୂହ}}ରେ ପୃଷ୍ଠା ବା ମେଡ଼ିଆ ରହିଅଛି ।
@@ -2183,8 +2188,8 @@ A page is treated as disambiguation page if it uses a template which is linked f
 'mailnologintext' => 'ଆପଣ ନିଜ [[Special:Preferences|ପସନ୍ଦସବୁ]]ରେ [[Special:UserLogin|ଲଗ ଇନ]] କରିଥିଲେ ଓ ନିଜର ଏକ ସଚଳ ଇ-ମେଲ ଠିକଣା ଥିଲେ ଯାଇ ବାକି ସବୁ ସଭ୍ୟଙ୍କୁ ଇ-ମେଲ ପଠାଇପାରିବେ ।',
 'emailuser' => 'ଏହି ସଭ୍ୟଙ୍କୁ ଇମେଲ କରିବେ',
 'emailpage' => 'ଇ-ମେଲ ବ୍ୟବହାରକାରୀ',
-'emailpagetext' => 'ତଳà­\87 à¬¥à¬¿à¬¬à¬¾ à¬«à¬°à­\8dମ à¬¬à­\8dà­\9fବହର à¬\95ରି à¬\86ପଣ à¬\8fହି à¬¸à¬­à­\8dà­\9fନà­\8dà¬\95à­\80 ଇ-ମେଲ କରିପାରିବେ ।
-[[Special:Preferences|à¬\85ପନà¬\95 à¬ªà¬¸à¬¨à­\8dଦ]]ରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬ªà­\8dରà­\87ରà¬\95 à¬­à¬¾à¬¬à¬°à­\87 à¬¦à­\87à¬\96ାଯିବ, à¬¤à­\87ଣà­\81 à¬¤à¬¿à¬¥ି ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବ ।',
+'emailpagetext' => 'ତଳà­\87 à¬¥à¬¿à¬¬à¬¾ à¬«à¬°à­\8dମ à¬¬à­\8dà­\9fବହାର à¬\95ରି à¬\86ପଣ à¬\8fହି à¬¸à¬­à­\8dà­\9fà¬\99à­\8dà¬\95à­\81 ଇ-ମେଲ କରିପାରିବେ ।
+[[Special:Preferences|à¬\86ପଣà¬\99à­\8dà¬\95 à¬ªà¬¸à¬¨à­\8dଦ]]ରà­\87 à¬¥à¬¿à¬¬à¬¾ à¬\87-ମà­\87ଲ à¬ à¬¿à¬\95ଣା à¬ªà­\8dରà­\87ରà¬\95 à¬­à¬¾à¬¬à¬°à­\87 à¬¦à­\87à¬\96ାଯିବ, à¬¤à­\87ଣà­\81 à¬\9aିଠି ପାଇଥିବା ସଭ୍ୟ ଆପଣଙ୍କୁ ସିଧା ସଳଖ ଉତ୍ତର ଦେଇପାରିବ ।',
 'usermailererror' => 'ମେଲ ଭିତରେ କିଛି ଅସୁବିଧା ଅଛି ବୋଲି ଜାଣିବାକୁ ମିଳିଲା:',
 'defemailsubject' => '{{SITENAME}} "$1" ସଭ୍ୟଙ୍କ ଠାରୁ ଇ-ମେଲ କରିବେ',
 'usermaildisabled' => 'ବ୍ୟବହାରକାରୀଙ୍କ ଈ-ମେଲ ଅଚଳ କରାଗଲା',
@@ -2404,7 +2409,7 @@ $2ଙ୍କ ଦେଇ ଶେଷଥର ହୋଇଥିବା ସଂସ୍କର
 'pagesize' => '(ବାଇଟ)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'restriction-edit' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
 'restriction-move' => 'ଘୁଞ୍ଚାଇବେ',
 'restriction-create' => 'ଗଢ଼ନ୍ତୁ',
 'restriction-upload' => 'ଅପଲୋଡ଼ କରନ୍ତୁ',
@@ -2877,6 +2882,9 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 'import-logentry-interwiki' => '$1 କୁ ଟ୍ରାନ୍ସଉଇକି କରାଗଲା',
 'import-logentry-interwiki-detail' => '$2 ଭିତରୁ $1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}}',
 
+# JavaScriptTest
+'javascripttest-disabled' => 'ଏହି ଉଇକିରେ ଏହି ବ୍ୟବସ୍ଥାଟିକୁ ସଚଳ କରାଯାଇନାହି ।',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ଆପଣଙ୍କ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠା',
 'tooltip-pt-anonuserpage' => 'ଆପଣ ଯେଉଁ IP ଠିକଣାର ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାଟି ବଦଳାଇବା ପାଇଁ ଚେଷ୍ଟା କରୁଛନ୍ତି',
@@ -3634,7 +3642,7 @@ $5
 'watchlisttools-raw' => 'ଫାଙ୍କା ଦେଖଣା ତାଲିକାଟିର ସମ୍ପାଦନା କରିବେ',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ଆଲୋଚନା]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ମà­\8b à¬\86ଲà­\8bà¬\9aନା]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'ଅଜଣା ଏକ୍ସଟେନସନ ଚିହ୍ନ "$1"',
@@ -3668,6 +3676,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'version-software' => 'ଇନଷ୍ଟଲ ହୋଇଥିବା ସଫ୍ଟୱାର',
 'version-software-product' => 'ଉତ୍ପାଦ',
 'version-software-version' => 'ସଂସ୍କରଣ',
+'version-entrypoints-header-url' => 'ଇଉଆରଏଲ',
 
 # Special:FilePath
 'filepath' => 'ଫାଇଲ ପଥ',
@@ -3729,7 +3738,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'tags-display-header' => 'ବଦଳ ତାଲିକାରେ ଦେଖଣା',
 'tags-description-header' => 'ଅର୍ଥର ପୁରା ବିବରଣୀ',
 'tags-hitcount-header' => 'ଚିହ୍ନିତ ବଦଳ',
-'tags-edit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
+'tags-edit' => '<big>ଏହାକୁ ବଦଳାନ୍ତୁ</big>',
 'tags-hitcount' => '$1 {{PLURAL:$1|ବଦଳ|ବଦଳସବୁ}}',
 
 # Special:ComparePages
@@ -3827,6 +3836,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 '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' => 'ଫାଇଲ ନାମଟି ଖୁବ ଛୋଟ ।',
index 9492418..1105add 100644 (file)
@@ -49,6 +49,11 @@ $namespaceAliases = array(
        'Категорийы_тыххæй_дискусси'  => NS_CATEGORY_TALK,
 );
 
+$specialPageAliases = array(
+       'Recentchanges'             => array( 'Фæстаг_ивдтытæ' ),
+);
+
+
 $magicWords = array(
        'redirect'                => array( '0', '#РАРВЫСТ', '#перенаправление', '#перенапр', '#REDIRECT' ),
        'img_right'               => array( '1', 'рахиз', 'справа', 'right' ),
@@ -188,7 +193,7 @@ $messages = array(
 'broken-file-category' => 'Файлтæм саст æрвитæнтæ кæм ис, ахæм фæрстæ',
 
 'about' => 'Афыст',
-'article' => 'СÑ\82аÑ\82Ñ\8cÑ\8f',
+'article' => 'УаÑ\86',
 'newwindow' => '(кæны ног рудзынджы)',
 'cancel' => 'Ныууадзын',
 'moredotdotdot' => 'Фылдæр…',
@@ -232,8 +237,8 @@ $messages = array(
 'help' => 'Æххуыс',
 'search' => 'Агуырд',
 'searchbutton' => 'Агурын',
-'go' => 'СÑ\82аÑ\82Ñ\8cÑ\8fмæ',
-'searcharticle' => 'Ð\90гÑ\83Ñ\80Ñ\8bн',
+'go' => 'УаÑ\86мæ',
+'searcharticle' => 'УаÑ\86мæ',
 'history' => 'Фарсы истори',
 'history_short' => 'Истори',
 'updatedmarker' => 'ноггонд мæ фæстаг æрбахызтæй',
@@ -260,7 +265,7 @@ $messages = array(
 'specialpage' => 'Сæрмагонд фарс',
 'personaltools' => 'Мигæнæнтæ',
 'postcomment' => 'Ног хай',
-'articlepage' => 'Фен статья',
+'articlepage' => 'Фенын уац',
 'talk' => 'Тæрхон',
 'views' => 'Æркæстытæ',
 'toolbox' => 'Фæрæзтæ',
@@ -273,7 +278,7 @@ $messages = array(
 'categorypage' => 'Категорийы фарс фен',
 'viewtalkpage' => 'Тæрхон фен',
 'otherlanguages' => 'Æндæр æвзæгтыл',
-'redirectedfrom' => '(Ð\90Ñ\86Ñ\8b Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fйæ æрвыст: «$1»)',
+'redirectedfrom' => '(Ð\90Ñ\86Ñ\8b Ñ\83аÑ\86æй æрвыст: «$1»)',
 'redirectpagesub' => 'Рарвысты фарс',
 'lastmodifiedat' => 'Ацы фарс фæстаг хатт ивд æрцыд: $1, $2.',
 'viewcount' => 'Ацы фарс домд æрцыд {{PLURAL:$1|иу хатт|$1 хатты}}.',
@@ -351,7 +356,7 @@ $1',
 'sort-ascending' => 'Радæвæрын фылдæркæнынмæ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'СÑ\82аÑ\82Ñ\8cÑ\8f',
+'nstab-main' => 'УаÑ\86',
 'nstab-user' => 'Архайæджы фарс',
 'nstab-media' => 'Мультимеди',
 'nstab-special' => 'Сæрмагонд фарс',
@@ -450,7 +455,7 @@ $2',
 Æхгæныны бындур уыд "\'\'$2\'\'".',
 'filereadonlyerror' => 'Нæ уайы фæивын файл "$1" уый тыххæй æмæ репозиторий "$2" кусы æрмæст фæрсыны уавæры.
 
-РаздæÑ\85Ñ\82 Ð±Ñ\8bндÑ\83Ñ\80 Ñ\83 "\'\'$3\'\'".',
+РадгæÑ\81, ÐºÃ¦Ñ\86Ñ\8b Ñ\81æвæÑ\80дÑ\82а Ð°Ñ\86Ñ\8b Ñ\83авæÑ\80, Ð½Ñ\8bÑ\83Ñ\83агÑ\8aÑ\82а Ð°Ñ\85æм Ð°Ð¼Ð¾Ð½Ã¦Ð½: "\'\'$3\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Æвзæр æвæрд: Нæзонгæ вирусты скане: ''$1''",
@@ -465,7 +470,7 @@ $2',
 'welcomecreation' => '== Ӕгас цу, $1! ==
 Дæ аккаунт арæзт æрцыдис.
 Ма дæ ферох уæт æркæсын дæ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} фадæттæм]].',
-'yourname' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'yourname' => 'ФæÑ\81номÑ\8bг:',
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
 'remembermypassword' => 'Бахъуыды мæ кæнæд ашы браузеры (максимум $1 {{PLURAL:$1|бонмæ|бонмæ}})',
@@ -489,7 +494,7 @@ $2',
 'createaccountmail' => 'адрисмæ гæсгæ',
 'createaccountreason' => 'Бындур:',
 'badretype' => 'Дыууæ хатты иу пароль хъуамæ ныффыстаис',
-'userexists' => 'Уыцы ном нæвдæлон у.
+'userexists' => 'Уыцы фæсномыг нæвдæлон у.
 Дæ хорзæхæй, равзар æндæр.',
 'loginerror' => 'Бахизыны рæдыд',
 'createaccounterror' => 'Нæ рауадис аккаунт саразын: $1',
@@ -502,23 +507,23 @@ $2',
 Дæ хорзæхæй, баиу цæ кæн æмæ нæуæгæй бафæлвар.',
 'nocookiesfornew' => 'Архайæджы аккаунт нæ сарæзт ис, уымæн æмæ йын мах нæ базыдтам йæ равзæрæн.
 Бацархай, цæмæй cookies иу уой, анæуæг кæн ацы фарс æмæ ногæй бафæлвар.',
-'noname' => 'Ð\94Ñ\8b Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай Ñ\80аÑ\81Ñ\82 Ð°Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼.',
+'noname' => 'РаÑ\81Ñ\82 Ñ\84æÑ\81номÑ\8bг Ð½Ã¦ Ð½Ñ\8bÑ\84Ñ\84Ñ\8bÑ\81Ñ\82ай.',
 'loginsuccesstitle' => 'Бахизын рауадис',
 'loginsuccess' => "'''Ныр ды дæ хыст {{grammar:genitive|{{SITENAME}}}} куыд \"\$1\".'''",
 'nosuchuser' => 'Нæй ахæм архайæг "$1" номимæ.
 Архайджыты нæмттæ хатынц дамгъæты регистр.
 Сбæрæг æй кæн, раст ныффыстай ном, æви [[Special:UserLogin/signup|бакæн ног аккаунт]].',
-'nosuchusershort' => 'Нæй архайæг "$1" номимæ.
-Фен, ном раст ныффыстай, æви нæ.',
-'nouserspecified' => 'Ды хъуамæ зæгъай дæ ном.',
+'nosuchusershort' => 'Нæй архайæг "$1" фæсномыгимæ.
+Фен, фæсномыг раст ныффыстай, æви нæ.',
+'nouserspecified' => 'Ды хъуамæ зæгъай дæ фæсномыг.',
 'login-userblocked' => 'Ацы архайæг хъодыгонд у. Нæй гæнæн бахизын.',
 'wrongpassword' => 'Цы пароль ныффыстай, уый раст нæу.
 Лæмбынæгæй ныффысс дæ пароль',
 'wrongpasswordempty' => 'Пароль афтид у.
 Бафæлвар ногæй.',
 'passwordtooshort' => 'Паролтæ хъуамæ уой уæддæр {{PLURAL:$1|1 дамгъæйы|$1 дамгъæйы}} дæргъæн.',
-'password-name-match' => 'Дæ парол ма хъуамæ уа дæ номы хуызæн.',
-'password-login-forbidden' => 'Ацы архайæджы ном æмæ паролæй нæй гæнæн архайын.',
+'password-name-match' => 'Дæ парол ма хъуамæ уа дæ фæсномыгы хуызæн.',
+'password-login-forbidden' => 'Ацы фæсномыг æмæ паролæй нæй гæнæн архайын.',
 'mailmypassword' => 'Рарвит мæм ног пароль',
 'passwordremindertitle' => 'Ног рæстæгмæ пароль {{grammar:dative|{{SITENAME}}}}',
 'passwordremindertext' => 'Чидæр (æвæццæгæн ды, $1 IP адрисæй) æрдомтта ног парол {{grammar:dative|{{SITENAME}}}} ($4). "$2" архайæгæн арæзт æрцыд рæстæгмæ парол. Парол у "$3". Кæд уый ды уыдтæ, уæд дын ныр хъæудзæн бахизын æмæ равзарын ног парол.
@@ -531,8 +536,23 @@ $2',
 'blocked-mailpassword' => 'Дæ IP адрис уыд хъодыгонд ивынæй æмæ цæмæй мачи разнаггад кæна, уы тыххæй дзы нæй гæнæн парол раивын дæр.',
 'eauthentsent' => 'Бæлвырдгæнæн фыстæг æрвыст æрцыд амынд e-mail адрисмæ.
 Цæмæй дæм æндæр фыстæджытæ дæр цæуой, уый тыххæй дын хъæудзæн сæххæст кæнын фыстæджы фыст амындтытæ. Уый фæстæ сбæлвыд уыдзæн аккаунт æцæгдæр дæу кæй у, уый.',
+'throttled-mailpassword' => 'Паролрымысæн нырид æрвыст æрцыд фæстаг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.
+Цæмæй мачи разнагкад кæна, уый тыххæй æрмæст иу хатт ис гæнæн райсын рымысæнфыстæг {{PLURAL:$1|сахаты|$1 сахаты}} мидæг.',
 'mailerror' => 'Фыстæг арвитыны рæдыд: $1',
+'acct_creation_throttle_hit' => 'Ацы викимæ дæ IP адрисæй чи æрбацыдис, уыдон фæстаг боны мидæг бакодтой {{PLURAL:$1|1 аккаунт|$1 аккаунты}}. Уымæй фылдæр нæй гæнæн ахæм рæстæгмæ.
+Уый тыххæй, ацы тæккæ, ацы IP адрисæй уазджытæн сæ бон нæу бакæнын аккаунттæ.',
+'emailauthenticated' => 'Дæ e-mail уыд бæлвырдгонд $2 $3 сахатыл.',
+'emailnotauthenticated' => 'Дæ e-mail адрис нырмæ нæу бæлвырдгонд.
+Иу e-mail дæр дæм нæ уыдзæн æрвыст ацы функцитæй.',
+'noemailprefs' => 'Бафысс e-mail адрис дæ фадæтты, цæмæй ацы функцитæ кусой.',
 'emailconfirmlink' => 'Дæ электронон посты адрис сфидар кæн',
+'invalidemailaddress' => 'E-mail нæй гæнæн райсын, уымæн æмæ йæ формат раст нæу.
+Бафысс раст форматы адрис кæнæ та йæ сафтид кæн.',
+'cannotchangeemail' => 'Аккаунты e-mail нæй гæнæн ивын ацы викийы.',
+'emaildisabled' => 'Ацы сайтæн йæ бон нæу æрвитын e-mail.',
+'accountcreated' => 'Аккаунт конд æрцыд',
+'accountcreatedtext' => '$1 архайæджы аккаунт конд æрцыд.',
+'createaccount-title' => '{{grammar:genitive|{{SITENAME}}}} аккант бакæнын',
 'loginlanguagelabel' => 'Æвзаг: $1',
 
 # Change password dialog
@@ -545,9 +565,9 @@ $2',
 'resetpass-temp-password' => 'Рæстæгмæ пароль:',
 
 # Special:PasswordReset
-'passwordreset-username' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼:',
+'passwordreset-username' => 'ФæÑ\81номÑ\8bг:',
 'passwordreset-email' => 'Электрон посты адрис:',
-'passwordreset-emailelement' => 'Ð\90Ñ\80Ñ\85айæджÑ\8b Ð½Ð¾Ð¼: $1
+'passwordreset-emailelement' => 'ФæÑ\81номÑ\8bг: $1
 Рæстæгмæ пароль: $2',
 
 # Special:ChangeEmail
@@ -559,7 +579,7 @@ $2',
 'italic_sample' => 'Курсив',
 'italic_tip' => 'Курсив',
 'link_sample' => 'Æрвитæны текст',
-'link_tip' => 'Мидæг æрвитæн (æндæр статьямæ)',
+'link_tip' => 'Мидæггаг æрвитæн',
 'extlink_sample' => 'http://www.example.com æрвитæны текст',
 'extlink_tip' => 'Æддаг æрвитæн (префикс http:// ма рох кæн)',
 'headline_sample' => 'Сæргонд текст',
@@ -600,7 +620,7 @@ $2',
 кæнæ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} агурын йæ кой логты]</span>.',
 'note' => "'''Бафиппай:'''",
 'previewnote' => "'''Зон æй, æмæ ай у æрмæстдæр разбакаст.'''
-Дæ ивдтытæ нырмæ æвæрд не рцыдысты! [[#editform|→ Дарддæр ивын]]",
+Дæ ивдтытæ нырмæ æвæрд не рцыдысты!",
 'editing' => 'Ивд цæуы $1',
 'editingsection' => 'Ивыс $1 (фарсы хай)',
 'editconflict' => 'Ивыны конфликт: $1',
@@ -658,11 +678,11 @@ $2',
 'history-feed-item-nocomment' => '$1 $2',
 
 # Revision deletion
-'rev-deleted-comment' => '(ивды афыст æппæрст æрцыд)',
-'rev-deleted-user' => '(архайæджы ном аппæрст у)',
-'rev-deleted-event' => '(фыст аппæрст у)',
+'rev-deleted-comment' => '(ивды афыст хафт у)',
+'rev-deleted-user' => '(фæсномыг хафт у)',
+'rev-deleted-event' => '(фыст хафт у)',
 'rev-delundel' => 'равдисын/айсын',
-'revisiondelete' => 'Ð\90ппаÑ\80 / Ñ\80аÑ\86аÑ\80аз фарсы фæлтæртæ',
+'revisiondelete' => 'СÑ\85аÑ\84Ñ\8bн/Ñ\80аÑ\86аÑ\80азÑ\8bн фарсы фæлтæртæ',
 'revdel-restore' => 'ивын зынæн',
 'revdel-restore-deleted' => 'хафт ивдтытæ',
 'revdel-restore-visible' => 'зынгæ ивдтытæ',
@@ -678,7 +698,6 @@ $2',
 
 # Diffs
 'history-title' => '"$1" фарсы фæлтæрты истори',
-'difference' => '(Дыууæ фæлтæры ’хсæн хъауджы)',
 'lineno' => 'Рæнхъ $1:',
 'compareselectedversions' => 'Абарын æвзæрст фæлтæртæ',
 'editundo' => 'раивын',
@@ -687,9 +706,9 @@ $2',
 # Search results
 'searchresults' => 'Агуырды фæстиуджытæ',
 'searchresults-title' => 'Агуырды фæстиуæг: «$1»',
-'titlematches' => 'СÑ\82аÑ\82Ñ\8cÑ\8fты сæргæндты æмцаутæ',
+'titlematches' => 'УаÑ\86ты сæргæндты æмцаутæ',
 'notitlematches' => 'Фæрсты сæргæндты нæй',
-'textmatches' => 'СÑ\82аÑ\82Ñ\8cÑ\8fты æмцаутæ',
+'textmatches' => 'УаÑ\86ты æмцаутæ',
 'prevn' => 'рæздæры {{PLURAL:$1|$1}}',
 'nextn' => 'иннæ {{PLURAL:$1|$1}}',
 'prevn-title' => 'Раздæр $1 {{PLURAL:$1|фæстиуæг|фæстиуæджы}}',
@@ -778,7 +797,7 @@ $2',
 'prefs-custom-css' => 'Хиæвæрд CSS',
 'prefs-custom-js' => 'Хиæвæрд JavaScript',
 'youremail' => 'E-mail:',
-'username' => 'РегиÑ\81Ñ\82Ñ\80аÑ\86игонд Ð½Ð¾Ð¼:',
+'username' => 'ФæÑ\81номÑ\8bг:',
 'uid' => 'Архайæджы ID:',
 'yourrealname' => 'Æцæг ном:',
 'yourlanguage' => 'Техникон фыстыты æвзаг:',
@@ -838,7 +857,7 @@ $2',
 'action-edit' => 'ацы фарс ивын',
 'action-createpage' => 'фæрстæ кæнын',
 'action-createtalk' => 'тæрхоны фæрстæ кæнын',
-'action-createaccount' => 'ацы архайæджы ном аразын',
+'action-createaccount' => 'саразын ацы архайæджы аккаунт',
 'action-minoredit' => 'ацы ивд чысылæй нысан кæнын',
 'action-move' => 'ацы фарсы ном ивын',
 'action-movefile' => 'ацы файлы ном ивын',
@@ -849,7 +868,7 @@ $2',
 'nchanges' => '$1 {{PLURAL:$1|ивд|ивды}}',
 'recentchanges' => 'Фæстаг ивдтытæ',
 'recentchanges-legend' => 'Фæстаг ивдтыты фадæттæ',
-'recentchangestext' => 'Ацы фарсыл фæстаг ивдтытæ фенæн ис.',
+'recentchanges-summary' => 'Ацы фарсыл викийы фæстаг ивдтытæ фенæн ис.',
 'recentchanges-feed-description' => 'Хъус дарын викийы фæстаг ивдтытæм ацы лæсæны уылты.',
 'recentchanges-label-newpage' => 'Ацы ивд нæуæг фарс бакодта',
 'recentchanges-label-minor' => 'Ай у чысыл ивд',
@@ -884,7 +903,7 @@ $3',
 'recentchangeslinked-toolbox' => 'Баст ивдтытæ',
 'recentchangeslinked-title' => '"{{grammar:comitative|$1}}" баст ивдтытæ',
 'recentchangeslinked-noresult' => 'Нæй баст фæрсты ивдтытæ амынд рæстæджы',
-'recentchangeslinked-summary' => "Ð\90дон Ñ\81Ñ\82Ñ\8b Ñ\84æÑ\81Ñ\82аг Ñ\80æÑ\81Ñ\82æджÑ\8b Ð¸Ð²Ð´Ñ\82Ñ\8bÑ\82æ Ð°Ñ\85æм Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fты, кæдонмæ æрвиты амынд фарс (кæнæ амынд категорийы уæнгтæ). [[Special:Watchlist|Дæ цæстдард фæрстæ]] сты '''бæзджынæй''' нысангонд.",
+'recentchangeslinked-summary' => "Ð\90дон Ñ\81Ñ\82Ñ\8b Ñ\84æÑ\81Ñ\82аг Ñ\80æÑ\81Ñ\82æджÑ\8b Ð¸Ð²Ð´Ñ\82Ñ\8bÑ\82æ Ð°Ñ\85æм Ñ\83аÑ\86ты, кæдонмæ æрвиты амынд фарс (кæнæ амынд категорийы уæнгтæ). [[Special:Watchlist|Дæ цæстдард фæрстæ]] сты '''бæзджынæй''' нысангонд.",
 'recentchangeslinked-page' => 'Фарсы ном:',
 'recentchangeslinked-to' => 'Уый бæсты равдисæт амынд фарсмæ æрвитгæ фæрсты ивдтытæ',
 
@@ -895,7 +914,7 @@ $3',
 'uploaderror' => 'Файл сæвæрыны рæдыд',
 'uploadlogpage' => 'Æвгæндты лог',
 'filename' => 'Файлы ном',
-'filedesc' => 'Ð\98вдÑ\82Ñ\8bÑ\82Ñ\8b Ð°фыст:',
+'filedesc' => 'Ð\90фыст:',
 'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
 'badfilename' => 'Нывы ном ивд æрцыдис. Ныр хуины «$1».',
 'savefile' => 'Бавæр æй',
@@ -1006,7 +1025,7 @@ $3',
 
 # Special:AllPages
 'allpages' => 'Иууылдæр фæрстæ',
-'alphaindexline' => '$1 (Ñ\83Ñ\8bдонÑ\8b â\80\99Ñ\85Ñ\81æн Ñ\86Ñ\8b Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fтæ ис, фен) $2',
+'alphaindexline' => '$1 (Ñ\83Ñ\8bдонÑ\8b â\80\99Ñ\85Ñ\81æн Ñ\86Ñ\8b Ñ\83аÑ\86тæ ис, фен) $2',
 'nextpage' => 'Фæдылдзог фарс ($1)',
 'prevpage' => 'Раздæры фарс ($1)',
 'allarticles' => 'Иууылдæр фæрстæ',
@@ -1047,14 +1066,14 @@ $3',
 'watchlist' => 'Мæ цæстдард рæгъ',
 'mywatchlist' => 'Мæ цæстдард фæрстæ',
 'watchlistfor2' => 'Архайæг: $1 $2',
-'nowatchlist' => 'Ð\98Ñ\83 Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fмæ дæр дæ цæст нæ дарыс.',
+'nowatchlist' => 'Ð\98Ñ\83 Ñ\83аÑ\86мæ дæр дæ цæст нæ дарыс.',
 'watchnologin' => 'Системæйæн дæхи нæ бацамыдтай',
 'watchnologintext' => 'Ацы номхыгъд ивынæн хъæуы [[Special:UserLogin|бахизын]].',
 'removedwatchtext' => '«[[:$1]]» фарсмæ [[Special:Watchlist|дæ цæст]] нал дарыс.',
 'watch' => 'Цæст æрдарын',
 'watchthispage' => 'Цæст дарын ацы фарсмæ',
 'unwatch' => 'Нал дарын цæст',
-'watchnochange' => 'Ð\94æ Ñ\86æÑ\81Ñ\82даÑ\80д Ñ\81Ñ\82аÑ\82Ñ\8cÑ\8fтæй иу дæр ивд не ’рцыдис.',
+'watchnochange' => 'Ð\94æ Ñ\86æÑ\81Ñ\82даÑ\80д Ñ\83аÑ\86тæй иу дæр ивд не ’рцыдис.',
 'watchlist-details' => '{{PLURAL:$1|$1 фарсмæ|$1 фарсмæ}} дæ цæст дарыс, тæрхоны фæрстæ нæ нымайгæйæ.',
 'watchlistcontains' => 'Дæ цæст $1 {{PLURAL:$1|фарсмæ|фарсмæ}} дарыс.',
 'wlnote' => "Дæлæ афæстаг '''$2 сахаты дæргъы''' цы $1 {{PLURAL:$1|ивддзинад|ивддзинады}} æрцыди.",
@@ -1124,7 +1143,7 @@ $3',
 'sp-contributions-logs' => 'логтæ',
 'sp-contributions-talk' => 'ныхас',
 'sp-contributions-search' => 'Бавæрд агурæн',
-'sp-contributions-username' => 'IP адрис кæнæ архайæджы ном:',
+'sp-contributions-username' => 'IP адрис кæнæ фæсномыг:',
 'sp-contributions-toponly' => 'Æвдисæт æрмæст фæстаг ивдтытæ',
 'sp-contributions-submit' => 'Агурын',
 
@@ -1219,7 +1238,7 @@ $3',
 'tooltip-ca-history' => 'Ацы фарсæн йæ раздæры фæлтæртæ',
 'tooltip-ca-protect' => 'Ацы фарс ивддзинæдтæй сæхгæнын',
 'tooltip-ca-delete' => 'Аппарын ацы фарс',
-'tooltip-ca-move' => 'СÑ\82аÑ\82Ñ\8cÑ\8fйы ном ивын',
+'tooltip-ca-move' => 'УаÑ\86ы ном ивын',
 'tooltip-ca-watch' => 'Бафтау ацы фарс дæ цæстдард рæгъмæ',
 'tooltip-ca-unwatch' => 'Айс ацы фарс дæ цæстдард рæгъæй',
 'tooltip-search' => '{{grammar:genitive|{{SITENAME}}}} агурын',
@@ -1242,7 +1261,7 @@ $3',
 'tooltip-t-specialpages' => 'Сæрмагонд фæрсты номхыгъд',
 'tooltip-t-print' => 'Ацы фарс мыхуырмæ цæттæ форматы',
 'tooltip-t-permalink' => 'Фарсы ацы фæлтæрмæ æрвитæн (фæрстæ ивынц, ацы фæлтæр — нæ)',
-'tooltip-ca-nstab-main' => 'Фен статья',
+'tooltip-ca-nstab-main' => 'Фенын уац',
 'tooltip-ca-nstab-user' => 'Архайæджы фарс фенын',
 'tooltip-ca-nstab-special' => 'Ай сæрмагонд фарс у, дæ бон æй нæу ивын',
 'tooltip-ca-nstab-project' => 'Фенын проекты фарс',
@@ -1390,6 +1409,9 @@ $3',
 'watchlisttools-edit' => 'Бакæсын æмæ ивын цæстдард рæгъ',
 'watchlisttools-raw' => 'Ивын цæстдард рæгъы бындуртекст',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ныхас]])',
+
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Сындæг:\'\'\' Разæвæрд сортгæнæн амонæн "$2" раздæры разæвæрд амонæн "$1"-ы бæсты лæууы.',
 
index b652786..8c29317 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author AS Alam
  * @author Aalam
+ * @author Amire80
  * @author Anjalikaushal
  * @author Gman124
  * @author Guglani
@@ -149,6 +150,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' => 'ਸਮੱਗਰੀ ਪੇਜ',
@@ -324,6 +326,7 @@ A list of valid special pages can be found at [[Special:SpecialPages]].',
 'internalerror' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ',
 'internalerror_info' => 'ਅੰਦਰੂਨੀ ਗਲਤੀ: $1',
 'badtitle' => 'ਗਲਤ ਟਾਇਟਲ',
+'badtitletext' => 'ਤੁਹਾਡਾ ਅਰਜ਼ਿਤ ਸਿਰਲੇਖ ਅਪ੍ਰਮਾਣਿਕ,ਖਾਲੀ ਯਾ ਗਲਤ ਜੁੜਿਆ ਹੋਇਆ ਅੰਤਰ-ਭਾਸ਼ਾ ਯਾ ਅੰਤਰ-ਵਿਕਿ ਸਿਰਲੇਖ ਹੈ।ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'protectedpagetext' => 'ਇਸ ਪੰਨੇ ਨੂੰ ਐਡਿਟ ਕਰਨ ਦੀ ਮਨਾਹੀ ਹੈ।',
 'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਪੰਨੇ ਦਾ ਸੋਮਾ ਦੇਖ ਸਕਦੇ ਹੋ ਤੇ ਉਸ ਦਾ ਉਤਾਰਾ ਵੀ ਲੈ ਸਕਦੇ ਹੋ।',
@@ -470,7 +473,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 ਯਾ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ਇਸ ਪੰਨੇ ਨੂੰ ਸੰਪਾਦਨ ਕਰ ਸਕਦੇ ਹੋ]</span>।',
 'updated' => '(ਅੱਪਡੇਟ)',
 'note' => "'''ਨੋਟ:'''",
-'previewnote' => "'''ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਬਦਲਾਅ ਹਾਲੇ ਸੰਭਾਲੇ ਨਹੀਂ ਗਏ ਹਨ!'''",
+'previewnote' => 'ਇਹ ਸਿਰਫ਼ ਇੱਕ ਝਲਕ ਹੈ; ਬਦਲਾਅ ਹਾਲੇ ਸੰਭਾਲੇ ਨਹੀਂ ਗਏ ਹਨ!',
 'editing' => '$1 ਸੋਧਿਆ ਜਾ ਰਿਹਾ ਹੈ',
 'editingsection' => '$1 (ਸ਼ੈਕਸ਼ਨ) ਸੋਧ',
 'editingcomment' => '$1 (ਟਿੱਪਣੀ) ਸੋਧ',
@@ -478,17 +481,24 @@ $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' => '(ਸੁਰੱਖਿਅਤ)',
 'template-semiprotected' => '(ਅਰਧ-ਸੁਰੱਖਿਅਤ)',
 'permissionserrors' => 'ਅਧਿਕਾਰ ਗਲਤੀਆਂ',
 'permissionserrorstext' => 'ਤੁਹਾਨੂੰ ਇੰਝ ਕਰਨ ਦੇ ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ। ਹੇਠ ਦਿੱਤੇ {{PLURAL:$1|ਕਾਰਨ|ਕਾਰਨ}} ਨੇ:',
+'recreate-moveddeleted-warn' => "'''ਖ਼ਬਰਦਾਰ: ਤੁਸੀਂ ਐਸ ਪੰਨਾ ਰਚ ਰਹੇ ਹੋ ਜਿਸ ਨੂੰ ਪਹਿਲੇ ਹਟਾਇਆ ਜਾ ਚੁੱਕ ਹੈ।'''
+ਖਿਆਲ ਕਰੋ ਕਿ ਕੀ ਇਸ ਪੰਨੇ ਦਾ ਕਾਇਮ ਰਹਿਣਾ ਠੀਕ ਹੈ।
+ਇਸ ਪੰਨੇ ਨੂੰ ਹਟਾਉਣ ਯਾ ਜਘ੍ਹਾ ਬਦਲੀ ਦਾ ਚਿੱਠਾ ਹੇਠਾਂ ਦਿੱਤਾ ਹੈ।",
+'moveddeleted-notice' => 'ਇਹ ਪੰਨਾ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
+ਪੰਨੇ ਦੇ ਹਟਾਣ ਯਾ ਜਗ੍ਹਾ ਬਦਲੀ ਦਾ ਚਿੱਠਾ,ਹਵਾਲੇ ਲਈ ਹੇਠ ਦਿੱਤਾ ਹੈ।',
 
 # 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' => 'ਅਕਾਊਂਟ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ',
@@ -507,6 +517,8 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'last' => 'ਆਖਰੀ',
 'page_first' => 'ਪਹਿਲਾਂ',
 'page_last' => 'ਆਖਰੀ',
+'history-fieldset-title' => 'ਇਤਿਹਾਸ ਤੇ ਇਕ ਨਜ਼ਰ ਮਾਰੋ ।',
+'history-show-deleted' => 'ਕੇਵਲ ਮਿਟਾਏ ਗਏ',
 'histfirst' => 'ਸਭ ਤੋਂ ਪਹਿਲਾਂ',
 'histlast' => 'ਸਭ ਤੋਂ ਨਵਾਂ',
 'historysize' => '($1 ਬਾਈਟ)',
@@ -514,6 +526,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 
 # Revision feed
 'history-feed-title' => 'ਰੀਵਿਜ਼ਨ ਅਤੀਤ',
+'history-feed-item-nocomment' => '$1 ਤੋਂ $2 ਵੱਜੇ',
 
 # Revision deletion
 'rev-deleted-comment' => '(ਟਿੱਪਣੀ ਹਟਾਈ)',
@@ -538,7 +551,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'revertmerge' => 'ਬਿਨ-ਮਿਲਾਨ',
 
 # Diffs
-'difference' => '(ਰੀਵਿਜ਼ਨ ਵਿੱਚ ਅੰਤਰ)',
+'history-title' => '"$1" ਦੀ ਸ਼ੋਧ ਤਵਾਰੀਖ',
 'lineno' => 'ਲਾਈਨ $1:',
 'compareselectedversions' => 'ਚੁਣੇ ਵਰਜਨਾਂ ਦੀ ਤੁਲਨਾ',
 'editundo' => 'ਵਾਪਸ(undo)',
@@ -560,6 +573,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 ਅਗਲਾ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}}',
 'shown-title' => 'ਪ੍ਰਤੀ ਪੇਜ਼ $1 {{PLURAL:$1|ਨਤੀਜਾ|ਨਤੀਜੇ}} ਵੇਖਾਓ',
 'viewprevnext' => 'ਵੇਖੋ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''ਇਸ ਵਿਕਿ ਤੇ \"[[:\$1]]\" ਨਾਮ ਦਾ ਇਕ ਸਫ਼ਾ ਹੈ'''",
 'searchmenu-new' => "'''ਇਸ ਵਿਕਿ ਪਰ \"[[:\$1]]\" ਨਾਮ ਨਾਲ ਪੰਨਾ ਬਣਾਓ!'''",
 'searchhelp-url' => 'Help:ਸਮੱਗਰੀ',
 'searchprofile-articles' => 'ਸਮੱਗਰੀ ਪੇਜ',
@@ -667,10 +681,14 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 # User rights log
 'rightsnone' => '(ਕੋਈ ਨਹੀਂ)',
 
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'ਇਹ ਪੰਨਾ ਸੋਧੋ',
+
 # Recent changes
 'recentchanges' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ',
 'recentchanges-legend' => 'ਤਾਜ਼ਾ ਬਦਲਾਅ ਚੋਣਾਂ',
-'recentchangestext' => 'ਇਸ ਵਿਕੀ ਪਰ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਅਦੇਖੇ ਜਾ ਸਕਦੇ ਹਨ।',
+'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ਪਰ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਅਦੇਖੇ ਜਾ ਸਕਦੇ ਹਨ।',
+'recentchanges-feed-description' => 'ਇਸ ਵਿਕੀ ਪਰ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਇਸ ਫ਼ੀਡ ਵਿਚ ਦੇਖੇ ਜਾ ਸਕਦੇ ਹਨ।',
 'recentchanges-label-newpage' => 'ਇਹ ਸੋਧ ਨੇ ਨਵਾਂ ਸਫ਼ਾ ਬਣਾਇਆ ਹੈ',
 'recentchanges-label-minor' => 'ਇਹ ਛੋਟੀ ਸੋਧ ਹੈ',
 'recentchanges-label-bot' => 'ਇਹ ਸੋਧ ਨੂੰ ਬੋਟ ਵਲੋਂ ਕੀਤਾ ਗਿਆ ਹੈ',
@@ -699,6 +717,7 @@ $1 ਘੰਟੇ ਵਿੱਚ। ਨੁਕਸਾਨ ਤੋਂ ਬਚਣ ਲਈ, $
 'recentchangeslinked-feed' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-toolbox' => 'ਸਬੰਧਿਤ ਬਦਲਾਅ',
 'recentchangeslinked-title' => '"$1" ਨਾਲ ਸੰਬੰਧਿਤ ਬਦਲਾਅ',
+'recentchangeslinked-noresult' => 'ਜੁੜੇ ਹੋਏ ਸਫਿਆਂ ਤੇ ,ਦਿੱਤੇ ਸਮੇਂ ਵਿਚ ਕੁਝ ਨਹੀਂ ਬਦਲਿਆ ।',
 'recentchangeslinked-summary' => 'ਇਹ ਸੂਚੀ ਊਨ੍ਹਾਂ ਪੰਨਿਆਂ ,ਜੋ ਇਕ ਖਾਸ ਪੰਨੇ ਨਾਲ ਸੰਬੰਧਿਤ ਹਨ, (ਯਾ ਕਿਸੇ ਖਾਸ ਸ਼੍ਰੇਣੀ ਦੇ ਮੈਂਬਰਾਂ) ਦੇ ਹਾਲ ਵਿਚ ਹੋਏ ਬਦਲਾਵਾਂ ਨੂੰ ਦਰਸ਼ਾਂਦੀ ਹੈ [[Special:Watchlist|ਤੁਹਾਡੀ ਦ੍ਰਿਸ਼ਟੀ ਗੋਚਰ ਸੂਚੀ]] ਵਿਚ ਮੌਜੂਦ ਪੰਨੇ ਮੋਟੇ ਅਖਰਾਂ ਵਿਚ ਦਿਖਾਈ ਦੇਣਗੇ।',
 'recentchangeslinked-page' => 'ਸਫ਼ਾ ਨਾਂ:',
 'recentchangeslinked-to' => 'ਇਸ ਦੇ ਬਦਲੇ ਇਸ ਪੰਨੇ ਨਾਲ ਜੁੜੇ ਪੰਨਿਆਂ ਵਿਚ ਹੋਏ ਬਦਲਾਅ ਦਿਖਾਓ',
@@ -745,7 +764,7 @@ to upload files.',
 'upload-curl-error28' => 'ਅੱਪਲੋਡ ਟਾਈਮ-ਆਉਟ',
 
 'license' => 'ਲਾਈਸੈਂਸਿੰਗ:',
-'license-header' => 'ਲਾà¨\88ਸà©\88à¨\82ਸਿੰà¨\97:',
+'license-header' => 'ਵਰਤਣ à¨²à¨\88 à¨®à©°à¨\9c਼à©\82ਰà©\80 à¨¦à©\87ਣਾ',
 'nolicense' => 'ਕੁਝ ਵੀ ਚੁਣਿਆ',
 'license-nopreview' => '(ਝਲਕ ਉਪਲੱਬਧ ਨਹੀਂ)',
 'upload_source_file' => ' (ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਇੱਕ ਫਾਇਲ)',
@@ -777,6 +796,7 @@ to upload files.',
 'filehist-comment' => 'ਟਿੱਪਣੀ',
 'imagelinks' => 'ਫ਼ਾਈਲ ਦੀ ਵਰਤੌਂ',
 'linkstoimage' => 'ਹੇਠ ਲਿਖਿਤ {{PLURAL:$1|ਪੰਨੇ ਦਾ ਹਵਾਲਾ ਹੈ|$1 ਪੰਨੇ ਦੇ ਹਵਾਲੇ ਹਨ}} to this file:',
+'nolinkstoimage' => 'ਇਸ ਮਿਸਲ ਨਾਲ ਕੋਈ ਵਿ ਸਫ਼ੇ ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ ।',
 'sharedupload-desc-here' => 'ਇਹ ਮਿਸਲ $1 ਦੀ ਹੈ ਅਤੇ ਹੋਰ ਪ੍ਰਾਜੈਕਟਾਂ ਵਿਚ ਵੀ ਵਰਤੀ ਜਾ ਸਕਦੀ ਹੈ । ਇਸ ਦੇ [$2 ਮਿਸਲ ਵਾਲੇ ਬ੍ਰਿਤਾਂਤ ਪੰਨੇ] ਵਿਚ ਮੌਜੂਦ ਵਰਨਣ ਨਿਮਨ ਲਿਖਿਤ ਹੈ।',
 'uploadnewversion-linktext' => 'ਇਸ ਫਾਇਲ ਦਾ ਇੱਕ ਨਵਾਂ ਵਰਜਨ ਅੱਪਲੋਡ ਕਰੋ',
 
@@ -821,6 +841,7 @@ to upload files.',
 'prefixindex' => 'ਇਸ ਅਗੇਤਰ ਵਾਲੇ ਸਾਰੇ ਪੰਨੇ',
 'shortpages' => 'ਛੋਟੇ ਪੇਜ',
 'listusers' => 'ਯੂਜ਼ਰ ਲਿਸਟ',
+'usercreated' => ' $1 ਨੂੰ $2 ਵਜੇ {{GENDER:$3|ਮੈਂਬਰ ਨੇ ਰਚਿਆ}}',
 'newpages' => 'ਨਵੇਂ ਪੇਜ',
 'newpages-username' => 'ਯੂਜ਼ਰ ਨਾਂ:',
 'ancientpages' => 'ਸਭ ਤੋਂ ਪੁਰਾਣੇ ਪੇਜ',
@@ -857,11 +878,15 @@ to upload files.',
 
 # Special:LinkSearch
 'linksearch' => 'ਬਾਹਰੀ ਲਿੰਕ',
+'linksearch-line' => '$2 ਵਿਚ $1 ਬਾਹਰੀ ਸਿਰਨਾਵਾਂ ਹੈ',
 
 # Special:ListUsers
 'listusers-submit' => 'ਵੇਖੋ',
 'listusers-noresult' => 'ਕੋਈ ਯੂਜ਼ਰ ਨਹੀਂ ਲੱਭਿਆ।',
 
+# Special:Log/newusers
+'newuserlogpage' => 'ਮੈਂਬਰ ਖਾਤਾ ਉਸਾਰੀ ਚਿੱਠਾ',
+
 # Special:ListGroupRights
 'listgrouprights-group' => 'ਗਰੁੱਪ',
 'listgrouprights-members' => '(ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ)',
@@ -884,6 +909,7 @@ to upload files.',
 # Watchlist
 'watchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
 'mywatchlist' => 'ਮੇਰੀ ਵਾਚ-ਲਿਸਟ',
+'watchlistfor2' => '$1 $2 ਲਈ',
 'watchnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'watch' => 'ਵਾਚ',
 'watchthispage' => 'ਇਹ ਪੇਜ ਵਾਚ ਕਰੋ',
@@ -909,6 +935,7 @@ to upload files.',
 'delete-confirm' => '"$1" ਹਟਾਓ',
 'delete-legend' => 'ਹਟਾਓ',
 'actioncomplete' => 'ਐਕਸ਼ਨ ਪੂਰਾ ਹੋਇਆ',
+'actionfailed' => 'ਹਰਕਤ ਨਿਸ਼ਫ਼ਲ',
 'dellogpage' => 'ਹਟਾਉਣ ਲਾਗ',
 'deletecomment' => 'ਕਾਰਨ:',
 'deleteotherreason' => 'ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:',
@@ -958,16 +985,21 @@ to upload files.',
 
 # Contributions
 'contributions' => 'ਯੂਜ਼ਰ ਯੋਗਦਾਨ',
+'contributions-title' => '$1 ਦੀ ਰਚਨਾ',
 'mycontris' => 'ਮੇਰਾ ਯੋਗਦਾਨ',
 'contribsub2' => '$1 ($2) ਲਈ',
 'uctop' => '(ਉੱਤੇ)',
+'month' => 'ਇਸ(ਯਾ ਹੋਰ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੌਂ',
+'year' => 'ਇਸ(ਜਾਂ ਹੋਰ ਪਿਛਲੇ) ਸਾਲ ਤੌਂ',
 
 'sp-contributions-newbies-sub' => 'ਨਵੇਂ ਅਕਾਊਂਟਾਂ ਲਈ',
 'sp-contributions-blocklog' => 'ਪਾਬੰਦੀ ਲਾਗ',
+'sp-contributions-uploads' => 'ਅਪਲੋਡ',
 'sp-contributions-logs' => 'ਲਾਗ',
 'sp-contributions-talk' => 'ਗੱਲਬਾਤ',
 'sp-contributions-search' => 'ਯੋਗਦਾਨ ਖੋਜੋ',
 'sp-contributions-username' => 'IP ਐਡਰੈੱਸ ਜਾਂ ਯੂਜ਼ਰ ਨਾਂ:',
+'sp-contributions-toponly' => 'ਕੇਵਲ ਉਹੀ ਸੰਪਾਦਨ ਦਿਖਾਓ ਜੋ ਨਵੀਨਤਮ ਸੋਧਾਂ ਹਨ।',
 'sp-contributions-submit' => 'ਖੋਜ',
 
 # What links here
@@ -983,6 +1015,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' => 'ਫਿਲਟਰ',
@@ -1051,6 +1084,7 @@ to upload files.',
 # Thumbnails
 'thumbnail-more' => 'ਫੈਲਾਓ',
 'filemissing' => 'ਫਾਇਲ ਗੁੰਮ ਹੈ',
+'thumbnail_error' => 'ਅਁਗੂਠਾ ਝਲਕ ਬਨਾਉਣ ਵਿਚ ਗਲਤੀ ਹੋਈ ਹੈ : $1',
 
 # Special:Import
 'import' => 'ਪੇਜ ਇੰਪੋਰਟ ਕਰੋ',
@@ -1115,10 +1149,12 @@ to upload files.',
 'tooltip-ca-nstab-template' => 'ਟੈਪਲੇਟ ਵੇਖੋ',
 'tooltip-ca-nstab-help' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
 'tooltip-ca-nstab-category' => 'ਕੈਟਾਗਰੀ ਪੇਜ ਵੇਖੋ',
+'tooltip-minoredit' => 'ਇਸ ਤੇ ਛੋਟੇ ਬਦਲਾਅ ਦਾ  ਨਿਸ਼ਾਨ ਲਾਓ',
 'tooltip-save' => 'ਆਪਣੇ ਬਦਲਾਅ ਸੰਭਾਲੋ',
 'tooltip-preview' => 'ਆਪਣੇ ਬਦਲਾਅ ਦੀ ਝਲਕ ਵੇਖੋ, ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇਹ ਵਰਤੋਂ ਜੀ!',
 'tooltip-diff' => 'ਇਸ ਪਾਠ ਵਿਚ ਆਪਣੇ ਕੀਤੇ ਹੋਏ ਬਦਲਾਅ ਦੇਖੋ',
 'tooltip-compareselectedversions' => 'ਇਸ ਪੰਨੇ ਦੇ ਚੁਣੇ ਹੋਏ ਸ਼ੋਧਾਂ ਵਿਚ ਫ਼ਰਕ ਦੇਖੋ',
+'tooltip-watch' => 'ਇਹ ਸਫ਼ੇ ਨੂੰ ਆਪਣੀ ਵਾਚ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
 'tooltip-upload' => 'ਅੱਪਲੋਡ ਸਟਾਰਟ ਕਰੋ',
 'tooltip-rollback' => "'' ਵਾਪਸ ਲੈ ਜਾਓ '' ਇਕ ਝਟਕੇ ਵਿਚ ਹੀ ਪਿਛਲੇ ਯੂਜ਼ਰ ਦੇ ਬਦਲਾਵਾਂ ਨੂੰ ਗਾਇਬ ਕਰ ਦੇਂਦਾ ਹੈ।",
 'tooltip-undo' => '" ਪੁਰਾਣੀ ਹਾਲਤ ਵਿਚ ਪਰਤੋ " ਇਸ ਬਦਲਾਅ ਨੂੰ ਰੱਦ ਕਰਕੇ ਸੰਪਾਦਨ ਫਾਰਮ ਨੂੰ ਝਲਕ ਦੇ ਅੰਦਾਜ਼ ਵਿਚ ਦਿਖਾਂਦਾ ਹੈ।
@@ -1167,6 +1203,7 @@ to upload files.',
 # Metadata
 'metadata' => 'ਮੇਟਾ ਡੈਟਾ',
 'metadata-help' => 'ਇਸ ਮਿਸਲ ਵਿਚ ਵਾਧੂ ਜਾਨਕਾਰੀਆਂ ਹਨ , ਜੋ ਸ਼ਾਇਦ ਉਸ ਕੈਮਰੇ ਯਾ ਸਕੈਨਰ ਦੀ ਦੇਣ ਹਨ ਜੋਕਿ ਇਸ ਮਿਸਲ ਨੂੰ ਬਨਾਉਣ ਲਈ ਵਰਤਿਆ ਗਿਆ ਹੈ।ਅਗ਼ਰ ਇਹ ਮਿਸਲ ਬਦਲਾਈ ਗਈ ਹੈ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕੁਝ ਵੇਰਵੇ ਬਦਲੀ ਮਿਸਲ ਦਾ ਸਹੀ ਰੂਪਮਾਨ ਨਾ ਹੋਣ।',
+'metadata-fields' => 'ਮੈਟਾਡੈਟਾ ਸੂਚੀ ਪਟ ਨੂੰ ਛੋਟਾ ਕਰਣ ਨਾਲ ਇਸ ਸੁਨੇਹੇ ਵਿਚ ਸੂਚੀਬੱਧ ਫ਼ੀਲਡ ਮੂਰਤ ਦੇ ਦ੍ਰਿਸ਼ ਵਿਚ ਸ਼ਾਮਲ ਕੀਤੇ ਜਾਣਗੇ।ਬਾਕੀ ਫ਼ੀਲਡਾਂ ਨੂੰ ਛਿਪਾਇਆ ਜਾਏਗਾ।',
 
 # EXIF tags
 'exif-imagewidth' => 'ਚੌੜਾਈ',
index 34fd274..bc10284 100644 (file)
@@ -79,7 +79,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'fri' => 'Vie',
 'sat' => 'Sab',
 'january' => 'Eneru',
-'february' => 'Febreru',
+'february' => 'Pebreru',
 'march' => 'Marzu',
 'april' => 'Abril',
 'may_long' => 'Mayu',
@@ -158,6 +158,9 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'vector-action-protect' => 'Protectan/kambilan',
 'vector-action-undelete' => 'Isubli/iurung ya pangabura',
 'vector-action-unprotect' => 'Idayu ya panga-protecta',
+'vector-view-view' => 'Basan',
+'namespaces' => 'Karinanlagiu',
+'variants' => 'Aliwapa',
 
 'errorpagetitle' => 'Mali',
 'returnto' => 'Magbalik king $1.',
@@ -275,7 +278,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'nstab-project' => 'Bulung ding proyektu',
 'nstab-image' => 'Simpan (File)',
 'nstab-mediawiki' => 'Mensahi',
-'nstab-template' => 'Modelu (template)',
+'nstab-template' => 'Ulma (template)',
 'nstab-help' => 'Saup bulung',
 'nstab-category' => 'Kategoriya',
 
@@ -644,6 +647,7 @@ Ini ing sangkan a binie nang $3: ''$2''",
 Kabaldugan: (ngeni)=pamiyaliwa king salukuyan a bersion (bersion ngeni),
 (tauli)=pamiyaliwa ketang sadyang (tauling) bersion, M = malating edit.',
 'history-fieldset-title' => 'Amlat da reng pamaglawe',
+'history-show-deleted' => 'Milako yamu',
 'histfirst' => 'Minunang dili',
 'histlast' => 'Pekabayu',
 'historysize' => '({{PLURAL:$1|1 a byte|byte}})',
@@ -729,7 +733,6 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 
 # Diffs
 'history-title' => 'Amlat ning pamagbayu king "$1"',
-'difference' => '(Pamiyaliwa da reng pamibayu)',
 'lineno' => 'Gulis $1:',
 'compareselectedversions' => 'Pikumpara/piyanti la reng mepiling bersion',
 'editundo' => 'iurung',
@@ -749,6 +752,7 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'prevn' => 'minunang {{PLURAL:$1|$1}}',
 'nextn' => 'tutuking {{PLURAL:$1|$1}}',
 'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
 'searchhelp-url' => 'Help:Kalamnan',
 'search-result-size' => '$1 ({{PLURAL:$2|1 a kataya|$2 kataya}})',
 'search-result-score' => 'Kaugnayan (relevance): $1%',
@@ -943,7 +947,7 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
 'nchanges' => '$1 {{PLURAL:$1|miyalilan|miyalilan}}',
 'recentchanges' => 'Bayung mengayalili',
 'recentchanges-legend' => 'Pipamilinan kareng bayung mengayalili',
-'recentchangestext' => 'Talukyan mo reng tawling diling mengayalilan king bulung a ini.',
+'recentchanges-summary' => 'Talukyan mo reng tawling diling mengayalilan king bulung a ini.',
 'recentchanges-feed-description' => 'Talukian mo reng bayung diling mengayalili king wiki king feed a ini.',
 'rcnote' => "King lalam {{PLURAL:$1|is '''1''' change|ding tauling '''$1''' pamagbayu}} aniang tauling {{PLURAL:$2|day|'''$2''' aldo}}, aniang $5, $4.",
 'rcnotefrom' => 'Atilu king lalam deng miyalilan manibat anyang <b>$2</b> (angga king <b>$1</b> makalto).',
@@ -1295,6 +1299,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Special:LinkSearch
 'linksearch' => 'Suglung palual',
+'linksearch-line' => '$1 makasuglung ibat $2',
 
 # Special:ListUsers
 'listusersfrom' => 'Ipakit la reng talagamit magumpisa king:',
@@ -1584,7 +1589,7 @@ $1',
 'nolinkshere-ns' => "Alang bulung a makatuglung king '''[[:$1]]''' ketang mepiling pirinan lagyu (namespace).",
 'isredirect' => 'Bulung ning pamanaliling direksiun',
 'istemplate' => 'misingit',
-'isimage' => 'suglung king larawan',
+'isimage' => 'Isuglung king larawan',
 'whatlinkshere-prev' => '{{PLURAL:$1|minunang|minunang $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|next|tutuking $1}}',
 'whatlinkshere-links' => '← suglung',
index 341a17b..4fd4af0 100644 (file)
@@ -437,7 +437,6 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 
 # Diffs
 'history-title' => 'Histoère des cangemints éd "$1"',
-'difference' => '(Diférinche intre chés érvisions)',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compérer chés couésies contérbuchons',
 'editundo' => "n'poin foaire",
index d471b50..cf649e0 100644 (file)
@@ -57,259 +57,259 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'          => 'Gleecher unnerleine:',
-'tog-hideminor'          => 'Gleene Enneringe verschwinne losse',
-'tog-watchdefault'       => 'Vun mir gennerte Ardickele watsche',
-'tog-nocache'            => 'Bledder-Scheier ausmache',
-'tog-watchlisthideown'   => 'Mei Ardickele vun mei Watsch-Lischt verschwinne losse',
-'tog-watchlisthidebots'  => 'Enneringe vun Bots vun mei Watsch-Lischt verschwinne losse',
+'tog-underline' => 'Gleecher unnerleine:',
+'tog-hideminor' => 'Gleene Enneringe verschwinne losse',
+'tog-watchdefault' => 'Vun mir gennerte Ardickele watsche',
+'tog-nocache' => 'Bledder-Scheier ausmache',
+'tog-watchlisthideown' => 'Mei Ardickele vun mei Watsch-Lischt verschwinne losse',
+'tog-watchlisthidebots' => 'Enneringe vun Bots vun mei Watsch-Lischt verschwinne losse',
 'tog-watchlisthideminor' => 'Gleene Enneringe vun mei Watsch-Lischt verschwinne losse',
 
 'underline-always' => 'allfart',
-'underline-never'  => 'nie naett',
+'underline-never' => 'nie naett',
 
 # Dates
-'sunday'        => 'Sunndaag',
-'monday'        => 'Mundaag',
-'tuesday'       => 'Dinschdaag',
-'wednesday'     => 'Mittwoch',
-'thursday'      => 'Dunnerschdaag',
-'friday'        => 'Freidaag',
-'saturday'      => 'Samschdaag',
-'sun'           => 'Su',
-'mon'           => 'Mo',
-'tue'           => 'Di',
-'wed'           => 'Mi',
-'thu'           => 'Du',
-'fri'           => 'Fr',
-'sat'           => 'Sa',
-'january'       => 'Yenner',
-'february'      => 'Hanning',
-'march'         => 'Matz',
-'april'         => 'Abril',
-'may_long'      => 'Moi',
-'june'          => 'Yuni',
-'july'          => 'Yuli',
-'august'        => 'Aagscht',
-'september'     => 'September',
-'october'       => 'Oktower',
-'november'      => 'Nowember',
-'december'      => 'Disember',
-'january-gen'   => 'Yenner',
-'february-gen'  => 'Hanning',
-'march-gen'     => 'Matz',
-'april-gen'     => 'Abril',
-'may-gen'       => 'Moi',
-'june-gen'      => 'Tschuun',
-'july-gen'      => 'Tschulei',
-'august-gen'    => 'Aagscht',
+'sunday' => 'Sunndaag',
+'monday' => 'Mundaag',
+'tuesday' => 'Dinschdaag',
+'wednesday' => 'Mittwoch',
+'thursday' => 'Dunnerschdaag',
+'friday' => 'Freidaag',
+'saturday' => 'Samschdaag',
+'sun' => 'Su',
+'mon' => 'Mo',
+'tue' => 'Di',
+'wed' => 'Mi',
+'thu' => 'Du',
+'fri' => 'Fr',
+'sat' => 'Sa',
+'january' => 'Yenner',
+'february' => 'Hanning',
+'march' => 'Matz',
+'april' => 'Abril',
+'may_long' => 'Moi',
+'june' => 'Yuni',
+'july' => 'Yuli',
+'august' => 'Aagscht',
+'september' => 'September',
+'october' => 'Oktower',
+'november' => 'Nowember',
+'december' => 'Disember',
+'january-gen' => 'Yenner',
+'february-gen' => 'Hanning',
+'march-gen' => 'Matz',
+'april-gen' => 'Abril',
+'may-gen' => 'Moi',
+'june-gen' => 'Tschuun',
+'july-gen' => 'Tschulei',
+'august-gen' => 'Aagscht',
 'september-gen' => 'September',
-'october-gen'   => 'Oktower',
-'november-gen'  => 'Nowember',
-'december-gen'  => 'Disember',
-'jan'           => 'Yen.',
-'feb'           => 'Han.',
-'mar'           => 'Matz',
-'apr'           => 'Abr.',
-'may'           => 'Moi',
-'jun'           => 'Yuni',
-'jul'           => 'Yuli',
-'aug'           => 'Aug.',
-'sep'           => 'Sep.',
-'oct'           => 'Okt.',
-'nov'           => 'Nov.',
-'dec'           => 'Dis.',
+'october-gen' => 'Oktower',
+'november-gen' => 'Nowember',
+'december-gen' => 'Disember',
+'jan' => 'Yen.',
+'feb' => 'Han.',
+'mar' => 'Matz',
+'apr' => 'Abr.',
+'may' => 'Moi',
+'jun' => 'Yuni',
+'jul' => 'Yuli',
+'aug' => 'Aug.',
+'sep' => 'Sep.',
+'oct' => 'Okt.',
+'nov' => 'Nov.',
+'dec' => 'Dis.',
 
 # Categories related messages
-'pagecategories'                 => '{{PLURAL:$1|Abdeeling|Abdeelinge}}',
-'category_header'                => 'Bledder in Abdeeling „$1“',
-'subcategories'                  => 'Unnerabdeeling',
-'category-media-header'          => 'Media in Abdeeling „$1“',
-'category-empty'                 => "''Die Abdeeling hot zu daere Zeit kene Bledder oder Feils.''",
+'pagecategories' => '{{PLURAL:$1|Abdeeling|Abdeelinge}}',
+'category_header' => 'Bledder in Abdeeling „$1“',
+'subcategories' => 'Unnerabdeeling',
+'category-media-header' => 'Media in Abdeeling „$1“',
+'category-empty' => "''Die Abdeeling hot zu daere Zeit kene Bledder oder Feils.''",
 'category-article-count-limited' => '{{PLURAL:$1|Sell Blatt iss|Selle $1 Bledder sin}} in daer Abdeeling drin:',
-'category-file-count-limited'    => '{{PLURAL:$1|Sell Feil iss|Selle $1 Feils sin}} in daer Abdeeling drin:',
-'listingcontinuesabbrev'         => '(weider)',
+'category-file-count-limited' => '{{PLURAL:$1|Sell Feil iss|Selle $1 Feils sin}} in daer Abdeeling drin:',
+'listingcontinuesabbrev' => '(weider)',
 
-'about'         => 'Iwwer',
-'article'       => 'Blatt',
-'newwindow'     => '(in em nei Fenschder)',
-'cancel'        => 'Zerick',
+'about' => 'Iwwer',
+'article' => 'Blatt',
+'newwindow' => '(in em nei Fenschder)',
+'cancel' => 'Zerick',
 'moredotdotdot' => 'Mehner…',
-'mypage'        => 'Mei Blatt',
-'mytalk'        => 'Mei Gschwetz-Blatt',
-'anontalk'      => 'Gschwetz-Blatt fer die IP',
-'navigation'    => 'Faahre-Gnepp',
-'and'           => '&#32;unn',
+'mypage' => 'Mei Blatt',
+'mytalk' => 'Mei Gschwetz-Blatt',
+'anontalk' => 'Gschwetz-Blatt fer die IP',
+'navigation' => 'Faahre-Gnepp',
+'and' => '&#32;unn',
 
 # Cologne Blue skin
-'qbfind'         => 'Finne',
-'qbedit'         => 'Ennere',
-'qbpageoptions'  => 'Des Blatt',
-'qbpageinfo'     => 'Daade vun dem Blatt',
-'qbmyoptions'    => 'Mei Bledder',
+'qbfind' => 'Finne',
+'qbedit' => 'Ennere',
+'qbpageoptions' => 'Des Blatt',
+'qbpageinfo' => 'Daade vun dem Blatt',
+'qbmyoptions' => 'Mei Bledder',
 'qbspecialpages' => 'Besunnere Bledder',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-delete'  => 'Verwische',
-'vector-action-move'    => 'Ziehe',
+'vector-action-delete' => 'Verwische',
+'vector-action-move' => 'Ziehe',
 'vector-action-protect' => 'Schitze',
-'vector-view-create'    => 'Schtaerte',
-'vector-view-edit'      => 'Ennere',
-'vector-view-history'   => 'Gschicht zeige',
-'vector-view-view'      => 'Lese',
-'namespaces'            => 'Blatznaame',
-
-'errorpagetitle'   => 'Mischteek',
-'returnto'         => 'Zerick zum Blatt $1.',
-'tagline'          => 'Vun {{SITENAME}}',
-'help'             => 'Hilf',
-'search'           => 'Guck uff',
-'searchbutton'     => 'Guck uff',
-'go'               => 'Geh',
-'searcharticle'    => 'Blatt',
-'history'          => 'Gschicht',
-'history_short'    => 'Gschicht',
+'vector-view-create' => 'Schtaerte',
+'vector-view-edit' => 'Ennere',
+'vector-view-history' => 'Gschicht zeige',
+'vector-view-view' => 'Lese',
+'namespaces' => 'Blatznaame',
+
+'errorpagetitle' => 'Mischteek',
+'returnto' => 'Zerick zum Blatt $1.',
+'tagline' => 'Vun {{SITENAME}}',
+'help' => 'Hilf',
+'search' => 'Guck uff',
+'searchbutton' => 'Guck uff',
+'go' => 'Geh',
+'searcharticle' => 'Blatt',
+'history' => 'Gschicht',
+'history_short' => 'Gschicht',
 'printableversion' => 'Version zum Drucke',
-'permalink'        => 'Permanent Gleecher',
-'print'            => 'Drucke',
-'view'             => 'Aagucke',
-'edit'             => 'Ennere/Tscheensche',
-'create'           => 'Schtaerte',
-'editthispage'     => 'Des Blatt ennere',
+'permalink' => 'Permanent Gleecher',
+'print' => 'Drucke',
+'view' => 'Aagucke',
+'edit' => 'Ennere/Tscheensche',
+'create' => 'Schtaerte',
+'editthispage' => 'Des Blatt ennere',
 'create-this-page' => 'Blatt schtaerte',
-'delete'           => 'Verwische',
-'deletethispage'   => 'Des Blatt verwische',
-'protect'          => 'Schitze',
-'protect_change'   => 'tscheensche',
-'protectthispage'  => 'Des Blatt schitze',
-'newpage'          => 'Neies Blatt',
-'talkpage'         => 'Sell Blatt dischbediere',
+'delete' => 'Verwische',
+'deletethispage' => 'Des Blatt verwische',
+'protect' => 'Schitze',
+'protect_change' => 'tscheensche',
+'protectthispage' => 'Des Blatt schitze',
+'newpage' => 'Neies Blatt',
+'talkpage' => 'Sell Blatt dischbediere',
 'talkpagelinktext' => 'Gschwetz',
-'specialpage'      => 'Besunneres Blatt',
-'personaltools'    => 'Paerseenlich Gscharr',
-'articlepage'      => 'Inhalt vun dem Blatt aagucke',
-'talk'             => 'Dischbedutt',
-'views'            => 'Aasichte',
-'toolbox'          => 'Gscharr',
-'userpage'         => 'Yuuserblatt zeige',
-'projectpage'      => 'Projekt-Blatt aagucke',
-'imagepage'        => 'Feils zeige',
-'templatepage'     => 'Moddle zeige',
-'categorypage'     => 'Abeelingsblatt zeige',
-'viewtalkpage'     => 'Dischbedutt zeige',
-'otherlanguages'   => 'Annere Schprooche',
-'redirectedfrom'   => '(Weiterleitung vun $1)',
-'redirectpagesub'  => 'Weiderleiding',
-'lastmodifiedat'   => 'Des Blatt iss letscht gennert am $1 um $2 Uhr.',
-'protectedpage'    => 'Blatt mit Schutz',
-'jumpto'           => 'Gang nooch:',
+'specialpage' => 'Besunneres Blatt',
+'personaltools' => 'Paerseenlich Gscharr',
+'articlepage' => 'Inhalt vun dem Blatt aagucke',
+'talk' => 'Dischbedutt',
+'views' => 'Aasichte',
+'toolbox' => 'Gscharr',
+'userpage' => 'Yuuserblatt zeige',
+'projectpage' => 'Projekt-Blatt aagucke',
+'imagepage' => 'Feils zeige',
+'templatepage' => 'Moddle zeige',
+'categorypage' => 'Abeelingsblatt zeige',
+'viewtalkpage' => 'Dischbedutt zeige',
+'otherlanguages' => 'Annere Schprooche',
+'redirectedfrom' => '(Weiterleitung vun $1)',
+'redirectpagesub' => 'Weiderleiding',
+'lastmodifiedat' => 'Des Blatt iss letscht gennert am $1 um $2 Uhr.',
+'protectedpage' => 'Blatt mit Schutz',
+'jumpto' => 'Gang nooch:',
 'jumptonavigation' => 'Faahre-Gnepp',
-'jumptosearch'     => 'guck uff',
+'jumptosearch' => 'guck uff',
 
 # 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_{{SITENAME}}',
-'copyright'            => 'Was do drin schdeht iss unner $1 verfiechbar',
-'copyrightpage'        => '{{ns:project}}:Urhewerrechte',
-'disclaimers'          => 'Impressum',
-'disclaimerpage'       => 'Project:Impressum',
-'edithelp'             => 'Hilf zum Ennere',
-'edithelppage'         => 'Help:Tscheensche',
-'helppage'             => 'Help:Hilf',
-'mainpage'             => 'Haaptblatt',
+'aboutsite' => 'Iwwer {{SITENAME}}',
+'aboutpage' => 'Project:Iwwer_{{SITENAME}}',
+'copyright' => 'Was do drin schdeht iss unner $1 verfiechbar',
+'copyrightpage' => '{{ns:project}}:Urhewerrechte',
+'disclaimers' => 'Impressum',
+'disclaimerpage' => 'Project:Impressum',
+'edithelp' => 'Hilf zum Ennere',
+'edithelppage' => 'Help:Tscheensche',
+'helppage' => 'Help:Hilf',
+'mainpage' => 'Haaptblatt',
 'mainpage-description' => 'Haaptblatt',
-'portal'               => 'Gmeeschafts-Portal',
-'portal-url'           => 'Project:Gmeeschafts-Portal',
-'privacy'              => 'Daadeschutz',
-'privacypage'          => 'Project:Daadeschutz',
+'portal' => 'Gmeeschafts-Portal',
+'portal-url' => 'Project:Gmeeschafts-Portal',
+'privacy' => 'Daadeschutz',
+'privacypage' => 'Project:Daadeschutz',
 
-'versionrequired'     => 'Muss Version $1 vun MediaWiki sei',
+'versionrequired' => 'Muss Version $1 vun MediaWiki sei',
 'versionrequiredtext' => 'Muss Version $1 vun MediaWiki sei, fer es Blatt zu yuuse.
 Guck aa [[Special:Version|Versionsblatt]]',
 
-'ok'                      => 'OK',
-'retrievedfrom'           => 'Vun „$1“',
-'youhavenewmessages'      => 'Du hast $1 uff deinem $2.',
-'newmessageslink'         => 'Neiichkeede',
-'newmessagesdifflink'     => 'Gschwetz-Blatt',
+'ok' => 'OK',
+'retrievedfrom' => 'Vun „$1“',
+'youhavenewmessages' => 'Du hast $1 uff deinem $2.',
+'newmessageslink' => 'Neiichkeede',
+'newmessagesdifflink' => 'Gschwetz-Blatt',
 'youhavenewmessagesmulti' => 'Du hascht neie Comments: $1',
-'editsection'             => 'Ennere',
-'editold'                 => 'Ennere',
-'editlink'                => 'ennere',
-'editsectionhint'         => 'Abschnitt ennere: $1',
-'toc'                     => 'Lischt vum Inhalt',
-'showtoc'                 => 'Zeige',
-'hidetoc'                 => 'Verschwinne losse',
-'collapsible-collapse'    => 'Zuklappe',
-'collapsible-expand'      => 'Uffklappe',
-'viewdeleted'             => '$1 zeige?',
-'feedlinks'               => 'Feed:',
-'site-rss-feed'           => 'RSS-Feed fer $1',
-'site-atom-feed'          => 'Atom-Feed fer $1',
-'page-rss-feed'           => 'RSS-Feed fer „$1“',
-'page-atom-feed'          => 'Atom-Feed fer „$1“',
-'red-link-title'          => '$1 (Blatt gebt es net)',
+'editsection' => 'Ennere',
+'editold' => 'Ennere',
+'editlink' => 'ennere',
+'editsectionhint' => 'Abschnitt ennere: $1',
+'toc' => 'Lischt vum Inhalt',
+'showtoc' => 'Zeige',
+'hidetoc' => 'Verschwinne losse',
+'collapsible-collapse' => 'Zuklappe',
+'collapsible-expand' => 'Uffklappe',
+'viewdeleted' => '$1 zeige?',
+'feedlinks' => 'Feed:',
+'site-rss-feed' => 'RSS-Feed fer $1',
+'site-atom-feed' => 'Atom-Feed fer $1',
+'page-rss-feed' => 'RSS-Feed fer „$1“',
+'page-atom-feed' => 'Atom-Feed fer „$1“',
+'red-link-title' => '$1 (Blatt gebt es net)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Blatt',
-'nstab-user'      => 'Yuuser-Blatt',
-'nstab-media'     => 'Media-Blatt',
-'nstab-special'   => 'Besunneres Blatt',
-'nstab-project'   => 'Project-Blatt',
-'nstab-image'     => 'Feil',
+'nstab-main' => 'Blatt',
+'nstab-user' => 'Yuuser-Blatt',
+'nstab-media' => 'Media-Blatt',
+'nstab-special' => 'Besunneres Blatt',
+'nstab-project' => 'Project-Blatt',
+'nstab-image' => 'Feil',
 'nstab-mediawiki' => 'Melding vum System',
-'nstab-template'  => 'Moddel',
-'nstab-help'      => 'Hilf',
-'nstab-category'  => 'Abdeeling',
+'nstab-template' => 'Moddel',
+'nstab-help' => 'Hilf',
+'nstab-category' => 'Abdeeling',
 
 # General errors
-'error'               => 'Mischteek',
-'databaseerror'       => 'Fehler in de Daadescheier',
-'missing-article'     => 'Sell Text fer „$1“ $2 iss in de Daadebank naett gfunne warre.
+'error' => 'Mischteek',
+'databaseerror' => 'Fehler in de Daadescheier',
+'missing-article' => 'Sell Text fer „$1“ $2 iss in de Daadebank naett gfunne warre.
 
 Des Blatt iss verleicht glescht adder gezoge warre.
 
 Wenns des net iss, hoscht verleicht en Fehler in de Daadebank gfunne. Bitte meld des an en [[Special:ListUsers/sysop|Verwalter]] unn gebb die URL dezu aa.',
-'missingarticle-rev'  => '(Version: $1)',
+'missingarticle-rev' => '(Version: $1)',
 'missingarticle-diff' => '(Unnerschidd zwische Versione: $1, $2)',
-'internalerror'       => 'Interner Fehler',
-'internalerror_info'  => 'Interner Fehler: $1',
+'internalerror' => 'Interner Fehler',
+'internalerror_info' => 'Interner Fehler: $1',
 'ns-specialprotected' => 'Besunnere Bledder sinn net zum Ennere.',
 
 # Virus scanner
 'virus-unknownscanner' => 'Unbekannter Virus-Uffgucker:',
 
 # Login and logout pages
-'yourname'                => 'Yuuser-Naame:',
-'yourpassword'            => 'Paesswatt:',
-'yourpasswordagain'       => 'Paesswatt noch eemol:',
-'yourdomainname'          => 'Dei Domain:',
-'login'                   => 'Kumm nei',
+'yourname' => 'Yuuser-Naame:',
+'yourpassword' => 'Paesswatt:',
+'yourpasswordagain' => 'Paesswatt noch eemol:',
+'yourdomainname' => 'Dei Domain:',
+'login' => 'Kumm nei',
 'nav-login-createaccount' => 'Kumm nei',
-'userlogin'               => 'Kumm nei',
-'userloginnocreate'       => 'Kumm nei',
-'logout'                  => 'Geh naus',
-'userlogout'              => 'Geh naus',
-'gotaccountlink'          => 'Kumm nei',
-'createaccountmail'       => 'iwwer E-Mail',
-'createaccountreason'     => 'Grund:',
-'mailmypassword'          => 'Neies Paesswadd eposchde',
-'noemail'                 => 'Yuuser „$1“ hot ken E-Mail aagewwe.',
-'loginlanguagelabel'      => 'Schprooch: $1',
+'userlogin' => 'Kumm nei',
+'userloginnocreate' => 'Kumm nei',
+'logout' => 'Geh naus',
+'userlogout' => 'Geh naus',
+'gotaccountlink' => 'Kumm nei',
+'createaccountmail' => 'iwwer E-Mail',
+'createaccountreason' => 'Grund:',
+'mailmypassword' => 'Neies Paesswadd eposchde',
+'noemail' => 'Yuuser „$1“ hot ken E-Mail aagewwe.',
+'loginlanguagelabel' => 'Schprooch: $1',
 
 # Change password dialog
-'resetpass'                 => 'Paesswatt ennere',
-'oldpassword'               => 'Aldes Paesswatt:',
-'newpassword'               => 'Neies Paesswatt:',
-'resetpass_forbidden'       => 'Paesswatt iss net zu ennere',
+'resetpass' => 'Paesswatt ennere',
+'oldpassword' => 'Aldes Paesswatt:',
+'newpassword' => 'Neies Paesswatt:',
+'resetpass_forbidden' => 'Paesswatt iss net zu ennere',
 'resetpass-submit-loggedin' => 'Paesswatt ennere',
 
 # Special:PasswordReset
-'passwordreset'              => 'Paesswatt zerricksetze',
-'passwordreset-legend'       => 'Paesswatt zerricksetze',
-'passwordreset-username'     => 'Yuuser-Naame:',
+'passwordreset' => 'Paesswatt zerricksetze',
+'passwordreset-legend' => 'Paesswatt zerricksetze',
+'passwordreset-username' => 'Yuuser-Naame:',
 'passwordreset-emailelement' => 'Yuusernaame: $1
 Paesswatt fer nau: $2',
 
@@ -317,229 +317,228 @@ Paesswatt fer nau: $2',
 'changeemail-none' => '(ken)',
 
 # Edit page toolbar
-'bold_sample'     => 'Wadde fett gmarrickt',
-'bold_tip'        => 'Wadde fett gmarrickt',
-'link_sample'     => 'Gleecher-Titel',
-'link_tip'        => 'Gleecher',
-'extlink_sample'  => 'http://www.example.com Gleecher-Text',
-'extlink_tip'     => 'Gewebbgleecher (acht uff http://)',
+'bold_sample' => 'Wadde fett gmarrickt',
+'bold_tip' => 'Wadde fett gmarrickt',
+'link_sample' => 'Gleecher-Titel',
+'link_tip' => 'Gleecher',
+'extlink_sample' => 'http://www.example.com Gleecher-Text',
+'extlink_tip' => 'Gewebbgleecher (acht uff http://)',
 'headline_sample' => 'Iwwerschrift',
-'headline_tip'    => 'Iwwerschrift Level 2',
-'image_sample'    => 'Beeschpiel.jpg',
-'media_sample'    => 'Beeschpiel.ogg',
-'media_tip'       => 'Gleecher fer Feil',
+'headline_tip' => 'Iwwerschrift Level 2',
+'image_sample' => 'Beeschpiel.jpg',
+'media_sample' => 'Beeschpiel.ogg',
+'media_tip' => 'Gleecher fer Feil',
 
 # Edit pages
-'minoredit'              => 'Nur gleene Enneringe gemacht',
-'watchthis'              => 'Watsch des Blatt',
-'savearticle'            => 'Blatt beilege',
-'preview'                => 'Aagucke',
-'showdiff'               => 'Enneringe zeige',
-'blockednoreason'        => 'ken Grund gewwe',
-'loginreqlink'           => 'kumm nei',
-'newarticle'             => '(Nei)',
-'note'                   => "'''Hieweis:'''",
-'editing'                => '$1 ennere',
-'editingsection'         => 'Ennere vun $1 (Abschnitt)',
-'editingcomment'         => 'Ennere vun $1 (Neier Abschnitt)',
-'editconflict'           => 'Druwwel beim Ennere: $1',
-'yourdiff'               => 'Unnerschidde',
-'templatesused'          => '{{PLURAL:$1|Sell Moddel iss|Selle Moddle sinn}} gyuust vun dem Blatt:',
-'template-protected'     => '(geschitzt)',
+'minoredit' => 'Nur gleene Enneringe gemacht',
+'watchthis' => 'Watsch des Blatt',
+'savearticle' => 'Blatt beilege',
+'preview' => 'Aagucke',
+'showdiff' => 'Enneringe zeige',
+'blockednoreason' => 'ken Grund gewwe',
+'loginreqlink' => 'kumm nei',
+'newarticle' => '(Nei)',
+'note' => "'''Hieweis:'''",
+'editing' => '$1 ennere',
+'editingsection' => 'Ennere vun $1 (Abschnitt)',
+'editingcomment' => 'Ennere vun $1 (Neier Abschnitt)',
+'editconflict' => 'Druwwel beim Ennere: $1',
+'yourdiff' => 'Unnerschidde',
+'templatesused' => '{{PLURAL:$1|Sell Moddel iss|Selle Moddle sinn}} gyuust vun dem Blatt:',
+'template-protected' => '(geschitzt)',
 'template-semiprotected' => '(geschitzt fer neie Yuuser)',
 
 # "Undo" feature
 'undo-summary' => 'Enneringe $1 vun [[Special:Contributions/$2|$2]] ([[User talk:$2|Dischbedutt]]) losgmacht.',
 
 # History pages
-'revisionasof'     => 'Version vum $2, $3 Uhr',
+'revisionasof' => 'Version vum $2, $3 Uhr',
 'previousrevision' => '← letscht Version',
-'nextrevision'     => 'Neiere Version →',
-'next'             => 'Neegschte',
-'last'             => 'Letscht',
-'page_first'       => 'Aafang',
-'page_last'        => 'End',
-'histfirst'        => 'Eldescht',
-'histlast'         => 'Letscht',
-'historysize'      => '({{PLURAL:$1|1 Beit|$1 Beit}})',
-'historyempty'     => '(leer)',
+'nextrevision' => 'Neiere Version →',
+'next' => 'Neegschte',
+'last' => 'Letscht',
+'page_first' => 'Aafang',
+'page_last' => 'End',
+'histfirst' => 'Eldescht',
+'histlast' => 'Letscht',
+'historysize' => '({{PLURAL:$1|1 Beit|$1 Beit}})',
+'historyempty' => '(leer)',
 
 # Revision deletion
-'rev-deleted-comment'        => '(Aamaericking iss weg geduh warre)',
-'rev-deleted-user'           => '(Yuuser-Naame gelöscht)',
-'rev-delundel'               => 'zeig/verschwinne losse',
-'rev-showdeleted'            => 'zeig',
-'revdelete-no-file'          => 'Sell Feil gebt es net.',
+'rev-deleted-comment' => '(Aamaericking iss weg geduh warre)',
+'rev-deleted-user' => '(Yuuser-Naame gelöscht)',
+'rev-delundel' => 'zeig/verschwinne losse',
+'rev-showdeleted' => 'zeig',
+'revdelete-no-file' => 'Sell Feil gebt es net.',
 'revdelete-show-file-submit' => 'Ya',
-'revdelete-hide-text'        => 'Text vun de Version verschwinne losse',
-'revdelete-radio-same'       => '(net ennere)',
-'revdelete-radio-set'        => 'Ya',
-'revdelete-radio-unset'      => 'Nee',
-'revdelete-log'              => 'Grund:',
-'pagehist'                   => 'Gschicht',
-'revdelete-otherreason'      => 'Annere Grind dezu:',
-'revdelete-reasonotherlist'  => 'Annere Grind',
-'revdelete-edit-reasonlist'  => "Grind fer's Lesche ennere",
-'revdelete-offender'         => 'Schreiwer fun daer Version:',
+'revdelete-hide-text' => 'Text vun de Version verschwinne losse',
+'revdelete-radio-same' => '(net ennere)',
+'revdelete-radio-set' => 'Ya',
+'revdelete-radio-unset' => 'Nee',
+'revdelete-log' => 'Grund:',
+'pagehist' => 'Gschicht',
+'revdelete-otherreason' => 'Annere Grind dezu:',
+'revdelete-reasonotherlist' => 'Annere Grind',
+'revdelete-edit-reasonlist' => "Grind fer's Lesche ennere",
+'revdelete-offender' => 'Schreiwer fun daer Version:',
 
 # History merging
 'mergehistory-reason' => 'Grund:',
 
 # Diffs
-'difference' => '(Unnerschidd zwische Versione)',
-'lineno'     => 'Lein $1:',
-'editundo'   => 'losmache',
+'lineno' => 'Lein $1:',
+'editundo' => 'losmache',
 
 # Search results
-'searchresults'                  => 'Results vum Uffgucke',
-'searchresults-title'            => 'Results vum Uffgucke fer „$1“',
-'searchsubtitle'                 => 'Du hoscht nooch \'\'\'[[:$1]]\'\'\' gsucht ([[Special:Prefixindex/$1|alle Bledder wu mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Bledder wu uff "$1" zeige]])',
-'prevn'                          => '{{PLURAL:$1|letscht|letscht $1}}',
-'nextn'                          => 'neegschte {{PLURAL:$1|$1}}',
-'viewprevnext'                   => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-new'                 => "'''Schtaert des Blatt „[[:$1|$1]]“ uf dem Wiki.'''",
-'searchhelp-url'                 => 'Help:Hilf',
-'searchprofile-everything'       => 'Abaddiche',
+'searchresults' => 'Results vum Uffgucke',
+'searchresults-title' => 'Results vum Uffgucke fer „$1“',
+'searchsubtitle' => 'Du hoscht nooch \'\'\'[[:$1]]\'\'\' gsucht ([[Special:Prefixindex/$1|alle Bledder wu mit "$1" aafange]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Bledder wu uff "$1" zeige]])',
+'prevn' => '{{PLURAL:$1|letscht|letscht $1}}',
+'nextn' => 'neegschte {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Zeige ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-new' => "'''Schtaert des Blatt „[[:$1|$1]]“ uf dem Wiki.'''",
+'searchhelp-url' => 'Help:Hilf',
+'searchprofile-everything' => 'Abaddiche',
 'searchprofile-articles-tooltip' => 'Uffgucke in $1',
-'searchprofile-project-tooltip'  => 'Uffgucke in $1',
-'searchprofile-images-tooltip'   => 'Nooch Feils uffgucke',
-'search-result-size'             => '$1 ({{PLURAL:$2|1 Wadd|$2 Wadde}})',
-'search-redirect'                => '(Weiderleiding vun „$1“)',
-'search-section'                 => '(Abschnitt $1)',
-'search-suggest'                 => 'Iss „$1“ gemeent?',
-'search-interwiki-caption'       => 'Schweschder Projects',
-'search-interwiki-default'       => '$1 Results:',
-'search-interwiki-more'          => '(weidere)',
-'search-mwsuggest-enabled'       => 'mit Vorschläch',
-'search-mwsuggest-disabled'      => 'kee Vorschläch',
-'searchall'                      => 'all',
-'powersearch'                    => 'Guck uff',
-'powersearch-ns'                 => 'Guck uff in Blatznaame:',
-'powersearch-redir'              => 'Lischt vun Weiterleidinge',
-'powersearch-field'              => 'Such fer',
-'powersearch-toggleall'          => 'All',
-'powersearch-togglenone'         => 'Ken',
-'search-external'                => 'Guck im Gewebb',
+'searchprofile-project-tooltip' => 'Uffgucke in $1',
+'searchprofile-images-tooltip' => 'Nooch Feils uffgucke',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Wadd|$2 Wadde}})',
+'search-redirect' => '(Weiderleiding vun „$1“)',
+'search-section' => '(Abschnitt $1)',
+'search-suggest' => 'Iss „$1“ gemeent?',
+'search-interwiki-caption' => 'Schweschder Projects',
+'search-interwiki-default' => '$1 Results:',
+'search-interwiki-more' => '(weidere)',
+'search-mwsuggest-enabled' => 'mit Vorschläch',
+'search-mwsuggest-disabled' => 'kee Vorschläch',
+'searchall' => 'all',
+'powersearch' => 'Guck uff',
+'powersearch-ns' => 'Guck uff in Blatznaame:',
+'powersearch-redir' => 'Lischt vun Weiterleidinge',
+'powersearch-field' => 'Such fer',
+'powersearch-toggleall' => 'All',
+'powersearch-togglenone' => 'Ken',
+'search-external' => 'Guck im Gewebb',
 
 # Quickbar
 'qbsettings-none' => 'Ken',
 
 # Preferences page
-'preferences'              => 'paerseenlich Profil',
-'mypreferences'            => 'Mei Uffschtelling',
-'changepassword'           => 'Paesswatt ennere',
-'skin-preview'             => 'Aagucke',
-'prefs-personal'           => 'Yuuser Profile',
-'prefs-watchlist'          => 'Watsch-Lischt',
-'prefs-watchlist-days'     => 'Daage in de Watsch-Lischt:',
-'prefs-resetpass'          => 'Paesswatt ennere',
-'saveprefs'                => 'Uffstellinge beilege',
-'resetprefs'               => 'Ausduh',
-'prefs-editing'            => 'Ennere',
-'columns'                  => 'Kallems:',
-'searchresultshead'        => 'Guck uff',
-'recentchangesdays-max'    => 'Max. $1 {{PLURAL:$1|Daag|Daag}}',
-'timezoneregion-africa'    => 'Afrikaa',
-'timezoneregion-america'   => 'Amerikaa',
-'timezoneregion-asia'      => 'Asie',
+'preferences' => 'paerseenlich Profil',
+'mypreferences' => 'Mei Uffschtelling',
+'changepassword' => 'Paesswatt ennere',
+'skin-preview' => 'Aagucke',
+'prefs-personal' => 'Yuuser Profile',
+'prefs-watchlist' => 'Watsch-Lischt',
+'prefs-watchlist-days' => 'Daage in de Watsch-Lischt:',
+'prefs-resetpass' => 'Paesswatt ennere',
+'saveprefs' => 'Uffstellinge beilege',
+'resetprefs' => 'Ausduh',
+'prefs-editing' => 'Ennere',
+'columns' => 'Kallems:',
+'searchresultshead' => 'Guck uff',
+'recentchangesdays-max' => 'Max. $1 {{PLURAL:$1|Daag|Daag}}',
+'timezoneregion-africa' => 'Afrikaa',
+'timezoneregion-america' => 'Amerikaa',
+'timezoneregion-asia' => 'Asie',
 'timezoneregion-australia' => 'Australie',
-'timezoneregion-europe'    => 'Eiropaa',
-'prefs-namespaces'         => 'Blatznaame',
-'prefs-files'              => 'Feils',
-'prefs-custom-css'         => 'CSS vum Yuuser',
-'prefs-custom-js'          => 'JavaScript vum Yuuser',
-'youremail'                => 'E-Poschde:',
-'username'                 => 'Yuuser-Naame:',
-'uid'                      => 'Yuuser-ID:',
-'prefs-memberingroups'     => 'Mitglied vun de {{PLURAL:$1|Yuuser-Druppe|Yuuser-Druppe}}:',
-'yourlanguage'             => 'Schprooch:',
-'yourgender'               => 'Geschlecht:',
-'gender-female'            => 'Weiblich',
-'email'                    => 'E-Poschde',
-'prefs-signature'          => 'Unnerschrift',
-'prefs-diffs'              => 'Unnerschidd vun Versione',
+'timezoneregion-europe' => 'Eiropaa',
+'prefs-namespaces' => 'Blatznaame',
+'prefs-files' => 'Feils',
+'prefs-custom-css' => 'CSS vum Yuuser',
+'prefs-custom-js' => 'JavaScript vum Yuuser',
+'youremail' => 'E-Poschde:',
+'username' => 'Yuuser-Naame:',
+'uid' => 'Yuuser-ID:',
+'prefs-memberingroups' => 'Mitglied vun de {{PLURAL:$1|Yuuser-Druppe|Yuuser-Druppe}}:',
+'yourlanguage' => 'Schprooch:',
+'yourgender' => 'Geschlecht:',
+'gender-female' => 'Weiblich',
+'email' => 'E-Poschde',
+'prefs-signature' => 'Unnerschrift',
+'prefs-diffs' => 'Unnerschidd vun Versione',
 
 # User rights
 'userrights-editusergroup' => 'Mitgliedschaft vun Yuuser ennere',
-'userrights-groupsmember'  => 'Mitglied vun:',
-'userrights-reason'        => 'Grund:',
+'userrights-groupsmember' => 'Mitglied vun:',
+'userrights-reason' => 'Grund:',
 
 # Groups
-'group'       => 'Druppe:',
-'group-user'  => 'Yuuser',
-'group-bot'   => 'Waddefresser',
+'group' => 'Druppe:',
+'group-user' => 'Yuuser',
+'group-bot' => 'Waddefresser',
 'group-sysop' => 'Verwalter',
-'group-all'   => '(all)',
+'group-all' => '(all)',
 
-'group-user-member'  => '{{GENDER:$1|Yuuser}}',
-'group-bot-member'   => '{{GENDER:$1|Waddefresser}}',
+'group-user-member' => '{{GENDER:$1|Yuuser}}',
+'group-bot-member' => '{{GENDER:$1|Waddefresser}}',
 'group-sysop-member' => '{{GENDER:$1|Verwalter}}',
 
-'grouppage-user'  => '{{ns:project}}:Yuuser',
-'grouppage-bot'   => '{{ns:project}}:Waddefresser',
+'grouppage-user' => '{{ns:project}}:Yuuser',
+'grouppage-bot' => '{{ns:project}}:Waddefresser',
 'grouppage-sysop' => '{{ns:project}}:Verwalter',
 
 # Rights
-'right-read'     => 'Bledder lese',
-'right-edit'     => 'Bledder ennere',
-'right-move'     => 'Bledder ziehe',
+'right-read' => 'Bledder lese',
+'right-edit' => 'Bledder ennere',
+'right-move' => 'Bledder ziehe',
 'right-movefile' => 'Feils ziehe',
-'right-upload'   => 'Feils nuffdraage',
+'right-upload' => 'Feils nuffdraage',
 'right-writeapi' => 'Yuus vun write API',
-'right-delete'   => 'Bledder lesche',
+'right-delete' => 'Bledder lesche',
 
 # User rights log
 'rightsnone' => '(ken)',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read'     => 'es Blatt zu lese',
-'action-edit'     => 'des Blatt zu ennere',
-'action-move'     => 'des Blatt zu ziehe',
+'action-read' => 'es Blatt zu lese',
+'action-edit' => 'des Blatt zu ennere',
+'action-move' => 'des Blatt zu ziehe',
 'action-movefile' => 'Des Feil ziehe',
-'action-upload'   => 'Des Feil ufflaade',
-'action-delete'   => 'des Blatt zu verwische',
+'action-upload' => 'Des Feil ufflaade',
+'action-delete' => 'des Blatt zu verwische',
 
 # Recent changes
-'nchanges'                  => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
-'recentchanges'             => 'Was mer letscht geduh henn',
+'nchanges' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
+'recentchanges' => 'Was mer letscht geduh henn',
 'recentchanges-label-minor' => 'Gleene Ennering',
-'recentchanges-label-bot'   => 'Ennering vun em Waddefresser',
-'rcshowhideminor'           => 'Gleene Enneringe $1',
-'rcshowhidebots'            => 'Bots $1',
-'rcshowhideanons'           => 'IP-Yuuser $1',
-'rcshowhidemine'            => 'Mei Ardickele $1',
-'rclinks'                   => 'Zeig die letscht $1 Enneringe vun de letscht $2 Daag.<br />$3',
-'diff'                      => 'Unnerschidd',
-'hist'                      => 'Gschicht',
-'hide'                      => 'verschwinne losse',
-'show'                      => 'zeige',
-'minoreditletter'           => 'g',
-'newpageletter'             => 'N',
-'boteditletter'             => 'W',
-'rc_categories_any'         => 'All',
-'rc-change-size-new'        => '$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering',
-'newsectionsummary'         => 'Neier Abschnitt /* $1 */',
+'recentchanges-label-bot' => 'Ennering vun em Waddefresser',
+'rcshowhideminor' => 'Gleene Enneringe $1',
+'rcshowhidebots' => 'Bots $1',
+'rcshowhideanons' => 'IP-Yuuser $1',
+'rcshowhidemine' => 'Mei Ardickele $1',
+'rclinks' => 'Zeig die letscht $1 Enneringe vun de letscht $2 Daag.<br />$3',
+'diff' => 'Unnerschidd',
+'hist' => 'Gschicht',
+'hide' => 'verschwinne losse',
+'show' => 'zeige',
+'minoreditletter' => 'g',
+'newpageletter' => 'N',
+'boteditletter' => 'W',
+'rc_categories_any' => 'All',
+'rc-change-size-new' => '$1 {{PLURAL:$1|Beit|Beit}} nooch daer Ennering',
+'newsectionsummary' => 'Neier Abschnitt /* $1 */',
 
 # Recent changes linked
-'recentchangeslinked'      => 'Was on verlinkde Bledder geduh warre iss',
+'recentchangeslinked' => 'Was on verlinkde Bledder geduh warre iss',
 'recentchangeslinked-page' => 'Blatt:',
 
 # Upload
-'upload'             => 'Nuffdraage',
-'uploadbtn'          => 'Feil nuffdraage',
-'uploadlogpage'      => 'Feil-Lochbuch',
-'filename'           => 'Feilnaame',
-'badfilename'        => 'Daer Feilnaame iss gennert warre nooch „$1“.',
-'savefile'           => 'Feil beilege',
-'uploadedimage'      => 'hot „[[$1]]“ uffglaade',
-'overwroteimage'     => 'hot e neie Version vun „[[$1]]“ uffglaade',
-'uploaddisabled'     => 'Ufflaade verbodde',
+'upload' => 'Nuffdraage',
+'uploadbtn' => 'Feil nuffdraage',
+'uploadlogpage' => 'Feil-Lochbuch',
+'filename' => 'Feilnaame',
+'badfilename' => 'Daer Feilnaame iss gennert warre nooch „$1“.',
+'savefile' => 'Feil beilege',
+'uploadedimage' => 'hot „[[$1]]“ uffglaade',
+'overwroteimage' => 'hot e neie Version vun „[[$1]]“ uffglaade',
+'uploaddisabled' => 'Ufflaade verbodde',
 'uploaddisabledtext' => 'Es Ufflaade vun Feils iss verbodde.',
-'watchthisupload'    => 'Watsch des Blatt',
+'watchthisupload' => 'Watsch des Blatt',
 
-'upload-file-error'   => 'Interner Fehler',
+'upload-file-error' => 'Interner Fehler',
 'upload-unknown-size' => 'Unbekannte Grees',
-'upload-http-error'   => 'En HTTP-Fehler iss kumme: $1',
+'upload-http-error' => 'En HTTP-Fehler iss kumme: $1',
 
 # File backend
 'backend-fail-backup' => 'Des Feil $1 iss net zwettgmacht warre.',
@@ -550,41 +549,41 @@ Paesswatt fer nau: $2',
 'upload_source_file' => ' (e Feil uff deim Waddefresser)',
 
 # Special:ListFiles
-'imgfile'         => 'Feil',
-'listfiles'       => 'Lischt vun Feils',
-'listfiles_date'  => 'Datum',
-'listfiles_name'  => 'Naame',
-'listfiles_user'  => 'Yuuser',
-'listfiles_size'  => 'Grees',
+'imgfile' => 'Feil',
+'listfiles' => 'Lischt vun Feils',
+'listfiles_date' => 'Datum',
+'listfiles_name' => 'Naame',
+'listfiles_user' => 'Yuuser',
+'listfiles_size' => 'Grees',
 'listfiles_count' => 'Versione',
 
 # File description page
-'file-anchor-link'    => 'Feil',
-'filehist'            => 'Versione vun Feils',
-'filehist-deleteall'  => 'All Versione lösche',
-'filehist-deleteone'  => 'Sell Version verwische',
-'filehist-revert'     => 'zerick',
-'filehist-datetime'   => 'Version vum',
-'filehist-thumb'      => 'Glee Pikder',
-'filehist-user'       => 'Yuuser',
+'file-anchor-link' => 'Feil',
+'filehist' => 'Versione vun Feils',
+'filehist-deleteall' => 'All Versione lösche',
+'filehist-deleteone' => 'Sell Version verwische',
+'filehist-revert' => 'zerick',
+'filehist-datetime' => 'Version vum',
+'filehist-thumb' => 'Glee Pikder',
+'filehist-user' => 'Yuuser',
 'filehist-dimensions' => 'Grees',
-'filehist-filesize'   => 'Grees vum Feil',
-'filehist-comment'    => 'Aamaericking',
-'imagelinks'          => 'Yuus vun dem Feil',
-'shared-repo-from'    => 'vun $1',
+'filehist-filesize' => 'Grees vum Feil',
+'filehist-comment' => 'Aamaericking',
+'imagelinks' => 'Yuus vun dem Feil',
+'shared-repo-from' => 'vun $1',
 
 # File reversion
 'filerevert-comment' => 'Grund:',
-'filerevert-submit'  => 'Zerick',
+'filerevert-submit' => 'Zerick',
 
 # File deletion
-'filedelete'                  => 'Lösche „$1“',
-'filedelete-comment'          => 'Grund:',
-'filedelete-submit'           => 'Verwische',
-'filedelete-nofile'           => "'''„$1“''' gebt es net.",
-'filedelete-otherreason'      => 'Annere Grind dezu:',
+'filedelete' => 'Lösche „$1“',
+'filedelete-comment' => 'Grund:',
+'filedelete-submit' => 'Verwische',
+'filedelete-nofile' => "'''„$1“''' gebt es net.",
+'filedelete-otherreason' => 'Annere Grind dezu:',
 'filedelete-reason-otherlist' => 'Annerer Gund',
-'filedelete-edit-reasonlist'  => "Grind fer's Lesche ennere",
+'filedelete-edit-reasonlist' => "Grind fer's Lesche ennere",
 
 # MIME search
 'download' => 'Runnerlaade',
@@ -599,327 +598,327 @@ Paesswatt fer nau: $2',
 'randomredirect' => 'Random Weiderleiding',
 
 # Statistics
-'statistics'              => 'Nummere',
+'statistics' => 'Nummere',
 'statistics-header-pages' => 'Nummere vun Bledder',
 'statistics-header-edits' => 'Nummere vun Enneringe',
 'statistics-header-users' => 'Nummere vun Yuuser',
-'statistics-pages'        => 'Bledder',
+'statistics-pages' => 'Bledder',
 
-'doubleredirects'       => 'Zweefache Weiderleidinge',
+'doubleredirects' => 'Zweefache Weiderleidinge',
 'double-redirect-fixer' => 'Xqbot',
 
-'brokenredirects'        => 'Kaputte Weiderleidinge',
-'brokenredirects-edit'   => 'ennere',
+'brokenredirects' => 'Kaputte Weiderleidinge',
+'brokenredirects-edit' => 'ennere',
 'brokenredirects-delete' => 'verwische',
 
 'withoutinterwiki-submit' => 'Zeig',
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|Beit|Beit}}',
-'ncategories'       => '$1 {{PLURAL:$1|Abdeeling|Abdeelinge}}',
-'nlinks'            => '{{PLURAL:$1|1 Gleecher|$1 Gleecher}}',
-'nimagelinks'       => 'Gyuust uff $1 {{PLURAL:$1|Blatt|Bledder}}',
-'ntransclusions'    => 'gyuust uff $1 {{PLURAL:$1|Blatt|Bledder}}',
-'shortpages'        => 'Glee Bledder',
-'longpages'         => 'Grosse Bledder',
-'listusers'         => 'Lischt vun Yuuser',
-'usereditcount'     => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
-'newpages'          => 'Neie Bledder',
+'nbytes' => '$1 {{PLURAL:$1|Beit|Beit}}',
+'ncategories' => '$1 {{PLURAL:$1|Abdeeling|Abdeelinge}}',
+'nlinks' => '{{PLURAL:$1|1 Gleecher|$1 Gleecher}}',
+'nimagelinks' => 'Gyuust uff $1 {{PLURAL:$1|Blatt|Bledder}}',
+'ntransclusions' => 'gyuust uff $1 {{PLURAL:$1|Blatt|Bledder}}',
+'shortpages' => 'Glee Bledder',
+'longpages' => 'Grosse Bledder',
+'listusers' => 'Lischt vun Yuuser',
+'usereditcount' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
+'newpages' => 'Neie Bledder',
 'newpages-username' => 'Yuuser-Naame:',
-'ancientpages'      => 'Eldere Bledder',
-'move'              => 'Ziehe',
-'movethispage'      => 'Blatt ziehe',
-'pager-newer-n'     => '{{PLURAL:$1|neegscht|neegscht $1}}',
-'pager-older-n'     => '{{PLURAL:$1|letscht|letscht $1}}',
+'ancientpages' => 'Eldere Bledder',
+'move' => 'Ziehe',
+'movethispage' => 'Blatt ziehe',
+'pager-newer-n' => '{{PLURAL:$1|neegscht|neegscht $1}}',
+'pager-older-n' => '{{PLURAL:$1|letscht|letscht $1}}',
 
 # Book sources
 'booksources-go' => 'Uffgucke',
 
 # Special:Log
-'specialloguserlabel'  => 'Yuuser:',
+'specialloguserlabel' => 'Yuuser:',
 'speciallogtitlelabel' => 'Titel:',
-'log'                  => 'Logbicher',
+'log' => 'Logbicher',
 
 # Special:AllPages
-'allpages'          => 'Alle Bledder',
-'alphaindexline'    => '$1 bis $2',
-'nextpage'          => 'Neegschtes Blatt ($1)',
-'prevpage'          => 'Letscht Blatt ($1)',
-'allarticles'       => 'Alle Bledder',
-'allinnamespace'    => 'Alle Bledder (Blatznaame: $1)',
+'allpages' => 'Alle Bledder',
+'alphaindexline' => '$1 bis $2',
+'nextpage' => 'Neegschtes Blatt ($1)',
+'prevpage' => 'Letscht Blatt ($1)',
+'allarticles' => 'Alle Bledder',
+'allinnamespace' => 'Alle Bledder (Blatznaame: $1)',
 'allnotinnamespace' => 'Alle Bledder (net vun $1 Blatznaame)',
-'allpagesprev'      => 'Letscht',
-'allpagesnext'      => 'Neegschte',
-'allpagessubmit'    => 'Zeige',
-'allpages-bad-ns'   => '{{SITENAME}} hot ken Blatznaame „$1“.',
+'allpagesprev' => 'Letscht',
+'allpagesnext' => 'Neegschte',
+'allpagessubmit' => 'Zeige',
+'allpages-bad-ns' => '{{SITENAME}} hot ken Blatznaame „$1“.',
 
 # Special:Categories
 'categories' => 'Abdeelinge',
 
 # Special:LinkSearch
-'linksearch'    => 'Gewebbgleecher uffgucke',
+'linksearch' => 'Gewebbgleecher uffgucke',
 'linksearch-ns' => 'Blatznaame:',
 'linksearch-ok' => 'Uffgucke',
 
 # Special:ListUsers
-'listusers-submit'   => 'Zeig',
+'listusers-submit' => 'Zeig',
 'listusers-noresult' => 'Ken Yuuser gfunne.',
 
 # Special:ActiveUsers
-'activeusers-hidebots'   => 'Waddefresser verschwinne losse',
+'activeusers-hidebots' => 'Waddefresser verschwinne losse',
 'activeusers-hidesysops' => 'Verwalter verschwinne losse',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Logbuch vun neie Yuuser',
 
 # Special:ListGroupRights
-'listgrouprights'              => 'Rechte vun Yuuser-Druppe',
-'listgrouprights-group'        => 'Druppe',
-'listgrouprights-rights'       => 'Rechte',
-'listgrouprights-helppage'     => 'Help:Rechte vun Druppe',
-'listgrouprights-members'      => '(Lischt vun Mitglieder)',
-'listgrouprights-addgroup'     => 'Yuuser zu {{PLURAL:$2|daer Druppe|denne Druppe}} dezu duh: $1',
+'listgrouprights' => 'Rechte vun Yuuser-Druppe',
+'listgrouprights-group' => 'Druppe',
+'listgrouprights-rights' => 'Rechte',
+'listgrouprights-helppage' => 'Help:Rechte vun Druppe',
+'listgrouprights-members' => '(Lischt vun Mitglieder)',
+'listgrouprights-addgroup' => 'Yuuser zu {{PLURAL:$2|daer Druppe|denne Druppe}} dezu duh: $1',
 'listgrouprights-addgroup-all' => 'Yuuser zu alle Druppe dezu duh',
 
 # E-mail user
-'emailuser'       => 'E-Poschd fer den Yuuser',
+'emailuser' => 'E-Poschd fer den Yuuser',
 'defemailsubject' => '{{SITENAME}} - E-Poschde vun Yuuser „$1“',
-'emailusername'   => 'Yuuser-Naame:',
-'emailfrom'       => 'Vun:',
-'emailto'         => 'Fer:',
-'emailsend'       => 'Schicke',
-'emailsent'       => 'E-Poscht naus gschickt',
+'emailusername' => 'Yuuser-Naame:',
+'emailfrom' => 'Vun:',
+'emailto' => 'Fer:',
+'emailsend' => 'Schicke',
+'emailsent' => 'E-Poscht naus gschickt',
 
 # Watchlist
-'watchlist'         => 'Mei Watsch-Lischt',
-'mywatchlist'       => 'Mei Watsch-Lischt',
-'watchlistfor2'     => 'Vun $1 $2',
-'watch'             => 'watsche',
-'watchthispage'     => 'watsch des Blatt',
-'unwatch'           => 'Nimmi watsche',
-'unwatchthispage'   => 'Nimmi watsche',
-'notanarticle'      => 'Ken Blatt',
+'watchlist' => 'Mei Watsch-Lischt',
+'mywatchlist' => 'Mei Watsch-Lischt',
+'watchlistfor2' => 'Vun $1 $2',
+'watch' => 'watsche',
+'watchthispage' => 'watsch des Blatt',
+'unwatch' => 'Nimmi watsche',
+'unwatchthispage' => 'Nimmi watsche',
+'notanarticle' => 'Ken Blatt',
 'watchlist-details' => '{{PLURAL:$1|$1 Blatt|$1 Bledder}} uff dei Watch-Lischt, ohne Gschwetz-Bledder',
 'watchlistcontains' => 'Dei Watsch-Lischt hot $1 {{PLURAL:$1|Blatt|Bledder}}.',
-'wlshowlast'        => 'Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder $3.',
+'wlshowlast' => 'Zeig die Enneringe vun de letscht $1 Schtund, $2 Daag odder $3.',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Watsche…',
+'watching' => 'Watsche…',
 'unwatching' => 'Nimmi watsche...',
 
-'enotif_newpagetext'           => 'Sell iss en neies Blatt.',
+'enotif_newpagetext' => 'Sell iss en neies Blatt.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Yuuser',
-'changed'                      => 'gennert',
+'changed' => 'gennert',
 
 # Delete
-'deletepage'             => 'Blatt lesche',
-'exblank'                => 'Blatt war leer',
-'delete-confirm'         => 'Lesche vun „$1“',
-'delete-legend'          => 'Verwische',
-'deletedtext'            => '"$1" iss gelescht warre.
+'deletepage' => 'Blatt lesche',
+'exblank' => 'Blatt war leer',
+'delete-confirm' => 'Lesche vun „$1“',
+'delete-legend' => 'Verwische',
+'deletedtext' => '"$1" iss gelescht warre.
 Guck $2 fer e Lischt vun de letscht Leschunge.',
-'dellogpage'             => 'Lischt vun gelöschte Bledder',
-'deletecomment'          => 'Grund:',
-'deleteotherreason'      => 'Annre Grind:',
-'deletereasonotherlist'  => 'Annerer Grund',
+'dellogpage' => 'Lischt vun gelöschte Bledder',
+'deletecomment' => 'Grund:',
+'deleteotherreason' => 'Annre Grind:',
+'deletereasonotherlist' => 'Annerer Grund',
 'delete-edit-reasonlist' => "Grind fer's Lesche ennere",
 
 # Protect
-'prot_1movedto2'            => 'hot „[[$1]]“ nooch „[[$2]]“ gezoge',
-'protectcomment'            => 'Grund:',
-'protect-default'           => 'All Yuuser',
-'protect-level-sysop'       => 'Nur Verwalter',
-'protect-expiring'          => 'bis $2, $3 Uhr (UTC)',
+'prot_1movedto2' => 'hot „[[$1]]“ nooch „[[$2]]“ gezoge',
+'protectcomment' => 'Grund:',
+'protect-default' => 'All Yuuser',
+'protect-level-sysop' => 'Nur Verwalter',
+'protect-expiring' => 'bis $2, $3 Uhr (UTC)',
 'protect-expiry-indefinite' => 'fer immer',
-'protect-othertime'         => 'Annere Zeit:',
-'protect-othertime-op'      => 'annere Zeit',
-'protect-otherreason'       => 'Annerer Grund:',
-'protect-otherreason-op'    => 'Annerer Grund',
-'protect-expiry-options'    => '1 Schtund:1 hour,1 Daag:1 day,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Munede:6 months,1 Yaar:1 year,Fer immer:infinite',
-'minimum-size'              => 'Min. Grees',
-'maximum-size'              => 'Max. Grees:',
-'pagesize'                  => '(Beit)',
+'protect-othertime' => 'Annere Zeit:',
+'protect-othertime-op' => 'annere Zeit',
+'protect-otherreason' => 'Annerer Grund:',
+'protect-otherreason-op' => 'Annerer Grund',
+'protect-expiry-options' => '1 Schtund:1 hour,1 Daag:1 day,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Munede:6 months,1 Yaar:1 year,Fer immer:infinite',
+'minimum-size' => 'Min. Grees',
+'maximum-size' => 'Max. Grees:',
+'pagesize' => '(Beit)',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Ennere/Tscheensche',
-'restriction-move'   => 'Ziehe',
+'restriction-edit' => 'Ennere/Tscheensche',
+'restriction-move' => 'Ziehe',
 'restriction-create' => 'Schtaerte',
 'restriction-upload' => 'Ufflaade',
 
 # Undelete
-'undeleteviewlink'          => 'aagucke',
-'undeletecomment'           => 'Grund:',
-'undelete-search-submit'    => 'Guck uff',
+'undeleteviewlink' => 'aagucke',
+'undeletecomment' => 'Grund:',
+'undelete-search-submit' => 'Guck uff',
 'undelete-show-file-submit' => 'Ya',
 
 # Namespace form on various pages
-'namespace'      => 'Blatznaame:',
+'namespace' => 'Blatznaame:',
 'blanknamespace' => '(Bledder)',
 
 # Contributions
-'contributions'       => 'Ardickele vum Yuuser',
+'contributions' => 'Ardickele vum Yuuser',
 'contributions-title' => 'Ardickele vun „$1“',
-'mycontris'           => 'Mei Ardickele',
-'contribsub2'         => 'Fer $1 ($2)',
-'uctop'               => '(ewwerscht)',
-'month'               => 'unn Munet:',
-'year'                => 'bis Yaahr:',
-
-'sp-contributions-talk'     => 'Gschwetz',
-'sp-contributions-search'   => 'Guck fer Ardickel',
+'mycontris' => 'Mei Ardickele',
+'contribsub2' => 'Fer $1 ($2)',
+'uctop' => '(ewwerscht)',
+'month' => 'unn Munet:',
+'year' => 'bis Yaahr:',
+
+'sp-contributions-talk' => 'Gschwetz',
+'sp-contributions-search' => 'Guck fer Ardickel',
 'sp-contributions-username' => 'IP-Adress odder Yuusernaame:',
-'sp-contributions-submit'   => 'Guck uff',
+'sp-contributions-submit' => 'Guck uff',
 
 # What links here
-'whatlinkshere'            => 'Was doher zeigt',
-'whatlinkshere-page'       => 'Blatt:',
-'isredirect'               => 'Weiderleidingsblatt',
-'isimage'                  => 'Gleecher fer Feil',
-'whatlinkshere-prev'       => '{{PLURAL:$1|letscht|letscht $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|neegschter|neegschte $1}}',
-'whatlinkshere-links'      => '← Gleecher',
+'whatlinkshere' => 'Was doher zeigt',
+'whatlinkshere-page' => 'Blatt:',
+'isredirect' => 'Weiderleidingsblatt',
+'isimage' => 'Gleecher fer Feil',
+'whatlinkshere-prev' => '{{PLURAL:$1|letscht|letscht $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|neegschter|neegschte $1}}',
+'whatlinkshere-links' => '← Gleecher',
 'whatlinkshere-hideredirs' => 'Weiderleidinge $1',
-'whatlinkshere-hidelinks'  => 'Gleecher $1',
+'whatlinkshere-hidelinks' => 'Gleecher $1',
 'whatlinkshere-hideimages' => 'Feil Gleecher $1',
 
 # Block/unblock
-'block'              => 'Yuuser aabinne',
-'blockip'            => 'Yuuser aabinne',
-'blockip-title'      => 'Yuuser aabinne',
-'blockip-legend'     => 'Yuuser aabinne',
+'block' => 'Yuuser aabinne',
+'blockip' => 'Yuuser aabinne',
+'blockip-title' => 'Yuuser aabinne',
+'blockip-legend' => 'Yuuser aabinne',
 'ipadressorusername' => 'IP-Adress odder Yuusernaame:',
-'ipbreason'          => 'Grund:',
+'ipbreason' => 'Grund:',
 'ipbreasonotherlist' => 'Annerer Grund',
-'ipbsubmit'          => 'Daen Yuuser aabinne',
-'ipbother'           => 'Annere Zeit (englisch):',
-'ipboptions'         => '2 Schtund:2 hours,1 Daag:1 day,3 Daag:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Monate:6 months,1 Yaar:1 year,Fer immer:infinite',
-'ipbotheroption'     => 'Anneres',
-'ipbotherreason'     => 'Annerer Grund:',
-'blocklist-reason'   => 'Grund',
+'ipbsubmit' => 'Daen Yuuser aabinne',
+'ipbother' => 'Annere Zeit (englisch):',
+'ipboptions' => '2 Schtund:2 hours,1 Daag:1 day,3 Daag:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Munet:1 month,3 Munede:3 months,6 Monate:6 months,1 Yaar:1 year,Fer immer:infinite',
+'ipbotheroption' => 'Anneres',
+'ipbotherreason' => 'Annerer Grund:',
+'blocklist-reason' => 'Grund',
 'ipblocklist-submit' => 'Guck uff',
-'infiniteblock'      => 'fer immer',
-'blocklink'          => 'Aabinne',
-'contribslink'       => 'Ardickele',
-'proxyblocksuccess'  => 'Geduh.',
+'infiniteblock' => 'fer immer',
+'blocklink' => 'Aabinne',
+'contribslink' => 'Ardickele',
+'proxyblocksuccess' => 'Geduh.',
 
 # Move page
-'move-page'               => '„$1“ ziehe',
-'move-page-legend'        => 'Blatt ziehe',
-'movearticle'             => 'Blatt ziehe:',
-'move-watch'              => 'watsch des Blatt',
-'movepagebtn'             => 'Blatt ziehe',
-'pagemovedsub'            => 'Blatt iss gezoge warre',
-'movepage-moved'          => "'''Es Blatt „$1“ iss gezoge warre uff „$2“'''",
-'movedto'                 => 'gezoge uff',
-'movereason'              => 'Grund:',
-'revertmove'              => 'zerick ziehe',
+'move-page' => '„$1“ ziehe',
+'move-page-legend' => 'Blatt ziehe',
+'movearticle' => 'Blatt ziehe:',
+'move-watch' => 'watsch des Blatt',
+'movepagebtn' => 'Blatt ziehe',
+'pagemovedsub' => 'Blatt iss gezoge warre',
+'movepage-moved' => "'''Es Blatt „$1“ iss gezoge warre uff „$2“'''",
+'movedto' => 'gezoge uff',
+'movereason' => 'Grund:',
+'revertmove' => 'zerick ziehe',
 'delete_and_move_confirm' => 'Ya, es Blatt lösche',
 
 # Export
-'export'          => 'Bledder exportiere',
-'export-addcat'   => 'Dezu duh',
-'export-addns'    => 'Dezu duh',
+'export' => 'Bledder exportiere',
+'export-addcat' => 'Dezu duh',
+'export-addns' => 'Dezu duh',
 'export-download' => 'As XML-Feil annelege',
 
 # Namespace 8 related
-'allmessagesname'               => 'Naame',
+'allmessagesname' => 'Naame',
 'allmessages-filter-unmodified' => 'Net gennert',
-'allmessages-filter-all'        => 'All',
-'allmessages-filter-modified'   => 'Gennert',
-'allmessages-language'          => 'Schprooch:',
-'allmessages-filter-submit'     => 'Los',
+'allmessages-filter-all' => 'All',
+'allmessages-filter-modified' => 'Gennert',
+'allmessages-language' => 'Schprooch:',
+'allmessages-filter-submit' => 'Los',
 
 # Thumbnails
 'thumbnail-more' => 'greeser mache',
 
 # Special:Import
 'import-upload-filename' => 'Feilnaame:',
-'import-comment'         => 'Aamaerricking:',
-'import-revision-count'  => '– {{PLURAL:$1|1 Version|$1 Versione}}',
+'import-comment' => 'Aamaerricking:',
+'import-revision-count' => '– {{PLURAL:$1|1 Version|$1 Versione}}',
 
 # Import log
-'import-logentry-upload-detail'    => '$1 {{PLURAL:$1|Version|Versione}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|Version|Versione}}',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|Version|Versione}} vun $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'Dei Yuuser-Blatt',
-'tooltip-pt-mytalk'              => 'Dei Gschwetz-Blatt',
-'tooltip-pt-preferences'         => 'Mei Uffschtelling',
-'tooltip-pt-mycontris'           => 'Lischt vun deine Ardickel',
-'tooltip-pt-login'               => 'Du kannscht Dich aamelde, awwer du muschts net',
-'tooltip-pt-logout'              => 'Geh naus',
-'tooltip-ca-talk'                => 'Iwwer sell Blatt dischbediere',
-'tooltip-ca-edit'                => 'Du kannscht des Blatt ennere. Bitte brauch de Aaguck-Gnopp vor em Speichere.',
-'tooltip-ca-history'             => 'Ledschde Versione vun dem Blattt',
-'tooltip-ca-protect'             => 'Des Blatt schitze',
-'tooltip-ca-delete'              => 'Des Blatt verwische',
-'tooltip-ca-move'                => 'Des Blatt ziehe',
-'tooltip-search'                 => 'Guck uff {{SITENAME}}',
-'tooltip-search-go'              => 'Geh zu dem Blatt mit genaa dem Naame, wenns es gebbt.',
-'tooltip-search-fulltext'        => 'Guck nooch Bledder mit denne Wadde',
-'tooltip-p-logo'                 => 'Haaptblatt',
-'tooltip-n-mainpage'             => 'Zum Haaptblatt geh',
+'tooltip-pt-userpage' => 'Dei Yuuser-Blatt',
+'tooltip-pt-mytalk' => 'Dei Gschwetz-Blatt',
+'tooltip-pt-preferences' => 'Mei Uffschtelling',
+'tooltip-pt-mycontris' => 'Lischt vun deine Ardickel',
+'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muschts net',
+'tooltip-pt-logout' => 'Geh naus',
+'tooltip-ca-talk' => 'Iwwer sell Blatt dischbediere',
+'tooltip-ca-edit' => 'Du kannscht des Blatt ennere. Bitte brauch de Aaguck-Gnopp vor em Speichere.',
+'tooltip-ca-history' => 'Ledschde Versione vun dem Blattt',
+'tooltip-ca-protect' => 'Des Blatt schitze',
+'tooltip-ca-delete' => 'Des Blatt verwische',
+'tooltip-ca-move' => 'Des Blatt ziehe',
+'tooltip-search' => 'Guck uff {{SITENAME}}',
+'tooltip-search-go' => 'Geh zu dem Blatt mit genaa dem Naame, wenns es gebbt.',
+'tooltip-search-fulltext' => 'Guck nooch Bledder mit denne Wadde',
+'tooltip-p-logo' => 'Haaptblatt',
+'tooltip-n-mainpage' => 'Zum Haaptblatt geh',
 'tooltip-n-mainpage-description' => 'Haaptblatt bsuche',
-'tooltip-n-portal'               => 'Iwwers Projekt, was de duhn kannscht, wo de ebbes finnscht',
-'tooltip-n-recentchanges'        => 'D Lischt vun de letschte Enneringe in dem Wiki',
-'tooltip-n-randompage'           => 'Ennich Ardickel',
-'tooltip-n-help'                 => 'Hilf-Blatt zeige',
-'tooltip-t-whatlinkshere'        => 'Lischt vun all die Bledder, wu do her zeige',
-'tooltip-t-recentchangeslinked'  => 'Letschte Enneringe in Bledder, wu vun do verlinkt sinn',
-'tooltip-feed-rss'               => 'RSS-Feed fer des Blatt',
-'tooltip-feed-atom'              => 'Atom-Feed fer des Blatt',
-'tooltip-t-contributions'        => 'Lischt von Ardickele vun dem Yuuser zeige',
-'tooltip-t-emailuser'            => 'Dem Yuuser e E-Poschd schicke',
-'tooltip-t-upload'               => 'Feils nuffdraage',
-'tooltip-t-specialpages'         => 'Lischt vun alle besunnere Bledder',
-'tooltip-t-print'                => 'Des Blatt fer zum Drucke',
-'tooltip-t-permalink'            => 'En permanent Gleecher zu derre Version vun dem Blatt',
-'tooltip-ca-nstab-main'          => 'Inhalt vun dem Blatt aagucke',
-'tooltip-ca-nstab-user'          => 'Yuuserblatt zeige',
-'tooltip-ca-nstab-special'       => 'Sell iss en besunneres Blatt. Du kannscht es Blatt net ennere.',
-'tooltip-ca-nstab-image'         => 'Feil zeige',
-'tooltip-ca-nstab-template'      => 'Moddel aagucke',
-'tooltip-save'                   => 'Enneringe beilege',
+'tooltip-n-portal' => 'Iwwers Projekt, was de duhn kannscht, wo de ebbes finnscht',
+'tooltip-n-recentchanges' => 'D Lischt vun de letschte Enneringe in dem Wiki',
+'tooltip-n-randompage' => 'Ennich Ardickel',
+'tooltip-n-help' => 'Hilf-Blatt zeige',
+'tooltip-t-whatlinkshere' => 'Lischt vun all die Bledder, wu do her zeige',
+'tooltip-t-recentchangeslinked' => 'Letschte Enneringe in Bledder, wu vun do verlinkt sinn',
+'tooltip-feed-rss' => 'RSS-Feed fer des Blatt',
+'tooltip-feed-atom' => 'Atom-Feed fer des Blatt',
+'tooltip-t-contributions' => 'Lischt von Ardickele vun dem Yuuser zeige',
+'tooltip-t-emailuser' => 'Dem Yuuser e E-Poschd schicke',
+'tooltip-t-upload' => 'Feils nuffdraage',
+'tooltip-t-specialpages' => 'Lischt vun alle besunnere Bledder',
+'tooltip-t-print' => 'Des Blatt fer zum Drucke',
+'tooltip-t-permalink' => 'En permanent Gleecher zu derre Version vun dem Blatt',
+'tooltip-ca-nstab-main' => 'Inhalt vun dem Blatt aagucke',
+'tooltip-ca-nstab-user' => 'Yuuserblatt zeige',
+'tooltip-ca-nstab-special' => 'Sell iss en besunneres Blatt. Du kannscht es Blatt net ennere.',
+'tooltip-ca-nstab-image' => 'Feil zeige',
+'tooltip-ca-nstab-template' => 'Moddel aagucke',
+'tooltip-save' => 'Enneringe beilege',
 
 # Attribution
-'siteuser'  => '{{SITENAME}}-Yuuser $1',
-'others'    => 'annere',
+'siteuser' => '{{SITENAME}}-Yuuser $1',
+'others' => 'annere',
 'siteusers' => '{{SITENAME}}-{{PLURAL:$2|Yuuser|Yuuser}} $1',
 
 # Info page
-'pageinfo-header-edits'     => 'Enneringe',
+'pageinfo-header-edits' => 'Enneringe',
 'pageinfo-header-watchlist' => 'Watsch-Lischt',
-'pageinfo-subjectpage'      => 'Blatt',
-'pageinfo-talkpage'         => 'Gschwetz-Blatt',
+'pageinfo-subjectpage' => 'Blatt',
+'pageinfo-talkpage' => 'Gschwetz-Blatt',
 
 # Browsing diffs
 'nextdiff' => 'Zum neegschte Versionsunnerschidd →',
 
 # Media information
 'widthheightpage' => '$1 × $2, {{PLURAL:$3|1 Blatt|$3 Bledder}}',
-'file-info-size'  => '$1 × $2 Pixel, Daadegrees: $3, MIME-Typ: $4',
+'file-info-size' => '$1 × $2 Pixel, Daadegrees: $3, MIME-Typ: $4',
 
 # Special:NewFiles
 'showhidebots' => '(Bots $1)',
-'noimages'     => 'Keene Feils gfunne.',
-'ilsubmit'     => 'Guck uff',
+'noimages' => 'Keene Feils gfunne.',
+'ilsubmit' => 'Guck uff',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'seconds' => '{{PLURAL:$1|$1 Sekund|$1 Sekunde}}',
 'minutes' => '{{PLURAL:$1|$1 Minudd|$1 Minudde}}',
-'hours'   => '{{PLURAL:$1|ee Schtund|$1 Schtunde}}',
-'days'    => '{{PLURAL:$1|een Daag|$1 Daag}}',
-'ago'     => 'vor $1',
+'hours' => '{{PLURAL:$1|ee Schtund|$1 Schtunde}}',
+'days' => '{{PLURAL:$1|een Daag|$1 Daag}}',
+'ago' => 'vor $1',
 
 # Metadata
 'metadata' => 'Metadaade',
 
 # EXIF tags
-'exif-imagelength'  => 'Leng',
-'exif-software'     => 'Geyuust Software',
-'exif-usercomment'  => 'Anmaerrickinge vun Yuuser',
-'exif-gpsaltitude'  => 'Heech',
-'exif-writer'       => 'Schreiwer',
+'exif-imagelength' => 'Leng',
+'exif-software' => 'Geyuust Software',
+'exif-usercomment' => 'Anmaerrickinge vun Yuuser',
+'exif-gpsaltitude' => 'Heech',
+'exif-writer' => 'Schreiwer',
 'exif-languagecode' => 'Schprooch',
 
 'exif-subjectdistance-value' => '$1 Meter',
@@ -933,8 +932,8 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'all',
 'namespacesall' => 'all',
-'monthsall'     => 'all',
-'limitall'      => 'all',
+'monthsall' => 'all',
+'limitall' => 'all',
 
 # Scary transclusion
 'scarytranscludetoolong' => '[URL iss zu lang]',
@@ -943,31 +942,31 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'confirm_purge_button' => 'OK',
 
 # action=watch/unwatch
-'confirm-watch-button'   => 'OK',
+'confirm-watch-button' => 'OK',
 'confirm-unwatch-button' => 'OK',
 
 # Separators for various lists, etc.
 'ellipsis' => '…',
-'percent'  => '$1&nbsp;%',
+'percent' => '$1&nbsp;%',
 
 # Multipage image navigation
 'imgmultipageprev' => '← letscht Blatt',
 'imgmultipagenext' => 'neegschtes Blatt →',
-'imgmultigo'       => 'OK',
-'imgmultigoto'     => 'Geh zu Blatt $1',
+'imgmultigo' => 'OK',
+'imgmultigoto' => 'Geh zu Blatt $1',
 
 # Table pager
-'ascending_abbrev'         => 'uff',
-'descending_abbrev'        => 'ab',
-'table_pager_next'         => 'Neegschtes Blatt',
-'table_pager_prev'         => 'Letscht Blatt',
-'table_pager_first'        => 'Erschtes Blatt',
-'table_pager_last'         => 'Letscht Blatt',
+'ascending_abbrev' => 'uff',
+'descending_abbrev' => 'ab',
+'table_pager_next' => 'Neegschtes Blatt',
+'table_pager_prev' => 'Letscht Blatt',
+'table_pager_first' => 'Erschtes Blatt',
+'table_pager_last' => 'Letscht Blatt',
 'table_pager_limit_submit' => 'Geh los',
 
 # Auto-summaries
 'autosumm-blank' => 'Des Blatt iss leer gmacht worre.',
-'autosumm-new'   => 'Des Blatt is gschtaert warre: „$1“',
+'autosumm-new' => 'Des Blatt is gschtaert warre: „$1“',
 
 # Live preview
 'livepreview-loading' => 'Laade…',
@@ -976,38 +975,38 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'watchlistedit-normal-title' => 'Watsch-Lischt ennere',
 
 # Special:Version
-'version'                  => 'Version',
-'version-specialpages'     => 'Besunnere Bledder',
-'version-other'            => 'Anneres',
-'version-mediahandlers'    => 'Media-Haendlers',
-'version-version'          => '(Version $1)',
+'version' => 'Version',
+'version-specialpages' => 'Besunnere Bledder',
+'version-other' => 'Anneres',
+'version-mediahandlers' => 'Media-Haendlers',
+'version-version' => '(Version $1)',
 'version-poweredby-others' => 'annere',
 'version-software-version' => 'Version',
 
 # Special:FilePath
-'filepath'        => 'Feilpaad',
-'filepath-page'   => 'Feil:',
+'filepath' => 'Feilpaad',
+'filepath-page' => 'Feil:',
 'filepath-submit' => 'Geh',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Feilnaame:',
-'fileduplicatesearch-submit'   => 'Uffgucke',
+'fileduplicatesearch-submit' => 'Uffgucke',
 
 # Special:SpecialPages
-'specialpages'                 => 'Besunnere Bledder',
-'specialpages-group-other'     => 'Annere besunnere Bledder',
-'specialpages-group-login'     => 'Kumm nei',
-'specialpages-group-users'     => 'Yuuser unn Rechte',
-'specialpages-group-pages'     => 'Lischde vun Bledder',
+'specialpages' => 'Besunnere Bledder',
+'specialpages-group-other' => 'Annere besunnere Bledder',
+'specialpages-group-login' => 'Kumm nei',
+'specialpages-group-users' => 'Yuuser unn Rechte',
+'specialpages-group-pages' => 'Lischde vun Bledder',
 'specialpages-group-pagetools' => 'Gscharr fer Bledder',
 'specialpages-group-redirects' => 'Besunnere Bledder wu weiderleide',
-'specialpages-group-spam'      => 'Spam-Gscharr',
+'specialpages-group-spam' => 'Spam-Gscharr',
 
 # Special:BlankPage
 'blankpage' => 'Leeres Blatt',
 
 # Special:Tags
-'tags-edit'     => 'ennere',
+'tags-edit' => 'ennere',
 'tags-hitcount' => '$1 {{PLURAL:$1|Ennering|Enneringe}}',
 
 # Special:ComparePages
@@ -1015,7 +1014,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'compare-page2' => 'Blatt 2',
 
 # HTML forms
-'htmlform-reset'               => 'Enneringe losmache',
+'htmlform-reset' => 'Enneringe losmache',
 'htmlform-selectorother-other' => 'Annere',
 
 # Feedback
index bac0984..64430a7 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Als-Holder
  * @author M-sch
+ * @author Manuae
  * @author SPS
  * @author Xqt
  */
@@ -19,380 +20,394 @@ $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' => 'Saideschudz änare',
+'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' => 'Änarungsgschischd vun "$1"',
+'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 +419,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 +465,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 +611,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 +640,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 +719,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 +743,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 +762,7 @@ Annere Metadate sinn standardmäßig versteckelt.
 # Special:Tags
 'tags-edit' => 'bearwaide',
 
+# Feedback
+'feedback-close' => 'Erledischd',
+
 );
index 3228901..a0cd772 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Polish (Polski)
+/** Polish (polski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -21,6 +21,7 @@
  * @author Kaganer
  * @author Lajsikonik
  * @author Lampak
+ * @author Lazowik
  * @author Leinad
  * @author Maikking
  * @author Marcin Łukasz Kiejzik
@@ -678,6 +679,8 @@ Uzasadnienie blokady: ''$2''.",
 'filereadonlyerror' => 'Nie można zmodyfikować pliku "$1" ponieważ repozytorium plików "$2" jest w trybie tylko do odczytu.
 
 Administrator blokujący go podał następujący powód "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Nieprawidłowa nazwa w obszarze nazw "$2" o treści "$3"',
+'invalidtitle-unknownnamespace' => 'Nieprawidłowa nazwa z nieznaną liczbą przestrzeni nazw  $1  o treści "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Zła konfiguracja – nieznany skaner antywirusowy ''$1''",
@@ -773,7 +776,7 @@ Poniższe funkcje poczty nie działają.",
 'invalidemailaddress' => 'Adres e‐mail jest niepoprawny i nie może być zaakceptowany.
 Wpisz poprawny adres e‐mail lub wyczyść pole.',
 'cannotchangeemail' => 'Na tej wiki nie ma możliwości zmiany adresu e‐mail przypisanego do konta.',
-'emaildisabled' => 'Ta witryna nie można wysłać wiadomości e-mail.',
+'emaildisabled' => 'Ta witryna nie może wysłać wiadomości e-mail.',
 'accountcreated' => 'Konto zostało utworzone',
 'accountcreatedtext' => 'Konto dla $1 zostało utworzone.',
 'createaccount-title' => 'Utworzenie konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}',
@@ -973,7 +976,8 @@ Strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą
 'updated' => '(Zmodyfikowano)',
 'note' => "'''Uwaga:'''",
 'previewnote' => "'''To jest tylko podgląd'''
-Zmiany nie zostały jeszcze zapisane! [[#editform|→ Kontynuuj edycję]]",
+Zmiany nie zostały jeszcze zapisane!",
+'continue-editing' => 'Kontynuuj edycję',
 'previewconflict' => 'Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.',
 'session_fail_preview' => "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.
 Spróbuj jeszcze raz.
@@ -1054,6 +1058,7 @@ Zdaje się, że została skasowana.',
 'edit-no-change' => 'Twoja edycja została zignorowana, ponieważ nie zmienił{{GENDER:|eś|aś|eś(‐aś)}} niczego w tekście.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
+'defaultmessagetext' => 'Domyślny tekst komunikatu',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.
@@ -1069,6 +1074,12 @@ Argument ten będzie pominięty.',
 'parser-template-loop-warning' => 'Wykryto pętlę w szablonie [[$1]]',
 'parser-template-recursion-depth-warning' => 'Przekroczno limit głębokości rekurencji szablonu ($1)',
 'language-converter-depth-warning' => 'Przekroczono ograniczenie ($1) głębokości zagnieżdżenia konwersji językowej',
+'node-count-exceeded-category' => 'Strony, gdzie przekroczono liczbę węzłów',
+'node-count-exceeded-warning' => 'Strona przekroczyła liczbę węzłów',
+'expansion-depth-exceeded-category' => 'Strony z przekroczoną głębokością rozbudowy',
+'expansion-depth-exceeded-warning' => 'Strona przekroczyła głębokość rozbudowy',
+'parser-unstrip-loop-warning' => 'Wykryto nieskończoną pętlę',
+'parser-unstrip-recursion-limit' => 'Przekroczono maksymalną głębokość zagnieżdżania ($1)',
 
 # "Undo" feature
 'undo-success' => 'Edycja może zostać wycofana. Porównaj ukazane poniżej różnice między wersjami, a następnie zapisz zmiany.',
@@ -1210,7 +1221,7 @@ Proszę sprawdzić rejestr operacji.',
 # Suppression log
 'suppressionlog' => 'Rejestr utajniania',
 'suppressionlogtext' => 'Poniżej znajduje się lista usunięć i blokad utajnionych przed administratorami.
-Zobacz [[Special:BlockList|rejestr blokowania adresów IP]], jeśli chcesz sprawdzić aktualne zakazy i blokady.',
+Zobacz [[Special:BlockList|rejestr blokad]], jeśli chcesz sprawdzić aktualne zakazy i blokady.',
 
 # History merging
 'mergehistory' => 'Scalanie historii stron',
@@ -1244,8 +1255,9 @@ Użycie linków nawigacyjnych kasuje wybór w kolumnie.',
 'mergelogpagetext' => 'Poniżej znajduje się lista ostatnich scaleń historii zmian stron.',
 
 # Diffs
-'history-title' => 'Historia edycji „$1”',
-'difference' => '(Różnice między wersjami)',
+'history-title' => '$1: Historia wersji',
+'difference-title' => '$1: Różnice pomiędzy wersjami',
+'difference-title-multipage' => 'Różnica pomiędzy stronami "$1" i "$2"',
 'difference-multipage' => '(Różnica między stronami)',
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'porównaj wybrane wersje',
@@ -1342,6 +1354,7 @@ Jednak informacje o treści {{GRAMMAR:D.lp|{{SITENAME}}}} mogą być w Google ni
 'prefs-beta' => 'Funkcje testowe',
 'prefs-datetime' => 'Data i czas',
 'prefs-labs' => 'Funkcje doświadczalne',
+'prefs-user-pages' => 'Strony użytkowników',
 'prefs-personal' => 'Dane użytkownika',
 'prefs-rc' => 'Ostatnie zmiany',
 'prefs-watchlist' => 'Obserwowane',
@@ -1559,7 +1572,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 # User rights log
 'rightslog' => 'Uprawnienia',
 'rightslogtext' => 'Rejestr zmian uprawnień użytkowników.',
-'rightslogentry' => 'zmienia przynależność $1 do grup ($2 → $3)',
+'rightslogentry' => 'zmienił przynależność $1 do grup ($2 → $3)',
 'rightslogentry-autopromote' => 'automatycznie zmienia przynależność ($2 → $3)',
 'rightsnone' => 'brak',
 
@@ -1604,7 +1617,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'nchanges' => '$1 {{PLURAL:$1|zmiana|zmiany|zmian}}',
 'recentchanges' => 'Ostatnie zmiany',
 'recentchanges-legend' => 'Opcje ostatnich zmian',
-'recentchangestext' => 'Ta strona przedstawia historię ostatnich zmian w tej wiki.',
+'recentchanges-summary' => 'Ta strona przedstawia historię ostatnich zmian w tej wiki.',
 'recentchanges-feed-description' => 'Obserwuj najświeższe zmiany w tej wiki.',
 'recentchanges-label-newpage' => 'W tej edycji utworzono nową stronę',
 'recentchanges-label-minor' => 'To jest drobna zmiana',
@@ -1816,13 +1829,14 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
 'backend-fail-closetemp' => 'Nie można zamknąć pliku tymczasowego.',
 'backend-fail-read' => 'Nie można odczytać pliku $1.',
 'backend-fail-create' => 'Nie można utworzyć pliku $1.',
-'backend-fail-maxsize' => 'Nie udało utworzyć pliku $1 ponieważ jest on większy niż {{PLURAL:$2|$2 bajt| $2 bajty| $2 bajtów}}.',
+'backend-fail-maxsize' => 'Nie udało zapisać pliku $1 ponieważ jest on większy niż {{PLURAL:$2|jeden bajt| $2 bajty| $2 bajtów}}.',
 'backend-fail-readonly' => 'Interfejs magazynowania "$1" jest obecnie tylko do odczytu. Powód: "$2"',
 'backend-fail-synced' => 'Plik "$1" jest w niespójnym stanie w ramach wewnętrznych funkcji magazynowania',
 'backend-fail-connect' => 'Nie można nawiązać połączenia do wewnętrznych funkcji magazynowania "$1".',
 'backend-fail-internal' => 'Wystąpił nieznany błąd w wewnętrznych funkcjach magazynowania "$1".',
 'backend-fail-contenttype' => 'Nie można określić typ zawartości pliku do przechowywania w "$1".',
 'backend-fail-batchsize' => 'Wewnętrzne funkcje magazynowania otrzymały $1 {{PLURAL:$1|operację|operacje|operacji}} na pliku; limit wynosi $2 {{PLURAL:$2| operacja|operacje|operacji}}.',
+'backend-fail-usable' => 'Nie można zapisać pliku $1 ze względu na niewystarczające uprawnienia lub brak katalogów/kontenerów.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nie można połączyć się z bazą danych dziennika dla backendu magazynowania "$1".',
@@ -1945,6 +1959,10 @@ Dostępna jest też [[Special:WhatLinksHere/$2|pełna lista]].',
 Więcej informacji odnajdziesz na [$2 stronie opisu pliku].',
 'sharedupload-desc-here' => 'Ten plik znajduje się na $1 i może być używany w innych projektach.
 Poniżej znajdują się informacje ze [$2 strony opisu] tego pliku.',
+'sharedupload-desc-edit' => 'Plik ten pochodzi z $1 i może być wykorzystany w innych projektach.
+Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
+'sharedupload-desc-create' => 'Plik ten pochodzi z $1 i może być wykorzystany w innych projektach.
+Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
 'filepage-nofile' => 'Plik o tej nazwie nie istnieje.',
 'filepage-nofile-link' => 'Plik o tej nazwie nie istnieje, ale możesz go [$1 przesłać].',
 'uploadnewversion-linktext' => 'Załaduj nowszą wersję tego pliku',
@@ -2139,6 +2157,7 @@ Inne witryny mogą odwoływać się do tych plików, używając bezpośrednich a
 Możesz zawęzić liczbę wyników poprzez wybranie typu rejestru, nazwy użytkownika albo tytułu strony.',
 'logempty' => 'W rejestrze nie znaleziono pozycji odpowiadających zapytaniu.',
 'log-title-wildcard' => 'Szukaj tytułów zaczynających się od tego tekstu',
+'showhideselectedlogentries' => 'Pokaż/ukryj zaznaczone wpisy rejestru',
 
 # Special:AllPages
 'allpages' => 'Wszystkie strony',
@@ -2158,6 +2177,11 @@ Możesz zawęzić liczbę wyników poprzez wybranie typu rejestru, nazwy użytko
 'allpages-bad-ns' => 'W {{GRAMMAR:MS.lp|{{SITENAME}}}} nie istnieje przestrzeń nazw „$1”.',
 'allpages-hide-redirects' => 'Ukryj przekierowania',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Oglądasz buforowaną wersję tej strony, której wiek to maksymalnie  $1.',
+'cachedspecial-viewing-cached-ts' => 'Oglądasz buforowaną wersję tej strony, który nie może być w pełni aktualny.',
+'cachedspecial-refresh-now' => 'Najpóźniejszy widok.',
+
 # Special:Categories
 'categories' => 'Kategorie',
 'categoriespagetext' => 'Strona przedstawia {{PLURAL:$1|kategorię zawierającą|listę kategorii zawierających}} strony lub pliki.
@@ -2597,8 +2621,8 @@ Podaj powód (np. umieszczając nazwy stron, na których dopuszczono się wandal
 'ipb-confirm' => 'Potwierdzam blokadę',
 'badipaddress' => 'Niepoprawny adres IP',
 'blockipsuccesssub' => 'Zablokowanie powiodło się',
-'blockipsuccesstext' => '{{GENDER:$1|Użytkownik|Użytkowniczka}} [[Special:Contributions/$1|$1]] {{GENDER:$1|został zablokowany|została zablokowana}}.<br />
-Przejdź do [[Special:BlockList|listy zablokowanych adresów IP]], by przejrzeć blokady.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] {{GENDER:$1|został zablokowany|została zablokowana}}.<br />
+Przejdź do [[Special:BlockList|listy blokad]], by przejrzeć blokady.',
 'ipb-blockingself' => 'Usiłujesz zablokować siebie samego! Czy na pewno chcesz to zrobić?',
 'ipb-confirmhideuser' => 'Zamierzasz zablokować użytkownika z włączoną opcją „ukryj użytkownika”. Spowoduje to pominięcie nazwy użytkownika we wszystkich listach i rejestrach. Czy na pewno chcesz to zrobić?',
 'ipb-edit-dropdown' => 'Edytuj listę przyczyn blokady',
@@ -3808,6 +3832,9 @@ Powinieneś otrzymać [{{SERVER}}{{SCRIPTPATH}}/COPYING kopię licencji GNU Gene
 'version-software' => 'Zainstalowane oprogramowanie',
 'version-software-product' => 'Nazwa',
 'version-software-version' => 'Wersja',
+'version-entrypoints' => 'Adres URL punktu wejścia',
+'version-entrypoints-header-entrypoint' => 'Punkt wejścia',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Ścieżka do pliku',
@@ -3929,7 +3956,7 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'revdelete-uname-unhid' => 'wycofano ukrycie nazwy użytkownika',
 'revdelete-restricted' => 'ograniczono widoczność dla administratorów',
 'revdelete-unrestricted' => 'wycofano ograniczenie widoczności dla administratorów',
-'logentry-move-move' => '$1 przenosi stronę $3 na $4',
+'logentry-move-move' => '$1 przenosi stronę $3 do $4',
 'logentry-move-move-noredirect' => '$1 przenosi stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem',
 'logentry-move-move_redir' => '$1 przenosi stronę $3 na $4 w miejsce przekierowania',
 'logentry-move-move_redir-noredirect' => '$1 przenosi stronę $3 na $4 w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
@@ -3995,4 +4022,15 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'api-error-uploaddisabled' => 'Na tej wiki przesyłanie zostało wyłączone.',
 'api-error-verification-error' => 'Plik może być uszkodzony lub nazwa pliku ma nieprawidłowe rozszerzenie.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuty|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|godzina|godziny|godzin}}',
+'duration-days' => '$1 {{PLURAL:$1|dzień|dni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|tydzień|tygodnie|tygodni}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|lata|lat}}',
+'duration-decades' => '$1 {{PLURAL:$1|dziesięciolecie|dekady|dekad}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stulecie|stulecia|stuleci}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tysiąclecie|tysiąclecia|tysiącleci}}',
+
 );
index 6512215..e5c006b 100644 (file)
@@ -48,7 +48,7 @@ $messages = array(
 'tog-hidepatrolled' => "Stërma le modìfiche verificà ant j'ùltime modìfiche",
 'tog-newpageshidepatrolled' => 'Stërma le pàgine verificà da la lista dle pàgine neuve',
 'tog-extendwatchlist' => 'Slarga la funsion "ten sot euj" an manera che a la smon-a tute le modìfiche, nen mach l\'ùltima',
-'tog-usenewrc' => "Deuvra j'ùltime modìfiche an bela forma (a-i va JavaScript)",
+'tog-usenewrc' => "Deuvra j'ùltime modìfiche ameliorà (a-i và JavaScript)",
 'tog-numberheadings' => 'Tìtoj ëd paràgraf<br />che as nùmero daspërlor',
 'tog-showtoolbar' => "Mostra la bara dj'utiss (a-i va Javascript)",
 'tog-editondblclick' => "Dobia sgnacà për modifiché l'artìcol<br />(a-i va JavaScript)",
@@ -424,6 +424,13 @@ Arcesta: $2',
 'ns-specialprotected' => 'As peulo nen modifichesse le pàgine dlë spassi nominal {{ns:special}}.',
 'titleprotected' => "La creassion ëd pàgine con ës tìtol-sì a l'é stàita proibìa da [[User:$1|$1]].
 Coma rason a l'ha butà: ''$2''.",
+'filereadonlyerror' => "As peul pa modifichesse l'archivi «$1» përchè ël depòsit d'archivi «$2» a l'é an sola letura.
+
+L'aministrator ch'a l'ha blocalo a l'ha lassà sta spiegassion: «$3».",
+'invalidtitle-knownnamespace' => 'Tìtol pa bon con spassi nominal "$2" e test "$3"',
+'invalidtitle-unknownnamespace' => 'Tìtol pa bon con spassi nominal sconossù nùmer $1 e test "$2"',
+'exception-nologin' => 'Nen rintrà ant ël sistema',
+'exception-nologin-text' => "Sta pagina o assion a veul ch'it sie intrà dzora a sta wiki.",
 
 # Virus scanner
 'virus-badscanner' => "Configurassion falà: antivìrus nen conossù: ''$1''",
@@ -515,6 +522,7 @@ Da qualsëssìa ëd coste funsion a sarà mandà gnun messagi fin che chiel (chi
 'invalidemailaddress' => "Costa adrëssa ëd pòsta eletrònica-sì as peul nen pijesse përchè a l'ha na forma nen bon-a.
 Për piasì che a buta n'adrëssa scrita giusta ò che a lassa ël camp veujd.",
 'cannotchangeemail' => "J'adrësse ëd pòsta eletrònica dij cont a peulo pa esse modificà ansima a costa wiki.",
+'emaildisabled' => 'Ës sit a peul pa mandé dij mëssagi ëd pòsta eletrònica.',
 'accountcreated' => 'Cont creà',
 'accountcreatedtext' => "Ël cont Utent për $1 a l'é stàit creà.",
 'createaccount-title' => 'Creassion ëd cont për {{SITENAME}}',
@@ -706,7 +714,8 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'updated' => '(Agiornà)',
 'note' => "'''NÒTA:'''",
 'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
-Ij sò cambi a son anco' pa stàita salvà! [[#editform|→ Continua a modifiché]]",
+Ij sò cambi a son anco' pa stàit salvà!",
+'continue-editing' => 'Continua a modifiché',
 'previewconflict' => "Costa preuva a-j mostra ël test dl'artìcol ambelessì dzora. Se a sërn dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
 'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.
 Për piasì che a preuva n'àutra vira. Se a dovèissa mai torna riveje sossì, che a preuva a seurte dal sistema e peuj torna a rintré.'''",
@@ -720,6 +729,7 @@ ant ël quàder ëd modìfica. La rason che a l'é nen stàit acetà a l'é për
 test ch'a-i é già. Sossì dle vire a riva quand un a deuvra un programa proxy ëd coj un pòch dla Bajòna.'''",
 'edit_form_incomplete' => "'''Quàich part dël formolari ëd modìfica a l'é pa rivà al sërvent; contròla doe vire che toe modìfiche a-i sio anco' e preuva torna.'''",
 'editing' => 'Modìfica ëd $1',
+'creating' => 'Creé $1',
 'editingsection' => 'I soma dapress a modifiché $1 (session)',
 'editingcomment' => 'I soma dapress a modifiché $1 (neuva session)',
 'editconflict' => "Conflit d'edission: $1",
@@ -784,6 +794,7 @@ A smija che a sia stàita scancelà.',
 'edit-no-change' => "Toa modìfica a l'é stàita ignorà, përchè a l'é pa stàit fàit gnun cambiament al test.",
 'edit-already-exists' => 'As peul nen creesse la pàgina.
 A esist già.',
+'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions ëd parser.
@@ -799,6 +810,12 @@ Costi paràmeter a son stàit lassà fòra.",
 'parser-template-loop-warning' => 'Trovà na liassa dlë stamp: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Passà ël lìmit ëd ricorsion dlë stamp ($1)',
 'language-converter-depth-warning' => 'Passà lìmit ëd profondità dël convertidor ëd lenghe ($1)',
+'node-count-exceeded-category' => "Pàgine anté che ël nùmer ëd grop a l'é sorpassà",
+'node-count-exceeded-warning' => "La pàgina a l'ha sorpassà ël nùmer ëd grop",
+'expansion-depth-exceeded-category' => "Pàgine anté che la profondeur d'espansion a l'é sorpassà",
+'expansion-depth-exceeded-warning' => "La pàgina a l'ha sorpassà la profondità d'espansion",
+'parser-unstrip-loop-warning' => 'Trovà un sicl nen dësmontàbil',
+'parser-unstrip-recursion-limit' => "Sorpassà ël lìmit d'arcorensa nen dësmontàbil: $1",
 
 # "Undo" feature
 'undo-success' => "Sta modìfica-sì as peul scancelesse. Për piasì, ch'a contròla ambelessì sota për esse sigur che a l'é pro lòn che a veul fé, e peuj ch'as salva lòn ch'a l'ha butà chiel/chila për finì dë scancelé la modìfica ch'a-i era.",
@@ -941,7 +958,7 @@ It peule pa vëddlo.',
 # Suppression log
 'suppressionlog' => 'Registr ëd le scancelassion',
 'suppressionlogtext' => "Sì-sota a-i é na lista djë scancelament e dij blocagi che a rësguardo dij contnù stërmà a j'aministrator.
-Beiché la [[Special:BlockList|lista dj'IP blocà]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
+Beiché la [[Special:BlockList|lista dij blocagi]] për la lista dj'esclusion operassionaj e dij blocagi ativ.",
 
 # History merging
 'mergehistory' => 'Buté ansema je stòrie',
@@ -973,8 +990,9 @@ Ch'a varda mach che a-i ven-a nen fòra un rabel ant la continuità stòrica.",
 'mergelogpagetext' => "Ambelessì sota a-i é na lista dj'ùltime vire che la stòria ëd na pàgina a l'é stàita butà ansema a cola 'd n'àutra.",
 
 # Diffs
-'history-title' => 'Cronologìa dle modìfiche ëd "$1"',
-'difference' => '(Diferense antra revision)',
+'history-title' => '$1: Cronologìa dle modìfiche',
+'difference-title' => '$1: Diferensa tra revision',
+'difference-title-multipage' => 'Diferensa tra le pàgine «$1» e «$2»',
 'difference-multipage' => '(Diferense tra pàgine)',
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Paragon-a le version selessionà',
@@ -1070,6 +1088,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 'prefs-beta' => 'Caraterìstiche dla Beta',
 'prefs-datetime' => 'Data e ora',
 'prefs-labs' => 'Caraterìstiche dël laboratòri',
+'prefs-user-pages' => 'Pàgine utent',
 'prefs-personal' => "Profil dl'utent",
 'prefs-rc' => 'Ùltime modìfiche',
 'prefs-watchlist' => 'Ròba che as ten sot euj',
@@ -1335,7 +1354,7 @@ Costa anformassion a sarà pùblica.",
 'nchanges' => '$1 {{PLURAL:$1|modìfica|modìfiche}}',
 'recentchanges' => 'Ùltime modìfiche',
 'recentchanges-legend' => "Opsion dj'ùltime modìfiche",
-'recentchangestext' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
+'recentchanges-summary' => 'An costa pàgina as ten cont dle modìfiche pì recente a la wiki.',
 'recentchanges-feed-description' => 'Trassé le modìfiche dla wiki pì davzin-e ant ël temp an cost fluss.',
 'recentchanges-label-newpage' => "Sta modìfica-sì a l'ha creà na neuva pàgina",
 'recentchanges-label-minor' => "Costa a l'é na modìfica cita",
@@ -1545,12 +1564,18 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
 'backend-fail-closetemp' => "As peul pa saresse l'archivi temporani.",
 'backend-fail-read' => "As peul pa les-se l'archivi $1.",
 'backend-fail-create' => "As peul pa creesse l'archivi $1.",
+'backend-fail-maxsize' => "As peul pa scrivse l'archivi $1 përchè a l'é pi gròss che {{PLURAL:$2|un byte|$2 byte}}.",
 'backend-fail-readonly' => "Ël dispositiv ëd memòria «$1» a l'é al moment an sola letura. La rason dàita a l'era: «$2»",
 'backend-fail-synced' => "L'archivi «$1» a l'é ant në stat incoerent andrinta ai dispositiv ëd memòria intern",
 'backend-fail-connect' => 'Impossìbil coleghesse al dispositiv ëd memòria «$1».',
 'backend-fail-internal' => "N'eror pa conossù a l'é rivaje ant ël dispositiv ëd memòria «$1».",
 'backend-fail-contenttype' => "As peul pa determinesse la sòrt ëd contnù dl'archivi da memorisé a «$1».",
 'backend-fail-batchsize' => "Ël dispositiv ëd memòria a l'ha dàit un total ëd $1 {{PLURAL:$1|operassion|operassion}} d'archivi; ël lìmit a l'é $2 {{PLURAL:$1|operassion|operassion}}.",
+'backend-fail-usable' => "As peul pa scrivse l'archivi $1 a motiv ëd drit insuficent o liste/contnidor mancant.",
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Impossìbil coleghesse a la base ëd dàit ëd lë scartari për ël terminal ëd memorisassion «$1».',
+'filejournal-fail-dbquery' => 'Impossìbil agiorné la base ëd dàit ëd lë scartari për ël terminal ëd memorisassion «$1».',
 
 # Lock manager
 'lockmanager-notlocked' => "As peul pa dësblochesse «$1»; a l'é nen blocà.",
@@ -1668,6 +1693,10 @@ A l'é disponìbil na [[Special:WhatLinksHere/$2|lista completa]].",
 Për piasì, vëdde la [$2 pàgina ëd descrission ëd l'archivi] per d'àutre anformassion.",
 'sharedupload-desc-here' => "Cost archivi a riva da $1 e a peul esse dovrà da dj'àutri proget.
 La descrission an soa [$2 pàgina ëd dëscrission ëd l'archivi] a l'é smonùa sì-sota.",
+'sharedupload-desc-edit' => "St'archivi-sì a riva da $1 e a peul esse dovrà da d'àutri proget. 
+Peul desse ch'a veula modifiché la descrission dzora soa [pàgina ëd descrission dl'archivi $2] ambelelà.",
+'sharedupload-desc-create' => "St'archivi-sì a riva da $1 e a peul esse dovrà da d'àutri proget. 
+Peul desse ch'a veula modifiché la descrission dzora soa [pàgina ëd descrission dl'archivi $2]",
 'filepage-nofile' => 'A esist gnun archivi con ës nòm.',
 'filepage-nofile-link' => "N'archivi con sto nòm-sì a esist pa, ma a peul [$1 carielo].",
 'uploadnewversion-linktext' => "Carié na version neuva dë st'archivi-sì",
@@ -1862,6 +1891,7 @@ Për piasì, ch'a nòta che d'àutri sit an sl'aragnà a peulo coleghesse a n'ar
 A peul arstrenze la visualisassion an selessionand la sòrt ëd registr, lë stranòm utent (sensìbil a majùscol/minùscol), e la pàgina anteressà (sensìbil a majùscol/minùscol).',
 'logempty' => 'Pa gnun element parèj che a sia trovasse ant ij registr.',
 'log-title-wildcard' => "Sërché ant ij tìtoj ch'as anandio për",
+'showhideselectedlogentries' => 'Smon-e/stërmé le vos ëd registr selessionà',
 
 # Special:AllPages
 'allpages' => 'Tute le pàgine',
@@ -1879,6 +1909,12 @@ A peul arstrenze la visualisassion an selessionand la sòrt ëd registr, lë str
 'allpagesprefix' => "Smon-e le pàgine che a l'han ël prefiss:",
 'allpagesbadtitle' => "Ël tìtol che a l'ha daje a la pàgina a va nen bin, ò pura a l'ha andrinta un prefiss inter-lenga ò inter-wiki. A peul esse ëdcò che a l'abia andrinta dij caràter che as peulo nen dovresse ant ij tìtoj.",
 'allpages-bad-ns' => '{{SITENAME}} a l\'ha pa gnun ëspassi nominal "$1".',
+'allpages-hide-redirects' => 'Stërma le ridiression',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "A l'é ancamin ch'a vëd na version memorisà ëd costa pàgina, che a peul esse veja fin a $1.",
+'cachedspecial-viewing-cached-ts' => "A l'é ancamin ch'a s-ciàira na version memorisà ëd costa pagina, che a peul esse nen completament agiornà.",
+'cachedspecial-refresh-now' => "Varda l'ùltima.",
 
 # Special:Categories
 'categories' => 'Categorìe',
@@ -2320,7 +2356,7 @@ Che a scriva codì che st'adrëssa IP o së stranòm a dev second chiel esse blo
 'badipaddress' => "L'adrëssa IP che a l'ha dane a l'é nen giusta.",
 'blockipsuccesssub' => 'Blocagi fàit',
 'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] a l'é stàit blocà.<br />
-Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij blocagi.",
+Ch'a consulta la [[Special:BlockList|lista dij blocagi]] për rivëdde ij blocagi.",
 'ipb-blockingself' => "A l'é an camin ch'as blòca chiel-midem! É-lo sigur ëd vorèj fé lòn?",
 'ipb-confirmhideuser' => "A l'é an camin ch'a blòca n'utent con «stërmé l'utent» abilità. Sòn a gaverà lë stranòm ëd l'utent da tute le liste e le vos ëd registr. É-lo sigur ëd vorèj fé lòn?",
 'ipb-edit-dropdown' => 'Modifiché le rason dël blocagi',
@@ -2372,7 +2408,7 @@ Ch'a consulta la [[Special:BlockList|lista dj'IP blocà]] për rivëdde ij bloca
 'reblock-logentry' => "a l'ha cambià j'ampostassion dël blocagi për [[$1]] con na scadensa ai $2 $3",
 'blocklogtext' => "Sossì a l'é ël registr dij blocagi e dësblocagi dj'Utent. J'adrësse che
 a son ëstàite blocà n'automàtich ambelessì a së s-ciàiro nen.
-Che a varda la [[Special:BlockList|lista dj'adrësse IP blocà]] për vëdde
+Che a varda la [[Special:BlockList|lista dij blocagi]] për vëdde
 coj che sio ij blocagi ativ al dì d'ancheuj.",
 'unblocklogentry' => "a l'ha dësblocà $1",
 'block-log-flags-anononly' => 'mach utent anònim',
@@ -2468,104 +2504,104 @@ për podèj tramudé na pàgina.",
 'movenotallowed' => "A l'ha pa ij përmess dont a fa da manca për tramudé le pàgine.",
 'movenotallowedfile' => "A l'ha pa ij përmess për tramudé j'archivi.",
 'cant-move-user-page' => "A l'ha pa ij përmess për tramudé le pàgine d'utent (gavà le sot-pàgine).",
-'cant-move-to-user-page' => "It l'has pa ij përmess për tramudé na pàgina a na pàgina utent (an gavand a na sotpàgina utent).",
+'cant-move-to-user-page' => "A l'ha pa ël përmess për tramudé na pàgina a na pàgina utent (gavà a na sot-pàgina utent).",
 'newtitle' => 'Neuv tìtol ëd',
-'move-watch' => 'Ten sot euj sta pàgina-sì',
-'movepagebtn' => 'Tramuda sta pàgina-sì',
+'move-watch' => 'Ten-e sot-euj la pàgina sorgiss e la pàgina selessionà',
+'movepagebtn' => 'Tramudé la pàgina',
 'pagemovedsub' => 'San Martin bele finì!',
-'movepage-moved' => "'''\"\$1\" a l'é stàit spostà a \"\$2\"'''",
-'movepage-moved-redirect' => "A l'é stàita creà na rediression.",
+'movepage-moved' => "'''«$1» a l'é stàit tramudà a «$2»'''",
+'movepage-moved-redirect' => "A l'é stàita creà na ridiression.",
 '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'articol.",
-'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",
+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à 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à.",
-'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)',
+'movetalk' => "Tramudé ëdcò la pàgina ëd discussion che a l'ha tacà",
+'move-subpages' => 'Tramudé le sot-pàgine (fin a $1)',
+'move-talk-subpages' => 'Tramudé le sot-pàgine ëd la pàgina ëd discussion (fin a $1)',
 'movepage-page-exists' => 'La pàgina $1 a esist già e a peul pa esse coatà automaticament.',
 'movepage-page-moved' => "La pàgina $1 a l'é stàita tramudà a $2.",
 'movepage-page-unmoved' => 'La pàgina $1 a peul pa esse tramudà a $2.',
-'movepage-max-pages' => "Ël massim ëd {{PLURAL:$1|na pàgina a l'é stàita |$1 pàgine a son stàite}} tramudà e a na saran pa pì tramudà automaticament.",
+'movepage-max-pages' => "Ël màssim ëd {{PLURAL:$1|na pàgina|pàgine}} a l'é stàit tramudà e a na saran pa pì tramudà automaticament.",
 'movelogpage' => 'Registr dij San Martin',
-'movelogpagetext' => 'Ambelessì sota a-i é na lista ëd pàgine che a son staite tramudà.',
-'movesubpage' => '{{PLURAL:$1|Sotpàgina|Sotpàgine}}',
-'movesubpagetext' => "Sta pàgina-sì a l'ha $1 {{PLURAL:$1|sotpàgina|sotpàgine}} mostà ambelessì.",
-'movenosubpage' => "Sta pàgina-sì a l'ha pa ëd sotpàgine.",
+'movelogpagetext' => 'Ambelessì sota a-i é na lista ëd tute le pàgine che a son ëstàite tramudà.',
+'movesubpage' => '{{PLURAL:$1|Sot-pàgina|Sot-pàgine}}',
+'movesubpagetext' => "Costa pàgina-sì a l'ha $1 {{PLURAL:$1|sot-pàgina|sot-pàgine}} smonùe sì-sota.",
+'movenosubpage' => "Sta pàgina-sì a l'ha gnun-e sot-pàgine.",
 'movereason' => 'Rason:',
-'revertmove' => "buta torna coma a l'era",
-'delete_and_move' => 'Scancela e tramuda',
-'delete_and_move_text' => '==A fa da manca dë scancelé==
-
-L\'artìcol ëd destinassion "[[:$1]]" a-i é già. Veul-lo scancelelo për avej ëd pòst për tramudé l\'àutr?',
-'delete_and_move_confirm' => 'É, scancela la pàgina',
-'delete_and_move_reason' => 'Scancelà për liberé ël pòst për tramudé "[[$1]]"',
-'selfmove' => "Tìtol neuv e tìtol vej a resto midem antra lor; as peul pa tramudesse na pàgina butand-la andoa che a l'é già.",
-'immobile-source-namespace' => 'As peul pa tramudé ëd pàgine ant ël namespace "$1"',
-'immobile-target-namespace' => 'As peul pa tramudé ëd pàgine ant ël namespace "$1"',
-'immobile-target-namespace-iw' => "Un colegament interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
+'revertmove' => "buté torna coma a l'era",
+'delete_and_move' => 'Scancelé e tramudé',
+'delete_and_move_text' => "==A fa da manca dë scancelé==
+
+L'artìcol ëd destinassion «[[:$1]]» a-i é già. Veul-lo scancelelo për avèj ëd pòst për tramudé l'àutr?",
+'delete_and_move_confirm' => 'É, scancelé la pàgina',
+'delete_and_move_reason' => 'Scancelà për liberé ël pòst për tramudé «[[$1]]»',
+'selfmove' => "Tìtol neuv e tìtol vej a resto midem antra 'd lor; as peul pa tramudesse na pàgina butand-la andoa che a l'é già.",
+'immobile-source-namespace' => 'A peul pa tramudé le pàgine ant lë spassi nominal «$1»',
+'immobile-target-namespace' => 'A peul pa tramudé dle pàgine vers lë spassi nominal «$1»',
+'immobile-target-namespace-iw' => "Na liura interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
 'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
-'immobile-target-page' => 'As peul pa tramudess al tìtol dë sta destinassion-sì.',
-'imagenocrossnamespace' => 'As peul pa tramudé un file fòra dal sò namespace',
+'immobile-target-page' => 'As peul pa tramudesse vers cost tìtol ëd destinassion.',
+'imagenocrossnamespace' => "As peul pa tramudesse n'archivi a në spassi nominal diferent",
 'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
-'imagetypemismatch' => 'La neuva estension dël file a corispond pa a sò tipo',
-'imageinvalidfilename' => "Ël nòm dël file pontà a l'é pa vàlid",
-'fix-double-redirects' => 'Modìfica minca rediression che a ponta al tìtol original',
-'move-leave-redirect' => 'Lassa na rediression',
-'protectedpagemovewarning' => "'''Avis:''' Sta pàgina-sì a l'é stàita blocà parèj che mach utent con drit d'aministrator a peulo tramudela.
+'imagetypemismatch' => "La neuva estension ëd l'archivi a corispond pa a sò tipo",
+'imageinvalidfilename' => "Ël nòm ëd l'archivi bërsaj a l'é nen bon",
+'fix-double-redirects' => 'Agiorné tute le ridiression che a ponto vers ël tìtol original',
+'move-leave-redirect' => 'Lassé na ridiression',
+'protectedpagemovewarning' => "'''Avis:''' Sta pàgina-sì a l'é stàita blocà parèj che mach j'utent con ij drit d'aministrator a peulo tramudela.
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
 'semiprotectedpagemovewarning' => "'''Nòta:''' Sta pàgina-sì a l'é stàita blocà parèj che mach j'utent argistrà a peulo tramudela.
 L'ùltima vos dël registr a l'é smonùa sì-sota për arferiment:",
 'move-over-sharedrepo' => "== L'archivi a esist ==
 [[:$1]] a esist già dzora a un depòsit partagià. Tramudé n'archivi a cost tìtol-sì a coaterà l'archivi partagià.",
-'file-exists-sharedrepo' => "Ël nòm dël file sërnù a l'é già dovrà ant ël depòsit condivis.
-Për piasì sern n'àutr nòm.",
+'file-exists-sharedrepo' => "Ël nòm d'archivi sërnù a l'é già dovrà ant ël depòsit condivis.
+Për piasì ch'a serna n'àutr nòm.",
 
 # Export
 'export' => 'Esporté dle pàgine',
 'exporttext' => "A peul esporté ël test e modifiché la stòria ëd na pàgina ò pura
-ëd n'ansema ëd pàgine gropa ant n'archivi XML. Sòn a peul peuj amportesse
-ant n'àutra wiki ën dovrand la funsion Special:Ampòrta pàgina.
+ëd n'ansema ëd pàgine gropà ant n'archivi XML. Sòn a peul peuj amportesse
+ant n'àutra wiki ën dovrand MediaWiki con la [[Special:Import|pàgina d'amportassion]].
 
-Për esporté le pàgine, che a së scriva ij tìtoj ant ël quàder ambelessì sota, butand-ji un tìtol për riga,
-e che as serna se a veul la version corenta ansema a cole veje, con le righe che conto la stòria dla pàgina,
-ò pura mach l'anformassion ant sël quand che a sia staje l'ùltima modìfica.
+Për esporté le pàgine, che a së scriva ij tìtoj ant ël quàder ambelessì-sota, butandje un tìtol për riga,
+e che as serna se a veul la version corenta ansema a cole veje, con le righe che conto la stòria dla pàgina,
+ò pura mach l'anformassion an  sl'ùltima modìfica.
 
 Se costa ùltima possibilità a fussa lòn che a-j serv, a podrìa ëdcò dovré n'anliura, pr'esempi [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] për la pàgina \"[[{{MediaWiki:Mainpage}}]]\".",
 'exportall' => 'Esporté tute le pàgine',
-'exportcuronly' => 'Ciapa sù mach la version corenta, pa tuta la stòria',
+'exportcuronly' => 'Ciapé sù mach la version corenta, pa tuta la stòria',
 'exportnohistory' => "----
 '''Nòta:''' la possibilità d'esporté la stòria completa dle pàgine a l'é staita gavà për dle question corelà a le prestassion dël sistema.",
 'exportlistauthors' => 'Anclude na lista completa dij contributor për minca pàgina',
 'export-submit' => 'Esporté',
-'export-addcattext' => "Gionta pàgine da 'nt la categorìa:",
-'export-addcat' => 'Gionta',
-'export-addnstext' => 'Gionta pàgine dal namespace',
-'export-addns' => 'Gionta',
+'export-addcattext' => "Gionté le pàgine da 'nt la categorìa:",
+'export-addcat' => 'Gionté',
+'export-addnstext' => 'Gionté dle pàgine da lë spassi nominal:',
+'export-addns' => 'Gionté',
 'export-download' => 'Ciamé dë salvelo coma archivi',
 'export-templates' => 'Ciapa andrinta jë stamp',
-'export-pagelinks' => 'Anseriss pàgine colegà a na përfondità ëd:',
+'export-pagelinks' => 'Anclude le pàgine colegà a na përfondità ëd:',
 
 # Namespace 8 related
-'allmessages' => 'Messagi ëd sistema',
+'allmessages' => 'Mëssagi ëd sistema',
 'allmessagesname' => 'Nòm',
 'allmessagesdefault' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
 'allmessagescurrent' => 'Test corent',
-'allmessagestext' => "Costa-sì a l'é na lista ëd messagi disponìbij ëd sistema ant lë spassi nominal MediaWiki.
-Për piasì vìsita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisassion] e [//translatewiki.net translatewiki.net] se it veule contribuì a la localisassion general ëd MediaWiki.",
+'allmessagestext' => "Costa-sì a l'é na lista dij mëssagi ëd sistema disponìbij ant lë spassi nominal MediaWiki.
+Për piasì, ch'a vìsita la [//www.mediawiki.org/wiki/Localisation Localisassion ëd MediaWiki] e [//translatewiki.net translatewiki.net] se a veul contribuì a la localisassion general ëd MediaWiki.",
 'allmessagesnotsupportedDB' => "Sta pàgina-sì a peul pa esse dovrà përchè '''\$wgUseDatabaseMessages''' a l'é stàit disabilità.",
 'allmessages-filter-legend' => 'Filtr',
-'allmessages-filter' => 'Filtra për stat ëd përsonalisassion:',
+'allmessages-filter' => 'Filtré për stat ëd përsonalisassion:',
 'allmessages-filter-unmodified' => 'Pa modificà',
 'allmessages-filter-all' => 'Tùit',
 'allmessages-filter-modified' => 'Modificà',
-'allmessages-prefix' => 'Filtra për prefiss:',
+'allmessages-prefix' => 'Filtré për prefiss:',
 'allmessages-language' => 'Lenga:',
-'allmessages-filter-submit' => '',
+'allmessages-filter-submit' => 'Apliché',
 
 # Thumbnails
-'thumbnail-more' => 'Slarga',
+'thumbnail-more' => 'Slarg',
 'filemissing' => 'Archivi che a manca',
 'thumbnail_error' => 'Eror antramentr che as fasìa la figurin-a: $1',
 'djvu_page_error' => 'Pàgina DjVu fòra dij lìmit',
@@ -2575,21 +2611,21 @@ Për piasì vìsita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisassi
 'thumbnail_invalid_params' => 'Paràmetro dla figurin-a pa giust',
 'thumbnail_dest_directory' => 'As peul pa fesse ël dossié ëd destinassion',
 'thumbnail_image-type' => 'Sòrt ëd figura nen gestì',
-'thumbnail_gd-library' => 'Configurassion pa finìa dla librerìa GD: Fonsion $1 mancanta',
-'thumbnail_image-missing' => 'Ël file a smija esse mancant: $1',
+'thumbnail_gd-library' => 'Configurassion incompleta dla biblioteca GD: Fonsion $1 mancanta',
+'thumbnail_image-missing' => "L'archivi a smija ch'a manca: $1",
 
 # Special:Import
 'import' => 'Amportassion ëd pàgine',
 'importinterwiki' => 'Amportassion da wiki diferente',
 'import-interwiki-text' => "Che a selession-a na wiki e ël tìtol dla pàgina da amporté.
-Date dle revision e stranòm dj'editor a resteran piajit sù 'cò lor.
-Tute le amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/import|Registr dj'amportassion]].",
-'import-interwiki-source' => 'Sorziss wiki/pàgina:',
-'import-interwiki-history' => 'Còpia tute le version stòriche dë sta pàgina-sì',
-'import-interwiki-templates' => 'Ansëriss tùit jë stamp',
+Date dle revision e stranòm dj'editor a resteran piàjit sù 'cò lor.
+Tute j'amportassion antra wiki diferente a resto marcà ant ël [[Special:Log/import|Registr dj'amportassion]].",
+'import-interwiki-source' => 'Wiki e pàgina sorgiss:',
+'import-interwiki-history' => 'Copié tute le revision ëd la stòria ëd costa pàgina',
+'import-interwiki-templates' => 'Anserì tùit jë stamp',
 'import-interwiki-submit' => 'Amporté',
 'import-interwiki-namespace' => 'Spassi nominal ëd destinassion:',
-'import-upload-filename' => 'Nòm dël file:',
+'import-upload-filename' => "Nòm ëd l'archivi:",
 'import-comment' => 'Oget:',
 'importtext' => "Për piasì, che as espòrta l'archivi da 'nt la sorgiss wiki ën dovrand l'[[Special:Export|utiss d'esportassion]]. 
 Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
@@ -2600,8 +2636,8 @@ Che as lo salva ansima a sò ordinator e peui che a lo caria ambelessì.",
 'importfailed' => 'Amportassion falìa: $1',
 'importunknownsource' => "Sorgiss d'amportassion ëd na sòrt nen conossùa",
 'importcantopen' => "L'archivi da amporté a l'é pa podusse deurbe",
-'importbadinterwiki' => 'Anliura antra wiki diferente malfaita',
-'importnotext' => 'Veujd ò sensa pa gnun test',
+'importbadinterwiki' => 'Liura antra wiki diferente cioca',
+'importnotext' => 'Veujd o con gnun test',
 'importsuccess' => 'Amportassion andaita a bon fin!',
 'importhistoryconflict' => "A-i son dle stòrie dë sta pàgina-sì che as contradisso un-a con l'àutra (a peul esse che sta pàgina-sì a l'avèissa già amportala)",
 'importnosources' => "A l'é pa staita definìa gnun-a sorgiss d'amportassion da na wiki diferenta, e carié mach le stòrie as peul nen.",
@@ -2743,6 +2779,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'spambot_username' => 'MediaWiki - trigomiro che a-j dà deuit a la rumenta',
 'spam_reverting' => "Buta andaré a l'ùltima version che a l'avèissa pa andrinta dj'anliure a $1",
 'spam_blanking' => "Pàgina dësveujdà, che tute le version a l'avìo andrinta dj'anliure a $1",
+'spam_deleting' => 'Tute le revision a contnisìo dle liure a $1, scancelament',
 
 # Info page
 'pageinfo-title' => 'Anformassion për "$1"',
@@ -3471,6 +3508,9 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-software' => 'Programa anstalà',
 'version-software-product' => 'Prodot',
 'version-software-version' => 'Version',
+'version-entrypoints' => "Anliure ëd pont d'intrada",
+'version-entrypoints-header-entrypoint' => "Pont d'intrada",
+'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
 
 # Special:FilePath
 'filepath' => "Përcors d'archivi",
@@ -3659,4 +3699,17 @@ Dësnò, a peule dovré ël formlari semplificà sì-sota. Sò coment a sarà gi
 'api-error-uploaddisabled' => "Ël cariagi a l'é disabilità su sta wiki.",
 'api-error-verification-error' => "Cost archivi a peul esse danegià, o avèj l'estension sbalià.",
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|second|second}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|ora|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|di|di}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sman-a|sman-e}}',
+'duration-years' => '$1 {{PLURAL:$1|ann|agn}}',
+'duration-decades' => "$1 {{PLURAL:$1|desen-a d'agn|desen-e d'agn}}",
+'duration-centuries' => '$1 {{PLURAL:$1|sécol|sécoj}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenari|milenari}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'As peul pa butesse le saradure an sël servent $1.',
 );
index bc7842b..9212034 100644 (file)
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author Khalid Mahmood
  * @author Rachitrali
+ * @author Reedy
  * @author ZaDiak
  */
 
@@ -373,7 +374,7 @@ $messages = array(
 اینوں پہلاں توں ای کسے نے مٹایا ہوۓ گا۔',
 'cannotdelete-title' => 'صفہ مٹا نئیں سکدے "$1"',
 'badtitle' => 'پیڑا عنوان',
-'badtitletext' => 'منگیا گۓ صفحہ دا ناں غلط اے، خالی اے یا غلط تریقے نال جوڑیا گیا اے۔<div/>
+'badtitletext' => 'منگیا گۓ صفحہ دا ناں غلط اے، خالی اے یا غلط تریقے نال جوڑیا گیا اے۔
 ہوسکدا اے ایدے چ اک دو ھندسے ایسے ہون جیڑے عنوان وچ استعمال نہیں کیتے جاسکدے۔',
 'perfcached' => 'تھلے دتا گیا ڈیٹا کاشیڈ اے تے پانویں نواں ناں ہووے. زیادہ توں زیادہ کاشے چ  {{PLURAL:$1|اک نتیجہ ہووے|$1 نتیجے ہوون}} گے.',
 'perfcachedts' => 'تھلے دتا گیا ڈیٹا کاشیڈ اے تے  $1 نوں نواں کیتا گیا۔ زیادہ توں زیادہ {{PLURAL:$4|اک نتیجہ ہووے|$4 نتیجے ہوون}} نتیجے کاشے چ ہیگے نیں .',
@@ -596,7 +597,7 @@ $2
 'showpreview' => 'کچا کم ویکھو',
 'showlivepreview' => 'جیندا کچا کم',
 'showdiff' => 'تبدیلیاں وکھاؤ',
-'anoneditwarning' => "<div/>'''خبردار''' تسی اندر نہیں آۓ
+'anoneditwarning' => "'''خبردار''' تسی اندر نہیں آۓ
 تواڈا ''آئی پی'' پتہ فائل فائل وچ لکھیا جاۓ گا۔",
 'anonpreviewwarning' => "''تسی ہلے لاگ ان نئیں ہوۓ،۔ کم بچاؤ گے تے تواڈا IP پتہ صفحے دی تریخ چ لکھ لیا جاۓ گا۔''",
 'missingsummary' => "'''یادکرائی:''' تساں تبدیلی دی سمری نئیں دتی۔  اگر تسیں \"{{int:savearticle}}\" نوں کلک کروگے تواڈیاں تبدیلیاں اک دے بنا بچ جان گیاں۔",
@@ -749,7 +750,7 @@ Custom .css تے .js pages use a lowercase title, e.g. {{ns:user}}:Foo/vector.cs
 'permissionserrorstext-withaction' => 'تواڈے کول $2 کرن دی اجازت نئیں اے۔ اس دی {{PLURAL:$1|وجہ|وجوہات}} نیں۔',
 'recreate-moveddeleted-warn' => "'''خبردار: تسی اک پہلاں توں مٹایا ہویا صفحہ دوبارا لکھ رہے او۔'''
 
-توانوں اے گل سوچنی چائیدی اے کہ اینو لکھنا کوئی عقلمنداں دا کم اے۔<div/>
+توانوں اے گل سوچنی چائیدی اے کہ اینو لکھنا کوئی عقلمنداں دا کم اے۔
 تواڈی سہولت آسطے مٹان دا لاگ ایتھے موجود اے۔",
 'moveddeleted-notice' => 'اس صفحے نوں مٹا دتا گیا اے۔
 مٹان دا لاگ تھلے دتا گیا اے۔',
@@ -952,7 +953,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" دا ریکارڈ',
-'difference' => '(صفحیاں وچ فرق)',
 'difference-multipage' => '(صفیاں چ فرق)',
 'lineno' => 'لیک $1:',
 'compareselectedversions' => 'چنے صفحے آپنے سامنے کرو',
@@ -1316,7 +1316,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|change|تبدیلیاں}}',
 'recentchanges' => 'نویاں تبدیلیاں',
 'recentchanges-legend' => 'نویاں تبدیلیاں دیاں راواں',
-'recentchangestext' => 'ایس وکی تے نیڑے نیڑے ہون والیاں تبدیلیاں ایس صفے تے دسو۔',
+'recentchanges-summary' => 'ایس وکی تے نیڑے نیڑے ہون والیاں تبدیلیاں ایس صفے تے دسو۔',
 'recentchanges-feed-description' => 'اس فیڈ وچ وکی تے ہوئیاں نویاں تبدیلیاں نو ویکھو۔',
 'recentchanges-label-newpage' => 'ایس تبدیلی نے نواں صفہ بنایا اے۔',
 'recentchanges-label-minor' => 'اے اک چھوٹی تبدیلی اے۔',
@@ -2210,7 +2210,7 @@ $2 نے آخری ریوین تک واپس کیتا۔',
 'undelete-error-short' => 'فاغل واپس کرن چ غلطی: $1',
 'undelete-error-long' => 'فائل واپس کرن  لگیاں غلطیاں ہوئیاں:
 $1',
-'undelete-show-file-confirm' => 'تساں نوں کیا پک اے جے تسیں فائل "<نوکی>$1</نوکی>" دی مٹائی ریوین  $2 توں $3 تک ویکھنا چاندے او؟',
+'undelete-show-file-confirm' => 'تساں نوں کیا پک اے جے تسیں فائل "<nowiki>$1</nowiki>" دی مٹائی ریوین  $2 توں $3 تک ویکھنا چاندے او؟',
 'undelete-show-file-submit' => 'ہاں جی',
 
 # Namespace form on various pages
@@ -2577,7 +2577,7 @@ $1',
 'import-revision-count' => '$1 {{PLURAL:$1|ریوین}}',
 'importnopages' => 'لانے آسطے کوئی صفحہ نئیں۔',
 'imported-log-entries' => '{{PLURAL:$1|لاگ انٹریلاگ انٹریاں}}!!لیاندی گئی $1 {{PLURAL:$1|لاگ انٹری}}.',
-'importfailed' => 'لیانا فیل: <نوکی>$1</نوکی>',
+'importfailed' => 'لیانا فیل: <nowiki>$1</nowiki>',
 'importunknownsource' => 'انجان لیان سورس ٹائپ',
 'importcantopen' => 'لیاندی گئی فائل نئیں کھولی جاسکی',
 'importbadinterwiki' => 'پیڑا انٹروکی لنک',
@@ -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' => 'اس صفحے دے بار وچ گل بات',
@@ -2811,7 +2811,7 @@ $1',
 
 # Metadata
 'metadata' => 'میٹا ڈیٹا',
-'metadata-help' => 'اس فائل وچ ہور وی معلومات نے، شاید او ڈیجیٹل کیمرے یا سکینر نے پائیاں گئیاں نے جس نال اینو کچھیا یا ڈیجیٹل بنایا گیا اے۔<div/>
+'metadata-help' => 'اس فائل وچ ہور وی معلومات نے، شاید او ڈیجیٹل کیمرے یا سکینر نے پائیاں گئیاں نے جس نال اینو کچھیا یا ڈیجیٹل بنایا گیا اے۔
 اگر فائل نو ایدی اصلی حالت توں تبدیل کیتا گیا اے تے کجھ تفصیلات تبدیل ہوئی فائل دے بارے چ نئیں دسن گیاں۔',
 'metadata-expand' => 'ہور تفصیلات دسو',
 'metadata-collapse' => 'تفصیلات چھپاؤ',
@@ -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 e565c7a..01d87f0 100644 (file)
@@ -581,7 +581,6 @@ $messages = array(
 
 # Diffs
 'history-title' => 'Ιστορικόν εκδοσίων για τη σελίδαν "$1"',
-'difference' => '(Διαφορά μεταξύ τη μορφίων)',
 'lineno' => 'Γραμμή $1:',
 'compareselectedversions' => 'Γαρσουλαεύτε...',
 'editundo' => 'αναίρεση',
index e9ad1f4..a62df39 100644 (file)
@@ -781,7 +781,6 @@ Nawigaciōnis autengīsenin terpausnā naikinna etrīnksenin en kōlunei.',
 
 # Diffs
 'history-title' => 'Redigīsnas istōrija stesse "$1"',
-'difference' => '(Šlaitīntai sirzdau wersiōnins)',
 'lineno' => 'Rindā $1:',
 'compareselectedversions' => 'Paligīnais etrīnktans wersiōnins',
 'editundo' => 'Naikinnais redigīsenin',
@@ -1093,7 +1092,7 @@ Tū mazzi dīgi etrīnktun dātun kitēimans drāugautwei sen tin pra tērpautaj
 'nchanges' => '$1 {{PLURAL:$1|kitawīdinsna|kitawīdinsnas}}',
 'recentchanges' => 'Panzdaumas kitawīdinsnas',
 'recentchanges-legend' => 'Panzdauman kitawīdinsnan mazīngiskwas',
-'recentchangestext' => 'Šin pāusan waidinna listin stēisan panzdauman kitawīdinsnan en šissei wiki.',
+'recentchanges-summary' => 'Šin pāusan waidinna listin stēisan panzdauman kitawīdinsnan en šissei wiki.',
 'recentchanges-feed-description' => 'Nadirēis ukanāunaisins kitawīdisnans en šissei wiki.',
 'recentchanges-label-newpage' => 'Šis redigīsenis ast teīkuns nāunan pāusan',
 'recentchanges-label-minor' => 'Sta ast malks redigīsenis',
index e103bf2..79f113b 100644 (file)
@@ -750,7 +750,8 @@ $1',
 '''تر اوسه پورې دا نه دی خوندي شوی!'''",
 'updated' => '(تازه)',
 'note' => "'''يادونه:'''",
-'previewnote' => "'''دا يواځې مخليدنه ده، تاسې چې کوم بدلونونه ترسره کړي، لا تر اوسه پورې نه دي خوندي شوي!'''",
+'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
+ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
 'editing' => 'د $1 سمونه',
 'editingsection' => 'سمونه $1 (برخه)',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
@@ -891,7 +892,6 @@ $1',
 
 # Diffs
 'history-title' => 'د "$1" د پېښليک بڼه',
-'difference' => '(د بڼو تر مېنځ توپير)',
 'difference-multipage' => '(د مخونو تر مېنځ توپير)',
 'lineno' => '$1 کرښه:',
 'compareselectedversions' => 'ټاکلې بڼې سره پرتلل',
@@ -1171,7 +1171,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|بدلون|بدلونونه}}',
 'recentchanges' => 'وروستي بدلونونه',
 'recentchanges-legend' => 'د ورستي بدلونو خوښنې',
-'recentchangestext' => 'په همدې مخ باندې د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ.',
+'recentchanges-summary' => 'په همدې مخ باندې د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ.',
 'recentchanges-feed-description' => 'همدلته د ويکي ترټولو تازه وروستي بدلونونه وڅارۍ او وګورۍ چې څه پېښ شوي.',
 'recentchanges-label-newpage' => 'دغه سمون يو نوی مخ جوړ کړی',
 'recentchanges-label-minor' => 'دا يوه وړه سمونه ده',
@@ -1279,7 +1279,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 +1826,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 +1976,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Import log
 'importlogpage' => 'د واردولو يادښت',
 
+# JavaScriptTest
+'javascripttest' => 'د جاوا سکرېپټ آزمېښت',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ستاسې کارن مخ',
 'tooltip-pt-mytalk' => 'ستاسې د خبرواترو مخ',
@@ -2030,6 +2036,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-diff' => 'دا هغه بدلونونه چې تاسې په متن کې ترسره کړي، ښکاره کوي. [alt-v]',
 'tooltip-compareselectedversions' => 'د همدې مخ د دوو ټاکل شويو بڼو تر مېنځ توپيرونه وګورۍ.',
 'tooltip-watch' => 'دا مخ ستاسې کتنلړ کې ورګډوي [alt-w]',
+'tooltip-upload' => 'د پورته کولو پيل',
 'tooltip-rollback' => 'په همدې مخ کې "په شابېول" د وروستني ونډوال سمون (سمونونه) په يوه کلېک په څټ ورګرځوي.',
 'tooltip-undo' => '"ناکړ" همدا سمون پر شا ګرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.
 دا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورګډولو آسانتيا برابروي.',
@@ -2085,6 +2092,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 +2153,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-model' => 'د کامرې ماډل',
 'exif-software' => 'کارېدلې ساوترۍ',
 'exif-artist' => 'ليکوال',
+'exif-copyright' => 'د رښتو خاوند',
 'exif-colorspace' => 'رنګ تشيال',
 'exif-pixelydimension' => 'د انځور سور',
 'exif-pixelxdimension' => 'د انځور جګوالی',
@@ -2174,20 +2183,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 +2223,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-lightsource-1' => 'د ورځې رڼا',
 'exif-lightsource-4' => 'فلش',
 'exif-lightsource-9' => 'ښه هوا',
+'exif-lightsource-10' => 'ورېځ پوښلې هوا',
 'exif-lightsource-11' => 'سيوری',
 'exif-lightsource-255' => 'د رڼا بله سرچينه',
 
@@ -2403,6 +2420,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 +2537,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 +2547,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 1830217..8cfc8b6 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Portuguese (Português)
+/** Portuguese (português)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -95,7 +95,7 @@ $dateFormats = array(
        'dmy both' => 'H\hi\m\i\n \d\e j \d\e F \d\e Y',
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $linkTrail = '/^([áâãàéêẽçíòóôõq̃úüűũa-z]+)(.*)$/sDu'; # Bug 21168, 27633
 
 $specialPageAliases = array(
@@ -695,6 +695,11 @@ $2',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => 'Este título foi protegido contra criação por [[User:$1|$1]].
 A justificação foi "\'\'$2\'\'".',
+'filereadonlyerror' => 'Não é possível modificar o ficheiro "$1" porque o repositório de ficheiros "$2" está em modo de leitura.
+
+O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
+'invalidtitle-knownnamespace' => 'Título inválido com o espaço nominal "$2" e texto "$3"',
+'invalidtitle-unknownnamespace' => 'Título inválido com número de espaço nominal $1 desconhecido e texto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -788,6 +793,7 @@ Não serão enviados correios de nenhuma das seguintes funcionalidades.',
 'invalidemailaddress' => 'O endereço de correio electrónico não pode ser aceite porque parece ter um formato inválido.
 Introduza um endereço formatado correctamente ou deixe o campo vazio.',
 'cannotchangeemail' => 'A conta de e-mail não pode ser alterado nesta wiki.',
+'emaildisabled' => 'Este site não consegue enviar e-mails.',
 'accountcreated' => 'Conta criada',
 'accountcreatedtext' => 'A conta de utilizador para $1 foi criada.',
 'createaccount-title' => 'Criação de conta na {{SITENAME}}',
@@ -989,7 +995,8 @@ Este ainda não foi gravado!",
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
-As modificações ainda não foram gravadas! [[#editform|→ Continuar a editar]]",
+As modificações ainda não foram gravadas!",
+'continue-editing' => 'Continuar a editar',
 'previewconflict' => 'Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.',
 'session_fail_preview' => "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.
 Tente novamente, por favor.
@@ -1005,6 +1012,7 @@ A edição foi rejeitada para evitar perdas no texto da página.
 Isso acontece ocasionalmente quando se usa um serviço de proxy anonimizador mal configurado.'''",
 'edit_form_incomplete' => "'''Algumas partes do formulário de edição não chegaram ao servidor; verifique que a sua edição continua intacta e tente novamente, por favor.'''",
 'editing' => 'A editar $1',
+'creating' => 'A criar $1',
 'editingsection' => 'A editar $1 (secção)',
 'editingcomment' => 'A editar $1 (nova secção)',
 'editconflict' => 'Conflito de edição: $1',
@@ -1072,6 +1080,7 @@ Ela parece ter sido eliminada.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
 'edit-already-exists' => 'Não foi possível criar uma página nova.
 Ela já existia.',
+'defaultmessagetext' => 'Texto da mensagem padrão',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém demasiadas chamadas de funções exigentes do analisador sintáctico.
@@ -1086,6 +1095,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Detectado loop unstrip',
+'parser-unstrip-recursion-limit' => 'Limite de recursão do unstrip excedido ($1)',
 
 # "Undo" feature
 'undo-success' => 'É possível desfazer a edição.
@@ -1234,8 +1249,8 @@ Verifique os registos, por favor.',
 
 # Suppression log
 'suppressionlog' => 'Registo de supressões',
-'suppressionlogtext' => 'Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado a administradores.
-Veja a [[Special:BlockList|lista de bloqueios a IPs]] para uma lista de banimentos e bloqueios em efeito neste momento.',
+'suppressionlogtext' => 'Abaixo está uma lista das eliminações e bloqueios envolvendo conteúdo ocultado para administradores.
+Veja a [[Special:BlockList|lista de bloqueios]] para uma lista de banimentos e bloqueios em efeito neste momento.',
 
 # History merging
 'mergehistory' => 'Fundir histórico de páginas',
@@ -1270,7 +1285,6 @@ Note que, se usar os links de navegação, os botões de opção voltarão aos v
 
 # Diffs
 'history-title' => 'Histórico de edições de "$1"',
-'difference' => '(Diferença entre edições)',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
 'compareselectedversions' => 'Comparar as versões seleccionadas',
@@ -1631,7 +1645,7 @@ Esta informação será pública.',
 'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
-'recentchangestext' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
+'recentchanges-summary' => 'Acompanhe nesta página as mudanças mais recentes da wiki.',
 'recentchanges-feed-description' => "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
 'recentchanges-label-newpage' => 'Esta edição criou uma página nova',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
@@ -1846,6 +1860,28 @@ Caso o problema persista, contacte um [[Special:ListUsers/sysop|administrador]].
 'backend-fail-closetemp' => 'Não foi possível fechar o arquivo temporário.',
 'backend-fail-read' => 'Não foi possível ler o arquivo $1.',
 'backend-fail-create' => 'Não foi possível criar o arquivo $1.',
+'backend-fail-maxsize' => 'Não foi possível criar o ficheiro  $1  porque ele é maior do que  {{PLURAL:$2| um byte| $2  bytes}}.',
+'backend-fail-readonly' => 'O servidor de armazenamento "$1" está actualmente no modo "somente leitura". A razão dada foi: "$2"',
+'backend-fail-synced' => 'O ficheiro" $1 " está em um estado inconsistente dentro da base de dados',
+'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".',
+'filejournal-fail-dbquery' => 'Não foi possível atualizar a base de dados de registos do "backend" de armazenamento "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Não foi possível desbloquear " $1 "; não se encontra bloqueado.',
+'lockmanager-fail-closelock' => 'Não foi possível encerrar a referência de bloqueio para "$1".',
+'lockmanager-fail-deletelock' => 'Não foi possível eliminar a referência de bloqueio para "$1".',
+'lockmanager-fail-acquirelock' => 'Não foi possível adquirir bloqueio para "$1".',
+'lockmanager-fail-openlock' => 'Não foi possível abrir ficheiro de bloqueio para "$1".',
+'lockmanager-fail-releaselock' => 'Não foi possível libertar bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contactar bases de dados de bloqueio suficientes no "bucket" $1.',
+'lockmanager-fail-db-release' => 'Não foi possível libertar bloqueios na base de dados $1.',
+'lockmanager-fail-svr-release' => 'Não foi possível libertar bloqueios no servidor $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Foi encontrado um erro ao abrir o ficheiro ZIP para verificação.',
@@ -1863,6 +1899,7 @@ A sua segurança não pode ser devidamente verificada.',
 'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
 'uploadstash-errclear' => 'Não foi possível apagar os ficheiros.',
 'uploadstash-refresh' => 'Actualizar a lista de ficheiros',
+'invalid-chunk-offset' => 'Deslocamento de fragmento inválido',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Acesso negado',
@@ -1952,6 +1989,10 @@ Encontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].',
 Consulte a [$2 página de descrição do ficheiro] para mais informações, por favor.',
 'sharedupload-desc-here' => 'Este ficheiro provém de $1 e pode ser usado por outros projectos.
 A descrição na [$2 página de descrição] é mostrada abaixo.',
+'sharedupload-desc-edit' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
+'sharedupload-desc-create' => 'Este ficheiro provém de $1 e pode ser utilizado por outros projetos.
+Talvez você pretenda editar a descrição na sua [$2 página de descrição de ficheiro] lá.',
 'filepage-nofile' => 'Não existe nenhum ficheiro com este nome.',
 'filepage-nofile-link' => 'Não existe nenhum ficheiro com este nome, mas pode [$1 carregá-lo].',
 'uploadnewversion-linktext' => 'Carregar uma nova versão deste ficheiro',
@@ -2084,6 +2125,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',
@@ -2161,6 +2204,12 @@ Pode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um
 'allpagesbadtitle' => 'O título de página fornecido era inválido ou tinha um prefixo interlínguas ou interwikis.
 Talvez contenha um ou mais caracteres que não podem ser usados nos títulos.',
 'allpages-bad-ns' => 'A {{SITENAME}} não possui o espaço nominal "$1".',
+'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
 'categories' => 'Categorias',
@@ -2602,8 +2651,8 @@ Isto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki
 'ipb-confirm' => 'Confirmar o bloqueio',
 'badipaddress' => 'Endereço 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]] para rever os bloqueios.',
 'ipb-blockingself' => 'Está prestes a bloquear-se a si próprio. Tem a certeza de que pretende fazê-lo?',
 'ipb-confirmhideuser' => 'Está prestes a bloquear um utilizador com "Ocultar nome de utilizador/IP" activado. Isto irá suprimir o nome do utilizador de todas as listas e entradas dos registos. Tem a certeza de que pretende fazê-lo?',
 'ipb-edit-dropdown' => 'Editar motivos de bloqueio',
@@ -2623,7 +2672,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
 'blocklist-userblocks' => 'Esconder bloqueios de contas',
 'blocklist-tempblocks' => 'Esconder bloqueios temporários',
 'blocklist-addressblocks' => 'Esconder bloqueios de IP único',
-'blocklist-rangeblocks' => 'Ocultar range blocks',
+'blocklist-rangeblocks' => 'Ocultar bloqueios de faixas',
 'blocklist-timestamp' => 'Data e hora',
 'blocklist-target' => 'Destinatário',
 'blocklist-expiry' => 'Duração',
@@ -2653,11 +2702,11 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
 O registo de bloqueios é fornecido abaixo para referência:',
 'blocklog-showsuppresslog' => 'Este utilizador foi bloqueado e ocultado anteriomente.
 O registo de supressão é fornecido abaixo para referência:',
-'blocklogentry' => 'bloqueou "[[$1]]" $3. O bloqueio expira em $2.',
-'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
-'blocklogtext' => 'Este é um registo de acçõ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 actualmente válidos.',
+'blocklogentry' => 'bloqueou "[[$1]]" por $2. $3',
+'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] com expiração em $2. $3',
+'blocklogtext' => 'Este é um registo de ações de bloqueio e desbloqueio.
+Endereços IP sujeitos a bloqueio automático não estão listados.
+Consulte a [[Special:BlockList|lista de bloqueios]] para obter a lista de bloqueios e banimentos atualmente válidos.',
 'unblocklogentry' => 'desbloqueou $1',
 'block-log-flags-anononly' => 'apenas utilizadores anónimos',
 'block-log-flags-nocreate' => 'criação de contas impossibilitada',
@@ -2850,6 +2899,7 @@ Se deseja colaborar na localização genérica do MediaWiki, visite [//www.media
 'thumbnail_error' => 'Erro ao criar miniatura: $1',
 'djvu_page_error' => 'página DjVu inacessível',
 'djvu_no_xml' => 'Não foi possível aceder ao XML para o ficheiro DjVU',
+'thumbnail-temp-create' => 'Não foi possível criar ficheiro temporário de miniatura',
 'thumbnail-dest-create' => 'Não é possível salvar miniatura',
 'thumbnail_invalid_params' => 'Parâmetros de miniatura inválidos',
 'thumbnail_dest_directory' => 'Não foi possível criar o directório de destino',
@@ -2921,6 +2971,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',
@@ -3759,6 +3810,9 @@ 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' => 'URLs de ponto de entrada',
+'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Endereço de ficheiro',
@@ -3893,6 +3947,8 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'newuserlog-byemail' => 'palavra-chave enviada por correio-electrónico',
 
 # Feedback
+'feedback-bugornote' => 'Se está pronto para descrever um problema técnico em detalhe, por favor, [$1 denuncie um defeito].
+Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário será adicionado à página "[$3 $2]", junto com o seu nome de utilizador e o navegador que está a usar.',
 'feedback-subject' => 'Assunto:',
 'feedback-message' => 'Mensagem:',
 'feedback-cancel' => 'Cancelar',
@@ -3901,9 +3957,10 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 '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! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
-'feedback-bugnew' => 'Eu verifiquei. Reportar um novo bug.',
+'feedback-bugnew' => 'Eu verifiquei. Denunciar um novo defeito.',
 
 # API errors
 'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
@@ -3943,4 +4000,15 @@ Imagens serão apresentadas pelo browser na resolução máxima; ficheiros de ou
 'api-error-uploaddisabled' => 'Esta wiki não está configurada para poder receber ficheiros.',
 'api-error-verification-error' => 'Este ficheiro 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 15447b4..d8e2ff0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Brazilian Portuguese (Português do Brasil)
+/** Brazilian Portuguese (português do Brasil)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Alcali
+ * @author Alchimista
  * @author Bani
  * @author Brion
  * @author BrunaaAa
@@ -20,6 +21,7 @@
  * @author Danielsouzat
  * @author Diego Queiroz
  * @author Eduardo.mps
+ * @author Emufarmers
  * @author Everton137
  * @author Francisco Leandro
  * @author GKnedo
@@ -45,6 +47,7 @@
  * @author Raylton P. Sousa
  * @author Rodrigo Calanca Nishino
  * @author Sir Lestaty de Lioncourt
+ * @author TheGabrielZaum
  * @author Urhixidur
  * @author Vuln
  * @author Waldir
@@ -96,13 +99,14 @@ $dateFormats = array(
 
 );
 
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuários_ativos' ),
        'Allmessages'               => array( 'Todas_as_mensagens', 'Todas_mensagens' ),
        'Allpages'                  => array( 'Todas_as_páginas', 'Todos_os_artigos', 'Todas_páginas', 'Todos_artigos' ),
        'Ancientpages'              => array( 'Páginas_inativas', 'Artigos_inativos' ),
+       'Badtitle'                  => array( 'Título_inválido' ),
        'Blankpage'                 => array( 'Página_em_branco' ),
        'Block'                     => array( 'Bloquear', 'Bloquear_IP', 'Bloquear_utilizador', 'Bloquear_usuário' ),
        'Blockme'                   => array( 'Bloquear-me', 'Auto-bloqueio' ),
@@ -110,6 +114,7 @@ $specialPageAliases = array(
        'BrokenRedirects'           => array( 'Redirecionamentos_quebrados' ),
        'Categories'                => array( 'Categorias' ),
        'ChangePassword'            => array( 'Trocar_senha', 'Repor_senha' ),
+       'ComparePages'              => array( 'Comparar_páginas' ),
        'Confirmemail'              => array( 'Confirmar_e-mail', 'Confirmar_email' ),
        'Contributions'             => array( 'Contribuições' ),
        'CreateAccount'             => array( 'Criar_conta' ),
@@ -117,6 +122,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'Contribuições_eliminadas', 'Edições_eliminadas' ),
        'Disambiguations'           => array( 'Páginas_de_desambiguação', 'Desambiguar', 'Desambiguações' ),
        'DoubleRedirects'           => array( 'Redirecionamentos_duplos' ),
+       'EditWatchlist'             => array( 'Editar_lista_de_páginas_vigiadas' ),
        'Emailuser'                 => array( 'Contatar_usuário', 'Contactar_usuário', 'Contactar_utilizador' ),
        'Export'                    => array( 'Exportar' ),
        'Fewestrevisions'           => array( 'Páginas_com_menos_edições', 'Artigos_com_menos_edições', 'Artigos_menos_editados' ),
@@ -313,7 +319,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Esconder edições patrulhadas nas mudanças recentes',
 'tog-newpageshidepatrolled' => 'Esconder páginas patrulhadas da lista de páginas novas',
 'tog-extendwatchlist' => 'Expandir a lista de páginas vigiadas para mostrar todas as alterações aplicáveis, não apenas as mais recentes',
-'tog-usenewrc' => 'Utilizar mudanças recentes melhoradas (requer JavaScript)',
+'tog-usenewrc' => 'Agrupar alterações por páginas nas mudanças recentes e páginas vigiadas (requer JavaScript)',
 'tog-numberheadings' => 'Auto-numerar cabeçalhos',
 'tog-showtoolbar' => 'Mostrar barra de edição (JavaScript)',
 'tog-editondblclick' => 'Editar páginas quando houver clique duplo (JavaScript)',
@@ -329,8 +335,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',
@@ -338,7 +344,7 @@ $messages = array(
 'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar hiperligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
 'tog-watchlisthideown' => 'Esconder as minhas edições da lista de páginas vigiadas',
@@ -348,7 +354,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',
@@ -480,7 +486,7 @@ $messages = array(
 'tagline' => 'De {{SITENAME}}',
 'help' => 'Ajuda',
 'search' => 'Pesquisar',
-'searchbutton' => 'Pesquisa',
+'searchbutton' => 'Pesquisar',
 'go' => 'Ir',
 'searcharticle' => 'Ir',
 'history' => 'Histórico da página',
@@ -503,7 +509,7 @@ $messages = array(
 'protectthispage' => 'Proteger esta página',
 'unprotect' => 'Alterar a proteção',
 'unprotectthispage' => 'Alterar a proteção desta página',
-'newpage' => 'Nova página',
+'newpage' => 'Página nova',
 'talkpage' => 'Dialogar sobre esta página',
 'talkpagelinktext' => 'disc',
 'specialpage' => 'Página especial',
@@ -521,7 +527,7 @@ $messages = array(
 'viewhelppage' => 'Ver página de ajuda',
 'categorypage' => 'Ver página de categorias',
 'viewtalkpage' => 'Ver discussão',
-'otherlanguages' => 'Outras línguas',
+'otherlanguages' => 'Em outros idiomas',
 'redirectedfrom' => '(Redirecionado de $1)',
 'redirectpagesub' => 'Página de redirecionamento',
 'lastmodifiedat' => 'Esta página foi modificada pela última vez às $2 de $1.',
@@ -546,7 +552,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',
@@ -568,7 +574,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',
@@ -579,7 +585,7 @@ Veja a [[Special:Version|página sobre a versão do sistema]].',
 'editlink' => 'editar',
 'viewsourcelink' => 'ver código-fonte',
 'editsectionhint' => 'Editar seção: $1',
-'toc' => 'Tabela de conteúdo',
+'toc' => 'Conteúdo',
 'showtoc' => 'exibir',
 'hidetoc' => 'ocultar',
 'collapsible-collapse' => 'Ocultar',
@@ -642,10 +648,10 @@ O banco de dados retornou o erro "$3: $4".',
 Quem fez o bloqueio oferece a seguinte explicação: $1',
 'missing-article' => 'O banco de dados não encontrou o texto de uma página que deveria ter encontrado, com o nome "$1" $2.
 
-Isto geralmente é causado pelo seguimento de uma ligação de diferença desatualizada ou de história de uma página que foi removida.
+Isso normalmente é causado ao acessar um link de diferença (diff) desatualizado ou para o histórico de uma página que foi apagada.
 
-Se não for este o caso, você pode ter encontrado um defeito no software.
-Por favor, reporte este fato a um administrador, fazendo notar a URL.',
+Se não for este o caso, você pode ter encontrado um defeito (bug) no software.
+Anote o URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
 'missingarticle-rev' => '(revisão#: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'readonly_lag' => 'O banco de dados foi automaticamente bloqueado enquanto os servidores secundários se sincronizam com o principal',
@@ -693,6 +699,11 @@ $2',
 'ns-specialprotected' => 'Não é possível editar páginas especiais',
 'titleprotected' => "Este título foi protegido, para que não seja criado.
 Quem o protegeu foi [[User:$1|$1]], com a justificativa: ''$2''.",
+'filereadonlyerror' => 'Não é possível modificar o arquivo "$1" porque o repositório do arquivo "$2" está em modo somente leitura.
+
+O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
+'invalidtitle-knownnamespace' => 'Título inválido para o espaço nominal "$2" e texto "$3"',
+'invalidtitle-unknownnamespace' => 'Título inválido para o espaço nominal de número desconhecido ($1) e texto "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Má configuração: antivírus desconhecido: ''$1''",
@@ -710,17 +721,17 @@ Não se esqueça de personalizar as suas [[Special:Preferences|preferências no
 'yourname' => 'Nome de usuário:',
 'yourpassword' => 'Senha:',
 'yourpasswordagain' => 'Redigite sua senha',
-'remembermypassword' => 'Recordar os meus dados neste computador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
+'remembermypassword' => 'Lembrar meu login neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
 'securelogin-stick-https' => 'Permanecer conectado ao HTTPS após a autenticação',
 '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',
+'userlogin' => 'Entrar / criar conta',
 'userloginnocreate' => 'Entrar',
 'logout' => 'Sair',
-'userlogout' => 'Sair',
+'userlogout' => 'Desconectar',
 'notloggedin' => 'Não autenticado',
 'nologin' => 'Não possui uma conta? $1.',
 'nologinlink' => 'Criar uma conta',
@@ -744,7 +755,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]].',
@@ -785,14 +796,15 @@ Como resultado, visitantes que usam este endereço IP não podem criar mais nenh
 'accountcreated' => 'Conta criada',
 'accountcreatedtext' => 'A conta de usuário para $1 foi criada.',
 'createaccount-title' => 'Criação de conta em {{SITENAME}}',
-'createaccount-text' => 'Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha #$3". Você deve se autenticar e alterar sua senha.
+'createaccount-text' => 'Alguém criou uma conta de nome $2 para o seu endereço de email no wiki {{SITENAME}} ($4), tendo como senha "$3".
+Você deve se autenticar e alterar sua senha.
 
-Você pode ignorar esta mensagem caso a conta tenha sido criada por engano.',
+Ignore esta mensagem caso a conta tenha sido criada por engano.',
 'usernamehasherror' => 'Nome de usuário não pode conter o símbolo de cardinal (#).',
 'login-throttled' => 'Você fez tentativas demais de se autenticar com esta conta recentemente.
 Por favor aguarde antes de tentar novamente.',
 'login-abort-generic' => 'A sua autenticação não teve êxito - Abortada',
-'loginlanguagelabel' => 'Língua: $1',
+'loginlanguagelabel' => 'Idioma: $1',
 'suspicious-userlogout' => 'Sua solicitação para sair foi negada porque aparentemente foi enviada por um navegador danificado ou por um servidor proxy com cache.',
 
 # E-mail sending
@@ -821,7 +833,7 @@ Você pode já ter alterado com sucesso a sua senha, ou solicitado uma nova senh
 'passwordreset' => 'Redefinir senha',
 'passwordreset-text' => 'Preencha este formulário para recuperar os dados da sua conta pelo e-mail.',
 'passwordreset-legend' => 'Reiniciar a senha',
-'passwordreset-disabled' => 'Reiniciar a senha foi impossibilitado nesta wiki.',
+'passwordreset-disabled' => 'Redefinições de senha foram desabilitadas neste wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Introduza um dos dados abaixo}}',
 'passwordreset-username' => 'Nome de usuário:',
 'passwordreset-domain' => 'Domínio:',
@@ -866,14 +878,14 @@ Senha temporária: $2',
 'link_tip' => 'Link interno',
 'extlink_sample' => 'http://www.example.com título do link',
 'extlink_tip' => 'Link externo (lembre-se do prefixo http://)',
-'headline_sample' => 'Texto do cabeçalho',
+'headline_sample' => 'Conteúdo do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
-'nowiki_tip' => 'Ignorar formato wiki',
+'nowiki_tip' => 'Ignorar a formatação wiki',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Arquivo embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Link para arquivo',
+'media_tip' => 'Link para arquivo',
 'sig_tip' => 'Sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (use de forma moderada)',
 
@@ -887,7 +899,8 @@ Senha temporária: $2',
 'showpreview' => 'Mostrar previsão',
 'showlivepreview' => 'Pré-visualização em tempo real',
 'showdiff' => 'Mostrar alterações',
-'anoneditwarning' => "'''Atenção''': Você não se encontra autenticado. O seu endereço de IP será registrado no histórico de edições desta página.",
+'anoneditwarning' => "'''Atenção''': Você não se encontra autenticado.
+O seu endereço de IP será registrado no histórico de edições desta página.",
 'anonpreviewwarning' => "''Você não está logado. Gravar registará o seu endereço IP no histórico de edições desta página.''",
 'missingsummary' => "'''Lembrete:''' Você não introduziu um sumário de edição. Se clicar novamente em Salvar, a sua edição será salva sem um sumário.",
 'missingcommenttext' => 'Por favor, introduzida um comentário abaixo.',
@@ -940,17 +953,16 @@ Ela pode ter sido movida ou removido enquanto você estava vendo a página.',
 
 A senha para esta nova conta pode ser alterada na página ''[[Special:ChangePassword|de troca de senha]]'', após a autenticação.",
 'newarticle' => '(Nova)',
-'newarticletext' => "Você seguiu um link para uma página que não existe.
-Para criá-la, comece escrevendo na caixa abaixo
-(veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
-Se você chegou aqui por engano, apenas clique no botão '''voltar''' do seu navegador.",
+'newarticletext' => "Você seguiu um link para uma página que ainda não existe.
+Para criá-la, comece escrevendo na caixa abaixo (veja [[{{MediaWiki:Helppage}}|a página de ajuda]] para mais informações).
+Se você chegou aqui por engano, clique no botão '''voltar''' do seu navegador.",
 'anontalkpagetext' => "---- ''Esta é a página de discussão para um usuário anônimo que ainda não criou uma conta ou que não a usa, de forma que temos de utilizar o endereço de IP para identificá-lo(a). Tal endereço de IP pode ser compartilhado por vários usuários. Se você é um usuário anônimo e acha que comentários irrelevantes foram direcionados a você, por gentileza, [[Special:UserLogin/signup|crie uma conta]] ou [[Special:UserLogin|autentique-se]], a fim de evitar futuras confusões com outros usuários anônimos.''",
-'noarticletext' => 'Atualmente não existe texto nesta página.
-Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar nos registros relacionados],
+'noarticletext' => 'No momento, não há conteúdo nesta página.
+Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados],
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.',
-'noarticletext-nopermission' => 'Não há actualmente texto nesta página.
-Você pode [[Special:Search/{{PAGENAME}}|procurar este título de página]] em outras páginas,
-ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar os registos relacionados] </span>.',
+'noarticletext-nopermission' => 'No momento, não há conteúdo nesta página
+Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,
+ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>.',
 'userpage-userdoesnotexist' => 'A conta "<nowiki>$1</nowiki>" não se encontra registrada.
 Verifique se deseja mesmo criar/editar esta página.',
 'userpage-userdoesnotexist-view' => 'A conta de usuário "$1" não está registrada.',
@@ -975,7 +987,8 @@ O registro de bloqueio mais recente é fornecido abaixo, para referência:',
 'updated' => '(Atualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se de que isto é apenas uma previsão.'''
-Suas alterações ainda não foram salvas! [[#editform|→ Continuar editando]]",
+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.
@@ -1030,7 +1043,7 @@ A última entrada no histórico é fornecida abaixo como referência:",
 'templatesusedsection' => '{{PLURAL:$1|Predefinição utilizada|Predefinições utilizadas}} nesta seção:',
 'template-protected' => '(protegida)',
 'template-semiprotected' => '(semi-protegida)',
-'hiddencategories' => 'Esta página integra {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
+'hiddencategories' => 'Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:',
 'edittools' => '<!-- O texto aqui disponibilizado será exibido abaixo dos formulários de edição e de envio de arquivos. -->',
 'nocreatetitle' => 'A criação de páginas se encontra limitada',
 'nocreatetext' => '{{SITENAME}} tem restringida a habilidade de criar novas páginas.
@@ -1041,9 +1054,9 @@ Volte à tela anterior e edite uma página já existente, ou [[Special:UserLogin
 'permissionserrors' => 'Erros de permissões',
 'permissionserrorstext' => 'Você não possui permissão de fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:',
 'permissionserrorstext-withaction' => 'Você não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos motivos a seguir}}:',
-'recreate-moveddeleted-warn' => "Atenção: Você está recriando uma página já eliminada em outra ocasião.'''
+'recreate-moveddeleted-warn' => "'''Atenção: Você está recriando uma página já eliminada em outra ocasião.'''
 
-Você deve considerar se é realmente adequado continuar editando esta página.
+Considere se é realmente adequado continuar editando esta página.
 Os registros de eliminação e de movimentação desta página são exibidos a seguir, para sua comodidade:",
 'moveddeleted-notice' => 'Esta página foi eliminada.
 Os registros de eliminação e de movimentação para esta página estão disponibilizados abaixo, para referência.',
@@ -1056,14 +1069,16 @@ Ela parece ter sido eliminada.',
 'edit-no-change' => 'A sua edição foi ignorada, uma vez que o texto não sofreu alterações.',
 'edit-already-exists' => 'Não foi possível criar uma nova página.
 Ela já existia.',
+'defaultmessagetext' => 'Texto da mensagem padrão',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém muitas chamadas a funções do analisador "parser".
 
 Deveria ter menos de $2 {{PLURAL:$2|chamada|chamadas}}. Neste momento {{PLURAL:$1|há $1 chamada|existem $1 chamadas}}.',
 'expensive-parserfunction-category' => 'Páginas com muitas chamadas a funções do analisador "parser"',
-'post-expand-template-inclusion-warning' => 'Aviso: O tamanho de inclusão de predefinições é muito grande, algumas predefinições não serão incluídas.',
-'post-expand-template-inclusion-category' => 'Páginas onde o tamanho de inclusão de predefinições é excedido',
+'post-expand-template-inclusion-warning' => "'''Aviso''': a soma do tamanho de inclusão de predefinições é muito grande.
+Algumas predefinições não serão processadas.",
+'post-expand-template-inclusion-category' => 'Páginas onde a soma do tamanho de inclusão de predefinições é excedido',
 'post-expand-template-argument-warning' => 'Aviso: Esta página contém pelo menos um argumento de predefinição com um tamanho muito grande.
 Estes argumentos foram omitidos.',
 'post-expand-template-argument-category' => 'Páginas com omissões de argumentos em predefinições',
@@ -1087,10 +1102,10 @@ A justificativa apresentada por $3 foi ''$2''",
 'viewpagelogs' => 'Ver registros para esta página',
 'nohistory' => 'Não há histórico de revisões para esta página.',
 'currentrev' => 'Revisão atual',
-'currentrev-asof' => 'Edição atual tal como $1',
-'revisionasof' => 'Edição de $1',
+'currentrev-asof' => 'Edição atual tal como às $1',
+'revisionasof' => 'Edição das $1',
 'revision-info' => 'Edição feita às $1 por $2',
-'previousrevision' => '← Versão anterior',
+'previousrevision' => '← Edição anterior',
 'nextrevision' => 'Versão posterior →',
 'currentrevisionlink' => 'ver versão atual',
 'cur' => 'atu',
@@ -1098,11 +1113,10 @@ A justificativa apresentada por $3 foi ''$2''",
 'last' => 'ult',
 'page_first' => 'primeira',
 'page_last' => 'última',
-'histlegend' => "Seleção para diferenças: marque as caixas de seleção das versões que deseja comparar e clique no botão na parte inferior.<br />
-Legenda: ''({{int:cur}})''' = diferença com relação a versão atual,
-'''({{int:last}})''' = diferença com relação a versão anterior, '''{{int:minoreditletter}}''' = edição menor.",
+'histlegend' => "Como selecionar: marque as caixas de seleção das versões que deseja comparar e pressione enter ou clique no botão na parte inferior do formulário.<br />
+Legenda: '''({{int:cur}})''' = diferenças em relação a última versão, '''({{int:last}})''' = diferenças em relação a versão anterior, '''{{int:minoreditletter}}''' = edição menor.",
 'history-fieldset-title' => 'Navegar pelo histórico',
-'history-show-deleted' => 'Somente eliminados',
+'history-show-deleted' => 'Apenas as eliminadas',
 'histfirst' => 'Mais antigas',
 'histlast' => 'Mais recentes',
 'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
@@ -1110,11 +1124,11 @@ Legenda: ''({{int:cur}})''' = diferença com relação a versão atual,
 
 # Revision feed
 'history-feed-title' => 'Histórico de revisão',
-'history-feed-description' => 'Histórico de revisões para esta página nesta wiki',
+'history-feed-description' => 'Histórico de revisões para esta página neste wiki',
 'history-feed-item-nocomment' => '$1 em $2',
 'history-feed-empty' => 'A página requisitada não existe.
-Poderá ter sido eliminada da wiki ou renomeada.
-Tente [[Special:Search|pesquisar na wiki]] por páginas relevantes.',
+Poderá ter sido eliminada do wiki ou renomeada.
+Tente [[Special:Search|pesquisar no wiki]] por páginas relevantes.',
 
 # Revision deletion
 'rev-deleted-comment' => '(resumo da edição suprimido)',
@@ -1146,7 +1160,7 @@ Pode mesmo assim [$1 ver estas diferenças] se deseja prosseguir.",
 Você pode ver a diferença entre revisões; podem existir mais detalhes no [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registo de eliminações].",
 'rev-suppressed-diff-view' => "Uma das revisões desta comparação foi '''suprimida''''.
 Você pode ver esta comparação; detalhes podem ser encontradas no [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registro de supressão].",
-'rev-delundel' => 'mostrar/esconder',
+'rev-delundel' => 'exibir/ocultar',
 'rev-showdeleted' => 'exibir',
 'revisiondelete' => 'Eliminar/restaurar edições',
 'revdelete-nooldid-title' => 'Nenhuma revisão selecionada',
@@ -1187,8 +1201,8 @@ $1",
 'logdelete-failure' => "'''A visibilidade do registro não pôde ser estabelecida:'''
 $1",
 'revdel-restore' => 'alterar visibilidade',
-'revdel-restore-deleted' => 'revisões eliminadas',
-'revdel-restore-visible' => 'revisões visíveis',
+'revdel-restore-deleted' => 'edições eliminadas',
+'revdel-restore-visible' => 'edições visíveis',
 'pagehist' => 'Histórico da página',
 'deletedhist' => 'Histórico de eliminações',
 'revdelete-hide-current' => 'Erro ao ocultar o item datado de $2, $1: esta é a revisão atual.
@@ -1247,7 +1261,8 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 
 # Diffs
 'history-title' => 'Histórico de edições de "$1"',
-'difference' => '(Diferença entre revisões)',
+'difference-title' => 'Mudanças entre as edições de "$1"',
+'difference-title-multipage' => 'Mudanças entre as páginas "$1" e "$2"',
 'difference-multipage' => '(Diferenças entre páginas)',
 'lineno' => 'Linha $1:',
 'compareselectedversions' => 'Compare as versões selecionadas',
@@ -1257,7 +1272,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"]])',
@@ -1267,14 +1282,14 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'notitlematches' => 'Nenhum título de página coincide',
 'textmatches' => 'Resultados nos textos das páginas',
 'notextmatches' => 'Não foi possível localizar, no conteúdo das páginas, o termo pesquisado',
-'prevn' => 'anteriores {{PLURAL:$1|$1}}',
-'nextn' => 'próximos {{PLURAL:$1|$1}}',
+'prevn' => '{{PLURAL:$1|anterior|$1 anteriores}}',
+'nextn' => '{{PLURAL:$1|próximo|próximos $1}}',
 'prevn-title' => '$1 {{PLURAL:$1|resultado anterior|resultados anteriores}}',
 'nextn-title' => '{{PLURAL:$1|próximo|próximos}} $1 {{PLURAL:$1|resultado|resultados}}',
 'shown-title' => 'Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página',
 'viewprevnext' => 'Ver ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Opções de pesquisa',
-'searchmenu-exists' => "*'''Há a página \"[[:\$1]]\" neste wiki.'''",
+'searchmenu-exists' => "'''Há uma página com o nome \"[[:\$1]]\" neste wiki'''",
 'searchmenu-new' => "'''Criar a página \"[[:\$1|\$1]]\" neste wiki!'''",
 'searchhelp-url' => 'Help:Conteúdos',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Navegue pelas páginas com este prefixo]]',
@@ -1287,13 +1302,13 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'searchprofile-project-tooltip' => 'Pesquisar em $1',
 'searchprofile-images-tooltip' => 'Pesquisar arquivos',
 'searchprofile-everything-tooltip' => 'Pesquisar em todo o conteúdo (incluindo páginas de discussão)',
-'searchprofile-advanced-tooltip' => 'Pesquisar nos espaços nominais personalizados',
+'searchprofile-advanced-tooltip' => 'Personalizar os espaços nominais onde pesquisar',
 'search-result-size' => '$1 ({{PLURAL:$2|1 palavra|$2 palavras}})',
 'search-result-category-size' => '{{PLURAL:$1|1 membro|$1 membros}} ({{PLURAL:$2|1 subcategoria|$2 subcategorias}}, {{PLURAL:$3|1 arquivo|$3 arquivos}})',
 'search-result-score' => 'Relevância: $1%',
 'search-redirect' => '(redirecionamento de $1)',
 'search-section' => '(seção $1)',
-'search-suggest' => 'Será que quis dizer: $1',
+'search-suggest' => 'Você quis dizer: $1',
 'search-interwiki-caption' => 'Projetos irmãos',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(mais)',
@@ -1307,8 +1322,9 @@ Certifique-se de que tal alteração manterá a continuidade das ações.',
 'showingresults' => "A seguir {{PLURAL:$1|é mostrado '''um''' resultado|são mostrados até '''$1''' resultados}}, iniciando no '''$2'''º.",
 'showingresultsnum' => "A seguir {{PLURAL:$3|é mostrado '''um''' resultado|são mostrados '''$3''' resultados}}, iniciando com o '''$2'''º.",
 'showingresultsheader' => "{{PLURAL:$5|Resulado '''$1''' de '''$3'''|Resultados '''$1 - $2''' de '''$3'''}} para '''$4'''",
-'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão. Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos desta wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
-'search-nonefound' => 'Não houve resultados para a pesquisa.',
+'nonefound' => "'''Nota''': apenas alguns espaços nominais são pesquisados por padrão.
+Tente utilizar o prefixo ''all:'' em sua busca, para pesquisar por todos os conteúdos deste wiki (inclusive páginas de discussão, predefinições etc), ou mesmo, utilizando o espaço nominal desejado como prefixo.",
+'search-nonefound' => 'Não há resultados que correspondam à consulta.',
 'powersearch' => 'Pesquisa avançada',
 'powersearch-legend' => 'Pesquisa avançada',
 'powersearch-ns' => 'Pesquisar nos espaços nominais:',
@@ -1344,6 +1360,7 @@ Note que os índices do sistema de busca externo poderão conter referências de
 'prefs-beta' => 'Características beta',
 'prefs-datetime' => 'Data e hora',
 'prefs-labs' => 'Características de laboratório',
+'prefs-user-pages' => 'Páginas de usuário',
 'prefs-personal' => 'Perfil de usuário',
 'prefs-rc' => 'Mudanças recentes',
 'prefs-watchlist' => 'Lista de páginas vigiadas',
@@ -1379,7 +1396,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'savedprefs' => 'As suas preferências foram salvas.',
 'timezonelegend' => 'Fuso horário:',
 'localtime' => 'Horário local:',
-'timezoneuseserverdefault' => 'Usar padrão da wiki ($1)',
+'timezoneuseserverdefault' => 'Utilizar padrão do wiki ($1)',
 'timezoneuseoffset' => 'Outro (especifique diferença horária)',
 'timezoneoffset' => 'Diferença horária¹',
 'servertime' => 'Horário do servidor:',
@@ -1394,7 +1411,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:',
@@ -1415,7 +1432,7 @@ Esta ação não pode ser desfeita.',
 'yourrealname' => 'Nome verdadeiro:',
 'yourlanguage' => 'Língua:',
 'yourvariant' => 'Variante da língua de conteúdo:',
-'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas desta wiki.',
+'prefs-help-variant' => 'A sua variante preferida ou ortografia para mostrar no conteúdo das páginas deste wiki.',
 'yournick' => 'Assinatura:',
 'prefs-help-signature' => 'Ao inserir comentários em páginas de discussão, assine-os colocando quatro tiles (<nowiki>~~~~</nowiki>) no fim dos comentários. Ao salvar, estes serão convertidos na sua assinatura mais a data e a hora da edição.',
 'badsig' => 'Assinatura inválida; verifique o código HTML utilizado.',
@@ -1466,7 +1483,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 * Uma caixa de seleção desselecionada significa que o usuário não se encontra no grupo.
 * Um * indica que não pode remover o grupo depois de o adicionar, ou vice-versa.',
 'userrights-reason' => 'Motivo:',
-'userrights-no-interwiki' => 'Você não tem permissão de alterar privilégios de usuários em outras wikis.',
+'userrights-no-interwiki' => 'Você não tem permissão para alterar privilégios de usuários em outros wikis.',
 'userrights-nodatabase' => 'O banco de dados $1 não existe ou não é um banco de dados local.',
 'userrights-nologin' => 'Você precisa [[Special:UserLogin|autenticar-se]] como um administrador para especificar os privilégios de usuário.',
 'userrights-notallowed' => 'A sua conta não tem permissão para adicionar ou remover privilégios a usuários.',
@@ -1561,7 +1578,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 # User rights log
 'rightslog' => 'Registro de privilégios de usuário',
 'rightslogtext' => 'Este é um registro de mudanças nos privilégios de usuários.',
-'rightslogentry' => 'foi alterado o grupo de acesso de $1 (de $2 para $3)',
+'rightslogentry' => 'alterou os grupos de privilégios {{GENDER:$1|do usuário|da usuária|de usuário para}} $1 (de $2 para $3)',
 'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
 'rightsnone' => '(nenhum)',
 
@@ -1591,7 +1608,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'action-block' => 'impedir que este usuário edite',
 'action-protect' => 'alterar os níveis de proteção desta página',
 'action-rollback' => 'Reverter rapidamente as edições do último usuário que editou uma página em particular',
-'action-import' => 'importar esta página a partir de outra wiki',
+'action-import' => 'importar esta página a partir de outro wiki',
 'action-importupload' => 'importar esta página através do carregamento de um arquivo',
 'action-patrol' => 'marcar as edições de outros usuários como patrulhadas',
 'action-autopatrol' => 'ter suas edições marcadas como patrulhadas',
@@ -1606,22 +1623,22 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'nchanges' => '$1 {{PLURAL:$1|alteração|alterações}}',
 'recentchanges' => 'Mudanças recentes',
 'recentchanges-legend' => 'Opções das mudanças recentes',
-'recentchangestext' => 'Acompanhe, a partir desta página, as alterações recentes no wiki {{SITENAME}}.',
-'recentchanges-feed-description' => 'Acompanhe, a partir desta feed, as alterações mais recentes no wiki.',
+'recentchanges-summary' => 'Veja as mais novas mudanças na {{SITENAME}} nesta página.',
+'recentchanges-feed-description' => 'Acompanhe neste feed as mudanças mais recentes do wiki.',
 'recentchanges-label-newpage' => 'Esta edição criou uma nova página',
 'recentchanges-label-minor' => 'Esta é uma edição menor',
-'recentchanges-label-bot' => 'Esta edição foi feita por um robô',
+'recentchanges-label-bot' => 'Esta edição foi feita por um bot',
 'recentchanges-label-unpatrolled' => 'Esta edição ainda não foi patrulhada',
 'rcnote' => "A seguir {{PLURAL:$1|está listada '''uma''' alteração ocorrida|estão listadas '''$1''' alterações ocorridas}} {{PLURAL:$2|no último dia|nos últimos '''$2''' dias}}, a partir das $5 de $4.",
-'rcnotefrom' => "Abaixo estão as alterações desde as '''$4''' de '''$3''' (limitadas a '''$1''').",
+'rcnotefrom' => "Seguem as alterações desde as '''$4''' de '''$3''' (limitadas a '''$1''').",
 'rclistfrom' => 'Mostrar as novas alterações a partir das $1',
 'rcshowhideminor' => '$1 edições menores',
-'rcshowhidebots' => '$1 robôs',
+'rcshowhidebots' => '$1 bots',
 'rcshowhideliu' => '$1 usuários registrados',
 'rcshowhideanons' => '$1 usuários anônimos',
 'rcshowhidepatr' => '$1 edições patrulhadas',
 'rcshowhidemine' => '$1 minhas edições',
-'rclinks' => 'Exibir as $1 alterações recentes dos últimos $2 dias<br />$3',
+'rclinks' => 'Exibir as $1 alterações recentes feitas nos últimos $2 dias<br />$3',
 'diff' => 'dif',
 'hist' => 'hist',
 'hide' => 'Ocultar',
@@ -1643,11 +1660,11 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'recentchangeslinked-feed' => 'Alterações relacionadas',
 'recentchangeslinked-toolbox' => 'Alterações relacionadas',
 'recentchangeslinked-title' => 'Alterações relacionadas com "$1"',
-'recentchangeslinked-noresult' => 'Não ocorreram alterações em páginas relacionadas no intervalo de tempo fornecido.',
-'recentchangeslinked-summary' => "Esta página lista alterações feitas recentemente em páginas lincadas a uma em específico (ou de membros de uma categoria especificada).
+'recentchangeslinked-noresult' => 'Não ocorreram alterações em páginas relacionadas no intervalo de tempo especificado.',
+'recentchangeslinked-summary' => "Esta página lista alterações feitas recentemente em páginas com links a uma em específico (ou de membros de uma categoria especificada).
 Páginas de sua [[Special:Watchlist|lista de páginas vigiadas]] são exibidas em '''negrito'''.",
 'recentchangeslinked-page' => 'Nome da página:',
-'recentchangeslinked-to' => 'Mostrar alterações a páginas relacionadas com a página fornecida',
+'recentchangeslinked-to' => 'Visualizar as alterações nas páginas vinculadas à página especificada ao invés disso',
 
 # Upload
 'upload' => 'Enviar arquivo',
@@ -1824,11 +1841,11 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
 'backend-fail-writetemp' => 'Não foi possível gravar no arquivo temporário.',
 'backend-fail-closetemp' => 'Não foi possível fechar o arquivo temporário.',
 'backend-fail-read' => 'Não foi possível ler o arquivo $1.',
-'backend-fail-create' => 'Não foi possível criar o arquivo $1.',
-'backend-fail-maxsize' => 'Não foi possível criar o arquivo $1 por ele ser maior que {{PLURAL:$2|1 byte|$2 bytes}}.',
+'backend-fail-create' => 'Não foi possível criar ou alterar o arquivo $1.',
+'backend-fail-maxsize' => 'Não foi possível criar ou alterar o arquivo $1 por ele ser maior que {{PLURAL:$2|1 byte|$2 bytes}}.',
 'backend-fail-readonly' => 'O servidor de armazenamento "$1" está atualmente no modo "somente leitura". A razão dada foi: "$2"',
 'backend-fail-synced' => 'O arquivo "$1" está em um estado inconsistente dentro do sistema de armazenamento interno',
-'backend-fail-connect' => 'Não foi possível conectar com o servidor de armazenamento "$1".',
+'backend-fail-connect' => 'Não foi possível se conectar 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 arquivo para armazenar em "$1".',
 'backend-fail-batchsize' => 'O servidor de armazenamento retornou um conjunto de $1 {{PLURAL:$1|operação|operações}} de arquivo, enquanto seu limite é de $2 {{PLURAL:$1|operação|operações}}.',
@@ -1844,6 +1861,7 @@ Caso o problema persista, procure um [[Special:ListUsers/sysop|administrador]].'
 'lockmanager-fail-acquirelock' => 'Não foi possível obter uma referência de bloqueio para "$1".',
 'lockmanager-fail-openlock' => 'Não foi possível abrir a referência de bloqueio para "$1".',
 'lockmanager-fail-releaselock' => 'Não foi possível liberar o bloqueio para "$1".',
+'lockmanager-fail-db-bucket' => 'Não foi possível contatar suficientemente bloqueio das bases de dados no bucket $1 .',
 'lockmanager-fail-db-release' => 'Não foi possível liberar os bloqueios para "$1".',
 'lockmanager-fail-svr-release' => 'Não foi possível liberar os bloqueios do servidor "$1".',
 
@@ -1857,7 +1875,7 @@ A sua segurança não pode ser devidamente verificada.',
 
 # Special:UploadStash
 'uploadstash' => 'Arquivos escondidos',
-'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados na wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
+'uploadstash-summary' => 'Esta página dá acesso aos arquivos enviados (ou que estão no processo de envio) mas que ainda não foram publicados no wiki. Estes arquivos não são visíveis para ninguém, exceto para o usuário que os enviou.',
 'uploadstash-clear' => 'Apagar os arquivos escondidos',
 'uploadstash-nofiles' => 'Você não tem nenhum arquivo escondido.',
 'uploadstash-badtoken' => 'Não foi possível executar essa operação, talvez porque as suas credenciais de edição expiraram. Tente novamente.',
@@ -1877,8 +1895,8 @@ Consulte a documentação em [//www.mediawiki.org/wiki/Manual:Image_Authorizatio
 'img-auth-isdir' => 'Você está tentando acessar o diretório "$1".
 Somente acesso ao arquivo é permitido.',
 'img-auth-streaming' => "Realizando ''streaming'' de \"\$1\".",
-'img-auth-public' => 'A img_auth.php produz arquivos a partir de uma wiki privada.
-Esta wiki está configurada como uma wiki pública.
+'img-auth-public' => 'A img_auth.php produz arquivos a partir de um wiki privado.
+Este wiki está configurado como um wiki público.
 Para melhor segurança, o img_auth.php está desativado.',
 'img-auth-noread' => 'Usuário não tem acesso para ler "$1".',
 'img-auth-bad-query-string' => 'A URL tem um texto de consulta inválido.',
@@ -1899,7 +1917,7 @@ Para melhor segurança, o img_auth.php está desativado.',
 'upload-curl-error28' => 'Tempo limite para o envio do arquivo excedido',
 'upload-curl-error28-text' => 'O site demorou muito tempo para responder. Por gentileza, verifique se o site está acessível, aguarde alguns momentos e tente novamente. Talvez você deseje fazer nova tentativa em um horário menos congestionado.',
 
-'license' => 'Licença:',
+'license' => 'Licenciamento:',
 'license-header' => 'Licenciamento',
 'nolicense' => 'Nenhuma selecionada',
 'license-nopreview' => '(Previsão não disponível)',
@@ -1924,14 +1942,14 @@ Um clique sobre um cabeçalho de coluna altera a ordenação.',
 # File description page
 'file-anchor-link' => 'Arquivo',
 'filehist' => 'Histórico do arquivo',
-'filehist-help' => 'Clique em uma data/horário para ver o arquivo tal como ele se encontrava em tal momento.',
+'filehist-help' => 'Clique em uma data/horário para ver como o arquivo estava em um dado momento.',
 'filehist-deleteall' => 'eliminar todas',
 'filehist-deleteone' => 'eliminar',
 'filehist-revert' => 'restaurar',
 'filehist-current' => 'atual',
 'filehist-datetime' => 'Data/Horário',
 'filehist-thumb' => 'Miniatura',
-'filehist-thumbtext' => 'Miniatura para a versão de $1',
+'filehist-thumbtext' => 'Miniatura da versão das $1',
 'filehist-nothumb' => 'Miniatura indisponível',
 'filehist-user' => 'Usuário',
 'filehist-dimensions' => 'Dimensões',
@@ -1943,7 +1961,7 @@ Um clique sobre um cabeçalho de coluna altera a ordenação.',
 'linkstoimage-more' => 'Mais de $1 {{PLURAL:$1|página|páginas}} tem algum link para este arquivo.
 A lista a seguir mostra apenas {{PLURAL:$1|o primeiro link|os $1 primeiros links}} para este arquivo.
 Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
-'nolinkstoimage' => 'Nenhuma página aponta para este arquivo.',
+'nolinkstoimage' => 'Nenhuma página contém links para este arquivo.',
 'morelinkstoimage' => 'Ver [[Special:WhatLinksHere/$1|mais links]] para este arquivo.',
 'linkstoimage-redirect' => '$1 (redirecionamento de arquivo) $2',
 'duplicatesoffile' => '{{PLURAL:$1|O seguinte arquivo é duplicado|Os seguintes arquivos são duplicados}} deste arquivo ([[Special:FileDuplicateSearch/$2|mais detalhes]]):',
@@ -1951,7 +1969,11 @@ Uma [[Special:WhatLinksHere/$2|listagem completa]] está disponível.',
 'sharedupload-desc-there' => 'Este arquivo é do $1 e pode ser utilizado por outros projetos.
 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.',
+Sua [$2 página de descrição de arquivo] é reproduzida 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',
@@ -2002,8 +2024,8 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 
 # Unused templates
 'unusedtemplates' => 'Predefinições não utilizadas',
-'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas numa outra página. Lembre-se de conferir se há outras ligações para as predefinições antes de apaga-las.',
-'unusedtemplateswlh' => 'outras ligações',
+'unusedtemplatestext' => 'Esta página lista todas as páginas no espaço nominal {{ns:template}} que não estão incluídas em uma outra página. Lembre-se de conferir se há outros links para as predefinições antes de apaga-las.',
+'unusedtemplateswlh' => 'outros links',
 
 # Random page
 'randompage' => 'Página aleatória',
@@ -2022,7 +2044,7 @@ A descrição na sua [$2 página de descrição de arquivo] é exibida abaixo.',
 'statistics-header-hooks' => 'Outras estatísticas',
 'statistics-articles' => 'Páginas de conteúdo',
 'statistics-pages' => 'Páginas',
-'statistics-pages-desc' => 'Todas as páginas na wiki, incluindo páginas de discussão, redirecionamentos, etc.',
+'statistics-pages-desc' => 'Todas as páginas no wiki, incluindo páginas de discussão, redirecionamentos, etc.',
 'statistics-files' => 'Arquivos carregados',
 'statistics-edits' => 'Edições de página desde que {{SITENAME}} foi instalado',
 'statistics-edits-average' => 'Média de edições por página',
@@ -2041,7 +2063,7 @@ Uma página é considerada como de desambiguação se utilizar uma predefiniçã
 
 'doubleredirects' => 'Redirecionamentos duplos',
 'doubleredirectstext' => 'Esta página lista as páginas que redirecionam para outros redirecionamentos.
-Cada linha contém ligações para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
+Cada linha contém links para o primeiro e o segundo redirecionamentos, juntamente com o alvo do segundo redirecionamento, que é geralmente a verdadeira página de destino, para a qual o primeiro redirecionamento deveria apontar.
 Entradas <del>riscadas</del> foram resolvidas.',
 'double-redirect-fixed-move' => '[[$1]] foi movido e agora é um redirecionamento para [[$2]]',
 'double-redirect-fixed-maintenance' => 'Corrigindo redirecionamento duplo de [[$1]] para [[$2]].',
@@ -2070,7 +2092,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'ntransclusions' => 'usada {{PLURAL:$1|numa página|em $1 páginas}}',
 'specialpage-empty' => 'Atualmente não há dados a serem exibidos nesta página.',
 'lonelypages' => 'Páginas órfãs',
-'lonelypagestext' => 'As seguintes páginas não recebem ligações nem são incluídas em outras páginas do {{SITENAME}}.',
+'lonelypagestext' => 'As seguintes páginas não recebem links nem são incluídas em outras páginas do {{SITENAME}}.',
 'uncategorizedpages' => 'Páginas não categorizadas',
 'uncategorizedcategories' => 'Categorias não categorizadas',
 'uncategorizedimages' => 'Imagens não categorizadas',
@@ -2082,6 +2104,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',
@@ -2090,10 +2114,11 @@ 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',
-'deadendpagestext' => 'As seguintes páginas não contêm hiperligações para outras páginas nesta wiki.',
+'deadendpagestext' => 'As seguintes páginas não contêm links para outras páginas no wiki {{SITENAME}}.',
 'protectedpages' => 'Páginas protegidas',
 'protectedpages-indef' => 'Proteções infinitas apenas',
 'protectedpages-cascade' => 'Apenas proteções progressivas',
@@ -2119,14 +2144,14 @@ Por favor note que outros websites podem apontar para um arquivo através de um
 'notargettext' => 'Você não especificou uma página alvo ou um usuário para executar esta função.',
 'nopagetitle' => 'Página alvo não existe',
 'nopagetext' => 'A página alvo especificada não existe.',
-'pager-newer-n' => '{{PLURAL:$1|1 recente|$1 recentes}}',
-'pager-older-n' => '{{PLURAL:$1|1 antiga|$1 antigas}}',
+'pager-newer-n' => '{{PLURAL:$1|posterior|$1 posteriores}}',
+'pager-older-n' => '{{PLURAL:$1|1 anterior|$1 anteriores}}',
 'suppress' => 'Supervisor',
 'querypage-disabled' => 'Esta página especial está desativada para não prejudicar o desempenho.',
 
 # Book sources
-'booksources' => 'Fontes de livros',
-'booksources-search-legend' => 'Procurar por fontes de livrarias',
+'booksources' => 'Fontes bibliográficas',
+'booksources-search-legend' => 'Procurar fontes bibliográficas',
 'booksources-go' => 'Ir',
 'booksources-text' => 'É exibida a seguir uma listagem de links para outros sites que vendem livros novos e usados e que possam possuir informações adicionais sobre os livros que você está pesquisando:',
 'booksources-invalid-isbn' => 'O número ISBN fornecido não parece ser válido; verifique se houve erros ao copiar da fonte original.',
@@ -2140,14 +2165,15 @@ Por favor note que outros websites podem apontar para um arquivo através de um
 Você pode diminuir a lista escolhendo um tipo de registro, um nome de usuário (sensível a maiúsculas e minúsculas), ou uma página afetada (também sensível a maiúsculas e minúsculas).',
 'logempty' => 'Nenhum item idêntico no registro.',
 'log-title-wildcard' => 'Procurar por títulos que sejam iniciados com o seguinte texto',
+'showhideselectedlogentries' => 'Exibir/ocultar os itens de registros selecionados',
 
 # Special:AllPages
 'allpages' => 'Todas as páginas',
-'alphaindexline' => '$1 até $2',
+'alphaindexline' => 'De $1 até $2',
 'nextpage' => 'Próxima página ($1)',
 'prevpage' => 'Página anterior ($1)',
-'allpagesfrom' => 'Mostrar páginas começando em:',
-'allpagesto' => 'Terminar de exibir páginas em:',
+'allpagesfrom' => 'Primeira página na listagem:',
+'allpagesto' => 'Última página na listagem:',
 'allarticles' => 'Todas as páginas',
 'allinnamespace' => 'Todas as páginas (espaço nominal $1)',
 'allnotinnamespace' => 'Todas as páginas (excepto as do espaço nominal $1)',
@@ -2159,6 +2185,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.
@@ -2174,14 +2205,14 @@ Veja também [[Special:WantedCategories|categorias pedidas]].',
 'sp-deletedcontributions-contribs' => 'contribuições',
 
 # Special:LinkSearch
-'linksearch' => 'Pesquisa de ligações externas',
+'linksearch' => 'Pesquisa de links externos',
 'linksearch-pat' => 'Procurar padrão:',
 'linksearch-ns' => 'Espaço nominal:',
 'linksearch-ok' => 'Pesquisar',
 'linksearch-text' => 'É possível usar caracteres curinga, como "*.wikipedia.org".
 É necessário, pelo menos, um domínio de nível superior, por exemplo "*.org".<br />
 Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquisa).',
-'linksearch-line' => '$1 está lincado a partir de $2',
+'linksearch-line' => '$2 possui links para $1',
 'linksearch-error' => "\"Caracteres mágicos\" (''wildcards'') só podem ser suados no início do endereço.",
 
 # Special:ListUsers
@@ -2205,7 +2236,7 @@ Protocolos suportados: <tt>$1</tt> (não adicionado nenhum desses em sua pesquis
 
 # Special:ListGroupRights
 'listgrouprights' => 'Privilégios de grupo de usuários',
-'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos nesta wiki, com os seus privilégios de acessos associados.
+'listgrouprights-summary' => 'O que segue é uma lista dos grupos de usuários definidos neste wiki, com os seus privilégios de acessos associados.
 Pode haver [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Privilégio concedido</span>
 * <span class="listgrouprights-revoked">Privilégio revogado</span>',
@@ -2346,8 +2377,8 @@ Para comentários e pedidos de ajuda:
 'historywarning' => "'''Atenção:''' A página que você está prestes a eliminar possui um histórico com aproximadamente $1 {{PLURAL:$1|revisão|revisões}}:",
 'confirmdeletetext' => 'Encontra-se prestes a eliminar permanentemente uma página ou uma imagem e todo o seu histórico.
 Por favor, confirme que possui a intenção de fazer isto, que compreende as consequências e que encontra-se a fazer isto de acordo com as [[{{MediaWiki:Policy-url}}|políticas]] do projeto.',
-'actioncomplete' => 'Ação completada',
-'actionfailed' => 'A ação falhou',
+'actioncomplete' => 'Ação concluída',
+'actionfailed' => 'Falha na ação',
 'deletedtext' => '"$1" foi eliminada.
 Consulte $2 para um registro de eliminações recentes.',
 'dellogpage' => 'Registro de eliminação',
@@ -2371,7 +2402,7 @@ prossiga com cuidado.',
 # Rollback
 'rollback' => 'Reverter edições',
 'rollback_short' => 'Reverter',
-'rollbacklink' => 'voltar',
+'rollbacklink' => 'reverter',
 'rollbackfailed' => 'A reversão falhou',
 'cantrollback' => 'Não foi possível reverter a edição; o último contribuidor é o único autor desta página',
 'alreadyrolled' => 'Não foi possível reverter a última edição de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2513,48 +2544,48 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contribuições do usuário',
-'contributions-title' => 'Contribuições do usuário $1',
+'contributions' => 'Contribuições {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária}}',
+'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
 'mycontris' => 'Minhas contribuições',
 'contribsub2' => 'Para $1 ($2)',
 'nocontribs' => 'Não foram encontradas mudanças com este critério.',
-'uctop' => ' (revisão atual)',
+'uctop' => '(atual)',
 'month' => 'Mês (inclusive anteriores):',
 'year' => 'Ano (inclusive anteriores):',
 
-'sp-contributions-newbies' => 'Mostrar só as contribuições das contas recentes',
+'sp-contributions-newbies' => 'Mostrar apenas as contribuições das novas contas',
 'sp-contributions-newbies-sub' => 'Para contas novas',
 'sp-contributions-newbies-title' => 'Contribuições de contas novas',
 'sp-contributions-blocklog' => 'Registro de bloqueios',
 'sp-contributions-deleted' => 'contribuições eliminadas',
-'sp-contributions-uploads' => 'carregamentos',
+'sp-contributions-uploads' => 'envios',
 'sp-contributions-logs' => 'registros',
 'sp-contributions-talk' => 'disc',
 'sp-contributions-userrights' => 'gerenciamento de privilégios de usuários',
 'sp-contributions-blocked-notice' => 'Este usuário atualmente está bloqueado. O registro de bloqueio mais recente é fornecido abaixo para referência:',
 'sp-contributions-blocked-notice-anon' => 'Este endereço IP encontra-se bloqueado.
 Segue, para referência, a entrada mais recente no registro de bloqueios:',
-'sp-contributions-search' => 'Pesquisar contribuições',
+'sp-contributions-search' => 'Navegar pelas contribuições',
 'sp-contributions-username' => 'Endereço de IP ou usuário:',
-'sp-contributions-toponly' => 'Mostrar somente as revisões mais recentes',
+'sp-contributions-toponly' => 'Mostrar somente as edições que sejam a última alteração',
 'sp-contributions-submit' => 'Pesquisar',
 
 # What links here
 'whatlinkshere' => 'Páginas afluentes',
-'whatlinkshere-title' => 'Páginas que apontam para "$1"',
+'whatlinkshere-title' => 'Páginas que têm links para "$1"',
 'whatlinkshere-page' => 'Página:',
-'linkshere' => "As seguintes páginas possuem ligações para '''[[:$1]]''':",
-'nolinkshere' => "Não existem ligações para '''[[:$1]]'''.",
+'linkshere' => "As seguintes páginas possuem links para '''[[:$1]]''':",
+'nolinkshere' => "Não há links para '''[[:$1]]'''.",
 'nolinkshere-ns' => "Não há links para '''[[:$1]]''' no espaço nominal selecionado.",
 'isredirect' => 'página de redirecionamento',
-'istemplate' => 'inclusão',
+'istemplate' => 'transclusão',
 'isimage' => 'link para o arquivo',
 'whatlinkshere-prev' => '{{PLURAL:$1|anterior|$1 anteriores}}',
 'whatlinkshere-next' => '{{PLURAL:$1|próximo|próximos $1}}',
 'whatlinkshere-links' => '← links',
 'whatlinkshere-hideredirs' => '$1 redirecionamentos',
 'whatlinkshere-hidetrans' => '$1 transclusões',
-'whatlinkshere-hidelinks' => '$1 ligações',
+'whatlinkshere-hidelinks' => '$1 links',
 'whatlinkshere-hideimages' => '$1 links de imagens',
 'whatlinkshere-filters' => 'Filtros',
 
@@ -2595,8 +2626,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',
@@ -2616,7 +2647,7 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
 'blocklist-userblocks' => 'Esconder bloqueios de contas',
 'blocklist-tempblocks' => 'Esconder bloqueios temporários',
 'blocklist-addressblocks' => 'Esconder bloqueios de IP único',
-'blocklist-rangeblocks' => 'Ocultar blocos gama',
+'blocklist-rangeblocks' => 'Ocultar bloqueios de faixas',
 'blocklist-timestamp' => 'Data e hora',
 'blocklist-target' => 'Destinatário',
 'blocklist-expiry' => 'Expira',
@@ -2646,11 +2677,11 @@ Consulte a [[Special:BlockList|lista de IPs bloqueados]] para rever os bloqueios
 O registro de bloqueio é fornecido abaixo, para referência:',
 'blocklog-showsuppresslog' => 'O usuário foi bloqueado e ocultado anteriormente.
 O registro de supressão é fornecido abaixo para referência:',
-'blocklogentry' => 'bloqueou "[[$1]]" $3. O bloqueio expira em $2.',
-'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] $3. O bloqueio expira em $2.',
+'blocklogentry' => 'bloqueou "[[$1]]" por $2. $3',
+'reblock-logentry' => 'modificou parâmetros de bloqueio de [[$1]] com expiração em $2. $3',
 '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',
@@ -2792,12 +2823,13 @@ A última entrada no histórico é fornecida abaixo para referência:",
 Por favor, escolha outro nome.',
 
 # Export
-'export' => 'Exportação de páginas',
-'exporttext' => 'Você pode exportar o texto e o histórico de edições de uma página em particular para um arquivo XML. Poderá então importar esse conteúdo noutra wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
+'export' => 'Exportar páginas',
+'exporttext' => 'Você pode exportar o texto e o histórico de edições, ou de uma página em particular ou de um conjunto de páginas, para um arquivo XML.
+A partir disso, será possível importar esse conteúdo em outro wiki que utilize o software MediaWiki através da [[Special:Import|página de importações]].
 
-Para exportar páginas, introduza os títulos na caixa de texto abaixo (um título por linha) e selecione se deseja todas as versões, com as linhas de histórico de edições, ou apenas a edição atual e informações apenas sobre a mais recente das edições.
+Para exportar páginas, insira os títulos na caixa de texto abaixo, um título por linha; selecione entre a edição atual acompanhada das edições anteriores e respectivo histórico de edições ou entre apenas a última edição e suas respectivas informações.
 
-Se desejar, pode utilizar uma ligação (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a [[{{MediaWiki:Mainpage}}]]).',
+Para o último caso, é possível obter o XML a partir de um link direto (por exemplo, [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para a edição mais recente da página "[[{{MediaWiki:Mainpage}}]]").',
 'exportall' => 'Exportar todas as páginas',
 'exportcuronly' => 'Incluir apenas a revisão atual, não o histórico inteiro',
 'exportnohistory' => "----
@@ -2835,6 +2867,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',
@@ -2854,7 +2888,7 @@ Todas as ações de importação transwiki são registradas no [[Special:Log/imp
 'import-interwiki-namespace' => 'Domínio de destino:',
 'import-upload-filename' => 'Nome do arquivo:',
 'import-comment' => 'Comentário:',
-'importtext' => 'Por favor, exporte o arquivo da wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
+'importtext' => 'Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
 Salve o arquivo no seu computador e importe-o aqui.',
 'importstart' => 'Importando páginas...',
 'import-revision-count' => '{{PLURAL:$1|uma edição|$1 edições}}',
@@ -2878,13 +2912,16 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'xml-error-string' => '$1 na linha $2, coluna $3 (byte $4): $5',
 'import-upload' => 'Enviar dados em XML',
 'import-token-mismatch' => 'Perda dos dados da sessão. Por favor tente novamente.',
-'import-invalid-interwiki' => 'Não é possível importar da wiki especificada.',
+'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',
-'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outras wikis.',
+'importlogpagetext' => 'Importações administrativas de páginas com a preservação do histórico de edição de outros wikis.',
 'import-logentry-upload' => 'importou [[$1]] através de arquivo de importação',
 'import-logentry-upload-detail' => '{{PLURAL:$1|uma edição|$1 edições}}',
 'import-logentry-interwiki' => 'transwiki $1',
@@ -2892,75 +2929,85 @@ 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.',
+'javascripttest-qunit-heading' => 'Suíte de ferramentas de teste JavaScript QUnit para MediaWiki',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Sua página de usuário',
 'tooltip-pt-anonuserpage' => 'A página de usuário para o ip com o qual você está editando',
 'tooltip-pt-mytalk' => 'Sua página de discussão',
 'tooltip-pt-anontalk' => 'Discussão sobre edições deste endereço de ip',
-'tooltip-pt-preferences' => 'Suas preferências',
-'tooltip-pt-watchlist' => 'A lista de páginas cujas alterações você está monitorando',
-'tooltip-pt-mycontris' => 'Lista das suas contribuições',
+'tooltip-pt-preferences' => 'Suas configurações',
+'tooltip-pt-watchlist' => 'Lista de alterações nas páginas que você está monitorando',
+'tooltip-pt-mycontris' => 'Listagem de suas contribuições',
 'tooltip-pt-login' => 'Você é encorajado a autenticar-se, apesar disso não ser obrigatório.',
 '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-viewsource' => 'Esta página está protegida.
+Você pode, no entanto, visualiar seu código-fonte.',
 'tooltip-ca-history' => 'Edições anteriores desta página.',
 'tooltip-ca-protect' => 'Proteger esta página',
 'tooltip-ca-unprotect' => 'Alterou a proteção desta página',
 'tooltip-ca-delete' => 'Apagar esta página',
 'tooltip-ca-undelete' => 'Restaurar edições feitas a esta página antes da eliminação',
 'tooltip-ca-move' => 'Mover esta página',
-'tooltip-ca-watch' => 'Adicionar esta página às páginas vigiadas',
+'tooltip-ca-watch' => 'Adicionar esta página à sua lista de páginas vigiadas',
 'tooltip-ca-unwatch' => 'Remover esta página da lista de páginas vigiadas',
-'tooltip-search' => 'Pesquisar nesta wiki',
+'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' => 'A lista de mudanças recentes nesta 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',
 'tooltip-ca-nstab-main' => 'Ver a página de conteúdo',
 'tooltip-ca-nstab-user' => 'Ver a página de usuário',
 'tooltip-ca-nstab-media' => 'Ver a página de mídia',
-'tooltip-ca-nstab-special' => 'Esta é uma página especial, não pode ser editada.',
+'tooltip-ca-nstab-special' => 'Esta é uma página especial. Não é possível editar seu conteúdo de forma direta.',
 'tooltip-ca-nstab-project' => 'Ver a página de projeto',
 'tooltip-ca-nstab-image' => 'Ver a página de arquivo',
 'tooltip-ca-nstab-mediawiki' => 'Ver a mensagem de sistema',
 'tooltip-ca-nstab-template' => 'Ver a predefinição',
 'tooltip-ca-nstab-help' => 'Ver a página de ajuda',
-'tooltip-ca-nstab-category' => 'Ver a página da categoria',
-'tooltip-minoredit' => 'Marcar como edição menor',
-'tooltip-save' => 'Salvaas alterações',
-'tooltip-preview' => 'Prever as alterações, por favor utilizar antes de salvar!',
-'tooltip-diff' => 'Mostrar alterações que fez a este texto.',
-'tooltip-compareselectedversions' => 'Ver as diferenças entre as duas versões selecionadas desta página.',
+'tooltip-ca-nstab-category' => 'Ver a página descritiva da categoria',
+'tooltip-minoredit' => 'Marcar esta alteração como uma edição menor',
+'tooltip-save' => 'Salva as suas alterações',
+'tooltip-preview' => 'Prevê as alterações feitas por você. Antes de salvar, use para ver se está tudo como esperado!',
+'tooltip-diff' => 'Visualizar as alterações que você fez no texto',
+'tooltip-compareselectedversions' => 'Ver o que há de diferente entre as duas versões selecionadas desta página.',
 'tooltip-watch' => 'Adicionar esta página à sua lista de páginas vigiadas',
 'tooltip-watchlistedit-normal-submit' => 'Remover títulos',
+'tooltip-watchlistedit-raw-submit' => 'Atualizar a lista de páginas vigiadas',
 'tooltip-recreate' => 'Recriar a página apesar de ter sido eliminada',
 'tooltip-upload' => 'Iniciar o carregamento',
-'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com um só clique, as edições do último editor desta página.',
-'tooltip-undo' => '"{{int:editundo}}" reverte esta edição exibindo a caixa de edição no modo de previsão, permitindo alterações adicionais e o uso do sumário de edição para justificativas.',
+'tooltip-rollback' => '"{{int:rollbacklink}}" reverte, com apenas um clique, as edições do último editor desta página.',
+'tooltip-undo' => '"desfazer" reverte esta edição e apresenta a página de edição no modo de previsão.
+Permite colocar uma justificativa no sumário da edição.',
 'tooltip-preferences-save' => 'Salvar preferências',
-'tooltip-summary' => 'Forneça um breve sumário',
+'tooltip-summary' => 'Forneça um breve resumo',
 
 # Stylesheets
 'common.css' => '/** o código CSS colocado aqui será aplicado a todos os temas */',
@@ -3000,7 +3047,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'spamprotectionmatch' => 'O seguinte texto ativou o filtro de spam: $1',
 'spambot_username' => 'MediaWiki limpeza de spam',
 'spam_reverting' => 'Revertendo para a última versão que não contém links para $1',
-'spam_blanking' => 'Todas revisões contendo hiperligações para $1, limpando',
+'spam_blanking' => 'Todas revisões contendo links para $1, limpando',
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
@@ -3067,7 +3114,7 @@ Executá-lo poderá comprometer a segurança do seu sistema.",
 'file-info-size-pages' => '$1 × $2 pixels, tamanho do arquivo: $3, tipo MIME: $4, $5 {{PLURAL:$5|página|páginas}}',
 'file-nohires' => 'Sem resolução maior disponível.',
 'svg-long-desc' => 'arquivo SVG, de $1 × $2 pixels, tamanho: $3',
-'show-big-image' => 'Resolução completa',
+'show-big-image' => 'Resolução original',
 'show-big-image-preview' => 'Tamanho desta previsualização: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.',
 'show-big-image-size' => '$1 × $2 pixels',
@@ -3099,17 +3146,18 @@ 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',
-'metadata-help' => "Este arquivo contém informação adicional, provavelmente adicionada a partir da câmara digital ou ''scanner'' utilizada para criar ou digitalizá-lo.
-Caso o arquivo tenha sido modificado a partir do seu estado original, alguns detalhes poderão não refletir completamente as mudanças efetuadas.",
+'metadata-help' => 'Este arquivo contém dados adicionais, provavelmente adicionados pela câmera digital ou scanner utilizado para criar ou digitalizá-lo.
+Caso o arquivo tenha sofrido alterações, alguns detalhes poderão ser diferentes do que o arquivo atual é.',
 'metadata-expand' => 'Mostrar detalhes adicionais',
 'metadata-collapse' => 'Esconder detalhes restantes',
-'metadata-fields' => 'Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida. Por omissão, outros campos estarão ocultos.
+'metadata-fields' => 'Os campos de metadados de imagens listados nesta mensagem serão incluídos na página de descrição da imagem quando a tabela de metadados estiver recolhida.
+Por padrão, outros campos estarão ocultos.
 * make
 * model
 * datetimeoriginal
@@ -3514,19 +3562,22 @@ Caso o arquivo tenha sido modificado a partir do seu estado original, alguns det
 'exif-urgency-other' => 'Prioridade definida pelo usuário ($1)',
 
 # External editor support
-'edit-externally' => 'Editar este arquivo utilizando uma aplicação externa',
+'edit-externally' => 'Editar este arquivo a partir de um programa externo',
 'edit-externally-help' => '(Consulte as [//www.mediawiki.org/wiki/Manual:External_editors instruções de instalação] para maiores informações)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'todas',
-'namespacesall' => 'todas',
+'namespacesall' => 'todos',
 'monthsall' => 'todos',
 'limitall' => 'todas',
 
 # E-mail address confirmation
 'confirmemail' => 'Confirmar endereço de E-mail',
 'confirmemail_noemail' => 'Não possui um endereço de e-mail válido indicado nas suas [[Special:Preferences|preferências de usuário]].',
-'confirmemail_text' => 'Esta wiki requer que valide o seu endereço de e-mail antes de utilizar as funcionalidades que requerem um endereço de e-mail. Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail. A mensagem incluíra um endereço que contém um código; carregue o endereço no seu navegador para confirmar que o seu endereço de e-mail encontra-se válido.',
+'confirmemail_text' => '{{SITENAME}} requer o seu endereço de e-mail esteja validado antes de utilizar as funcionalidades que requerem um endereço de e-mail.
+Ative o botão abaixo para enviar uma confirmação para o seu endereço de e-mail.
+A mensagem incluirá um link que contém um código;
+acesse o link no seu navegador para confirmar que o seu endereço de e-mail é válido.',
 'confirmemail_pending' => 'Um código de confirmação já foi enviado para você; caso tenha criado sua conta recentemente, é recomendável aguardar alguns minutos para o receber antes de tentar pedir um novo código.',
 'confirmemail_send' => 'Enviar código de confirmação',
 'confirmemail_sent' => 'E-mail de confirmação enviado.',
@@ -3701,7 +3752,7 @@ Você também pode [[Special:EditWatchlist|editar a lista da maneira convenciona
 'version-hook-subscribedby' => 'Subscrito por',
 'version-version' => '(Versão $1)',
 'version-license' => 'Licença',
-'version-poweredby-credits' => "Esta é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Este é um wiki '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
 'version-license-info' => 'O MediaWiki é software livre; pode redistribuí-lo e/ou modificá-lo nos termos da licença GNU General Public License, tal como publicada pela Free Software Foundation; tanto a versão 2 da Licença, como (por opção sua) qualquer versão posterior.
 
@@ -3711,6 +3762,9 @@ 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' => 'URLs dos pontos de entrada',
+'version-entrypoints-header-entrypoint' => 'Ponto de entrada',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Diretório do arquivo',
@@ -3753,18 +3807,18 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'intentionallyblankpage' => 'Esta página foi intencionalmente deixada em branco e é usada para medições de performance, etc.',
 
 # External image whitelist
-'external_image_whitelist' => " # Deixe esta linha exatamente como ela é <pre>
-# Coloque uma expressão regular (apenas a parte que vai entre o //) a seguir
+'external_image_whitelist' => " # Deixe esta linha exatamente como ela está <pre>
+# Insira uma expressão regular (apenas a parte que vai entre o //) a seguir
 # Estas serão casadas com as URLs de imagens externas (''hotlinked'')
-# Aqueles que corresponderem serão exibidos como imagens, caso contrário, apenas uma ligação para a imagem será mostrada
+# Aquelas que corresponderem serão exibidas como imagens; caso contrário, apenas um link para a imagem será mostrado
 # As linhas que começam com # são tratadas como comentários
 # Isto não é sensível à capitalização
 
-# Coloque todos os fragmentos de ''regex'' acima dessa linha. Deixe esta linha exatamente como ela é</pre>",
+# Coloque todos os fragmentos de ''regex'' acima dessa linha. Deixe esta linha exatamente como ela está</pre>",
 
 # Special:Tags
 'tags' => 'Etiquetas de modificação válidas',
-'tag-filter' => 'Filtro de [[Special:Tags|etiquetas]]:',
+'tag-filter' => 'Filtrar [[Special:Tags|etiquetas]]:',
 'tag-filter-submit' => 'Filtrar',
 'tags-title' => 'Etiquetas',
 'tags-intro' => 'Esta página lista as etiquetas com que o software poderá marcar uma edição, e o seu significado.',
@@ -3815,7 +3869,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 # New logging system
 'logentry-delete-delete' => '$1 apagou a página $3',
 'logentry-delete-restore' => '$1 restaurou a página $3',
-'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|das $5 entradas}} em $3: $4',
+'logentry-delete-event' => '$1 alterou a visibilidade {{PLURAL:$5|de uma entrada|de $5 entradas}} do registro $3: $4',
 'logentry-delete-revision' => '$1 alterou a visibilidade {{PLURAL:$5|de uma revisão|das $5 revisões}} em $3: $4',
 'logentry-delete-event-legacy' => '$1 alterou a visibilidade de uma entrada em $3',
 'logentry-delete-revision-legacy' => '$1 alterou a visibilidade de uma revisão em $3',
@@ -3845,6 +3899,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',
@@ -3853,10 +3909,13 @@ 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 esta wiki.',
+'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
 'api-error-badtoken' => 'Erro interno: token inválido.',
 'api-error-copyuploaddisabled' => 'O upload por URL está desativado neste servidor.',
 'api-error-duplicate' => 'Já {{PLURAL:$1|há [$2 outro arquivo]|existem [$2 outros arquivos]}} com o mesmo conteúdo',
@@ -3873,7 +3932,7 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-hookaborted' => 'A modificação que você tentou realizar foi abortada pelo hook de uma extensão.',
 'api-error-http' => 'Erro interno: não foi possível conectar ao servidor.',
 'api-error-illegal-filename' => 'O nome do arquivo não é permitido.',
-'api-error-internal-error' => 'Erro interno: ocorreu um erro indeterminado na wiki ao processar o arquivo que você enviou.',
+'api-error-internal-error' => 'Erro interno: ocorreu algum erro ao processar o arquivo que você enviou ao wiki.',
 'api-error-invalid-file-key' => 'Erro interno: o arquivo não foi encontrado no armazenamento temporário.',
 'api-error-missingparam' => 'Erro interno: parâmetros em falta no pedido.',
 'api-error-missingresult' => 'Erro interno: não foi possível determinar se a cópia foi feita.',
@@ -3890,7 +3949,18 @@ As imagens serão exibidas em sua resolução máxima, outros tipos de arquivos
 'api-error-unknown-error' => 'Erro interno: ocorreu um erro indeterminado ao tentar enviar o arquivo.',
 'api-error-unknown-warning' => 'Aviso desconhecido: $1',
 'api-error-unknownerror' => 'Erro desconhecido: "$1".',
-'api-error-uploaddisabled' => 'Esta wiki está com uploads de arquivos desativados.',
+'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 299eec9..51f005d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author *Surak*
+ * @author Abanima
  * @author Ahonc
  * @author Aleator
  * @author AlexSm
@@ -19,6 +20,7 @@
  * @author Bangin
  * @author Bennylin
  * @author Beta16
+ * @author Bilalokms
  * @author Boivie
  * @author Brest
  * @author BrokenArrow
@@ -72,6 +74,7 @@
  * @author Mihai
  * @author Mormegil
  * @author Mpradeep
+ * @author Murma174
  * @author Najami
  * @author Nemo bis
  * @author Niels
  * @author Rancher
  * @author Raymond
  * @author Robby
+ * @author Rotemliss
  * @author Ryan Schmidt
  * @author SPQRobin
  * @author Sanbec
  * @author Sborsody
  * @author Seb35
  * @author Sherbrooke
+ * @author Shirayuki
  * @author Shushruth
+ * @author Siddhartha Ghai
  * @author Siebrand
  * @author Singularity
  * @author Sionnach
@@ -133,7 +139,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Option in Recent changes tab of [[Special:Preferences]] (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
 'tog-newpageshidepatrolled' => 'Toggle in [[Special:Preferences]], section "Recent changes" (if [[mw:Manual:$wgUseRCPatrol|$wgUseRCPatrol]] is enabled). {{Gender}}',
 'tog-extendwatchlist' => "[[Special:Preferences]], tab 'Watchlist'. Offers user to show all applicable changes in watchlist (by default only the last change to a page on the watchlist is shown). {{Gender}}",
-'tog-usenewrc' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to use alternative reprsentation of [[Special:RecentChanges]]. {{Gender}}",
+'tog-usenewrc' => "[[Special:Preferences]], tab 'Recent changes'. Offers user to use alternative representation of [[Special:RecentChanges]] and watchlist. {{Gender}}",
 'tog-numberheadings' => "[[Special:Preferences]], tab 'Misc'. Offers numbered headings on content pages to user. {{Gender}}",
 'tog-showtoolbar' => "[[Special:Preferences]], tab 'Edit'. Offers user to show edit toolbar in page edit screen. {{Gender}}
 
@@ -305,6 +311,9 @@ See http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for
 'index-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [//www.mediawiki.org/wiki/Help:Magic_words#Behavior_switches mediawiki].',
 'noindex-category' => 'Name of the [[mw:Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behaviour switch are listed. For description of this behaviour switch see [//www.mediawiki.org/wiki/Help:Magic_words#Behavior_switches mediawiki].',
 'broken-file-category' => 'Name of [[mw:Help:Tracking categories|tracking category]] where pages that embed files that do not exist ("broken images") are listed.',
+'categoryviewer-pagedlinks' => 'The pagination links in category viewer. Parameters:
+* $1 is the previous link,
+* $2 is the next link',
 
 'linkprefix' => '{{optional}}',
 
@@ -314,7 +323,7 @@ See http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for
 Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
 
 {{Identical|Content page}}",
-'newwindow' => 'Below the edit form, next to "[[MediaWiki:Edithelp/{{SUBPAGENAME}}|Editing help]]".',
+'newwindow' => 'Below the edit form, next to "{{msg-mw|Edithelp}}".',
 'cancel' => 'Message shown below the edit form, and if you click on it, you stop with editing the page and go back to the normal page view.
 
 {{Identical|Cancel}}',
@@ -406,7 +415,7 @@ Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
 'edit' => 'The text of the tab going to the edit form. When the page is protected, you will see "[[MediaWiki:Viewsource/{{SUBPAGENAME}}|{{int:viewsource}}]]". Should be in the infinitive mood.
 
 {{Identical|Edit}}',
-'create' => 'The text on the tab for to the edit form on unexisting pages.
+'create' => 'The text on the tab of the edit form on unexisting pages starts editing them.
 
 {{Identical|Create}}',
 'editthispage' => 'This is the "edit" link as used in the skins Classic/Standard, Cologne Blue and Nostalgia. See {{msg|create-this-page}} for when the page does not exist.',
@@ -553,7 +562,7 @@ The format is: "{{int:youhavenewmessagesmulti| [[MediaWiki:Newmessageslink/{{SUB
 
 {{Identical|View source}}',
 'editsectionhint' => "Tool tip shown when hovering the mouse over the link to '[{{MediaWiki:Editsection}}]' a section. Example: Edit section: Heading name",
-'toc' => 'Ini adalah judul "Daftar isi" yang terlihat pada halaman yang memiliki lebih dari 3 bagian
+'toc' => 'This is the title of the table of contents displayed in pages with more than 3 sections
 
 {{Identical|Contents}}',
 'showtoc' => 'This is the link used to show the table of contents
@@ -681,6 +690,15 @@ $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)',
+'exception-nologin' => 'Generic page title used on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
+'exception-nologin-text' => 'Generic reason displayed on error page when a user is not logged in. Message used by the UserNotLoggedIn exception.',
 
 # Login and logout pages
 'logouttext' => 'Log out message',
@@ -717,7 +735,9 @@ $1 is a filename, I think.',
 'nologin' => 'A message shown in the log in form. $1 is a link to the account creation form, and the text of it is "[[MediaWiki:Nologinlink/{{SUBPAGENAME}}|{{int:nologinlink}}]]".',
 'nologinlink' => 'Text of the link to the account creation form. Before that link, the message [[MediaWiki:Nologin/{{SUBPAGENAME}}]] appears.
 {{Identical|Create an account}}',
-'createaccount' => 'The title of Special:CreateAccount, where users can register a new account. Used on Special:SpecialPages, and also on the submit button in the form where you register a new account.
+'createaccount' => 'The title of Special:CreateAccount, where users can register a new account. Used on Special:SpecialPages and on the submit button in the form where you register a new account.
+
+It is also used on the top of the page for logged out users, where it appears next to {{msg-mw|login}}, so consider making them similar.
 {{Identical|Create account}}',
 'gotaccount' => 'A message shown in the account creation form. $1 is a link to the log in form, and the text of it is "[[MediaWiki:Gotaccountlink/{{SUBPAGENAME}}|{{int:gotaccountlink}}]]".',
 'gotaccountlink' => 'Text of the link to the log in form. Before that link, the message [[MediaWiki:Gotaccount/{{SUBPAGENAME}}]] appears.
@@ -731,7 +751,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.
 
@@ -781,7 +803,7 @@ Parameters:
 *Parameter $4 is a URL to the wiki',
 'login-throttled' => 'Error message shown at [[Special:UserLogin]] after 5 wrong passwords. The hardcoded waiting time is 300 seconds.',
 'login-abort-generic' => 'The generic unsuccessful login message is used unless otherwise specified by hook writers',
-'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true.
+'loginlanguagelabel' => 'Used on [[Special:UserLogin]] if $wgLoginLanguageSelector is true. $1 is a pipe-separated list built from the names that appear in the message {{msg-mw|Loginlanguagelinks}}.
 {{Identical|Language}}',
 
 # E-mail sending
@@ -971,6 +993,7 @@ See also {{msg-mw|Noarticletext-nopermission}}.',
 'sitejspreview' => 'Text displayed on preview of .js pages in MediaWiki namespace',
 'updated' => '{{Identical|Updated}}',
 'previewnote' => 'Note displayed when clicking on Show preview',
+'continue-editing' => 'A link to the beginning of the editing textarea on the same page. Displayed after {{msg-mw|previewnote}}.',
 'editing' => "Shown as page title when editing a page. \$1 is the name of the page that is being edited. Example: \"''Editing Main Page''\".",
 'creating' => "Shown as page title when creating a page. Parameters:
 * \$1 is the name of the page that is being created. Example: \"''Creating Main Page''\".",
@@ -1018,6 +1041,23 @@ 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',
+'parser-unstrip-loop-warning' => 'This error is shown when a parser extension tag such as &lt;pre> includes a reference to itself in its own output.
+The reference must be to the exact same invocation of the tag at the same location in the source, merely writing &lt;pre>&lt;pre>&lt;/pre>&lt;/pre> will not do it.
+This is usually impossible and unlikely to happen by accident, so translation is not essential.',
+'parser-unstrip-recursion-limit' => 'This message is shown when the recursion limit for nested parser extension tags is exceeded.
+This warning may be encountered due to input text like &lt;ref>&lt;ref>&lt;ref>...&lt;/ref>&lt;/ref>&lt;/ref>.
+
+* <tt>$1</tt> is the 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.
@@ -1209,6 +1249,13 @@ Parameters:
 *Parameter $3 is a log comment for the merge',
 'mergehistory-same-destination' => 'Error message shown on [[Special:MergeHistory]] when the user entered the same page title to both source and destination',
 'mergehistory-reason' => '{{Identical|Reason}}',
+'mergehistory-revisionrow' => 'A revision row in the merge history page. Parameters:
+* $1 is a radio button to indicate a merge point,
+* $2 is a link to the last revision of a page ({{msg-mw|last}}),
+* $3 is a page link,
+* $4 is a user link,
+* $5 is a revision size,
+* $6 is a revision comment',
 
 # Merge log
 'mergelog' => 'This is the name of a log of merge actions done on [[Special:MergeHistory]]. This special page and this log is not enabled by default.',
@@ -1225,12 +1272,13 @@ Please note that the parameters in a log entry will appear in the log only in th
 
 # Diffs
 'history-title' => 'Displayed as page title when you click on the "history" tab. The parameter $1 is the normal page title.',
-'difference' => 'Displayed under the title when viewing the difference between two or more edits.',
+'difference-title' => 'Displayed as page title when viewing the difference between two edits of the same page. The parameter $1 is the page title of the two revisions.',
+'difference-title-multipage' => 'Displayed as page title when viewing the difference between two edits of different pages. The parameter $1 is the page title of the old revision and $2 is the page title of the new revision.',
 'difference-multipage' => 'Displayed under the title when viewing the difference between two or more pages.
 See also {{msg-mw|difference}}.',
 'lineno' => 'Message used when comparing different versions of a page (diff). $1 is a line number.',
 'compareselectedversions' => 'Used as button in history pages.',
-'showhideselectedversions' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu.',
+'showhideselectedversions' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on history pages.',
 'editundo' => 'Undo link when viewing diffs
 {{Identical|Undo}}
 
@@ -1361,6 +1409,7 @@ This is a search result (and I guess search engine) dependent messages. I do not
 'prefs-beta' => "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are in beta but mostly suitable for general use",
 'prefs-datetime' => '{{Identical|Date}}',
 'prefs-labs' => "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-editing}}'', listing features that are experimental",
+'prefs-user-pages' => "Header of a subsection at [[Special:Preferences]], tab ''{{int:prefs-misc}}'', listing features that are related to user pages",
 'prefs-personal' => 'Title of a tab in [[Special:Preferences]].',
 'prefs-rc' => 'Used in user preferences.
 
@@ -1739,7 +1788,7 @@ This action allows editing of all of the "user rights", not just the rights of t
 
 {{Identical|Recent changes}}',
 'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
-'recentchangestext' => 'Text in recent changes',
+'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
 'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
 'recentchanges-label-minor' => 'Tooltip for {{msg-mw|newpageletter}}',
 'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
@@ -1905,8 +1954,8 @@ Extensions making use of it:
 'backend-fail-notexists' => 'Parameters:
 * $1 is a filename.',
 'backend-fail-hashes' => 'Definition of "[[w:en:Hash_function|hashes]]".',
-'backend-fail-notsame' => 'Parameters:
-* $1 is a filename.',
+'backend-fail-notsame' => 'Parametreler:
+* $1 bir dosya ismi.',
 'backend-fail-invalidpath' => 'Parameters:
 * $1 is a storage path.',
 'backend-fail-delete' => 'Parameters:
@@ -1934,7 +1983,11 @@ Extensions making use of it:
 'backend-fail-batchsize' => 'Error message when the limit of operations to be done at once in the file backend was reached.
 Parameters:
 * $1 is the number of operations attempted at once in this case.
-* $2 is the maximum number of operations that can be attempted at once.',
+* $2 is the maximum number of operations that can be attempted at once.
+
+A "[[:wikipedia:Front and back ends|backend]]" is a system or component that ordinary users don\'t interact with directly and don\'t need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are "system" or "service", or (depending on context and language) even leave it untranslated.',
+'backend-fail-usable' => 'Parameters:
+* $1 is the file name, including the path, formatted for the storage backend used',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Parameters:
@@ -2311,7 +2364,7 @@ $1 is a page title",
 'nopagetitle' => 'Used as title of [[Special:MovePage]], when the oldtitle does not exist.
 
 The text is {{msg-mw|nopagetext}}.',
-'nopagetext' => 'Used as text of [[Special:MovePage]], when the oldtitle does not exist.
+'nopagetext' => 'Used as text on special pages like [[Special:MovePage]] (when the oldtitle does not exist) or [[Special:PermaLink]].
 
 The title is {{msg-mw|nopagetitle}}.',
 'pager-newer-n' => "This is part of the navigation message on the top and bottom of Special pages which are lists of things in date order, e.g. the User's contributions page. It is passed as the second argument of {{msg-mw|Viewprevnext}}. $1 is the number of items shown per page.",
@@ -2326,7 +2379,7 @@ The title is {{msg-mw|nopagetitle}}.',
 'booksources-go' => 'Name of button in [[Special:BookSources]]
 
 {{Identical|Go}}',
-'booksources-invalid-isbn' => 'This message is displayed after an invalid ISBN is entered on Special:Booksources.',
+'booksources-invalid-isbn' => 'This message is displayed after an invalid ISBN is entered on [[Special:Booksources]].',
 
 # Special:Log
 'specialloguserlabel' => 'Used in [[Special:Log]] as a label for an input field with which the log can be filtered for entries describing actions \'\'performed\'\' by the specified user.  "Carried out" and "done" are possible alternatives for "performed".',
@@ -2336,6 +2389,7 @@ The title is {{msg-mw|nopagetitle}}.',
 'alllogstext' => 'Header of [[Special:Log]]',
 'log-title-wildcard' => '* Appears in: [[Special:Log]]
 * Description: A check box to enable prefix search option',
+'showhideselectedlogentries' => 'Text of the button which brings up the [[mw:RevisionDelete|RevisionDelete]] menu on [[Special:Log]].',
 
 # Special:AllPages
 'allpages' => 'First part of the navigation bar for the special page [[Special:AllPages]] and [[Special:PrefixIndex]]. The other parts are {{msg-mw|Prevpage}} and {{msg-mw|Nextpage}}.
@@ -2371,6 +2425,11 @@ The title is {{msg-mw|nopagetitle}}.',
 'allpagesprefix' => "Used for the label of the input box of [[Special:PrefixIndex]]. On this page you can either write 'Name of namespace:string from which to begin display in alphabetical order' in the top box, or you can choose a namespace in the bottom box and put 'string from which to begin display in alphabetical order' in the top box. The result will be the same.",
 'allpages-hide-redirects' => 'Label for a checkbox. If the checkbox is checked redirects will not be shown in the list. Used in [[Special:PrefixIndex]] and [[Special:Allpages]].',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Message notifying they are watching a cached page. $1 is a duration (ie "1 hour and 30 minutes")',
+'cachedspecial-viewing-cached-ts' => 'Message notifying they are watching a cached page.',
+'cachedspecial-refresh-now' => 'Link text pointing to the most recent version of the page.',
+
 # Special:Categories
 'categories' => 'The page name of [[Special:Categories]].
 
@@ -2428,7 +2487,7 @@ You can apparently use 'URL' instead of 'hostname'.",
 'activeusers-noresult' => 'identical with {{msg-mw|listusers-noresult}}',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in the recent changes.',
+'newuserlogpage' => 'Part of the "Newuserlog" extension. It is both the title of [[Special:Log/newusers]] and the link you can see in [[Special:RecentChanges]].',
 'newuserlogpagetext' => 'Part of the "Newuserlog" extension. It is the description you can see on [[Special:Log/newusers]].',
 
 # Special:ListGroupRights
@@ -2540,7 +2599,7 @@ This is a button text used in [[Special:Emailuser]] when called without a (valid
 Possible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.
 
 {{Identical|Content page}}",
-'watchlist-details' => 'Message on Special page: My watchlist. This is paired with the message [[Mediawiki:Nowatchlist]] which appears instead of Watchlist-details when $1 is 0.',
+'watchlist-details' => 'Message on [[Special:Watchlist]]. This is paired with the message {{msg-mw|Nowatchlist}} which appears instead of Watchlist-details when $1 is 0.',
 'wlheader-showupdated' => 'This message shows up near top of users watchlist page.',
 'wlnote' => 'Used on [[Special:Watchlist]] when the maximum number of days is specified.
 Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
@@ -2556,6 +2615,7 @@ Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
 'unwatching' => 'Text displayed when clicked on the unwatch tab: [[MediaWiki:Unwatch/{{SUBPAGENAME}}|{{int:unwatch}}]]. It means the wiki is removing that page from your watchlist.',
 'watcherrortext' => 'When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed. See also {{msg|addedwatchtext}}. and {{msg|addedwatchtext}}. This message is used raw and should not contain wikitext.',
 
+'enotif_reset' => "This should be translated as \"Mark all pages '''as''' visited\".",
 'enotif_newpagetext' => 'Part of text of a notification e-mail sent when a watched page has been created. See [[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]',
 'changed' => 'Possible value for $CHANGEDORCREATED in {{msg|enotif_subject}} and {{msg|enotif_body}}.',
 'created' => 'Possible value for $CHANGEDORCREATED in {{msg|enotif_subject}} and {{msg|enotif_body}}.',
@@ -2689,8 +2749,8 @@ This message was something like "unlock move protection" in the past.',
 {{Identical|Infinite}}",
 'restriction-type' => 'Used on [[Special:ProtectedPages]]. The text next to a drop-down box. See [[mw:Manual:Administrators|MediaWiki Manual]] for more information on protection.',
 'restriction-level' => 'Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. The text next to a drop-down box. See the [//www.mediawiki.org/wiki/Project:Protected_titles help page on Mediawiki] and on [http://meta.wikimedia.org/wiki/Protect Meta] for more information.',
-'minimum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with [[MediaWiki:Maximum-size]]. There is an input box to specify the minimum bites of the projected pages listed.',
-'maximum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with [[MediaWiki:Minimum-size]]. There is an input box to specify the maximum bites of the projected pages listed.',
+'minimum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with {{msg-mw|Maximum-size}}. There is an input box to specify the minimum bites of the projected pages listed.',
+'maximum-size' => 'Used in [[Special:Protectedpages]] as a pair of radio buttons, with {{msg-mw|Minimum-size}}. There is an input box to specify the maximum bites of the projected pages listed.',
 'pagesize' => 'Used on [[Special:ProtectedPages]]. See the help page on [http://meta.wikimedia.org/wiki/Protect Meta] for more information on protection.',
 
 # Restrictions (nouns)
@@ -2748,6 +2808,14 @@ This message was something like "unlock move protection" in the past.',
 
 {{identical|Are you sure you want to view the deleted revision of the file...}}',
 'undelete-show-file-submit' => '{{Identical|Yes}}',
+'undelete-revisionrow' => "A revision row in the undelete page. Parameters:
+* $1 is a checkBox to indicate whether to restore this specific revision
+* $2 is a link to the revision
+* $3 is a link to the last revision of a page ({{msg-mw|last}})
+* $4 is a link to the page
+* $5 is a link to the revision's user
+* $6 is the revision size
+* $7 is the revision comment",
 
 # Namespace form on various pages
 'namespace' => 'This message is located at [[Special:Contributions]].',
@@ -3011,6 +3079,7 @@ See also {{msg-mw|Movepagetext-noredirectfixer|notext=1}}',
 'movetalk' => 'The text of the checkbox to watch the associated talk page to the page you are moving. This only appears when the talk page is not empty.',
 'move-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any subpages will be moved with the main page to a new title.',
 'move-talk-subpages' => 'The text of an option on the special page [[Special:MovePage|MovePage]]. If this option is ticked, any talk subpages will be moved with the talk page to a new title.',
+'movepage-max-pages' => 'PROBABLY (A GUESS): when moving a page, you can select an option of moving its subpages, but there is a maximum that can be moved automatically.',
 'movelogpage' => 'Title of [[Special:Log/move]]. Used as heading on that page, and in the dropdown menu on log pages.',
 'movelogpagetext' => "Text on the special page 'Move log'.",
 'movesubpage' => "This is a section header on [[Special:MovePage]], below is a list of subpages.
@@ -3021,6 +3090,7 @@ Parameters:
 
 {{Identical|Reason}}',
 'revertmove' => '{{Identical|Revert}}',
+'delete_and_move' => 'Button text on the move page when the target page already exists.',
 'delete_and_move_text' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is to confirm that you really want to delete the page. See also {{msg|delete and move confirm}}.',
 'delete_and_move_confirm' => 'Used when moving a page, but the destination page already exists and needs deletion. This message is for a checkbox to confirm that you really want to delete the page. See also {{msg|delete and move text}}.',
 'delete_and_move_reason' => 'Shown as reason in content language in the deletion log. Parameter:
@@ -3130,7 +3200,7 @@ See also:
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Tooltip shown when hovering the mouse over the link to your own User page in the upper-side personal toolbox.',
 'tooltip-pt-mytalk' => 'Tooltip shown when hovering over the "my talk" link in your personal toolbox (upper right side).',
-'tooltip-pt-preferences' => 'Tooltip shown when hovering over the "my preferences" ([[MediaWiki:Mypreferences]]) link in your personal toolbox (upper right side).
+'tooltip-pt-preferences' => 'Tooltip shown when hovering over the {{msg-mw|Mypreferences}} link in your personal toolbox (upper right side).
 
 {{Identical|My preferences}}',
 'tooltip-pt-watchlist' => 'Tooltip shown when hovering over the "my watchlist" link in your personal toolbox (upper right side).',
@@ -3158,8 +3228,8 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 'tooltip-ca-watch' => '{{Identical|Add this page to your watchlist}}',
 'tooltip-ca-unwatch' => 'Tooltip shown when hovering over the {{msg|unwatch}} tab.',
 'tooltip-search' => 'The tooltip when hovering over the search menu.',
-'tooltip-search-go' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Go|Go]]” button next to the search box.',
-'tooltip-search-fulltext' => 'This is the text of the tooltip displayed when hovering the mouse over the “[[MediaWiki:Search|Search]]” button under the search box.',
+'tooltip-search-go' => 'This is the text of the tooltip displayed when hovering the mouse over the “{{msg-mw|Go}}” button next to the search box.',
+'tooltip-search-fulltext' => 'This is the text of the tooltip displayed when hovering the mouse over the “{{msg-mw|Search}}” button under the search box.',
 'tooltip-p-logo' => 'Tool tip shown when hovering the mouse over the logo that links to [[Main Page]].
 {{Identical|Visit the main page}}',
 'tooltip-n-mainpage' => 'Tool tip shown when hovering the mouse over the link to [[{{MediaWiki:Mainpage}}]].
@@ -3187,7 +3257,7 @@ No GENDER-Support for performance reason.',
 'tooltip-ca-nstab-template' => 'Tooltip shown when hovering over the {{msg|nstab-template}} tab.',
 'tooltip-ca-nstab-help' => 'Tootip shown when hovering over the {{msg|nstab-help}} tab in the Help namespace.',
 'tooltip-ca-nstab-category' => 'Tooltip shown when hovering over the {{msg|nstab-category}} tab.',
-'tooltip-minoredit' => 'Tooltip shown when hovering over the "[[MediaWiki:Minoredit/{{SUBPAGENAME}}|{{int:minoredit}}]]" link below the edit form.',
+'tooltip-minoredit' => 'Tooltip shown when hovering over the "{{msg-mw|Minoredit}}" link below the edit form.',
 'tooltip-save' => "This is the text that appears when you hover the mouse over the 'Save page' button on the edit page",
 'tooltip-preview' => 'Tooltip shown when hovering over the "Show preview" button.
 
@@ -3292,7 +3362,12 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 'nocredits' => 'This message is shown when viewing the credits of a page (example: {{fullurl:Main Page|action=credits}}) but when there are no credits available. Note that the credits action is disabled by default (currently enabled on translatewiki.net).',
 
 # Spam protection
-'spam_reverting' => '{{Identical|Revert}}',
+'spam_reverting' => 'Edit summary for spam cleanup script. Used when a page is reverted because all later revisions contained a particular link. Parameters:
+* $1 is a spammed domain name.',
+'spam_blanking' => 'Edit summary for spam cleanup script. Used when a page is blanked (made to have no content, but still exist) because the script could not find an appropriate revision to set the page to. Parameters:
+* $1 is a spammed domain name.',
+'spam_deleting' => 'Edit summary for spam cleanup script. Used when a page is deleted because all revisions contained a particular link. Parameters:
+* $1 is a spammed domain name.',
 
 # Info page
 'pageinfo-title' => 'Page title for action=info.
@@ -3438,7 +3513,7 @@ Part of variable $1 in {{msg-mw|Ago}}
 *{{msg-mw|Days}}',
 
 # Bad image list
-'bad_image_list' => 'This is only message appears to guide administrators to add links with right format. This will not appear anywhere else in Mediawiki.',
+'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
 
 /*
 Short names for language variants used for language conversion links.
@@ -3984,6 +4059,7 @@ CW is an abbreviation for clockwise.',
 'exif-contrast-2' => '{{Identical|Hard}}',
 
 'exif-saturation-0' => '{{Identical|Normal}}',
+'exif-saturation-2' => 'Color saturation in picture EXIF data',
 
 'exif-sharpness-0' => '{{Identical|Normal}}',
 'exif-sharpness-1' => '{{Identical|Soft}}',
@@ -4224,14 +4300,14 @@ Bitrate (of a file, typically) in yottabits (1 yottabits = 1000×1000×1000×100
 'livepreview-loading' => '{{Identical|Loading}}',
 
 # Watchlist editor
-'watchlistedit-numitems' => 'Message on Special page: Edit watchlist. This is paired with the message [[Mediawiki:Watchlistedit-noitems]] which appears instead of Watchlistedit-numitems when $1 is 0.',
-'watchlistedit-noitems' => "Message on [[Special:Watchlist/edit]], which only appears when a user's watchlist is empty.",
+'watchlistedit-numitems' => 'Message on [[Special:EditWatchlist]]. This is paired with the message {{Msg-mw|Watchlistedit-noitems}} which appears instead of Watchlistedit-numitems when $1 is 0.',
+'watchlistedit-noitems' => "Message on [[Special:EditWatchlist]], which only appears when a user's watchlist is empty.",
 'watchlistedit-normal-title' => 'Title of [[Special:Watchlist/edit|special page]].',
 'watchlistedit-normal-legend' => 'Heading of dialogue box on [[Special:Watchlist/edit]]',
 'watchlistedit-normal-explain' => 'An introduction/explanation about the [[Special:Watchlist/edit|normal edit watchlist function]].
 Hint: the text "Remove Titles" is in {{msg-mw|watchlistedit-normal-submit}}',
 'watchlistedit-normal-submit' => 'Text of submit button on [[Special:Watchlist/edit]].',
-'watchlistedit-normal-done' => 'Message on Special page: Edit watchlist after pages are removed from the watchlist.',
+'watchlistedit-normal-done' => 'Message on [[Special:EditWatchlist]] after pages are removed from the watchlist.',
 'watchlistedit-raw-title' => 'Title of [[Special:Watchlist/raw|Special page]].
 
 {{Identical|Edit raw watchlist}}',
@@ -4242,8 +4318,8 @@ Hint: the text "Remove Titles" is in {{msg-mw|watchlistedit-normal-submit}}',
 'watchlistedit-raw-titles' => 'Text above edit box containing items being watched on [[Special:Watchlist/raw]].',
 'watchlistedit-raw-submit' => 'Text of submit button on [[Special:Watchlist/raw]].',
 'watchlistedit-raw-done' => 'A message which appears after the raw watchlist has been updated using [[Special:Watchlist/raw]].',
-'watchlistedit-raw-added' => 'Message on special page: Edit raw watchlist. The message appears after at least 1 message is added to the raw watchlist.',
-'watchlistedit-raw-removed' => 'Message on special page: Edit raw watchlist. The message appears after at least 1 message is deleted from the raw watchlist.',
+'watchlistedit-raw-added' => 'Message on [[Special:EditWatchlist/raw]]. The message appears after at least 1 message is added to the raw watchlist.',
+'watchlistedit-raw-removed' => 'Message on [[Special:EditWatchlist/raw]]. The message appears after at least 1 message is deleted from the raw watchlist.',
 
 # Watchlist editing tools
 'watchlisttools-view' => '[[Special:Watchlist]]: Navigation link under the title. See also {{msg|watchlisttools-edit}} and {{msg|watchlisttools-raw}}.',
@@ -4407,6 +4483,12 @@ 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. 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.',
 
 # Special:FilePath
 'filepath' => 'Legend of fieldset around input box in [[Special:FilePath]].',
@@ -4482,7 +4564,7 @@ It appears that the word 'valid' describes 'tags', not 'change'. It also appears
 'tags-hitcount-header' => 'Caption of a column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].',
 'tags-edit' => '{{Identical|Edit}}
 Used on [[Special:Tags]]. Verb. Used as display text on a link to create/edit a description.',
-'tags-hitcount' => 'Shown in the “Tagged changes” column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].
+'tags-hitcount' => 'Shown in the "{{msg-mw|Tags-hitcount-header}}" column in [[Special:Tags]]. For more information on tags see [//www.mediawiki.org/wiki/Manual:Tags Mediawiki].
 
 * <code>$1</code> is the number of changes marked with the tag',
 
index 8dab70f..c994d0c 100644 (file)
@@ -37,6 +37,9 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Katiguriya_rimanakuy',
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $specialPageAliases = array(
        'Allmessages'               => array( 'TukuyWillaykuna' ),
        'Allpages'                  => array( 'TukuyPanqakuna' ),
@@ -126,9 +129,6 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'Interwikinnaq', 'Wikipurannaq' ),
 );
 
-#!!# Translation <b>HORA_ACTUAL</b> is used more than once for <a href="#mw-sp-magic-currenttime">currenttime</a> and <a href="#mw-sp-magic-currenthour">currenthour</a>.
-#!!# Translation <b>HORAACTUAL</b> is used more than once for <a href="#mw-sp-magic-currenttime">currenttime</a> and <a href="#mw-sp-magic-currenthour">currenthour</a>.
-#!!# Translation <b>HORALOCAL</b> is used more than once for <a href="#mw-sp-magic-localtime">localtime</a> and <a href="#mw-sp-magic-localhour">localhour</a>.
 $magicWords = array(
        'redirect'                => array( '0', '#PUSAPUNA', '#REDIRECCIÓN', '#REDIRECCION', '#REDIRECT' ),
        'notoc'                   => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__NOTOC__' ),
@@ -138,25 +138,25 @@ $magicWords = array(
        'noeditsection'           => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
        'noheader'                => array( '0', '__UMANNAQ__', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
        'currentmonth'            => array( '1', 'KUNANKILLA', 'MESACTUAL', 'MES_ACTUAL', 'MESACTUAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
-       'currentmonthname'        => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'CURRENTMONTHNAME' ),
-       'currentmonthnamegen'     => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'CURRENTMONTHNAMEGEN' ),
-       'currentmonthabbrev'      => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'CURRENTMONTHABBREV' ),
+       'currentmonthname'        => array( '1', 'KUNANKILLASUTI', 'NOMBREMESACTUAL', 'NOMBRE_MES_ACTUAL', 'MESACTUALCOMPLETO', 'CURRENTMONTHNAME' ),
+       'currentmonthnamegen'     => array( '1', 'KUNANKILLASUTIP', 'GENERADORNOMBREMESACTUAL', 'MESACTUALGENITIVO', 'CURRENTMONTHNAMEGEN' ),
+       'currentmonthabbrev'      => array( '1', 'KUNANKILLAPISI', 'ABREVIACIONNOMBREMESACTUAL', 'ABREVIACIÓNNOMBREMESACTUAL', 'MESACTUALABREVIADO', 'CURRENTMONTHABBREV' ),
        'currentday'              => array( '1', 'KUNANPUNCHAW', 'DÍAACTUAL', 'DIAACTUAL', 'DÍA_ACTUAL', 'DIA_ACTUAL', 'CURRENTDAY' ),
        'currentday2'             => array( '1', 'KUNANPUNCHAW2', 'DÍAACTUAL2', 'DIAACTUAL2', 'DÍA_ACTUAL2', 'DIA_ACTUAL2', 'CURRENTDAY2' ),
        'currentdayname'          => array( '1', 'KUNANPUNCHAWSUTI', 'NOMBREDÍAACTUAL', 'NOMBREDIAACTUAL', 'CURRENTDAYNAME' ),
        'currentyear'             => array( '1', 'KUNANWATA', 'AÑOACTUAL', 'AÑO_ACTUAL', 'CURRENTYEAR' ),
-       'currenttime'             => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'CURRENTTIME' ),
-       'currenthour'             => array( '1', 'KUNANURA', 'HORA_ACTUAL', 'HORAACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'CURRENTHOUR' ),
-       'localmonth'              => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'LOCALMONTH', 'LOCALMONTH2' ),
-       'localmonthname'          => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'LOCALMONTHNAME' ),
-       'localmonthnamegen'       => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'LOCALMONTHNAMEGEN' ),
-       'localmonthabbrev'        => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'LOCALMONTHABBREV' ),
+       'currenttime'             => array( '1', 'KUNANPACHA', 'HORAACTUAL', 'HORA_ACTUAL', 'HORA_MINUTOS_ACTUAL', 'HORAMINUTOSACTUAL', 'TIEMPOACTUAL', 'CURRENTTIME' ),
+       'currenthour'             => array( '1', 'KUNANURA', 'CURRENTHOUR' ),
+       'localmonth'              => array( '1', 'KAYPIKILLA', 'MESLOCAL', 'MESLOCAL2', 'LOCALMONTH', 'LOCALMONTH2' ),
+       'localmonthname'          => array( '1', 'KAYPIKILLASUTI', 'NOMBREMESLOCAL', 'MESLOCALCOMPLETO', 'LOCALMONTHNAME' ),
+       'localmonthnamegen'       => array( '1', 'KAYPIKILLASUTIP', 'GENERADORNOMBREMESLOCAL', 'MESLOCALGENITIVO', 'LOCALMONTHNAMEGEN' ),
+       'localmonthabbrev'        => array( '1', 'KAYPIKILLAPISI', 'ABREVIACIONMESLOCAL', 'MESLOCALABREVIADO', 'LOCALMONTHABBREV' ),
        'localday'                => array( '1', 'KAYPIPUNCHAW', 'DÍALOCAL', 'DIALOCAL', 'LOCALDAY' ),
        'localday2'               => array( '1', 'KAYPIPUNCHAW2', 'DIALOCAL2', 'DÍALOCAL2', 'LOCALDAY2' ),
        'localdayname'            => array( '1', 'KAYPIPUNCHAWSUTI', 'NOMBREDIALOCAL', 'NOMBREDÍALOCAL', 'LOCALDAYNAME' ),
        'localyear'               => array( '1', 'KAYPIWATA', 'AÑOLOCAL', 'LOCALYEAR' ),
-       'localtime'               => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'LOCALTIME' ),
-       'localhour'               => array( '1', 'KAYPIURA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'LOCALHOUR' ),
+       'localtime'               => array( '1', 'KAYPIPACHA', 'HORALOCAL', 'HORAMINUTOSLOCAL', 'TIEMPOLOCAL', 'LOCALTIME' ),
+       'localhour'               => array( '1', 'KAYPIURA', 'LOCALHOUR' ),
        'numberofpages'           => array( '1', 'HAYKAPANQA', 'NÚMERODEPÁGINAS', 'NUMERODEPAGINAS', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', 'HAYKAQILLQA', 'NÚMERODEARTÍCULOS', 'NUMERODEARTICULOS', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', 'HAYKAWILLANIQI', 'NÚMERODEARCHIVOS', 'NUMERODEARCHIVOS', 'NUMBEROFFILES' ),
@@ -172,7 +172,7 @@ $magicWords = array(
        'talkspacee'              => array( '1', 'RIMANAKUYKITIE', 'RIMAYKITIE', 'ESPACIODEDISCUSIONC', 'TALKSPACEE' ),
        'subjectspace'            => array( '1', 'QILLQAKITI', 'ESPACIODEASUNTO', 'ESPACIODETEMA', 'ESPACIODEARTÍCULO', 'ESPACIODEARTICULO', 'SUBJECTSPACE', 'ARTICLESPACE' ),
        'subjectspacee'           => array( '1', 'QILLQAKITIE', 'ESPACIODETEMAC', 'ESPACIODEASUNTOC', 'ESPACIODEARTICULOC', 'ESPACIODEARTÍCULOC', 'SUBJECTSPACEE', 'ARTICLESPACEE' ),
-       'fullpagename'            => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'FULLPAGENAME' ),
+       'fullpagename'            => array( '1', 'HUNTAPANQASUTI', 'NOMBREDEPÁGINACOMPLETA', 'NOMBREDEPAGINACOMPLETA', 'NOMBREDEPÁGINAENTERA', 'NOMBREDEPAGINAENTERA', 'NOMBRECOMPLETODEPÁGINA', 'NOMBRECOMPLETODEPAGINA', 'FULLPAGENAME' ),
        'fullpagenamee'           => array( '1', 'HUNTAPANQASUTIE', 'NOMBRECOMPLETODEPAGINAC', 'NOMBRECOMPLETODEPÁGINAC', 'FULLPAGENAMEE' ),
        'subpagename'             => array( '1', 'URINPANQASUTI', 'NOMBREDESUBPAGINA', 'NOMBREDESUBPÁGINA', 'SUBPAGENAME' ),
        'subpagenamee'            => array( '1', 'URINPANQASUTIE', 'NOMBREDESUBPAGINAC', 'NOMBREDESUBPÁGINAC', 'SUBPAGENAMEE' ),
@@ -193,7 +193,7 @@ $magicWords = array(
        'img_center'              => array( '1', 'chawpi', 'centro', 'centrado', 'centrada', 'centrar', 'center', 'centre' ),
        'img_framed'              => array( '1', 'inchuyuq', 'inchu', 'marco', 'enmarcado', 'enmarcada', 'framed', 'enframed', 'frame' ),
        'img_frameless'           => array( '1', 'inchunnaq', 'sinmarco', 'sin_embarcar', 'sinenmarcar', 'sin_enmarcar', 'frameless' ),
-       'img_page'                => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'page=$1', 'page $1' ),
+       'img_page'                => array( '1', 'panqa=$1', 'pagina=$1', 'página=$1', 'pagina $1', 'página $1', 'pagina_$1', 'page=$1', 'page $1' ),
        'img_upright'             => array( '1', 'sayaq', 'sayaq=$1', 'upright', 'upright=$1', 'upright $1' ),
        'img_border'              => array( '1', 'saywa', 'borde', 'border' ),
        'img_baseline'            => array( '1', 'tiksisiqi', 'baseline' ),
@@ -207,7 +207,7 @@ $magicWords = array(
        'img_link'                => array( '1', 'tinki=$1', 'vínculo=$1', 'vinculo=$1', 'enlace=$1', 'link=$1' ),
        'img_alt'                 => array( '1', 'wak=$1', 'alt=$1' ),
        'int'                     => array( '0', 'WILLAY:', 'INT:' ),
-       'sitename'                => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'SITENAME' ),
+       'sitename'                => array( '1', 'TIYAYSUTI', 'NOMBREDESITIO', 'NOMBREDELSITIO', 'SITENAME' ),
        'ns'                      => array( '0', 'SKITI:', 'EN:', 'NS:' ),
        'localurl'                => array( '0', 'KAYLLAURL:', 'URLLOCAL', 'LOCALURL:' ),
        'localurle'               => array( '0', 'KAYLLAURLE:', 'URLLOCALC:', 'LOCALURLE:' ),
@@ -526,7 +526,7 @@ $1",
 'versionrequired' => "$1 nisqa MediaWiki llamk'apusqatam muchunki kay p'anqata llamk'achinaykipaq",
 'versionrequiredtext' => "$1 nisqa MediaWiki llamk'apusqatam muchunki kay p'anqata llamk'achinaykipaq. Astawan willasunaykipaqqa, [[Special:Version]] nisqapi qhaway",
 
-'ok' => 'OK',
+'ok' => 'Arí niy',
 'retrievedfrom' => '"$1" p\'anqamanta chaskisqa (Qhichwa / Quechua)',
 'youhavenewmessages' => '$1 qhawanayki kachkan ($2).',
 'newmessageslink' => 'Musuq willaymi',
@@ -647,6 +647,11 @@ $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".',
+'invalidtitle-knownnamespace' => '"$2" sutisuyu, "$3" qillqasqayuq mana allin kaq qillqa suti',
+'invalidtitle-unknownnamespace' => 'Mana riqsisqa $1 kaq sutisuyu yupay, "$2" qillqasqayuq mana allin kaq qillqa suti',
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -729,6 +734,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 +919,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 +933,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 +994,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 +1010,12 @@ 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",
+'parser-unstrip-loop-warning' => 'Muyupayaq siqum tarisqa',
+'parser-unstrip-recursion-limit' => 'Nisyu kuti muyupayay siqum ($1)',
 
 # "Undo" feature
 'undo-success' => 'Rurasqata kutichiyta atinkim. Manaraq kutichispaykiqa, kay qatiq wakichayta qhawariy rikunaykipaq chiqapta munasqaykichu manallachu, chaymantataq waqaychay kutichinapaq.',
@@ -1142,7 +1158,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",
@@ -1175,7 +1191,8 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
 
 # Diffs
 'history-title' => '"$1" p\'anqata hukchasqakunap wiñay kawsaynin',
-'difference' => '(Hukchasqapura wak kaynin)',
+'difference-title' => '$1 nisqapaq musuqchasqapura wakin kaynin',
+'difference-title-multipage' => '$1, $2 sutiyuq willañiqipura wakin kaynin',
 'difference-multipage' => "(P'anqakunaqa manam kaqllachu)",
 'lineno' => "Siq'i $1:",
 'compareselectedversions' => "Akllasqa llamk'apusqakunata wakichay",
@@ -1270,6 +1287,7 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
 'prefs-beta' => 'Beta nisqap kaqninkuna',
 'prefs-datetime' => "P'unchaw, pacha",
 'prefs-labs' => 'Laburaturyu nisqap kaqninkuna',
+'prefs-user-pages' => "Ruraqpa p'anqankuna",
 'prefs-personal' => 'Kikinpa willankuna',
 'prefs-rc' => 'Ñaqha hukchasqakuna',
 'prefs-watchlist' => "Watiqasqa p'anqakuna",
@@ -1530,7 +1548,7 @@ $1 {{PLURAL:$1|sanampamanta|sanampakunamanta}} aswan pisi kananmi.',
 'nchanges' => '$1 {{PLURAL:$1|hukchasqa|hukchasqakuna}}',
 'recentchanges' => 'Ñaqha hukchasqa',
 'recentchanges-legend' => 'Ñaqha hukchasqapaq allinkachinakuna',
-'recentchangestext' => "Kay p'anqapiqa aswan qhipaq ñaqha hukchasqakunam.",
+'recentchanges-summary' => "Kay p'anqapiqa aswan qhipaq ñaqha hukchasqakunam.",
 'recentchanges-feed-description' => 'Kay mikhuchinapi wikipi qhipaq ñaqha hukchasqakunata qatiy.',
 'recentchanges-label-newpage' => "Kayta llamk'apuptiykim musuq p'anqam tukukurqun",
 'recentchanges-label-minor' => "Kayqa aslla llamk'apuymi",
@@ -1560,6 +1578,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",
@@ -1709,13 +1728,19 @@ $1',
 'backend-fail-writetemp' => "Manam atinichu mit'alla willañiqiman qillqayta.",
 '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-create' => 'Manam atinichu $1 sutiyuq willañiqita qillqayta.',
+'backend-fail-maxsize' => 'Manam atinichu $1 sutiyuq willañiqita qillqayta, {{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.',
 'backend-fail-internal' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqpi mana riqsisqa pantasqam tukurqan.',
 '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}}.",
+'backend-fail-usable' => 'Manam atinichu $1 sutiyuq willañiqita qillqayta, mana aypalla saqillaykuna icha mana churanakuna/qullqakuna kaptinmi.',
+
+# 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.',
@@ -1833,6 +1858,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 +2068,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 +2501,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 +2551,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 +2798,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 +3605,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 +3795,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 98c5502..85a7390 100644 (file)
@@ -33,6 +33,9 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Samiyachiy_rimanakuy',
 );
 
+// Remove Spanish gender aliases (bug 37090)
+$namespaceGenderAliases = array();
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Tinkikunana uraypi aspishpa rikuchina',
@@ -458,7 +461,6 @@ Kay (kaykunachu) kachashkakunaka cunkashkami kashka.",
 
 # Diffs
 'history-title' => '"$1" pankapa killkaykunapa wiñay kawsay',
-'difference' => '(imashpa shikan shikanmi kan)',
 'lineno' => '$1 aspi',
 'compareselectedversions' => 'Kay akllashka pankakunaka imashpa mana shinami kapan willana',
 'editundo' => 'Kutichina',
@@ -536,7 +538,7 @@ Shuk rurakkunaka kikinpa e-chaski ''dirección''ta mana yachankachu.",
 'nchanges' => '$1 {{PLURAL:$1|killkay|killkaykuna}}',
 'recentchanges' => 'Mushuk killkaykuna',
 'recentchanges-legend' => 'Mushuk killkaykunamanta akllaykuna',
-'recentchangestext' => 'Kay pankapi tukuy mushuk killkaykunata rikukuna',
+'recentchanges-summary' => 'Kay pankapi tukuy mushuk killkaykunata rikukuna',
 'recentchanges-feed-description' => 'Kay willay mayupi ashtawan mushuk killkaykunata rikukuna',
 'recentchanges-label-newpage' => 'Kay killkayka shuk mushuk pankata kamachirka.',
 'recentchanges-label-minor' => 'Kay killkayka uchillami kan',
index e7a8102..69b06e3 100644 (file)
@@ -15,367 +15,366 @@ $fallback = 'it';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Link cun la sotliniadura',
-'tog-justify'                 => 'Paràgraf: giustifiché',
-'tog-hideminor'               => 'Nascond al mudefghi znini int la pàgina "Ultum mudèfghi"',
-'tog-hidepatrolled'           => "Nascònd j cambiamént verifichèdi int'aglj ultum mudèfigh",
-'tog-newpageshidepatrolled'   => 'Nascònd al pàgin verifichèdi da la lèsta dal pàgin növi',
-'tog-extendwatchlist'         => "Slèrga la funziòn \"tènn sot occ\" d'mod ch'us pòsa avdé toti al mudefchi, no sol l'ultma.",
-'tog-usenewrc'                => "Drova agl'j ultmi mudèfchi avanzëdi (u j vô JavaScript)",
-'tog-numberheadings'          => "Titul d'un paràgraf ch'l'à un nòmar daparlò",
-'tog-showtoolbar'             => "Fam avdé la bara d'j strumént (u j vó JavaScript)",
-'tog-editondblclick'          => 'Mudèfiga al pàgin scjazènd do volt (u j vò JavaScript)',
-'tog-editsection'             => "S't'vù l'abilitaziòn ad'cambié al seziòn cum e' link [mudèfica]",
+'tog-underline' => 'Link cun la sotliniadura',
+'tog-justify' => 'Paràgraf: giustifiché',
+'tog-hideminor' => 'Nascond al mudefghi znini int la pàgina "Ultum mudèfghi"',
+'tog-hidepatrolled' => "Nascònd j cambiamént verifichèdi int'aglj ultum mudèfigh",
+'tog-newpageshidepatrolled' => 'Nascònd al pàgin verifichèdi da la lèsta dal pàgin növi',
+'tog-extendwatchlist' => "Slèrga la funziòn \"tènn sot occ\" d'mod ch'us pòsa avdé toti al mudefchi, no sol l'ultma.",
+'tog-usenewrc' => "Drova agl'j ultmi mudèfchi avanzëdi (u j vô JavaScript)",
+'tog-numberheadings' => "Titul d'un paràgraf ch'l'à un nòmar daparlò",
+'tog-showtoolbar' => "Fam avdé la bara d'j strumént (u j vó JavaScript)",
+'tog-editondblclick' => 'Mudèfiga al pàgin scjazènd do volt (u j vò JavaScript)',
+'tog-editsection' => "S't'vù l'abilitaziòn ad'cambié al seziòn cum e' link [mudèfica]",
 'tog-editsectiononrightclick' => "S't'vù l'abilitaziòn ad cambié al seziòn <br />scjazénd e tast a dèstra sora e titul (u j vò JavaScript)",
-'tog-showtoc'                 => "Fam avdé l'indiz (sol par al pàgin cun piò d'3 seziòn)",
-'tog-rememberpassword'        => "Arcurdam la parola d'ordin, par piasé (fèn a un masum $1 {{PLURAL:$1|dè|dè}})",
-'tog-watchcreations'          => "Mett insèn al pàgin ch't'e' fat adès, intla lèsta da tní sot'occ",
-'tog-watchdefault'            => "Mett insèn al pàgin ch'a j ò lavurè sora int la lèsta dal pàgin da tnì sot'òcc",
-'tog-watchmoves'              => "Mett insèn al pàgin ch'a j ò spustè int la lèsta dal pàgin da tnì sot'òcc",
-'tog-watchdeletion'           => "Mett insèn al pàgin ch'a j ò scanzlè int la lèsta dal pàgin da tnì d'occ",
-'tog-minordefault'            => 'Ségna tot al mudèfic coma "zníni" s\'l\'utent làsa la casèla vuta',
-'tog-previewontop'            => "Fam avdé l'anteprèma sora casèla d'mudèfica invezi che dciotta",
-'tog-previewonfirst'          => "Fa' avdé l'anteprèma dop c'u's fa la prèma mudèfica",
-'tog-nocache'                 => "T'an stêga a tní in tla memoria al pàgin",
-'tog-enotifwatchlistpages'    => "Fam' save' par e-mail quènd una pàgina dal mij l'è steda modifichèda",
-'tog-enotifusertalkpages'     => "Fam' save' par e-mail quènd la mi pàgina dal discusiòn l'è steda modifichèda",
-'tog-enotifminoredits'        => "Fam' save' par e-mail tòt al mudefchi, neca al znini",
-'tog-enotifrevealaddr'        => "Lasa avdè e' mi indirèzi d'posta eletrònica int'j mesàg d'nutèfica",
-'tog-shownumberswatching'     => "Fam' avdè e' nòmar d'j utent ch'j tèn sta pàgina sot occ",
-'tog-oldsig'                  => 'Anteprèma dla fírma bona',
-'tog-fancysig'                => "Tràta la firma cumpagna e' test int'la wiki (senza nissön ligam automatich)",
-'tog-externaleditor'          => "Drova sempar un prugràma d'scritura esteran (editor testuale)",
-'tog-externaldiff'            => 'Drova sempar un prugràma comparator esteran (sol par j utent espert)',
-'tog-showjumplinks'           => "Fa' funzionè j leghèm d'acesibilitè tipo \"Va' a\"",
-'tog-uselivepreview'          => 'Drova la funziòn "Anteprèma dal viv" (u j vo Javascript; sperimentêl)',
-'tog-forceeditsummary'        => "Dam la vos quènd l'ugèt dla mudèfica l'è vut",
-'tog-watchlisthideown'        => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
-'tog-watchlisthidebots'       => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
-'tog-watchlisthideminor'      => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
-'tog-watchlisthideliu'        => "In tla lèsta da tnì d'occ, nascond al mudèfic d'j utent registrè",
-'tog-watchlisthideanons'      => "In tla lèsta da tnì d'occ, nascond al mudèfic d'j utent senza nom",
-'tog-watchlisthidepatrolled'  => "Nascond tòt al mudèfic za cuntrulèdi in tla lèsta dal pàgin da tnì d'occ",
-'tog-ccmeonemails'            => "Mènd'm una còpia d'j mesèg ch'a spedèss a j étar druvador",
-'tog-diffonly'                => "T'an fëga avdé e' contnù dla pàgina dop e' cunfront tra l'versiòn",
-'tog-showhiddencats'          => "Fa'm avdé al categurèj nascosti",
-'tog-norollbackdiff'          => "T'an fèga avdé al diferenzi dop d'avé recuperè l'ultma versiòn",
-
-'underline-always'  => 'Sempar',
-'underline-never'   => 'Mai',
+'tog-showtoc' => "Fam avdé l'indiz (sol par al pàgin cun piò d'3 seziòn)",
+'tog-rememberpassword' => "Arcurdam la parola d'ordin, par piasé (fèn a un masum $1 {{PLURAL:$1|dè|dè}})",
+'tog-watchcreations' => "Mett insèn al pàgin ch't'e' fat adès, intla lèsta da tní sot'occ",
+'tog-watchdefault' => "Mett insèn al pàgin ch'a j ò lavurè sora int la lèsta dal pàgin da tnì sot'òcc",
+'tog-watchmoves' => "Mett insèn al pàgin ch'a j ò spustè int la lèsta dal pàgin da tnì sot'òcc",
+'tog-watchdeletion' => "Mett insèn al pàgin ch'a j ò scanzlè int la lèsta dal pàgin da tnì d'occ",
+'tog-minordefault' => 'Ségna tot al mudèfic coma "zníni" s\'l\'utent làsa la casèla vuta',
+'tog-previewontop' => "Fam avdé l'anteprèma sora casèla d'mudèfica invezi che dciotta",
+'tog-previewonfirst' => "Fa' avdé l'anteprèma dop c'u's fa la prèma mudèfica",
+'tog-nocache' => "T'an stêga a tní in tla memoria al pàgin",
+'tog-enotifwatchlistpages' => "Fam' save' par e-mail quènd una pàgina dal mij l'è steda modifichèda",
+'tog-enotifusertalkpages' => "Fam' save' par e-mail quènd la mi pàgina dal discusiòn l'è steda modifichèda",
+'tog-enotifminoredits' => "Fam' save' par e-mail tòt al mudefchi, neca al znini",
+'tog-enotifrevealaddr' => "Lasa avdè e' mi indirèzi d'posta eletrònica int'j mesàg d'nutèfica",
+'tog-shownumberswatching' => "Fam' avdè e' nòmar d'j utent ch'j tèn sta pàgina sot occ",
+'tog-oldsig' => 'Anteprèma dla fírma bona',
+'tog-fancysig' => "Tràta la firma cumpagna e' test int'la wiki (senza nissön ligam automatich)",
+'tog-externaleditor' => "Drova sempar un prugràma d'scritura esteran (editor testuale)",
+'tog-externaldiff' => 'Drova sempar un prugràma comparator esteran (sol par j utent espert)',
+'tog-showjumplinks' => "Fa' funzionè j leghèm d'acesibilitè tipo \"Va' a\"",
+'tog-uselivepreview' => 'Drova la funziòn "Anteprèma dal viv" (u j vo Javascript; sperimentêl)',
+'tog-forceeditsummary' => "Dam la vos quènd l'ugèt dla mudèfica l'è vut",
+'tog-watchlisthideown' => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
+'tog-watchlisthidebots' => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
+'tog-watchlisthideminor' => "Nascond al mi mudèfic dala lèsta dal pàgin da tnì d'occ",
+'tog-watchlisthideliu' => "In tla lèsta da tnì d'occ, nascond al mudèfic d'j utent registrè",
+'tog-watchlisthideanons' => "In tla lèsta da tnì d'occ, nascond al mudèfic d'j utent senza nom",
+'tog-watchlisthidepatrolled' => "Nascond tòt al mudèfic za cuntrulèdi in tla lèsta dal pàgin da tnì d'occ",
+'tog-ccmeonemails' => "Mènd'm una còpia d'j mesèg ch'a spedèss a j étar druvador",
+'tog-diffonly' => "T'an fëga avdé e' contnù dla pàgina dop e' cunfront tra l'versiòn",
+'tog-showhiddencats' => "Fa'm avdé al categurèj nascosti",
+'tog-norollbackdiff' => "T'an fèga avdé al diferenzi dop d'avé recuperè l'ultma versiòn",
+
+'underline-always' => 'Sempar',
+'underline-never' => 'Mai',
 'underline-default' => "Drova agl'impustaziòn d'e' browser",
 
 # Font style option in Special:Preferences
-'editfont-style'     => "Stil d'e' font dl'àrea d'mudèfica",
-'editfont-default'   => "Predefinì d'e' navigador",
+'editfont-style' => "Stil d'e' font dl'àrea d'mudèfica",
+'editfont-default' => "Predefinì d'e' navigador",
 'editfont-monospace' => 'Font monospazi',
 'editfont-sansserif' => 'Font sans-serif',
-'editfont-serif'     => 'Font serif',
+'editfont-serif' => 'Font serif',
 
 # Dates
-'sunday'        => ' Dmènga',
-'monday'        => 'Lùn',
-'tuesday'       => 'Mért',
-'wednesday'     => 'Mircual',
-'thursday'      => ' Zuba',
-'friday'        => 'Vënar',
-'saturday'      => 'Sábat',
-'sun'           => 'Dmè',
-'mon'           => 'Lun',
-'tue'           => 'Mrt',
-'wed'           => 'Mir',
-'thu'           => 'Zob',
-'fri'           => 'Ven',
-'sat'           => 'Sàb',
-'january'       => 'Znèr',
-'february'      => 'Febrér',
-'march'         => 'Mêrz',
-'april'         => 'Abril',
-'may_long'      => 'Maz',
-'june'          => 'Zógn',
-'july'          => 'Lój',
-'august'        => 'Agòst',
-'september'     => 'Setémbar',
-'october'       => 'Utóbar',
-'november'      => 'Nuvèmbar',
-'december'      => 'Dizèmbar',
-'january-gen'   => 'Znèr',
-'february-gen'  => 'Fevrer',
-'march-gen'     => 'Mèrz',
-'april-gen'     => 'Abril',
-'may-gen'       => 'Maz',
-'june-gen'      => 'Zògn',
-'july-gen'      => 'Lòj',
-'august-gen'    => 'Agòst',
+'sunday' => ' Dmènga',
+'monday' => 'Lùn',
+'tuesday' => 'Mért',
+'wednesday' => 'Mircual',
+'thursday' => ' Zuba',
+'friday' => 'Vënar',
+'saturday' => 'Sábat',
+'sun' => 'Dmè',
+'mon' => 'Lun',
+'tue' => 'Mrt',
+'wed' => 'Mir',
+'thu' => 'Zob',
+'fri' => 'Ven',
+'sat' => 'Sàb',
+'january' => 'Znèr',
+'february' => 'Febrér',
+'march' => 'Mêrz',
+'april' => 'Abril',
+'may_long' => 'Maz',
+'june' => 'Zógn',
+'july' => 'Lój',
+'august' => 'Agòst',
+'september' => 'Setémbar',
+'october' => 'Utóbar',
+'november' => 'Nuvèmbar',
+'december' => 'Dizèmbar',
+'january-gen' => 'Znèr',
+'february-gen' => 'Fevrer',
+'march-gen' => 'Mèrz',
+'april-gen' => 'Abril',
+'may-gen' => 'Maz',
+'june-gen' => 'Zògn',
+'july-gen' => 'Lòj',
+'august-gen' => 'Agòst',
 'september-gen' => 'Setèmbar',
-'october-gen'   => 'Utobar',
-'november-gen'  => 'Nuvèmbar',
-'december-gen'  => 'Dizèmbar',
-'jan'           => 'znèr',
-'feb'           => 'feb',
-'mar'           => 'mêrz',
-'apr'           => 'abr',
-'may'           => 'maz',
-'jun'           => 'zógn',
-'jul'           => 'lój',
-'aug'           => 'ago',
-'sep'           => 'set',
-'oct'           => 'utob',
-'nov'           => 'nuv',
-'dec'           => 'diz',
+'october-gen' => 'Utobar',
+'november-gen' => 'Nuvèmbar',
+'december-gen' => 'Dizèmbar',
+'jan' => 'znèr',
+'feb' => 'feb',
+'mar' => 'mêrz',
+'apr' => 'abr',
+'may' => 'maz',
+'jun' => 'zógn',
+'jul' => 'lój',
+'aug' => 'ago',
+'sep' => 'set',
+'oct' => 'utob',
+'nov' => 'nuv',
+'dec' => 'diz',
 
 # Categories related messages
-'pagecategories'                 => '{{PLURAL:$1|Categurèja|Categurei}}',
-'category_header'                => 'Articul int la categurèja "$1"',
-'subcategories'                  => 'Sòtacategurèja',
-'category-media-header'          => 'File int la categurèja "$1"',
-'category-empty'                 => "Al dè d'incù 'sta categurèja què l'à na d'pàgin né d'archîvi multimediêl",
-'hidden-categories'              => '{{PLURAL:$1|Categurèja ardupèda|Categurèi ardupèdi}}',
-'hidden-category-category'       => 'Categurèj nascosti',
-'category-subcat-count'          => "{{PLURAL:$2|Sta categurèja l'à sol òna sota-categurèja|Sta categurèja l'à  {{PLURAL:$1|sota-categurèja|$1 sot-categuréj}}, sora $2 ch'l'è é tutel.}}",
-'category-subcat-count-limited'  => "Sta categurèja-què l'à dentar {{PLURAL:$1|la sòt-categurèja| i $1 sòt-categurèj}} ch'j vèn dop.",
-'category-article-count'         => "{{PLURAL:$2|Sta categuréja l'à sol sta pàgina què|In sta categuréja u j sta {{PLURAL:$1|sta pàgina|$1 pàgin}} sora $2, ch'l'è e' tutel.}}",
+'pagecategories' => '{{PLURAL:$1|Categurèja|Categurei}}',
+'category_header' => 'Articul int la categurèja "$1"',
+'subcategories' => 'Sòtacategurèja',
+'category-media-header' => 'File int la categurèja "$1"',
+'category-empty' => "Al dè d'incù 'sta categurèja què l'à na d'pàgin né d'archîvi multimediêl",
+'hidden-categories' => '{{PLURAL:$1|Categurèja ardupèda|Categurèi ardupèdi}}',
+'hidden-category-category' => 'Categurèj nascosti',
+'category-subcat-count' => "{{PLURAL:$2|Sta categurèja l'à sol òna sota-categurèja|Sta categurèja l'à  {{PLURAL:$1|sota-categurèja|$1 sot-categuréj}}, sora $2 ch'l'è é tutel.}}",
+'category-subcat-count-limited' => "Sta categurèja-què l'à dentar {{PLURAL:$1|la sòt-categurèja| i $1 sòt-categurèj}} ch'j vèn dop.",
+'category-article-count' => "{{PLURAL:$2|Sta categuréja l'à sol sta pàgina què|In sta categuréja u j sta {{PLURAL:$1|sta pàgina|$1 pàgin}} sora $2, ch'l'è e' tutel.}}",
 'category-article-count-limited' => "Sta categurèja-què l'à dentar {{PLURAL:$1| 'sta pàgina|'sti pàgin}} a què sòta.",
-'category-file-count'            => "{{PLURAL:$2|Sta categuréja l'à sol sta pàgina què|In sta categuréja u j sta {{PLURAL:$1|sta pàgina|$1 pàgin}} sora $2, ch'l'è e' tutel.}}",
-'category-file-count-limited'    => "In sta categurèja-què {{PLURAL:$1|u j è la pàgina|agl'j è al pàgin}} a què sòta.",
-'listingcontinuesabbrev'         => 'inênz',
-'index-category'                 => 'Pàgina indicizëda',
-'noindex-category'               => ' Pàgina non indicizëda',
-
-'about'         => "A prupòsit d'",
-'article'       => 'Artècual',
-'newwindow'     => "(la s'avèra int'una fnèstra nova)",
-'cancel'        => 'Làsa perdar',
+'category-file-count' => "{{PLURAL:$2|Sta categuréja l'à sol sta pàgina què|In sta categuréja u j sta {{PLURAL:$1|sta pàgina|$1 pàgin}} sora $2, ch'l'è e' tutel.}}",
+'category-file-count-limited' => "In sta categurèja-què {{PLURAL:$1|u j è la pàgina|agl'j è al pàgin}} a què sòta.",
+'listingcontinuesabbrev' => 'inênz',
+'index-category' => 'Pàgina indicizëda',
+'noindex-category' => ' Pàgina non indicizëda',
+
+'about' => "A prupòsit d'",
+'article' => 'Artècual',
+'newwindow' => "(la s'avèra int'una fnèstra nova)",
+'cancel' => 'Làsa perdar',
 'moredotdotdot' => ' Ad piò…',
-'mypage'        => 'La mi pàgina',
-'mytalk'        => 'Al mi cunversaziòn',
-'anontalk'      => "Ciacarédi par 'st'indirèzz IP",
-'navigation'    => 'Navgaziòn',
-'and'           => '&#32;e',
+'mypage' => 'La mi pàgina',
+'mytalk' => 'Al mi cunversaziòn',
+'anontalk' => "Ciacarédi par 'st'indirèzz IP",
+'navigation' => 'Navgaziòn',
+'and' => '&#32;e',
 
 # Cologne Blue skin
-'qbfind'         => 'Tróva',
-'qbbrowse'       => 'Sföja',
-'qbedit'         => 'Mudèfica',
-'qbpageoptions'  => 'Upziòn dla pàgina',
-'qbpageinfo'     => 'Infurmaziòn sora la pàgina',
-'qbmyoptions'    => 'Al mi pàgin',
+'qbfind' => 'Tróva',
+'qbbrowse' => 'Sföja',
+'qbedit' => 'Mudèfica',
+'qbpageoptions' => 'Upziòn dla pàgina',
+'qbpageinfo' => 'Infurmaziòn sora la pàgina',
+'qbmyoptions' => 'Al mi pàgin',
 'qbspecialpages' => 'Pàgin particulèri',
-'faq'            => 'Question frequenti',
-'faqpage'        => 'Prugèt:Question frequenti',
+'faq' => 'Question frequenti',
+'faqpage' => 'Prugèt:Question frequenti',
 
 # Vector skin
 'vector-action-addsection' => 'Zonta una cjacarèda',
-'vector-action-delete'     => 'Scanzèla',
-'vector-action-move'       => 'Chèmbia nòm',
-'vector-action-protect'    => 'Metti-j una pruteziò',
-'vector-action-undelete'   => 'Armett a post',
-'vector-action-unprotect'  => 'Sbloca',
-
-'errorpagetitle'   => "Oci! T'ê fat una capèla",
-'returnto'         => 'Torna indrì a $1.',
-'tagline'          => 'Da {{SITENAME}}',
-'help'             => "Êt absogn d'una man?",
-'search'           => 'Zerca',
-'searchbutton'     => 'Zerca',
-'searcharticle'    => 'Và pù',
-'history'          => "Stória d'la pàgina",
-'history_short'    => 'Stória',
+'vector-action-delete' => 'Scanzèla',
+'vector-action-move' => 'Chèmbia nòm',
+'vector-action-protect' => 'Metti-j una pruteziò',
+'vector-action-undelete' => 'Armett a post',
+'vector-action-unprotect' => 'Sbloca',
+
+'errorpagetitle' => "Oci! T'ê fat una capèla",
+'returnto' => 'Torna indrì a $1.',
+'tagline' => 'Da {{SITENAME}}',
+'help' => "Êt absogn d'una man?",
+'search' => 'Zerca',
+'searchbutton' => 'Zerca',
+'searcharticle' => 'Và pù',
+'history' => "Stória d'la pàgina",
+'history_short' => 'Stória',
 'printableversion' => 'Versiòn bona da stampè',
-'permalink'        => 'Culegament fèss',
-'edit'             => 'Mudèfica',
-'create'           => 'Fa nov/a',
-'editthispage'     => 'Mudèfica sta pàgina',
-'delete'           => 'Scanzèla',
-'protect'          => 'Metti-j una pruteziòn',
-'protect_change'   => 'chèmbia',
-'newpage'          => 'Pàgina nova',
-'talkpage'         => 'Cunversaziòn',
+'permalink' => 'Culegament fèss',
+'edit' => 'Mudèfica',
+'create' => 'Fa nov/a',
+'editthispage' => 'Mudèfica sta pàgina',
+'delete' => 'Scanzèla',
+'protect' => 'Metti-j una pruteziòn',
+'protect_change' => 'chèmbia',
+'newpage' => 'Pàgina nova',
+'talkpage' => 'Cunversaziòn',
 'talkpagelinktext' => 'Cunversaziòn',
-'personaltools'    => 'Strumént persunèl',
-'talk'             => 'Cunversaziòn',
-'views'            => 'Chi èl pasé da que',
-'toolbox'          => 'Strumént',
-'otherlanguages'   => 'Ètri lènguv',
-'redirectedfrom'   => '(Ri-direziòn da <b>$1</b>)',
-'redirectpagesub'  => "Pàgina d're-indirezzament",
-'lastmodifiedat'   => "L'ultum c'l'à lavurè atoran a 'sta pàgina da $2, a $1.",
-'jumpto'           => 'Sbèlza a què:',
+'personaltools' => 'Strumént persunèl',
+'talk' => 'Cunversaziòn',
+'views' => 'Chi èl pasé da que',
+'toolbox' => 'Strumént',
+'otherlanguages' => 'Ètri lènguv',
+'redirectedfrom' => '(Ri-direziòn da <b>$1</b>)',
+'redirectpagesub' => "Pàgina d're-indirezzament",
+'lastmodifiedat' => "L'ultum c'l'à lavurè atoran a 'sta pàgina da $2, a $1.",
+'jumpto' => 'Sbèlza a què:',
 'jumptonavigation' => 'navgaziòn',
-'jumptosearch'     => 'zerca',
+'jumptosearch' => 'zerca',
 
 # 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'      => 'A prupòsit de {{SITENAME}}',
-'aboutpage'      => 'Project: A pruposit',
-'copyright'      => "Oci! T'an fèga e' patàca. Sora 'ste scrètt u j è e' brevet $1.",
-'copyrightpage'  => "{{ns:project}}:Brevèt d'l'autor",
-'disclaimers'    => 'Infurmaziòn legêli',
+'aboutsite' => 'A prupòsit de {{SITENAME}}',
+'aboutpage' => 'Project: A pruposit',
+'copyright' => "Oci! T'an fèga e' patàca. Sora 'ste scrètt u j è e' brevet $1.",
+'copyrightpage' => "{{ns:project}}:Brevèt d'l'autor",
+'disclaimers' => 'Infurmaziòn legêli',
 'disclaimerpage' => 'Project: Avìs generèl',
-'edithelp'       => 'Livar dal spiegaziòn',
-'edithelppage'   => 'Help: Scrivar un artècul',
-'helppage'       => 'Help:Tòt j argumént',
-'mainpage'       => 'Prèma Pagina',
-'privacy'        => 'Léz sora agli infurmaziòn persunèli',
-'privacypage'    => 'Project: Léz sora agli infurmaziòn persunèli',
+'edithelp' => 'Livar dal spiegaziòn',
+'edithelppage' => 'Help: Scrivar un artècul',
+'helppage' => 'Help:Tòt j argumént',
+'mainpage' => 'Prèma Pagina',
+'privacy' => 'Léz sora agli infurmaziòn persunèli',
+'privacypage' => 'Project: Léz sora agli infurmaziòn persunèli',
 
 'badaccess' => 'Parméss non sufizént',
 
-'retrievedfrom'       => 'Tiré fora da "$1"',
-'youhavenewmessages'  => "A j ò fët ch't'epa $1 ($2).",
-'newmessageslink'     => 'mesàz nuv',
+'retrievedfrom' => 'Tiré fora da "$1"',
+'youhavenewmessages' => "A j ò fët ch't'epa $1 ($2).",
+'newmessageslink' => 'mesàz nuv',
 'newmessagesdifflink' => "U j è una quèlca diferenza cun l'ultma versiòn",
-'editsection'         => 'Mudèfica',
-'editold'             => 'mudèfica',
-'editlink'            => 'mudèfiga',
-'viewsourcelink'      => "guèrda e' codiz surgént",
-'editsectionhint'     => 'Mudèfica la seziòn: $1',
-'toc'                 => 'Indice',
-'showtoc'             => "fam'avdé",
-'hidetoc'             => 'ardòpa',
-'site-rss-feed'       => 'Emissiòn RSS $1',
-'site-atom-feed'      => 'Emissiòn Atom $1',
-'page-rss-feed'       => 'Canël RSS par "$1"',
-'page-atom-feed'      => 'Canël Atom par "$1"',
-'red-link-title'      => "Ciò! $1 (sta pàgina la n'esèst incora)",
+'editsection' => 'Mudèfica',
+'editold' => 'mudèfica',
+'editlink' => 'mudèfiga',
+'viewsourcelink' => "guèrda e' codiz surgént",
+'editsectionhint' => 'Mudèfica la seziòn: $1',
+'toc' => 'Indice',
+'showtoc' => "fam'avdé",
+'hidetoc' => 'ardòpa',
+'site-rss-feed' => 'Emissiòn RSS $1',
+'site-atom-feed' => 'Emissiòn Atom $1',
+'page-rss-feed' => 'Canël RSS par "$1"',
+'page-atom-feed' => 'Canël Atom par "$1"',
+'red-link-title' => "Ciò! $1 (sta pàgina la n'esèst incora)",
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Artécul',
-'nstab-user'     => 'Pàgina persunèla',
-'nstab-special'  => 'Pàgina particulèra',
-'nstab-project'  => "Pàgina dagl'infurmaziòn",
-'nstab-image'    => 'File',
+'nstab-main' => 'Artécul',
+'nstab-user' => 'Pàgina persunèla',
+'nstab-special' => 'Pàgina particulèra',
+'nstab-project' => "Pàgina dagl'infurmaziòn",
+'nstab-image' => 'File',
 'nstab-template' => 'Mudel',
 'nstab-category' => 'Categurèja',
 
 # General errors
-'missing-article'    => "E' database u n'à brisa truvé e'scret d'una pàgina ch'la avrebb duvu truvè sot e' nom di \"\$1\" \$2.
+'missing-article' => "E' database u n'à brisa truvé e'scret d'una pàgina ch'la avrebb duvu truvè sot e' nom di \"\$1\" \$2.
 
 Quest é suzed d'solit in te méntr d'un cuntrol d'do version vèci intla storia d'una pàgina. E' pò esar suzest parchè l'è stè cjamé un culegamént a una pàgina scanzleda o parchè l'è stè cjamé un cunfront d'dò versiòn ch'j n'esést piò.
 
 S' u n'è brisa acsè, t'é scvert par chès un bug int'é software.
 Par piasé, fa raport a un [[Special:ListUsers/sysop|aministrador]] cun la nota de l'indirezzi dla pàgina.",
 'missingarticle-rev' => '(revision n°: $1)',
-'badtitletext'       => "La pàgina ch' t'ê cmandè, l'è vuda, sbaglieda o ta l'ê scrètta cun dal lettar particulèri. Oppure, ê pò dès ch'u j sèja un eror inter-lèngua o inter-wiki. Guèrda ben cus t'e scrètt: êt druvè dal lettar cu n' s pò druvè in t'j nom dal pàgin?",
-'viewsource'         => "Guèrda e' codiz surgént",
+'badtitletext' => "La pàgina ch' t'ê cmandè, l'è vuda, sbaglieda o ta l'ê scrètta cun dal lettar particulèri. Oppure, ê pò dès ch'u j sèja un eror inter-lèngua o inter-wiki. Guèrda ben cus t'e scrètt: êt druvè dal lettar cu n' s pò druvè in t'j nom dal pàgin?",
+'viewsource' => "Guèrda e' codiz surgént",
 
 # Login and logout pages
-'yourname'                => 'Soranòm:',
-'yourpassword'            => 'Paróla segreta:',
-'remembermypassword'      => "Regèstra la mi parola d'ordin sora ste computer (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'login'                   => 'Va dentar',
+'yourname' => 'Soranòm:',
+'yourpassword' => 'Paróla segreta:',
+'remembermypassword' => "Regèstra la mi parola d'ordin sora ste computer (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'login' => 'Va dentar',
 'nav-login-createaccount' => 'Va dentar / Èla la prèma volta?',
-'userlogin'               => 'Vèn dentar/A sit nov?',
-'logout'                  => 'Va fora',
-'userlogout'              => 'Và fora',
-'nologinlink'             => 'Iscrivat adès',
-'mailmypassword'          => "Mènda una nova parola d'ordin cun l'e-mail",
+'userlogin' => 'Vèn dentar/A sit nov?',
+'logout' => 'Va fora',
+'userlogout' => 'Và fora',
+'nologinlink' => 'Iscrivat adès',
+'mailmypassword' => "Mènda una nova parola d'ordin cun l'e-mail",
 
 # Edit page toolbar
-'bold_sample'     => "Pàroli in '''gros'''",
-'bold_tip'        => 'Gros',
-'italic_sample'   => 'Pàroli in cursiv',
-'italic_tip'      => 'Pàroli in cursìv',
-'link_sample'     => "Nòm d'e' culegamént",
-'link_tip'        => 'Culegamént intéran',
-'extlink_sample'  => "http://www.example.com Nòm d'e' culegamént",
-'extlink_tip'     => 'Culegamént esteran (arcordat d\'scrivar dadnénz "http://")',
+'bold_sample' => "Pàroli in '''gros'''",
+'bold_tip' => 'Gros',
+'italic_sample' => 'Pàroli in cursiv',
+'italic_tip' => 'Pàroli in cursìv',
+'link_sample' => "Nòm d'e' culegamént",
+'link_tip' => 'Culegamént intéran',
+'extlink_sample' => "http://www.example.com Nòm d'e' culegamént",
+'extlink_tip' => 'Culegamént esteran (arcordat d\'scrivar dadnénz "http://")',
 'headline_sample' => 'Intestaziòn',
-'headline_tip'    => "Intestaziòn d'e' sgond livèl",
-'nowiki_sample'   => 'Mèt dentar i tu scrètt sìnza furmataziòn',
-'nowiki_tip'      => 'Làsa perdar la furmataziòn wiki',
-'image_tip'       => "Figura ch'la sta insèn a e' scrètt",
-'media_tip'       => 'Culegamént a un file multimediél',
-'sig_tip'         => 'Mèt aquè la firma, cun dèda e ora',
-'hr_tip'          => "Riga urizuntèla (t'an fèga e' patàca: t'an esègera)",
+'headline_tip' => "Intestaziòn d'e' sgond livèl",
+'nowiki_sample' => 'Mèt dentar i tu scrètt sìnza furmataziòn',
+'nowiki_tip' => 'Làsa perdar la furmataziòn wiki',
+'image_tip' => "Figura ch'la sta insèn a e' scrètt",
+'media_tip' => 'Culegamént a un file multimediél',
+'sig_tip' => 'Mèt aquè la firma, cun dèda e ora',
+'hr_tip' => "Riga urizuntèla (t'an fèga e' patàca: t'an esègera)",
 
 # Edit pages
-'summary'                          => "Mutiv d'e' cambiamént:",
-'subject'                          => 'Argumént (intestaziòn):',
-'minoredit'                        => "Quèsta l'è una mudèfiga znina (z)",
-'watchthis'                        => "Tèn d'öcc 'sta pàgina què",
-'savearticle'                      => "Regèstra e' tu scrètt",
-'preview'                          => 'Guèrda prèma',
-'showpreview'                      => 'Fam avdé prèma',
-'showdiff'                         => 'Fam avdé i cambiamént',
-'anoneditwarning'                  => "'''Oci!''' T'an sì miga intrè! T'an fèga e' patàca: a t'registrèn cun e' tu indirèzzi IP e a l' mitèn int la storia d'sta pàgina.",
-'summary-preview'                  => "Prova a vdé l'uget:",
-'newarticle'                       => '(Növ)',
-'newarticletext'                   => "T'cì arìv int'una una pàgina ch'la n'esèst incora.
+'summary' => "Mutiv d'e' cambiamént:",
+'subject' => 'Argumént (intestaziòn):',
+'minoredit' => "Quèsta l'è una mudèfiga znina (z)",
+'watchthis' => "Tèn d'öcc 'sta pàgina què",
+'savearticle' => "Regèstra e' tu scrètt",
+'preview' => 'Guèrda prèma',
+'showpreview' => 'Fam avdé prèma',
+'showdiff' => 'Fam avdé i cambiamént',
+'anoneditwarning' => "'''Oci!''' T'an sì miga intrè! T'an fèga e' patàca: a t'registrèn cun e' tu indirèzzi IP e a l' mitèn int la storia d'sta pàgina.",
+'summary-preview' => "Prova a vdé l'uget:",
+'newarticle' => '(Növ)',
+'newarticletext' => "T'cì arìv int'una una pàgina ch'la n'esèst incora.
 S't'vu fèla te, tàca scrivar int'e' spazi a què sotta (guèrda la [[{{MediaWiki:Helppage}}|pàgina d'servezi]] s't'vu saven piò).
 S'cì arìv a que par sbaj, sciàza e butòn \"Indrì\" e t'ci a post.",
-'noarticletext'                    => "In 'ste mumént un gn'è gnito in sta pàgina: l'è vuta.
+'noarticletext' => "In 'ste mumént un gn'è gnito in sta pàgina: l'è vuta.
 Magari t'pù provè a [[Special:Search/{{PAGENAME}}|zirchè ste nòm]] in t'j ètar pàgin, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} zirchè i regèstr relativ], o [{{fullurl:{{FULLPAGENAME}}|action=edit}} scrivj indentar adès]</span>.",
-'previewnote'                      => "'''Òci! Lezz prèma cus t'e' fat; e' tu scrètt U N' è stè ancora registrè!'''",
-'editing'                          => 'Cambiamént de $1',
-'editingsection'                   => 'Mudèfiga $1 (seziòn)',
-'copyrightwarning'                 => "Avìs: tot al contribuziòn sora {{SITENAME}} j è stimé coma sòta la \$2 (guèrda \$1 par i particulé).
+'previewnote' => "'''Òci! Lezz prèma cus t'e' fat; e' tu scrètt U N' è stè ancora registrè!'''",
+'editing' => 'Cambiamént de $1',
+'editingsection' => 'Mudèfiga $1 (seziòn)',
+'copyrightwarning' => "Avìs: tot al contribuziòn sora {{SITENAME}} j è stimé coma sòta la \$2 (guèrda \$1 par i particulé).
 S't'an vu che i tu scrètt j pòsa èsar cambié a piasé da ch'jetar, t'an perda témp a scrivar sora a què.
 A e' stes mod, s't'vu carghé ste scrètt, ta t'e' da tü la respunsabilitè che l'è e' tü, uriginél, o ch'ta l'e' cupié d'un sit indov tot j po lezar, o t'l'è truvè da un'ètra font lèbra.
 \"T'AN PRUVA GNÂNC A CARGHÈ DI SCRÈTT BREVÉTÉ, SÂNZA CMANDÉ E' PARMESS!\"",
-'templatesused'                    => '{{PLURAL:$1|Mudel|Mudell}} druvé sora sta pàgina:',
-'templatesusedpreview'             => '{{PLURAL:$1|Mudel|Mudell}} druvè in sta prova què',
-'template-protected'               => '(prutèt)',
-'template-semiprotected'           => '(mèz-prutet)',
-'hiddencategories'                 => "Sta pàgina què la fa pèrt d'{{PLURAL:$1|una categureja nascosta|$1 categurej nascosti}}.",
+'templatesused' => '{{PLURAL:$1|Mudel|Mudell}} druvé sora sta pàgina:',
+'templatesusedpreview' => '{{PLURAL:$1|Mudel|Mudell}} druvè in sta prova què',
+'template-protected' => '(prutèt)',
+'template-semiprotected' => '(mèz-prutet)',
+'hiddencategories' => "Sta pàgina què la fa pèrt d'{{PLURAL:$1|una categureja nascosta|$1 categurej nascosti}}.",
 'permissionserrorstext-withaction' => "Tan' ê e' parmess par $2, par {{PLURAL:$1|e' mutiv|i mutiv}} adqvè sotta:",
 
 # History pages
-'viewpagelogs'           => "Guèrda i regestar d'sta pàgina",
-'currentrev-asof'        => 'Versiòn agiurnèda de $1',
-'revisionasof'           => 'Revisiòn dal $1',
-'previousrevision'       => '← Versiòn prèma ed questa',
-'nextrevision'           => 'Versiòn piò nova →',
-'currentrevisionlink'    => "Guèrda la versiòn d'adès",
-'cur'                    => 'att',
-'last'                   => 'prez',
-'histlegend'             => "Cunfront tra'l versiòn d'un artècul: strésa cun e' maus sora al versiòn ch't'vu te e pu sciàza e' butòn \"Partès\" o e' butòn in bas.<br />
+'viewpagelogs' => "Guèrda i regestar d'sta pàgina",
+'currentrev-asof' => 'Versiòn agiurnèda de $1',
+'revisionasof' => 'Revisiòn dal $1',
+'previousrevision' => '← Versiòn prèma ed questa',
+'nextrevision' => 'Versiòn piò nova →',
+'currentrevisionlink' => "Guèrda la versiòn d'adès",
+'cur' => 'att',
+'last' => 'prez',
+'histlegend' => "Cunfront tra'l versiòn d'un artècul: strésa cun e' maus sora al versiòn ch't'vu te e pu sciàza e' butòn \"Partès\" o e' butòn in bas.<br />
 Lezenda: '''({{int:cur}})''' = difarenzi cun la versiòn d'adès; '''({{int:last}})''' = difarenzi cun la versiòn d'prèma; ''m''' = mudèfica znina",
 'history-fieldset-title' => "Guèrda i cambiamént d'e' prèm a l'ultum",
-'histfirst'              => 'Piò vecia',
-'histlast'               => 'Piò rezent',
+'histfirst' => 'Piò vecia',
+'histlast' => 'Piò rezent',
 
 # Revision deletion
-'rev-delundel'   => 'fam avdé/ardópa',
+'rev-delundel' => 'fam avdé/ardópa',
 'revdel-restore' => 'chèmbia visiòn',
 
 # Merge log
 'revertmerge' => "Scanzèla l'uniòn",
 
 # Diffs
-'history-title'           => 'Elench d\'j cambiamént sora "$1"',
-'difference'              => "(Difarénza fra'l versiòn)",
-'lineno'                  => 'Riga $1:',
+'history-title' => 'Elench d\'j cambiamént sora "$1"',
+'lineno' => 'Riga $1:',
 'compareselectedversions' => "Fa e' paragon tra 'l versiòn seleziunèdi",
-'editundo'                => 'Scanzèla',
+'editundo' => 'Scanzèla',
 
 # Search results
-'searchresults'             => 'I tu risulté',
-'searchresults-title'       => 'I tu risulté par "$1"',
-'searchresulttext'          => "A vut una mân par zarchè dagl'infurmaziòn sora {{SITENAME}}? Và a vdé [[{{MediaWiki:Helppage}}|zerca int é {{SITENAME}}]].",
-'searchsubtitle'            => 'T\'e\' zarchè \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|toti al pàgin chj cminzèpia cun "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toti al pàgin chj è atachedi a "$1"]])',
-'searchsubtitleinvalid'     => "T'ë zarchè '''$1'''",
-'notitlematches'            => "T'é zarchè un'artècul, ma guèrda che u'gn'è brisa 'ste nom. Si't sicur t'épa scrètt ben?",
-'notextmatches'             => "T'e' zarché un quel ch'u'n à purté a gninto. U'n's trova gninto int'j parol dal pàgin.",
-'prevn'                     => "{{PLURAL:quel prèma|i $1 prèma}} d'sti què",
-'nextn'                     => "{{PLURAL:quél dòp|i $1 dòp}} d'sti què",
-'viewprevnext'              => 'Guèrda ($1 {{int:pipe-separator}} $2) ($3).',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 parola|$2 paróli}})',
-'search-redirect'           => '(ri-direziòn $1)',
-'search-section'            => '(seziòn $1)',
-'search-suggest'            => "V'levat di': $1",
-'search-interwiki-caption'  => 'I prugèt fradel',
-'search-interwiki-default'  => 'Arsultèd da $1:',
-'search-interwiki-more'     => '(ad piò)',
-'search-mwsuggest-enabled'  => 'cun j sugeriment',
+'searchresults' => 'I tu risulté',
+'searchresults-title' => 'I tu risulté par "$1"',
+'searchresulttext' => "A vut una mân par zarchè dagl'infurmaziòn sora {{SITENAME}}? Và a vdé [[{{MediaWiki:Helppage}}|zerca int é {{SITENAME}}]].",
+'searchsubtitle' => 'T\'e\' zarchè \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|toti al pàgin chj cminzèpia cun "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toti al pàgin chj è atachedi a "$1"]])',
+'searchsubtitleinvalid' => "T'ë zarchè '''$1'''",
+'notitlematches' => "T'é zarchè un'artècul, ma guèrda che u'gn'è brisa 'ste nom. Si't sicur t'épa scrètt ben?",
+'notextmatches' => "T'e' zarché un quel ch'u'n à purté a gninto. U'n's trova gninto int'j parol dal pàgin.",
+'prevn' => "{{PLURAL:quel prèma|i $1 prèma}} d'sti què",
+'nextn' => "{{PLURAL:quél dòp|i $1 dòp}} d'sti què",
+'viewprevnext' => 'Guèrda ($1 {{int:pipe-separator}} $2) ($3).',
+'search-result-size' => '$1 ({{PLURAL:$2|1 parola|$2 paróli}})',
+'search-redirect' => '(ri-direziòn $1)',
+'search-section' => '(seziòn $1)',
+'search-suggest' => "V'levat di': $1",
+'search-interwiki-caption' => 'I prugèt fradel',
+'search-interwiki-default' => 'Arsultèd da $1:',
+'search-interwiki-more' => '(ad piò)',
+'search-mwsuggest-enabled' => 'cun j sugeriment',
 'search-mwsuggest-disabled' => "'nciòn sugeriment",
-'nonefound'                 => "'''Oci''': la rizerca l'a vèn fata in automatico sol in zert spàzi di nòm. S't'vù zirchè fra tot al pàgin (cumpresi al pàgin d'cunversaziòn, i template, ecc) próva a metar \"all:\", in inglés, dadnenz a é nòm ch't'é scrètt, piotòst scriv é spàzi di nòm, s't'al sé, e pu é nòm.",
-'powersearch'               => 'Scandaja a fònd',
-'powersearch-legend'        => 'Scandaja a fònd',
-'powersearch-ns'            => "Zerca int'j spàzi d'nom:",
-'powersearch-redir'         => "Fà una lèsta d'al ri-direziòn",
-'powersearch-field'         => 'Zerca par',
+'nonefound' => "'''Oci''': la rizerca l'a vèn fata in automatico sol in zert spàzi di nòm. S't'vù zirchè fra tot al pàgin (cumpresi al pàgin d'cunversaziòn, i template, ecc) próva a metar \"all:\", in inglés, dadnenz a é nòm ch't'é scrètt, piotòst scriv é spàzi di nòm, s't'al sé, e pu é nòm.",
+'powersearch' => 'Scandaja a fònd',
+'powersearch-legend' => 'Scandaja a fònd',
+'powersearch-ns' => "Zerca int'j spàzi d'nom:",
+'powersearch-redir' => "Fà una lèsta d'al ri-direziòn",
+'powersearch-field' => 'Zerca par',
 
 # Preferences page
-'preferences'   => 'I mì gost',
+'preferences' => 'I mì gost',
 'mypreferences' => 'I mi gòst',
 
 # Groups
@@ -390,85 +389,85 @@ Lezenda: '''({{int:cur}})''' = difarenzi cun la versiòn d'adès; '''({{int:last
 'action-edit' => 'Mudèfica sta pàgina',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|mudèfica|mudèfich}}',
-'recentchanges'                  => 'I ultum cambiamént',
-'recentchanges-legend'           => "Upziòn d'j ultum cambiamént",
+'nchanges' => '$1 {{PLURAL:$1|mudèfica|mudèfich}}',
+'recentchanges' => 'I ultum cambiamént',
+'recentchanges-legend' => "Upziòn d'j ultum cambiamént",
 'recentchanges-feed-description' => "Ste canël e' fa avdè i cambiamént piò rezent aj artècul d'sta wiki.",
-'rcnote'                         => "A què sota t'pù truvé {{PLURAL:$1|l'ultum cambiamént|j ultum '''$1''' cambiamént in st'artècul}} int j ultum {{PLURAL:$2|dè|'''$2''' dè}}; agl'infurmaziòn j è agiurnèdi a e' $4 al $5.",
-'rclistfrom'                     => 'Fam avdè i cambiamént növ a cminzipiè da $1',
-'rcshowhideminor'                => '$1 al mudèfghi znini',
-'rcshowhidebots'                 => '$1 i bot',
-'rcshowhideliu'                  => '$1 i patàca registrè',
-'rcshowhideanons'                => '$1 navigador anònim',
-'rcshowhidemine'                 => '$1 völt a j ò scrètt',
-'rclinks'                        => "Fam avdè la lèsta d'j $1 cambiamént int j ultum $2 dé<br />$3",
-'diff'                           => 'dif.',
-'hist'                           => 'cron',
-'hide'                           => 'Ardòpa',
-'show'                           => 'Fam avdé',
-'minoreditletter'                => 'z',
-'newpageletter'                  => 'N',
-'boteditletter'                  => 'b',
-'rc-enhanced-expand'             => 'Guèrda i particulèr (u j vó JavaScript)',
-'rc-enhanced-hide'               => 'Arscònd i particulèr',
+'rcnote' => "A què sota t'pù truvé {{PLURAL:$1|l'ultum cambiamént|j ultum '''$1''' cambiamént in st'artècul}} int j ultum {{PLURAL:$2|dè|'''$2''' dè}}; agl'infurmaziòn j è agiurnèdi a e' $4 al $5.",
+'rclistfrom' => 'Fam avdè i cambiamént növ a cminzipiè da $1',
+'rcshowhideminor' => '$1 al mudèfghi znini',
+'rcshowhidebots' => '$1 i bot',
+'rcshowhideliu' => '$1 i patàca registrè',
+'rcshowhideanons' => '$1 navigador anònim',
+'rcshowhidemine' => '$1 völt a j ò scrètt',
+'rclinks' => "Fam avdè la lèsta d'j $1 cambiamént int j ultum $2 dé<br />$3",
+'diff' => 'dif.',
+'hist' => 'cron',
+'hide' => 'Ardòpa',
+'show' => 'Fam avdé',
+'minoreditletter' => 'z',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc-enhanced-expand' => 'Guèrda i particulèr (u j vó JavaScript)',
+'rc-enhanced-hide' => 'Arscònd i particulèr',
 
 # Recent changes linked
-'recentchangeslinked'         => "Cambiament ch'j va impèt a sta pàgina",
-'recentchangeslinked-title'   => 'Cambiamént ch\'j va impèt a "$1"',
+'recentchangeslinked' => "Cambiament ch'j va impèt a sta pàgina",
+'recentchangeslinked-title' => 'Cambiamént ch\'j va impèt a "$1"',
 'recentchangeslinked-summary' => "Questa ch't'é sott' aj occ l'è una lista d'j ultum cambiamént fât a piò pàgin atachèdi a una pàgina (o a elemént d'una categurèja).
 Al pàgin int'la lèsta dal [[Special:Watchlist|pàgin tnudi sot occ]] l' è scrètti in '''gros'''.",
-'recentchangeslinked-page'    => "Nom d'la pàgina:",
-'recentchangeslinked-to'      => "Fam avdé sol i cambiamént al pàgin ch'j va impèt a quèla ch'la m'interèsa a me.",
+'recentchangeslinked-page' => "Nom d'la pàgina:",
+'recentchangeslinked-to' => "Fam avdé sol i cambiamént al pàgin ch'j va impèt a quèla ch'la m'interèsa a me.",
 
 # Upload
-'upload'        => 'Carga so un file',
+'upload' => 'Carga so un file',
 'uploadlogpage' => "Regèstar d'j file carghé",
 'uploadedimage' => 'l\'à carghé "[[$1]]"',
 
 # File description page
-'filehist'                  => "Stória d'e' file",
-'filehist-help'             => "Fà clic sora un gròp dèda/ora par avdé cun cl'éra e' file in ch'ë mumént.",
-'filehist-current'          => "d'adès",
-'filehist-datetime'         => 'Dèda/Ora',
-'filehist-thumb'            => 'Visiòn znina',
-'filehist-thumbtext'        => 'Visiòn znina dla versiòn dal $1',
-'filehist-user'             => 'Utent',
-'filehist-dimensions'       => 'Amsür',
-'filehist-comment'          => "Ch'roba è'l",
-'imagelinks'                => 'I culegamént a ste file',
-'linkstoimage'              => "{{PLURAL:$1|La pàgina a què sòta l'è tachéda|Al $1 pàgin a què sòta j è tachédi}} a 'ste file:",
-'sharedupload'              => "Ste file e' ven da $1 e u s' pò druvè neca sora d'j ètri prugèt wiki.",
+'filehist' => "Stória d'e' file",
+'filehist-help' => "Fà clic sora un gròp dèda/ora par avdé cun cl'éra e' file in ch'ë mumént.",
+'filehist-current' => "d'adès",
+'filehist-datetime' => 'Dèda/Ora',
+'filehist-thumb' => 'Visiòn znina',
+'filehist-thumbtext' => 'Visiòn znina dla versiòn dal $1',
+'filehist-user' => 'Utent',
+'filehist-dimensions' => 'Amsür',
+'filehist-comment' => "Ch'roba è'l",
+'imagelinks' => 'I culegamént a ste file',
+'linkstoimage' => "{{PLURAL:$1|La pàgina a què sòta l'è tachéda|Al $1 pàgin a què sòta j è tachédi}} a 'ste file:",
+'sharedupload' => "Ste file e' ven da $1 e u s' pò druvè neca sora d'j ètri prugèt wiki.",
 'uploadnewversion-linktext' => "Chèrga so una versiòn nova d'ste file",
 
 # Statistics
 'statistics' => 'Statistich',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|byte|byte}}',
-'nmembers'      => 'Lumbaart (lmo)
+'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
+'nmembers' => 'Lumbaart (lmo)
 $1 {{PLURAL:$1|elemént|elemént}}',
-'prefixindex'   => "Tòti al pàgin cun e' prefess",
-'newpages'      => 'Pàgin növi',
-'move'          => 'Chèmbia nòm',
-'movethispage'  => 'Sposta sta pàgina',
+'prefixindex' => "Tòti al pàgin cun e' prefess",
+'newpages' => 'Pàgin növi',
+'move' => 'Chèmbia nòm',
+'movethispage' => 'Sposta sta pàgina',
 'pager-newer-n' => '{{PLURAL:$1|é piò rezent|i $1 piò rezent}}',
 'pager-older-n' => '{{PLURAL:$1|é piò vëc|i $1 piò vècc}}',
 
 # Book sources
-'booksources'               => 'Va a truvè dj libar',
+'booksources' => 'Va a truvè dj libar',
 'booksources-search-legend' => 'A vut zarchè int j livar?',
-'booksources-go'            => 'Và pu',
+'booksources-go' => 'Và pu',
 
 # Special:Log
 'log' => 'Regèstar',
 
 # Special:AllPages
-'allpages'       => 'Tot al pàgin',
+'allpages' => 'Tot al pàgin',
 'alphaindexline' => 'Da $1 a $2',
-'prevpage'       => "Pàgina prèma d'questa ($1)",
-'allpagesfrom'   => 'Fam avdè al pàgin cminzipiènd da:',
-'allpagesto'     => 'Fam avdé al pàgin infèn a:',
-'allarticles'    => 'Toti al pàgin',
+'prevpage' => "Pàgina prèma d'questa ($1)",
+'allpagesfrom' => 'Fam avdè al pàgin cminzipiènd da:',
+'allpagesto' => 'Fam avdé al pàgin infèn a:',
+'allarticles' => 'Toti al pàgin',
 'allpagessubmit' => 'Va mò',
 
 # Special:LinkSearch
@@ -484,115 +483,115 @@ $1 {{PLURAL:$1|elemént|elemént}}',
 'emailuser' => 'Manda un scrètt a ste patàca',
 
 # Watchlist
-'watchlist'         => "Pàgin ch'a ten d'öcc",
-'mywatchlist'       => "Pàgin ch'a ten d'öcc",
-'addedwatchtext'    => "La pàgina \"[[:\$1]]\" adès l'è int la lèsta dal [[Special:Watchlist|pàgin da tnì d'öcc]]. D'ôra inenz t'pù avdé tòt al mudèfic a sta pàgina e a la pàgina d'cunversaziòn int la [[Special:RecentChanges|lèsta d'j cambiamént rezent]], in '''gros''', acsè j 's'pò guardè mej.
+'watchlist' => "Pàgin ch'a ten d'öcc",
+'mywatchlist' => "Pàgin ch'a ten d'öcc",
+'addedwatchtext' => "La pàgina \"[[:\$1]]\" adès l'è int la lèsta dal [[Special:Watchlist|pàgin da tnì d'öcc]]. D'ôra inenz t'pù avdé tòt al mudèfic a sta pàgina e a la pàgina d'cunversaziòn int la [[Special:RecentChanges|lèsta d'j cambiamént rezent]], in '''gros''', acsè j 's'pò guardè mej.
 Se in un sgond temp t'vu cavé la pàgina dala lèsta da tnì d'öcc, s-cjaza un'ètra volta sora e' butòn \"ten d'öcc\".",
-'removedwatchtext'  => 'La pàgina "[[:$1]]" l\'è stëda scanzlèda dala lèsta dal [[Special:Watchlist|pàgin da tnì sot öcc]].',
-'watch'             => "Tèn d'öcc",
-'watchthispage'     => "Ten d'öcc sta pagina",
-'unwatch'           => "T'an stèga piò a t'nì d'öcc",
+'removedwatchtext' => 'La pàgina "[[:$1]]" l\'è stëda scanzlèda dala lèsta dal [[Special:Watchlist|pàgin da tnì sot öcc]].',
+'watch' => "Tèn d'öcc",
+'watchthispage' => "Ten d'öcc sta pagina",
+'unwatch' => "T'an stèga piò a t'nì d'öcc",
 'watchlist-details' => "J è, int la lèsta dal pàgin da tnì d'öcc, {{PLURAL:$1|$1 pàgina|$1 pàgin}}, senza cuntê al pàgin d'cunversaziòn.",
-'wlshowlast'        => "Fam avdé agl'ultum $1 ör $2 dè $3",
+'wlshowlast' => "Fam avdé agl'ultum $1 ör $2 dè $3",
 'watchlist-options' => "Scielt int la lèsta d'pàgin da tnì d'öcc",
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => "Mêt insèn al pàgin da t'nì d'öcc...",
+'watching' => "Mêt insèn al pàgin da t'nì d'öcc...",
 'unwatching' => "Scanzèla dal pàgin da t'nì d'öcc...",
 
 # Delete
-'deletepage'            => 'Scanzela la pàgina',
-'confirmdeletetext'     => "Oci! T'ste par scanzlè una pàgina cun tòta la storia d'j su cambiamént.
+'deletepage' => 'Scanzela la pàgina',
+'confirmdeletetext' => "Oci! T'ste par scanzlè una pàgina cun tòta la storia d'j su cambiamént.
 Par piasé, cunferma ch't'ê propri l'intenziòn d'fël, ch'at capèss al su conseguenzi e quel ch't fë adès l'è in regola cun al [[{{MediaWiki:Policy-url}}]].",
-'actioncomplete'        => 'Lavor fät e finì',
-'deletedtext'           => 'La pàgina "$1" l\'è stëda scanzlèda.
+'actioncomplete' => 'Lavor fät e finì',
+'deletedtext' => 'La pàgina "$1" l\'è stëda scanzlèda.
 Guèrda $2 par avdé la lèsta daglj ultum scanzeladür.',
-'dellogpage'            => 'Regèstar dal scanzladùr',
-'deletecomment'         => 'Rasòn:',
-'deleteotherreason'     => 'Ètar mutiv:',
+'dellogpage' => 'Regèstar dal scanzladùr',
+'deletecomment' => 'Rasòn:',
+'deleteotherreason' => 'Ètar mutiv:',
 'deletereasonotherlist' => 'Ètar mutiv',
 
 # Rollback
 'rollbacklink' => "armèt sta pàgina cun cl'era prèma",
 
 # Protect
-'protectlogpage'              => 'Pruteziòn',
-'protectedarticle'            => '"[[$1]]" l\'è prutèt',
-'modifiedarticleprotection'   => 'l\'à cambié e\' livèl d\'pruteziòn par "[[$1]]"',
-'protectcomment'              => 'Rasòn:',
-'protectexpiry'               => 'Scadenza:',
-'protect_expiry_invalid'      => "La scadenza la n'è piò bona.",
-'protect_expiry_old'          => "T'cì ariv tèrd! La dèda d'scadenza l'è zà pasëda.",
-'protect-text'                => "Cun ste mudèl u s'pò guardè e u s'pò cambié ê livèl d'pruteziòn dla pàgina '''$1'''.",
-'protect-locked-access'       => "Oci! Ta n'ê miga i parmess par cambié i livel d'pruteziòn dla pàgina.
+'protectlogpage' => 'Pruteziòn',
+'protectedarticle' => '"[[$1]]" l\'è prutèt',
+'modifiedarticleprotection' => 'l\'à cambié e\' livèl d\'pruteziòn par "[[$1]]"',
+'protectcomment' => 'Rasòn:',
+'protectexpiry' => 'Scadenza:',
+'protect_expiry_invalid' => "La scadenza la n'è piò bona.",
+'protect_expiry_old' => "T'cì ariv tèrd! La dèda d'scadenza l'è zà pasëda.",
+'protect-text' => "Cun ste mudèl u s'pò guardè e u s'pò cambié ê livèl d'pruteziòn dla pàgina '''$1'''.",
+'protect-locked-access' => "Oci! Ta n'ê miga i parmess par cambié i livel d'pruteziòn dla pàgina.
 S't'vù vdë in dô ch'j è i parmess, guèrda '''$1''':",
-'protect-cascadeon'           => "Sta pàgina pr'adès l'è bluchëda parchè l'è stra l'{{PLURAL:$1|la pàgina aquè sota, ch'l'à|al pàgin aquè sota, ch'j'à}} la pruteziòn ricursiva.
+'protect-cascadeon' => "Sta pàgina pr'adès l'è bluchëda parchè l'è stra l'{{PLURAL:$1|la pàgina aquè sota, ch'l'à|al pàgin aquè sota, ch'j'à}} la pruteziòn ricursiva.
 T'pù cambié ê livel d'pruteziòn d'sta pàgina, mo la pruteziòn ricursiva la resta a lè.",
-'protect-default'             => 'Dà ê parmess a tòt j navigadur',
-'protect-fallback'            => 'A què u j vô ê parmess "$1"',
+'protect-default' => 'Dà ê parmess a tòt j navigadur',
+'protect-fallback' => 'A què u j vô ê parmess "$1"',
 'protect-level-autoconfirmed' => "Bloca i navigador nov e quij ch'j n' s'è miga registrè",
-'protect-level-sysop'         => 'Sol par j aministradôr',
-'protect-summary-cascade'     => 'ricursiv',
-'protect-expiring'            => 'ê schëd: $1 (UTC)',
-'protect-cascade'             => "Prutezz al pàgin ch'j fa pèrt d'questa (pruteziòn ricursiva)",
-'protect-cantedit'            => "Oci! T'an pù miga cambié i livel d'pruteziòn dla pàgina, parchè t'an ê incora i parmess par cambié la pàgina.",
-'restriction-type'            => 'Parmess:',
-'restriction-level'           => "Livel d'restriziòn:",
+'protect-level-sysop' => 'Sol par j aministradôr',
+'protect-summary-cascade' => 'ricursiv',
+'protect-expiring' => 'ê schëd: $1 (UTC)',
+'protect-cascade' => "Prutezz al pàgin ch'j fa pèrt d'questa (pruteziòn ricursiva)",
+'protect-cantedit' => "Oci! T'an pù miga cambié i livel d'pruteziòn dla pàgina, parchè t'an ê incora i parmess par cambié la pàgina.",
+'restriction-type' => 'Parmess:',
+'restriction-level' => "Livel d'restriziòn:",
 
 # Undelete
 'undeletelink' => 'Guèrda/Torna indrì',
 
 # Namespace form on various pages
-'namespace'      => "Spàzi d'é nom:",
-'invert'         => 'Torna indrì cun la seleziòn',
+'namespace' => "Spàzi d'é nom:",
+'invert' => 'Torna indrì cun la seleziòn',
 'blanknamespace' => '(Prèma)',
 
 # Contributions
-'contributions'       => 'I mì lavor sora Vichipedia',
+'contributions' => 'I mì lavor sora Vichipedia',
 'contributions-title' => "Tòt quel ch'l'à scrètt $1",
-'mycontris'           => "Quél ch'a j ò scrètt me",
-'contribsub2'         => 'Par $1 ($2)',
-'uctop'               => '(va sò)',
-'month'               => "A cminzipiè d'e' mës (è d'j mës prezedént)",
-'year'                => "A cminzipié d'l'àn (e d'j èn prezedent)",
+'mycontris' => "Quél ch'a j ò scrètt me",
+'contribsub2' => 'Par $1 ($2)',
+'uctop' => '(va sò)',
+'month' => "A cminzipiè d'e' mës (è d'j mës prezedént)",
+'year' => "A cminzipié d'l'àn (e d'j èn prezedent)",
 
-'sp-contributions-newbies'  => "Fam avdé sol i lavòr d'j utent nuv",
+'sp-contributions-newbies' => "Fam avdé sol i lavòr d'j utent nuv",
 'sp-contributions-blocklog' => "Regèstar d'j bloc",
-'sp-contributions-search'   => 'Zerca j lavór',
+'sp-contributions-search' => 'Zerca j lavór',
 'sp-contributions-username' => 'Indirèzz IP o soranòm',
-'sp-contributions-submit'   => 'Zerca',
+'sp-contributions-submit' => 'Zerca',
 
 # What links here
-'whatlinkshere'            => "Pagin ch'j è atachedi a questa",
-'whatlinkshere-title'      => 'Pagin atachédi a "$1"',
-'whatlinkshere-page'       => 'Pàgina:',
-'linkshere'                => "Sti pàgin a què al cuntèn di culegamént a '''[[:$1]]''':",
-'isredirect'               => 'Re-indirèzza',
-'istemplate'               => 'inclusiòn',
-'isimage'                  => 'culegamént a una figura',
-'whatlinkshere-prev'       => '{{PLURAL:$1|quel prèma|i $1 prèma}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|quel dòp|i $1 dòp}}',
-'whatlinkshere-links'      => '← culegamént',
+'whatlinkshere' => "Pagin ch'j è atachedi a questa",
+'whatlinkshere-title' => 'Pagin atachédi a "$1"',
+'whatlinkshere-page' => 'Pàgina:',
+'linkshere' => "Sti pàgin a què al cuntèn di culegamént a '''[[:$1]]''':",
+'isredirect' => 'Re-indirèzza',
+'istemplate' => 'inclusiòn',
+'isimage' => 'culegamént a una figura',
+'whatlinkshere-prev' => '{{PLURAL:$1|quel prèma|i $1 prèma}}',
+'whatlinkshere-next' => '{{PLURAL:$1|quel dòp|i $1 dòp}}',
+'whatlinkshere-links' => '← culegamént',
 'whatlinkshere-hideredirs' => "$1 u t' rmanda",
-'whatlinkshere-hidetrans'  => '$1 inclusiòn',
-'whatlinkshere-hidelinks'  => '$1 culegamént',
-'whatlinkshere-filters'    => 'Filtar',
+'whatlinkshere-hidetrans' => '$1 inclusiòn',
+'whatlinkshere-hidelinks' => '$1 culegamént',
+'whatlinkshere-filters' => 'Filtar',
 
 # Block/unblock
-'blockip'                  => 'Indirèzz IP bluché',
-'ipboptions'               => '2 ór:2 hours,2 dè:1 day,3 dè:3 days,1 smana:1 week,2 smani:2 weeks,1 mês:1 month,3 mis:3 months,6 mîs:6 months,1 àn:1 year,par sempar:infinite',
-'ipblocklist'              => 'Soranom e indirezz IP bluché',
-'blocklink'                => 'Met-j é carnaz',
-'unblocklink'              => "chèva e' carnàz",
-'change-blocklink'         => 'Chèmbia carnàz',
-'contribslink'             => "Ch'l'un ch'l'à scrét",
-'blocklogpage'             => "Regèstar d'j blocch",
-'blocklogentry'            => '"[[$1]]" l\'è sté bluché par $2 $3',
-'unblocklogentry'          => "l'à sbluchè $1",
+'blockip' => 'Indirèzz IP bluché',
+'ipboptions' => '2 ór:2 hours,2 dè:1 day,3 dè:3 days,1 smana:1 week,2 smani:2 weeks,1 mês:1 month,3 mis:3 months,6 mîs:6 months,1 àn:1 year,par sempar:infinite',
+'ipblocklist' => 'Soranom e indirezz IP bluché',
+'blocklink' => 'Met-j é carnaz',
+'unblocklink' => "chèva e' carnàz",
+'change-blocklink' => 'Chèmbia carnàz',
+'contribslink' => "Ch'l'un ch'l'à scrét",
+'blocklogpage' => "Regèstar d'j blocch",
+'blocklogentry' => '"[[$1]]" l\'è sté bluché par $2 $3',
+'unblocklogentry' => "l'à sbluchè $1",
 'block-log-flags-nocreate' => "Un' s'pò brisa registrès un'étra volta",
 
 # Move page
-'movepagetext'     => "Cun st'uperaziòn t'pù cambiè e' nom a una pàgina. Tòti al versiòn prezedenti j và drì a la pàgina nova.
+'movepagetext' => "Cun st'uperaziòn t'pù cambiè e' nom a una pàgina. Tòti al versiòn prezedenti j và drì a la pàgina nova.
 E' nom vec, nec quel, u t' pórta a la pàgina nova.
 E adès, a l' set cus ch't' pù fè? T'pù andé a zarchè i nom vec e meti-j a post tot cun e' nom nov. S't'a n'e' brisa voja, l'è listéss, parò va a cuntrulè prèma s'j è di [[Special:DoubleRedirects|doppii]] ó [[Special:BrokenRedirects|ghènz scuvert]].
 T'ci responsabil d'cuntrulé che tot i ghenz j seja a post.
@@ -609,21 +608,21 @@ Un cunsej? Pensa al conseguenzi de tu att prèma d's-cjazè e' butòn.",
 *e' quadret d'cunferma aquè sota un è piò spuntè.
 
 In tot sti chès, s'et pazienzia, t'pù spustè a man tot quel c'u j è scrètt intla pàgina d'cunversaziòn.",
-'movearticle'      => 'Chèmbia nom a la pàgina:',
-'newtitle'         => 'Titul nóv:',
-'move-watch'       => "Ten sot'öcc sta pàgina",
-'movepagebtn'      => 'Sposta la pàgina',
-'pagemovedsub'     => "T'cì ste brev! T'a j é fata.",
-'movepage-moved'   => "'''\"\$1\" l'à cambié post a \"\$2\"'''",
-'articleexists'    => "La j è za una pàgina ch'la s-cjama acsè. O e nom ch'ta j e dë un va brisa ben.
+'movearticle' => 'Chèmbia nom a la pàgina:',
+'newtitle' => 'Titul nóv:',
+'move-watch' => "Ten sot'öcc sta pàgina",
+'movepagebtn' => 'Sposta la pàgina',
+'pagemovedsub' => "T'cì ste brev! T'a j é fata.",
+'movepage-moved' => "'''\"\$1\" l'à cambié post a \"\$2\"'''",
+'articleexists' => "La j è za una pàgina ch'la s-cjama acsè. O e nom ch'ta j e dë un va brisa ben.
 Par piaser, daij un ètar nom.",
-'talkexists'       => "'''La pàgina l'è stëda spusteda ben, invezi la pàgina d'cunversaziòn l'è andëda a cuzè cun òna ch'l'à ê stes nom. Csa fasègna?
+'talkexists' => "'''La pàgina l'è stëda spusteda ben, invezi la pàgina d'cunversaziòn l'è andëda a cuzè cun òna ch'l'à ê stes nom. Csa fasègna?
 Par piasé, met insem al du pàgin te, fasend copia e incola.",
-'movedto'          => 'Spusté vers:',
-'movetalk'         => "Sposta ènca la pàgina d'cunversaziòn",
-'movelogpage'      => "Regéstar d'j muvimént",
-'movereason'       => 'Rasòn:',
-'revertmove'       => 'Métla cum era prèma',
+'movedto' => 'Spusté vers:',
+'movetalk' => "Sposta ènca la pàgina d'cunversaziòn",
+'movelogpage' => "Regéstar d'j muvimént",
+'movereason' => 'Rasòn:',
+'revertmove' => 'Métla cum era prèma',
 
 # Export
 'export' => 'Espórta dal pàgin',
@@ -632,67 +631,67 @@ Par piasé, met insem al du pàgin te, fasend copia e incola.",
 'thumbnail-more' => 'Fal piò lèrg',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'La tu pàgina persunèla',
-'tooltip-pt-mytalk'               => "La tu pàgina d'cunversaziòn cun ch'jetar",
-'tooltip-pt-preferences'          => 'I tu gòst',
-'tooltip-pt-watchlist'            => "Lèsta dal pàgin ch'te ténn sot öcc",
-'tooltip-pt-mycontris'            => "Lèsta d'quel ch'a j ò scrètt mè",
-'tooltip-pt-login'                => "E' srevv mej registrét, énch s't' antcé ublighè a fèl",
-'tooltip-pt-logout'               => "Va fora, t'é finì",
-'tooltip-ca-talk'                 => 'Guèrda al discussion sora sta pagina',
-'tooltip-ca-edit'                 => "Te t' po' cambiè 'sta pagina. Par piasè, arcoldat, guèrda prèma cu'ste fat, e pu dòp sèlva e' tu lavor.",
-'tooltip-ca-addsection'           => 'Taca una nova seziòn',
-'tooltip-ca-viewsource'           => "Sta pàgina què l'à e' carnaz, ma t'pù avdé e' su codiz surgent.",
-'tooltip-ca-history'              => "A vut avdé cun cl'era prèma sta pagina?",
-'tooltip-ca-protect'              => 'Mett una pruteziòn a sta pàgina',
-'tooltip-ca-delete'               => 'Scanzèla sta pàgina',
-'tooltip-ca-move'                 => 'Chèmbia nòm a sta pàgina',
-'tooltip-ca-watch'                => "Vut t'nì drì a sta pàgina?",
-'tooltip-ca-unwatch'              => "Chèva sta pàgina d'la lista dj pàgin da tnì öcc",
-'tooltip-search'                  => 'Zerca dentar {{SITENAME}}',
-'tooltip-search-go'               => "Va a zirché una pàgina c'l'as cjèma acsè, s'la j è",
-'tooltip-search-fulltext'         => "Zerca e' scrètt in tal pàgin",
-'tooltip-n-mainpage'              => "Va a v'dé la Prèma Pagina",
-'tooltip-n-mainpage-description'  => "Va a v'dé la prèma pagina",
-'tooltip-n-portal'                => "A't spieghen nicosa sora e' purtèl, cosa t'pu fè a què e indov'ej al robi",
-'tooltip-n-currentevents'         => "Zerca dagli infurmaziòn sora i fät d'incù dè",
-'tooltip-n-recentchanges'         => "Lèsta d'j ultum cambiamént int'e' sit",
-'tooltip-n-randompage'            => 'Fam avdé la pagina ch’ u t’ pé',
-'tooltip-n-help'                  => "E't absogn d'spiegazion?",
-'tooltip-t-whatlinkshere'         => "Lèsta d'tott al pagin ch'aglj è atachedi a questa",
-'tooltip-t-recentchangeslinked'   => "Lèsta d'j ultum cambiament al pàgin atachédi a questa",
-'tooltip-feed-rss'                => 'Canël RSS par sta pàgina',
-'tooltip-feed-atom'               => 'Canël Atom par sta pàgina',
-'tooltip-t-contributions'         => "Guèrda la lèsta d'tot i lavor ch'l'à fat ste patàca",
-'tooltip-t-emailuser'             => 'Manda un scrètt a ste patàca',
-'tooltip-t-upload'                => "Carga d'j file multimediél",
-'tooltip-t-specialpages'          => 'Lèsta ad toti al pàgin particulèri',
-'tooltip-t-print'                 => 'Versiòn bona da stampè sta pagina',
-'tooltip-t-permalink'             => "Culegament fèss a 'sta version d'la pagina",
-'tooltip-ca-nstab-main'           => "Guèrda st'ètra pagina",
-'tooltip-ca-nstab-user'           => 'Guèrda la pàgina persunëla',
-'tooltip-ca-nstab-special'        => "Csa fet ? Questa l'è una pàgina particulèra; t'an pu brisa scrivar sora",
-'tooltip-ca-nstab-project'        => "Guèrda la pàgina dagl'infurmaziòn",
-'tooltip-ca-nstab-image'          => "Guèrda la pàgina d'e' file",
-'tooltip-ca-nstab-template'       => "Guèrda e' mudel",
-'tooltip-ca-nstab-category'       => 'Guèrda la pàgina dla categurèja',
-'tooltip-minoredit'               => "Segna sta mudèfga ch'l'è znina",
-'tooltip-save'                    => 'Regèstra i tü cambiamént',
-'tooltip-preview'                 => "Guèrda ste fat un bèl lavor, l'è sèmpar mej fè'l, prèma d'registrè!",
-'tooltip-diff'                    => "Fa m'avdé i cambiamént ch'a j ò fat me",
+'tooltip-pt-userpage' => 'La tu pàgina persunèla',
+'tooltip-pt-mytalk' => "La tu pàgina d'cunversaziòn cun ch'jetar",
+'tooltip-pt-preferences' => 'I tu gòst',
+'tooltip-pt-watchlist' => "Lèsta dal pàgin ch'te ténn sot öcc",
+'tooltip-pt-mycontris' => "Lèsta d'quel ch'a j ò scrètt mè",
+'tooltip-pt-login' => "E' srevv mej registrét, énch s't' antcé ublighè a fèl",
+'tooltip-pt-logout' => "Va fora, t'é finì",
+'tooltip-ca-talk' => 'Guèrda al discussion sora sta pagina',
+'tooltip-ca-edit' => "Te t' po' cambiè 'sta pagina. Par piasè, arcoldat, guèrda prèma cu'ste fat, e pu dòp sèlva e' tu lavor.",
+'tooltip-ca-addsection' => 'Taca una nova seziòn',
+'tooltip-ca-viewsource' => "Sta pàgina què l'à e' carnaz, ma t'pù avdé e' su codiz surgent.",
+'tooltip-ca-history' => "A vut avdé cun cl'era prèma sta pagina?",
+'tooltip-ca-protect' => 'Mett una pruteziòn a sta pàgina',
+'tooltip-ca-delete' => 'Scanzèla sta pàgina',
+'tooltip-ca-move' => 'Chèmbia nòm a sta pàgina',
+'tooltip-ca-watch' => "Vut t'nì drì a sta pàgina?",
+'tooltip-ca-unwatch' => "Chèva sta pàgina d'la lista dj pàgin da tnì öcc",
+'tooltip-search' => 'Zerca dentar {{SITENAME}}',
+'tooltip-search-go' => "Va a zirché una pàgina c'l'as cjèma acsè, s'la j è",
+'tooltip-search-fulltext' => "Zerca e' scrètt in tal pàgin",
+'tooltip-n-mainpage' => "Va a v'dé la Prèma Pagina",
+'tooltip-n-mainpage-description' => "Va a v'dé la prèma pagina",
+'tooltip-n-portal' => "A't spieghen nicosa sora e' purtèl, cosa t'pu fè a què e indov'ej al robi",
+'tooltip-n-currentevents' => "Zerca dagli infurmaziòn sora i fät d'incù dè",
+'tooltip-n-recentchanges' => "Lèsta d'j ultum cambiamént int'e' sit",
+'tooltip-n-randompage' => 'Fam avdé la pagina ch’ u t’ pé',
+'tooltip-n-help' => "E't absogn d'spiegazion?",
+'tooltip-t-whatlinkshere' => "Lèsta d'tott al pagin ch'aglj è atachedi a questa",
+'tooltip-t-recentchangeslinked' => "Lèsta d'j ultum cambiament al pàgin atachédi a questa",
+'tooltip-feed-rss' => 'Canël RSS par sta pàgina',
+'tooltip-feed-atom' => 'Canël Atom par sta pàgina',
+'tooltip-t-contributions' => "Guèrda la lèsta d'tot i lavor ch'l'à fat ste patàca",
+'tooltip-t-emailuser' => 'Manda un scrètt a ste patàca',
+'tooltip-t-upload' => "Carga d'j file multimediél",
+'tooltip-t-specialpages' => 'Lèsta ad toti al pàgin particulèri',
+'tooltip-t-print' => 'Versiòn bona da stampè sta pagina',
+'tooltip-t-permalink' => "Culegament fèss a 'sta version d'la pagina",
+'tooltip-ca-nstab-main' => "Guèrda st'ètra pagina",
+'tooltip-ca-nstab-user' => 'Guèrda la pàgina persunëla',
+'tooltip-ca-nstab-special' => "Csa fet ? Questa l'è una pàgina particulèra; t'an pu brisa scrivar sora",
+'tooltip-ca-nstab-project' => "Guèrda la pàgina dagl'infurmaziòn",
+'tooltip-ca-nstab-image' => "Guèrda la pàgina d'e' file",
+'tooltip-ca-nstab-template' => "Guèrda e' mudel",
+'tooltip-ca-nstab-category' => 'Guèrda la pàgina dla categurèja',
+'tooltip-minoredit' => "Segna sta mudèfga ch'l'è znina",
+'tooltip-save' => 'Regèstra i tü cambiamént',
+'tooltip-preview' => "Guèrda ste fat un bèl lavor, l'è sèmpar mej fè'l, prèma d'registrè!",
+'tooltip-diff' => "Fa m'avdé i cambiamént ch'a j ò fat me",
 'tooltip-compareselectedversions' => "Guèrda al diferénzi tra 'l du versiòn seleziunèdi d'sta pàgina",
-'tooltip-watch'                   => 'Mett sta pagina insèm aglj ètri da tnì sot öcc',
-'tooltip-rollback'                => "E butòn \"armèt cum'era prèma\" sérv par scanzlè quel ch'l'à fät ch'l'un ch'à lavurè par ultum in sta pàgina",
-'tooltip-undo'                    => "\"Torna indrì\" e' serv par scanzlè 'sta mudèfica, l'avèrr la fnestra d'mudèfica in manira d'guardé prèma. Quènd t'e' fat, t'pù mètar in bas la spiegaziòn dla tu mudèfica.",
+'tooltip-watch' => 'Mett sta pagina insèm aglj ètri da tnì sot öcc',
+'tooltip-rollback' => "E butòn \"armèt cum'era prèma\" sérv par scanzlè quel ch'l'à fät ch'l'un ch'à lavurè par ultum in sta pàgina",
+'tooltip-undo' => "\"Torna indrì\" e' serv par scanzlè 'sta mudèfica, l'avèrr la fnestra d'mudèfica in manira d'guardé prèma. Quènd t'e' fat, t'pù mètar in bas la spiegaziòn dla tu mudèfica.",
 
 # Browsing diffs
 'previousdiff' => "← Difarénza prèma d'questa",
-'nextdiff'     => 'Mudèfica piò nova →',
+'nextdiff' => 'Mudèfica piò nova →',
 
 # Media information
 'file-info-size' => "$1 × $2 pixel, amsùra d'e' file: $3, tipo MIME: $4",
-'file-nohires'   => "U n' è pusèbil d'avdé cun òna risoluziòn piò élta.",
-'svg-long-desc'  => "file d'taja SVG, dimensiòn numinèli $1 × $2 pixel, dimensiòn d'e' file: $3",
+'file-nohires' => "U n' è pusèbil d'avdé cun òna risoluziòn piò élta.",
+'svg-long-desc' => "file d'taja SVG, dimensiòn numinèli $1 × $2 pixel, dimensiòn d'e' file: $3",
 'show-big-image' => 'Versiòn ad amsura pina',
 
 # Bad image list
@@ -703,12 +702,12 @@ E' prèm culegamént d'una riga l'à da èsar un culegamént a un file c'un gn'e
 Tot i culegamént ch'j ven dop, sora la stèsa riga, j conta cumpagna d'j eceziòn (e' vò dì, pàgin indov e' file u's pò infilè nurmalment)",
 
 # Metadata
-'metadata'          => 'Dèd sora i dèd',
-'metadata-help'     => "Ste file l'à d'l'infurmaziòn in piò. Forsi parchè al figur j è stedi cjapèdi con la machina digitèla o cun e' scàner.
+'metadata' => 'Dèd sora i dèd',
+'metadata-help' => "Ste file l'à d'l'infurmaziòn in piò. Forsi parchè al figur j è stedi cjapèdi con la machina digitèla o cun e' scàner.
 Se parò un qvelcadon à lavurè sora sta figura, zerti infurmaziòn j n' curespòn piò cun l'uriginel.",
-'metadata-expand'   => 'Fam avdé i particulèr',
+'metadata-expand' => 'Fam avdé i particulèr',
 'metadata-collapse' => 'Nascond i particulèr',
-'metadata-fields'   => "I chêmp d'j metadata EXIF elenché in ste mesàg, j t' ven presenté int'la pàgina d'la figura, quènd la tabèla d'j metadata l'è ardòta znina. J ètar chèmp j srà nascost.
+'metadata-fields' => "I chêmp d'j metadata EXIF elenché in ste mesàg, j t' ven presenté int'la pàgina d'la figura, quènd la tabèla d'j metadata l'è ardòta znina. J ètar chèmp j srà nascost.
 * make
 * model
 * datetimeoriginal
@@ -724,18 +723,18 @@ Se parò un qvelcadon à lavurè sora sta figura, zerti infurmaziòn j n' curesp
 * gpsaltitude",
 
 # External editor support
-'edit-externally'      => 'Mudèfica ste file cun un prugrama esteran',
+'edit-externally' => 'Mudèfica ste file cun un prugrama esteran',
 'edit-externally-help' => "(Guèrda e' [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] par avé d'j ètri infurmaziòn) (l'è in inglés)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tòt',
 'namespacesall' => 'töt',
-'monthsall'     => 'tòt',
+'monthsall' => 'tòt',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Fam avdè al mudèfich impurtènti',
 'watchlisttools-edit' => "Guèrda e mudèfica la lèsta d'pàgin da tnì d'öcc",
-'watchlisttools-raw'  => "Mudèfiga la lèsta - scrètta - dal pàgin da tnì d'öcc",
+'watchlisttools-raw' => "Mudèfiga la lèsta - scrètta - dal pàgin da tnì d'öcc",
 
 # Special:SpecialPages
 'specialpages' => 'Pàgin particulèri',
index 7e5069e..13aa830 100644 (file)
 
 $messages = array(
 # Dates
-'sun'           => 'Asamas',
-'mon'           => 'Aynas',
-'tue'           => 'Asinas',
-'wed'           => 'Akras',
-'thu'           => 'Akwas',
-'fri'           => 'Asimwas',
-'sat'           => 'Asiḍyas',
-'january'       => 'Yennayer',
-'february'      => 'Yebrayer',
-'march'         => 'Mares',
-'april'         => 'Ibrir',
-'may_long'      => 'May',
-'june'          => 'Yunyu',
-'july'          => 'Yulyuz',
-'august'        => 'Ghuct',
-'september'     => 'Cutanbir',
-'october'       => 'Ktubar',
-'november'      => 'Nuwanbir',
-'december'      => 'Dujanbir',
-'january-gen'   => 'Ynnayr',
-'february-gen'  => 'Ybrayr',
-'march-gen'     => 'Mars',
-'april-gen'     => 'Ibrir',
-'may-gen'       => 'May',
-'june-gen'      => 'Yunyu',
-'july-gen'      => 'Yulyuz',
-'august-gen'    => 'Ghuct',
+'sun' => 'Asamas',
+'mon' => 'Aynas',
+'tue' => 'Asinas',
+'wed' => 'Akras',
+'thu' => 'Akwas',
+'fri' => 'Asimwas',
+'sat' => 'Asiḍyas',
+'january' => 'Yennayer',
+'february' => 'Yebrayer',
+'march' => 'Mares',
+'april' => 'Ibrir',
+'may_long' => 'May',
+'june' => 'Yunyu',
+'july' => 'Yulyuz',
+'august' => 'Ghuct',
+'september' => 'Cutanbir',
+'october' => 'Ktubar',
+'november' => 'Nuwanbir',
+'december' => 'Dujanbir',
+'january-gen' => 'Ynnayr',
+'february-gen' => 'Ybrayr',
+'march-gen' => 'Mars',
+'april-gen' => 'Ibrir',
+'may-gen' => 'May',
+'june-gen' => 'Yunyu',
+'july-gen' => 'Yulyuz',
+'august-gen' => 'Ghuct',
 'september-gen' => 'Cutanbir',
-'october-gen'   => 'Ktubar',
-'november-gen'  => 'Nuwanbir',
-'december-gen'  => 'Dujanbir',
-'jan'           => 'Yennayer',
-'feb'           => 'Yebrayer',
-'mar'           => 'Mars',
-'apr'           => 'Ybrir',
-'may'           => 'May',
-'jun'           => 'Yunyu',
-'jul'           => 'Yulyuz',
-'aug'           => 'Ghuct',
-'sep'           => 'Cutanbir',
-'oct'           => 'Ktubar',
-'nov'           => 'Nuwanbir',
-'dec'           => 'Dujanbir',
+'october-gen' => 'Ktubar',
+'november-gen' => 'Nuwanbir',
+'december-gen' => 'Dujanbir',
+'jan' => 'Yennayer',
+'feb' => 'Yebrayer',
+'mar' => 'Mars',
+'apr' => 'Ybrir',
+'may' => 'May',
+'jun' => 'Yunyu',
+'jul' => 'Yulyuz',
+'aug' => 'Ghuct',
+'sep' => 'Cutanbir',
+'oct' => 'Ktubar',
+'nov' => 'Nuwanbir',
+'dec' => 'Dujanbir',
 
 # Categories related messages
-'category_header'        => 'Tasniwin di taggayt "$1"',
-'subcategories'          => 'Tadu-ggayin',
-'category-media-header'  => 'Media di category "$1"',
-'category-empty'         => "''Taggayt a war dags bu ca n Tasna niɣ ca n umedia.''",
+'category_header' => 'Tasniwin di taggayt "$1"',
+'subcategories' => 'Tadu-ggayin',
+'category-media-header' => 'Media di category "$1"',
+'category-empty' => "''Taggayt a war dags bu ca n Tasna niɣ ca n umedia.''",
 'listingcontinuesabbrev' => 'arni-d.',
 
-'about'      => 'Xef',
-'newwindow'  => '(Areẓm di tburjet d-tamaynut)',
-'cancel'     => 'Sbdd',
-'mytalk'     => 'Amsawal inu',
+'about' => 'Xef',
+'newwindow' => '(Areẓm di tburjet d-tamaynut)',
+'cancel' => 'Sbdd',
+'mytalk' => 'Amsawal inu',
 'navigation' => 'Tagriwa',
 
 # Cologne Blue skin
-'qbfind'         => 'Af',
-'qbedit'         => 'Ẓṛeg',
+'qbfind' => 'Af',
+'qbedit' => 'Ẓṛeg',
 'qbspecialpages' => 'Tudmawin Special',
 
-'errorpagetitle'   => 'Anezri',
-'returnto'         => 'Dwl ghar $1.',
-'tagline'          => 'Zi {{SITENAME}}',
-'help'             => 'Tallalt',
-'search'           => 'Tarezzut',
-'searchbutton'     => 'Rzu',
-'go'               => 'Raḥ ɣa',
-'searcharticle'    => 'Uyur',
-'history'          => 'Amzruy n Tasna',
-'history_short'    => 'Amezruy',
+'errorpagetitle' => 'Anezri',
+'returnto' => 'Dwl ghar $1.',
+'tagline' => 'Zi {{SITENAME}}',
+'help' => 'Tallalt',
+'search' => 'Tarezzut',
+'searchbutton' => 'Rzu',
+'go' => 'Raḥ ɣa',
+'searcharticle' => 'Uyur',
+'history' => 'Amzruy n Tasna',
+'history_short' => 'Amezruy',
 'printableversion' => 'Tanghelt n usiggez',
-'permalink'        => 'Tamghunt iqqimen',
-'edit'             => 'Ẓṛeg',
-'create'           => 'Egg',
-'editthispage'     => 'Ẓṛg tasna ya',
-'delete'           => 'Kks',
-'protect'          => 'Mstn',
-'protect_change'   => 'sbadl',
-'newpage'          => 'Tasna d-tamaynut',
-'talkpage'         => 'Siwl xf tasna ya',
+'permalink' => 'Tamghunt iqqimen',
+'edit' => 'Ẓṛeg',
+'create' => 'Egg',
+'editthispage' => 'Ẓṛg tasna ya',
+'delete' => 'Kks',
+'protect' => 'Mstn',
+'protect_change' => 'sbadl',
+'newpage' => 'Tasna d-tamaynut',
+'talkpage' => 'Siwl xf tasna ya',
 'talkpagelinktext' => 'Awal',
-'personaltools'    => 'Imassen inu',
-'talk'             => 'siwel',
-'views'            => 'Timmeẓṛa',
-'toolbox'          => 'Tanakat n imassen',
-'otherlanguages'   => 'S tutlayin nneḍni',
-'redirectedfrom'   => '(Itwasnnmd-d zi $1)',
-'redirectpagesub'  => 'Tasna n (Redirect)',
-'jumpto'           => 'Nḍu ghar:',
+'personaltools' => 'Imassen inu',
+'talk' => 'siwel',
+'views' => 'Timmeẓṛa',
+'toolbox' => 'Tanakat n imassen',
+'otherlanguages' => 'S tutlayin nneḍni',
+'redirectedfrom' => '(Itwasnnmd-d zi $1)',
+'redirectpagesub' => 'Tasna n (Redirect)',
+'jumpto' => 'Nḍu ghar:',
 'jumptonavigation' => 'tagriwa',
-'jumptosearch'     => 'tarezzut',
+'jumptosearch' => 'tarezzut',
 
 # 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'            => 'Awal xef {{SITENAME}}',
-'aboutpage'            => 'Project:Awal xef',
-'copyrightpage'        => '{{ns:project}}:izrefan ussenɣel',
-'currentevents'        => 'Mayn itemsaren rux',
-'currentevents-url'    => 'Project:mayn itmesaren ruxa',
-'disclaimers'          => 'Ismigilen',
-'disclaimerpage'       => 'Project:Asmigel amatu',
-'edithelp'             => 'Tallalt deg uẓareg',
-'edithelppage'         => 'Help:Aẓareg',
-'helppage'             => 'Help:tallalt',
-'mainpage'             => 'Tasna Tamezwarut',
+'aboutsite' => 'Awal xef {{SITENAME}}',
+'aboutpage' => 'Project:Awal xef',
+'copyrightpage' => '{{ns:project}}:izrefan ussenɣel',
+'currentevents' => 'Mayn itemsaren rux',
+'currentevents-url' => 'Project:mayn itmesaren ruxa',
+'disclaimers' => 'Ismigilen',
+'disclaimerpage' => 'Project:Asmigel amatu',
+'edithelp' => 'Tallalt deg uẓareg',
+'edithelppage' => 'Help:Aẓareg',
+'helppage' => 'Help:tallalt',
+'mainpage' => 'Tasna Tamezwarut',
 'mainpage-description' => 'Tasna Tamzwarut',
-'portal'               => 'Tawwart n timetti',
-'portal-url'           => 'Project:tawwart n timetti',
-'privacy'              => 'Tasertit n tusligi',
-'privacypage'          => 'Project:Tasertit n tusligi',
-
-'retrievedfrom'       => 'Itwarr-d zi "$1"',
-'youhavenewmessages'  => 'Ghar-k / Ghar-m $1 ($2).',
-'newmessageslink'     => 'tibratin timaynutin',
+'portal' => 'Tawwart n timetti',
+'portal-url' => 'Project:tawwart n timetti',
+'privacy' => 'Tasertit n tusligi',
+'privacypage' => 'Project:Tasertit n tusligi',
+
+'retrievedfrom' => 'Itwarr-d zi "$1"',
+'youhavenewmessages' => 'Ghar-k / Ghar-m $1 ($2).',
+'newmessageslink' => 'tibratin timaynutin',
 'newmessagesdifflink' => 'Taẓṛigt tanggarut',
-'editsection'         => 'Ẓṛeg',
-'editold'             => 'ẓṛeg',
-'editlink'            => 'ẓṛg',
-'viewsourcelink'      => 'ẓṛ aghbalu',
-'editsectionhint'     => 'Ẓṛeg tigezmi: $1',
-'toc'                 => 'Iktturn',
-'showtoc'             => 'sskn-d',
-'hidetoc'             => 'snuffar',
-'site-rss-feed'       => 'Tilgha n RSS n $1',
-'site-atom-feed'      => 'Talghut n Atom n $1',
-'page-rss-feed'       => 'Asudem n RSS n "$1"',
-'red-link-title'      => '$1 (tasna ur telli)',
+'editsection' => 'Ẓṛeg',
+'editold' => 'ẓṛeg',
+'editlink' => 'ẓṛg',
+'viewsourcelink' => 'ẓṛ aghbalu',
+'editsectionhint' => 'Ẓṛeg tigezmi: $1',
+'toc' => 'Iktturn',
+'showtoc' => 'sskn-d',
+'hidetoc' => 'snuffar',
+'site-rss-feed' => 'Tilgha n RSS n $1',
+'site-atom-feed' => 'Talghut n Atom n $1',
+'page-rss-feed' => 'Asudem n RSS n "$1"',
+'red-link-title' => '$1 (tasna ur telli)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Tasna',
-'nstab-user'     => 'Tasna n User',
-'nstab-project'  => 'Tasna usenfar',
-'nstab-image'    => 'Asatul',
+'nstab-main' => 'Tasna',
+'nstab-user' => 'Tasna n User',
+'nstab-project' => 'Tasna usenfar',
+'nstab-image' => 'Asatul',
 'nstab-template' => 'Tamudmt',
 'nstab-category' => 'Taggayt(category)',
 
 # General errors
-'badtitle'       => 'isem war icni ca',
-'badtitletext'   => 'Isem n Tasna itexised war icni ca, ixwa, niɣ  isem n ajar-tutlayt niɣ ajar-wiki war icni ca.
+'badtitle' => 'isem war icni ca',
+'badtitletext' => 'Isem n Tasna itexised war icni ca, ixwa, niɣ  isem n ajar-tutlayt niɣ ajar-wiki war icni ca.
 teqqad ad yilli days ca n usekkil war itwagg deg isem .',
-'viewsource'     => 'Ẓṛ aghbalu',
+'viewsource' => 'Ẓṛ aghbalu',
 'viewsourcetext' => 'Tzemred a tẓerd u atsneɣled aɣbal n Tasna ya :',
 
 # Login and logout pages
-'yourname'                => 'Izwl-usqdac:',
-'yourpassword'            => 'Tawalt n wadaf:',
-'remembermypassword'      => 'ejj (login) inu deg uselkim a (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'Adf',
+'yourname' => 'Izwl-usqdac:',
+'yourpassword' => 'Tawalt n wadaf:',
+'remembermypassword' => 'ejj (login) inu deg uselkim a (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Adf',
 'nav-login-createaccount' => 'Adef / egg amiḍan',
-'loginprompt'             => "itxessa ad-teṭfed (''cookies'') bac ad tadfed ɣar {{SITENAME}}.",
-'userlogin'               => 'Adf / egg amiḍan',
-'logout'                  => 'Ufugh',
-'userlogout'              => 'Ufugh',
-'nologin'                 => "war ɣark login? '''$1'''.",
-'nologinlink'             => 'Egg amiḍan',
-'createaccount'           => 'Egg amiḍan',
-'gotaccount'              => "ɣark  amiḍan? '''$1'''.",
-'gotaccountlink'          => 'Adeff',
-'loginsuccesstitle'       => 'Adaf icna',
-'loginsuccess'            => "'''Qac tudeffed di {{SITENAME}} s \"\$1\".'''",
-'nosuchuser'              => 'War illi ca n useqdac s isem a"$1".
+'loginprompt' => "itxessa ad-teṭfed (''cookies'') bac ad tadfed ɣar {{SITENAME}}.",
+'userlogin' => 'Adf / egg amiḍan',
+'logout' => 'Ufugh',
+'userlogout' => 'Ufugh',
+'nologin' => "war ɣark login? '''$1'''.",
+'nologinlink' => 'Egg amiḍan',
+'createaccount' => 'Egg amiḍan',
+'gotaccount' => "ɣark  amiḍan? '''$1'''.",
+'gotaccountlink' => 'Adeff',
+'loginsuccesstitle' => 'Adaf icna',
+'loginsuccess' => "'''Qac tudeffed di {{SITENAME}} s \"\$1\".'''",
+'nosuchuser' => 'War illi ca n useqdac s isem a"$1".
 xemm tirra , niɣ egg amiḍan d amaynu.',
-'nosuchusershort'         => 'War illi ca n useqdac s isem a "$1".
+'nosuchusershort' => 'War illi ca n useqdac s isem a "$1".
 xemm tirra.',
-'nouserspecified'         => 'ixessa ad tuced isem n useqdac.',
-'wrongpassword'           => 'Taguri n wadaf war tceni ca. Sideff tenni nican.',
-'wrongpasswordempty'      => 'Taguri n wadaf i tucid texwa. Sideff tenni nican.',
-'passwordtooshort'        => 'Taguri n wadaf inec war d tusi ca.
+'nouserspecified' => 'ixessa ad tuced isem n useqdac.',
+'wrongpassword' => 'Taguri n wadaf war tceni ca. Sideff tenni nican.',
+'wrongpasswordempty' => 'Taguri n wadaf i tucid texwa. Sideff tenni nican.',
+'passwordtooshort' => 'Taguri n wadaf inec war d tusi ca.
 itxessat ad di-s tili {{PLURAL:$1|1 usekkil|$1 isekkilen}} u ad tili temṣebda x isem n useqdac inec.',
-'mailmypassword'          => 'Sekk Taguri n wadaf di E-mail',
-'passwordremindertitle'   => 'Taguri n wadaf tamaynut n ruxa waha {{SITENAME}}',
-'passwordremindertext'    => 'Ca n ijj (teqqad ad yili d cekk, zi tansa IP a $1)
+'mailmypassword' => 'Sekk Taguri n wadaf di E-mail',
+'passwordremindertitle' => 'Taguri n wadaf tamaynut n ruxa waha {{SITENAME}}',
+'passwordremindertext' => 'Ca n ijj (teqqad ad yili d cekk, zi tansa IP a $1)
 inna neɣ ada-s-ad nesekk Taguri n wadaf tamaynut i {{SITENAME}} ($4).
 Taguri n wadaf n useqdac "$2" ruxa d "$3".
 ixessa ad tadeffed bac ad tbeddeled ruxa.
 ɣar {{PLURAL:$5|one day|$5 days}} at sala taguri n wadaf tamaynut .
 mala war illi d cekk ur tawi x manaya , qim sexdam Taguri n wadaf inecc taqburt.',
-'noemail'                 => 'War illi ca n e-mail ɣar useqdac a "$1".',
-'passwordsent'            => 'Taguri n wadaf tamaynut twassekked i e-mail  "$1".
+'noemail' => 'War illi ca n e-mail ɣar useqdac a "$1".',
+'passwordsent' => 'Taguri n wadaf tamaynut twassekked i e-mail  "$1".
 adeff-d xmi ɣa teṭfed.',
-'eauthentsent'            => 'ijj n e-mail itwasekked ɣar e-mail nni.
+'eauthentsent' => 'ijj n e-mail itwasekked ɣar e-mail nni.
 zzat ma ca n e-mail nniḍen ma ad itwasekk ɣar umiḍan , ixessa ad tegged manayenni di e-mail, bac ad nessen ila qa amiḍan a inec.',
 
 # Change password dialog
 'retypenew' => 'Ɛawd arri Taguri n wadaf tamaynut:',
 
 # Edit page toolbar
-'bold_sample'     => 'Tirra tizurarin',
-'bold_tip'        => 'Tira tizurarin',
-'italic_sample'   => 'Tirra titalyanin',
-'italic_tip'      => 'Tira ifrghn.',
-'link_sample'     => 'isem n tzedayt',
-'link_tip'        => 'Tazdayt n dixl',
-'extlink_sample'  => 'http://www.example.com isem n tezdayt',
-'extlink_tip'     => 'Tazdayt n baṛṛa (qa tettud http:// prefix)',
+'bold_sample' => 'Tirra tizurarin',
+'bold_tip' => 'Tira tizurarin',
+'italic_sample' => 'Tirra titalyanin',
+'italic_tip' => 'Tira ifrghn.',
+'link_sample' => 'isem n tzedayt',
+'link_tip' => 'Tazdayt n dixl',
+'extlink_sample' => 'http://www.example.com isem n tezdayt',
+'extlink_tip' => 'Tazdayt n baṛṛa (qa tettud http:// prefix)',
 'headline_sample' => 'Aḍris n ixf-isem',
-'headline_tip'    => 'Aswir 2 n ixf-isem',
-'nowiki_sample'   => 'Sideff da tirra bla taseddast(formatting) n wiki',
-'nowiki_tip'      => 'Ur tawi x taseddast(formatting) n wiki',
-'image_tip'       => 'Afaylu war-itmesebḍi',
-'media_tip'       => 'Tazdayt ufaylu',
-'sig_tip'         => 'Azewl(signature) inec ag ukud(time) .',
-'hr_tip'          => 'Acariḍ aglawan',
+'headline_tip' => 'Aswir 2 n ixf-isem',
+'nowiki_sample' => 'Sideff da tirra bla taseddast(formatting) n wiki',
+'nowiki_tip' => 'Ur tawi x taseddast(formatting) n wiki',
+'image_tip' => 'Afaylu war-itmesebḍi',
+'media_tip' => 'Tazdayt ufaylu',
+'sig_tip' => 'Azewl(signature) inec ag ukud(time) .',
+'hr_tip' => 'Acariḍ aglawan',
 
 # Edit pages
-'summary'                    => 'Tagḍwit:',
-'subject'                    => 'Abatu/izwl:',
-'minoredit'                  => 'Ta d taẓrigt d-tamẓeyant',
-'watchthis'                  => 'Ḥḍa tasna ya',
-'savearticle'                => 'Xmml tasna',
-'preview'                    => 'Azar-ascan',
-'showpreview'                => 'Ẓar Azar-ascan',
-'showdiff'                   => 'Ẓar mayn teẓṛegd.',
-'anoneditwarning'            => "'''ɣark:''' war tudifd ca s isem inec.
+'summary' => 'Tagḍwit:',
+'subject' => 'Abatu/izwl:',
+'minoredit' => 'Ta d taẓrigt d-tamẓeyant',
+'watchthis' => 'Ḥḍa tasna ya',
+'savearticle' => 'Xmml tasna',
+'preview' => 'Azar-ascan',
+'showpreview' => 'Ẓar Azar-ascan',
+'showdiff' => 'Ẓar mayn teẓṛegd.',
+'anoneditwarning' => "'''ɣark:''' war tudifd ca s isem inec.
 Tansa n IP inac ad-teqqim deg umezruy n teẓṛigin n Tasna ya .",
-'summary-preview'            => 'Azar-ascan n Tegḍwit:',
-'blockedtext'                => "'''Isem useqdac niɣ tansa IP inecc tewabluca  .'''
+'summary-preview' => 'Azar-ascan n Tegḍwit:',
+'blockedtext' => "'''Isem useqdac niɣ tansa IP inecc tewabluca  .'''
 
 iblocat  $1.
 Maynzi ''$2''.
@@ -246,51 +246,51 @@ Tzemred ad temsawaded ag $1 niɣ [[{{MediaWiki:Grouppage-sysop}}|administrator]]
 war tzemred ca ad ad tesxedmed 'e-mail this user' ɣar mala ca n e-mail illa ɣark di [[Special:Preferences|Isemyifiyen n umiḍan]] u war twabluki ca usexdem ines.
 Tansa IP inecc n ruxa d $3, u ID icecc iteblukan d #$5.
 maṛṛa manaya deg ujenna eggit di tabrat i ɣ-ad tsekked.",
-'newarticle'                 => '(Amaynu)',
-'newarticletext'             => "Tdefar-d tazdayt n Tasna εad war telli .
+'newarticle' => '(Amaynu)',
+'newarticletext' => "Tdefar-d tazdayt n Tasna εad war telli .
 bac ad tegged , arri di taflwit a swadday (xemm i [[{{MediaWiki:Helppage}}| Tasna n Tallalt]] i ineɣmisen ifruryen).
 mala qacek da s ɣalaṭ waha, tecca di tbutunt n '''deffar''' di (browser) inec .",
-'noarticletext'              => 'Rxxu ur din llint ca tira di tasna ya.
+'noarticletext' => 'Rxxu ur din llint ca tira di tasna ya.
 Tzmmard [[Special:Search/{{PAGENAME}}|rzu xf yizwl n tasna ya]] di tasniwin nnḍni,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
 nigh [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.',
-'previewnote'                => "'''Wa d Azar-ascan waha;
+'previewnote' => "'''Wa d Azar-ascan waha;
 tiẓṛigin εad war twaḥḍent!'''",
-'editing'                    => 'Aẓṛag di $1',
-'editingsection'             => 'Aẓrag  di $1 (tigezmi)',
-'copyrightwarning'           => "Maṛṛa tirra di {{SITENAME}} twaggent swadday i $2 (ẓar da $1).
+'editing' => 'Aẓṛag di $1',
+'editingsection' => 'Aẓrag  di $1 (tigezmi)',
+'copyrightwarning' => "Maṛṛa tirra di {{SITENAME}} twaggent swadday i $2 (ẓar da $1).
 mala war texsed tirra inac ad twaẓṛegent , ad twamsebḍant .
 Ur ten-teg ca da.<br />
 tjadjid-anɣ Ɛawt ila qa d cekk ig yuran manaya, niɣ tesneɣlet-id zi ca n uɣbal nniḍn d alelli.
 '''UR SADDAF CA TIRRA ƔARSENT COPYRIGHTE BLA MA AD-IXES BAB-INES !'''",
-'templatesused'              => 'Timudmiwin itwaggen di Tasna ya:',
-'templatesusedpreview'       => 'Timudmiwin igg itwasxdemen dg uzar-ascan a :',
-'template-protected'         => '(twaḥḍa)',
-'template-semiprotected'     => '(semi-protected)',
-'nocreatetext'               => '{{SITENAME}} war iqqim ca itejja iwdan ad ggen Tasniwin timaynutin.
+'templatesused' => 'Timudmiwin itwaggen di Tasna ya:',
+'templatesusedpreview' => 'Timudmiwin igg itwasxdemen dg uzar-ascan a :',
+'template-protected' => '(twaḥḍa)',
+'template-semiprotected' => '(semi-protected)',
+'nocreatetext' => '{{SITENAME}} war iqqim ca itejja iwdan ad ggen Tasniwin timaynutin.
 tzemred addewred ɣar deffar, niɣ [[Special:UserLogin|Adeff niɣ egg amiḍan]].',
 'recreate-moveddeleted-warn' => "'''Ɣark: qac tegged Tasna ig itwaksen zzat uya.'''
 
 Ẓar aɣmis n umzruy n usfad n Tasna ya bac ad tsenad ma mliḥ ad tkemled aẓṛag.",
 
 # History pages
-'viewpagelogs'           => 'Ẓar aɣmis n Tasna ya',
-'currentrev'             => 'Afegged n ruxa',
-'revisionasof'           => 'Affegged am $1',
-'revision-info'          => 'Afegged am $1 s $2',
-'previousrevision'       => '←Affegged n zik/zic',
-'nextrevision'           => 'Afegged d amaynu→',
-'currentrevisionlink'    => 'Afegged n rux',
-'cur'                    => '',
-'last'                   => 'anggaru',
-'page_first'             => 'amzwaru',
-'page_last'              => 'anggaru',
-'histlegend'             => 'imṣebḍiyen: Sti(ixter) tibuttonin a ɣar wadday n tunɣilin n Tasna bac ad tsmzazal(compare).<br />
+'viewpagelogs' => 'Ẓar aɣmis n Tasna ya',
+'currentrev' => 'Afegged n ruxa',
+'revisionasof' => 'Affegged am $1',
+'revision-info' => 'Afegged am $1 s $2',
+'previousrevision' => '←Affegged n zik/zic',
+'nextrevision' => 'Afegged d amaynu→',
+'currentrevisionlink' => 'Afegged n rux',
+'cur' => '',
+'last' => 'anggaru',
+'page_first' => 'amzwaru',
+'page_last' => 'anggaru',
+'histlegend' => 'imṣebḍiyen: Sti(ixter) tibuttonin a ɣar wadday n tunɣilin n Tasna bac ad tsmzazal(compare).<br />
 Tasarut: (cur) = imṣebḍiyen ag tunɣilt n ruxa,
 (last) = imṣebḍiyen ag tunɣilt n zik, M = taẓrigt d-tamẓeyant.',
 'history-fieldset-title' => 'Amzruy n min tẓṛid',
-'histfirst'              => 'Amzwaru n marra',
-'histlast'               => 'Anggaru n marra',
+'histfirst' => 'Amzwaru n marra',
+'histlast' => 'Anggaru n marra',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 ɣar $2',
@@ -299,41 +299,40 @@ Tasarut: (cur) = imṣebḍiyen ag tunɣilt n ruxa,
 'rev-delundel' => 'sken/ffer',
 
 # Diffs
-'history-title'           => 'Amezruy n ufegged n "$1"',
-'difference'              => '(Amsebḍi jar ifeggiden)',
-'lineno'                  => 'Tabrit $1:',
+'history-title' => 'Amezruy n ufegged n "$1"',
+'lineno' => 'Tabrit $1:',
 'compareselectedversions' => 'Smequdda tunɣilin a',
-'editundo'                => 'kkes min ggigh',
-'diff-multi'              => '({{PLURAL:$1|ijj n ufegged|$1 ifeggiden}} war ad twamlen ca.)',
+'editundo' => 'kkes min ggigh',
+'diff-multi' => '({{PLURAL:$1|ijj n ufegged|$1 ifeggiden}} war ad twamlen ca.)',
 
 # Search results
-'searchresults'             => 'Tifellawin n tarezzut',
-'searchresults-title'       => 'Tifellawin n tarezzut xef "$1"',
-'searchsubtitle'            => 'Trezzud xef \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|marra tasniwin issentan s "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|marra tasniwin iteqqnen ghar "$1"]])',
-'prevn'                     => 'Amzray {{PLURAL:$1|$1}}',
-'nextn'                     => 'wn d-itasn {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Ẓeṛ ($1 {{int:pipe-separator}} $2) ($3)',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 tawalt|$2 tiwalin}})',
-'search-suggest'            => 'Ttugha txsd a tinid: $1',
-'search-interwiki-caption'  => 'Awmatn n usnfar',
-'search-interwiki-more'     => '(ujar)',
-'search-mwsuggest-enabled'  => 's isumuren',
+'searchresults' => 'Tifellawin n tarezzut',
+'searchresults-title' => 'Tifellawin n tarezzut xef "$1"',
+'searchsubtitle' => 'Trezzud xef \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|marra tasniwin issentan s "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|marra tasniwin iteqqnen ghar "$1"]])',
+'prevn' => 'Amzray {{PLURAL:$1|$1}}',
+'nextn' => 'wn d-itasn {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Ẓeṛ ($1 {{int:pipe-separator}} $2) ($3)',
+'search-result-size' => '$1 ({{PLURAL:$2|1 tawalt|$2 tiwalin}})',
+'search-suggest' => 'Ttugha txsd a tinid: $1',
+'search-interwiki-caption' => 'Awmatn n usnfar',
+'search-interwiki-more' => '(ujar)',
+'search-mwsuggest-enabled' => 's isumuren',
 'search-mwsuggest-disabled' => 'walu isumuren',
-'searchall'                 => 'maṛṛa',
-'powersearch'               => 'Tarzzut tanmhazt',
-'powersearch-legend'        => 'Tarzzut tanmhazt',
+'searchall' => 'maṛṛa',
+'powersearch' => 'Tarzzut tanmhazt',
+'powersearch-legend' => 'Tarzzut tanmhazt',
 
 # Preferences page
-'preferences'         => 'Ismyifiyn',
-'mypreferences'       => 'Isemyifiyen inu',
-'searchresultshead'   => 'Tarzzut',
-'yourrealname'        => 'isem n deṣṣaḥ :',
+'preferences' => 'Ismyifiyn',
+'mypreferences' => 'Isemyifiyen inu',
+'searchresultshead' => 'Tarzzut',
+'yourrealname' => 'isem n deṣṣaḥ :',
 'prefs-help-realname' => 'isem inec n deṣṣaḥ mala txesad waha .
 mala tucit-id, ataf Lxdant inec a tetwassan ila inec.',
 
 # Groups
 'group-sysop' => 'Indbaln',
-'group-all'   => '(maṛṛa)',
+'group-all' => '(maṛṛa)',
 
 'grouppage-sysop' => '{{ns:project}}:inedbalen',
 
@@ -341,64 +340,64 @@ mala tucit-id, ataf Lxdant inec a tetwassan ila inec.',
 'rightslog' => 'Aghmis n talghut n izrfan n usqdac',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|tiẓṛegt|tiẓṛigin}}',
-'recentchanges'                  => 'Tiẓṛigin tinggura',
+'nchanges' => '$1 {{PLURAL:$1|tiẓṛegt|tiẓṛigin}}',
+'recentchanges' => 'Tiẓṛigin tinggura',
 'recentchanges-feed-description' => 'Bbar tiẓṛigin timayutin n wiki deg usudem(feed) a .',
-'rcnote'                         => "Awadday {{PLURAL:$1|d '''1''' taẓṛigt|d '''$1''' tiẓṛigin tinggura}} deg {{PLURAL:$2|ass anggaru |'''$2''' ussan inggura}}, am di $5, $4.",
-'rcnotefrom'                     => "ɣar wadday d tiẓṛigin zi '''$2''' (ar '''$1''' ).",
-'rclistfrom'                     => 'Ẓar tiẓṛigin timaynutin ig ibeddan zi $1',
-'rcshowhideminor'                => '$1 tiẓṛigin d-timeẓyanin',
-'rcshowhidebots'                 => '$1 iroboten(robots)',
-'rcshowhideliu'                  => '$1 users ig yudeffen',
-'rcshowhideanons'                => '$1 users war twasnen',
-'rcshowhidepatr'                 => 'Tiẓṛigin ig itwaẓrent di $1',
-'rcshowhidemine'                 => '$1 tiẓṛigin inu',
-'rclinks'                        => 'Ẓar $1 tiẓṛigin tinggura di $2 n ussan inggura <br />$3',
-'diff'                           => 'imṣebḍan',
-'hist'                           => 'Amezruy',
-'hide'                           => 'Snuffar',
-'show'                           => 'smmel-ad',
-'minoreditletter'                => 'm',
-'newpageletter'                  => 'N',
-'boteditletter'                  => 'b',
+'rcnote' => "Awadday {{PLURAL:$1|d '''1''' taẓṛigt|d '''$1''' tiẓṛigin tinggura}} deg {{PLURAL:$2|ass anggaru |'''$2''' ussan inggura}}, am di $5, $4.",
+'rcnotefrom' => "ɣar wadday d tiẓṛigin zi '''$2''' (ar '''$1''' ).",
+'rclistfrom' => 'Ẓar tiẓṛigin timaynutin ig ibeddan zi $1',
+'rcshowhideminor' => '$1 tiẓṛigin d-timeẓyanin',
+'rcshowhidebots' => '$1 iroboten(robots)',
+'rcshowhideliu' => '$1 users ig yudeffen',
+'rcshowhideanons' => '$1 users war twasnen',
+'rcshowhidepatr' => 'Tiẓṛigin ig itwaẓrent di $1',
+'rcshowhidemine' => '$1 tiẓṛigin inu',
+'rclinks' => 'Ẓar $1 tiẓṛigin tinggura di $2 n ussan inggura <br />$3',
+'diff' => 'imṣebḍan',
+'hist' => 'Amezruy',
+'hide' => 'Snuffar',
+'show' => 'smmel-ad',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'          => 'Isenfilen i yudsen wa',
-'recentchangeslinked-feed'     => 'Tiẓṛigin ag ta',
-'recentchangeslinked-toolbox'  => 'Tiẓṛigin ag ta',
-'recentchangeslinked-title'    => 'Tiẓṛigin ssaɣant-id ɣar "$1"',
+'recentchangeslinked' => 'Isenfilen i yudsen wa',
+'recentchangeslinked-feed' => 'Tiẓṛigin ag ta',
+'recentchangeslinked-toolbox' => 'Tiẓṛigin ag ta',
+'recentchangeslinked-title' => 'Tiẓṛigin ssaɣant-id ɣar "$1"',
 'recentchangeslinked-noresult' => 'War llint ca n tiẓṛigin di Tasna ya di lwaqt id-tucid .',
-'recentchangeslinked-summary'  => "Ta d tabdart n isnfiln itwaggn drus zggwami di tasniwin id-iqqnen zg ict tasna nniḍn (nigh iqqnen ghar iwdan zi ca n taggayt).
+'recentchangeslinked-summary' => "Ta d tabdart n isnfiln itwaggn drus zggwami di tasniwin id-iqqnen zg ict tasna nniḍn (nigh iqqnen ghar iwdan zi ca n taggayt).
 Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
-'recentchangeslinked-page'     => 'Izwl n tasna:',
+'recentchangeslinked-page' => 'Izwl n tasna:',
 
 # Upload
-'upload'            => 'Zdem-d asatul',
-'uploadbtn'         => 'Zdem-d afaylu',
-'uploadlogpage'     => 'Zdem-d aɣmis',
-'filedesc'          => 'Asgbr',
+'upload' => 'Zdem-d asatul',
+'uploadbtn' => 'Zdem-d afaylu',
+'uploadlogpage' => 'Zdem-d aɣmis',
+'filedesc' => 'Asgbr',
 'fileuploadsummary' => 'Asgbr:',
-'uploadedimage'     => 'itwazdem-d "[[$1]]"',
-'watchthisupload'   => 'Xm tasbtirt a',
+'uploadedimage' => 'itwazdem-d "[[$1]]"',
+'watchthisupload' => 'Xm tasbtirt a',
 
 # Special:ListFiles
 'listfiles' => 'Tabdart n ifayluten',
 
 # File description page
-'file-anchor-link'          => 'Afaylu',
-'filehist'                  => 'Amzruy n usatul',
-'filehist-help'             => 'Tka di date/time bac ad tẓerd afaylu mamec ja d-itban di Lwaqt a .',
-'filehist-deleteone'        => 'sfaḍ',
-'filehist-current'          => 'aturaw',
-'filehist-datetime'         => 'Azmz/Akud',
-'filehist-user'             => 'Aseqdac',
-'filehist-dimensions'       => 'Tisektiwin',
-'filehist-filesize'         => 'Tiddi n ufaylu',
-'filehist-comment'          => 'Tinit',
-'imagelinks'                => 'Iwurn n usdaw',
-'linkstoimage'              => '{{PLURAL:$1|Tasna ya teqn-ad|$1 Tasniwin a qnent-id}} ɣa ufaylu ya :',
-'nolinkstoimage'            => 'war telli ca n Tasna teqqen-d ɣa ufaylu ya.',
-'sharedupload'              => 'Wa d ijj ufaylu itwacrec jar aṭṭas n isenfaren(projects).',
+'file-anchor-link' => 'Afaylu',
+'filehist' => 'Amzruy n usatul',
+'filehist-help' => 'Tka di date/time bac ad tẓerd afaylu mamec ja d-itban di Lwaqt a .',
+'filehist-deleteone' => 'sfaḍ',
+'filehist-current' => 'aturaw',
+'filehist-datetime' => 'Azmz/Akud',
+'filehist-user' => 'Aseqdac',
+'filehist-dimensions' => 'Tisektiwin',
+'filehist-filesize' => 'Tiddi n ufaylu',
+'filehist-comment' => 'Tinit',
+'imagelinks' => 'Iwurn n usdaw',
+'linkstoimage' => '{{PLURAL:$1|Tasna ya teqn-ad|$1 Tasniwin a qnent-id}} ɣa ufaylu ya :',
+'nolinkstoimage' => 'war telli ca n Tasna teqqen-d ɣa ufaylu ya.',
+'sharedupload' => 'Wa d ijj ufaylu itwacrec jar aṭṭas n isenfaren(projects).',
 'uploadnewversion-linktext' => 'Zdem-d tunɣilt d-tamaynut n ufaylu a',
 
 # File deletion
@@ -426,64 +425,64 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
 
 'doubleredirects' => '(redirects) ɛɛawdent',
 
-'brokenredirects'        => '(redirects) arẓent',
-'brokenredirects-edit'   => 'arri',
+'brokenredirects' => '(redirects) arẓent',
+'brokenredirects-edit' => 'arri',
 'brokenredirects-delete' => 'sfaḍ',
 
-'withoutinterwiki'        => 'Tasna bla tiẓdayin n tutlayt',
+'withoutinterwiki' => 'Tasna bla tiẓdayin n tutlayt',
 'withoutinterwiki-submit' => 'Smmrad',
 
 'fewestrevisions' => 'Tasniwin s cwayt n ifeggiden',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|atamḍan|itamḍanen}}',
-'nlinks'                  => '$1 {{PLURAL:$1|Tazdayt|Tizdayin}}',
-'nmembers'                => '$1 {{PLURAL:$1|amaslad|imasladen}}',
-'lonelypages'             => 'Tasniwin tigujilin',
-'uncategorizedpages'      => 'Tasniwin bla taggayt',
+'nbytes' => '$1 {{PLURAL:$1|atamḍan|itamḍanen}}',
+'nlinks' => '$1 {{PLURAL:$1|Tazdayt|Tizdayin}}',
+'nmembers' => '$1 {{PLURAL:$1|amaslad|imasladen}}',
+'lonelypages' => 'Tasniwin tigujilin',
+'uncategorizedpages' => 'Tasniwin bla taggayt',
 'uncategorizedcategories' => 'Taggayin bla taggayt',
-'uncategorizedimages'     => 'ifayluten bla taggayt',
-'uncategorizedtemplates'  => 'Timudmiwin bla taggayt',
-'unusedcategories'        => 'Taggayin war twasxedment ca',
-'unusedimages'            => 'ifayluten war twasxedmen',
-'wantedcategories'        => 'Taggayin twaxsent',
-'wantedpages'             => 'Tasniwin tewaxsent aṭṭas',
-'mostlinked'              => 'Tasniwin iɣar-d-tewaqqenen aṭṭas',
-'mostlinkedcategories'    => 'Taggayin iɣar-d tewaqqenen aṭṭas',
-'mostlinkedtemplates'     => 'Timudmiwin iɣar-d tewaqqenen aṭṭas',
-'mostcategories'          => 'Tasna iɣar llan taggayin aṭṭas',
-'mostimages'              => 'ifayluten iɣar-d tewaqqenen aṭṭas',
-'mostrevisions'           => 'Tasna iɣa illa aṭṭas qaɛ n ifeggiden',
-'prefixindex'             => 'Afran s usekkil amẓwaru',
-'shortpages'              => 'Tasniwin d-tiquḍaḍin',
-'longpages'               => 'Tasniwin d-tizirarin',
-'deadendpages'            => 'Tasniwin s tizdayin mmutent',
-'protectedpages'          => 'Tasniwin ẓarqent',
-'listusers'               => 'Tabdart n iseqdacen',
-'newpages'                => 'Tasniwin timaynutin',
-'ancientpages'            => 'Tasniwin n zik qqaε',
-'move'                    => 'Smutti',
-'movethispage'            => 'Smutti tasna ya',
-'pager-newer-n'           => '{{PLURAL:$1|amynu 1|amynu $1}}',
-'pager-older-n'           => '{{PLURAL:$1|aqbur 1|aqbur $1}}',
+'uncategorizedimages' => 'ifayluten bla taggayt',
+'uncategorizedtemplates' => 'Timudmiwin bla taggayt',
+'unusedcategories' => 'Taggayin war twasxedment ca',
+'unusedimages' => 'ifayluten war twasxedmen',
+'wantedcategories' => 'Taggayin twaxsent',
+'wantedpages' => 'Tasniwin tewaxsent aṭṭas',
+'mostlinked' => 'Tasniwin iɣar-d-tewaqqenen aṭṭas',
+'mostlinkedcategories' => 'Taggayin iɣar-d tewaqqenen aṭṭas',
+'mostlinkedtemplates' => 'Timudmiwin iɣar-d tewaqqenen aṭṭas',
+'mostcategories' => 'Tasna iɣar llan taggayin aṭṭas',
+'mostimages' => 'ifayluten iɣar-d tewaqqenen aṭṭas',
+'mostrevisions' => 'Tasna iɣa illa aṭṭas qaɛ n ifeggiden',
+'prefixindex' => 'Afran s usekkil amẓwaru',
+'shortpages' => 'Tasniwin d-tiquḍaḍin',
+'longpages' => 'Tasniwin d-tizirarin',
+'deadendpages' => 'Tasniwin s tizdayin mmutent',
+'protectedpages' => 'Tasniwin ẓarqent',
+'listusers' => 'Tabdart n iseqdacen',
+'newpages' => 'Tasniwin timaynutin',
+'ancientpages' => 'Tasniwin n zik qqaε',
+'move' => 'Smutti',
+'movethispage' => 'Smutti tasna ya',
+'pager-newer-n' => '{{PLURAL:$1|amynu 1|amynu $1}}',
+'pager-older-n' => '{{PLURAL:$1|aqbur 1|aqbur $1}}',
 
 # Book sources
-'booksources'    => 'Ighbula n udlis',
+'booksources' => 'Ighbula n udlis',
 'booksources-go' => 'Uyur',
 
 # Special:Log
-'specialloguserlabel'  => 'Aseqdac:',
+'specialloguserlabel' => 'Aseqdac:',
 'speciallogtitlelabel' => 'isem:',
-'log'                  => 'Aɣmis',
-'all-logs-page'        => 'Maṛṛa iɣmisen',
+'log' => 'Aɣmis',
+'all-logs-page' => 'Maṛṛa iɣmisen',
 
 # Special:AllPages
-'allpages'       => 'Marra tasniwin',
+'allpages' => 'Marra tasniwin',
 'alphaindexline' => '$1 ɣa $2',
-'nextpage'       => 'Tasna zzat ($1)',
-'prevpage'       => 'Tasna zzat ($1)',
-'allpagesfrom'   => 'Scan-d Tasniwin beddant zi:',
-'allarticles'    => 'Marra tasniwin',
+'nextpage' => 'Tasna zzat ($1)',
+'prevpage' => 'Tasna zzat ($1)',
+'allpagesfrom' => 'Scan-d Tasniwin beddant zi:',
+'allarticles' => 'Marra tasniwin',
 'allpagessubmit' => 'Uyur',
 'allpagesprefix' => 'Ẓar Tasniwin s usekkil amzwaru:',
 
@@ -500,117 +499,117 @@ Tasniwin di [[Special:Watchlist|your watchlist]] d '''tizurarin'''.",
 'emailuser' => 'Ssek E-mail i bnadm a',
 
 # Watchlist
-'watchlist'         => 'Tabdart uḥṭṭu inu',
-'mywatchlist'       => 'Tabdart uḥṭṭu inu',
-'addedwatchtext'    => 'Tasna "[[:$1]]" Temmarni ɣar [[Special:Watchlist|Tabdart uḥṭṭu]].',
-'removedwatchtext'  => 'Tasna "[[:$1]]" twakkes zi [[Special:Watchlist|Tabdart uḥṭṭu inec]].',
-'watch'             => 'Ḥḍa',
-'watchthispage'     => 'Ḥḍa tasna ya',
-'unwatch'           => 'Ur ḥṭṭa',
+'watchlist' => 'Tabdart uḥṭṭu inu',
+'mywatchlist' => 'Tabdart uḥṭṭu inu',
+'addedwatchtext' => 'Tasna "[[:$1]]" Temmarni ɣar [[Special:Watchlist|Tabdart uḥṭṭu]].',
+'removedwatchtext' => 'Tasna "[[:$1]]" twakkes zi [[Special:Watchlist|Tabdart uḥṭṭu inec]].',
+'watch' => 'Ḥḍa',
+'watchthispage' => 'Ḥḍa tasna ya',
+'unwatch' => 'Ur ḥṭṭa',
 'watchlist-details' => '{{PLURAL:$1|$1 n Tasniwin|$1 n Tasniwin}} Twaẓrent bla Tasniwin n usiwl.',
-'wlshowlast'        => 'Sseml-ad $1 tisεεatin $2 ussan $3 inggura',
+'wlshowlast' => 'Sseml-ad $1 tisεεatin $2 ussan $3 inggura',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Ḥṭṭigh...',
+'watching' => 'Ḥṭṭigh...',
 'unwatching' => 'Ur ḥṭṭigh...',
 
 # Delete
-'deletepage'            => 'Kks tasna',
-'delete-legend'         => 'Sfaḍ',
-'historywarning'        => 'ɣark: Tasna i txisd atekesd ɣars amzruy :',
-'confirmdeletetext'     => 'Ur d ac iqqim walu a tsfḍed ict tasna ak marra amzruy nns.
+'deletepage' => 'Kks tasna',
+'delete-legend' => 'Sfaḍ',
+'historywarning' => 'ɣark: Tasna i txisd atekesd ɣars amzruy :',
+'confirmdeletetext' => 'Ur d ac iqqim walu a tsfḍed ict tasna ak marra amzruy nns.
 Ma nican txsd a tggd manaya? Ma tssnd min ttggd? Ma ttggd manaya amc teqqaṛ  [[{{MediaWiki:Policy-url}}|tasrtit n Wiki]] ?',
-'actioncomplete'        => 'Tiggawt tsala',
-'deletedtext'           => '"$1" Twakkes.
+'actioncomplete' => 'Tiggawt tsala',
+'deletedtext' => '"$1" Twakkes.
 Xemm $2 i tikkas timaynutin.',
-'dellogpage'            => 'Aɣmis n uṣfaḍ',
-'deletecomment'         => 'Ssebba:',
-'deleteotherreason'     => 'Ca n ssebba nniḍn:',
+'dellogpage' => 'Aɣmis n uṣfaḍ',
+'deletecomment' => 'Ssebba:',
+'deleteotherreason' => 'Ca n ssebba nniḍn:',
 'deletereasonotherlist' => 'Ssebba nniḍn',
 
 # Rollback
 'rollbacklink' => 'Sdwl ghar dffar',
 
 # Protect
-'protectlogpage'              => 'Aghmis n umstn',
-'prot_1movedto2'              => '[[$1]] twaneql ɣa [[$2]]',
-'protectcomment'              => 'Ssebba:',
-'protectexpiry'               => 'Itsala:',
-'protect_expiry_invalid'      => 'Akud n usali ur illi nican.',
-'protect_expiry_old'          => 'Akud usali izri, idwl d amzruy.',
-'protect-text'                => "tzemred ad teẓṛed u atbedeld aswir n uḥeṭṭu n Tasna ya da '''$1'''.",
-'protect-locked-access'       => "Amiḍan inecc war ɣars turagt bac ad ibeddel aswir n uḥeṭṭu n Tasna .
+'protectlogpage' => 'Aghmis n umstn',
+'prot_1movedto2' => '[[$1]] twaneql ɣa [[$2]]',
+'protectcomment' => 'Ssebba:',
+'protectexpiry' => 'Itsala:',
+'protect_expiry_invalid' => 'Akud n usali ur illi nican.',
+'protect_expiry_old' => 'Akud usali izri, idwl d amzruy.',
+'protect-text' => "tzemred ad teẓṛed u atbedeld aswir n uḥeṭṭu n Tasna ya da '''$1'''.",
+'protect-locked-access' => "Amiḍan inecc war ɣars turagt bac ad ibeddel aswir n uḥeṭṭu n Tasna .
 Aqa (settings) n Tasna '''$1''':",
-'protect-cascadeon'           => 'Tasna ya tẓarq ruxa mayenzi tudef di {{PLURAL:$1|Tasna, iɣa illa|Tasniwin, iɣa illa}} aḥeṭṭu n usmuzzar(cascading protection).
+'protect-cascadeon' => 'Tasna ya tẓarq ruxa mayenzi tudef di {{PLURAL:$1|Tasna, iɣa illa|Tasniwin, iɣa illa}} aḥeṭṭu n usmuzzar(cascading protection).
 Tezemred ad tbedeld aswir n uḥeṭṭu n Tasna ya, maca war itegg walu i uḥeṭṭu n usmuzzar(cascading protection).',
-'protect-default'             => 'Ejj marra isqdacn.',
-'protect-fallback'            => 'itxessat turagt n "$1"',
+'protect-default' => 'Ejj marra isqdacn.',
+'protect-fallback' => 'itxessat turagt n "$1"',
 'protect-level-autoconfirmed' => 'Bluka iseqdacen war ɣasen ca amiḍan',
-'protect-level-sysop'         => 'inedbalen waha',
-'protect-summary-cascade'     => 'Asmuzzar',
-'protect-expiring'            => 'itsala deg $1 (UTC)',
-'protect-cascade'             => 'Ḥḍa Tasniwin i yudfen di Tasna ya (cascading protection)',
-'protect-cantedit'            => 'war tezemred ca ad tbedeld iswiren n uḥeṭṭu n Tasna ya, mayenzi war ɣark turagt bac ad tẓṛegd.',
-'protect-expiry-options'      => '2 tasεεat:2 hours,1 ass:1 day,3 ussan:3 days,1 amalass:1 week,2 imallasen:2 weeks,1 ayur:1 month,3 iyuren:3 months,6 iyuren:6 months,1 asggas:1 year,infinite:infinite',
-'restriction-type'            => 'Turagt:',
-'restriction-level'           => 'Aswir uskref:',
+'protect-level-sysop' => 'inedbalen waha',
+'protect-summary-cascade' => 'Asmuzzar',
+'protect-expiring' => 'itsala deg $1 (UTC)',
+'protect-cascade' => 'Ḥḍa Tasniwin i yudfen di Tasna ya (cascading protection)',
+'protect-cantedit' => 'war tezemred ca ad tbedeld iswiren n uḥeṭṭu n Tasna ya, mayenzi war ɣark turagt bac ad tẓṛegd.',
+'protect-expiry-options' => '2 tasεεat:2 hours,1 ass:1 day,3 ussan:3 days,1 amalass:1 week,2 imallasen:2 weeks,1 ayur:1 month,3 iyuren:3 months,6 iyuren:6 months,1 asggas:1 year,infinite:infinite',
+'restriction-type' => 'Turagt:',
+'restriction-level' => 'Aswir uskref:',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Arri',
 
 # Undelete
-'undeletebtn'            => 'Ar-ad',
+'undeletebtn' => 'Ar-ad',
 'undelete-search-submit' => 'Tarzzut',
 
 # Namespace form on various pages
-'namespace'      => 'Tallunt-izwel:',
-'invert'         => 'Dren mayn testid (tixtard)',
+'namespace' => 'Tallunt-izwel:',
+'invert' => 'Dren mayn testid (tixtard)',
 'blanknamespace' => '(Amezwaru)',
 
 # Contributions
 'contributions' => 'Tiggawin n useqdac',
-'mycontris'     => 'Tiggawin inu',
-'contribsub2'   => 'i $1 ($2)',
-'uctop'         => '(snnj)',
-'month'         => 'Zg wayur (d zik):',
-'year'          => 'Zg usggwas (d zik):',
+'mycontris' => 'Tiggawin inu',
+'contribsub2' => 'i $1 ($2)',
+'uctop' => '(snnj)',
+'month' => 'Zg wayur (d zik):',
+'year' => 'Zg usggwas (d zik):',
 
-'sp-contributions-newbies'     => 'Ẓar Tabdart n tiggawin n useqdac a deg umiḍan amaynu waha',
+'sp-contributions-newbies' => 'Ẓar Tabdart n tiggawin n useqdac a deg umiḍan amaynu waha',
 'sp-contributions-newbies-sub' => 'i imiḍan imaynuten',
-'sp-contributions-blocklog'    => 'sbdd tabdart n talghut',
-'sp-contributions-talk'        => 'Awal',
-'sp-contributions-search'      => 'Arzu x tiggawin',
-'sp-contributions-username'    => 'Tansa IP d isem useqdac:',
-'sp-contributions-submit'      => 'Tarzzut',
+'sp-contributions-blocklog' => 'sbdd tabdart n talghut',
+'sp-contributions-talk' => 'Awal',
+'sp-contributions-search' => 'Arzu x tiggawin',
+'sp-contributions-username' => 'Tansa IP d isem useqdac:',
+'sp-contributions-submit' => 'Tarzzut',
 
 # What links here
-'whatlinkshere'           => 'Min iteqqnen ghar da',
-'whatlinkshere-title'     => 'Tasniwin id-izedyen ɣar "$1"',
-'whatlinkshere-page'      => 'Tasna:',
-'linkshere'               => "Tasna ya tzedi ɣa '''[[:$1]]''':",
-'nolinkshere'             => "war tlli ca n Tasna tqqen-d da '''[[:$1]]'''.",
-'isredirect'              => 'Tasna n (redirect)',
-'istemplate'              => 'Asidef',
-'isimage'                 => 'amaqqan n tugna',
-'whatlinkshere-prev'      => '{{PLURAL:$1|deffar|deffar $1}}',
-'whatlinkshere-next'      => '{{PLURAL:$1|zzat|zzat $1}}',
-'whatlinkshere-links'     => '← tizdayin',
+'whatlinkshere' => 'Min iteqqnen ghar da',
+'whatlinkshere-title' => 'Tasniwin id-izedyen ɣar "$1"',
+'whatlinkshere-page' => 'Tasna:',
+'linkshere' => "Tasna ya tzedi ɣa '''[[:$1]]''':",
+'nolinkshere' => "war tlli ca n Tasna tqqen-d da '''[[:$1]]'''.",
+'isredirect' => 'Tasna n (redirect)',
+'istemplate' => 'Asidef',
+'isimage' => 'amaqqan n tugna',
+'whatlinkshere-prev' => '{{PLURAL:$1|deffar|deffar $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|zzat|zzat $1}}',
+'whatlinkshere-links' => '← tizdayin',
 'whatlinkshere-hidelinks' => '$1 timqqan',
 
 # Block/unblock
-'blockip'                  => 'Sbdd asqdac a',
-'ipboptions'               => '2 n timirin:2 hours,1 n wass:1 day,3 n wussan:3 days,1 imalass:1 week,2 imallassn:2 weeks,1 wayur:1 month,3 wayurn:3 months,6 wayurn:6 months,1 asggwas:1 year,tartalla:infinite',
-'ipblocklist'              => 'Tabdart n tansiwin IP d isemawen n iseqdacen ig iteblukan',
-'ipblocklist-submit'       => 'Tarzzut',
-'blocklink'                => 'Sbedd',
-'unblocklink'              => 'Ṛẓem',
-'contribslink'             => 'Tiggawin',
-'blocklogpage'             => 'Ẓareqq aɣmis',
-'blocklogentry'            => 'ibloka [[$1]] ar $2 $3',
+'blockip' => 'Sbdd asqdac a',
+'ipboptions' => '2 n timirin:2 hours,1 n wass:1 day,3 n wussan:3 days,1 imalass:1 week,2 imallassn:2 weeks,1 wayur:1 month,3 wayurn:3 months,6 wayurn:6 months,1 asggwas:1 year,tartalla:infinite',
+'ipblocklist' => 'Tabdart n tansiwin IP d isemawen n iseqdacen ig iteblukan',
+'ipblocklist-submit' => 'Tarzzut',
+'blocklink' => 'Sbedd',
+'unblocklink' => 'Ṛẓem',
+'contribslink' => 'Tiggawin',
+'blocklogpage' => 'Ẓareqq aɣmis',
+'blocklogentry' => 'ibloka [[$1]] ar $2 $3',
 'block-log-flags-nocreate' => 'timggit n imiḍanen imaynutn ttwasbdd',
 
 # Move page
-'movepagetext'     => "mala tesxedmed taseddast(form) a swadday, ad tessenaqled maṛṛa amzruy ines ɣar isem amaynu.
+'movepagetext' => "mala tesxedmed taseddast(form) a swadday, ad tessenaqled maṛṛa amzruy ines ɣar isem amaynu.
 isem aqbur ad idwel d Tasna n (redirect) ɣar isem amaynu .
 tzemred ad tebedled (redirects) bac ad qnent ɣar isem amezwaru s ufus.
 mala war texsed ca, ẓar [[Special:DoubleRedirects|double]] niɣ [[Special:BrokenRedirects|broken redirects]].
@@ -626,21 +625,21 @@ manaya itebeddal Tasniwin, ixessa ad tesned mliḥ man tegged zzat ma ad tkemled
 *Mala war tixtard tabelludt a swadday.
 
 mala amya, itxessa cekk ad tesnaqled s ufus mala txisd.",
-'movearticle'      => 'Smutti tasna:',
-'newtitle'         => 'Ghar yizwl amaynu:',
-'move-watch'       => 'Ẓar Tasna ya',
-'movepagebtn'      => 'Snaqel Tasna',
-'pagemovedsub'     => 'Asmutti itwagg',
-'movepage-moved'   => '\'\'\'"$1" twanql ɣar "$2"\'\'\'',
-'articleexists'    => 'Tasna s isem a tella da, niɣ isem itucid war icni.
+'movearticle' => 'Smutti tasna:',
+'newtitle' => 'Ghar yizwl amaynu:',
+'move-watch' => 'Ẓar Tasna ya',
+'movepagebtn' => 'Snaqel Tasna',
+'pagemovedsub' => 'Asmutti itwagg',
+'movepage-moved' => '\'\'\'"$1" twanql ɣar "$2"\'\'\'',
+'articleexists' => 'Tasna s isem a tella da, niɣ isem itucid war icni.
 ixdar isem nniḍn.',
-'talkexists'       => "'''Tasna twanql , maca Tasna n usiwl ins war twanqel ca maymmi qaddin ict nninḍ.
+'talkexists' => "'''Tasna twanql , maca Tasna n usiwl ins war twanqel ca maymmi qaddin ict nninḍ.
 snaqlitent s ufus.'''",
-'movedto'          => 'smutti ghar',
-'movetalk'         => 'Snaqel Tasniwin n usiwl igg illan akid-s',
-'movelogpage'      => 'Snaql aɣmis',
-'movereason'       => 'Ssebba:',
-'revertmove'       => 'sedwel',
+'movedto' => 'smutti ghar',
+'movetalk' => 'Snaqel Tasniwin n usiwl igg illan akid-s',
+'movelogpage' => 'Snaql aɣmis',
+'movereason' => 'Ssebba:',
+'revertmove' => 'sedwel',
 
 # Export
 'export' => 'Sekk tasniwin',
@@ -649,76 +648,76 @@ snaqlitent s ufus.'''",
 'allmessages' => 'inzan n unagraw',
 
 # Thumbnails
-'thumbnail-more'  => 'Smghar',
+'thumbnail-more' => 'Smghar',
 'thumbnail_error' => 'Error creating thumbnail: $1',
 
 # Import log
 'importlogpage' => 'Siri-d aɣmis',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Tasna inu',
-'tooltip-pt-mytalk'               => 'Tasna usiwl inu',
-'tooltip-pt-preferences'          => 'Isemyifiyen inu',
-'tooltip-pt-watchlist'            => 'Tabdart n Tasniwin umi txmamd bac ad-ten teẓṛegd',
-'tooltip-pt-mycontris'            => 'Umuɣ n tiwuriwin inu',
-'tooltip-pt-login'                => 'Neqqar ac adef s umiḍan nnek; maca malla texsed waha',
-'tooltip-pt-logout'               => 'Ufugh',
-'tooltip-ca-talk'                 => 'Amsawal xef tasna n ukettur',
-'tooltip-ca-edit'                 => 'Tzemmared a tẓeṛged tasna ya.
+'tooltip-pt-userpage' => 'Tasna inu',
+'tooltip-pt-mytalk' => 'Tasna usiwl inu',
+'tooltip-pt-preferences' => 'Isemyifiyen inu',
+'tooltip-pt-watchlist' => 'Tabdart n Tasniwin umi txmamd bac ad-ten teẓṛegd',
+'tooltip-pt-mycontris' => 'Umuɣ n tiwuriwin inu',
+'tooltip-pt-login' => 'Neqqar ac adef s umiḍan nnek; maca malla texsed waha',
+'tooltip-pt-logout' => 'Ufugh',
+'tooltip-ca-talk' => 'Amsawal xef tasna n ukettur',
+'tooltip-ca-edit' => 'Tzemmared a tẓeṛged tasna ya.
 Bbeẓ x ufeskar n uzar-timeẓṛi zzat i gha txemmled min turid',
-'tooltip-ca-addsection'           => 'Arni tinit deg usiwl a.',
-'tooltip-ca-viewsource'           => 'Tasna ya tẓarq. tzemred atẓred aɣbal ines.',
-'tooltip-ca-history'              => 'Isughulen izrin n tasna ya.',
-'tooltip-ca-protect'              => 'Ẓarq Tasna ya',
-'tooltip-ca-delete'               => 'Kks Tasna ya',
-'tooltip-ca-move'                 => 'Snaql Tasna a',
-'tooltip-ca-watch'                => 'Arni tasna ya ghar tbdart uḥṭṭu nnc',
-'tooltip-ca-unwatch'              => 'Kkes Tasna ya zi Tabdart uḥṭṭu inec',
-'tooltip-search'                  => 'Rzu {{SITENAME}}',
-'tooltip-search-go'               => 'Uyur ghar tasna s yizwel a s imant nnes malla tella',
-'tooltip-search-fulltext'         => 'Rzu di tasniwin x waḍṛis a',
-'tooltip-p-logo'                  => 'Tasbtirt Tamzwarut',
-'tooltip-n-mainpage'              => 'Adef ghar tasna tamezwarut',
-'tooltip-n-mainpage-description'  => 'Adef ghar tasna tamezwarut',
-'tooltip-n-portal'                => 'Xf usenfar, mayn tzemmared a tegged, mani gha tafed tighawsiwin',
-'tooltip-n-currentevents'         => 'Af tilgha n ugilal xf tmsarin titurawin',
-'tooltip-n-recentchanges'         => 'Tabdart n isenfilen imaynuten di Wiki.',
-'tooltip-n-randompage'            => 'Zdem ict tasna d tagacurant',
-'tooltip-n-help'                  => 'Mani gha tessned',
-'tooltip-t-whatlinkshere'         => 'Tabdart n marra tasniwin n Wiki i d-iteqqnen da',
-'tooltip-t-recentchangeslinked'   => 'Isenfilen n drus zggwami di tasniwin i yetwaqqnen zi tasna ya',
-'tooltip-t-contributions'         => 'Ẓar Tabdart n tiggawin n useqdac a',
-'tooltip-t-emailuser'             => 'Sekk e-mail i bnadem a',
-'tooltip-t-upload'                => 'Zdem-d isatulen',
-'tooltip-t-specialpages'          => 'Tabdart n marra tasniwin tinemmezrayin',
-'tooltip-t-print'                 => 'Tanghelt usiggez n tasna ya',
-'tooltip-ca-nstab-main'           => 'Ẓeṛ tasna n ukettur',
-'tooltip-ca-nstab-user'           => 'Ẓar Tasna n user',
-'tooltip-ca-nstab-project'        => 'Ẓṛ tasna n usnfar',
-'tooltip-ca-nstab-image'          => 'Ẓar Tasna n ufaylu',
-'tooltip-ca-nstab-template'       => 'Ẓṛ tamudmt',
-'tooltip-ca-nstab-help'           => 'Ẓar Tasna n tallalt',
-'tooltip-ca-nstab-category'       => 'Ẓṛ tasna n taggayt',
-'tooltip-minoredit'               => 'egg-itt d taẓṛigt tamẓyant',
-'tooltip-save'                    => 'Xmml isnfiln nnk',
-'tooltip-preview'                 => 'Ẓṛ mayn turid, zzat i t gha txmmld!',
-'tooltip-diff'                    => 'Ẓar tiẓṛigin i teggid deg uḍṛiṣ a.',
+'tooltip-ca-addsection' => 'Arni tinit deg usiwl a.',
+'tooltip-ca-viewsource' => 'Tasna ya tẓarq. tzemred atẓred aɣbal ines.',
+'tooltip-ca-history' => 'Isughulen izrin n tasna ya.',
+'tooltip-ca-protect' => 'Ẓarq Tasna ya',
+'tooltip-ca-delete' => 'Kks Tasna ya',
+'tooltip-ca-move' => 'Snaql Tasna a',
+'tooltip-ca-watch' => 'Arni tasna ya ghar tbdart uḥṭṭu nnc',
+'tooltip-ca-unwatch' => 'Kkes Tasna ya zi Tabdart uḥṭṭu inec',
+'tooltip-search' => 'Rzu {{SITENAME}}',
+'tooltip-search-go' => 'Uyur ghar tasna s yizwel a s imant nnes malla tella',
+'tooltip-search-fulltext' => 'Rzu di tasniwin x waḍṛis a',
+'tooltip-p-logo' => 'Tasbtirt Tamzwarut',
+'tooltip-n-mainpage' => 'Adef ghar tasna tamezwarut',
+'tooltip-n-mainpage-description' => 'Adef ghar tasna tamezwarut',
+'tooltip-n-portal' => 'Xf usenfar, mayn tzemmared a tegged, mani gha tafed tighawsiwin',
+'tooltip-n-currentevents' => 'Af tilgha n ugilal xf tmsarin titurawin',
+'tooltip-n-recentchanges' => 'Tabdart n isenfilen imaynuten di Wiki.',
+'tooltip-n-randompage' => 'Zdem ict tasna d tagacurant',
+'tooltip-n-help' => 'Mani gha tessned',
+'tooltip-t-whatlinkshere' => 'Tabdart n marra tasniwin n Wiki i d-iteqqnen da',
+'tooltip-t-recentchangeslinked' => 'Isenfilen n drus zggwami di tasniwin i yetwaqqnen zi tasna ya',
+'tooltip-t-contributions' => 'Ẓar Tabdart n tiggawin n useqdac a',
+'tooltip-t-emailuser' => 'Sekk e-mail i bnadem a',
+'tooltip-t-upload' => 'Zdem-d isatulen',
+'tooltip-t-specialpages' => 'Tabdart n marra tasniwin tinemmezrayin',
+'tooltip-t-print' => 'Tanghelt usiggez n tasna ya',
+'tooltip-ca-nstab-main' => 'Ẓeṛ tasna n ukettur',
+'tooltip-ca-nstab-user' => 'Ẓar Tasna n user',
+'tooltip-ca-nstab-project' => 'Ẓṛ tasna n usnfar',
+'tooltip-ca-nstab-image' => 'Ẓar Tasna n ufaylu',
+'tooltip-ca-nstab-template' => 'Ẓṛ tamudmt',
+'tooltip-ca-nstab-help' => 'Ẓar Tasna n tallalt',
+'tooltip-ca-nstab-category' => 'Ẓṛ tasna n taggayt',
+'tooltip-minoredit' => 'egg-itt d taẓṛigt tamẓyant',
+'tooltip-save' => 'Xmml isnfiln nnk',
+'tooltip-preview' => 'Ẓṛ mayn turid, zzat i t gha txmmld!',
+'tooltip-diff' => 'Ẓar tiẓṛigin i teggid deg uḍṛiṣ a.',
 'tooltip-compareselectedversions' => 'Ẓar imsebeḍiyen jar tunɣilin n Tasna ya.',
-'tooltip-watch'                   => 'Arni Tasna ya ɣa Tabdart uḥṭṭu inec',
+'tooltip-watch' => 'Arni Tasna ya ɣa Tabdart uḥṭṭu inec',
 
 # Browsing diffs
 'previousdiff' => '← imṣebḍan n zzat',
-'nextdiff'     => 'Amṣebḍi zzat  →',
+'nextdiff' => 'Amṣebḍi zzat  →',
 
 # Media information
 'file-info-size' => '$1 × $2 pixel, tiddisize n ufaylu: $3, anawtype n MIME: $4',
-'file-nohires'   => 'walu ca n resolution yemɣa x wa.',
-'svg-long-desc'  => 'Afaylu n SVG, dis $1 × $2 pixel, Tiddi n ufaylu: $3',
+'file-nohires' => 'walu ca n resolution yemɣa x wa.',
+'svg-long-desc' => 'Afaylu n SVG, dis $1 × $2 pixel, Tiddi n ufaylu: $3',
 'show-big-image' => 'Resolution ameqran',
 
 # Special:NewFiles
 'newimages' => 'Amewlaf n ifayluten imaynuten',
-'ilsubmit'  => 'Tarzzut',
+'ilsubmit' => 'Tarzzut',
 
 # Bad image list
 'bad_image_list' => 'Tameslayt amya :
@@ -728,12 +727,12 @@ Tazdayt tamzwarut di tebrit ixessa atzdi ɣa afaylu war icni  .
 kur tazdayt tdeffad a tmekkas .',
 
 # Metadata
-'metadata'          => 'Timuca Meta',
-'metadata-help'     => 'Afaylu a ɣar-s tilɣa(informations) nniḍn, teqqad ad tili tarnitent camera niɣ scanner i tiggin.
+'metadata' => 'Timuca Meta',
+'metadata-help' => 'Afaylu a ɣar-s tilɣa(informations) nniḍn, teqqad ad tili tarnitent camera niɣ scanner i tiggin.
 mala afaylu a itwabeddel x mamec ja illa g umezwaru, ca n tilɣa teqqad ad ilint msebḍant x ufaylu amezwaru.',
-'metadata-expand'   => 'Sicen-d tilɣa nnumɣarent',
+'metadata-expand' => 'Sicen-d tilɣa nnumɣarent',
 'metadata-collapse' => 'Snuffar tilgha innumgharn',
-'metadata-fields'   => 'Igran n EXIF metadata i yllan di tbrat a ad adfn di tasna n twlaft xmnni d-gha twḍa  tflwit n metadata.
+'metadata-fields' => 'Igran n EXIF metadata i yllan di tbrat a ad adfn di tasna n twlaft xmnni d-gha twḍa  tflwit n metadata.
 Innḍni ad twaffrn dg umzwar.
 * make
 * model
@@ -750,13 +749,13 @@ Innḍni ad twaffrn dg umzwar.
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'Ẓṛeg afaylu a s usnas zi baṛṛa',
+'edit-externally' => 'Ẓṛeg afaylu a s usnas zi baṛṛa',
 'edit-externally-help' => 'Xemm [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] i ktar n tilɣa(informations).',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'marra',
 'namespacesall' => 'marra',
-'monthsall'     => 'marra',
+'monthsall' => 'marra',
 
 # Multipage image navigation
 'imgmultigo' => 'Raḥ ɣa!',
@@ -767,10 +766,10 @@ Innḍni ad twaffrn dg umzwar.
 # Watchlist editing tools
 'watchlisttools-view' => 'Sicen ibeddilen i ssaɣan ɣar wayawya',
 'watchlisttools-edit' => 'Ẓar d tẓṛegd Tabdart uḥṭṭu',
-'watchlisttools-raw'  => 'Ẓṛeg Tabdart uḥṭṭu tamenzut',
+'watchlisttools-raw' => 'Ẓṛeg Tabdart uḥṭṭu tamenzut',
 
 # Special:Version
-'version'              => 'Tunɣilt',
+'version' => 'Tunɣilt',
 'version-specialpages' => 'Tudmawin Special',
 
 # Special:FileDuplicateSearch
index 67dc61f..eb1c27e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Romansh (Rumantsch)
+/** Romansh (rumantsch)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -403,14 +403,15 @@ Eventualmain ha gia insatgi auter stizza quest element.',
 'badtitle' => "Il num da titel endatà n'è betg valid",
 'badtitletext' => 'Il titel da pagina era betg valid, vids u in titel inter-lingua u inter-wiki betg correct.
 El po cuntegnair in u plirs segns che na pon betg vegnir utilisads en titels.',
-'perfcached' => 'Las suandantas datas vegnan ord il cache ed èn eventualmain betg cumplettamain actualas. Maximalmain {{PLURAL:$1|in resultat è|$1 resultats èn}} disponibels en il cache.',
-'perfcachedts' => 'Las suandantas datas derivan dal cache, ultima actualisaziun ils $2 las $3. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => "Las suandantas datas vegnan ord il cache e n'èn eventualmain betg cumplettamain actualas. Maximalmain {{PLURAL:$1|in resultat è disponibel|$1 resultats èn disponibels}} en il cache.",
+'perfcachedts' => 'Las suandantas datas derivan dal cache, ultima actualisaziun ils $2 las $3. Maximalmain {{PLURAL:$4|in resultat è disponibel|$4 resultats èn disponibels}} en il cache.',
 'querypage-no-updates' => 'Las actualisaziuns da questa pagina èn deactivadas. 
 Las datas qua vegnan da preschent betg actualisadas.',
 'wrong_wfQuery_params' => 'Parameters fauss per wfQuery()<br />
 Funcziun: $1<br />
 Query: $2',
 'viewsource' => 'Mussar il code da fontauna',
+'viewsource-title' => 'Vesair il code da funtauna da $1',
 'actionthrottled' => 'Acziun limitada',
 'actionthrottledtext' => 'Sco mesira cunter spam na pos ti betg exequir questa acziun memia bleras giadas en curt temp. Ti has surpassà questa limita. 
 Emprova danovamain en in per minutas.',
@@ -579,6 +580,13 @@ Ti duessas t'annunziar e tscherner ussa in nov pled-clav. Sche ti na levas betg
 Pled-clav temporar: $2",
 'passwordreset-emailsent' => 'In e-mail cun in nov pled-clav è vegnì tramess.',
 
+# Special:ChangeEmail
+'changeemail' => "Midar l'adressa dad e-mail",
+'changeemail-no-info' => "Ti stos t'annunziar per acceder directamain questa pagina.",
+'changeemail-newemail' => ' Nova adressa dad e-mail',
+'changeemail-none' => '(nagina)',
+'changeemail-cancel' => 'Interrumper',
+
 # Edit page toolbar
 'bold_sample' => 'Text grass',
 'bold_tip' => 'Text grass',
@@ -930,8 +938,7 @@ Fa stim che navigar cun agid da las coalliziuns reinizialisescha tia tscherna.',
 'mergelogpagetext' => "Sutvart è ina glista da las ultimas cronologias ch'èn vegnidas unidas cun autras.",
 
 # Diffs
-'history-title' => 'Cronica da versiuns da "$1"',
-'difference' => '(differenza tranter versiuns)',
+'history-title' => '$1: Cronologia da las versiuns',
 'difference-multipage' => '(Differenzas tranter las paginas)',
 'lineno' => 'Lingia $1:',
 'compareselectedversions' => 'cumparegliar las versiuns selecziunadas',
@@ -1029,7 +1036,7 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'prefs-rc' => 'Ultimas midadas',
 'prefs-watchlist' => "Glista d'observaziun",
 'prefs-watchlist-days' => "Dumber dals dis che vegnan inditgads sin la glista d'observaziun:",
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Maximalmain $1 {{PLURAL:$1|di|dis}}',
 'prefs-watchlist-edits' => 'Dumber da las midadas mussadas en la glista dad observaziun extendida:',
 'prefs-watchlist-edits-max' => 'Dumber maximal: 1000',
 'prefs-watchlist-token' => "Token da la glista d'observaziun",
@@ -1103,6 +1110,8 @@ Questa infurmaziun è publica.',
 'email' => 'E-mail',
 'prefs-help-realname' => "Opziun: Qua pos inditgar in surnum che vegn inditga empè da tes num d'utilisader en tias suttascripziuns cun '''<nowiki>--~~~~</nowiki>'''.",
 'prefs-help-email' => "L'adressa dad e-mail è opziunala, pussibilitescha dentant da trametter in nov pled-clav en cass da sperdita.",
+'prefs-help-email-others' => 'Ti pos era decider che auters ta pon contactar per e-mail entras in link sin tia pagina da discussion.
+Tia adressa dad e-mail na vegn betg mussada sche auters utilisaders ta contacteschan.',
 'prefs-help-email-required' => "Inditgar in'adressa dad e-mail è obligatoric.",
 'prefs-info' => 'Infurmaziuns da basa',
 'prefs-i18n' => 'Internaziunalisaziun',
@@ -1128,7 +1137,7 @@ Questa infurmaziun è publica.',
 'userrights-lookup-user' => "Administrar gruppas d'utilisaders",
 'userrights-user-editname' => "Inditgescha in num d'utilisader:",
 'editusergroup' => "Modifitgar las gruppas d'utilisaders",
-'editinguser' => "Midar ils dretgs da l'utilisader '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Midar ils dretgs da l'utilisader '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => "Modifitgar las gruppas d'utilisaders",
 'saveusergroups' => "Memorisar questas gruppas d'utilisaders",
 'userrights-groupsmember' => 'Commember da:',
@@ -1141,7 +1150,7 @@ Questa infurmaziun è publica.',
 'userrights-no-interwiki' => "Ti n'has betg la permissiun da midar dretgs d'utilisaders sin autras wikis.",
 'userrights-nodatabase' => "La banca da datas $1 n'exista betg u n'è betg locala.",
 'userrights-nologin' => "Ti stos [[Special:UserLogin|t'annunziar]] cun in conto d'aministratur per modifitgar ils dretgs d'utilisader.",
-'userrights-notallowed' => "Tes conto d'utilisader n'ha betg la permissiun dad agiuntar dretgs d'utilisaders.",
+'userrights-notallowed' => "Tes conto d'utilisader n'ha betg la permissiun dad agiuntar u allontanar dretgs d'utilisaders.",
 'userrights-changeable-col' => 'Gruppas che ti pos modifitgar',
 'userrights-unchangeable-col' => 'Gruppas che ti nas pos betg modifitgar',
 
@@ -1152,15 +1161,15 @@ Questa infurmaziun è publica.',
 'group-bot' => 'Bots',
 'group-sysop' => 'Administraturs',
 'group-bureaucrat' => 'Birocrat',
-'group-suppress' => 'Oversights',
+'group-suppress' => 'Supervisurs',
 'group-all' => '(tuts)',
 
-'group-user-member' => 'Utilisader',
-'group-autoconfirmed-member' => 'Utilisader confermà automaticamain',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Administratur',
-'group-bureaucrat-member' => 'Birocrat',
-'group-suppress-member' => 'Oversight',
+'group-user-member' => '{{GENDER:$1|utilisader|utilisadra|utilisader}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|utilisader confermà automaticamain|utilisadra confermada automaticamain|utilisader confermà automaticamain}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|administratur|administratura|administratur}}',
+'group-bureaucrat-member' => '{{GENDER:$1|birocrat|birocrata|birocrat}}',
+'group-suppress-member' => '{{GENDER:$1|supervisur|supervisura|supervisur}}',
 
 'grouppage-user' => '{{ns:project}}:Utilisaders',
 'grouppage-autoconfirmed' => '{{ns:project}}:Utilisaders confermads automaticamain',
@@ -1273,7 +1282,7 @@ Questa infurmaziun è publica.',
 'nchanges' => '$1 {{PLURAL:$1|midada|midadas}}',
 'recentchanges' => 'Ultimas midadas',
 'recentchanges-legend' => 'Opziuns per las ultimas midadas',
-'recentchangestext' => "Sin questa pagina pos ti suandar las ultimas midadas sin '''{{SITENAME}}'''.",
+'recentchanges-summary' => "Sin questa pagina pos ti suandar las ultimas midadas sin '''{{SITENAME}}'''.",
 'recentchanges-feed-description' => 'Suonda las ultimas midadas en la wiki cun quet feed.',
 'recentchanges-label-newpage' => 'Questa modificaziun ha creà ina nova pagina',
 'recentchanges-label-minor' => 'Quai è ina pitschna modificaziun',
@@ -1421,17 +1430,51 @@ Controllescha per plaschair l'opziun <code>file_uploads</code>.",
 'upload-description' => 'Descripziun da la datoteca',
 'upload-options' => 'Opziuns per chargiar si',
 'watchthisupload' => 'Observar questa datoteca',
+'upload-success-subj' => 'Transferì cun success',
+'upload-success-msg' => 'Tes transfer da [$2] è stà cun success. La datoteca è disponibla qua: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Probelm cun transferir',
+'upload-failure-msg' => 'I è capitada ina errur durant transferir da [$2]:
+$1',
+'upload-warning-subj' => 'Avertiment da transferir',
+'upload-warning-msg' => 'Ina errur è capitada cun tes transfer da [$2]. Ti pos returnar al [[Special:Upload/stash/$1|formular per transferir]] per curreger quest problem.',
 
 'upload-proto-error' => 'Protocol nuncorrect',
+'upload-proto-error-text' => 'Il transfer da servers externs basegna URLs che cumenzan cun <code>http://</code> u <code>ftp://</code>.',
+'upload-file-error' => 'Errur interna',
+'upload-file-error-text' => 'Ina errur interna è capitada durant empruvar da crear ina datoteca temporara sin il server. 
+Contactescha per plaschair in [[Special:ListUsers/sysop|administratur]].',
+'upload-misc-error' => 'Errur da transferir nunenconuschenta',
+'upload-misc-error-text' => "Ina errur nunenconuschenta è capitada durant transferir. 
+Controllescha per plaschair che l'URL è valida ed accessibla ed emprova anc ina giada.
+Sch'il problem exista anc adina, contactescha in [[Special:ListUsers/sysop|administratur]].",
 'upload-too-many-redirects' => 'La URL ha cuntegnì memia blers renviaments',
 'upload-unknown-size' => 'Grondezza nunenconuschenta',
 'upload-http-error' => 'In sbagl da HTTP è capità: $1',
 
+# File backend
+'backend-fail-stream' => 'Impussibel da leger la datoteca $1.',
+'backend-fail-backup' => 'Impussibel da far ina copia da segirezza da $1.',
+'backend-fail-notexists' => "La datoteca $1 n'exista betg.",
+'backend-fail-hashes' => "Impussibel d'obtenir ils hashs da las datotecas per las cumparegliar.",
+'backend-fail-notsame' => 'Ina datoteca betg identica exista gia sin $1.',
+'backend-fail-invalidpath' => "$1 n'è betg in percus valida per memorisar.",
+'backend-fail-delete' => 'Impussibel da stizzar la datoteca $1.',
+'backend-fail-alreadyexists' => 'La datoteca $1 exista gia.',
+'backend-fail-store' => 'Impussibel da memorisar la datoteca $1 en $2.',
+'backend-fail-copy' => 'Impussibel da copiar la datoteca $1 a $2.',
+'backend-fail-move' => 'Impussibel da spustar la datoteca $1 a $2.',
+'backend-fail-opentemp' => 'Impussibel dad avrir la datoteca temporara.',
+'backend-fail-writetemp' => 'Impussibel da scriver en la datoteca temporara.',
+'backend-fail-closetemp' => 'Impussibel da serrar la datoteca temporara.',
+'backend-fail-read' => 'Impussibel da leger la datoteca $1.',
+'backend-fail-create' => 'Impussibel da crear la datoteca $1.',
+'backend-fail-readonly' => 'Il backend "$1" da memorisar è actualmain en il modus da be leger. Il motiv inditgà è: "$2".',
+
 # img_auth script messages
 'img-auth-accessdenied' => "Refusà l'access",
 'img-auth-nopathinfo' => "PATH_INFO manca.
 Tes server n'è betg configurà per surdar questa infurmaziun.
-I basa forsa sin CGI è na sustegna betg img_auth.
+El basa forsa sin CGI è na sustegna betg img_auth.
 Consultescha https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
 'img-auth-nologinnWL' => 'Ti n\'ès betg t\'annunzia ed "$1" n\'è betg sin la glista alva.',
 'img-auth-nofile' => 'Datoteca "$1" n\'exista betg.',
@@ -1581,7 +1624,7 @@ Betg emblida da controllar sche autras colliaziuns mainan als models avant ch'al
 'statistics-users-active-desc' => "Utilisaders che han fatg almain ina acziun {{PLURAL:$1|l'ultim di|ils ultims $1 dis}}",
 'statistics-mostpopular' => 'Paginas visitadas il pli savens',
 
-'disambiguations' => 'Paginas per la decleraziun da noziuns',
+'disambiguations' => 'Paginas cun colliaziuns sin paginas per la decleraziun da noziuns',
 'disambiguationspage' => 'Template:disambiguiziun',
 
 'doubleredirects' => 'Renviaments dubels',
@@ -1662,7 +1705,7 @@ I renviescha uss a [[$2]].',
 'booksources-go' => 'Leger',
 
 # Special:Log
-'specialloguserlabel' => 'Utilisader:',
+'specialloguserlabel' => 'Acziun exequida da:',
 'speciallogtitlelabel' => 'Titel:',
 'log' => 'logs / cudesch da navigaziun',
 'all-logs-page' => 'Tut ils logs publics',
@@ -1692,7 +1735,7 @@ I renviescha uss a [[$2]].',
 'sp-deletedcontributions-contribs' => 'contribuziuns',
 
 # Special:LinkSearch
-'linksearch' => 'Colliaziuns externas',
+'linksearch' => 'Tschertgar colliaziuns externas',
 'linksearch-pat' => 'Muster da tschertgar:',
 'linksearch-ns' => 'Tip da pagina:',
 'linksearch-ok' => 'Tschertgar',
@@ -2221,7 +2264,7 @@ En quests cas as ti da spustar u colliar manualmain las paginas, sche giavischà
 
 L\'artitgel da destinaziun "[[:$1]]" exista gia. Vul ti stizzar el per far plaz per spustar?',
 'delete_and_move_confirm' => 'Gea, stizzar il artitgel da destinaziun per spustar',
-'delete_and_move_reason' => 'Stizzà per far plaz per spustar',
+'delete_and_move_reason' => 'Stizzà per far plaz per spustar da "[[$1]]"',
 'selfmove' => 'Il num da funtauna e destinaziun èn identics; 
 betg pussaivel da spustar ina pagina en il medem lieu.',
 'immobile-source-namespace' => 'Paginas dal tip da pagina "$1" na pon betg vegnir spustadas',
@@ -2252,9 +2295,11 @@ Quel po vegnir importà en ina autra wiki che sa basa sin MediaWiki cun agid da
 Endatescha en il champ sutvart tut ils artitgels che ti vuls exportar, per mintga artitgel ina nova lingia, ed inditgescha era sche ti vuls includer l'entira cronologia u be la versiun actuala. 
 
 En cas che ti vul be exportar l'ultima versiun pos ti era utilisar in link, p.ex. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per la pagina \"[[{{MediaWiki:Mainpage}}]]\".",
+'exportall' => 'Exportar tut las paginas',
 'exportcuronly' => "Exportar be la versiun actuala, betg l'entira cronologia",
 'exportnohistory' => "----
 '''Remartga:''' La funcziun dad exportar l'entira cronologia en questa furma è deactivada ord motivs da prestaziun.",
+'exportlistauthors' => 'Integrar ina glista cumpletta dals contribuents a mintga pagina',
 'export-submit' => 'Exportar',
 'export-addcattext' => 'Agiuntar paginas da la categoria:',
 'export-addcat' => 'Agiuntar',
@@ -2287,6 +2332,8 @@ Fai ina visita sin [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation
 'thumbnail_error' => 'Sbagl cun crear il maletg da prevista: $1',
 'djvu_page_error' => 'Pagina da DjVu è ordaifer la limita',
 'djvu_no_xml' => "Betg pussaivel da retschaiver l'XML per la datoteca da DjVu",
+'thumbnail-temp-create' => 'Impussibel da crear in maletg da prevista temporar',
+'thumbnail-dest-create' => 'Impussibel da memorisar il maletg da prevista a la destinaziun',
 'thumbnail_invalid_params' => 'Parameters nunvalids dal maletg da prevista',
 'thumbnail_dest_directory' => "Betg pussaivel da crear l'ordinatur da destinaziun.",
 'thumbnail_image-type' => 'Quest tip da maletg na vegn betg sustegnì',
@@ -2335,6 +2382,11 @@ In ordinatur temporar manca.",
 'import-token-mismatch' => 'Perdita da datas da la sesida.
 Emprova danovamain.',
 'import-invalid-interwiki' => 'Betg pussaivel dad importar dal wiki inditgà.',
+'import-error-edit' => 'La pagina "$1" n\'è betg vegnida importada perquai che ti na dastgas betg la modifitgar.',
+'import-error-create' => 'La pagina "$1" n\'è betg vegnida importada perquai che ti na la dastgas betg crear.',
+'import-error-interwiki' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'il num è reservà per colliaziuns externas (interwiki).',
+'import-error-special' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'ella fa part dad in tip da pagina spezial che na lubescha naginas pagina.',
+'import-error-invalid' => 'La pagina "$1" n\'è betg vegnida importada perquai ch\'il num n\'è betg valid.',
 
 # Import log
 'importlogpage' => 'Log dals imports',
@@ -2344,6 +2396,16 @@ Emprova danovamain.',
 'import-logentry-interwiki' => 'ha importà $1 (transwiki)',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|Ina versiun|$1 versiuns}} da $2',
 
+# JavaScriptTest
+'javascripttest' => 'Test da JavaScript',
+'javascripttest-disabled' => 'Questa funcziun è deactivada.',
+'javascripttest-title' => 'Exequir tests da $1',
+'javascripttest-pagetext-noframework' => 'Questa pagina è reservada per exequir tests da JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Framework da test nunenconuschent "$1".',
+'javascripttest-pagetext-frameworks' => 'Tscherna per plaschair in dals suandantas frameworks da test: $1',
+'javascripttest-pagetext-skins' => 'Tscherna in skin che duai vegnir utilisà per ils tests:',
+'javascripttest-qunit-intro' => 'Legia la [$1 documentaziun da tests] sin mediawiki.org.',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "Mussar tia pagina d'utilisader",
 'tooltip-pt-anonuserpage' => "La pagina d'utilisader per l'adressa IP cun la quala che ti fas modificaziuns",
@@ -2406,6 +2468,8 @@ Ti pos vesair il code-fundamental.',
 'tooltip-diff' => 'Mussar las midadas che ti has fatg en il text.',
 'tooltip-compareselectedversions' => 'Mussar la differenza tranter las duas versiuns selecziunadas da questa pagina.',
 'tooltip-watch' => "Agiuntar questa pagina a tia pagina d'observaziun",
+'tooltip-watchlistedit-normal-submit' => 'Allontanar las endataziuns tschernidas',
+'tooltip-watchlistedit-raw-submit' => "Actualisar la glista d'observaziun",
 'tooltip-recreate' => "Crear danovamain la pagnina, malgrà ch'ella è vegnida stizzada",
 'tooltip-upload' => 'Cumenzar da chargiar si',
 'tooltip-rollback' => "Revochescha tut las modificaziuns vid questa pagina da l'ultim utilisader cun be in clic.",
@@ -2501,7 +2565,7 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
 'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
 'show-big-image' => 'Resoluziun cumplaina',
 'show-big-image-preview' => 'Grondezza da questa prevista: $1.',
-'show-big-image-other' => 'Autras resoluziuns: $1.',
+'show-big-image-other' => 'Other {{PLURAL:$2|resoluziun|resoluziuns}}: $1.',
 'show-big-image-size' => '$1 × $2 pixels',
 'file-info-gif-looped' => 'marscha infinit',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|maletg|maletgs}}',
@@ -2521,6 +2585,13 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
 'bydate' => 'tenor data',
 'sp-newimages-showfrom' => 'Las novas datotecas davent dal $1 las $2 vegnan mussadas.',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 secunda|$1 secundas}}',
+'minutes' => '{{PLURAL:$1|$1 minuta|$1 minutas}}',
+'hours' => '{{PLURAL:$1|$1 ura|$1 uras}}',
+'days' => '{{PLURAL:$1|$1 di|$1 dis}}',
+'ago' => 'avant $1',
+
 # Bad image list
 'bad_image_list' => "Il format è sco suonda:
 
@@ -2742,9 +2813,9 @@ Sche la datoteca è vegnida midada dal status original èn tscherts detagls even
 'exif-orientation-3' => 'Rotà per 180°',
 'exif-orientation-4' => 'Reflectà verticalmain',
 'exif-orientation-5' => "Rotà 90° en senn cuntrari a l'ura e reflectà verticalmain",
-'exif-orientation-6' => "Rotà 90° en senn da l'ura",
+'exif-orientation-6' => "Rotà 90° en senn cuntrari a l'ura",
 'exif-orientation-7' => "Rotà 90° en senn da l'ura e reflectà verticalmain",
-'exif-orientation-8' => "Rotà 90° en senn cuntrari a l'ura",
+'exif-orientation-8' => "Rotà 90° en senn da l'ura",
 
 'exif-planarconfiguration-1' => 'Format grop (chunky)',
 'exif-planarconfiguration-2' => 'Format planar',
@@ -3176,6 +3247,9 @@ Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
 'compare-rev1' => 'Versiun 1',
 'compare-rev2' => 'Versiun 2',
 'compare-submit' => 'Cumparegliar',
+'compare-invalid-title' => 'Il titel che ti has spezifitgà è nunvalid.',
+'compare-title-not-exists' => "Il titel che ti has inditgà n'exista betg.",
+'compare-revision-not-exists' => "La versiun che ti has inditgà n'exista betg.",
 
 # Database error messages
 'dberr-header' => 'Questa wiki ha in problem',
@@ -3204,6 +3278,60 @@ Questa pagina ha actualmain difficultads tecnicas.',
 'sqlite-no-fts' => '$1 senza sustegn per la retschertga da text integrala',
 
 # New logging system
+'logentry-delete-delete' => '$1 ha stizzà la pagina $3',
+'logentry-delete-restore' => '$1 ha restaurà la pagina $3',
 'newuserlog-byemail' => 'tramess il pled-clav per e-mail',
 
+# Feedback
+'feedback-subject' => 'Object:',
+'feedback-message' => 'Messadi:',
+'feedback-cancel' => 'Interrumper',
+'feedback-submit' => 'Trametter il resun',
+'feedback-adding' => 'Agiuntar il resun a la pagina…',
+'feedback-error1' => 'Errur: Resultat nunenconuschent dal API',
+'feedback-error2' => "Errur: La modificaziun n'è betg reussida",
+'feedback-error3' => 'Errur: Nagina resposta dal API',
+'feedback-thanks' => 'Grazia! Tes resun è vegnì publitgà sin la pagina "[$2 $1]".',
+'feedback-close' => 'Terminà',
+'feedback-bugcheck' => "Grondius! Controllescha simplamain che quai n'è betg gia in da las [$1 errurs enconuschentas].",
+'feedback-bugnew' => 'Jau hai controllà. Rapportar ina nova errur.',
+
+# API errors
+'api-error-badaccess-groups' => 'Ti na dastgas betg chargiar datotecas en quest wiki.',
+'api-error-badtoken' => 'Errur interna: Token fauss.',
+'api-error-copyuploaddisabled' => 'La funcziun da transferir dad ina URL è deactivada sin quest server.',
+'api-error-duplicate' => 'I dat gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn.',
+'api-error-duplicate-archive' => 'I deva gia {{PLURAL:$1|ina [$2 autra datoteca]|[$2 autras datotecas]}} cun il medem cuntegn, {{PLURAL:$1|quella è dentant vegnida stizzada|quellas èn dentant vegnidas stizzadas}}.',
+'api-error-duplicate-archive-popup-title' => "{{PLURAL:$1|Datoteca dubla ch'è gia vegnida stizzada|Datotecas dublas ch'èn gia vegnidas stizzadas}}.",
+'api-error-duplicate-popup-title' => '{{PLURAL:$1|Datoteca dubla|Datotecas dublas}}.',
+'api-error-empty-file' => 'La datoteca tramessa è vida.',
+'api-error-emptypage' => "Crear paginas novas e vidas n'è betg lubì.",
+'api-error-fetchfileerror' => "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
+'api-error-file-too-large' => 'La datoteca che ti has tramess era memia gronda.',
+'api-error-filename-tooshort' => 'Il num da datoteca è memia curt.',
+'api-error-filetype-banned' => 'Quest tip da datoteca è scumandà.',
+'api-error-filetype-missing' => "Il num da datoteca n'ha betg ina finiziun da datoteca.",
+'api-error-hookaborted' => 'La midada che ti has empruvà da far è vegnida interrutta dad ina extensiun.',
+'api-error-http' => 'Errur interna: Betg pussaivel da connectar cun il server.',
+'api-error-illegal-filename' => "Il num da datoteca n'è betg lubì.",
+'api-error-internal-error' => "Errur interna: Insatge n'ha betg funcziunà durant transmetter tia datoteca en la vichi.",
+'api-error-invalid-file-key' => "Errur interna: La datoteca n'è betg vegnida chattada en la memoria temporara.",
+'api-error-missingparam' => 'Errur interna: Parameters da la dumonda manchants.',
+'api-error-missingresult' => "Errur interna: I na pudeva betg vegnir constatà sch'il process da copiar è reussì.",
+'api-error-mustbeloggedin' => "Ti stos esser t'annunzià per pudair transferir datotecas.",
+'api-error-mustbeposted' => 'Errur interna: La dumonda basegna HTTP POST.',
+'api-error-noimageinfo' => "La datoteca è vegnida transferida cun success, ma il server n'ha returnà naginas infurmaziuns davart la datoteca.",
+'api-error-nomodule' => 'Errur interna: Nagin modul per chargiar si è definì.',
+'api-error-ok-but-empty' => 'Errur interna: Nagina resposta dal server.',
+'api-error-overwrite' => "Recuvrir (surscriver) ina daoteca existenta n'è betg lubì.",
+'api-error-stashfailed' => 'Errur interna: Errur cun memorisar la datoteca temporara.',
+'api-error-timeout' => "Il server n'ha betg respundì entaifer il temp spetgà.",
+'api-error-unclassified' => 'Ina errur nunenconuschenta è capitada.',
+'api-error-unknown-code' => 'Errur nunenconuschenta: "$1"',
+'api-error-unknown-error' => "Errur interna: Insatge n'ha betg funcziunà durant transferir tia datoteca.",
+'api-error-unknown-warning' => 'Avertiment nunenconuschent: "$1".',
+'api-error-unknownerror' => 'Errur nunenconuschenta: "$1".',
+'api-error-uploaddisabled' => 'La funcziun da chargiar datotecas sin quest vichi è deactivada.',
+'api-error-verification-error' => 'Questa datoteca pudess esser corrupta ni avair ina extensiun faussa.',
+
 );
index c90ec2a..53fc430 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Romanian (Română)
+/** Romanian (română)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -146,6 +146,7 @@ $magicWords = array(
        'contentlanguage'         => array( '1', 'LIMBACONTINUT', 'CONTENTLANGUAGE', 'CONTENTLANG' ),
        'pagesinnamespace'        => array( '1', 'PANIGIINSPATIULDENUME:', 'PAGINIINSN:', 'PAGESINNAMESPACE:', 'PAGESINNS:' ),
        'numberofadmins'          => array( '1', 'NUMARADMINI', 'NUMBEROFADMINS' ),
+       'formatnum'               => array( '0', 'FORMATNR', 'FORMATNUM' ),
        'defaultsort'             => array( '1', 'SORTAREIMPLICITA:', 'CHEIESORTAREIMPLICITA:', 'CATEGORIESORTAREIMPLICITA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                => array( '0', 'CALEAFISIERULUI:', 'FILEPATH:' ),
        'tag'                     => array( '0', 'eticheta', 'tag' ),
@@ -304,7 +305,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ascunde în schimbări recente editările patrulate',
 'tog-newpageshidepatrolled' => 'Ascunde paginile patrulate din lista de pagini noi',
 'tog-extendwatchlist' => 'Extinde lista de articole urmărite pentru a arăta toate schimbările efectuate, nu doar pe cele mai recente',
-'tog-usenewrc' => 'Afișează varianta îmbunătățită a schimbărilor recente (necesită JavaScript)',
+'tog-usenewrc' => 'Grupează modificările după pagină în cadrul schimbărilor recente și listei paginilor urmărite (necesită JavaScript)',
 'tog-numberheadings' => 'Numerotează automat secțiunile',
 'tog-showtoolbar' => 'Afișează bara de unelte pentru modificare (JavaScript)',
 'tog-editondblclick' => 'Activează modificarea paginii prin dublu clic (JavaScript)',
@@ -692,6 +693,10 @@ Motivul invocat este ''$2''.",
 'filereadonlyerror' => 'Imposibil de modificat fișierul „$1”, deoarece depozitul de fișiere „$2” este în modul „doar citire”.
 
 Administratorul care a efectuat blocarea a furnizat explicația: „$3”.',
+'invalidtitle-knownnamespace' => 'Titlu invalid cu spațiul de nume „$2” și textul „$3”',
+'invalidtitle-unknownnamespace' => 'Titlu invalid cu numărul spațiului de nume $1 necunoscut și textul „$2”',
+'exception-nologin' => 'Neautentificat{{GENDER:||ă}}.',
+'exception-nologin-text' => 'Această pagină sau acțiune necesită ca dumneavoastră să fiți autentificat{{GENDER:||ă}} pe acest wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Configurație greșită: scaner de virus necunoscut: ''$1''",
@@ -734,7 +739,7 @@ Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:P
 Vă rugăm să alegeți un alt nume.',
 'loginerror' => 'Eroare de autentificare',
 'createaccounterror' => 'Nu pot crea contul: $1',
-'nocookiesnew' => 'Contul a fost creat, dar dvs. nu sunteți autentificat(ă). {{SITENAME}} folosește cookie-uri pentru a reține utilizatorii autentificați. Browser-ul dvs. are modulele cookie dezactivate (disabled). Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
+'nocookiesnew' => 'Contul a fost creat, dar nu sunteți autentificat{{GENDER:||ă|}}. {{SITENAME}} folosește module cookie pentru a reține utilizatorii autentificați. Navigatorul dumneavoastră are aceste module cookie dezactivate. Vă rugăm să le activați și să vă reautentificați folosind noul nume de utilizator și noua parolă.',
 'nocookieslogin' => '{{SITENAME}} folosește module cookie pentru a autentifica utilizatorii. Browser-ul dvs. are cookie-urile dezactivate. Vă rugăm să le activați și să incercați din nou.',
 'nocookiesfornew' => 'Contul de utilizator nu a fost creat, deoarece nu am putut confirma sursa.
 Asigurați-vă că aveți cookie-urile activate, reîncărcați pagina și încercați din nou.',
@@ -978,7 +983,8 @@ Paginile .css și .js specifice utilizatorilor au titluri care încep cu literă
 'updated' => '(Actualizat)',
 'note' => "'''Notă:'''",
 'previewnote' => "'''Țineți cont că aceasta este doar o previzualizare.'''
-Modificările dumneavoastră nu au fost încă salvate! [[#editform|→ Continuă editarea]]",
+Modificările dumneavoastră nu au fost încă salvate!",
+'continue-editing' => 'Continuare editare',
 'previewconflict' => 'Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.',
 'session_fail_preview' => "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.
 Vă rugăm să încercați din nou.
@@ -993,7 +999,7 @@ Modificarea a fost respinsă pentru a preveni deformarea textului paginii.
 Acest fapt se poate întâmpla atunci când folosești un serviciu proxy anonim.'''",
 'edit_form_incomplete' => "'''Unele părți ale formularului de modificare nu au ajuns la server; verificați dacă modificările dumneavoastră sunt intacte și reîncercați.'''",
 'editing' => 'modificare $1',
-'creating' => 'Se creează $1',
+'creating' => 'Crearea paginii $1',
 'editingsection' => 'modificare $1 (secțiune)',
 'editingcomment' => 'Modificare $1 (secțiune nouă)',
 'editconflict' => 'Conflict de modificare: $1',
@@ -1077,6 +1083,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.',
@@ -1219,7 +1227,7 @@ Nu ai acces asupra lui.',
 # Suppression log
 'suppressionlog' => 'Înlătură jurnalul',
 'suppressionlogtext' => 'Mai jos este afișată o listă a ștergerilor și a blocărilor care implică conținutul ascuns de administratori.
-Vedeți [[Special:BlockList|adresele IP blocate]] pentru o listă a interzicerilor operaționale sau a blocărilor.',
+Vedeți [[Special:BlockList|lista blocărilor]] pentru o listă a interzicerilor operaționale sau a blocărilor.',
 
 # History merging
 'mergehistory' => 'Unește istoricul paginilor',
@@ -1253,8 +1261,9 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'mergelogpagetext' => 'Mai jos este o listă a celor mai recente combinări ale istoricului unei pagini cu al alteia.',
 
 # Diffs
-'history-title' => 'Istoricul versiunilor pentru „$1”',
-'difference' => '(Diferența dintre versiuni)',
+'history-title' => '$1: Istoricul versiunilor',
+'difference-title' => '$1: Diferență între versiuni',
+'difference-title-multipage' => '$1 și $2: Diferență între pagini',
 'difference-multipage' => '(Diferență între pagini)',
 'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Compară versiunile marcate',
@@ -1350,6 +1359,7 @@ Folosirea linkurilor de navigare va reseta această coloană.',
 'prefs-beta' => 'Opțiuni beta',
 'prefs-datetime' => 'Data și ora',
 'prefs-labs' => 'Opțiuni „labs”',
+'prefs-user-pages' => 'Pagini de utilizator',
 'prefs-personal' => 'Informații personale',
 'prefs-rc' => 'Schimbări recente',
 'prefs-watchlist' => 'Listă de urmărire',
@@ -1613,7 +1623,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'nchanges' => '$1 {{PLURAL:$1|modificare|modificări|de modificări}}',
 'recentchanges' => 'Schimbări recente',
 'recentchanges-legend' => 'Opțiuni schimbări recente',
-'recentchangestext' => 'Urmăriți în această pagină cele mai recente modificări de pe site.',
+'recentchanges-summary' => 'Schimbări recente ... (Log)',
 'recentchanges-feed-description' => 'Urmărește cele mai recente schimbări folosind acest flux.',
 'recentchanges-label-newpage' => 'Această modificare a creat o pagină nouă',
 'recentchanges-label-minor' => 'Aceasta este o modificare minoră',
@@ -1807,9 +1817,10 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
 'backend-fail-writetemp' => 'Imposibil de scris în fișierul temporar.',
 'backend-fail-closetemp' => 'Imposibil de închis fișierul temporar.',
 'backend-fail-read' => 'Imposibil de citit fișierul $1.',
-'backend-fail-create' => 'Imposibil de creat fișierul $1.',
-'backend-fail-maxsize' => 'Nu s-a putut crea fișierul $1 pentru că acesta este mai mare de {{PLURAL:$2|un octet|$2 octeți|$2 de octeți}}.',
+'backend-fail-create' => 'Imposibil de scris fișierul $1.',
+'backend-fail-maxsize' => 'Nu s-a putut scrie fișierul $1 pentru că acesta este mai mare de {{PLURAL:$2|un octet|$2 octeți|$2 de octeți}}.',
 'backend-fail-contenttype' => 'Nu s-a putut determina tipul de conținut al fișierului de stocat la „$1”.',
+'backend-fail-usable' => 'Imposibil de scris fișierul $1 din cauza permisiunilor insuficiente sau din cauza directoarelor/containerelor lipsă.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Imposibil de deblocat „$1”; nu este blocată.',
@@ -2139,6 +2150,7 @@ Vă rugăm să aveți în vedere faptul că alte saituri web pot avea o legătur
 Puteți limita vizualizarea selectând tipul jurnalului, numele de utilizator sau pagina afectată.',
 'logempty' => 'Nici o înregistrare în jurnal.',
 'log-title-wildcard' => 'Caută titluri care încep cu acest text',
+'showhideselectedlogentries' => 'Arată/ascunde intrările selectate din jurnal',
 
 # Special:AllPages
 'allpages' => 'Toate paginile',
@@ -2158,6 +2170,11 @@ Puteți limita vizualizarea selectând tipul jurnalului, numele de utilizator sa
 'allpages-bad-ns' => '{{SITENAME}} nu are spațiul de nume „$1”.',
 'allpages-hide-redirects' => 'Ascunde redirecționările',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'În acest moment vizualizați o versiune din cache a acestei pagini, versiune care poate avea o vechime de $1.',
+'cachedspecial-viewing-cached-ts' => 'În acest moment vizualizați o versiune din cache a acestei pagini, versiune care poate fi incomplet actualizată.',
+'cachedspecial-refresh-now' => 'Ultima versiune.',
+
 # Special:Categories
 'categories' => 'Categorii',
 'categoriespagetext' => '{{PLURAL:$1|Următoarea categorie conține|Următoarele categorii conțin}} pagini sau fișiere.
@@ -2594,8 +2611,8 @@ Precizați motivul blocării; de exemplu indicați paginile vandalizate de acest
 'ipb-confirm' => 'Confirmare blocare',
 'badipaddress' => 'Adresa IP este invalidă.',
 'blockipsuccesssub' => 'Utilizatorul a fost blocat',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a fost blocată.<br />
-Vezi [[Special:BlockList|lista de adrese IP și conturi blocate]] pentru a revizui adresele blocate.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] a fost blocat{{GENDER:$1||ă|}}.<br />
+Vedeți [[Special:BlockList|lista blocărilor]] pentru a revizui adresele blocate.',
 'ipb-blockingself' => 'Sunteți pe cale să vă autoblocați! Sunteți sigur că doriți să continuați?',
 'ipb-confirmhideuser' => 'Sunteți pe cale să blocați un utilizator cu funcția „ascunde utilizator” activată. Acest lucru va înlătura numele său de utilizator din toate listele și jurnalele. Sunteți sigur că vreți să continuați?',
 'ipb-edit-dropdown' => 'Modifică motivele blocării',
@@ -2648,7 +2665,7 @@ Jurnalul blocărilor este indicat mai jos:',
 Jurnalul suprimărilor este indicat mai jos:',
 'blocklogentry' => 'a blocat utilizatorul „[[$1]]” pe o perioadă de $2 $3',
 'reblock-logentry' => 'a fost schimbată blocarea pentru [[$1]] cu data expirării la $2 $3',
-'blocklogtext' => 'Acest jurnal cuprinde acțiunile de blocare și deblocare. Adresele IP blocate automat nu sunt afișate. Vizitați [[Special:BlockList|lista de adrese blocate]] pentru o listă explicită a adreselor blocate în acest moment.',
+'blocklogtext' => 'Acest jurnal cuprinde acțiunile de blocare și deblocare. Adresele IP blocate automat nu sunt afișate. Vizitați [[Special:BlockList|lista blocărilor]] pentru o listă explicită a adreselor blocate în acest moment.',
 'unblocklogentry' => 'a deblocat utilizatorul $1',
 'block-log-flags-anononly' => 'doar utilizatorii anonimi',
 'block-log-flags-nocreate' => 'crearea de conturi dezactivată',
@@ -2747,7 +2764,7 @@ automat odată cu aceasta '''afară de cazul că''':
 manual paginile de discuții, dacă dorești acest lucru.",
 'movearticle' => 'Pagina de redenumit:',
 'moveuserpage-warning' => "'''Atenție''': sunteți pe cale să redenumiți o pagină de utilizator. Vă rugăm să rețineți că singura redenumită va fi pagina, nu și utilizatorul.",
-'movenologin' => 'Nu ești autentificat',
+'movenologin' => 'Nu sunteți autentificat{{GENDER:||ă}}.',
 'movenologintext' => 'Trebuie să fii un utilizator înregistrat și să te [[Special:UserLogin|autentifici]] pentru a muta o pagină.',
 'movenotallowed' => 'Nu ai permisiunea să muți pagini.',
 'movenotallowedfile' => 'Nu ai permisiunea de a muta fișiere.',
@@ -3026,7 +3043,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'spamprotectionmatch' => 'Următorul text a fost oferit de filtrul de spam: $1',
 'spambot_username' => 'Curățarea de spam a MediaWiki',
 'spam_reverting' => 'Revenire la ultima versiune care nu conține legături către $1',
-'spam_blanking' => 'Toate reviziile conținând legături către $1, au eșuat',
+'spam_blanking' => 'Toate versiunile conținând legături către $1 au fost golite',
+'spam_deleting' => 'Toate versiunile conținând legături către $1 au fost șterse',
 
 # Info page
 'pageinfo-title' => 'Informații pentru „$1”',
@@ -3095,7 +3113,7 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'file-info-size-pages' => '$1 × $2 pixeli, mărime fișier: $3, tip MIME: $4, $5 {{PLURAL:$5|pagină|pagini}}',
 'file-nohires' => 'Rezoluții mai mari nu sunt disponibile.',
 'svg-long-desc' => 'fișier SVG, cu dimensiunea nominală de $1 × $2 pixeli, mărime fișier: $3',
-'show-big-image' => 'Mărește rezoluția imaginii',
+'show-big-image' => 'Rezoluție maximă',
 'show-big-image-preview' => 'Mărimea acestei previzualizări: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Altă rezoluție|Alte rezoluții}}: $1.',
 'show-big-image-size' => '$1 × $2 pixeli',
@@ -3733,6 +3751,9 @@ MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GAR
 'version-software' => 'Software instalat',
 'version-software-product' => 'Produs',
 'version-software-version' => 'Versiune',
+'version-entrypoints' => 'URL-uri pentru puncte de intrare',
+'version-entrypoints-header-entrypoint' => 'Punct de intrare',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Cale fișier',
@@ -3813,11 +3834,11 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 # Database error messages
 'dberr-header' => 'Acest site are o problemă',
 'dberr-problems' => 'Ne cerem scuze! Acest site întâmpină dificultăți tehnice.',
-'dberr-again' => 'Așteaptă câteva minute și încearcă din nou.',
+'dberr-again' => 'Așteptați câteva minute și încercați din nou.',
 'dberr-info' => '(Nu pot contacta baza de date a serverului: $1)',
-'dberr-usegoogle' => 'Între timp poți efectua căutarea folosind Google.',
-'dberr-outofdate' => 'De reținut ca indexarea conținutului nostru de către ei poate să nu fie actualizată.',
-'dberr-cachederror' => 'Următoarea pagină este o copie în cache a paginii cerute, s-ar putea să nu fie actualizată.',
+'dberr-usegoogle' => 'Între timp puteți efectua căutarea folosind Google.',
+'dberr-outofdate' => 'De reținut că indexarea conținutului nostru de către ei poate să nu fie actualizată.',
+'dberr-cachederror' => 'Următoarea pagină este o copie în cache a paginii cerute, care s-ar putea să nu fie actualizată.',
 
 # HTML forms
 'htmlform-invalid-input' => 'Există probleme la valorile introduse',
@@ -3921,4 +3942,15 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'api-error-uploaddisabled' => 'Încărcarea este dezactivată pe acest wiki.',
 'api-error-verification-error' => 'Acest fișier ar putea fi corupt sau poate avea extensia greșită.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secundă|secunde|de secunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minute|de minute}}',
+'duration-hours' => '$1 {{PLURAL:$1|oră|ore|de ore}}',
+'duration-days' => '$1 {{PLURAL:$1|zi|zile|de zile}}',
+'duration-weeks' => '$1 {{PLURAL:$1|săptămână|săptămâni|de săptămâni}}',
+'duration-years' => '$1 {{PLURAL:$1|an|ani|de ani}}',
+'duration-decades' => '$1 {{PLURAL:$1|deceniu|decenii|de decenii}}',
+'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
+'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
+
 );
index 42fcc18..6a8fff5 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tarandíne (Tarandíne)
+/** tarandíne (tarandíne)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -30,7 +30,7 @@ $messages = array(
 'tog-hidepatrolled' => "Scunne le cangiaminde condrollete jndr'à le cangiaminde recende",
 'tog-newpageshidepatrolled' => "Scunne le pàggene tenute sotte condrolle da 'a liste de le pàggene nuève",
 'tog-extendwatchlist' => "Spanne 'a liste de le pàggene condrollete pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
-'tog-usenewrc' => "Ause le cangiaminde recende migliorate (richiede 'u JavaScript)",
+'tog-usenewrc' => "Ause le cangiaminde recende migliorate (vole 'u JavaScript)",
 'tog-numberheadings' => 'Testete auto-numerete',
 'tog-showtoolbar' => "Fà vedè 'a barra de le cangiaminde (JavaScript)",
 'tog-editondblclick' => "Cange le pàggene cu 'nu doppie clic (JavaScript)",
@@ -725,7 +725,8 @@ Arrecuerdete ca jndr'à le file personalizzete .css e .js s'ause scrivere le tit
 'updated' => '(Cangiete)',
 'note' => "'''Vide Bbuene:'''",
 'previewnote' => "'''Arrecuerdete queste è sole 'n'andeprime.'''
-le cangiaminde non g'onne state angore reggistrate! [[#editform|→ Condinue cu 'u cangiamende]]",
+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,10 @@ 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)",
+'node-count-exceeded-category' => "Pàggene addò 'u cunde de le node ha sbunnate",
+'node-count-exceeded-warning' => "Pagene ha sbunnate 'u condegge de le node",
+'expansion-depth-exceeded-category' => "Pàggene addò 'a profonnetà de l'espanzione jè supranate",
+'expansion-depth-exceeded-warning' => "Pàggene ca sbonnane 'a profonnetà de espanzione",
 
 # "Undo" feature
 'undo-success' => "'U cangiamende pò essere annullate.
@@ -970,7 +975,7 @@ Pe piacere condrolle l'archivije.",
 # Suppression log
 'suppressionlog' => 'Archivie de le soppressiune',
 'suppressionlogtext' => "Sotte stè 'n'elenghe de scangellaminde e blocche sus a le condenute scunnute da l'amministrature.
-Vide l'[[Special:BlockList|elenghe de le IP bloccate]] pa liste de le operazziune corrende de espulsione e blocche.",
+Vide l'[[Special:BlockList|elenghe de le IP bloccate]] pe l'elenghe de le operazziune corrende de espulsione e blocche.",
 
 # History merging
 'mergehistory' => "Scuagghie 'a storie de le pàggene",
@@ -1004,8 +1009,9 @@ Vide Bbuene ca ausanne le collegaminde de navigazzione sta culonne avène azzera
 'mergelogpagetext' => "Stte stè 'na liste de le cchiù recende scuagghiaminde de le cunde de le vosce jndr'à 'n'otre.",
 
 # Diffs
-'history-title' => 'Liste de le versiune de "$1"',
-'difference' => "(Differenze 'mbrà versiune)",
+'history-title' => '$1: Cunde de le revisiune',
+'difference-title' => "$1: Differenze 'mbrà revisiune",
+'difference-title-multipage' => "$1 e $2: Differenze 'mbrà le pàggene",
 'difference-multipage' => "(Differenze 'mbrà le pàggene)",
 'lineno' => 'Linea $1:',
 'compareselectedversions' => 'Combronde le versiune selezionete',
@@ -1103,6 +1109,7 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
 'prefs-beta' => 'Funziune de Beta',
 'prefs-datetime' => 'Date e ore',
 'prefs-labs' => 'Funziune de Labs',
+'prefs-user-pages' => "Pàgene de l'utende",
 'prefs-personal' => "Profile de l'utende",
 'prefs-rc' => 'Cangiaminde recende',
 'prefs-watchlist' => 'Pàggene condrollete',
@@ -1369,7 +1376,7 @@ Ce tu 'u mitte, a fatje ca è fatte t'avène ricanusciute.",
 'nchanges' => '$1 {{PLURAL:$1|cangiaminde|cangiaminde}}',
 'recentchanges' => 'Cangiaminde recende',
 'recentchanges-legend' => 'Opzione pe le cangiaminde recende',
-'recentchangestext' => 'Tracce le cchiù recednde cangiaminde de Uicchi sus a sta pàgene.',
+'recentchanges-summary' => 'Tracce le cchiù recednde cangiaminde de Uicchi sus a sta pàgene.',
 'recentchanges-feed-description' => "Tracce le urteme cangiaminde sus 'a sta Uicchipedie jndr'à quiste feed.",
 'recentchanges-label-newpage' => "Stu cangiamende ha ccrejate 'na pàgena nove",
 'recentchanges-label-minor' => "Quiste ète 'nu cangiamende stuèdeche",
@@ -1584,8 +1591,12 @@ Ce 'u probbleme angore jè presende, condatte 'n'[[Special:ListUsers/sysop|ammin
 'backend-fail-writetemp' => 'Non ge pozze scrivere sus a file temboranèe.',
 'backend-fail-closetemp' => 'Non ge pozze achiudere file temboranèe.',
 'backend-fail-read' => "Non ge pozze leggere 'u file $1.",
-'backend-fail-create' => "Non ge pozze ccrejà 'u file $1.",
+'backend-fail-create' => "Non ge pozze scrivere '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-synced' => "'U file \"\$1\" jè jndr'à 'nu state ingonsistende jndr'à l'archivije inderne",
 '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\".",
+'backend-fail-contenttype' => 'Non ge pozze capìe \'u tipe de condenute d\'u file da reggistrà sus a "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'Non ge pozze sbloccà "$1"; jidde non g\'è bloccate.',
@@ -1922,6 +1933,11 @@ Pò condenè une  cchiù carattere ca non ge ponne essere ausate jndr'à le tite
 'allpages-bad-ns' => '{{SITENAME}} non ge tène \'u namaspace "$1".',
 'allpages-hide-redirects' => 'Scunne le redirezionaminde',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => "Tu ste vide 'na versione jndr'à cache de sta pàgene, 'a quale pò essere aggiornate a $1 fà.",
+'cachedspecial-viewing-cached-ts' => "Tu ste vide 'na versione jndr'à cache de sta pàgene, 'a quale pò essere ca non g'è attuale.",
+'cachedspecial-refresh-now' => "Vide l'urteme.",
+
 # Special:Categories
 'categories' => 'Le Categorije',
 'categoriespagetext' => "{{PLURAL:$1|'A seguende categorije tène|Le seguende categorije tènene}} pàggene o media.
@@ -2427,7 +2443,7 @@ L'archivije de le soppressiune 'u puè acchià aqquà sotte pe riferimende:",
 'blocklogentry' => "blocchete [[$1]] pe 'nu timbe de $2 $3",
 'reblock-logentry' => "cangiate l'imbostazione de le blocche pe [[$1]] cu 'na data de scadenze de $2 $3",
 'blocklogtext' => "Quiste è l'archivije de l'aziune de blocche e sblocche pe l'utinde.
-L'indirizze IP automaticamende bloccate non ge stonne jndr'à liste.
+L'indirizze IP automaticamende bloccate non ge stonne jndr'à l'elenghe.
 Vide 'a [[Special:BlockList|liste de le IP bloccate]] pa liste de le operaziune de ban e blocche ca stonne attive mò.",
 'unblocklogentry' => 'sblocchete $1',
 'block-log-flags-anononly' => "sulamende l'utinde anonime",
@@ -2679,6 +2695,8 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-invalid-interwiki' => "Non ge pozze 'mbortà da 'a Uicchi specificate.",
 'import-error-edit' => 'Pàgene "$1" non g\' \'mbortate purcé tu non ge tìne le permesse pe cangiarle.',
 'import-error-create' => 'Pàgene "$1" non g\' \'mbortate purcé tu non ge tìne le permesse pe ccrejarle.',
+'import-error-interwiki' => 'Pagene "$1" non g\'ha state \'mbortate purcé \'u nome sue jè riservate pe collegaminde esterne (interuicchi).',
+'import-error-special' => "'A pagena \"\$1\" non g'ha state 'mbortate purcé apponde a 'nu namespace speciale ca non g'è permesse a le pàggene normale.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
 
 # Import log
@@ -2694,7 +2712,11 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'javascripttest-disabled' => "Sta funzione non g'à state abbilitate sus a sta Uicchi.",
 'javascripttest-title' => 'Stoche a esegue $1 test',
 '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-pagetext-skins' => "Scacchie 'n'aspette pe eseguì le test cu:",
+'javascripttest-qunit-intro' => "Vide 'a [$1 documendazione d'u test] sus a mediawiki.org.",
+'javascripttest-qunit-heading' => 'Ambiende de test MediaUicchi JavaScript QUnit',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "'A pàgene utende meje",
@@ -3718,6 +3740,9 @@ Avisse avè ricevute [{{SERVER}}{{SCRIPTPATH}}/COPYING 'na copie d'a GNU (Licenz
 'version-software' => 'Softuer installete',
 'version-software-product' => 'Prodotte',
 'version-software-version' => 'Versione',
+'version-entrypoints' => 'Punde de ingresse de le URL',
+'version-entrypoints-header-entrypoint' => "Punde d'ingresse",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => "Percorse d'u fail",
@@ -3871,15 +3896,21 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 # API errors
 'api-error-badaccess-groups' => 'Tu non ge puè carecà file sus a sta Uicchi.',
 'api-error-badtoken' => 'Errore inderne: Gettone errate.',
+'api-error-copyuploaddisabled' => "'U carecamende da URL jè disabbilitate sus a stu server.",
+'api-error-duplicate' => "{{PLURAL:$1|Stè [$2 'n'otre file]|Stonne [$2 otre file]}} sus a 'u site cu 'u stesse condenute.",
+'api-error-duplicate-archive-popup-title' => "Dupliche {{PLURAL:$1|'u file ca ha state|le file ca onne state}} scangellate.",
 '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-internal-error' => "Errore inderne: Quaccheccose ha sciute male mendre ca ste processamme 'u carecamende tune sus 'a uicchi.",
 'api-error-invalid-file-key' => "Errore inderne: 'U file non ge se iacchie jndr'à memorie temboranèe.",
 'api-error-missingparam' => 'Errore inderne: Parametre mangande sus a richieste.',
 'api-error-missingresult' => "Errore inderne: Non ge se pò determinà ce 'a copie ha state fatte.",
@@ -3899,4 +3930,15 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'api-error-uploaddisabled' => 'Le carecaminde sonde disabbilitate sus a sta Uicchi.',
 'api-error-verification-error' => "Stu file pò essere scuasciate, o ave 'n'estenzione sbagliate.",
 
+# Durations
+'duration-seconds' => '{{PLURAL:$1|seconde|seconde}}',
+'duration-minutes' => '{{PLURAL:$1|minute|minute}}',
+'duration-hours' => '{{PLURAL: $1|ore|ore}}',
+'duration-days' => '$1 {{PLURAL:$1|sciurne|sciurne}}',
+'duration-weeks' => '{{PLURAL: $1|sumàne|sumàne}}',
+'duration-years' => '{{PLURAL: $1|anne|anne}}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decade}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sechele|sechele}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennie|millennie}}',
+
 );
index 8359bb6..d37ca15 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Russian (Русский)
+/** Russian (русский)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -8,6 +8,7 @@
  * @file
  *
  * @author AVRS
+ * @author Agilight
  * @author Ahonc
  * @author Aleksandrit
  * @author Alessandro
@@ -15,6 +16,7 @@
  * @author Alexander Sigachov (alexander.sigachov@gmail.com)
  * @author Alexandr Efremov
  * @author Amikeco
+ * @author Amire80
  * @author Askarmuk
  * @author Assele
  * @author Bouron
@@ -22,6 +24,7 @@
  * @author Claymore
  * @author Comp1089
  * @author DCamer
+ * @author Daniyar
  * @author Dim Grits
  * @author Don Alessandro
  * @author Eleferen
@@ -39,6 +42,7 @@
  * @author Illusion
  * @author Iniquity
  * @author Innv
+ * @author Jackie
  * @author JenVan
  * @author Jl
  * @author KPu3uC B Poccuu
  * @author Kv75
  * @author Lockal
  * @author MaxSem
+ * @author Ola
  * @author Ole Yves
  * @author Putnik
  * @author Rave
  * @author Rubin
+ * @author Sagan
  * @author Sk
  * @author TarzanASG
  * @author Temuri rajavi
  * @author VasilievVV
  * @author Ytsukeng Fyvaprol
  * @author Александр Сигачёв
+ * @author Гусейн
  * @author ОйЛ
  * @author לערי ריינהארט
  * @author გიორგიმელა
  */
 
-/**
- * Изменения сделанные в этом файле будут потеряны при обновлении MediaWiki.
- *
- * Если необходимо внести изменения в перевод отдельных строк интерфейса,
- * сделайте это посредством редактирования страниц вида «MediaWiki:*».
- * Их список можно найти на странице «Special:Allmessages».
- */
-
-$separatorTransformTable = array(
-       ',' => "\xc2\xa0", # nbsp
-       '.' => ','
-);
-
-$fallback8bitEncoding = 'windows-1251';
-$linkPrefixExtension = false;
-
 $namespaceNames = array(
        NS_MEDIA            => 'Медиа',
        NS_SPECIAL          => 'Служебная',
@@ -109,32 +100,91 @@ $namespaceGenderAliases = array(
        NS_USER_TALK => array( 'male' => 'Обсуждение_участника', 'female' => 'Обсуждение_участницы' ),
 );
 
-$dateFormats = array(
-       'mdy time' => 'H:i',
-       'mdy date' => 'xg j, Y',
-       'mdy both' => 'H:i, xg j, Y',
-
-       'dmy time' => 'H:i',
-       'dmy date' => 'j xg Y',
-       'dmy both' => 'H:i, j xg Y',
-
-       'ymd time' => 'H:i',
-       'ymd date' => 'Y xg j',
-       'ymd both' => 'H:i, Y xg j',
-
-       'ISO 8601 time' => 'xnH:xni:xns',
-       'ISO 8601 date' => 'xnY-xnm-xnd',
-       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-
-);
-
-$bookstoreList = array(
-       'Поиск по библиотекам «Сигла»' => 'http://www.sigla.ru/results.jsp?f=7&t=3&v0=$1',
-       'Findbook.ru' => 'http://findbook.ru/search/d0?ptype=4&pvalue=$1',
-       'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
-       'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
-       'Books.Ru' => 'http://www.books.ru/shop/search?query=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Активные_участники' ),
+       'Allmessages'               => array( 'Системные_сообщения' ),
+       'Allpages'                  => array( 'Все_страницы' ),
+       'Blankpage'                 => array( 'Пустая_страница' ),
+       'Block'                     => array( 'Заблокировать' ),
+       'Blockme'                   => array( 'Заблокируй_меня' ),
+       'Booksources'               => array( 'Источники_книг' ),
+       'BrokenRedirects'           => array( 'Разорванные_перенаправления' ),
+       'Categories'                => array( 'Категории' ),
+       'ChangeEmail'               => array( 'Сменить_e-mail' ),
+       'ChangePassword'            => array( 'Сменить_пароль' ),
+       'ComparePages'              => array( 'Сравнение_страниц' ),
+       'Confirmemail'              => array( 'Подтвердить_e-mail' ),
+       'Contributions'             => array( 'Вклад' ),
+       'CreateAccount'             => array( 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ),
+       'Deadendpages'              => array( 'Тупиковые_страницы' ),
+       'DeletedContributions'      => array( 'Удалённый_вклад' ),
+       'Disambiguations'           => array( 'Неоднозначности' ),
+       'DoubleRedirects'           => array( 'Двойные_перенаправления' ),
+       'EditWatchlist'             => array( 'Править_список_наблюдения' ),
+       'Emailuser'                 => array( 'Письмо_участнику', 'Отправить_письмо' ),
+       'Export'                    => array( 'Экспорт', 'Выгрузка' ),
+       'FileDuplicateSearch'       => array( 'Поиск_дубликатов_файлов' ),
+       'Filepath'                  => array( 'Путь_к_файлу' ),
+       'Import'                    => array( 'Импорт' ),
+       'BlockList'                 => array( 'Список_блокировок', 'Блокировки' ),
+       'LinkSearch'                => array( 'Поиск_ссылок' ),
+       'Listadmins'                => array( 'Список_администраторов' ),
+       'Listbots'                  => array( 'Список_ботов' ),
+       'Listfiles'                 => array( 'Список_файлов', 'Список_изображений' ),
+       'Listgrouprights'           => array( 'Права_групп_участников', 'Список_прав_групп' ),
+       'Listredirects'             => array( 'Список_перенаправлений' ),
+       'Listusers'                 => array( 'Список_участников' ),
+       'Lockdb'                    => array( 'Заблокировать_БД', 'Заблокировать_базу_данных' ),
+       'Log'                       => array( 'Журналы', 'Журнал' ),
+       'Lonelypages'               => array( 'Изолированные_страницы' ),
+       'Longpages'                 => array( 'Длинные_страницы' ),
+       'MergeHistory'              => array( 'Объединение_историй' ),
+       'MIMEsearch'                => array( 'Поиск_по_MIME' ),
+       'Mostimages'                => array( 'Самые_используемые_файлы' ),
+       'Movepage'                  => array( 'Переименовать_страницу', 'Переименование', 'Переименовать' ),
+       'Mycontributions'           => array( 'Мой_вклад' ),
+       'Mypage'                    => array( 'Моя_страница' ),
+       'Mytalk'                    => array( 'Моё_обсуждение' ),
+       'Myuploads'                 => array( 'Мои_загрузки' ),
+       'Newimages'                 => array( 'Новые_файлы' ),
+       'Newpages'                  => array( 'Новые_страницы' ),
+       'PasswordReset'             => array( 'Сброс_пароля' ),
+       'PermanentLink'             => array( 'Постоянная_ссылка' ),
+       'Popularpages'              => array( 'Популярные_страницы' ),
+       'Preferences'               => array( 'Настройки' ),
+       'Protectedpages'            => array( 'Защищённые_страницы' ),
+       'Protectedtitles'           => array( 'Защищённые_названия' ),
+       'Randompage'                => array( 'Случайная_страница', 'Случайная' ),
+       'Recentchanges'             => array( 'Свежие_правки' ),
+       'Recentchangeslinked'       => array( 'Связанные_правки' ),
+       'Revisiondelete'            => array( 'Удаление_правки' ),
+       'Search'                    => array( 'Поиск' ),
+       'Shortpages'                => array( 'Короткие_страницы' ),
+       'Specialpages'              => array( 'Спецстраницы' ),
+       'Statistics'                => array( 'Статистика' ),
+       'Tags'                      => array( 'Метки' ),
+       'Unblock'                   => array( 'Разблокировка' ),
+       'Uncategorizedcategories'   => array( 'Некатегоризованные_категории' ),
+       'Uncategorizedimages'       => array( 'Некатегоризованные_файлы' ),
+       'Uncategorizedpages'        => array( 'Некатегоризованные_страницы' ),
+       'Uncategorizedtemplates'    => array( 'Некатегоризованные_шаблоны' ),
+       'Undelete'                  => array( 'Восстановить', 'Восстановление' ),
+       'Unusedcategories'          => array( 'Неиспользуемые_категории' ),
+       'Unusedimages'              => array( 'Неиспользуемые_файлы' ),
+       'Unusedtemplates'           => array( 'Неиспользуемые_шаблоны' ),
+       'Upload'                    => array( 'Загрузка' ),
+       'UploadStash'               => array( 'Скрытная_загрузка' ),
+       'Userlogin'                 => array( 'Вход' ),
+       'Userlogout'                => array( 'Завершение_сеанса', 'Выход' ),
+       'Userrights'                => array( 'Управление_правами' ),
+       'Version'                   => array( 'Версия' ),
+       'Wantedcategories'          => array( 'Требуемые_категории' ),
+       'Wantedfiles'               => array( 'Требуемые_файлы' ),
+       'Wantedpages'               => array( 'Требуемые_страницы' ),
+       'Wantedtemplates'           => array( 'Требуемые_шаблоны' ),
+       'Watchlist'                 => array( 'Список_наблюдения' ),
+       'Whatlinkshere'             => array( 'Ссылки_сюда' ),
+       'Withoutinterwiki'          => array( 'Без_интервики' ),
 );
 
 $magicWords = array(
@@ -288,6 +338,51 @@ $magicWords = array(
        'url_query'               => array( '0', 'ЗАПРОС', 'QUERY' ),
 );
 
+
+$dateFormats = array(
+       'mdy time' => 'H:i',
+       'mdy date' => 'xg j, Y',
+       'mdy both' => 'H:i, xg j, Y',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j xg Y',
+       'dmy both' => 'H:i, j xg Y',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y xg j',
+       'ymd both' => 'H:i, Y xg j',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+
+);
+
+$bookstoreList = array(
+       'Поиск по библиотекам «Сигла»' => 'http://www.sigla.ru/results.jsp?f=7&t=3&v0=$1',
+       'Findbook.ru' => 'http://findbook.ru/search/d0?ptype=4&pvalue=$1',
+       'Яндекс.Маркет' => 'http://market.yandex.ru/search.xml?text=$1',
+       'ОЗОН' => 'http://www.ozon.ru/?context=advsearch_book&isbn=$1',
+       'Books.Ru' => 'http://www.books.ru/shop/search?query=$1',
+       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+);
+
+/**
+ * Изменения сделанные в этом файле будут потеряны при обновлении MediaWiki.
+ *
+ * Если необходимо внести изменения в перевод отдельных строк интерфейса,
+ * сделайте это посредством редактирования страниц вида «MediaWiki:*».
+ * Их список можно найти на странице «Special:Allmessages».
+ */
+
+$separatorTransformTable = array(
+       ',' => "\xc2\xa0", # nbsp
+       '.' => ','
+);
+
+$fallback8bitEncoding = 'windows-1251';
+$linkPrefixExtension = false;
+
 $imageFiles = array(
        'button-bold'   => 'cyrl/button_bold.png',
        'button-italic' => 'cyrl/button_italic.png',
@@ -304,7 +399,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Скрывать патрулированные правки в списке свежих правок',
 'tog-newpageshidepatrolled' => 'Скрывать отпатрулированные страницы в списке новых страниц',
 'tog-extendwatchlist' => 'Расширенный список наблюдения, включающий все изменения, а не только последние',
-'tog-usenewrc' => 'Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\83лÑ\83Ñ\87Ñ\88еннÑ\8bй Ñ\81пиÑ\81ок Ñ\81вежиÑ\85 Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ (требуется JavaScript)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83ппиÑ\80оваÑ\82Ñ\8c Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81вежиÑ\85 Ð¿Ñ\80авок Ð¸ Ð² Ñ\81пиÑ\81ке Ð½Ð°Ð±Ð»Ñ\8eдениÑ\8f (требуется JavaScript)',
 'tog-numberheadings' => 'Автоматически нумеровать заголовки',
 'tog-showtoolbar' => 'Показывать верхнюю панель инструментов при редактировании (JavaScript)',
 'tog-editondblclick' => 'Править страницы по двойному щелчку (JavaScript)',
@@ -342,6 +437,7 @@ $messages = array(
 'tog-ccmeonemails' => 'Отправлять мне копии писем, которые я посылаю другим участникам',
 'tog-diffonly' => 'Не показывать содержание страницы под сравнением двух версий',
 'tog-showhiddencats' => 'Показывать скрытые категории',
+'tog-noconvertlink' => 'Отключить ссылку на преобразование заголовка',
 'tog-norollbackdiff' => 'Не показывать разницу версий после выполнения отката',
 
 'underline-always' => 'Всегда',
@@ -473,7 +569,7 @@ $messages = array(
 'searchbutton' => 'Найти',
 'go' => 'Перейти',
 'searcharticle' => 'Перейти',
-'history' => 'история',
+'history' => 'Ð\98стория',
 'history_short' => 'история',
 'updatedmarker' => 'обновлено после моего последнего посещения',
 'printableversion' => 'Версия для печати',
@@ -686,6 +782,10 @@ $2',
 'filereadonlyerror' => "Не удаётся изменить файл «$1», так как хранилище «$2» находится в режиме «только для чтения».
 
 Установивший этот режим администратор оставил следующее разъяснение: «''$3''».",
+'invalidtitle-knownnamespace' => 'Недопустимый заголовок с пространством имен «$2» и текстом «$3»',
+'invalidtitle-unknownnamespace' => 'Недопустимый заголовок с неизвестным номером пространства $1 и текстом «$2»',
+'exception-nologin' => 'Вы не представились системе',
+'exception-nologin-text' => 'Для просмотра этой станицы или выполнения запрошенного действия необходимо представиться системе.',
 
 # Virus scanner
 'virus-badscanner' => "Ошибка настройки. Неизвестный сканер вирусов: ''$1''",
@@ -983,7 +1083,8 @@ $2
 'updated' => '(Обновлена)',
 'note' => "'''Примечание:'''",
 'previewnote' => "'''Помните, что это только предварительный просмотр.'''
-Ваши изменения ещё не были записаны! [[#editform|→ продолжить редактирование]]",
+Ваши изменения ещё не были сохранены!",
+'continue-editing' => 'Продолжить редактирование',
 'previewconflict' => 'Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.',
 'session_fail_preview' => "'''К сожалению, сервер не смог обработать вашу правку из-за потери идентификатора сессии.
 Пожалуйста, попробуйте ещё раз.
@@ -998,7 +1099,7 @@ $2
 в окне редактирования. Правка была отменена для предотвращения искажения текста статьи.
 Подобные проблемы могут возникать при использовании анонимизирующих веб-прокси, содержащих ошибки.'''",
 'edit_form_incomplete' => "'''Некоторые части формы редактирования не достигли сервера. Внимательно проверьте, что ваши правки не повреждены, и попробуйте ещё раз.'''",
-'editing' => 'Редактирование: $1',
+'editing' => 'Редактирование $1',
 'creating' => 'Создание $1',
 'editingsection' => 'Редактирование: $1 (раздел)',
 'editingcomment' => 'Редактирование $1 (новый раздел)',
@@ -1082,6 +1183,12 @@ $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' => 'На странице превышен предел вложенности',
+'parser-unstrip-loop-warning' => 'Обнаружен незакрытый pre',
+'parser-unstrip-recursion-limit' => 'Превышен предел рекурсии ($1)',
 
 # "Undo" feature
 'undo-success' => 'Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.',
@@ -1258,13 +1365,14 @@ $1",
 
 # Diffs
 'history-title' => '$1 — история изменений',
-'difference' => '(Различия между версиями)',
+'difference-title' => '$1 — различия между версиями',
+'difference-title-multipage' => 'Разница между страницами «$1» и «$2»',
 'difference-multipage' => '(Различия между страницами)',
 'lineno' => 'Строка $1:',
 'compareselectedversions' => 'Сравнить выбранные версии',
 'showhideselectedversions' => 'Показать/скрыть выбранные версии',
 'editundo' => 'отменить',
-'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников|$2 участников}})',
+'diff-multi' => '({{PLURAL:$1|не показана $1 промежуточная версия|не показаны $1 промежуточные версии|не показаны $1 промежуточных версий}} {{PLURAL:$2|$2 участника|$2 участников}})',
 'diff-multi-manyusers' => '(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показаны $1 промежуточных версий}}, сделанные более чем $2 {{PLURAL:$2|участником|участниками}})',
 
 # Search results
@@ -1290,7 +1398,7 @@ $1",
 'searchhelp-url' => 'Help:Содержание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать страницы с этим префиксом]]',
 'searchprofile-articles' => 'Основные страницы',
-'searchprofile-project' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81пÑ\80авки Ð¸ Ð¿Ñ\80оекÑ\82ов',
+'searchprofile-project' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81пÑ\80авки Ð¸ Ð¿Ñ\80оекÑ\82а',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Везде',
 'searchprofile-advanced' => 'Расширенный',
@@ -1353,6 +1461,7 @@ $1",
 'prefs-beta' => 'Бета-возможности',
 'prefs-datetime' => 'Дата и время',
 'prefs-labs' => 'Экспериментальные возможности',
+'prefs-user-pages' => 'Страницы участника',
 'prefs-personal' => 'Личные данные',
 'prefs-rc' => 'Свежие правки',
 'prefs-watchlist' => 'Список наблюдения',
@@ -1616,7 +1725,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|изменение|изменения|изменений}}',
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
-'recentchangestext' => 'Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-summary' => 'Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.',
 'recentchanges-feed-description' => 'Отслеживать последние изменения в вики в этом потоке.',
 'recentchanges-label-newpage' => 'Этой правкой была создана новая страница.',
 'recentchanges-label-minor' => 'Это незначительное изменение',
@@ -1643,7 +1752,7 @@ $1",
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]',
 'rc_categories' => 'Только из категорий (разделитель «|»)',
 'rc_categories_any' => 'Любой',
-'rc-change-size-new' => 'Размер после изменения: {{PLURAL:$1|байт|байта|байт}}',
+'rc-change-size-new' => 'Размер после изменения: $1 {{PLURAL:$1|байт|байта|байт}}',
 'newsectionsummary' => '/* $1 */ новая тема',
 'rc-enhanced-expand' => 'Показать подробности (используется JavaScript)',
 'rc-enhanced-hide' => 'Скрыть подробности',
@@ -1821,14 +1930,15 @@ $1',
 'backend-fail-writetemp' => 'Не удалось записать во временный файл.',
 'backend-fail-closetemp' => 'Не удаётся закрыть временный файл.',
 'backend-fail-read' => 'Не удалось прочитать файл $1.',
-'backend-fail-create' => 'Не удалось создать файл $1.',
-'backend-fail-maxsize' => 'Не удалось создать файл $1, так как его размер превышает {{PLURAL:$2|$2 байт|$2 байта|$2 байт}}.',
+'backend-fail-create' => 'Не удалось записать файл $1.',
+'backend-fail-maxsize' => 'Не удалось записать файл $1, так как его размер превышает {{PLURAL:$2|$2 байт|$2 байта|$2 байт}}.',
 'backend-fail-readonly' => 'Хранилище «$1» сейчас находится в режиме «только чтение». Причина: «$2»',
 'backend-fail-synced' => 'Файл «$1» находится в несогласованном состоянии во внутреннем хранилище',
 'backend-fail-connect' => 'Не удалось подключиться к хранилищу «$1».',
 'backend-fail-internal' => 'Произошла неизвестная ошибка в хранилище «$1».',
 'backend-fail-contenttype' => 'Не удалось определить тип содержимого файла, чтобы сохранить его в «$1».',
 'backend-fail-batchsize' => 'Хранилище получило блок из $1 {{PLURAL:$1|файловой операции|файловых операций|файловых операций}}, ограничение составляет $2 {{PLURAL:$1|операцию|операции|файловых операций}}.',
+'backend-fail-usable' => 'Не удалось записать файл $1 из-за нехватки прав или отсутствия нужных папок.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не удалось подключиться к базе данных журнала для хранилища «$1».',
@@ -2149,6 +2259,7 @@ $1',
 Вы можете отфильтровать результаты по типу журнала, имени участника (учитывается регистр) или затронутой странице (также учитывается регистр).',
 'logempty' => 'Подходящие записи в журнале отсутствуют.',
 'log-title-wildcard' => 'Найти заголовки, начинающиеся с данных символов',
+'showhideselectedlogentries' => 'Показать/скрыть выбранные записи журнала',
 
 # Special:AllPages
 'allpages' => 'Все страницы',
@@ -2168,6 +2279,11 @@ $1',
 '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|Следующая категория содержит|Следующие категории содержат}} страницы или медиа-файлы.
@@ -2605,8 +2721,8 @@ $1',
 'ipb-confirm' => 'Подтвердить блокировку',
 'badipaddress' => 'IP-адрес записан в неправильном формате, или участника с таким именем не существует.',
 'blockipsuccesssub' => 'Блокировка произведена',
-'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] заблокирован.<br />
-См. [[Special:BlockList|список заблокированных IP-адресов]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] {{GENDER:$1|заблокирован|заблокирована}}.<br />
+См. [[Special:BlockList|список заблокированных IP-адресов]] для просмотра блокировок.',
 'ipb-blockingself' => 'Вы пытаетесь заблокировать себя самого! Вы уверены, что вы хотите это сделать?',
 'ipb-confirmhideuser' => 'Вы намереваетесь заблокировать участника и скрыть его имя. Оно не будет отображаться в списках и журналах. Вы уверены, что хотите это сделать?',
 'ipb-edit-dropdown' => 'Править список причин',
@@ -3013,12 +3129,20 @@ $1',
 'group-bureaucrat.css' => '/* Размещённый здесь CSS будет применяться только для бюрократов */',
 
 # Scripts
-'common.js' => '/* Размещённый здесь JavaScript код будет загружаться всем пользователям при обращении к каждой странице */',
-'standard.js' => '/* Размещённый здесь JavaScript код будет загружаться пользователям использующих тему оформления Standard */',
-'nostalgia.js' => '/* Размещённый здесь JavaScript код будет загружаться пользователям использующих тему оформления Nostalgia */',
-'cologneblue.js' => '/* Размещённый здесь JavaScript код будет загружаться пользователям использующих тему оформления Cologne Blue */',
-'monobook.js' => '/* Размещённый здесь JavaScript код будет загружаться пользователям использующих тему оформления MonoBook */',
-'vector.js' => '/* Указанный здесь JavaScript будет загружен всем участникам, использующим векторную тему оформления  */',
+'common.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям при обращении к каждой странице */',
+'standard.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Standard */',
+'nostalgia.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Nostalgia */',
+'cologneblue.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Cologne Blue */',
+'monobook.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MonoBook */',
+'myskin.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления MySkin  */',
+'chick.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Chick */',
+'simple.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Simple */',
+'modern.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Modern */',
+'vector.js' => '/* Размещённый здесь код JavaScript будет загружаться пользователям, использующим тему оформления Vector */',
+'group-autoconfirmed.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус автоподтверждённых (autoconfirmed) */',
+'group-bot.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус ботов (bots) */',
+'group-sysop.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус администраторов (sysops) */',
+'group-bureaucrat.js' => '/* Размещённый здесь код JavaScript будет загружаться только участникам, имеющим статус бюрократов (bureaucrats) */',
 
 # Metadata
 'notacceptable' => "Вики-сервер не может предоставить данные в формате, который мог бы прочитать ваш браузер.<br />
@@ -3044,6 +3168,7 @@ The wiki server can't provide data in a format your client can read.",
 'spambot_username' => 'Чистка спама',
 'spam_reverting' => 'Откат к последней версии, не содержащей ссылки на $1',
 'spam_blanking' => 'Все версии содержат ссылки на $1, очистка',
+'spam_deleting' => 'Все версии содержали ссылки на $1, производится удаление',
 
 # Info page
 'pageinfo-title' => 'Сведения по «$1»',
@@ -3762,9 +3887,24 @@ $5
 'iranian-calendar-m11' => 'Бахман',
 'iranian-calendar-m12' => 'Эсфанд',
 
+# Hijri month names
+'hijri-calendar-m1' => 'Мухаррам',
+'hijri-calendar-m2' => 'Сафар',
+'hijri-calendar-m3' => 'Рабиуль-Аввал',
+'hijri-calendar-m4' => 'Раби ас-сани',
+'hijri-calendar-m5' => 'Джумада аль-уля',
+'hijri-calendar-m6' => 'Джумада ас-сани',
+'hijri-calendar-m7' => 'Раджаб',
+'hijri-calendar-m8' => 'Шаабан',
+'hijri-calendar-m9' => 'Рамадан',
+'hijri-calendar-m10' => 'Шавваль',
+'hijri-calendar-m11' => 'Зулькада',
+'hijri-calendar-m12' => 'Зуль-Хиджа',
+
 # Hebrew month names
 'hebrew-calendar-m1' => 'Тишрей',
 'hebrew-calendar-m2' => 'Хешван',
+'hebrew-calendar-m3' => 'Кислев',
 'hebrew-calendar-m4' => 'Тевет',
 'hebrew-calendar-m5' => 'Шват',
 'hebrew-calendar-m6' => 'Адар',
@@ -3826,6 +3966,11 @@ MediaWiki распространяется в надежде, что она бу
 'version-software' => 'Установленное программное обеспечение',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версия',
+'version-entrypoints' => 'Адреса точек входа',
+'version-entrypoints-header-entrypoint' => 'Точка входа',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Путь к статье]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Путь к скрипту]',
 
 # Special:FilePath
 'filepath' => 'Путь к файлу',
@@ -4014,4 +4159,17 @@ 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|тысячелетие|тысячелетия|тысячелетий}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Не удалось получить блокировку на сервере  $1.',
 );
index 0f934fc..b30ccba 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Rusyn (Русиньскый)
+/** Rusyn (русиньскый)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Engelseziekte
  * @author Gazeb
  * @author Gleb Borisov
  * @author Kaganer
@@ -203,9 +204,9 @@ $messages = array(
 'vector-simplesearch-preference' => 'Поволити росшырены пропозіції гляданя (лем взгляд Vector )',
 'vector-view-create' => 'Створити',
 'vector-view-edit' => 'Едітовати',
-'vector-view-history' => 'Видїти історію',
+'vector-view-history' => 'Відїти історію',
 'vector-view-view' => 'Чітати',
-'vector-view-viewsource' => 'Видїти код',
+'vector-view-viewsource' => 'Відїти код',
 'actions' => 'Дїї',
 'namespaces' => 'Просторы назв',
 'variants' => 'Варіанты',
@@ -309,7 +310,7 @@ $1',
 'youhavenewmessagesmulti' => 'Маєте новы ознамы на $1',
 'editsection' => 'едіт.',
 'editold' => 'едіт.',
-'viewsourceold' => 'видїти код',
+'viewsourceold' => 'відїти код',
 'editlink' => 'едітовати',
 'viewsourcelink' => 'видїти код',
 'editsectionhint' => 'Едітовати секцію: $1',
@@ -376,9 +377,9 @@ $1',
 Адміністратор, котрый датабазу замкнув, охабив тото пояснїня: $1',
 'missing-article' => 'В датабазї ся не нашов жаданый текст сторінкы «$1» $2.
 
-Подобна сітуація звычайно взникає при спробі переходу по застаралому одказованю на історію змін сторінкы, яка была вымазана.
+Подобна сітуація звычайно выникать при спробі переходу по застаралому одказованю на історію змін сторінкы, яка была вымазана.
 
-Кідь то не є тот припад, може сьте нашли помылку в проґрамовім забезпечіню.
+Кідь то не є тот припад, може сьте нашли помылку в проґрамовім забеспечіню.
 Просиме Вас, оголоште то [[Special:ListUsers/sysop|адміністраторам]], придайте і URL.',
 'missingarticle-rev' => '(ревізія № $1)',
 'missingarticle-diff' => '(Роздїл: $1, $2)',
@@ -408,7 +409,7 @@ $1',
 'wrong_wfQuery_params' => 'Неправилны параметры функцій wfQuery()<br />
 Функція: $1<br />
 Запрос: $2',
-'viewsource' => 'Видїти код',
+'viewsource' => 'Відїти код',
 'viewsource-title' => 'Відїти жрідло сторінкы $1',
 'actionthrottled' => 'Акція была придушена',
 'actionthrottledtext' => 'Взглядом ку протиспамовым опатрїням не можете жадану акцію провести барз часто в короткім часї. Спробуйте то знову о пару мінут.',
@@ -425,6 +426,11 @@ $2',
 'customjsprotected' => 'Не маєте права едітовати тоту сторінку з JavaScript-ом, бо обсягує персоналны наставлїна іншого хоснователя.',
 'ns-specialprotected' => 'Шпеціалны сторінкы не є можне едітовати.',
 'titleprotected' => "Створїня сторінкы з таков назвов было заборонене хоснователём [[User:$1|$1]] з причінов: ''$2''.",
+'filereadonlyerror' => "Не годно змінити файл „$1“, бо архів файлів „$2“ є теперь лем на чітаня.
+
+Адміністратор сервера, котрый архів заблоковав, додав тото пояснїня: „''$3''“.",
+'invalidtitle-knownnamespace' => 'Непряавилна назва в просторї назв „$2“ і текстом „$3“',
+'invalidtitle-unknownnamespace' => 'Неправилна назва з незнамым чіслом простору назв $1 і текстом „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Зла конфіґурація: незнамый антивіровый проґрам: ''$1''",
@@ -513,6 +519,7 @@ $2',
 'invalidemailaddress' => 'Уведена адреса ел. пошты не може быти прията, бо она не має правилный формат.
 Просиме Вас, уведьте коректну адесу або зохабте поле порожнє.',
 'cannotchangeemail' => 'В тій вікі не годен мінити імейловы адресы.',
+'emaildisabled' => 'Сесь сервер не годен одосылати імейлы.',
 'accountcreated' => 'Конто вытворене',
 'accountcreatedtext' => 'Конто хоснователя $1 было вытворене.',
 'createaccount-title' => 'Вытвориня конта про  {{SITENAME}}',
@@ -595,7 +602,7 @@ $2
 'changeemail-cancel' => 'Сторно',
 
 # Edit page toolbar
-'bold_sample' => 'Тучный текст',
+'bold_sample' => 'Товстый текст',
 'bold_tip' => 'Шырокый текст',
 'italic_sample' => 'Курсива',
 'italic_tip' => 'Курсива',
@@ -622,7 +629,7 @@ $2
 'showpreview' => 'Указати нагляд',
 'showlivepreview' => 'Швыдкый нагляд',
 'showdiff' => 'Указати зміны',
-'anoneditwarning' => "'''Увага''': Не сте приголошены. Ваша IP-адреса буде записана до історії змін той сторінкы.",
+'anoneditwarning' => "'''Увага''': Ð\9dе Ñ\81Ñ\8cÑ\82е Ð¿Ñ\80иголоÑ\88енÑ\8b. Ð\92аÑ\88а IP-адÑ\80еÑ\81а Ð±Ñ\83де Ð·Ð°Ð¿Ð¸Ñ\81ана Ð´Ð¾ Ñ\96Ñ\81Ñ\82оÑ\80Ñ\96Ñ\97 Ð·Ð¼Ñ\96н Ñ\82ой Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\8b.",
 'anonpreviewwarning' => "''Не сьте приголошеный(а). Уложінём буде ваша IP адреса записана в історії  той сторінкы.''",
 'missingsummary' => "'''Припомянутя:''' Не задали сьте згорнутя едітації. Кідь іщі раз кликтете на Уложыти зміны, буде вапа едітація записана без згорнутя.",
 'missingcommenttext' => 'Задайте коментарь',
@@ -703,8 +710,9 @@ $2
 'userinvalidcssjstitle' => "'''Увага:''' Тема взгляду „$1“ не екзістує. Не забудьте, же хосновательске .css і .js файлы хоснують малы писмена, наприклад {{ns:user}}:{{BASEPAGENAME}}/vector.css, а не {{ns:user}}:{{BASEPAGENAME}}/Vector.css.",
 'updated' => '(Зміна уложена)',
 'note' => "'''Позначка:'''&nbsp;",
-'previewnote' => "'''Памятайте, же то лем попереднїй перегляд,
-текст іщі не є уложеный!'''",
+'previewnote' => "'''Памятайте, же то лем нагляд.'''
+Зміны іщі не суть уложены!",
+'continue-editing' => 'Продовжыти едітованя',
 'previewconflict' => 'Тот нагляд зображує текст так, як буде вызерати по уложіню сторінкы.',
 'session_fail_preview' => "'''Вашу пожадавку ся не подарило зпрацовати, бо были страчены дата сеансу.
 Просиме, спробуйте то зясь.
@@ -719,6 +727,7 @@ $2
 Тото ся може даколи стати, кідь хоснуєте хыбный вебовый анонімізер.'''",
 'edit_form_incomplete' => "'''Часть едітачного формуларя іщі не пришла не сервер; перевірьте комплетность вашых змін і спробуйте іщі раз.'''",
 'editing' => 'Едітованя $1',
+'creating' => 'Створїня $1',
 'editingsection' => 'Едітованя $1 (роздїл)',
 'editingcomment' => 'Едітованя $1 (нова секція)',
 'editconflict' => 'Конфлікт едітованя: $1',
@@ -777,21 +786,28 @@ $2
 'edit-conflict' => 'Конфлікт едітованя.',
 'edit-no-change' => 'Ваша едітація была іґнорована, бо не дішло ку жадній змінї тексту.',
 'edit-already-exists' => 'Не подарило ся створити нову сторінку, бо она уж екзістує.',
+'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Увага: Тота сторінка обсягує дуже много кликаня выконово нарочных функцій парсера.
 
 Поволеный ліміт є $2, теперь шак  {{PLURAL:$1|ту єдно кликаня є|ту суть  $2 кликаня|ту є $2 кликань}}.',
 'expensive-parserfunction-category' => 'Сторінкы з дуже великым чіслом кликаня функції парсера',
-'post-expand-template-inclusion-warning' => 'Увага: розмір шаблон про включіня є барз великый.
+'post-expand-template-inclusion-warning' => 'Ð\9fозÑ\96Ñ\80Ñ\8c: розмір шаблон про включіня є барз великый.
 Дакотры шаблоны не будуть включены.',
 'post-expand-template-inclusion-category' => 'Сторінкы з перевышуючов великостёв включеных шаблон',
-'post-expand-template-argument-warning' => 'Увага: Тота сторінка обсягує принайменшім єден арґумент шаблоны, котрый є по розбалїню дуже великый.
+'post-expand-template-argument-warning' => 'Увага: Тота сторінка обсягує принайменшім єден арґумент шаблоны, котрый є по роспакованю дуже великый.
 Тоты арґументы были іґнорованы.',
 'post-expand-template-argument-category' => 'Сторінкы обсягуючі іґнорованы арґументы шаблон',
 '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' => 'Сторінка перевышыла глубку експанзії',
+'parser-unstrip-loop-warning' => 'Выявлене заціклїня unstrip',
+'parser-unstrip-recursion-limit' => 'Перевышеный ліміт рекурзії unstrip ($1)',
 
 # "Undo" feature
 'undo-success' => 'Едітованя може быти зручене.
@@ -936,7 +952,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Запис затаїня',
-'suppressionlogtext' => 'Тото є  список змазаня і блокованя котрый має обсяг схованый перед адміністраторами. Видьте тыж [[Special:BlockList|список вшыткых блоковань]].',
+'suppressionlogtext' => 'Тото є список мазаня і блокованя загорнюючі спрятаня обсягу і перед адміністраторами.
+Смотьте тыж [[Special:BlockList|Список вшыткых актуалных блоковань]].',
 
 # History merging
 'mergehistory' => 'Злучованя історії сторінок',
@@ -968,8 +985,9 @@ $1",
 'mergelogpagetext' => 'Ниже є список найновшых злучінь історії єдной сторінкы з другов.',
 
 # Diffs
-'history-title' => 'Історія змін сторінкы «$1»',
-'difference' => '(роздїл міджі ревізіями)',
+'history-title' => '$1: Історія змін',
+'difference-title' => '$1: Роздїлы міджі ревізіями',
+'difference-title-multipage' => '$1 і $2: Роздїлы міджі сторінками',
 'difference-multipage' => '(Роздїлы міджі сторінками)',
 'lineno' => 'Рядок $1:',
 'compareselectedversions' => 'Порівнати выбраны верзії',
@@ -1015,7 +1033,7 @@ $1",
 'search-result-score' => 'Одповідность: $1 %',
 'search-redirect' => '(напрямити $1)',
 'search-section' => '(секція $1)',
-'search-suggest' => 'Може сте мали на мыслї: $1',
+'search-suggest' => 'Ð\9cоже Ñ\81Ñ\8cÑ\82е Ð¼Ð°Ð»Ð¸ Ð½Ð° Ð¼Ñ\8bÑ\81лÑ\97: $1',
 'search-interwiki-caption' => 'Сестерьскы проєкты',
 'search-interwiki-default' => '$1 резултаты:',
 'search-interwiki-more' => '(веце)',
@@ -1031,7 +1049,7 @@ $1",
 'showingresultsheader' => "{{PLURAL:$5|Резултат '''$1''' з '''$3'''|Резултаты '''$1 — $2''' з '''$3'''}}  про '''$4'''",
 'nonefound' => "'''Позначка:''' Штандартно ся глядать лем в дакотрых просторах назв.
 Хоснуйте префікс ''all:'', жебы глядати у вшыткых просторах назв (рахувчі тыж сторінкы діскузії, шаблоны ітд.), або зазначте потрібный простор назв.",
-'search-nonefound' => 'На ваш запрос не были найджены жадны резултаты.',
+'search-nonefound' => 'На вашу пожадавку не были найджены жадны резултаты.',
 'powersearch' => 'Росшырене гляданя',
 'powersearch-legend' => 'Росшырене гляданя',
 'powersearch-ns' => 'Глядати у просторах назв:',
@@ -1065,6 +1083,7 @@ $1",
 'prefs-beta' => 'Бета-функції',
 'prefs-datetime' => 'Датум і час',
 'prefs-labs' => 'Експеріменталны функції',
+'prefs-user-pages' => 'Сторінкы хоснователя',
 'prefs-personal' => 'Інформації о хоснователёві',
 'prefs-rc' => 'Послїднї зміны',
 'prefs-watchlist' => 'Слїдованы сторінкы',
@@ -1289,7 +1308,7 @@ $1",
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'прочітати тоту сторінку',
 'action-edit' => 'едітованя той сторінкы',
-'action-createpage' => 'Ñ\81Ñ\82воÑ\80Ñ\96ня сторінок',
+'action-createpage' => 'Ñ\81Ñ\82воÑ\80Ñ\97ня сторінок',
 'action-createtalk' => 'Вытворїня сторінок діскузії',
 'action-createaccount' => 'Вытворїня того конта хоснователя',
 'action-minoredit' => 'означіти тото едітованя як мале',
@@ -1304,7 +1323,7 @@ $1",
 'action-writeapi' => 'хосновати API про писаня',
 'action-delete' => 'Вымазати тоту сторінку',
 'action-deleterevision' => 'вымазати тоту ревізію сторінкы',
-'action-deletedhistory' => 'зобразити  історію змазаных ревізій той сторінкы',
+'action-deletedhistory' => 'зобразити історію змазаных ревізій той сторінкы',
 'action-browsearchive' => 'глядати змазаны сторінкы',
 'action-undelete' => 'обновити тоту сторінку',
 'action-suppressrevision' => 'сконтролёвати і обновити тоту сховану ревізію',
@@ -1327,7 +1346,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|зміна|зміны|змін}}',
 'recentchanges' => 'Послїднї зміны',
 'recentchanges-legend' => 'Можности послїднїх змін',
-'recentchangestext' => 'Слїдуйте послїднї зміны на {{grammar:genitive|{{SITENAME}}}}  на тій сторінцї.',
+'recentchanges-summary' => 'Слїдуйте послїднї зміны на {{grammar:genitive|{{SITENAME}}}}  на тій сторінцї.',
 'recentchanges-feed-description' => 'На тотїм каналу слїдуєте послїднї зміны на {{grammar:6sg|{{SITENAME}}}}.',
 'recentchanges-label-newpage' => 'Тым едітованём была створена нова сторінка',
 'recentchanges-label-minor' => 'Тото є мала зміна',
@@ -1357,13 +1376,14 @@ $1",
 'newsectionsummary' => '/* $1 */ нова секція',
 'rc-enhanced-expand' => 'Вказати детайлы (потрібный JavaScript)',
 'rc-enhanced-hide' => 'Сховати детайлы',
+'rc-old-title' => 'спочатку створена як $1',
 
 # Recent changes linked
 'recentchangeslinked' => 'Повязаны зміны',
 'recentchangeslinked-feed' => 'Повязаны зміны',
 'recentchangeslinked-toolbox' => 'Повязаны зміны',
 'recentchangeslinked-title' => 'Зміны звязаны з «$1»',
-'recentchangeslinked-noresult' => 'Ð\92 Ð·Ð°Ð·Ð°Ð·Ð½Ð°Ñ\87енÑ\96м Ñ\87аÑ\81Ñ\97 Ð½Ðµ Ð±Ñ\8bли Ð¶Ð°Ð´Ð½Ñ\8b Ð·Ð¼Ñ\96нÑ\8b Ð½Ð° Ð¾Ð´ÐºÐ°Ð·Ð¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85.',
+'recentchangeslinked-noresult' => 'В зазначенім часї не были жадны зміны на одказованых сторінках.',
 'recentchangeslinked-summary' => "Тото є список недавных змін на сторінках на котры одказує задана сторінка (або котры належать до той катеґорії).
 Сторінкы з [[Special:Watchlist|вашого списку слїдованых]] суть вызначены '''тучно'''.",
 'recentchangeslinked-page' => 'Назва сторінкы:',
@@ -1464,9 +1484,9 @@ $1",
 'uploadvirus' => 'Файл обсягує вірус! Детайлы: $1',
 'uploadjava' => 'Тот файл є ZIP архів, котрый обсягує .class-файл Java.
 Начітаня Java-файлів не є доволене, бо они можуть запричінити обход забезпечіня сістемы.',
-'upload-source' => 'Ð\97дÑ\80ойовый файл',
-'sourcefilename' => 'Ð\9dазва Ð·Ð´Ñ\80ойового файлу:',
-'sourceurl' => 'Ð\97дÑ\80ойова URL-адреса:',
+'upload-source' => 'Ð\96Ñ\80Ñ\96дловый файл',
+'sourcefilename' => 'Ð\9dазва Ð¶Ñ\80Ñ\96длового файлу:',
+'sourceurl' => 'Ð\96Ñ\80Ñ\96длова URL-адреса:',
 'destfilename' => 'Назва цілёвого файлу:',
 'upload-maxfilesize' => 'Максімалный розмір файлу: $1',
 'upload-description' => 'Попис файлу',
@@ -1493,6 +1513,31 @@ $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.',
+'backend-fail-backup' => 'Не вдало ся створити резервну копію файлу $1.',
+'backend-fail-notexists' => 'Файл $1 не існує.',
+'backend-fail-hashes' => 'Не вдало ся обтримати гешы файлів про порівнаня.',
+'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.',
+'backend-fail-maxsize' => 'Не вдало ся записати до файлу $1, бо він векшый як {{PLURAL:$2|$2 байт|$2 байты|$2 байтів}}.',
+'backend-fail-readonly' => 'Кінцёва уложна сістема „$1“ моментално лем на чітаня. Прічіна: „$2“',
+'backend-fail-synced' => 'Файл "$1" в кінцёвій уложній сістемі в неконзістентнім стані',
+'backend-fail-connect' => 'Не вдало ся припоїти до кінцёвой уложной сістемы „$1“.',
+'backend-fail-internal' => 'В кінцёвій уложній сістемі „$1“ дішло к незнаній хыбі.',
+'backend-fail-usable' => 'Не вдало ся записати до файлу $1  про недостаточны права або хыбуючі адресарї/контайнеры.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'При одкрытю ZIP-архіву про ёго перевірку выникла хыба.',
@@ -2111,8 +2156,8 @@ $UNWATCHURL
 'undeleterevision-missing' => 'Неправилна або хыбляча ревізія. Може маєте планый одказ, або ревізія была обновлена ці одстранена з архіву.',
 'undelete-nodiff' => 'Не найджена жадна попередня верзія.',
 'undeletebtn' => 'Обновити',
-'undeletelink' => 'видїти/обновити',
-'undeleteviewlink' => 'видїти',
+'undeletelink' => 'відїти/обновити',
+'undeleteviewlink' => 'відїти',
 'undeletereset' => 'Ресетовати',
 'undeleteinvert' => 'Інвертовати селекцію',
 'undeletecomment' => 'Причіна:',
@@ -2148,9 +2193,9 @@ $1',
 'blanknamespace' => '(Основный)',
 
 # Contributions
-'contributions' => 'Приспевок хоснователя',
+'contributions' => 'Приспівок хоснователя',
 'contributions-title' => 'Приспевок хоснователя $1',
-'mycontris' => 'Мої приспевкы',
+'mycontris' => 'Мої приспівкы',
 'contribsub2' => 'Приспевок $1 ($2)',
 'nocontribs' => 'Ненайджены жадны зміны подля тых крітерій.',
 'uctop' => ' (послїдня)',
@@ -2232,8 +2277,8 @@ $1',
 'ipb-confirm' => 'Потвердити блокованя',
 'badipaddress' => 'Неправилна IP адреса',
 'blockipsuccesssub' => 'Блокованя проведено',
-'blockipsuccesstext' => 'Хоснователь „[[Special:Contributions/$1|$1]]“ є блокованый.<br />
\9cожеÑ\82е Ñ\81обÑ\96 Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и [[Special:BlockList|Ñ\81пиÑ\81ок Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\85оÑ\81новаÑ\82елÑ\97в]].',
+'blockipsuccesstext' => '„[[Special:Contributions/$1|$1]]“ je {{GENDER:$1|заблокованый|заблокована}}.<br />
\9cожеÑ\82е Ñ\81обÑ\96 Ð¿Ð¾Ñ\81моÑ\82Ñ\80иÑ\82и [[Special:BlockList|Ñ\81пиÑ\81ок Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ñ\8bÑ\85 Ñ\80едакÑ\82оÑ\80Ñ\96в]].',
 'ipb-blockingself' => 'Зберате ся заблоковати {{gender:|сам|сама|самы}} себе! Сьте собі {{gender:|певный|певна|певны}}, же тото хочете зробити?',
 'ipb-confirmhideuser' => 'Рыхтуєте ся заблоковати хоснователя зо запнутов вольбов "сховати імя хоснователя". То запрічінить же імя хоснователя счезне зо вшыткых списків і протоколёвачіх записів.  Сьте собі {{gender:|певный|певна|певны}}, же хочете тото зробити?',
 'ipb-edit-dropdown' => 'Едітовати причіны блоковань',
@@ -2275,7 +2320,7 @@ $1',
 'blocklink' => 'заблоковати',
 'unblocklink' => 'одблоковати',
 'change-blocklink' => 'змінити блок',
-'contribslink' => 'приспевкы',
+'contribslink' => 'приспівкы',
 'emaillink' => 'послати імейл',
 'autoblocker' => 'Сьте были автоматічно блокованы, протоже здїляте IP-адресу з хоснователём „[[User:$1|$1]]“. Причіна блокованя того хоснователя: „$2“',
 'blocklogpage' => 'Запис блоковань',
@@ -2284,7 +2329,9 @@ $1',
 'blocklog-showsuppresslog' => 'Тот хоснователь быв блокованый і схованый. Ту є про перегляд вказаный выпис з книгы блокованя:',
 'blocklogentry' => 'заблокoвав [[$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' => 'вытваряня конт не поволене',
@@ -2438,9 +2485,11 @@ $1',
 До ниже зазначеного едітачного поля зазначте назвы сторінок, котры хочете експортовати; каждый рядок єдна назва. Тыж звольте, ці ся мають експортовати і старшы верзії сторінкы враховано інформацій в історії едітованя, або лем актуална верзія з інформаціов о послїднїй едітації.
 
 В другім припадї можете тыж хосновати прямый одказ, наприклад помочов [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] ся выекспортує „[[{{MediaWiki:Mainpage}}]]“.',
+'exportall' => 'Експортовати вшыткы сторінкы',
 'exportcuronly' => 'Загорняти лем сучасну верзію, не повну історію',
 'exportnohistory' => "----
 '''Позначка:''' експорт повных історій средством того формуларя быв про проблемы з ресурсами заказаный.",
+'exportlistauthors' => 'У каждой сторінкы выписати повный список приспівателїв',
 'export-submit' => 'Експорт',
 'export-addcattext' => 'Додати сторінкы з катеґорії:',
 'export-addcat' => 'Придати',
@@ -2473,6 +2522,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' => 'Непідпорованый тіп образку',
@@ -2516,6 +2567,9 @@ $1',
 'import-invalid-interwiki' => 'Із зазначеной вікі ся не дасть імпортовати.',
 'import-error-edit' => 'Сторінка „$1“ ся не наімпортовала, бо не мате право єй едітовати.',
 'import-error-create' => 'Сторінка „$1“ ся не наімпортовала, бо не мате право єй створити.',
+'import-error-interwiki' => 'Сторінка „$1“ ся не імпортує, бо єй назва є зарезервована про вонкашнї лінкы (interwiki).',
+'import-error-special' => 'Сторінка „$1“ ся не імпортує, бо належыть до шпеціалного простору назв, до котрого сторінкы не належать.',
+'import-error-invalid' => 'Сторінка „$1“ ся не імпортує, бо єй назва неприпустна.',
 
 # Import log
 'importlogpage' => 'Книга імпортів',
@@ -2525,6 +2579,14 @@ $1',
 'import-logentry-interwiki' => 'міджівікі імпорт $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',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ваша сторінка хоснователя',
 'tooltip-pt-anonuserpage' => 'Сторінка хоснователя про IP-адресу, з котрой едітуєте',
@@ -2532,7 +2594,7 @@ $1',
 'tooltip-pt-anontalk' => 'Діскузія о едітованях выконаных з той IP-адресы',
 'tooltip-pt-preferences' => 'Вашы наставлїня',
 'tooltip-pt-watchlist' => 'Список сторінок, на котрых слїдуєте зміны',
-'tooltip-pt-mycontris' => 'Список вашых приспевків',
+'tooltip-pt-mycontris' => 'Список вашых приспівків',
 'tooltip-pt-login' => 'Рекомендуєме ся приголосити, але не є то повинне.',
 'tooltip-pt-anonlogin' => 'Рекомендуєме ся приголосити, але не є то повинне.',
 'tooltip-pt-logout' => 'Одголошіня',
@@ -2540,14 +2602,14 @@ $1',
 'tooltip-ca-edit' => 'Тоту сторінку можно едітовати. Просиме, хоснуйте перегляд перед уложінём.',
 'tooltip-ca-addsection' => 'Створити нову секцію',
 'tooltip-ca-viewsource' => 'Тота сторінка є замкнута.
-Можете видїти єй код.',
+Можете відїти єй код.',
 'tooltip-ca-history' => 'Минулы верзії той сторінкы',
 'tooltip-ca-protect' => 'Хрань тоту сторінку',
 'tooltip-ca-unprotect' => 'Змінити замок той сторінкы',
 'tooltip-ca-delete' => 'Вымазати тоту сторінку',
 'tooltip-ca-undelete' => 'Обновити едітованя той сторінкы выконаны перед єй змазанём',
 'tooltip-ca-move' => 'Переменовати тоту сторінку',
-'tooltip-ca-watch' => 'Придати тоту сторінку до вашого списку слїдованых сторінок',
+'tooltip-ca-watch' => 'Придати гевсю сторінку до вашого списку слїдованых сторінок',
 'tooltip-ca-unwatch' => 'Одобрати тоту сторінку з вашого списку слїдованых сторінок',
 'tooltip-search' => 'Глядати {{SITENAME}}',
 'tooltip-search-go' => 'Перейти до сторінкы, што має точно таку назву (кідь екзістує)',
@@ -2560,10 +2622,10 @@ $1',
 'tooltip-n-recentchanges' => 'Список послїднїх змін',
 'tooltip-n-randompage' => 'Зображіня нагодной сторінкы',
 'tooltip-n-help' => 'Посмотрити поміч',
-'tooltip-t-whatlinkshere' => 'Список вшыткых сторінок, што одказують на тоту сторінку',
-'tooltip-t-recentchangeslinked' => 'Ð\9fоÑ\81лÑ\97днÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´ÐºÐ°Ð· Ð½Ð° Ñ\82Ñ\96й сторінцї',
+'tooltip-t-whatlinkshere' => 'Список вшыткых сторінок, што одказують ся на тоту сторінку',
+'tooltip-t-recentchangeslinked' => 'Ð\9fоÑ\81лÑ\97днÑ\97 Ð·Ð¼Ñ\96нÑ\8b Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85, ÐºÐ¾Ñ\82Ñ\80Ñ\8b Ð¼Ð°Ñ\8eÑ\82Ñ\8c Ð¾Ð´ÐºÐ°Ð· Ð½Ð° Ñ\82Ñ\97й сторінцї',
 'tooltip-feed-rss' => 'RSS канал про тоту сторінку',
-'tooltip-feed-atom' => 'Atom канал про тоту сторінку',
+'tooltip-feed-atom' => 'Atom канал про гевсю сторінку',
 'tooltip-t-contributions' => 'Перегляд приспевків того хоснователя',
 'tooltip-t-emailuser' => 'Послати е-маіл тому хоснователёві',
 'tooltip-t-upload' => 'Награти файлы',
@@ -2571,20 +2633,20 @@ $1',
 'tooltip-t-print' => 'Верзія той сторінкы про друк',
 'tooltip-t-permalink' => 'Перманентный одказ на тоту верзію сторінкы',
 'tooltip-ca-nstab-main' => 'Обсяг сторінкы',
-'tooltip-ca-nstab-user' => 'Видїти сторінку хоснователя',
+'tooltip-ca-nstab-user' => 'Відїти сторінку хоснователя',
 'tooltip-ca-nstab-media' => 'Вказати сторінку файлу',
 'tooltip-ca-nstab-special' => 'Шпеціална сторінка, она є недоступна про едітованя',
 'tooltip-ca-nstab-project' => 'Сторінка проєкту',
 'tooltip-ca-nstab-image' => 'Видїти код сторінкы',
 'tooltip-ca-nstab-mediawiki' => 'Вказати повідомлїня сістемы',
-'tooltip-ca-nstab-template' => 'Видїти шаблону',
+'tooltip-ca-nstab-template' => 'Відїти шаблону',
 'tooltip-ca-nstab-help' => 'Видїти сторінку помочі',
 'tooltip-ca-nstab-category' => 'Сторінка катеґорії',
 'tooltip-minoredit' => 'Позначіти тото як незначне едітованя',
 'tooltip-save' => 'Уложыти вашы зміны',
 'tooltip-preview' => 'Нагляд сторінкы, просиме Вас, хоснуйте перед уложінём!',
 'tooltip-diff' => 'Вказати зміны, што были зроблены в тексті.',
-'tooltip-compareselectedversions' => 'Видїти роздїл міджі двома указаныма верзіями той сторінкы.',
+'tooltip-compareselectedversions' => 'Відїти роздїл міджі двома указаныма верзіями той сторінкы.',
 'tooltip-watch' => 'Придати тоту сторінку до списку слїдованых',
 'tooltip-recreate' => 'Обновити сторінку і кідь была змазана',
 'tooltip-upload' => 'Почати одосыланя',
@@ -3121,7 +3183,7 @@ $1',
 
 # External editor support
 'edit-externally' => 'Едітовати тот файл хоснувчі екстерну аплікацію',
-'edit-externally-help' => '(Вецей інформації найдете в [//www.mediawiki.org/wiki/Manual:External_editors інштрукції про наставлїня].)',
+'edit-externally-help' => '(Веце інформацій найдете в [//www.mediawiki.org/wiki/Manual:External_editors інштрукції про наставлїня].)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'вшыткы',
@@ -3469,4 +3531,14 @@ 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|стороча|стороча|стороч}}',
+
 );
index 7c2ac4c..e7f611b 100644 (file)
@@ -19,6 +19,7 @@
  * @author Mahitgar
  * @author Naveen Sankar
  * @author Omnipaedista
+ * @author Shantanoo
  * @author Shijualex
  * @author Shubha
  * @author Vibhijain
@@ -536,7 +537,7 @@ $1',
 'versionrequiredtext' => 'एतत्पृष्ठं प्रयोक्तुं मीडियाविकि इत्येतस्य $1तमा आवृत्तिः आवश्यकी। पश्यतु [[Special:Version|आवृत्ति-सूचिका]]',
 
 'ok' => 'अस्तु',
-'pagetitle' => '',
+'pagetitle' => '$1 - {{SITENAME}}',
 'retrievedfrom' => '"$1" इत्यस्माद् उद्धृतम्',
 'youhavenewmessages' => 'भवदर्थम् $1 सन्ति। ($2).',
 'newmessageslink' => 'नूतनाः सन्देशाः',
@@ -1059,7 +1060,6 @@ $2
 
 # Diffs
 'history-title' => '"$1" इत्येतस्य आवर्तनेतिहासः :',
-'difference' => '(संस्करणानां भेदाः)',
 'lineno' => 'पंक्तिः $1:',
 'compareselectedversions' => 'चितानाम् आवृत्तीनां तोलनं क्रियताम्',
 'editundo' => 'निष्क्रियताम्',
@@ -1073,7 +1073,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|फलितम्|फलितानि}} दर्श्यताम्',
@@ -1219,7 +1219,7 @@ $2
 'nchanges' => '$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}',
 'recentchanges' => 'सद्योजातानि परिवर्तनानि',
 'recentchanges-legend' => 'सद्योजातानां परिवर्तनानां विकल्पाः',
-'recentchangestext' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
+'recentchanges-summary' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
 'recentchanges-feed-description' => 'अस्मिन् विकियोजनायां सद्योजातानि परिवर्तनानि दर्श्यन्ताम्',
 'recentchanges-label-newpage' => 'एतस्मात् सम्पादनात् नूतनं पृष्ठं सृष्टमस्ति',
 'recentchanges-label-minor' => 'इदं लघु परिवर्तनम्',
index 0885c5b..cfc70f2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sakha (Саха тыла)
+/** Sakha (саха тыла)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -9,6 +9,7 @@
  *
  * @author Andrijko Z.
  * @author Bert Jickty
+ * @author Gartem
  * @author HalanTul
  * @author Kaganer
  * @author Meno25
@@ -422,6 +423,10 @@ $2',
 'ns-specialprotected' => '{{ns:special}} ааттаах сирэйдэр уларытыллыбаттар.',
 'titleprotected' => "Бу бас тыл оҥоһулларын [[User:$1|$1]] боппут.
 Төрүөтэ - ''$2''",
+'filereadonlyerror' => "«$1» билэни уларытар сатаммата, тоҕо диэтэххэ «$2» «ааҕарга эрэ» диэн эрэсиимҥэ турар эбит.
+
+Бу эрэсиими туруорбут дьаһабыл маннык быһаарыыны хаалларбыт: «''$3''».",
+'invalidtitle-knownnamespace' => '«$2» аат далыгар маннык тиэкистээх «$3» сатаммат аат',
 
 # Virus scanner
 'virus-badscanner' => "Сатаммата. Вирус сканера биллибэтэ: ''$1''",
@@ -716,7 +721,9 @@ IP-аадырыһа эрэ көстөр.
 'userinvalidcssjstitle' => "'''Болҕой:''' Бу тиэмэ «$1» суох. Кыттааччы .css и .js сирэйдэрэ кыра буукубаннан суруллуохтаахтар, холобур «{{ns:user}}:Ньургун/vector.css», маннык буолуо суохтаах «{{ns:user}}:Ньургун/Vector.css».",
 'updated' => '(Саҥардылынна)',
 'note' => "'''Хос быһаарыы:'''",
-'previewnote' => "'''Бу көрүү эрэ; уларытыылар бигэргэтиллэ иликтэр!'''",
+'previewnote' => "'''Бу барыллаан көрүү эрэ.'''
+Атын уларытыы бигэргэтиллэ илик!",
+'continue-editing' => 'Уларытыыны ситэр',
 'previewconflict' => 'Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.',
 'session_fail_preview' => "'''Сиэрбэр сессия идентификаторын сүтэрэн кэбиһэн эн уларытыыгын кыайан киллэрбэтэ.
 Өссө холонон көр.
@@ -731,6 +738,7 @@ IP-аадырыһа эрэ көстөр.
 Итинник сыыһалар үксүн прокси-сиэрбэрдэри туһаннахха тахсааччылар.'''",
 'edit_form_incomplete' => "'''Уларытыы сорҕото сиэрбэргэ тиийбэтэ. Үчүгэйдик сыныйан көр, Эн уларытыыларыҥ туох да омсото суохтар дуо. Онтон өссө боруобалаа.'''",
 'editing' => 'Уларытыы $1',
+'creating' => 'Айарга $1',
 'editingsection' => 'Уларытыы $1 (раздел)',
 'editingcomment' => 'Уларытыы $1 (саҥа салаа)',
 'editconflict' => 'Уларытыы мөккүөрэ: $1',
@@ -953,8 +961,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Кистээһин сурунаала',
-'suppressionlogtext' => 'Аллара даһабылларга көстүбэти таарыйар сотуулар уонна хааччахтааһыннар тиһиктэрэ бэриллэр.
-Билигин баар хааччахтары көрөргө [[Special:BlockList|IP хааччахтааһынын тиһигэр]] киир.',
+'suppressionlogtext' => 'Аллара дьаһабылларга көстүбэти таарыйар сотуулар уонна хааччахтааһыннар тиһиктэрэ бэриллэр.
+Билигин баар хааччахтары көрөргө [[Special:BlockList|хааччахтааһын тиһигэр]] киир.',
 
 # History merging
 'mergehistory' => 'Силбэһии сирэйин хронологията',
@@ -986,8 +994,7 @@ $1",
 'mergelogpagetext' => 'Манна сирэйдэр устуоруйаларын бүтэһик силлэһиилэрин тиһигэ бэриллэр.',
 
 # Diffs
-'history-title' => 'Көннөрүү историята "$1"',
-'difference' => '(Торумнар бэйэ-бэйэлэриттэн уратылара)',
+'history-title' => 'Көннөрүү сурунаала "$1"',
 'difference-multipage' => '(Сирэйдэр ыккардыларынааҕы уратылар)',
 'lineno' => '$1 строка:',
 'compareselectedversions' => 'Талыллыбыт торумнары тэҥнээ',
@@ -1238,7 +1245,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 # Rights
 'right-read' => 'Сирэйдэри көрүү',
 'right-edit' => 'Сирэйдэри уларытыы',
-'right-createpage' => 'Сирэйдэри оҥоруу (ырытыы сирэйдэрин кытта холбуу)',
+'right-createpage' => 'Сирэйдэри оҥоруу (ырытыы сирэйдэриттэн ураты)',
 'right-createtalk' => 'Ырытыы сирэйдэрин оҥоруу',
 'right-createaccount' => 'Саҥа кыттааччыны бэлиэтээһин',
 'right-minoredit' => 'Уларытыыны кыра суолталаах курдук бэлиэтээ',
@@ -1344,7 +1351,7 @@ $1 {{PLURAL:$1|бэлиэттэн|бэлиэттэн (буукубаттан)}}
 'nchanges' => '$1 {{PLURAL:$1|уларытыы|уларытыылар}}',
 'recentchanges' => 'Кэнники уларытыылар',
 'recentchanges-legend' => 'Кэлиҥҥи уларытыылар хайдах көстөллөрүн туруоруу',
-'recentchangestext' => 'Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.',
+'recentchanges-summary' => 'Манна хаһан оҥоһуллубуттарынан сааһыланан {{SITENAME}} кэнники уларыытыылара көстөллөр.',
 'recentchanges-feed-description' => 'Бу ботуокка биики бүтэһик уларыйыыларын кэтииргэ.',
 'recentchanges-label-newpage' => 'Бу уларытыы түмүгэр саҥа сирэй айыллыбыт.',
 'recentchanges-label-minor' => 'Бу улахан суолтата суох уларытыы',
@@ -1547,7 +1554,7 @@ $1',
 'backend-fail-writetemp' => 'Быстах кэмнээх билэҕэ суруйар табыллыбата.',
 'backend-fail-closetemp' => 'Быстах кэмнээх билэни сабар табыллыбата.',
 'backend-fail-read' => '$1 билэни ааҕар табыллыбата.',
-'backend-fail-create' => '$1 билэни оҥорор табыллыбата.',
+'backend-fail-create' => '$1 билэни суруттарар табыллыбата.',
 'backend-fail-readonly' => '«$1» сиэрбэр «ааҕыы эрэ» эрэсиимҥэ турар. Төрүөтэ: «$2»',
 'backend-fail-synced' => '«$1» билэ сөпсөһүллүбэтэх туруктаах эбит',
 'backend-fail-connect' => 'Маны кытта «$1» холбонор табыллыбата.',
@@ -1879,6 +1886,9 @@ $1',
 'allpagesbadtitle' => 'Сирэй маннык ааттанара сатаммат: аакка туттуллуо суохтаах бэлиэлэрдээх эбэтэр тыллар ыккардыларыгар туһаныллар ыйынньыктаах.',
 'allpages-bad-ns' => '{{SITENAME}} не содержит пространства имён «$1».',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Бүтэһик барылы көр.',
+
 # Special:Categories
 'categories' => 'Категориялар',
 'categoriespagetext' => 'Бу {{PLURAL:$1|категория иһигэр|категориялар истэригэр}} сирэйдэр эбэтэр медиа-билэлэр бааллар.
@@ -1951,7 +1961,7 @@ $1',
 "Кимтэн" графааҕа эн [[Special:Preferences|туруорууларгар]] баар аадырыһыҥ киириэҕэ,
 онон туппут киһи хардарар кыахтаныа.',
 'usermailererror' => 'Сурук кыайан барбата:',
-'defemailsubject' => '{{SITENAME}} —  бу киһиттэн $1 сурук кэлбит',
+'defemailsubject' => '{{SITENAME}} — $1 диэн киһиттэн сурук кэлбит',
 'usermaildisabled' => 'Кыттааччы эл почтата арахса сылдьар',
 'usermaildisabledtext' => 'Эн атын кыттааччыларга эл. почтанан сурук ыытар кыаҕыҥ суох эбит',
 'noemailtitle' => 'E-mail суох',
diff --git a/languages/messages/MessagesSat.php b/languages/messages/MessagesSat.php
new file mode 100644 (file)
index 0000000..6289a79
--- /dev/null
@@ -0,0 +1,1228 @@
+<?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 David Baskey
+ * @author Ghonokuashabaskey
+ * @author Joseph Mardy
+ * @author Nipon087
+ * @author Reedy
+ * @author Salvator
+ * @author Samar88
+ * @author Srabony90
+ */
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'Joṛaoko latarre dag udugoḱma:',
+'tog-justify' => 'Olaḱ kạli mońjte sajao:',
+'tog-hideminor' => 'Nitaḱ bodolaḱre huḍiṅ kạmi danaṅme',
+'tog-hidepatrolled' => 'Joṛaoakanaḱko nãwã bodolaḱte danaṅkam',
+'tog-newpageshidepatrolled' => 'Biḍạakanaḱ sakamko nãwã sakamreaḱ talikare danȧkam',
+'tog-extendwatchlist' => 'Khạli nitoḱ bodolko do baṅ, joto bodolkodo ńeloḱ tạlikare phaylaomẽ.',
+'tog-usenewrc' => 'Cetan darja reaḱ nãwã bodolakanaḱko beoharme',
+'tog-numberheadings' => 'Mukhiạ kathako do actege piṛhipiṛhite sajaḱma',
+'tog-showtoolbar' => 'Joṛaoakanaḱ ṭulbar udugoḱma',
+'tog-editondblclick' => 'Bar dhao lin kate sakam torjomão reaḱ ạidari emogoḱma',
+'tog-editsection' => '[Joṛao] Pahaṭako do joṛao hotete aćtege hoyoḱ lạgit aidạri em ocoḱma',
+'tog-editsectiononrightclick' => 'Pahaṭa reaḱ pahaṭa guṭkathare jojom seć lin hotete <br /> pahaṭa sompadon lạgitte ektiạr em hoyoḱma (JavaScript)',
+'tog-showtoc' => 'Ṭibilre menaḱako ńel ( sakamkore 3 khon jạti hedlayenko)',
+'tog-rememberpassword' => 'Noa sendrare amaḱ boloḱ reaḱ katha (katha cạbi) disạimẽ (jạstite $1 {{PLURAL:$1din reaḱ din reaḱ}} lạgit)',
+'tog-watchcreations' => 'Sakamko songe  Ińaḱ ńelok tạlikare benao',
+'tog-watchdefault' => 'Sakam tońgey me Iń do ińaḱ ńeloḱ tạlikare joṛaokeda',
+'tog-watchmoves' => 'Sakamko tońgeyme Ińaḱ ńelok tạlikare kulme',
+'tog-watchdeletion' => 'Sakamko tońgeyme Ińaḱ ńeloḱ tạlika khon get́ giḍikam',
+'tog-minordefault' => 'Etohoṕre sanam joṛao purạoanaḱko do bekor unuduḱ lekate cinhạkma',
+'tog-previewontop' => 'Joṛao bakso purạo lahare unuduḱ hoyoḱma',
+'tog-previewonfirst' => 'Pạhil joṛao purạore unuduḱ hoyoḱma',
+'tog-nocache' => 'Brajar sakam reaḱ kasiṅ bondoemẽ',
+'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-enotifrevealaddr' => 'Dhạrwạk reaḱ sakamre ińaḱ e-mail ṭhikạna sodor hoyoḱma',
+'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
+'tog-oldsig' => 'Menaḱ signạtar',
+'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
+'tog-externaleditor' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
+'tog-externaldiff' => 'Etohoṕre bahre reaḱ sompadonićaḱ beohar hoyoḱma (khali sẽṛa beoharić lạgit́te, kompeuṭare asokae seṭing jạruṛa. [//www.mediawiki.org/wiki/manual:External_editors More information.])',
+'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
+'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
+'tog-forceeditsummary' => 'Khạli sompadon guṭkatha em oktere iń baḍae ocoyiń hoyoḱma',
+'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
+'tog-watchlisthidebots' => 'Boṭreaḱ sompadon kạmiko do ńeloḱ tạlika khon danaṅmẽ',
+'tog-watchlisthideminor' => 'Ńeloḱ tạlikare ińak huḍiṅ joṛao kạmiko danaṅme',
+'tog-watchlisthideliu' => 'Ńeloḱ tạlikareaḱ ekaunṭ bolok beoharkoaḱ sompadon danaṅ hoyoḱma',
+'tog-watchlisthideanons' => 'Ńeloḱ tạlikare baṅ ńutamanić beoharićaḱ sompadonko danaṅ hoyoḱma',
+'tog-watchlisthidepatrolled' => 'Biḍạen sompadonko do ńeloḱ sakamre danaṅmẽ',
+'tog-ccmeonemails' => 'E-mail reaḱ kopy kulạńme Eṭaḱ laṛcaṛko kulakome',
+'tog-diffonly' => 'Farak reaḱ latar sakamre babotko baṅ udugoḱma',
+'tog-showhiddencats' => 'Danaṅ rokom sokomko uduḱmẽ',
+'tog-norollbackdiff' => 'rollback tayomte farak alom uduga',
+
+'underline-always' => 'Sanam okte',
+'underline-never' => 'Tis hõ ban̕',
+'underline-default' => 'Browjarre cetlekate em hoy akana',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'Sompadon ṭhại reaḱ fonṭ sṭayel:',
+'editfont-default' => 'Sendra do sedaere ṭhikakana',
+'editfont-monospace' => 'Monoespeć fonṭ',
+'editfont-sansserif' => 'Sans-serif fonṭ',
+'editfont-serif' => 'Serif fonṭ',
+
+# 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',
+'category-media-header' => '"$1" babot reaḱ rokom sokomte emen meḍiya rẽtko',
+'category-empty' => '"Noa rokom sokom sakamre do nit jahan sakam se miḍiya rẽt do bạnuḱa."',
+'hidden-categories' => '{{PLURAL:$1|Dãnań renaḱ|Dãnań renaḱ ko}}',
+'hidden-category-category' => 'Uku akan rokom sokom 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-subcat-count-limited' => 'Noa rokom sokomre latar reaḱ {{PLURAL:$1 gan kạṭic rokom sokom $1gan kạtic rokom sokom menaḱa}}',
+'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 .}}',
+'category-article-count-limited' => 'Noa {{PLURAL:$1 sakam sakamko}} rokom sokomre menaḱa.',
+'category-file-count' => '{{PLURAL:$2 Noa babot reaḱ rokom sokomre do eken latar reaḱ sakam menaḱa. Noa babot reaḱ rokom sokomre emakan moṭhe $2 gan sakam mudre {{PLURAL:$1 gan sakam $1 gan sakam}} latarre uduḱ hoena}}',
+'category-file-count-limited' => 'Latar reaḱ {{PLURAL:$1 rẽt rẽtko}} noa rokom sokomre menaḱa.',
+'listingcontinuesabbrev' => 'Calaḱa',
+'index-category' => 'Unuduḱ sakam ko do bạnuḱa',
+'noindex-category' => 'Unuduḱ sakamkodo bạnuḱa',
+'broken-file-category' => 'Baṅ kạmi daṛeaḱ chubi joṛao soho sakamko',
+
+'about' => 'Lạgitte, Lạgti',
+'article' => 'Menaḱakat́ sakam',
+'newwindow' => 'Nãwã khiṛki jhijme',
+'cancel' => 'Badme',
+'moredotdotdot' => 'Aema',
+'mypage' => 'In̕aḱ sakam',
+'mytalk' => 'Iñaḱ́ ro̠ṛ',
+'anontalk' => 'Nui baṅ ńutumanić beoharićaḱ galmarao sakam',
+'navigation' => 'Ñamme',
+'and' => '&#31;ar',
+
+# Cologne Blue skin
+'qbfind' => 'N̕am',
+'qbbrowse' => 'Sendra',
+'qbedit' => 'Tońge',
+'qbpageoptions' => 'Noa sakam',
+'qbpageinfo' => 'Sakam reaḱ thuti',
+'qbmyoptions' => 'In̕anḱ sakamko',
+'qbspecialpages' => 'Asokay teaḱ sakamko',
+'faq' => 'Baḍae kupuliko',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => 'Asol katha joṛaome',
+'vector-action-delete' => 'Giḍi',
+'vector-action-move' => 'Ocoḱ́me',
+'vector-action-protect' => 'Bańcao',
+'vector-action-undelete' => 'Bań getgiḍi',
+'vector-action-unprotect' => 'Bodol rukhiyạ',
+'vector-simplesearch-preference' => 'Arhõ jạsti sendra poramorso keṭećmẽ (khali vecṭor skinre lạgit)',
+'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ạṛ',
+'updatedmarker' => 'Ińaḱ mucạt hiripor khon nitaḱ halot',
+'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ṅ getgiḍilena {{PLURAL:$1 1ṭen joṛao $ joṛaoko}}',
+'viewdeleted_short' => '{{PLURAL:$1 gan ocoḱ sompadok $1 gan ocoḱ sompadon}} udugmẽ',
+'protect' => "banchao'",
+'protect_change' => 'Judạ',
+'protectthispage' => 'Noa sakam ban̕caome',
+'unprotect' => 'Bodol ban̕cao',
+'unprotectthispage' => 'Noa sakam reaḱ rukhiyạ bodolmẽ',
+'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',
+'templatepage' => 'Ṭempleṭ sakam udugmẽ',
+'viewhelppage' => 'Goṛoaḱ sakam n̕elme',
+'categorypage' => 'Babot reaḱ rokom sokom udugmẽ',
+'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',
+'viewcount' => 'Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.',
+'protectedpage' => 'Rukhíạ sakamko',
+'jumpto' => 'Calaḱme :',
+'jumptonavigation' => 'Ñamme',
+'jumptosearch' => 'Sendra',
+'view-pool-error' => 'Ikạkańmẽ, sarvarre nitoḱ do aḍi cap menaḱa.
+Ạḍi aema beoharko noa sakam ńel lạgit́ko kurumuṭueda.
+Nãwate noa sakam ńel kurumuṭuy lạgit́te dayakate mit́ghạṛi tạṅgiymẽ.
+$1',
+'pool-timeout' => 'Somoy paromena cạbi lạgit́te tạṅgi hoyoḱkana',
+'pool-queuefull' => 'Pul reaḱ sakam perećena',
+'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',
+'copyright' => '$1 re bhitrire ńamoḱa.',
+'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',
+
+'badaccess' => 'Ektiạr vul',
+'badaccess-group0' => 'Am do oka kạmi lạgit́em aroj akat́, ona kạmi purạo lạgit́te ạidạri do bạnuḱa.',
+'badaccess-groups' => 'Am do oka kạmim menjoṅkan ona do khạli {{PLURAL:$2 rạsiạkore noa rạsiạreaḱ mit́ṭenre}} mitṭen beoharić sompadon daṛeyaḱa: $1.',
+
+'versionrequired' => 'Meḍiawiki reaḱ $1 nãwã aroe jạruṛa',
+'versionrequiredtext' => 'Noa sakam beohar lạgit́te meḍiaWikire $1 nambar nãwã araoe jạruṛa.
+[[Special:Version nãwã aroe sakam]] ńelmẽ.',
+
+'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ã mesagko do $1 menaḱa',
+'editsection' => 'So̠mpado̠n',
+'editold' => 'So̠mpado̠n',
+'viewsourceold' => 'Ńamoḱ jayga',
+'editlink' => 'Tońge',
+'viewsourcelink' => 'vitrireaḱ́ jo̠to̠ ńelme',
+'editsectionhint' => 'Sapṛao dhara: $1',
+'toc' => 'Menaḱaḱko',
+'showtoc' => 'Uduḱme',
+'hidetoc' => 'uku, Danaṅ',
+'collapsible-collapse' => 'Murchạo caba',
+'collapsible-expand' => 'Phaylao',
+'thisisdeleted' => '$1 Ńel se nãwã aroe hoyukma?',
+'viewdeleted' => '$1 Ńelme',
+'restorelink' => '{{PLURAL:$1 mit́ṭen ocoḱgiḍi sompadon $1 gan udug giḍi sompadon}}',
+'feedlinks' => 'Jom oco',
+'feed-invalid' => 'Garhak feed reaḱ rokom do ạnlekate baṅkana',
+'feed-unavailable' => 'Sinḍikason feed do baṅ ńamoḱkana',
+'site-rss-feed' => '$1 RSS feed',
+'site-atom-feed' => ' $1 Jom oco',
+'page-rss-feed' => '"$1" RSS feed',
+'page-atom-feed' => '"$1" khon khudri jom',
+'red-link-title' => '$1 (niạ sakamdo bạnuḱa)',
+'sort-descending' => 'Ulṭạo horop lekate sajao',
+'sort-ascending' => 'Horop lekate sajao',
+
+# 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',
+'nosuchactiontext' => 'Noa URL re goṭa akan kạmi do ạnlekate baṅkana.
+Am do paseć mit́ṭen vul joṛaoem emakada se URL oltem vul akada.
+Noa do noṅkanaḱ menkana je {{SITENAME}} sayeṭre beoharen sofṭower re mit́ṭen vul menaḱa.',
+'nosuchspecialpage' => 'Noṅkanaḱ asokay sakam do banuḱa',
+'nospecialpagetext' => '<strong>Am do mit́ṭen beạn asokae sakamem nehor akada.</strong>
+[[Special:SpecialPages {{int:specialpages}}]]-re ạn asokae sakamkore mit́ṭen tạlikam ńama.',
+
+# General errors
+'error' => 'bhul',
+'databaseerror' => 'Ḍaṭabase vul',
+'dberrortext' => 'Database query syntexre vul hoeakana.
+Sofṭoyerre jahan bag karonte noa do hoe daṛeyaḱa.
+Joto khon mucạt́ database query do tahẽkana noṅka:
+<blockquote><tt>$1</tt><blockquote>
+"<tt>$2</tt>" bhitrire tahẽna.
+Database okaṭaḱ vule em akada:"<tt>$3: $4</tt>".',
+'dberrortextcl' => 'Ḍaṭabes query sintxexṭre vul hoeakana.
+Mucạt́ ḍaṭabes query do tahẽkana:
+"$1"
+"$2" faṅson reaḱ bhitri khon.
+Ḍatabes okaṭaḱ vule kulakaḱ: "$3: $4:',
+'laggedslavemode' => "'''Sontoroḱme:''' sakamre do nahaḱ nãwãnaḱko paseć bạnuḱa.",
+'readonly' => 'Ḍaṭabes do talagea',
+'enterlockreason' => 'Cạbie reaḱ karon do cet́kana ma lạimẽ, Saõte tinre tala cạbim jhija ona okte hõ lạimẽ',
+'readonlytext' => 'Nãwã hataen ar eṭagaḱ sompadon lạgit́te ḍaṭabes do nit bondo gea. Paseć ḍaṭabes rukhiyạre niyom lekate kạmi calaḱ kana. Thoṛa ghạrịić porte laha obosthare acur hạjuḱa.
+Sasetić do noa kathae roṛ keda: $1',
+'missing-article' => '"$1" $2 noa ńutumanaḱ sakhiyạ̣t 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ạtićtem ń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: $1, $2)',
+'readonly_lag' => 'Ḍaṭabes do aćhote tege bondo hoe akana, je lekate udhin reaḱ ḍaṭabes sarvarkor mukhiạ ḍaṭabes sarvar lekate heć daṛeaḱ.',
+'internalerror' => 'Bhitri reaḱ bhul',
+'internalerror_info' => 'Bhitri reaḱ vul: $1',
+'fileappenderrorread' => 'Jońṛao oktere "$1" baṅ paṛhaolena.',
+'fileappenderror' => '"$1" do "$2" saõte joṛao baṅ ganoḱ kana.',
+'filecopyerror' => '"$1" rẽt khon "$2" rẽt baṅ kopilena.',
+'filerenameerror' => '"$1" rẽt reaḱ ńutum bodol kate "$2" em baṅ hoyoḱ kana.',
+'filedeleteerror' => '$1 sakam do baṅ get́ giḍiḱ lena',
+'directorycreateerror' => '"$1" dayrekṭori do baṅ tearlena.',
+'filenotfound' => '"$1" rẽt do baṅ sendra ńamoḱ kana.',
+'fileexistserror' => '"$1" rẽtre baṅ oloḱ kana: Rẽt do lahare menaḱa.',
+'unexpected' => 'Baṅ asakan mạn: "$1"="$2".',
+'formerror' => 'Vul: forom do baṅ jimạlena.',
+'badarticleerror' => 'Noa sakamre kạmiko do baṅ puraolena.',
+'cannotdelete' => '$1 sakam se rẽt do baṅ get giḍilena.
+Pasec eṭaḱ hoṛ noa do lahareko get giḍi akada.',
+'cannotdelete-title' => '"$1" 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.',
+'querypage-no-updates' => 'Noa sakam reaḱ nahaḱ halot bondo gea. Nonḍe doho akana ḍaṭako do baṅ saphaḱa.',
+'wrong_wfQuery_params' => 'wfQuery ()-re vul perameṭar em hoeakana<br />
+Fańson: $1<br />
+Query: $2',
+'viewsource' => 'Vitrireaḱ ńelme',
+'viewsource-title' => '$1 renaḱ ńamoḱ ṭhại ńelmẽ',
+'actionthrottled' => 'Kạmi reaḱ dhara bại',
+'protectedpagetext' => 'Noa sakam do ol toṅge lạgit́te do bańcao gea.',
+'viewsourcetext' => 'Noa sakam do am ńel ar ńamoḱaḱ ṭhạiem kopi hatao daṛeaḱa:',
+'viewyourtext' => "Am do '''Amaḱ sompadon''' noa sakam ńel arem kopi hatao daṛeaḱa:",
+'protectedinterface' => 'Noa sakam reaḱ babotko do wiki sofṭoyer reaḱ mit́ṭen inṭarfes khobore ema, onate noa do rukhiyạ doho hoeakana.',
+'sqlhidden' => '(SQL query do ukure menaḱa)',
+'cascadeprotected' => 'Noa sakam do sompadon khon rukhiyạre menaḱa, karon sakam do latar reaḱ {{PLURAL:$1 gan sakam reaḱ gan sakam reaḱ}} bhitrire, oka sakam do (cascading) te rukhiyạ menaḱa:
+$2',
+'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-badscanner' => 'Vul konfigareson: baṅ orom vairas skenar: "$1"',
+'virus-scanfailed' => 'Esken baṅ hoelena (Code $1)',
+'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
+
+# Login and logout pages
+'welcomecreation' => '== Johar $1! ==
+Amaḱ ekaunṭ do tearena.
+Amaḱ [[Special:Preferance {{SITENAME}} pạsindko]] thir dohoe lạgit́te alom hiṛińa.',
+'yourname' => 'Beoboharicaḱ ńutum',
+'yourpassword' => 'Uku namber',
+'yourpasswordagain' => 'Arhõ oku namber olme',
+'remembermypassword' => 'Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)',
+'securelogin-stick-https' => 'Bhitri bolo kate HTTPS re soṅge tãhenme',
+'yourdomainname' => 'Amaḱ ḍomen:',
+'externaldberror' => 'Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.',
+'login' => "bolok' duar",
+'nav-login-createaccount' => 'Boloḱ́ duạr / ekaunt tearme',
+'loginprompt' => '{{SITENAME}}-re boloḱem meneḱ khan amaḱ sendrare kuki kạmi ehoṕ hoyoḱtama.',
+'userlogin' => 'Bhitri bolon / ekaunṭ tear',
+'userloginnocreate' => 'Bhitri bolo',
+'logout' => 'Bahre oḍoń',
+'userlogout' => 'Bahre oḍoń',
+'notloggedin' => 'Bhitri baṅ bolokana',
+'nologin' => "Amaḱ do cet́ wikipeḍiare ekaunṭ banuḱtama? Ado '''$1'''",
+'nologinlink' => 'account tear me',
+'createaccount' => 'Ṭhai benaome',
+'gotaccount' => 'Amaḱ do cet́ miṭten ekaunṭ tear menaḱtama? $1 tearmẽ.',
+'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ṅ tear lena: $1',
+'nocookiesnew' => 'Beoharićaḱ ekaunṭ tear hoe akana, menkhan am do nit hạbićte ekaunṭre bam boloakana. {{SITENAME}} re kuki beohar kate beoharićaḱ ekaunṭre boloa.
+Amaḱ sendrare kukiko bondo hoeakana. Dayakate kukiko kạmi hoe ocoemẽ ar amaḱ nãwã beohar ńutum ar uku nambar beohar hotete noa ekaunṭre boloḱmẽ.',
+'nocookieslogin' => '{{SITENAME}} re kuki hotete beoharićaḱ bhitri boloḱ do hoyoḱa. Amaḱ sendrare kuki bondo menaḱa. Kuki cạlu kate arhõ kurumuṭuimẽ.',
+'nocookiesfornew' => 'Beoharićaḱ ekaunṭ do baṅ tear akana, Cedaḱ je noa ńamoḱ jaega babote ale do bale uruma.
+Ale do baḍae ocolem amaḱ kuki doe kạmikana, sakam do arhõ rakaṕ lạgit́te kurumuṭuemẽ.',
+'noname' => 'Am do asol beoharićaḱ ńutum ṭhikte bam emakada.',
+'loginsuccesstitle' => 'Bhitri boloḱ do moctege puraoena',
+'loginsuccess' => '\'\'\'Am do nitge "$1" ńutumte {{SITENAME}} rem bolo akana.',
+'nosuchuser' => '"$1" ńutuman jahan beoharić bạnuea.
+Beoharićaḱ ńutum do bukṛogea.
+Amaḱ bananko ńelmẽ, se [[Special:Userlogin/signup nãwã mit́ṭen ekaunṭ tearmẽ]].',
+'nosuchusershort' => '"$1" ńutuman jahãe beoharko do banuḱkoa. Ńutum reaḱ banan biḍaomẽ.',
+'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' => 'Uku nambar do {{PLURAL:$1 1 horop reaḱ $1 horop reaḱ}} mudre hoyoḱ jạruṛa.',
+'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' => '"$1" beoharić lạgit́te do jahan e-mail ṭhikana rukhiyạ 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.',
+'blocked-mailpassword' => 'Amaḱ IP ṭhikạna khon sompadon do bondo menaḱa, Onate noa ṭhikạna baṅ beohar kate uku nambar ruạṛ baṅ hoyoḱa.',
+'mailerror' => 'E-mail kulte eṭkẽṭõrẽ: $1',
+'emailauthenticated' => 'Amaḱ e-mail ṭhikạna do $2 tạrikh reaḱ $3 re jạhirena.',
+'emailnotauthenticated' => 'Amaḱ e-mail reaḱ ṭhikạna do <strong> nit hõ baṅ jacay akana</strong> latar reaḱ features lạgit́te jahan e-mail do baṅkuloḱa.',
+'noemailprefs' => 'Noa features ko kạmie ocoy lạgit́te mit́ṭen e-mail ṭhikạna dohoe hoyoḱa.',
+'emailconfirmlink' => 'Amaḱ e-mail ṭhikana do sạriyme.',
+'invalidemailaddress' => 'Noa e-mail ṭhikạna do baṅ hataoa, karon noa formeṭ do pusṭạote baṅ em akana. Dayakate pusṭao formeṭte ṭhikạna emmẽ, se khet do khạliemẽ.',
+'cannotchangeemail' => 'Ekaunṭ e-mail ṭhikạnakodo noa wiki re baṅ bodoloḱ kana.',
+'emaildisabled' => 'Noa sayeṭre do e-mail em subita bạnuḱa.',
+'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.',
+'usernamehasherror' => 'Beoharićaḱ ńutumre hes horop baṅ tahẽdaṛeaḱa',
+'login-throttled' => 'Am do mitghạri lahare por por aema dhao boloḱem kurumuṭu keda.
+Arhõ kurumuṭue lahare dayakate thoṛagan tạṅgiemẽ.',
+'login-abort-generic' => 'Amaḱ bhitri boloḱ do baṅ hoylena - batena.',
+'loginlanguagelabel' => 'katha: $1',
+
+# E-mail sending
+'user-mail-no-addy' => 'Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.',
+
+# 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',
+'resetpass-temp-password' => 'Nit lạgit uku nambar:',
+
+# Special:PasswordReset
+'passwordreset' => 'Nãwãte oku nambar emme',
+'passwordreset-text' => 'Amaḱ ekaunṭ reaḱ purapuri thuti e-mail hotete ńam lạgit́te latar reaḱ forom purạomẽ.',
+'passwordreset-legend' => 'Nãwãte oku nambar emme',
+'passwordreset-disabled' => 'Noa wikire amaḱ uku nambar nãwãte em lạgit subita do bando gea.',
+'passwordreset-pretext' => '{{PLURAL:$1 latar re menaḱ ḍaṭako khon mit́ṭen emmẽ}}',
+'passwordreset-username' => 'Beoharicaḱ ńutum:',
+'passwordreset-domain' => 'Ḍomen:',
+'passwordreset-capture' => 'Sendra fol reaḱ e-mail ńelmẽ?',
+'passwordreset-capture-help' => 'Am do judi noa jacạy baksom lin lekhan, tobe nit lạgit́te em akan uku nambar são mit́ṭen e-mail ame uduḱama ar ona sãote beoharić ṭhen ona kuluḱa.',
+'passwordreset-email' => 'E-mail ṭhikạna:',
+'passwordreset-emailtitle' => '{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko',
+'passwordreset-emailelement' => 'Beoharićaḱ ńutum: $1
+Mit́ ghạṛi lạgit uku nambar: $2',
+'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' => 'Disạ ruạṛ oco lạgit́te mit́ṭen e-mail tear hoelena, oka do latarre udugoḱkana, menkhan $1 beoharić ṭhen  ṭhen baṅ kul hoe akana.',
+
+# 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 http://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 dohoeme',
+'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."',
+'missingcommenttext' => 'Daya kate amaḱ menaḱ katha latare olmẽ.',
+'summary-preview' => 'Guṭ katha unuduḱ:',
+'subject-preview' => 'Babot/Guṭkatha unuduḱ:',
+'blockedtitle' => 'Beoharić doe eset ocoakana.',
+'blockednoreason' => 'jahan babot baṅ em akana',
+'whitelistedittext' => 'Sakamre sompadon lạgit́te $1 em hoyoḱa.',
+'nosuchsectiontitle' => 'Pahaṭa bȧn ńamlena',
+'loginreqtitle' => 'Boloḱ jạruṛa',
+'loginreqlink' => 'Bhitri boloḱ',
+'loginreqpagetext' => 'Eṭagaḱ sakamko ńel lạgit́te do am $1 hoyoḱ jạruṛtama.',
+'accmailtitle' => 'Uku nambar do kulena.',
+'accmailtext' => '[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.
+Bhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar "[[Special:ChangePassword Change password]]" sakam khonem bodol daṛyakya.',
+'newarticle' => '(Nãwa)',
+'newarticletext' => "Am do oka mitṭen joṛaoem pańja akada, onaṭak do bạnuḱa.
+Ona sakam tear lạgit́te, latar reaḱ baksore ol ehoṕmẽ (arhõ jạsti baḍae lạgit́te [[{{mediaWiki:Helppage}}help page]] pańjaemẽ).
+Am do judi nonḍe vulkatem heć akan khan, tobe amaḱ sendrakore '''back''' baṭon linmẽ.",
+'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>.',
+'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.',
+'userpage-userdoesnotexist-view' => 'Beoharićaḱ "$1" ekaunṭ do baṅ resṭire akana.',
+'blocked-notice-logextract' => 'Nui beoharić do nitoḱe esetgea.
+Refarens lạgit́te nahaḱ boloḱ do latare em hoena:',
+'updated' => '(Halot ruaṛ)',
+'note' => "'''Noṭ:'''",
+'previewnote' => "'''kheyalmẽ, noa do eken ńeloḱ lạgit.'''
+Amaḱ bodolaḱ kodo nit habićte bań rukhíạakana!",
+'continue-editing' => 'Toṅge calaḱkana',
+'editing' => 'Joṛao do purạena: $1',
+'creating' => '$1 sakam doe tear akada',
+'editingsection' => 'Joṛao $1 (hạṭiń)',
+'editingcomment' => 'Sompadon akadae $1 (Nãwa pahaṭa)',
+'editconflict' => 'Sompadon reaḱ bene bạiri: $1',
+'yourtext' => 'Amaḱ ol',
+'storedversion' => 'Rukhiyạ nãwã aroe',
+'nonunicodebrowser' => "'''Sontoro: Amaḱ sendra reaḱ eunikoḍ-gate sompok baṅ kana. Am do je lekate apod baṅ hoe kate noam sompadon daṛeaḱ, ona lạgit́ somadhan menaḱa: baṅaski karecṭarko do heskaḍesimal koḍ hisạbte udug hoyoḱa.'''",
+'yourdiff' => 'Farak',
+'templatesused' => 'Noa sakamre beoharen {{PLURAL:$1 ṭempeleṭ ṭempeleṭko}}:',
+'template-protected' => 'Rukhiạ',
+'template-semiprotected' => '(Kạṭic-rukhiyạ)',
+'hiddencategories' => 'Noa sakam do {{PLURAL:$1 1 ukuakan bhag $1 uku akan bhagkorenaḱ}} gaõtarenge:',
+'nocreatetitle' => 'Sakam tear do akoṭgea',
+'nocreate-loggedin' => 'Nãwã sakam tear lạgit́te am do ạidạri em baṅ hoeakana.',
+'sectioneditnotsupported-title' => 'Pahaṭa sompadona do bae hataoeda',
+'sectioneditnotsupported-text' => 'Noa sompadona sakamre pahaṭa sompadona do bae hataoeda',
+'permissionserrors' => 'Ạidạri vulko',
+'permissionserrorstext' => 'Noa kạmi amaḱ ạidạri do banuḱa, {{PLURAL:$1 gan karon reaḱ gan karon reaḱ}} lạgit:',
+'permissionserrorstext-withaction' => 'Amaḱ $2 kạmire ạydạri do bạnuḱa, Ona reaḱ {{PLURAL:$1 Karon/ Karonko}}:',
+'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.',
+'log-fulllog' => 'Joto cạbi udugmẽ',
+'edit-hook-aborted' => 'Huk hotete joto sompadonko bạgi hoeakana.
+Noa reaḱ jahan katha do bạnuḱa.',
+'edit-gone-missing' => 'Sakam do baṅ halot ruạṛlena.
+Pasecc: sakam do ocoǵ hoeakana.',
+'edit-conflict' => 'Sompadon reṭepeṭe.',
+'edit-no-change' => 'Amaḱ sompadon do baṅ hataolena, Cedaḱ je olre jahan bodol bạnuḱa.',
+'edit-already-exists' => 'Nãwã sakam baṅ tear lena.
+Sakam do laha khon menaḱgea.',
+'defaultmessagetext' => 'Sedae olko',
+
+# 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',
+'post-expand-template-argument-warning' => "'''Sontoroḱmẽ:''' Noa sakamre komse kom mitṭen forma joṛao menaḱa ạḍi lạṭute pasnao akana.
+Onate noa ạrgumenṭkodo bạgi giḍi hoena.",
+'post-expand-template-argument-category' => 'Bagi forma ạrgumenṭ sapdoho sakam',
+
+# Account creation failure
+'cantcreateaccounttitle' => 'Ekaunṭ do baṅ tearlena',
+
+# History pages
+'viewpagelogs' => 'Noa sakam reaḱ cạbi udukme',
+'nohistory' => 'Noa sakam re do jahan sompadon reaḱ jạṛ bạnuḱa.',
+'currentrev' => 'Mucạt nãwã aroe',
+'currentrev-asof' => 'Mucạt nãwã aroy',
+'revisionasof' => 'Nãwã aro sakam $1 leka',
+'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ḱ',
+'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br/>
+Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:last}})''' = laha reaḱ nãwã aroe sãote tulạo, '''{{int:minoreditletter}}''' = huḍiń sompadon.",
+'history-fieldset-title' => 'Sendray jaṛ',
+'history-show-deleted' => 'khạli get giḍiyaḱ koge',
+'histfirst' => "adi laha-ak'",
+'histlast' => 'Nahak',
+'historysize' => '({{PLURAL:$1 1 bayeṭ $1 bayeṭko}})',
+'historyempty' => '(banuḱa)',
+
+# Revision feed
+'history-feed-title' => 'Jạṛ nãwã aroy',
+'history-feed-description' => 'Noa wikire noa sakam reaḱ nãwã aroe jạṛ',
+'history-feed-item-nocomment' => 're',
+
+# Revision deletion
+'rev-deleted-comment' => '(Sompadon reaḱ guṭ katha do ocoǵ hoena)',
+'rev-deleted-user' => '(laṛcaṛić ńutum ocoḱena)',
+'rev-deleted-event' => '(Log kạmi do ocog hoena)',
+'rev-deleted-user-contribs' => '[Beoharićaḱ ńutum se IP ṭhikạna do ocog hoena - kạmi khon sompadon do uku hoe akana]',
+'rev-delundel' => 'ńeloḱ/danaṅ',
+'rev-showdeleted' => 'Uduḱme',
+'revisiondelete' => 'Get giḍi/nãwã aro baṅ getgiḍi',
+'revdelete-nologtype-title' => 'Jahan cạbi ṭayep baṅ em emakana',
+'revdelete-nologtype-text' => 'Am do paseć noa kạmie lạgit́te jahan cạbi bam bachao akada.',
+'revdelete-show-file-submit' => 'Hẽ',
+'revdelete-hide-text' => 'Nãwã aroe olko ukuemẽ',
+'revdelete-hide-image' => 'Rẽt reaḱ babotko ukue mẽ',
+'revdelete-hide-name' => 'Kạmi ar bejha ukue mẽ',
+'revdelete-hide-comment' => 'Sompadon gut katha ukue mẽ',
+'revdelete-hide-user' => 'Sompadonićaḱ beohar ńutum/IP ṭhikạna ukuemẽ',
+'revdelete-radio-same' => '(alom bodola)',
+'revdelete-radio-set' => 'Hẽ',
+'revdelete-radio-unset' => 'Baṅ',
+'revdelete-log' => 'Babot:',
+'revdel-restore' => 'Judạ lekate ńel',
+'revdel-restore-deleted' => 'giḍikaḱ ńel ruạṛ',
+'revdel-restore-visible' => 'Ńeloḱ leka paṛhao ruạṛ',
+'pagehist' => 'Sakam reaḱ jạṛ',
+'deletedhist' => 'Get giḍi jạṛ',
+'revdelete-reasonotherlist' => 'Eṭaḱak karon',
+
+# History merging
+'mergehistory-reason' => 'Babot:',
+
+# Merge log
+'revertmerge' => 'bań mit́',
+
+# Diffs
+'history-title' => '"$1": Jạṛ nãwã aroe',
+'lineno' => 'Sạr $1:',
+'compareselectedversions' => 'Noa barea nãwã bachawanaḱ talare tolonayme',
+'editundo' => 'ruạṛ',
+'diff-multi' => '({{PLURAL:$2 mit́ṭen beoharic $2 hoṛ beoharkin}} Sompadon hoena {{PLURAL:$1 mit́ṭen do mitghạṛi lạgit sudhrạo mit́ṭen do mitghạṛi lạgit sudhrạo}} baṅ uduḱlena.)',
+
+# 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',
+'searchhelp-url' => 'Help: Goṛawaḱ',
+'searchprofile-articles' => 'Menaḱaḱ sakamko',
+'searchprofile-project' => 'Go̠ṛo ar Project sakam',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sanamaḱ 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' => '$1 ({{PLURAL:$2 1 Aṛaṅ$2 Aṛaṅko}})',
+'search-result-category-size' => '{{PLURAL: $1 1 gãoren $1 gãota renko}} ({{PLURAL: $2 1 kạṭic rokom sokom $ 2 goṭen}}, {{PLURAL:$3 1 rẽt $3 rẽtko}})',
+'search-redirect' => '($1 te sujhi doṛha )',
+'search-section' => '(Pahaṭa $1)',
+'search-suggest' => 'Am do cet́ $1 em menocoyet tãhẽkana',
+'search-interwiki-caption' => 'Hopon porjekṭko',
+'search-interwiki-default' => '$1 folko:',
+'search-interwiki-more' => '(Arhõ)',
+'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',
+'powersearch-togglelabel' => 'Sendra',
+'powersearch-toggleall' => 'Sanamaḱ',
+'powersearch-togglenone' => 'Okaṭaḱ hõ baṅ',
+
+# Quickbar
+'qbsettings-none' => 'Okaṭaḱ hõ baṅ',
+
+# Preferences page
+'preferences' => 'Pạsindko',
+'mypreferences' => 'Iñaḱ pạsindko',
+'changepassword' => 'Uku nombor bodolme',
+'prefs-skin' => 'Harta',
+'skin-preview' => 'Ńel, Unuduḱ',
+'datedefault' => 'Pạsind banuḱa',
+'prefs-resetpass' => 'Uku nombor bodolme',
+'prefs-changeemail' => 'E-mail ṭhikạna bodolme',
+'prefs-setemail' => 'E-mail ṭhikana benaome',
+'saveprefs' => 'Rukhiyạymẽ',
+'resetprefs' => 'Baṅ rukhiyạaḱ ocogmẽ',
+'rows' => 'Sạrko:',
+'searchresultshead' => 'Sendra',
+'timezoneregion-africa' => 'Aphrika',
+'timezoneregion-america' => 'Amirika',
+'timezoneregion-asia' => 'Esiya',
+'timezoneregion-australia' => 'Ausṭralia',
+'prefs-files' => 'Rẽtko',
+'youremail' => 'E-mail:',
+'username' => 'Beoharićaḱ ńutum:',
+'uid' => 'Beoharićaḱ cinhạo nombor',
+'yourrealname' => 'Sạri ńutum',
+'yourlanguage' => 'Pạrsi:',
+'gender-male' => 'Baba hoṛ',
+'gender-female' => 'Gogo hoṛ, Kuṛi, Kuṛi gidrạ',
+'email' => 'E-mail',
+'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',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail ṭhikạna do jewetge ńamena',
+'email-address-validity-invalid' => 'Amaḱ jewet e-mail ṭhkạna emmẽ',
+
+# User rights
+'userrights' => 'Beoharićaḱ laṛcaṛ ektiạrko',
+'userrights-lookup-user' => 'Beoharkoaḱ gãotako laṛcaṛ',
+'userrights-user-editname' => 'Beoharićaḱ ńutum emmẽ',
+'editusergroup' => 'Beoharićaḱ gãotako toṅgeymẽ',
+'userrights-editusergroup' => 'Beoharićaḱ gãotako toṅgeymẽ',
+'saveusergroups' => 'Beoharićaḱ gãotako rukhiyaymẽ',
+
+# Rights
+'right-read' => 'Sakamko paṛhaomẽ',
+'right-edit' => 'Sakamko toṅge',
+'right-createpage' => 'Sakamko benoamẽ (Okako do galmarao sakamko baṅkan)',
+'right-createtalk' => 'Galmarao sakamko benaomẽ',
+'right-createaccount' => 'Nãwã beoharićaḱ ekaunṭ tearmẽ',
+'right-move' => 'Sakamko ocogmẽ',
+'right-move-subpages' => 'Sakam saõte kạtic sakamko ocogmẽ',
+'right-movefile' => 'Rẽtko ocogmẽ',
+'right-upload' => 'Rẽtko rakabmẽ',
+'right-delete' => 'Sakamko get giḍiymẽ',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'noa sakam joṛao',
+
+# Recent changes
+'nchanges' => '$1 {{PLURAL:$1 bodol bodolko}}',
+'recentchanges' => 'Nãwã bo̠do̠lko',
+'recentchanges-legend' => 'Nahaḱ bodol teaḱko',
+'recentchanges-summary' => 'Noa sakamre wiki reaḱ joto khon nãwã bodolko paṅjaṅjaymẽ.',
+'recentchanges-feed-description' => 'Noa feedre wiki reaḱ joto khon nãwã bodolko paṅjaymẽ',
+'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',
+'rcnote' => "Latar reaḱ {{PLURAL:$2 dinre '''$2''' dinre}} hoyena {{PLURAL:$1 '''1''' '''$1'''}}gan bodol latare uduḱena ((okare nitaḱ okte ar tạrikh do $5, $4).",
+'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ḱ',
+'rcshowhidepatr' => '$1 Biḍạen sompadonko',
+'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',
+'uploadbtn' => 'Rẽt rakabmẽ',
+'uploadlogpage' => 'Chạbi do uthạome',
+'filename' => 'Rẽt ńutum',
+'filedesc' => 'Guṭ katha',
+'fileuploadsummary' => 'Guṭ katha',
+'savefile' => 'Rẽt rukhiyaymẽ',
+'uploadedimage' => '"[[$1]]" rakaṕ huyena',
+'upload-description' => 'Rẽt reaḱ jạṛ',
+'watchthisupload' => 'Noa rẽt ńelmẽ',
+
+'upload-file-error' => 'Bhitri reaḱ bhul',
+
+'license' => 'Laisence benao',
+'license-header' => 'Laisense benao',
+
+# Special:ListFiles
+'imgfile' => 'Rẽt',
+'listfiles' => 'Rẽt reaḱ tạlika',
+'listfiles_date' => 'Tạrikh',
+'listfiles_name' => 'Ńutum',
+'listfiles_user' => 'Beoharić, Laṛcaṛic',
+
+# 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-deleteall' => 'Joto get giḍi',
+'filehist-deleteone' => 'Get giḍi',
+'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' => 'Latar reaḱ {{PLURAL:$1 sakam $1 sakam}} khon noa rẽtre 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',
+'statistics-pages' => 'Sakamko',
+
+'disambiguationspage' => 'sujhi',
+
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|baiṭ|baiṭ}}',
+'nmembers' => '$1 {{PLURAL:$1 Gaõtaren Gaõtarenko}}',
+'prefixindex' => 'Sanam sakam re joṛao menaḱ',
+'shortpages' => 'Huḍiń sakamko',
+'longpages' => 'Jiliń sakamko',
+'listusers' => 'beoharićaḱ tạlika',
+'usercreated' => '{{JẠT: $3 | benawakan}} $1 tarikre $2 okte',
+'newpages' => 'Nãwa Patako',
+'newpages-username' => 'Beoharićaḱ ńutum:',
+'ancientpages' => 'Mare sakamko',
+'move' => 'Ocoḱme, Kulme',
+'movethispage' => 'Noa sakam ocogmẽ',
+'pager-newer-n' => '{{PLURAL:$1 nãwaw aroyen 1ṭen nãwã aroyen $1ṭen}}',
+'pager-older-n' => '{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}',
+
+# 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',
+'allpagesprev' => 'Tayom sećaḱ',
+'allpagesnext' => 'Laha seć',
+'allpagessubmit' => 'Calaḱme',
+
+# Special:Categories
+'categories' => 'rokom sokom',
+
+# Special:LinkSearch
+'linksearch-line' => '$2 khon $1 re joṛao hoeakana',
+
+# Special:ListUsers
+'listusers-submit' => 'Udugmẽ',
+'listusers-blocked' => '(Esetgea)',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Laṛcaṛićaḱ tear cạbi',
+
+# Special:ListGroupRights
+'listgrouprights-group' => 'Gaõta',
+'listgrouprights-rights' => 'Ạidạriko',
+'listgrouprights-helppage' => 'Goṛo:Gaõta ạidạri',
+'listgrouprights-members' => 'Saõtenkoaḱ tạlika',
+'listgrouprights-addgroup-all' => 'Joto gaõtare ko soṅgekom',
+'listgrouprights-removegroup-all' => 'Joto gaõtaren ko ocoḱgiḍikom',
+
+# E-mail user
+'emailuser' => 'Nui beoharić e-mail emayme',
+'emailpage' => 'E-mail beoharić',
+'noemailtitle' => 'E-mail ṭhikạna do banuḱa',
+'emailusername' => 'Beoharićaḱ ńutum:',
+'emailusernamesubmit' => 'Em',
+'emailfrom' => 'Kulić:',
+'emailto' => 'Ńamić:',
+'emailmessage' => 'Mesag',
+'emailsend' => 'Kulmẽ',
+
+# Watchlist
+'watchlist' => "Inak' n'el ko",
+'mywatchlist' => 'Iñak jagarna tạlikạ',
+'watchlistfor2' => '$1 ($2) lạ̣gitte',
+'watch' => 'Ńelme',
+'unwatch' => "bang nelok' a",
+'watchlist-details' => 'Baṅ purạo tạlikare {{PLURAL:$1ṭen sakam $1 ṭen sakam}} menaḱa (roṛ sakamko lekhare baṅ sapkate)',
+'wlshowlast' => 'Mucạtet́ udukmẽ $1 baje $2 maha $3',
+'watchlist-options' => 'Ńelok tạlika reak sonketko',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Ńeloḱ kana...',
+
+'changed' => 'Bodolena',
+
+# Delete
+'deletepage' => 'Sakam get giḍikam',
+'delete-legend' => 'Get giḍi',
+'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ạgeya "[[$1]]"',
+'protectcomment' => 'karon',
+'protectexpiry' => 'Cabaḱ',
+
+# Restrictions (nouns)
+'restriction-edit' => 'Toṅge',
+'restriction-move' => 'Ocoḱmẽ, Kulmẽ',
+'restriction-create' => 'Tearmẽ, Benaomẽ',
+
+# 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' => '$1 Beoharićaḱ kạmiko',
+'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' => 'Oka sakam ko do "$1"-re joṛao menaḱa',
+'whatlinkshere-page' => 'Sakam',
+'linkshere' => "Latar reaḱ sakamko do '''[[:$1]]''' sakamre joṛao menaḱa:",
+'nolinkshere' => "Jahan sakam khon '''[[:$1]]''' sakamre joṛao bạnuḱa",
+'isredirect' => 'Bań sojhe sakam',
+'istemplate' => 'Ar mit́ teć sãote joṛao',
+'isimage' => 'Ret joṛao',
+'whatlinkshere-prev' => '{{PLURAL:$1 Laha reaḱ Laha reaḱ$1ṭen}}',
+'whatlinkshere-next' => '{{PLURAL:$1 |Laha renaḱ | Laha renaḱko $1}}',
+'whatlinkshere-links' => 'Joṛaoko',
+'whatlinkshere-hideredirs' => '$1 acurgeya',
+'whatlinkshere-hidetrans' => '$1 ṭarnskuleson uduḱme',
+'whatlinkshere-hidelinks' => '$1 joṛao',
+'whatlinkshere-hideimages' => '$1 Chubi joṛaoko',
+'whatlinkshere-filters' => 'Sapha',
+
+# Block/unblock
+'block' => 'Beoharić esedem',
+'blockip' => 'Beoharić esedem',
+'blockip-title' => 'Beoharić esedem',
+'blockip-legend' => 'Beoharić esedem',
+'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',
+'ipblocklist-submit' => 'Sendra',
+'emailblock' => 'E-mail do esetgea',
+'blocklink' => 'Eset́',
+'unblocklink' => 'bań block',
+'change-blocklink' => 'block judạ',
+'contribslink' => 'em daṛeaḱ',
+'emaillink' => 'E-mail kulmẽ',
+'blocklogpage' => 'Tala eset',
+'blocklogentry' => 'Eset [[$1]] sãote cabaḱ okte oka do $2 $3',
+'block-log-flags-nocreate' => 'Ekaunṭ benao do bondogeya',
+'block-log-flags-noemail' => 'E-mail do esetgea',
+'block-log-flags-hiddenname' => 'Beoharićaḱ ńutum do ukugea',
+'blockme' => 'Esedińmẽ',
+'proxyblocksuccess' => 'Hoena',
+
+# Move page
+'movepagebtn' => 'Sakam ocogmẽ, Sakam kulmẽ',
+'pagemovedsub' => 'Ocogoḱ do hoena',
+'movelogpage' => 'Tala cạbi ocoḱme',
+'revertmove' => 'ruạr agu',
+
+# Export
+'export' => 'Aguyen sakamko',
+'export-addcat' => 'Joṛaomẽ',
+'export-addns' => 'Joṛaomẽ',
+
+# Namespace 8 related
+'allmessagesname' => 'Ńutum',
+'allmessagesdefault' => 'Bań bhul mesag ol',
+'allmessages-filter-all' => 'Sanamaḱ',
+'allmessages-filter-submit' => 'Calaḱmẽ',
+
+# Thumbnails
+'thumbnail-more' => 'Lạṭui mẽ',
+'thumbnail_error' => 'Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1',
+
+# Special:Import
+'import-upload-filename' => 'Rẽt ńutum',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Amaḱ́ bebo̠harić sakam',
+'tooltip-pt-mytalk' => 'Amaḱ katha ro̠ṛrenaḱ́ sakam',
+'tooltip-pt-preferences' => 'Amaḱ pạsindko',
+'tooltip-pt-watchlist' => 'Sakam tạlika okaṭak̕katet́ 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' => 'O̠nḍo̠ń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-help' => 'Goṛo sakam ńelmẽ',
+'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-preferences-save' => 'Pạsindko rukhiyaymẽ',
+'tooltip-summary' => 'Khaṭote guṭ katha bhoraome',
+
+# Attribution
+'others' => 'Eṭagaḱko',
+
+# Info page
+'pageinfo-header-edits' => 'Toṅgeko',
+'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',
+'svg-long-desc' => 'SVG rẽt, normalte $1 x $2 pixels, rẽt sayej: $3',
+'show-big-image' => 'Purạo resulation',
+
+# Special:NewFiles
+'ilsubmit' => 'Sendra',
+
+# 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ń',
+
+# EXIF tags
+'exif-imagewidth' => 'Ganḍe',
+'exif-imagelength' => 'Usul',
+'exif-datetime' => 'Rẽt bodol reaḱ tạrikh ar okte',
+'exif-artist' => 'Onoliạ',
+
+# 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',
+'watchlisttools-raw' => 'Baṇ purạo akan ńelok tạlika purạomẽ',
+
+# Core parser functions
+'duplicate-defaultsort' => "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
+
+# Special:SpecialPages
+'specialpages' => 'Jạruṛ patako',
+
+# External image whitelist
+'external_image_whitelist' => '#Noa sakam do cet leka menaḱa oṅkage dohoemẽ
+#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ
+#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa
+#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa
+#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka
+#Noa do kas-baṅ rimjhạoaḱge
+#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ</pre>',
+
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] saphay:',
+
+);
index 3b9163a..e7eb926 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sardinian (Sardu)
+/** Sardinian (sardu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -617,7 +617,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 
 # Diffs
 'history-title' => 'Istòria de is revisiones de "$1"',
-'difference' => '(Diferèntzias intre revisiones)',
 'lineno' => 'Lìnia $1:',
 'compareselectedversions' => 'Cumpara versiones scioberadas',
 'editundo' => 'annudda',
index f84871a..2f1f1dc 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Sicilian (Sicilianu)
+/** Sicilian (sicilianu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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",
@@ -950,7 +951,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 
 # Diffs
 'history-title' => 'Crunoluggìa dî canciamenti di "$1"',
-'difference' => '(Diffirenzi tra li rivisioni)',
 'lineno' => 'Lìnia $1:',
 'compareselectedversions' => 'Fari lu paraguni',
 'showhideselectedversions' => 'Ammustra/ammuccia virsioni silizziunati',
@@ -1281,7 +1281,7 @@ L'operazioni nun pò èssiri annullata.",
 'nchanges' => '$1 {{PLURAL:$1|canciamentu|canciamenti}}',
 'recentchanges' => 'Ùrtimi canciamenti',
 'recentchanges-legend' => 'Opzioni ùrtimi canciamenti',
-'recentchangestext' => 'Chista pàggina prisenta li canci cchiù ricenti ê cuntinuti dô situ.',
+'recentchanges-summary' => 'Chista pàggina prisenta li canci cchiù ricenti ê cuntinuti dô situ.',
 'recentchanges-feed-description' => 'Stu feed riporta li canciamenti cchiù ricenti a li cuntinuti dû situ.',
 'recentchanges-label-newpage' => 'This edit havi creatu na nova pàggina',
 'recentchanges-label-minor' => 'Chista è nu canciamentu nnicu',
index 485583e..fb14ac7 100644 (file)
@@ -692,7 +692,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 
 # Diffs
 'history-title' => 'Revision history of "$1"',
-'difference' => '(Difference atween revisions)',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compare selectit versions',
 'editundo' => 'undo',
@@ -827,7 +826,7 @@ Yer e-mail address insae revealed whin ither uisers contact ye.",
 'nchanges' => '$1 {{PLURAL:$1|chynge|chynges}}',
 'recentchanges' => 'Recent chynges',
 'recentchanges-legend' => 'Recent changes options',
-'recentchangestext' => 'Follae the maist recent chynges tae the wiki on this page.',
+'recentchanges-summary' => 'Follae the maist recent chynges tae the wiki on this page.',
 'recentchanges-feed-description' => 'Follae the maist recent chynges tae the wiki in this feed.',
 'recentchanges-label-newpage' => 'This edit created a freish page',
 'recentchanges-label-minor' => 'This is a smaa edit',
index 5505e63..298fd95 100644 (file)
@@ -515,7 +515,6 @@ You cannot use the 'e-mail this user' feature unless a valid e-mail address is s
 
 # Diffs
 'history-title' => '"$1" جي سوانح',
-'difference' => '(مسودن درميان تفاوت)',
 'lineno' => 'سِٽَ $1:',
 'compareselectedversions' => 'چونڊيل پرت ڀيٽيو',
 'editundo' => 'اڻڪريو',
index 4637bae..5db1519 100644 (file)
@@ -763,7 +763,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 
 # Diffs
 'history-title' => 'Cronologia di li mudìfigghi di "$1"',
-'difference' => '(Diffarènzia i li ribisioni)',
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Cunfronta li versioni sciubaraddi',
 'editundo' => 'annulla',
@@ -928,7 +927,7 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'nchanges' => '$1 {{PLURAL:$1|mudìfigga|mudìfigghi}}',
 'recentchanges' => 'Ulthimi mudìfigghi',
 'recentchanges-legend' => 'Opzioni ulthimi mudifigghi',
-'recentchangestext' => 'Chistha pàgina prisinta li mudìfigghi più rizzenti a li cuntinuddi di lu situ.',
+'recentchanges-summary' => 'Chistha pàgina prisinta li mudìfigghi più rizzenti a li cuntinuddi di lu situ.',
 'recentchanges-feed-description' => 'Chisthu feed cunteni li mudìfigghi più rizzenti a li cuntinuddi di lu situ.',
 'rcnote' => "Inogghi {{PLURAL:$1|è erencadda la mudìfigga più rizzenti arriggadda|so erencaddi li '''$1''' mudìfigghi più rizzenti arriggaddi}} a lu situ {{PLURAL:$2|i' l'ulthimi 24 ori|i' li '''$2''' dì passaddi}}; i dati so aggiornaddi a li $5 di lu $4.",
 'rcnotefrom' => "Inogghi so erencaddi li mudìfigghi arriggaddi a parthì da '''$2''' (finz'a '''$1''').",
index cd677cd..be89336 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Northern Sami (Sámegiella)
+/** Northern Sami (sámegiella)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,6 +7,8 @@
  * @ingroup Language
  * @file
  *
+ * @author Gálaniitoluodda
+ * @author Jeblad
  * @author Kaganer
  * @author Laila
  * @author Skuolfi
  * @author לערי ריינהארט
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Media',
+       NS_SPECIAL          => 'Doaimmat',
+       NS_TALK             => 'Ságastallan',
+       NS_USER             => 'Geavaheaddji',
+       NS_USER_TALK        => 'Geavaheaddjeságastallan',
+       NS_PROJECT_TALK     => '$1-ságastallan',
+       NS_FILE             => 'Fiila',
+       NS_FILE_TALK        => 'Fiilaságastallan',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki-ságastallan',
+       NS_TEMPLATE         => 'Málle',
+       NS_TEMPLATE_TALK    => 'Málleságastallan',
+       NS_HELP             => 'Veahkki',
+       NS_HELP_TALK        => 'Veahkkeságastallan',
+       NS_CATEGORY         => 'Kategoriija',
+       NS_CATEGORY_TALK    => 'Kategoriijaságastallan',
+);
+
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Aktiivvalaš_geavaheaddjit' ),
+       'Allmessages'               => array( 'Buot_systemasánit' ),
+       'Allpages'                  => array( 'Buot_siiddut' ),
+       'Ancientpages'              => array( 'Dološ_siiddut' ),
+       'Block'                     => array( 'Cagge_geavaheaddji' ),
+       'Booksources'               => array( 'Girjegáldut' ),
+       'Categories'                => array( 'Kategoriijat' ),
+       'Contributions'             => array( 'Geavaheaddji_rievdadusat' ),
+       'Disambiguations'           => array( 'Liŋkkat_dárkonsiidduide' ),
+       'DoubleRedirects'           => array( 'Guoktegeardásaš_ođđasitstivremat' ),
+       'Export'                    => array( 'Olggosfievrrit_siidduid' ),
+       'Listfiles'                 => array( 'Fiilalogahallan' ),
+       'Listredirects'             => array( 'Listu_ođđasitstivremiin' ),
+       'Listusers'                 => array( 'Listu_geavaheddjiin' ),
+       'Log'                       => array( 'Loggat', 'Logga' ),
+       'Lonelypages'               => array( 'Oarbbes_siiddut' ),
+       'Longpages'                 => array( 'Guhkes_siiddut' ),
+       'MIMEsearch'                => array( 'MIME-ohcan' ),
+       'Newimages'                 => array( 'Ođđa_govat' ),
+       'Newpages'                  => array( 'Ođđa_siiddut' ),
+       'Preferences'               => array( 'Válljemat' ),
+       'Protectedpages'            => array( 'Suodjaluvvon_siiddut' ),
+       'Randompage'                => array( 'Summal_siidu' ),
+       'Randomredirect'            => array( 'Summal_ođđasitstivren' ),
+       'Recentchanges'             => array( 'Varas_rievdadusat' ),
+       'Search'                    => array( 'Oza' ),
+       'Shortpages'                => array( 'Oanehis_siiddut' ),
+       'Specialpages'              => array( 'Erenoamáš_siiddut' ),
+       'Statistics'                => array( 'Statistihkat' ),
+       'Uncategorizedcategories'   => array( 'Klassifiserekeahtes_kategoriijat' ),
+       'Uncategorizedimages'       => array( 'Klassifiserekeahtes_govat' ),
+       'Uncategorizedpages'        => array( 'Klassifiserekeahtes_siiddut' ),
+       'Uncategorizedtemplates'    => array( 'Klassifiserekeahtes_mállevuođut' ),
+       'Unusedcategories'          => array( 'Geavatkeahtes_lágit' ),
+       'Unusedimages'              => array( 'Geavatkeahtes_govat' ),
+       'Unusedtemplates'           => array( 'Geavatkeahtes_mállevuođut' ),
+       'Unwatchedpages'            => array( 'Čuovvotkeahtes_siiddut' ),
+       'Upload'                    => array( 'Sádde_fiilla' ),
+       'Version'                   => array( 'Veršuvdna' ),
+       'Wantedcategories'          => array( 'Kategoriijasávaldagat' ),
+       'Wantedpages'               => array( 'Siidusávaldagat' ),
+       'Watchlist'                 => array( 'Čuovvunlistu' ),
+);
+
+$magicWords = array(
+       'redirect'                => array( '0', '#OĐĐASITSTIVREN', '#STIVREN', '#REDIRECT' ),
+       'numberofarticles'        => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
+);
+
 $linkTrail = '/^(:?[a-zàáâçčʒǯđðéèêëǧǥȟíìîïıǩŋñóòôõßšŧúùûýÿüžþæøåäö]+)(.*)$/sDu';
 
 $messages = array(
@@ -112,17 +183,17 @@ $messages = array(
 'category_header' => 'Siiddut, mat gullet luohkkái $1',
 'subcategories' => 'Vuolleluohkát',
 'category-media-header' => 'Fiillat luohkás ”$1”',
-'category-empty' => "''Dán luohkás eai leat siiddut eaige fiillat.''",
+'category-empty' => "''Dán kategoriijas eai leat siiddut eaige fiillat.''",
 'listingcontinuesabbrev' => 'joatk.',
 
 'about' => 'Dieđut',
-'article' => 'Siidu',
+'article' => 'Sisdoallusiidu',
 'newwindow' => '(leahkasa ođđa vindui)',
 'cancel' => 'Šluhtte',
 'moredotdotdot' => 'Lasi...',
 'mypage' => 'Mu siidu',
 'mytalk' => 'Mu ságastallan',
-'anontalk' => 'Ságastala dán IP-čujuhusain',
+'anontalk' => 'Ságastallan IP-čujuhussii',
 'navigation' => 'Navigašuvdna',
 'and' => '&#32;ja',
 
@@ -136,7 +207,15 @@ $messages = array(
 'qbspecialpages' => 'Doaibmasiiddut',
 
 # Vector skin
+'vector-action-delete' => 'Sihko',
+'vector-action-move' => 'Sirdde',
+'vector-action-protect' => 'Suodjal',
+'vector-action-unprotect' => 'Rievdat suodjaleami',
+'vector-view-create' => 'Álggat',
+'vector-view-edit' => 'Rievdat',
+'vector-view-history' => 'Geahča historjjá',
 'vector-view-view' => 'Loga',
+'vector-view-viewsource' => 'Geahča gáldokoda',
 
 'errorpagetitle' => 'Feaila',
 'returnto' => 'Máhcat siidui $1.',
@@ -146,7 +225,7 @@ $messages = array(
 'searchbutton' => 'Oza',
 'go' => 'Mana',
 'searcharticle' => 'Mana',
-'history' => 'Historjá',
+'history' => 'Siiddu historjá',
 'history_short' => 'Historjá',
 'updatedmarker' => 'beaiváduvvon du ovddit fitnama maŋŋá',
 'printableversion' => 'Prentenveršuvdna',
@@ -168,7 +247,7 @@ $messages = array(
 'specialpage' => 'Sierrasiidu',
 'personaltools' => 'Persovnnalaš bargoneavvu',
 'postcomment' => 'Ođđa sekšuvdna',
-'articlepage' => 'Čájet sisdoallusiiddu',
+'articlepage' => 'Geahča sisdoalu',
 'talk' => 'Ságastallan',
 'views' => 'Čájáhusat',
 'toolbox' => 'Neavvobumbá',
@@ -200,7 +279,7 @@ $messages = array(
 'disclaimerpage' => 'Project:Friijavuohta vástideamis',
 'edithelp' => 'Rievdadanrávvagat',
 'edithelppage' => 'Help:Mo rievdadit siidduid',
-'helppage' => 'Help:Rávvagat',
+'helppage' => 'Help:Sisdoallu',
 'mainpage' => 'Váldosiidu',
 'mainpage-description' => 'Váldosiidu',
 'portal' => 'Gáffestohpu',
@@ -230,7 +309,7 @@ $messages = array(
 'nstab-main' => 'Siidu',
 'nstab-user' => 'Geavaheaddjisiidu',
 'nstab-media' => 'Media',
-'nstab-special' => 'Doaibma',
+'nstab-special' => 'Erenomáš',
 'nstab-project' => 'Prošeaktasiidu',
 'nstab-image' => 'Fiila',
 'nstab-mediawiki' => 'Dieđáhus',
@@ -254,11 +333,11 @@ $messages = array(
 'filedeleteerror' => 'Fiilla <b>$1</b> sihkkun ii lihkosmuvvan.',
 'directorycreateerror' => 'Logahallama ”$1” ráhkadeapmi ii lihkosmuvvan.',
 'filenotfound' => 'Fiila <b>$1</b> ii dihtton.',
-'fileexistserror' => 'Fiilii ”$1” čállin ii lihkosmuvvan: fiila lea anus',
-'formerror' => 'Skovi dieđut eai dohkke',
+'fileexistserror' => 'Fiilii ”$1” čállin ii lihkosmuvvan: fiila lea anus.',
+'formerror' => 'Skovi dieđut eai dohkke.',
 'badarticleerror' => 'Doaimma ii leat vejolaš dahkat dán siiddus.',
 'cannotdelete' => 'Siiddu dahje fiilla sihkkon ii lihkosmuvvan. Muhtun eará lea sáhttán sihkkut dan.',
-'badtitle' => 'Feaila bájilčállagis',
+'badtitle' => 'Fuones bajilčála',
 'badtitletext' => 'Siiddu bájilčállagis lei feaila, dahje dat lei guoros dahje boastut ráhkaduvvon wikiid- dahje gielaidgaskasaš liŋka.',
 'perfcached' => 'Dieđut leat gaskabottosašmuittus eaige sihkkarit vástit dálá hámi. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
 'perfcachedts' => 'Čuovvovaš data lea buktojuvvon gaskabottosašmuittus ja dat lea maŋimusta beaiváduvvon $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
@@ -283,17 +362,17 @@ Du geavaheaddjidovddaldat lea dál anus.
 'login' => 'Čálligoađe sisa',
 'nav-login-createaccount' => 'Daga ođđa geavaheaddjidovddaldaga dahje čálligoađe sisa',
 'loginprompt' => 'Sisačállimii dárbbašuvvojit geavssat (cookies).',
-'userlogin' => 'Daga ođđa geavaheaddjidovddaldaga dahje čálligoađe sisa',
+'userlogin' => 'Logge sisa dahje ráhkat dovddaldaga',
 'logout' => 'Čálligoađe olggos',
 'userlogout' => 'Čálligoađe olggos',
 'notloggedin' => 'It leat čálligoahttan sisa',
 'nologin' => "Jus dus ii vel leat geavaheaddjidovddaldat, sáhtát '''$1''' dakkára.",
 'nologinlink' => 'ráhkadit',
-'createaccount' => 'Ráhkat ođđa geavaheaddjidovddaldaga',
+'createaccount' => 'Ráhkat dovddaldaga',
 'gotaccount' => "Jus dus lea jo geavaheaddjidovddaldat, sáhtát '''$1'''.",
-'gotaccountlink' => 'čálligoahtit sisa',
+'gotaccountlink' => 'Logge sisa',
 'createaccountmail' => 'e-poasttain',
-'badretype' => 'Suollemassánit, maid čállet, eai leat seammalaganat.',
+'badretype' => 'Suollemassánit maid čállet eai leat seammalaganat.',
 'userexists' => 'Geavaheaddjidovddaldat, man evttohit, lea jo anus. Leage buorre ja vállje nubbi geavaheaddjidovddaldaga.',
 'loginerror' => 'Feaila sisačálidettiin',
 'nocookieslogin' => '{{SITENAME}} geavaha diehtočoahkuid (cookies) sisačállima oktavuođas. Du neahttabláđejeaddji ii suova geavahit diehtočoahkuid. Váldde daid atnui ja iskka ođđasit.',
@@ -368,19 +447,19 @@ Du geavaheaddjidovddaldat lea dál anus.
 'showpreview' => 'Geahča ovdalgiihtii',
 'showlivepreview' => 'Ovdalgeahčastan',
 'showdiff' => 'Čájet rievdadusaid',
-'anoneditwarning' => 'It leat čálligoahtán sisa. IP-čujuhusat lasihuvvo dán siiddu rievdadanhistorjái.',
+'anoneditwarning' => "'''Váruhus:''' It leat čálligoahtán sisa. Du IP-čujuhus báhcá dán siiddu ođasmahttinhistorjái.",
 'missingsummary' => 'It leat čállán čoahkkáigeasu. Jus válljet Vurke ođđasit, de rievdadusat maid ráhkadit vurkejuvvo čoahkkáigeasuhaga.',
 'missingcommenttext' => 'Čále čoahkkáigeasu vuollái.',
 'missingcommentheader' => 'It leat čállán bajilčállaga du oaivilii. Vállje <em>Vurke</em>, jus it hálit čállit bajilčállaga.',
 'summary-preview' => 'Čoahkkáigeasu ovdalgihtiigeahččan:',
 'subject-preview' => 'Bajilčállaga ovdalgihtiigeahččan:',
-'blockedtitle' => 'Geavaheaddji lea cakkastallojuvvon',
+'blockedtitle' => 'Geavaheaddji lea cakkojuvvon',
 'whitelistedittext' => 'Don fertet $1, ovdalgo sáhtát rievdadit siidduid.',
 'confirmedittext' => 'It sáhte rievdadit siiddu ovdalgo leat sihkarastan iežat e-poastačujuhusa. Sáhtat sihkarastit [[Special:Preferences|ásahussiidduin]].',
 'nosuchsectiontitle' => 'Diekkár oassi ii gávdno',
 'nosuchsectiontext' => 'Isket rievdadit oasi, mii ii gávdno.',
 'loginreqtitle' => 'Sisačállin gáibiduvvo',
-'loginreqlink' => 'čálligoađe sisa',
+'loginreqlink' => 'logge sisa',
 'loginreqpagetext' => 'Don fertet $1, ovdalgo oainnat eará siidduid.',
 'accmailtitle' => 'Suollemassátni lea sáddejuvvon.',
 'accmailtext' => "geavaheaddji '''$1''' suollemassátni lea sáddejuvvon čujuhussii '''$2'''.",
@@ -392,6 +471,11 @@ Du geavaheaddjidovddaldat lea dál anus.
 'editing' => 'Rievdadit siiddu $1',
 'editingsection' => 'Rievdadit oasi siiddus $1',
 'editingcomment' => 'Rievdadit kommeanta siiddus $1',
+'explainconflict' => "Soames lea rievdadan dán siiddu dan maŋŋel go don leat álgan rievdadit dan.
+Bajit oasis oidno siiddu teaksta dálá hámis.
+Du rievdadusat oidnojit vuolit oasis.
+Don fertet dahkat du rievdadusaid dálá tekstii.
+'''Beare''' bajit oasi teaksta vurkejuvvo go deaddilat «{{int:savearticle}}».",
 'yourtext' => 'Iežat teaksta',
 'storedversion' => 'Vurkejuvvon veršuvdna',
 'yourdiff' => 'Erohusat',
@@ -421,6 +505,7 @@ Du geavaheaddjidovddaldat lea dál anus.
 'last' => 'ovddit',
 'page_first' => 'vuosttas siidu',
 'page_last' => 'maŋimus siidu',
+'history-fieldset-title' => 'Bláđe historjjá',
 'histfirst' => 'Vuosttas',
 'histlast' => 'Maŋimus',
 'historysize' => '($1 stávvala)',
@@ -457,16 +542,22 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 'revdelete-submit' => 'Daga',
 'pagehist' => 'Siiddu rievdanhistorjá',
 'deletedhist' => 'Šluhtejuvvon veršuvnnaid historjá',
+'revdelete-reason-dropdown' => '*Sivat
+** Ii-almmolaš persovnnalaš dieđut
+** Vejolaš gudnenrihkkun
+** Vuovnnalaš geavaheaddjidovddaldat
+** Vuovnnalaš sisdoallu',
 
 # Diffs
-'difference' => 'Veršuvnnaid erohusat',
+'history-title' => 'Siiddu «$1» historjá',
 'lineno' => 'Gurgadas $1:',
 'compareselectedversions' => 'Veardde válljejuvvon veršuvnnaid',
 'editundo' => 'šluhtte',
 'diff-multi' => '(Veršuvnnaid gaskas {{PLURAL:$1|okta rievdadus|$1 eará rievdadusa}}.)',
 
 # Search results
-'searchresults' => 'Ohcama bohtosat',
+'searchresults' => 'Ohcanbohtosat',
+'searchresults-title' => 'Ohcanbohtosat: "$1"',
 'searchsubtitle' => 'Ohcan tearpmain [[:$1]]',
 'searchsubtitleinvalid' => 'Ohcan tearpmain $1',
 'notitlematches' => 'Ohcansátni ii dihtton ovttasge bájilčállagis',
@@ -476,9 +567,18 @@ Eará bajasdoallit sáhtet lohkat čihkojuvvon sisdoalu ja máhcahit dan.",
 
 $1 {{int:pipe-separator}} $2',
 'searchhelp-url' => 'Help:Rávvagat',
+'searchprofile-articles' => 'Sisdoallosiiddut',
+'searchprofile-project' => 'Veahkke- ja prošeaktasiiddut',
+'searchprofile-everything' => 'Buot',
+'searchprofile-advanced' => 'Viiddiduvvon',
 'showingresults' => "{{PLURAL:$1|'''Okta''' boađus|'''$1''' bohtosa}} bohtosa'''$2''' rájes.",
 'showingresultsnum' => "Vuolábealde {{PLURAL:$3|lea '''okta''' ohcanboađus|leat '''$3''' ohcanbohtosa}} '''$2.''' bohtosa rájes.",
 'powersearch' => 'Oza',
+'powersearch-ns' => 'Oza nammagomuvuođain:',
+'powersearch-redir' => 'Listu ođđasitstivremiin',
+'powersearch-togglelabel' => 'Rievdat válljema:',
+'powersearch-toggleall' => 'Buot',
+'powersearch-togglenone' => 'Ii mihkkege',
 
 # Quickbar
 'qbsettings-none' => 'Ii maidige',
@@ -547,19 +647,19 @@ $1 {{int:pipe-separator}} $2',
 'userrights-reason' => 'Sivva',
 
 # Groups
-'group' => 'Joavku',
+'group' => 'Joavku:',
 'group-user' => 'geavaheaddjit',
-'group-bot' => 'Robohtat',
-'group-sysop' => 'bájasdoallit',
-'group-bureaucrat' => 'byrokráhtat',
+'group-bot' => 'Bohtat',
+'group-sysop' => 'Administráhtorat',
+'group-bureaucrat' => 'Byrokráhtat',
 'group-all' => '(buot)',
 
-'group-bot-member' => 'robohtta',
-'group-sysop-member' => 'bájasdoalli',
-'group-bureaucrat-member' => 'byrokráhta',
+'group-bot-member' => 'bohtta',
+'group-sysop-member' => 'administráhtorat',
+'group-bureaucrat-member' => 'byrokráhtta',
 
 'grouppage-bot' => '{{ns:project}}:Bohtat',
-'grouppage-sysop' => '{{ns:project}}:Bájasdoallit',
+'grouppage-sysop' => '{{ns:project}}:Administráhtorat',
 'grouppage-bureaucrat' => '{{ns:project}}:Byrokráhtat',
 
 # User rights log
@@ -571,7 +671,7 @@ $1 {{int:pipe-separator}} $2',
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|rievdadus|rievdadusa}}',
 'recentchanges' => 'Varas rievdadusat',
-'recentchangestext' => 'Dán siiddus sáhtat čuovvut varas rievdadusaid {{GRAMMAR:illative|{{SITENAME}}}}.',
+'recentchanges-summary' => 'Dán siiddus sáhtát čuovvut varas rievdadusaid {{SITENAME}}s.',
 'recentchanges-feed-description' => 'Dán siiddus sáhtat čuovvut varas {{GRAMMAR:illative|{{SITENAME}}}} rievdadusaid.',
 'rcnote' => 'Vuollin {{PLURAL:$1|lea okta rievdadus|leat $1 varas rievdadusa}} {{PLURAL:$2|ovtta beaivvi|$2 maŋimus jándora}} áigge gitta $3 rádjái.',
 'rcnotefrom' => "Vuolábealde leat rievdadusat '''$2''' rájes. Eanemusta '''$1''' mearkkastaga čájehuvvo.",
@@ -584,7 +684,7 @@ $1 {{int:pipe-separator}} $2',
 'rcshowhidemine' => '$1 iežas rievdádusat',
 'rclinks' => 'Čájet $1 varas rievdadusa maŋimus $2 beaivve siste.<br />$3',
 'diff' => 'erohus',
-'hist' => 'historjá',
+'hist' => 'hist',
 'hide' => 'čiega',
 'show' => 'čájet',
 'minoreditletter' => 'u',
@@ -608,14 +708,14 @@ $1 {{int:pipe-separator}} $2',
 'uploaderror' => 'Vurkenfeaila',
 'uploadlog' => 'Fiilalogga',
 'uploadlogpage' => 'Fiilalogga',
-'filename' => 'Fiilla namma:',
+'filename' => 'Fiilla namma',
 'filedesc' => 'Čoahkkáigeassu',
-'fileuploadsummary' => 'Čoahkkáigeassu',
+'fileuploadsummary' => 'Čoahkkáigeassu:',
 'filesource' => 'Gáldu:',
 'uploadedfiles' => 'Lasihuvvon fiillat',
 'ignorewarning' => 'Vurke fuolatkeahttá varuhusas',
 'minlength1' => 'Fiilla namas ferte leat unnimustá okta mearka.',
-'badfilename' => 'Fiilla nama rievdaduvvui: $1.',
+'badfilename' => 'Fiila namma lea rievdaduvvon. Ođđa namma lea "$1".',
 'filetype-missing' => 'Fiillas vailui fiilageažus – ovdamearkkan <tt>.jpg</tt>.',
 'large-file' => 'Fiilla max. sturrodat lea $1. Fiila man lasihit lea $2.',
 'largefileserver' => 'Dát fiila lea menddo stuoris.',
@@ -704,7 +804,7 @@ $1 {{int:pipe-separator}} $2',
 'unwatchedpages' => 'Čuovvotkeahtes siiddut',
 
 # List redirects
-'listredirects' => 'Ođđasitstivremat',
+'listredirects' => 'Listu ođđasitstivremiin',
 
 # Unused templates
 'unusedtemplates' => 'Geavatkeahtes mállevuođut',
@@ -722,6 +822,15 @@ $1 {{int:pipe-separator}} $2',
 # Statistics
 'statistics' => 'Statistihkat',
 'statistics-header-users' => 'Geavaheaddjistatistihkat',
+'statistics-articles' => 'Sisdoallosiiddut',
+'statistics-pages' => 'Siiddut',
+'statistics-pages-desc' => 'Buot siiddut dán wikis (ságastallansiiddut, prošeaktasiiddut, ođđasitstivremat, jed.)',
+'statistics-files' => 'Fiillat',
+'statistics-edits' => 'Rievdadusat maŋŋel dan go {{SITENAME}} vuođđuduvvui',
+'statistics-edits-average' => 'Gaskamearálaš rievdadusaid mearri/siidu',
+'statistics-users' => 'Registrerejuvvon [[Special:ListUsers|geavaheaddjit]]',
+'statistics-users-active' => 'Aktiivvalaš geavaheaddjit',
+'statistics-users-active-desc' => 'Geavaheaddjit, geat leat bargan juoidá maŋimus {{PLURAL:$1|beaivvi|$1 beaivvi}} áigge.',
 'statistics-mostpopular' => 'Eanemusta gehčojuvvon siiddut',
 
 'disambiguations' => 'Liŋkkat dárkonsiidduide',
@@ -768,7 +877,10 @@ $1 {{int:pipe-separator}} $2',
 'deadendpages' => 'Siiddut, main eai leat liŋkkat',
 'deadendpagestext' => 'Čuovvovaš siidduin eai leat liŋkkat eara siidduide dán wikis.',
 'protectedpages' => 'Suodjáluvvon siiddut',
+'protectedpages-indef' => 'Beare siiddut, maid suodjaleapmi lea bissovaš',
+'protectedpages-cascade' => 'Beare siiddut, maid suodjaleapmi lea viiddiduvvon',
 'protectedpagestext' => 'Čuovvovaš siiddut leat suodjáluvvon sirdimiin ja rievdadusain',
+'protectedtitles' => 'Suodjaluvvon siidonamat',
 'listusers' => 'Geavaheaddjilistu',
 'newpages' => 'Ođđa siiddut',
 'newpages-username' => 'Geavaheaddjidovddaldat:',
@@ -818,6 +930,17 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listusers-submit' => 'Oza',
 'listusers-noresult' => 'Geavaheaddjit eai dihtton. Dárkis maid sierra bustávasturrodagat.',
 
+# Special:ActiveUsers
+'activeusers' => 'Listu aktiivvalaš geavaheddjiin',
+'activeusers-intro' => 'Dát lea listu geavaheddjiin, mat leat bargan juoidá maŋimus $1 {{PLURAL:$1|beaivvi|beaivvi}} siste.',
+'activeusers-count' => '$1 {{PLURAL:$1|rievdadus|rievdadusa}} maŋimus $3 beaivvi siste',
+'activeusers-from' => 'Čájet geavaheddjiid dán rájes:',
+'activeusers-hidebots' => 'Čiega bohtaid',
+'activeusers-hidesysops' => 'Čiega administráhtoriid',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(listu miellahtuin)',
+
 # E-mail user
 'mailnologin' => 'Sáddejeaddji čujuhus váilo',
 'mailnologintext' => 'Don fertet leat [[Special:UserLogin|čálligoahtán sisa]] ja du [[Special:Preferences|ásahusain]] ferte leat gelbbolaš ja <strong>sihkarastojuvvon</strong> e-poastačujuhus, ovdalgo sáhtat sáddet e-poasta eará geavaheddjiide.',
@@ -894,6 +1017,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'deletionlog' => 'sihkkunlogga',
 'reverted' => 'Máhcahuvvon ovddit veršuvdnii',
 'deletecomment' => 'Sivva',
+'deleteotherreason' => 'Eará sivva:',
 
 # Rollback
 'rollback' => 'máhcat ovddit veršuvdnii',
@@ -918,12 +1042,18 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'protectexpiry' => 'Boarásnuvvá',
 'protect_expiry_invalid' => 'Boarášnuvvánáigi ii dohket.',
 'protect_expiry_old' => 'Boarásnuvvánáigi lea vássán.',
-'protect-default' => '(eai rádjehusat)',
-'protect-level-autoconfirmed' => 'Cakkastala ođđa ja anonyma geavaheddjiid',
-'protect-level-sysop' => 'Dušše bájasdoallit',
+'protect-default' => 'Suova buot geavaheddjiid',
+'protect-level-autoconfirmed' => 'Eastte anonyma ja ođđa geavaheddjiid',
+'protect-level-sysop' => 'Suova beare administráhtoriid',
 'protect-summary-cascade' => 'viiddiduvvon',
 'protect-expiring' => 'boarásnuvvá $1',
 'protect-cascade' => 'Viididt suodjálusa guoskat buot siidduit, mat gullet dán siidui',
+'protect-othertime' => 'Eará áigi:',
+'protect-othertime-op' => 'eará áigi',
+'protect-dropdown' => '** Dávjjes vandalisma
+** Dávjjes spammen
+** Rievdadansoahti
+** Dehálaš siidu',
 'protect-expiry-options' => '2 diimma:2 hours,1 beaivi:1 day,3 beaivve:3 days,1 vahkku:1 week,2 vahkku:2 weeks,1 mánotbádji:1 month,3 mánotbaji:3 months,6 mánotbaji:6 months,1 jahki:1 year,bissovaš:infinite',
 'restriction-type' => 'Rádjehus',
 'restriction-level' => 'Suodjálus',
@@ -934,6 +1064,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 # Restrictions (nouns)
 'restriction-edit' => 'rievdádeapmi',
 'restriction-move' => 'sirdin',
+'restriction-upload' => 'Fiilla vurken',
 
 # Restriction levels
 'restriction-level-sysop' => 'ollislaččat suodjáluvvon',
@@ -962,7 +1093,9 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 
 # Contributions
 'contributions' => 'Geavaheaddji rievdadusat',
+'contributions-title' => 'Geavaheaddji $1 rievdadusat',
 'mycontris' => 'Rievdadusat',
+'uctop' => '(ođđaseamos)',
 'month' => 'Mánotbadji',
 'year' => 'Jahki',
 
@@ -988,7 +1121,10 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'whatlinkshere-links' => 'liŋkkat',
 
 # Block/unblock
+'block' => 'Cagge geavaheaddji',
 'blockip' => 'Eastte rievdadusaid',
+'blockip-title' => 'Cagge geavaheaddji',
+'blockip-legend' => 'Cagge geavaheaddji',
 'ipadressorusername' => 'IP-čujuhus dahje geavaheaddjidovddaldat',
 'ipbexpiry' => 'Guhkkodat',
 'ipbreason' => 'Sivva',
@@ -1015,10 +1151,12 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'ipb-edit-dropdown' => 'Rievdat sivaid',
 'ipb-unblock-addr' => 'Sihko geavaheaddji $1 estema',
 'ipb-unblock' => 'Sihko geavaheaddji dahje IP-čujuhusa rievdadaneasttu',
+'ipblocklist' => 'Listu cakkojuvvon IP-adreassain ja geavaheddjiin',
 'ipblocklist-submit' => 'Oza',
 'infiniteblock' => 'bissovaččat',
 'expiringblock' => 'boarásnuvvá $1 $2',
 'contribslink' => 'rievdadusat',
+'blocklogentry' => 'esttii geavaheaddji dahje IP-čujuhusa [[$1]], eastima bistin lea $2 $3',
 'proxyblocksuccess' => 'Gárvvis.',
 
 # Developer tools
@@ -1039,6 +1177,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'move-watch' => 'Čuovo dán siiddu',
 'movepagebtn' => 'Sirdde siiddu',
 'pagemovedsub' => 'Sirdin lihkosmuvai',
+'talkexists' => "'''Siiddu sirdin iešalddes lihkosmuvai, earret siiddu ságastallansiiddu sirdin daningo ođđa bájilčálas lea jo ságastallansiidu. Leage buorre ja sirdde ságastallamiid manuálalažžat.'''",
 'movedto' => 'Sirdojuvvun ođđa bájilčállagin',
 'movetalk' => 'Sirdde maid ságastallansiiddu.',
 'movelogpage' => 'Sirdinlogga',
@@ -1049,15 +1188,17 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'delete_and_move_confirm' => 'Sihko siiddu',
 
 # Export
+'export' => 'Olggosfievrrit siidduid',
 'export-addcat' => 'Lasit',
 'export-download' => 'Vurke fiillan',
 
 # Namespace 8 related
-'allmessages' => 'Vuogádatdieđáhusat',
+'allmessages' => 'Buot systemasánit',
 'allmessagesname' => 'Namma',
 'allmessagescurrent' => 'Dálá teaksta',
 
 # Thumbnails
+'thumbnail-more' => 'Stuorit',
 'filemissing' => 'Fiila váilo',
 
 # Special:Import
@@ -1077,7 +1218,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-pt-mycontris' => 'Listu iežas rievdadusain',
 'tooltip-pt-login' => 'Čálligoađe sisa dahje ráhkat geavaheaddjidovddaldaga',
 'tooltip-pt-anonlogin' => 'Čálligoađe sisa dahje ráhkat geavaheaddjidovddaldaga',
-'tooltip-pt-logout' => 'Čálligoađe olggos',
+'tooltip-pt-logout' => 'Logge olggos',
 'tooltip-ca-talk' => 'Ságastala sisdoalus',
 'tooltip-ca-edit' => 'Rievdat dán siiddu',
 'tooltip-ca-addsection' => 'Lasit kommeantta dán siidui',
@@ -1089,7 +1230,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-ca-move' => 'Sirdde dán siiddu',
 'tooltip-ca-watch' => 'Lasit dán siiddu iežat čuovvunlistui',
 'tooltip-ca-unwatch' => 'Sirdde dán siiddu eret du čuovvunlisttus',
-'tooltip-search' => 'Oza {{GRAMMAR:elative|{{SITENAME}}}}',
+'tooltip-search' => 'Oza {{SITENAME}}s',
 'tooltip-p-logo' => 'Váldosiidu',
 'tooltip-n-mainpage' => 'Mana váldosiidui',
 'tooltip-n-portal' => 'Ságastallan prošeavttas',
@@ -1124,6 +1265,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'tooltip-recreate' => 'Álggat dán siiddu ođđasit',
 
 # Attribution
+'anonymous' => '{{SITENAME}}-siiddu anonyma {{PLURAL:$1|geavaheaddji|geavaheaddjit}}',
 'siteuser' => '{{GRAMMAR:genitive|{{SITENAME}}}} geavaheaddji $1',
 'others' => 'earát',
 'siteusers' => '{{GRAMMAR:genitive|{{SITENAME}}}} geavaheaddji(t) $1',
@@ -1140,6 +1282,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'nextdiff' => 'Čuovvovaš rievdadus →',
 
 # Media information
+'thumbsize' => 'Thumbnail sturrodat:',
 'widthheightpage' => '$1 × $2, $3 siiddut',
 
 # Special:NewFiles
@@ -1220,6 +1363,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'scarytranscludetoolong' => '[Čujuhus lea menddo guhkki]',
 
 # Delete conflict
+'deletedwhileediting' => "'''Cuiggodus''': Dát siidu lea sihkkojuvvon das maŋŋá go leat álggahan ođasmahttit dan!",
 'recreate' => 'Álggat ođđasit',
 
 # action=purge
@@ -1241,7 +1385,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'table_pager_empty' => 'Eai bohtosat',
 
 # Auto-summaries
-'autoredircomment' => 'Ođđasitstivrejuvvo siidui [[$1]]',
+'autoredircomment' => 'Ođđasitstivrejuvvo [[$1]]-siidui',
 'autosumm-new' => 'Ođđa siidu: $1',
 
 # Size units
@@ -1268,4 +1412,11 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 # Special:SpecialPages
 'specialpages' => 'Erenomáš siiddut',
 
+# New logging system
+'logentry-delete-delete' => '$1 sihkui siiddu $3',
+'logentry-move-move' => '$1 sirddii siiddu $3 nammii $4',
+'logentry-move-move_redir-noredirect' => '$1 sirddii siiddu $3 nammii $4 iige ráhkadan ođđasitstivrema',
+'logentry-newusers-create' => '$1 ráhkadii dovddaldaga',
+'logentry-newusers-autocreate' => 'Dovddaldat $1 ráhkaduvvui automáhtalaččat',
+
 );
index 4fc6564..d7d74c0 100644 (file)
@@ -670,7 +670,7 @@ Informacion: (curt) = quiíxde vercion currentua,
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|quiix|quíix}}',
 'recentchanges' => 'Camjöx cmaa',
-'recentchangestext' => 'Caitom camjöx cmaa quiíx zode Wiki zo jan páhina iti.',
+'recentchanges-summary' => 'Caitom camjöx cmaa quiíx zode Wiki zo jan páhina iti.',
 'recentchanges-feed-description' => 'Caitom camjöx cmaa quiíx zode Wiki zo jan fiiyt iti.',
 'rcnote' => "!-cmaa coccebj {{PLURAL:$1|'''1''' quiixde|'''$1''' hunquiíxde}} {{PLURAL:$2|'''1''' hunzaah|'''$2''' hunixaáp}} zo iti, $3 'de.",
 'rcnotefrom' => "!-cmaa coccebj quiíx zode '''$2''' (plusöxiti '''$1''' visi).",
index 0cf1cb8..1cba767 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Samogitian (Žemaitėška)
+/** Samogitian (žemaitėška)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -576,6 +576,7 @@ Tamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėn
 'updated' => '(Atnaujėnta)',
 'note' => "'''Pastebiejims:'''",
 'previewnote' => "'''Nepamėrškėt, kū tas tėktās pervaiza, pakeitėmā da nier ėšsauguotė!'''",
+'continue-editing' => 'Dėrbtė tuoliau',
 'previewconflict' => 'Šėta parvaiza paruod teksta ėš vėršotinėjė teksta redagavėma lauka tēp, kāp ans bus ruodoms, jei pasirinksėt anū ėšsauguotė.',
 'session_fail_preview' => "'''Atsiprašuom! Mes nagalėm vīkdītė Tamstas keitėma diel sesėjės doumenū praradima.
 Prašuom pamiegintė vielēk. Jei šėtā napaded, pamieginkėt atsėjongtė ėr prėsėjongtė atgal.'''",
@@ -583,6 +584,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',
@@ -702,7 +704,8 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 
 # Diffs
 'history-title' => 'Poslapė „$1“ istuorėjė',
-'difference' => '(Skėrtomā terp versėju)',
+'difference-title' => '$1: Skėrtoms terp redakcėju',
+'difference-title-multipage' => '$1 ė $2: Skėrtoms terp poslapiu',
 'lineno' => 'Eilotė $1:',
 'compareselectedversions' => 'Palīgintė pasėrinktas versėjės',
 'editundo' => 'atšauktė',
@@ -896,7 +899,7 @@ Ana gal sodarītė ne daugiau kāp $1 {{PLURAL:$1|sėmbuolis|sėmbuolē|sėmbuol
 'nchanges' => '$1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}}',
 'recentchanges' => 'Vielībė̅jė pakeitėmā',
 'recentchanges-legend' => 'Vielībuju pakeitėmu pasėrinkėmā',
-'recentchangestext' => 'Tamė poslapī īr patīs vielībė̅ jė paketėmā tom pruojėktė.',
+'recentchanges-summary' => 'Tamė poslapī īr patīs vielībė̅ jė paketėmā tom pruojėktė.',
 'recentchanges-feed-description' => 'Keravuokėt patius vielībiausius pakeitėmus pruojektō tamė šaltėnī.',
 'recentchanges-label-newpage' => 'Šėto keitėmo sukurts naus poslapis',
 'recentchanges-label-minor' => 'Tas īr mažos pataisīms',
index 359b1c8..17e5e31 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbo-Croatian (Srpskohrvatski)
+/** Serbo-Croatian (srpskohrvatski / српскохрватски)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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',
@@ -1167,7 +1175,6 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 
 # Diffs
 'history-title' => 'Historija izmjena stranice "$1"',
-'difference' => '(Razlika između revizija)',
 'difference-multipage' => '(Razlika između stranica)',
 'lineno' => 'Linija $1:',
 'compareselectedversions' => 'Uporedite označene verzije',
@@ -1529,7 +1536,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'nchanges' => '$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}',
 'recentchanges' => 'Nedavne izmjene',
 'recentchanges-legend' => 'Postavke za Nedavne promjene',
-'recentchangestext' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
+'recentchanges-summary' => 'Na ovoj stranici možete pratiti nedavne izmjene.',
 'recentchanges-feed-description' => 'Praćenje nedavnih izmjena na ovom wikiju u ovom feedu.',
 'recentchanges-label-newpage' => 'Ovom izmjenom je stvorena nova stranica',
 'recentchanges-label-minor' => 'Ovo je manja izmjena',
@@ -1559,6 +1566,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 +1735,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 +1862,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 +2079,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 +2580,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 +2845,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 +3652,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 +3841,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 9e8b7d5..6cd98ab 100644 (file)
@@ -590,7 +590,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 
 # Diffs
 'history-title' => 'Asakud n umcggr n « $1 »',
-'difference' => 'laḥna gr tamzwarut d tamǧarut',
 'difference-multipage' => 'Amzaray (laḥna) gr tisniwin',
 'lineno' => 'Izriri $1:',
 'compareselectedversions' => 'Snahya gr ilqmn lli tuystaynin',
@@ -762,7 +761,7 @@ Izdar ad urtili ɣ isbidn n mayllan ɣ {{SITENAME}} .',
 'nchanges' => '$1 imbddln {{PLURAL:$1||s}}',
 'recentchanges' => 'Imbddeln imggura',
 'recentchanges-legend' => 'Tixtiɣitin (options) n imbddl imaynutn',
-'recentchangestext' => 'Ml imbddln imaynutn  n wiki ɣ tasna yad',
+'recentchanges-summary' => 'Ml imbddln imaynutn  n wiki ɣ tasna yad',
 'recentchanges-feed-description' => 'Tfr imbddln imggura n wiki yad ɣ usuddm',
 'recentchanges-label-newpage' => 'Ambddl ad ar iskar yakka yat tasna tamaynut.',
 'recentchanges-label-minor' => 'Imbddl ifssusn',
index 068065f..be52dea 100644 (file)
@@ -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' => 'මුරපදය:',
@@ -619,7 +619,7 @@ $2',
 'notloggedin' => 'ප්‍රවිසී නැත',
 'nologin' => "ඔබ හට ගිණුමක් නොමැතිද? '''$1'''.",
 'nologinlink' => 'ගිණුමක් තනන්න',
-'createaccount' => 'à¶\9cà·\92ණà·\94ම තනන්න',
+'createaccount' => 'à¶\85ලà·\94තà·\8a à¶\9cà·\92ණà·\94මà¶\9aà·\8a තනන්න',
 'gotaccount' => "දැනටමත් ගිණුමක් තිබේද? '''$1'''.",
 'gotaccountlink' => 'පිවිසෙන්න',
 'userlogin-resetlink' => 'ඔබේ පිවිසුම් තොරතුරු අමතකද?',
@@ -876,8 +876,9 @@ $2
 රීති ප්‍රකාරව .css හා .js පිටු විසින් ඉංග්‍රීසි කුඩා-අකුරු ශීර්ෂ භාවිතා කෙරෙන බව සිහි තබා ගන්න, නිදසුන. {{ns:user}}:Foo/vector.css මිස {{ns:user}}:Foo/Vector.css නොවන බව.",
 'updated' => '(යාවත්කාලීන)',
 'note' => "'''සටහන:'''",
-'previewnote' => "'''මෙය පෙරදසුනක් පමණි.'''
-ඔබගේ වෙනස්කිරීම් තවමත් සුරක්ෂිත කොට නොමැත!",
+'previewnote' => "'''මෙය පෙරදසුනක් පමණක් බව සිහිතබාගන්න.'''
+ඔබගේ වෙනස්කිරීම් තවමත් සුරැකීමට ලක් කොට නොමැත!",
+'continue-editing' => 'සංස්කරණය කරගෙනයන්න',
 'previewconflict' => 'ඔබ විසින් සුරැකීම තෝරාගත්තොත්,  ඉහළ පෙළ සංස්කරණ සරියෙහි,  පෙළ දර්ශනය විය හැකි අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
 'session_fail_preview' => "'''කණගාටුයි! සැසි දත්ත හානියක් හේතුවෙන් අප විසින් ඔබගේ  සංස්කරණය ක්‍රියායයනය කිරීමට නොහැකි වී ඇත.
 කරුණාකර නැවත උත්සාහ කරන්න.
@@ -892,6 +893,7 @@ $2
 සංස්කරණය නිෂ්ප්‍රභා කරන ලද්දේ පිටු පෙළ දූෂණය වීම වැලැක්වීමටය.
 දෝෂ-සපිරි වෙබ්-පාදක නිර්නාමික නියුතු සේවාවක් ඔබ විසින් භාවිත කිරීම නිසා මෙය සමහරවිට සිදුවිය හැක.'''",
 'editing' => '$1 සංස්කරණය කරමින් පවතියි',
+'creating' => '$1 තනමින්',
 'editingsection' => '$1 (ඡේදය) සංස්කරණය කරමින් පවතියි',
 'editingcomment' => '$1 සංස්කරණය කරමින් පවතියි (නව ඡේදයක්)',
 'editconflict' => 'සංස්කරණ ගැටුම: $1',
@@ -959,7 +961,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 +1103,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 +1137,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' => 'අන්ත  පිටුව නීතික ශීර්ෂයක් සහිත විය යුතුය.',
@@ -1151,8 +1153,7 @@ $1",
 'mergelogpagetext' => 'එක් පිටු ඉතිහාසයක් තවකක් හා සමග ඉතා මෑතදී සිදුවූ ඒකාබද්ධ වීම් දැක්වෙන ලැයිස්තුවක් පහත වේ.',
 
 # Diffs
-'history-title' => '"$1"හි සංශෝධන ඉතිහාසය',
-'difference' => '(අනුවාද අතර වෙනස්කම්)',
+'history-title' => '$1:  සංශෝධන ඉතිහාසය',
 'difference-multipage' => 'පිටු අතර වෙනස',
 'lineno' => 'පේළිය $1:',
 'compareselectedversions' => 'තෝරාගත් සංශෝධන සසඳන්න',
@@ -1287,10 +1288,10 @@ $1",
 'timezoneuseserverdefault' => 'විකියෙහි සාමාන්‍ය විදිහ භාවිත කරන්න ($1)',
 'timezoneuseoffset' => 'වෙනත් (හිලව්ව නියමාකාරයෙන් දක්වන්න)',
 'timezoneoffset' => 'Offset¹:',
-'servertime' => 'à·\83රà·\8aà·\80රයේ වේලාව:',
+'servertime' => 'à·\83à·\9aà·\80à·\8fදà·\8fයà¶\9aයේ වේලාව:',
 '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' => 'පරිශීලක හිමිකම් කළමනාකරණය',
@@ -1513,7 +1514,7 @@ HTML ටැගයන් පිරික්සන්න.',
 'nchanges' => '$1 {{PLURAL:$1|වෙනස්වීම|වෙනස්වීම්}}',
 'recentchanges' => 'මෑත වෙනස්කිරීම්',
 'recentchanges-legend' => '‍නව වෙනස්වීම් සැකසුම් තෝරාගැනීම',
-'recentchangestext' => 'මෙම පිටුවේ විකියට සිදුකල ඉතා මෑත වෙනස්වීම් පසුහඹන්න.',
+'recentchanges-summary' => 'මෙම පිටුවේ විකියට සිදුකල ඉතා මෑත වෙනස්වීම් පසුහඹන්න.',
 'recentchanges-feed-description' => 'මෙම පෝෂකයෙහි විකියට බොහෝ මෑතදී සිදුකල වෙනස්වීම් හෙළිකරන්න.',
 'recentchanges-label-newpage' => 'මෙම සංස්කරණය නව පිටුවක් නිර්මාණය කරන ලදී',
 'recentchanges-label-minor' => 'මෙය සුළු සංස්කරණයකි',
@@ -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 8de0e3a..6d331d8 100644 (file)
@@ -6,15 +6,6 @@
  *
  * @ingroup Language
  * @file
- *
- * @author Hydra
  */
 
 $fallback = 'en';
-
-$messages = array(
-# Vector skin
-'vector-view-create' => 'Start',
-'vector-view-edit'   => 'Change',
-
-);
index cc9c740..0111218 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Slovak (Slovenčina)
+/** Slovak (slovenčina)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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',
@@ -665,9 +665,11 @@ $2',
 'ns-specialprotected' => 'Stránky v mennom pristore {{ns:special}} nie je možné upravovať.',
 'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
 Udaný dôvod: ''$2''.",
-'filereadonlyerror' => "Nebolo možné modifikovať súbor „$1“, protože úložisko „$2“ je momentálne v režime len na čítanie.
+'filereadonlyerror' => 'Nebolo možné modifikovať súbor „$1“, pretože úložisko „$2“ je momentálne v režime len na čítanie.
 
-Udaný dôvod: „''$3''“.",
+Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
+'invalidtitle-knownnamespace' => 'Neplatný názov s menným priestorom „$2“ a textom „$3“',
+'invalidtitle-unknownnamespace' => 'Neplatný názov s neznámym číslom menného priestoru „$1“ a textom „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Chybná konfigurácia: neznámy antivírus: ''$1''",
@@ -758,6 +760,7 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'emailconfirmlink' => 'Potvrďte vašu e-mailovú adresu',
 'invalidemailaddress' => 'Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.',
 'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského konta.',
+'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
 'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
 'createaccount-title' => 'Vytvorenie účtu na {{GRAMMAR:lokál|{{SITENAME}}}}',
@@ -962,7 +965,8 @@ Dolu je pre informáciu posledná položka zo záznamu blokovaní:',
 'updated' => '(Aktualizovaný)',
 'note' => "'''Poznámka: '''",
 'previewnote' => "'''Nezabudnite, toto je iba náhľad stránky, ktorú upravujete.
-Zmeny ešte nie sú uložené!''' [[#editform|→ Pokračujte v úpravách]]",
+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.
@@ -975,6 +979,7 @@ Ak to nebude fungovať, skúste sa [[Special:UserLogout|odhlásiť]] a znovu pri
 'token_suffix_mismatch' => "'''Vaša úprava bola zamietnutá, pretože váš klient pokazil znaky s diakritikou v editačnom symbole (token). Úprava bola zamietnutá, aby sa zabránilo poškodeniu textu stránky. Toto sa občas stáva, keď používate chybnú anonymnú proxy službu cez webové rozhranie.'''",
 'edit_form_incomplete' => "'''Niektoré časti editačného formulára nedosiahli server. Prosím, znova skontrolujte, že vaše úpravy sú nepoškodené a skúste to znova.'''",
 'editing' => 'Úprava stránky $1',
+'creating' => 'Vytvára sa $1',
 'editingsection' => 'Úprava stránky $1 (sekcia)',
 'editingcomment' => 'Úprava stránky $1 (nová sekcia)',
 'editconflict' => 'Konflikt pri úprave: $1',
@@ -1040,6 +1045,7 @@ Zdá sa, že bola zmazaná.',
 'edit-no-change' => 'Vaša úprava bola ignorovaná, pretože ste v texte nič nezmenili.',
 'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
 Už existuje.',
+'defaultmessagetext' => 'Predvolený text správy',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozornenie: Táto stránka obsahuje príliš mnoho volaní funkcií syntaktického analyzátora, ktoré nadmerne zaťažujú server.
@@ -1055,6 +1061,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Zistené zacyklenie volania rozširovacej značky',
+'parser-unstrip-recursion-limit' => 'Prektočený limit rekurzie volania rozširovacej značky ($1)',
 
 # "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.',
@@ -1230,8 +1242,9 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
 'mergelogpagetext' => 'Dolu je zoznam posledných zlúčení jednej histórie revízií stránky do druhej.',
 
 # Diffs
-'history-title' => 'História revízií „$1“',
-'difference' => '(Rozdiel medzi revíziami)',
+'history-title' => ' $1: História revízií',
+'difference-title' => '$1: Rozdiel medzi revíziami',
+'difference-title-multipage' => '$1 a $2: Rozdiel medzi stránkami',
 'difference-multipage' => '(Rozdiel medzi stránkami)',
 'lineno' => 'Riadok $1:',
 'compareselectedversions' => 'Porovnať označené verzie',
@@ -1326,6 +1339,7 @@ Uistite sa, že táto zmena zachová historickú kontinuitu zmien stránky.',
 'prefs-beta' => 'Nové funkcie',
 'prefs-datetime' => 'Dátum a čas',
 'prefs-labs' => 'Laboratórne funkcie',
+'prefs-user-pages' => 'Stránky používateľa',
 'prefs-personal' => 'Profil',
 'prefs-rc' => 'Posledné úpravy',
 'prefs-watchlist' => 'Sledované stránky',
@@ -1586,7 +1600,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'nchanges' => '$1 {{PLURAL:$1|zmena|zmeny|zmien}}',
 'recentchanges' => 'Posledné úpravy',
 'recentchanges-legend' => 'Možnosti posledných zmien',
-'recentchangestext' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
+'recentchanges-summary' => 'Pomocou tejto stránky sledujete posledné úpravy wiki.',
 'recentchanges-feed-description' => 'Sledovať posledné úpravy tejto wiki týmto kanálom.',
 'recentchanges-label-newpage' => 'Táto úprava vytvorila novú stránku.',
 'recentchanges-label-minor' => 'Toto je drobná úprava',
@@ -1792,14 +1806,15 @@ Ak problém pretrváva, kontaktujte [[Special:ListUsers/sysop|správcu systému]
 'backend-fail-writetemp' => 'Nebolo možné zapísať do dočasného súboru.',
 'backend-fail-closetemp' => 'Nebolo možné zatvoriť dočasný súbor.',
 'backend-fail-read' => 'Nebolo možné prečítať súbor „$1“.',
-'backend-fail-create' => 'Nebolo možné vytvoriť súbor „$1“.',
-'backend-fail-maxsize' => 'Súbor $1 nie je možné vytvoriť, pretože je väčší ako {{PLURAL:$2|$2 bajtov|$2 bajt}}.',
+'backend-fail-create' => 'Nebolo možné zapísať súbor $1.',
+'backend-fail-maxsize' => 'Nie je možné zapísať súbor  $1  pretože je väčší ako  {{PLURAL:$2| jeden byte| $2  bajtov}}.',
 'backend-fail-readonly' => 'Úložisko „$1“ je momentálne v režime len na čítanie. Udaný dôvod: „$2“',
 'backend-fail-synced' => 'Súbor „$1“ je v nekonzistentnom stave v rámci vnútorného úložiska',
 'backend-fail-connect' => 'Nepodarilo sa pripojiť k úložisku „$1“.',
 'backend-fail-internal' => 'Vyskytla sa neznáma chyba v úložisku „$1“.',
 'backend-fail-contenttype' => 'Nebolo možné určiť typ obsahu súboru, ktorý sa má uložiť na „$1“.',
 'backend-fail-batchsize' => 'Do úložiska bola zaslaná dávka s $1 {{PLURAL:$1|operáciou|operáciami}}; limit je $2 {{PLURAL:$2|operácia|operácie|operácií}}.',
+'backend-fail-usable' => 'Nie je možné zapísať súbor  $1  kvôli nedostatočným povoleniam alebo chýbajúcim adresárom/kontajnerom.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nepodarilo sa pripojiť k žurnálovej databáze úložiska „$1“.',
@@ -1918,6 +1933,10 @@ Môžete si pozrieť [[Special:WhatLinksHere/$2|úplný zoznam]].',
 'sharedupload' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch.',
 'sharedupload-desc-there' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Ďalšie informácie nájdete na [$2 popisnej stránke súboru].',
 'sharedupload-desc-here' => 'Tento zdieľaný súbor je z $1 a je možné ho používať na iných projektoch. Nižšie sú zobrazené informácie z [$2 popisnej stránky súboru].',
+'sharedupload-desc-edit' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
+'sharedupload-desc-create' => 'Tento súbor je z $1 a môžu ho používať iné projekty.
+Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'filepage-nofile' => 'Neexistuje žiadny súbor s takýmto názvom.',
 'filepage-nofile-link' => 'Súbor s takýmto názvom neexistuje, ale môžete ho [$1 nahrať].',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
@@ -2128,6 +2147,12 @@ Môžete zúžiť rozsah, ak zvolíte typ záznamu, používateľské meno alebo
 'allpagesprefix' => 'Zobraziť stránky s predponou:',
 'allpagesbadtitle' => 'Zadaný názov stránky je neplatný alebo mal medzijazykový alebo interwiki prefix. Môže obsahovať jeden alebo viac znakov, ktoré nie je možné použiť v názve stránky.',
 'allpages-bad-ns' => '{{SITENAME}} nemá menný priestor „$1“.',
+'allpages-hide-redirects' => 'Skryť presmerovania',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Prezeráte si kópiu stránky z vyrovnávacej pamäte, môže byť stará až $1.',
+'cachedspecial-viewing-cached-ts' => 'Prezeráte si kópiu stránky z vyrovnávacej pamäte, nemusí byť úplne aktuálna.',
+'cachedspecial-refresh-now' => 'Zobraziť aktuálnu.',
 
 # Special:Categories
 'categories' => 'Kategórie',
@@ -2972,6 +2997,11 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 'vector.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov štýlu Vector */',
 'print.css' => '/* Tu umiestnené CSS bude ovplyvňovať tlačový výstup */',
 'handheld.css' => '/* Tu umiestnené CSS bude ovplyvňovať prenosné zariadenia vychádzajúceho zo štýlu nastaveného v $wgHandheldStyle */',
+'noscript.css' => '/* Tu umiestnené CSS bude ovplyvňovať používateľov s vypnutým JavaScriptom */',
+'group-autoconfirmed.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba používateľov s overenou emailovou adresou */',
+'group-bot.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba robotov */',
+'group-sysop.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba správcov */',
+'group-bureaucrat.css' => '/* Tu umiestnené CSS bude ovplyvňovať iba byrokratov */',
 
 # Scripts
 'common.js' => '/* Tu uvedený JavaScript sa nahrá všetkým používateľom pri každom nahraní stránky. */',
@@ -2984,6 +3014,10 @@ Umožnuje do zhrnutia pridanie dôvodu.',
 'simple.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Jednoduchý */',
 'modern.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Moderný */',
 'vector.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom vzhľadu Vector */',
+'group-autoconfirmed.js' => '/* Tu sa nachádzajúci JavaScript sa načíta používateľom s potvrdenou emailovou adresou */',
+'group-bot.js' => '/* Tu sa nachádzajúci JavaScript sa načíta len robotom */',
+'group-sysop.js' => '/* Tu sa nachádzajúci JavaScript sa načíta len správcom */',
+'group-bureaucrat.js' => '/* Tu sa nachádzajúci JavaScript sa načíta len byrokratom */',
 
 # Metadata
 'notacceptable' => 'Wiki server nedokáže poskytovať dáta vo formáte, v akom ich váš klient vie čítať.',
@@ -3031,6 +3065,7 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'skinname-chick' => 'Kuriatko',
 'skinname-simple' => 'Jednoduchý',
 'skinname-modern' => 'Moderný',
+'skinname-vector' => 'Vector',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označiť ako stráženú',
@@ -3724,6 +3759,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',
@@ -3912,4 +3950,15 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'api-error-uploaddisabled' => 'Nahrávanie je na tejto wiki zakázané.',
 'api-error-verification-error' => 'Tento súbor môže byť poškodený, alebo má zlú príponu.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundy|sekúnd}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minúta|minúty|minút}}',
+'duration-hours' => '$1 {{PLURAL:$1|hodina|hodiny|hodín}}',
+'duration-days' => '$1 {{PLURAL:$1|deň|dni|dní}}',
+'duration-weeks' => '$1 {{PLURAL:$1|týždeň|týždne|týždňov}}',
+'duration-years' => '$1 {{PLURAL:$1|rok|roky|rokov}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekáda|dekády|dekád}}',
+'duration-centuries' => '$1 {{PLURAL:$1|storočie|storočia|storočí}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisícročie|tisícročia|tisícročí}}',
+
 );
index 84f96d0..e806864 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Slovenian (Slovenščina)
+/** Slovenian (slovenščina)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -191,7 +191,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Skrij pregledana urejanja v zadnjih spremembah',
 'tog-newpageshidepatrolled' => 'Skrij pregledane strani iz seznama novih strani',
 'tog-extendwatchlist' => 'Razširi spisek nadzorov, da bo prikazoval vse spremembe, ne le najnovejše',
-'tog-usenewrc' => 'Izboljšane zadnje spremembe (zahteva JavaScript)',
+'tog-usenewrc' => 'Združi spremembe posamezne strani na zadnjih spremembah in spisku nadzorov (zahteva JavaScript)',
 'tog-numberheadings' => 'Samodejno številči poglavja',
 'tog-showtoolbar' => 'Prikaži urejevalno orodno vrstico',
 'tog-editondblclick' => 'Omogoči urejanje strani z dvojnim klikom (zahteva JavaScript)',
@@ -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',
@@ -574,6 +574,10 @@ Podani razlog je bil »''$2''«.",
 'filereadonlyerror' => 'Ne morem spremeniti datoteke »$1«, ker je skladišče datotek »$2« v načinu, ki dovoljuje samo branje.
 
 Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
+'invalidtitle-knownnamespace' => 'Neveljaven naslov z imenskim prostorom »$2« in besedilom »$3«',
+'invalidtitle-unknownnamespace' => 'Neveljaven naslov z neznano številko imenskega prostora $1 in besedilom »$2«',
+'exception-nologin' => 'Niste prijavljeni',
+'exception-nologin-text' => 'Izbrana stran ali dejanje zahteva, da ste na tem wikiju prijavljeni.',
 
 # Virus scanner
 'virus-badscanner' => "Slaba konfiguracija: neznani virus skener: ''$1''",
@@ -608,7 +612,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 +760,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,8 +877,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.'''
-Vaših sprememb še nismo shranili! [[#editform|→ Nadaljujte z urejanjem]]",
+'previewnote' => "'''Pomnite, da stran le predogledujete.'''
+Vaših sprememb še nismo shranili!",
+'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.
@@ -969,6 +974,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Zaznal sem odvezano zanko',
+'parser-unstrip-recursion-limit' => 'Presežena je omejitev odvezane rekurzije ($1)',
 
 # "Undo" feature
 'undo-success' => 'Urejanje ste razveljavili. Prosim, potrdite in nato shranite spodnje spremembe.',
@@ -1113,7 +1124,7 @@ Prosimo, preverite dnevnik.',
 # Suppression log
 'suppressionlog' => 'Dnevnik vračanj',
 'suppressionlogtext' => 'Spodaj je seznam izbrisov in blokiranj, ki vključuje vsebino skrito pred administratorji.
-Oglejte si [[Special:BlockList|seznam blokiranih IP-jev]] za seznam trenutno aktivnih prepovedi in blokiranj.',
+Oglejte si [[Special:BlockList|seznam blokad]] za seznam trenutno aktivnih prepovedi in blokiranj.',
 
 # History merging
 'mergehistory' => 'Združi zgodovine strani',
@@ -1147,8 +1158,9 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
 'mergelogpagetext' => 'Prikazan je seznam nedavnih združevanj zgodovin strani.',
 
 # Diffs
-'history-title' => 'Zgodovina strani »$1«',
-'difference' => '(Primerjava redakcij)',
+'history-title' => '$1: Zgodovina strani',
+'difference-title' => '$1: Razlika med redakcijama',
+'difference-title-multipage' => '$1 in $2: Razlika med stranema',
 'difference-multipage' => '(Razlika med stranmi)',
 'lineno' => 'Vrstica $1:',
 'compareselectedversions' => 'Primerjaj izbrani redakciji',
@@ -1245,6 +1257,7 @@ Upoštevajte, da so njihovi podatki vsebine {{GRAMMAR:rodilnik|{{SITENAME}}}} mo
 'prefs-beta' => 'Betafunkcije',
 'prefs-datetime' => 'Datum in čas',
 'prefs-labs' => 'Funkcije laboratorija',
+'prefs-user-pages' => 'Uporabniške strani',
 'prefs-personal' => 'Podatki o uporabniku',
 'prefs-rc' => 'Zadnje spremembe',
 'prefs-watchlist' => 'Spisek nadzorov',
@@ -1255,7 +1268,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',
@@ -1270,10 +1283,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',
@@ -1332,14 +1345,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',
@@ -1509,12 +1523,12 @@ Podatek bo javno prikazan.',
 'nchanges' => '$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}',
 'recentchanges' => 'Zadnje spremembe',
 'recentchanges-legend' => 'Možnosti zadnjih sprememb',
-'recentchangestext' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
+'recentchanges-summary' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
 'recentchanges-feed-description' => 'Spremljajte najnovejše spremembe wikija prek tega vira.',
 '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',
@@ -1528,7 +1542,7 @@ Podatek bo javno prikazan.',
 'diff' => 'prim',
 'hist' => 'zgod',
 'hide' => 'skrij',
-'show' => 'prikaži',
+'show' => 'Prikaži',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
@@ -1566,11 +1580,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.',
@@ -1722,14 +1736,15 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
 'backend-fail-writetemp' => 'Ne morem pisati v začasno datoteko.',
 'backend-fail-closetemp' => 'Ne morem zapreti začasne datoteke.',
 'backend-fail-read' => 'Ne morem brati datoteke $1.',
-'backend-fail-create' => 'Ne morem ustvariti datoteke $1.',
-'backend-fail-maxsize' => 'Ne morem ustvariti datoteke $1, kjer je večja od {{PLURAL:$2|$2 bajta|$2 bajtov}}.',
+'backend-fail-create' => 'Ne morem zapisati datoteke $1.',
+'backend-fail-maxsize' => 'Ne morem zapisati datoteke $1, ker je večja od $2 {{PLURAL:$2|bajta|bajtov}}.',
 'backend-fail-readonly' => 'Skladiščno zaledje »$1« je trenutno označeno samo za branje. Podan razlog je: »$2«',
 'backend-fail-synced' => 'Datoteka »$1« je v neskladnem stanju z notranjimi skladiščnimi zaledji',
 'backend-fail-connect' => 'Ne morem se povezati s skladiščnim zaledjem »$1«.',
 'backend-fail-internal' => 'V skladiščnem zaledju »$1« je prišlo do neznane napake.',
 'backend-fail-contenttype' => 'Ne morem določiti vrsto vsebine datoteke za shranjevanje pri »$1«.',
 'backend-fail-batchsize' => 'Skladiščnemu zaledju je dana vrsta $1 {{PLURAL:$1|datotečne operacije|datotečnih operacij}}; omejitev {{PLURAL:$2|je $2 operacija|sta $2 operaciji|so $2 operacije|je $2 operacij}}.',
+'backend-fail-usable' => 'Ne morem zapisati datoteke $1 zaradi nezadostnih dovoljenj ali manjkajočega imenika/vsebnika.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Ne morem se povezati z listovno zbirko podatkov za skladiščno zaledje »$1«.',
@@ -1849,10 +1864,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].',
@@ -2053,6 +2068,7 @@ Prosimo, upoštevajte, da se lahko druge spletne strani povezujejo na datoteko z
 'alllogstext' => 'Združeno so prikazani dnevniki sprememb uporabniških pravic, preimenovanj uporabnikov, nalaganja predstavnostnih datotek, prestavljanja in zaščite strani, brisanja, registracij uporabnikov, sprememb položaja botov ter blokiranja in deblokiranja uporabnikov na strani {{SITENAME}}. Pogled lahko zožite z izbiro dnevnika, uporabniškega imena ali strani. Vedite, da polje »Uporabnik« razlikuje med malimi in velikimi črkami.',
 'logempty' => 'O tej strani ni v dnevniku ničesar.',
 'log-title-wildcard' => 'Iskanje po naslovih, začenši s tem besedilom',
+'showhideselectedlogentries' => 'Pokaži/skrij izbrane dnevniške vnose',
 
 # Special:AllPages
 'allpages' => 'Vse strani',
@@ -2073,6 +2089,11 @@ Morda vsebuje enega ali več znakov, ki niso dovoljeni v naslovih.',
 'allpages-bad-ns' => '{{SITENAME}} nima imenskega prostora »$1«.',
 'allpages-hide-redirects' => 'Skrij preusmeritve',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ogledujete si predpomnjeno različico strani, ki je lahko stara $1.',
+'cachedspecial-viewing-cached-ts' => 'Ogledujete si predpomnjeno različico strani, ki morda ni popolnoma posodobljena.',
+'cachedspecial-refresh-now' => 'Ogled najnovejše.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Naslednja $1 kategorija vsebuje|Naslednji $1 kategoriji vsebujeta|Naslednje $1 kategorije vsebujejo|Naslednjih $1 kategorij vsebuje}} strani ali datoteke.
@@ -2190,7 +2211,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'''.",
@@ -2518,7 +2539,7 @@ Vnesite tudi razlog (''na primer'' seznam strani, ki jih je uporabnik po nepotre
 'badipaddress' => 'Neveljaven IP-naslov ali uporabniško ime.',
 'blockipsuccesssub' => 'Blokiranje je uspelo',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran(-a)}}.<br />
-Oglejte si [[Special:BlockList|seznam blokiranih IP-naslovov]] za pregled blokad.',
+Oglejte si [[Special:BlockList|seznam blokad]] za pregled blokad.',
 'ipb-blockingself' => 'Nameravate se blokirati! Ste prepričani, da želite to storiti?',
 'ipb-confirmhideuser' => 'Nameravate blokirati uporabnika z omogočeno možnostjo »skrij uporabnika«. To bo skrilo uporabnikovo ime na vseh seznamih in dnevniških vnosih. Ste prepričani, da želite to storiti?',
 'ipb-edit-dropdown' => 'Uredi razloge blokade',
@@ -2571,7 +2592,7 @@ Dnevnik blokiranja je na voljo spodaj:',
 Dnevnik skrivanja je na voljo spodaj:',
 'blocklogentry' => '[[$1]] blokiran s časom poteka blokade $2 $3',
 'reblock-logentry' => 'spremenil nastavitve blokade za [[$1]] z iztekom dne $2 ob $3',
-'blocklogtext' => 'Prikazan je dnevnik blokiranja in deblokiranja uporabnikov. Samodejno blokirani IP-naslovi niso navedeni. Trenutno veljavna blokiranja so navedena na [[Special:BlockList|seznamu blokiranih IP-naslovov]].',
+'blocklogtext' => 'Prikazan je dnevnik blokiranja in deblokiranja uporabnikov. Samodejno blokirani IP-naslovi niso navedeni. Trenutno veljavna blokiranja so navedena na [[Special:BlockList|seznamu blokad]].',
 'unblocklogentry' => 'je deblokiral(-a) »$1«',
 'block-log-flags-anononly' => 'samo za brezimne uporabnike',
 'block-log-flags-nocreate' => 'ustvarjanje uporabniških računov onemogočeno',
@@ -2866,8 +2887,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',
@@ -2937,6 +2958,7 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'spambot_username' => 'Čiščenje navlake MediaWiki',
 'spam_reverting' => 'Vračanje na zadnjo redakcijo brez povezav na $1',
 'spam_blanking' => 'Vse redakcije so vsebovale povezave na $1, izpraznjujem',
+'spam_deleting' => 'Vse redakcije so vsebovale povezave na $1, brišem',
 
 # Info page
 'pageinfo-title' => 'Informacije o »$1«',
@@ -3647,6 +3669,11 @@ Skupaj s programom bi morali bi prejeti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopijo
 'version-software' => 'Nameščena programska oprema',
 'version-software-product' => 'Izdelek',
 'version-software-version' => 'Različica',
+'version-entrypoints' => 'URL-ji vstopnih točk',
+'version-entrypoints-header-entrypoint' => 'Vstopna točka',
+'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Pot članka]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Pot skripta]',
 
 # Special:FilePath
 'filepath' => 'Pot do datoteke',
@@ -3838,4 +3865,17 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'api-error-uploaddisabled' => 'Nalaganje je onemogočeno na tem wikiju.',
 'api-error-verification-error' => 'Ta datoteka je morda poškodovana ali ima napačno končnico.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekundi|sekunde|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minuti|minute|minut}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
+'duration-weeks' => '$1 {{PLURAL:$1|teden|tedna|tedni|tednov}}',
+'duration-years' => '$1 {{PLURAL:$1|leto|leti|leta|let}}',
+'duration-decades' => '$1 {{PLURAL:$1|desetletje|desetletji|desetletja|desetletij}}',
+'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
+'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Ne morem pridobiti zaklepov na strežniku $1.',
 );
index 5a04acd..ae7c2e5 100644 (file)
@@ -756,7 +756,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 
 # Diffs
 'history-title' => 'Versionsgeschichte vun „$1“',
-'difference' => '(Underschied zwischa Versiona)',
 'lineno' => 'Zeile $1:',
 'compareselectedversions' => 'Gewählte Versiona vergleichen',
 'editundo' => 'rieckgängig',
@@ -1008,7 +1007,7 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'nchanges' => '$1 {{PLURAL:$1|Ännerong|Änneronga}}',
 'recentchanges' => 'Foarchte Verändarunga',
 'recentchanges-legend' => 'Oazeigeoptiona',
-'recentchangestext' => "Uff dieser Seite koanst du de letzta Änderunga uff '''{{SITENAME}}''' noachverfulga.",
+'recentchanges-summary' => "Uff dieser Seite koanst du de letzta Änderunga uff '''{{SITENAME}}''' noachverfolga.",
 'recentchanges-feed-description' => 'Verfolge miet diesem Feed de letzta Änneronga ei {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Neue Seite',
 'recentchanges-label-minor' => 'Klenne Änderung',
index 849c2cc..e92fe25 100644 (file)
@@ -595,7 +595,8 @@ Mamnuucida ugu danbeyso in oo soo galo hoostaan ee ku qorantahay',
 '''wali lama keydin!'''",
 'updated' => '(waa la opdate gareeyay)',
 'note' => "'''fiiro gaar ah:'''",
-'previewnote' => "'''Waxa aad aragtid waa horfiirin; wixii aad bedeshay lama keydinin!'''",
+'previewnote' => "'''Ogaaw kan waa horfiirin oo kaliya.'''
+Bedelyadaada wali lama keydin!",
 'session_fail_preview' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.
 Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudagal.'''",
 'session_fail_preview_html' => "'''Waan ka xunahay! Wixii aad bedeshay ma'suurto galin in la'keydiyo cilad dhacday awgeed.'''
@@ -604,6 +605,7 @@ Fadlan markale isku day. Hadii aysan weli shaqaynin, ka bax ee markale soo gudag
 
 '''Hadii wax ka bedlkaan uu yahay mid xaq ah, fadlan markale isku day. Hadii aysan weli shaqaynin, is kuday inaad  ka baxdo ee markale soo gudagal.'''",
 'editing' => 'Waxaa badaloosaa $1',
+'creating' => 'Sameynaa $1',
 'editingsection' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editingcomment' => 'Waxaa wax ka badaloosaa $1 (qeyb yar)',
 'editconflict' => 'Isku dhac badalaadka: $1',
@@ -637,6 +639,9 @@ Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa hoostaan.',
 Tusmooyinka qaar lagumo dari doono.",
 'post-expand-template-inclusion-category' => "Boggaga ku xad gudbay weyninka tusmo'da",
 
+# "Undo" feature
+'undo-summary' => 'Noqay bedelaadka $1 ee sameeyay  [[Special:Contributions/$2|$2]] ([[User talk:$2|hadal]])',
+
 # Account creation failure
 'cantcreateaccounttitle' => "Ma' sameynkaro gudagal (akoon)",
 'cantcreateaccount-text' => "Akoon'ka sameeyaha leh ciwaankaan  IP:ka ('''$1''') waxaa mamnuucay [[User:$3|$3]].
@@ -645,6 +650,7 @@ Sababta uu qoray $3 waa ''$2''",
 
 # History pages
 'viewpagelogs' => 'Fiiri guadagalayaasha boggaan',
+'nohistory' => 'Boggaan malahan taariikhda bedelaadka',
 'currentrev' => 'Bedelkii ugu danbeeyay',
 'currentrev-asof' => 'Kala duwanaanshihii ugu danbeeyay oo dhacay $1',
 'revisionasof' => 'Bedelaadkkii ahaa $1',
@@ -694,7 +700,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 
 # Diffs
 'history-title' => 'Taariikhda badalka "$1"',
-'difference' => '(Kala duwanaanshaha bedelyada)',
 'lineno' => 'Safka $1:',
 'compareselectedversions' => 'Is barbardhig bedelyada aad dooratay',
 'showhideselectedversions' => 'Itusi/qari bedelaadyada aad dooratay',
@@ -843,7 +848,7 @@ E-mailkaada mala sheegaayo markii ee dadka kale kula soo xiriirayaan.',
 'nchanges' => '$1 {{PLURAL:$1|bedelka|bedelada}}',
 'recentchanges' => 'Isbedelada dhow',
 'recentchanges-legend' => 'Dooqyada isbedelada dhow',
-'recentchangestext' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay bogaan.',
+'recentchanges-summary' => 'Dabagal isbedelada dhow ee wikiga ee ku dhacay bogaan.',
 'recentchanges-feed-description' => 'Dabagal isbedelada dhow ee wikiga oo ku dhacay feedkaan',
 'recentchanges-label-newpage' => 'Wax bedelkaan wuxuu sameeyay bog cusub',
 'recentchanges-label-minor' => 'Kan waa bedel yar',
index e1adc27..55d4ab4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Albanian (Shqip)
+/** Albanian (shqip)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -63,6 +63,7 @@ $namespaceGenderAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'PërdoruesitAktivë' ),
        'Allmessages'               => array( 'TëgjithaMesazhet' ),
        'Allpages'                  => array( 'TëgjithaFaqet' ),
        'Ancientpages'              => array( 'FaqetAntike' ),
@@ -71,7 +72,9 @@ $specialPageAliases = array(
        'Blockme'                   => array( 'BllokomMua' ),
        'Booksources'               => array( 'BurimeteLibrave' ),
        'Categories'                => array( 'Kategori' ),
+       'ChangeEmail'               => array( 'NdryshoEmail' ),
        'ChangePassword'            => array( 'NdryshoFjalëkalimin' ),
+       'ComparePages'              => array( 'KrahasoFaqet' ),
        'Confirmemail'              => array( 'KonfirmoEmail' ),
        'Contributions'             => array( 'Kontributet' ),
        'CreateAccount'             => array( 'HapLlogari' ),
@@ -125,6 +128,10 @@ $specialPageAliases = array(
 
 $magicWords = array(
        'redirect'                => array( '0', '#RIDREJTO', '#REDIRECT' ),
+       'notoc'                   => array( '0', '__JOTP__', '__NOTOC__' ),
+       'nogallery'               => array( '0', '__JOGALERI__', '__NOGALLERY__' ),
+       'toc'                     => array( '0', '__TP__', '__TOC__' ),
+       'noeditsection'           => array( '0', '__JOREDAKTIMSEKSIONI__', '__NOEDITSECTION__' ),
        'currentmonth'            => array( '1', 'MUAJIMOMENTAL', 'MUAJIMOMENTAL2', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'           => array( '1', 'MUAJIMOMENTAL1', 'CURRENTMONTH1' ),
        'currentmonthname'        => array( '1', 'EMRIIMUAJITMOMENTAL', 'CURRENTMONTHNAME' ),
@@ -145,10 +152,12 @@ $magicWords = array(
        'numberofpages'           => array( '1', 'NUMRIFAQEVE', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', 'NUMRIIARTIKUJVE', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', 'NUMRIISKEDAVE', 'NUMBEROFFILES' ),
-       'numberofusers'           => array( '1', 'NUMRIPËRDORUESVE', 'NUMBEROFUSERS' ),
+       'numberofusers'           => array( '1', 'NUMRIIPËRDORUESVE', 'NUMBEROFUSERS' ),
+       'numberofactiveusers'     => array( '1', 'NUMRIIPËRDORUESVEAKTIVË', 'NUMBEROFACTIVEUSERS' ),
        'numberofedits'           => array( '1', 'NUMRIREDAKTIMEVE', 'NUMBEROFEDITS' ),
        'numberofviews'           => array( '1', 'NUMRIISHIKIMEVE', 'NUMBEROFVIEWS' ),
        'pagename'                => array( '1', 'EMRIFAQES', 'PAGENAME' ),
+       'namespace'               => array( '1', 'HAPËSIRA', 'NAMESPACE' ),
        'fullpagename'            => array( '1', 'EMRIIPLOTËIFAQES', 'FULLPAGENAME' ),
        'fullpagenamee'           => array( '1', 'EMRIIPLOTËIFAQESE', 'FULLPAGENAMEE' ),
        'subpagename'             => array( '1', 'EMRIINËNFAQES', 'SUBPAGENAME' ),
@@ -163,7 +172,7 @@ $magicWords = array(
        'img_right'               => array( '1', 'djathtas', 'right' ),
        'img_left'                => array( '1', 'majtas', 'left' ),
        'img_none'                => array( '1', 's\'ka', 'none' ),
-       'img_center'              => array( '1', 'qëndër', 'qëndrore', 'center', 'centre' ),
+       'img_center'              => array( '1', 'qendër', 'qendrore', 'center', 'centre' ),
        'img_framed'              => array( '1', 'i_kornizuar', 'pa_kornizë', 'kornizë', 'framed', 'enframed', 'frame' ),
        'img_page'                => array( '1', 'faqja=$1', 'faqja $1', 'page=$1', 'page $1' ),
        'img_upright'             => array( '1', 'lartdjathtas', 'lartdjathtas=$1', 'lartdjathtas $1', 'upright', 'upright=$1', 'upright $1' ),
@@ -175,15 +184,20 @@ $magicWords = array(
        'img_bottom'              => array( '1', 'fund', 'bottom' ),
        'img_text_bottom'         => array( '1', 'tekst-fund', 'text-bottom' ),
        'img_link'                => array( '1', 'lidhje=$1', 'link=$1' ),
-       'sitename'                => array( '1', 'EMRIIFAQES', 'SITENAME' ),
+       'sitename'                => array( '1', 'EMRIISAJTIT', 'SITENAME' ),
        'localurl'                => array( '0', 'URLLOKALE', 'LOCALURL:' ),
        'server'                  => array( '0', 'SERVERI', 'SERVER' ),
        'servername'              => array( '0', 'EMRIISERVERIT', 'SERVERNAME' ),
        'grammar'                 => array( '0', 'GRAMATIKA:', 'GRAMMAR:' ),
+       'gender'                  => array( '0', 'GJINIA:', 'GENDER:' ),
        'currentweek'             => array( '1', 'JAVAMOMENTALE', 'CURRENTWEEK' ),
        'plural'                  => array( '0', 'SHUMËS:', 'PLURAL:' ),
+       'fullurl'                 => array( '0', 'URLEPLOTË', 'FULLURL:' ),
        'language'                => array( '0', '#GJUHA:', '#LANGUAGE:' ),
+       'numberofadmins'          => array( '1', 'NUMRIIADMINISTRUESVE', 'NUMBEROFADMINS' ),
        'special'                 => array( '0', 'speciale', 'special' ),
+       'hiddencat'               => array( '1', '__KATEGORIEFSHEHUR__', '__HIDDENCAT__' ),
+       'pagesize'                => array( '1', 'MADHËSIAEFAQES', 'PAGESIZE' ),
 );
 
 $datePreferences = array(
@@ -871,7 +885,7 @@ Më poshtë mund t'i referoheni shënimit të regjistruar për bllokimin e fundi
 'updated' => '(E ndryshuar)',
 'note' => "'''Shënim:'''",
 'previewnote' => "'''Vini re! Kjo faqe është vetëm për shqyrtim.'''
-Ndryshimet tuaja nuk janë ruajtur ende! [[#editform|→ Vazhdo redaktimin]]",
+Ndryshimet tuaja nuk janë ruajtur ende!",
 'previewconflict' => 'Kjo parapamje reflekton tekstin sipër kutisë së redaktimit siç do të duket kur të kryeni ndryshimin.',
 'session_fail_preview' => "'''Ju kërkojmë ndjesë! Redaktimi juaj nuk mund të perpunohej për shkak të humbjes së të dhënave të seancës.'''
 Ju lutemi, provojeni përsëri.
@@ -1142,7 +1156,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 
 # Diffs
 'history-title' => 'Historiku i redaktimeve te "$1"',
-'difference' => '(Ndryshime midis versioneve)',
 'difference-multipage' => '(Ndryshimi midis faqeve)',
 'lineno' => 'Rreshti $1:',
 'compareselectedversions' => 'Krahasoni versionet e zgjedhura',
@@ -1499,7 +1512,7 @@ Kjo informatë është publike.',
 'nchanges' => '$1 {{PLURAL:$1|ndryshim|ndryshime}}',
 'recentchanges' => 'Ndryshime së fundmi',
 'recentchanges-legend' => 'Zgjedhjet e ndryshimeve momentale',
-'recentchangestext' => 'Ndiqni ndryshime së fundmi tek kjo faqe.',
+'recentchanges-summary' => 'Ndiqni ndryshime së fundmi tek kjo faqe.',
 'recentchanges-feed-description' => 'Ndjek ndryshimet më të fundit në wiki tek kjo fushë.',
 'recentchanges-label-newpage' => 'Ky redaktim krijoi një faqe të re',
 'recentchanges-label-minor' => 'Ky është një editim i vogël',
index 4306ab7..2400634 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbian (Cyrillic script) (‪Српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -29,7 +29,7 @@
  */
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Медија',
+       NS_MEDIA            => 'Медиј',
        NS_SPECIAL          => 'Посебно',
        NS_TALK             => 'Разговор',
        NS_USER             => 'Корисник',
@@ -66,6 +66,7 @@ $namespaceAliases = array(
        'Kategorija'              => NS_CATEGORY,
        'Razgovor_o_kategoriji'   => NS_CATEGORY_TALK,
 
+       'Медија'                  => NS_MEDIA,
        'Слика'                   => NS_FILE,
        'Разговор_о_слици'        => NS_FILE_TALK,
        'МедијаВики'              => NS_MEDIAWIKI,
@@ -723,13 +724,13 @@ $1',
 # General errors
 'error' => 'Грешка',
 'databaseerror' => 'Грешка у бази података',
-'dberrortext' => 'Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ñ\81инÑ\82акÑ\81не грешке у бази.
+'dberrortext' => 'Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ñ\81инÑ\82акÑ\82иÑ\87ке грешке у бази.
 Можда се ради о грешци у софтверу.
 Последњи покушај упита је гласио:
 <blockquote><tt>$1</tt></blockquote>
 унутар функције „<tt>$2</tt>“.
 База података је пријавила грешку „<tt>$3: $4</tt>“.',
-'dberrortextcl' => 'Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ñ\81инÑ\82акÑ\81не грешке у бази.
+'dberrortextcl' => 'Ð\94оÑ\88ло Ñ\98е Ð´Ð¾ Ñ\81инÑ\82акÑ\82иÑ\87ке грешке у бази.
 Последњи покушај упита је гласио:
 „$1“
 унутар функције „$2“.
@@ -798,6 +799,8 @@ $2',
 'filereadonlyerror' => 'Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.
 
 Администратор који ју је закључао понудио је следеће објашњење: „$3“.',
+'invalidtitle-knownnamespace' => 'Неисправан наслов с именским простором „$2“ и текстом „$3“',
+'invalidtitle-unknownnamespace' => 'Неисправан наслов с именским простором бр. $1 и текстом „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Неисправна поставка: непознати скенер за вирусе: ''$1''",
@@ -1095,7 +1098,8 @@ $2
 'updated' => '(Ажурирано)',
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте у виду да је ово само преглед.'''
-Ваше измене још нису сачуване! [[#editform|→ Настави с уређивањем]]",
+Ваше измене још нису сачуване!",
+'continue-editing' => 'Настави уређивање',
 'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
 'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
 Покушајте поново.
@@ -1194,6 +1198,12 @@ $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' => 'Страница у којој је прекорачена дубина проширења',
+'parser-unstrip-loop-warning' => 'Утврђена је петља',
+'parser-unstrip-recursion-limit' => 'Прекорачено је ограничење рекурзије ($1)',
 
 # "Undo" feature
 'undo-success' => 'Измена се може вратити.
@@ -1235,7 +1245,7 @@ $2
 
 # Revision feed
 'history-feed-title' => 'Историја измена',
-'history-feed-description' => 'Историја измена ове странице',
+'history-feed-description' => 'Историја измена ове странице на викију',
 'history-feed-item-nocomment' => '$1 у $2',
 'history-feed-empty' => 'Тражена страница не постоји.
 Могуће да је обрисана с викија или је преименована.
@@ -1339,7 +1349,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Историја сакривања',
-'suppressionlogtext' => 'Ð\98Ñ\81под Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ñ\81пиÑ\81ак Ð±Ñ\80иÑ\81аÑ\9aа Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа ÐºÐ¾Ñ\98и Ñ\83кÑ\99Ñ\83Ñ\87Ñ\83Ñ\98е Ñ\81адÑ\80жаÑ\98 Ñ\81акÑ\80ивен Ð¾Ð´ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а. Ð\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 IP Ð°Ð´Ñ\80еÑ\81а]] Ð·Ð° Ð¿Ñ\80еглед Ð²Ð°Ð¶ÐµÑ\9bиÑ\85 Ð·Ð°Ð±Ñ\80ана Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа.',
+'suppressionlogtext' => 'Ð\98Ñ\81под Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸ Ñ\81пиÑ\81ак Ð±Ñ\80иÑ\81аÑ\9aа Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа ÐºÐ¾Ñ\98и Ñ\83кÑ\99Ñ\83Ñ\87Ñ\83Ñ\98е Ñ\81адÑ\80жаÑ\98 Ñ\81акÑ\80ивен Ð¾Ð´ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80а. Ð¢ÐµÐºÑ\83Ñ\9bе Ð·Ð°Ð±Ñ\80ане Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ñ\9bи [[Special:BlockList|овде]].',
 
 # History merging
 'mergehistory' => 'Споји историје страница',
@@ -1374,7 +1384,8 @@ $1",
 
 # Diffs
 'history-title' => 'Историја измена за „$1“',
-'difference' => '(разлике између измена)',
+'difference-title' => 'Разлика између измена странице „$1“',
+'difference-title-multipage' => 'Разлика између страница „$1“ и „$2“',
 'difference-multipage' => '(разлике између страница)',
 'lineno' => 'Ред $1:',
 'compareselectedversions' => 'Упореди изабране измене',
@@ -1739,7 +1750,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|измена|измене|измена}}',
 'recentchanges' => 'Скорашње измене',
 'recentchanges-legend' => 'Поставке скорашњих измена',
-'recentchangestext' => 'Пратите скорашње измене на овој страници.',
+'recentchanges-summary' => 'Пратите скорашње измене на овој страници.',
 'recentchanges-feed-description' => 'Пратите скорашње измене уз помоћ овог довода.',
 'recentchanges-label-newpage' => 'Нова страница',
 'recentchanges-label-minor' => 'Мања измена',
@@ -2311,6 +2322,11 @@ $1',
 'allpages-bad-ns' => '{{SITENAME}} нема именски простор „$1“.',
 'allpages-hide-redirects' => 'Сакриј преусмерења',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Гледате кеширану верзију ове странице, која може бити стара и до $1.',
+'cachedspecial-viewing-cached-ts' => 'Гледате кеширану верзију ове странице, која може да се разликује од тренутне.',
+'cachedspecial-refresh-now' => 'Погледај најновију.',
+
 # Special:Categories
 'categories' => 'Категоријe',
 'categoriespagetext' => '{{PLURAL:$1|Следећа категорија садржи|Следеће категорије садрже}} странице или датотеке.
@@ -2509,7 +2525,7 @@ $UNWATCHURL
 Погледајте ''$2'' за више детаља.",
 'dellogpage' => 'Дневник брисања',
 'dellogpagetext' => 'Испод је списак последњих брисања.',
-'deletionlog' => 'иÑ\81Ñ\82оÑ\80иÑ\98а брисања',
+'deletionlog' => 'Ð\94невник брисања',
 'reverted' => 'Враћено на ранију измену',
 'deletecomment' => 'Разлог:',
 'deleteotherreason' => 'Други/додатни разлог:',
@@ -2724,7 +2740,7 @@ $1',
 # Block/unblock
 'autoblockid' => 'Самоблокирање #$1',
 'block' => 'Блокирај корисника',
-'unblock' => 'Ð\94еблокирај корисника',
+'unblock' => 'Ð\9eдблокирај корисника',
 'blockip' => 'Блокирај корисника',
 'blockip-title' => 'Блокирање корисника',
 'blockip-legend' => 'Блокирај корисника',
@@ -2745,7 +2761,7 @@ $1',
 ** Неприхватљиво корисничко име',
 'ipb-hardblock' => 'Забрани пријављеним корисницима да уређују с ове ИП адресе',
 'ipbcreateaccount' => 'Онемогући отварање налога',
-'ipbemailban' => 'Забрани члану слање е-порука',
+'ipbemailban' => 'Забрани кориснику слање е-порука',
 'ipbenableautoblock' => 'Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује',
 'ipbsubmit' => 'Блокирај овог корисника',
 'ipbother' => 'Друго време:',
@@ -2760,15 +2776,15 @@ $1',
 'badipaddress' => 'Неисправна IP адреса',
 'blockipsuccesssub' => 'Блокирање је успело',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана|блокиран}}.<br />
\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а]] Ð·Ð° Ð¿Ñ\80еглед Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа.',
\91локиÑ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð¿Ð¾Ð³Ð»ÐµÐ´Ð°Ñ\82е [[Special:BlockList|овде]].',
 'ipb-blockingself' => 'Овом радњом ћете блокирати себе! Јесте ли сигурни да то желите?',
 'ipb-confirmhideuser' => 'Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?',
 'ipb-edit-dropdown' => 'Уреди разлоге блокирања',
-'ipb-unblock-addr' => 'Ð\94еблокирај $1',
-'ipb-unblock' => 'Ð\94еблокирај корисничко име или ИП адресу',
+'ipb-unblock-addr' => 'Ð\9eдблокирај $1',
+'ipb-unblock' => 'Ð\9eдблокирај корисничко име или ИП адресу',
 'ipb-blocklist' => 'Погледај постојећа блокирања',
 'ipb-blocklist-contribs' => 'Доприноси за $1',
-'unblockip' => 'Ð\94еблокирај корисника',
+'unblockip' => 'Ð\9eдблокирај корисника',
 'unblockiptext' => 'Користите образац испод да бисте вратили право писања блокираној IP адреси или корисничком имену.',
 'ipusubmit' => 'Уклони ову блокаду',
 'unblocked' => '[[User:$1|$1]] је деблокиран',
@@ -2800,7 +2816,7 @@ $1',
 'ipblocklist-empty' => 'Списак блокирања је празан.',
 'ipblocklist-no-results' => 'Тражена ИП адреса или корисничко име није блокирано.',
 'blocklink' => 'блокирај',
-'unblocklink' => 'деблокирај',
+'unblocklink' => 'одблокирај',
 'change-blocklink' => 'промени блокирање',
 'contribslink' => 'доприноси',
 'emaillink' => 'пошаљи е-поруку',
@@ -2815,8 +2831,8 @@ $1',
 'reblock-logentry' => '{{GENDER:|је променио|је променила|је променио}} подешавања за блокирање {{GENDER:$1|корисника|кориснице|корисника}} [[$1]] с роком истека од $2 ($3)',
 'blocklogtext' => 'Ово је дневник блокирања и деблокирања корисника.
 Аутоматски блокиране ИП адресе нису наведене.
\9fогледаÑ\98Ñ\82е [[Special:BlockList|Ñ\81пиÑ\81ак Ð±Ð»Ð¾ÐºÐ¸Ñ\80аниÑ\85 Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а]].',
-'unblocklogentry' => '{{GENDER:|Ñ\98е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80ао|Ñ\98е Ð´ÐµÐ±Ð»Ð¾ÐºÐ¸Ñ\80ала|Ñ\98е Ð´Ðµблокирао}} „$1“',
¢ÐµÐºÑ\83Ñ\9bе Ð·Ð°Ð±Ñ\80ане Ð¸ Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа Ð¼Ð¾Ð¶ÐµÑ\82е Ð½Ð°Ñ\9bи [[Special:BlockList|овде]].',
+'unblocklogentry' => '{{GENDER:|Ñ\98е Ð¾Ð´Ð±Ð»Ð¾ÐºÐ¸Ñ\80ао|Ñ\98е Ð¾Ð´Ð±Ð»Ð¾ÐºÐ¸Ñ\80ала|Ñ\98е Ð¾Ð´блокирао}} „$1“',
 'block-log-flags-anononly' => 'само анонимни корисници',
 'block-log-flags-nocreate' => 'онемогућено отварање налога',
 'block-log-flags-noautoblock' => 'аутоматско блокирање је онемогућено',
@@ -3154,7 +3170,7 @@ $1',
 'tooltip-watchlistedit-raw-submit' => 'Ажурирај списак',
 'tooltip-recreate' => 'Поново направите страницу иако је обрисана',
 'tooltip-upload' => 'Започните отпремање',
-'tooltip-rollback' => 'â\80\9eÐ\92Ñ\80аÑ\82иâ\80\9c Ð¿Ð¾Ð½Ð¸Ñ\88Ñ\82ава Ð¿Ð¾Ñ\81ледÑ\9aÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ñ\98едним ÐºÐ»Ð¸ÐºÐ¾Ð¼',
+'tooltip-rollback' => '„Врати“ поништава последњу измену ове странице једним кликом',
 'tooltip-undo' => 'Враћа ову измену и отвара образац за уређивање.',
 'tooltip-preferences-save' => 'Сачувај поставке',
 'tooltip-summary' => 'Унесите кратак опис',
@@ -3255,7 +3271,7 @@ $1',
 
 # Patrol log
 'patrol-log-page' => 'Дневник патролирања',
-'patrol-log-header' => 'Ð\9eво Ñ\98е Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а Ð¿Ñ\80егледаних измена.',
+'patrol-log-header' => 'Ð\9eво Ñ\98е Ð´Ð½ÐµÐ²Ð½Ð¸Ðº Ð¿Ð°Ñ\82Ñ\80олиÑ\80аних измена.',
 'log-show-hide-patrol' => '$1 дневник патролирања',
 
 # Image deletion
@@ -3912,7 +3928,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|разговор]]) је обрисао ову страницу након што сте почели да га уређујете. Потврдите да стварно желите да поново направите ову страницу.',
@@ -4107,6 +4123,9 @@ $5
 'version-software' => 'Инсталирани софтвер',
 'version-software-product' => 'Производ',
 'version-software-version' => 'Верзија',
+'version-entrypoints' => 'Адресе улазне тачке',
+'version-entrypoints-header-entrypoint' => 'Улазна тачка',
+'version-entrypoints-header-url' => 'Адреса',
 
 # Special:FilePath
 'filepath' => 'Путања датотеке',
@@ -4295,4 +4314,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 5444e2b..af585ca 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbian (Latin script) (‪Srpski (latinica)‬)
+/** Serbian (Latin script) (‪srpski (latinica)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  */
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Medija',
+       NS_MEDIA            => 'Medij',
        NS_SPECIAL          => 'Posebno',
        NS_TALK             => 'Razgovor',
        NS_USER             => 'Korisnik',
        NS_USER_TALK        => 'Razgovor_sa_korisnikom',
        NS_PROJECT_TALK     => 'Razgovor_o_$1',
-       NS_FILE             => 'Slika',
-       NS_FILE_TALK        => 'Razgovor_o_slici',
-       NS_MEDIAWIKI        => 'MedijaViki',
-       NS_MEDIAWIKI_TALK   => 'Razgovor_o_MedijaVikiju',
+       NS_FILE             => 'Datoteka',
+       NS_FILE_TALK        => 'Razgovor_o_datoteci',
+       NS_MEDIAWIKI        => 'Medijaviki',
+       NS_MEDIAWIKI_TALK   => 'Razgovor_o_Medijavikiju',
        NS_TEMPLATE         => 'Šablon',
        NS_TEMPLATE_TALK    => 'Razgovor_o_šablonu',
        NS_HELP             => 'Pomoć',
@@ -58,6 +58,10 @@ $namespaceAliases = array(
        'Разговор_о_помоћи'       => NS_HELP_TALK,
        'Категорија'              => NS_CATEGORY,
        'Разговор_о_категорији'   => NS_CATEGORY_TALK,
+
+       'Medija'                  => NS_MEDIA,
+       'Slika'                   => NS_FILE,
+       'Razgovor_o_slici'        => NS_FILE_TALK,
 );
 
 $extraUserToggles = array(
@@ -703,6 +707,8 @@ Navedeni razlog: ''$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“.',
+'invalidtitle-knownnamespace' => 'Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“',
+'invalidtitle-unknownnamespace' => 'Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Neispravna postavka: nepoznati skener za viruse: ''$1''",
@@ -1000,7 +1006,8 @@ Prilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:F
 'updated' => '(Ažurirano)',
 'note' => "'''Napomena:'''",
 'previewnote' => "'''Imajte u vidu da je ovo samo pregled.'''
-Vaše izmene još nisu sačuvane! [[#editform|→ Nastavi s uređivanjem]]",
+Vaše izmene još nisu sačuvane!",
+'continue-editing' => 'Nastavi uređivanje',
 'previewconflict' => 'Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.',
 'session_fail_preview' => "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''
 Pokušajte ponovo.
@@ -1099,6 +1106,12 @@ Ovakve argumente bi trebalo izbegavati.",
 'parser-template-loop-warning' => 'Otkrivena je petlja šablona: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Dubina uključivanja šablona je prekoračena ($1)',
 'language-converter-depth-warning' => 'Prekoračena je granica dubine jezičkog pretvarača ($1)',
+'node-count-exceeded-category' => 'Stranice u kojima je prekoračen broj čvorova',
+'node-count-exceeded-warning' => 'Stranica u kojoj je prekoračen broj čvorova',
+'expansion-depth-exceeded-category' => 'Stranice u kojima je prekoračena dubina proširenja',
+'expansion-depth-exceeded-warning' => 'Stranica u kojoj je prekoračena dubina proširenja',
+'parser-unstrip-loop-warning' => 'Utvrđena je petlja',
+'parser-unstrip-recursion-limit' => 'Prekoračeno je ograničenje rekurzije ($1)',
 
 # "Undo" feature
 'undo-success' => 'Izmena se može vratiti.
@@ -1244,7 +1257,7 @@ Pogledajte istoriju.',
 
 # Suppression log
 'suppressionlog' => 'Istorija sakrivanja',
-'suppressionlogtext' => 'Ispod se nalazi spisak brisanja i blokiranja koji uključuje sadržaj sakriven od administratora. Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]] za pregled važećih zabrana i blokiranja.',
+'suppressionlogtext' => 'Ispod se nalazi spisak brisanja i blokiranja koji uključuje sadržaj sakriven od administratora. Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
 
 # History merging
 'mergehistory' => 'Spoji istorije stranica',
@@ -1279,7 +1292,8 @@ Korišćenje navigacionih veza će poništiti ovu kolonu.',
 
 # Diffs
 'history-title' => 'Istorija izmena za „$1“',
-'difference' => '(razlike između izmena)',
+'difference-title' => 'Razlika između izmena stranice „$1“',
+'difference-title-multipage' => 'Razlika između stranica „$1“ i „$2“',
 'difference-multipage' => '(razlike između stranica)',
 'lineno' => 'Red $1:',
 'compareselectedversions' => 'Uporedi izabrane izmene',
@@ -1644,7 +1658,7 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'nchanges' => '$1 {{PLURAL:$1|izmena|izmene|izmena}}',
 'recentchanges' => 'Skorašnje izmene',
 'recentchanges-legend' => 'Postavke skorašnjih izmena',
-'recentchangestext' => 'Pratite skorašnje izmene na ovoj stranici.',
+'recentchanges-summary' => 'Ovde pratite najskorije izmene na vikiju.',
 'recentchanges-feed-description' => 'Pratite skorašnje izmene uz pomoć ovog dovoda.',
 'recentchanges-label-newpage' => 'Nova stranica',
 'recentchanges-label-minor' => 'Manja izmena',
@@ -2216,6 +2230,11 @@ Možda sadrži znakove koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor „$1“.',
 'allpages-hide-redirects' => 'Sakrij preusmerenja',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Gledate keširanu verziju ove stranice, koja može biti stara i do $1.',
+'cachedspecial-viewing-cached-ts' => 'Gledate keširanu verziju ove stranice, koja može da se razlikuje od trenutne.',
+'cachedspecial-refresh-now' => 'Pogledaj najnoviju.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Sledeća kategorija sadrži|Sledeće kategorije sadrže}} stranice ili datoteke.
@@ -2414,7 +2433,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:',
@@ -2629,7 +2648,7 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 # Block/unblock
 'autoblockid' => 'Samoblokiranje #$1',
 'block' => 'Blokiraj korisnika',
-'unblock' => 'Deblokiraj korisnika',
+'unblock' => 'Odblokiraj korisnika',
 'blockip' => 'Blokiraj korisnika',
 'blockip-title' => 'Blokiranje korisnika',
 'blockip-legend' => 'Blokiraj korisnika',
@@ -2650,7 +2669,7 @@ Izaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su
 ** Neprihvatljivo korisničko ime',
 'ipb-hardblock' => 'Zabrani prijavljenim korisnicima da uređuju s ove IP adrese',
 'ipbcreateaccount' => 'Onemogući otvaranje naloga',
-'ipbemailban' => 'Zabrani članu slanje e-poruka',
+'ipbemailban' => 'Zabrani korisniku slanje e-poruka',
 'ipbenableautoblock' => 'Automatski blokiraj poslednju IP adresu ovog korisnika i sve daljnje adrese s kojih pokuša da uređuje',
 'ipbsubmit' => 'Blokiraj ovog korisnika',
 'ipbother' => 'Drugo vreme:',
@@ -2665,15 +2684,15 @@ Izaberite konkretan razlog ispod (primer: navođenje konkretnih stranica koje su
 'badipaddress' => 'Neispravna IP adresa',
 'blockipsuccesssub' => 'Blokiranje je uspelo',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />
-Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]] za pregled blokiranja.',
+Blokiranja možete da pogledate [[Special:BlockList|ovde]].',
 'ipb-blockingself' => 'Ovom radnjom ćete blokirati sebe! Jeste li sigurni da to želite?',
 'ipb-confirmhideuser' => 'Upravo ćete blokirati korisnika s uključenom mogućnošću „sakrij korisnika“. Ovim će korisničko ime biti sakriveno u svim spiskovima i izveštajima. Želite li to da uradite?',
 'ipb-edit-dropdown' => 'Uredi razloge blokiranja',
-'ipb-unblock-addr' => 'Deblokiraj $1',
-'ipb-unblock' => 'Deblokiraj korisničko ime ili IP adresu',
+'ipb-unblock-addr' => 'Odblokiraj $1',
+'ipb-unblock' => 'Odblokiraj korisničko ime ili IP adresu',
 'ipb-blocklist' => 'Pogledaj postojeća blokiranja',
 'ipb-blocklist-contribs' => 'Doprinosi za $1',
-'unblockip' => 'Deblokiraj korisnika',
+'unblockip' => 'Odblokiraj korisnika',
 'unblockiptext' => 'Koristite obrazac ispod da biste vratili pravo pisanja blokiranoj IP adresi ili korisničkom imenu.',
 'ipusubmit' => 'Ukloni ovu blokadu',
 'unblocked' => '[[User:$1|$1]] je deblokiran',
@@ -2705,7 +2724,7 @@ Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]] za pregled blokiran
 'ipblocklist-empty' => 'Spisak blokiranja je prazan.',
 'ipblocklist-no-results' => 'Tražena IP adresa ili korisničko ime nije blokirano.',
 'blocklink' => 'blokiraj',
-'unblocklink' => 'deblokiraj',
+'unblocklink' => 'odblokiraj',
 'change-blocklink' => 'promeni blokiranje',
 'contribslink' => 'doprinosi',
 'emaillink' => 'pošalji e-poruku',
@@ -2720,8 +2739,8 @@ Istorija sakrivanja se nalazi ispod:',
 'reblock-logentry' => '{{GENDER:|je promenio|je promenila|je promenio}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice|korisnika}} [[$1]] s rokom isteka od $2 ($3)',
 'blocklogtext' => 'Ovo je dnevnik blokiranja i deblokiranja korisnika.
 Automatski blokirane IP adrese nisu navedene.
-Pogledajte [[Special:BlockList|spisak blokiranih IP adresa]].',
-'unblocklogentry' => '{{GENDER:|je deblokirao|je deblokirala|je deblokirao}} „$1“',
+Tekuće zabrane i blokiranja možete naći [[Special:BlockList|ovde]].',
+'unblocklogentry' => '{{GENDER:|je odblokirao|je odblokirala|je odblokirao}} „$1“',
 'block-log-flags-anononly' => 'samo anonimni korisnici',
 'block-log-flags-nocreate' => 'onemogućeno otvaranje naloga',
 'block-log-flags-noautoblock' => 'automatsko blokiranje je onemogućeno',
@@ -4012,6 +4031,9 @@ Trebalo bi da ste primili [{{SERVER}}{{SCRIPTPATH}}/COPYING primerak GNU-ove op
 'version-software' => 'Instalirani softver',
 'version-software-product' => 'Proizvod',
 'version-software-version' => 'Verzija',
+'version-entrypoints' => 'Adrese ulazne tačke',
+'version-entrypoints-header-entrypoint' => 'Ulazna tačka',
+'version-entrypoints-header-url' => 'Adresa',
 
 # Special:FilePath
 'filepath' => 'Putanja datoteke',
@@ -4200,4 +4222,15 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'api-error-uploaddisabled' => 'Otpremanje je onemogućeno na ovom vikiju.',
 'api-error-verification-error' => 'Datoteka je oštećena ili ima neispravan nastavak.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunde|sekundi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minuta|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sata|sati}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|nedelja|nedelje|nedelja}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godine|godina}}',
+'duration-decades' => '$1 {{PLURAL:$1|decenija|decenije|decenija}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vek|veka|vekova}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma|milenijuma}}',
+
 );
index 2fa2545..641ef8d 100644 (file)
@@ -629,7 +629,6 @@ A kan ben trowe efu dribi.
 
 # Diffs
 'history-title' => 'Historia fu "$1"',
-'difference' => '(A difrenti fu den kenki)',
 'lineno' => 'Lini $1:',
 'compareselectedversions' => 'Luku den difrenti fu den versi di teki',
 'editundo' => "drai pot' baka",
index 515b1b6..ca03e2a 100644 (file)
@@ -72,10 +72,9 @@ $messages = array(
 'tog-enotifminoredits' => 'Uk bie litje Annerengen an do Sieden E-Mails seende.',
 'tog-enotifrevealaddr' => 'Dien E-Mail-Adrässe wäd in Beskeed-Mails wiesed.',
 'tog-shownumberswatching' => 'Antaal fon do beooboachtjende Benutsere anwiese',
-'tog-oldsig' => 'Foarbekiek fon ju aktuälle Signatuur:',
+'tog-oldsig' => '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',
@@ -173,6 +172,7 @@ $messages = array(
 'listingcontinuesabbrev' => '(Foutsättenge)',
 'index-category' => 'Indizierde Sieden',
 'noindex-category' => 'Nit indizierde Sieden',
+'broken-file-category' => 'Sieden mäd stukkene Doatäilinke',
 
 'about' => 'Uur',
 'article' => 'Inhoold Siede',
@@ -202,7 +202,7 @@ $messages = array(
 'vector-action-move' => 'Ferskuuwe',
 'vector-action-protect' => 'Skutsje',
 'vector-action-undelete' => 'Wierhäärstaale',
-'vector-action-unprotect' => 'Fräireeke',
+'vector-action-unprotect' => 'Siedenskuts annerje',
 'vector-simplesearch-preference' => 'Uutwiedede Säikfoarsleeke aktivierje (bloot Vector)',
 'vector-view-create' => 'Moakje',
 'vector-view-edit' => 'Beoarbaidje',
@@ -239,8 +239,8 @@ $messages = array(
 'protect' => 'skutsje',
 'protect_change' => 'annerje',
 'protectthispage' => 'Siede skutsje',
-'unprotect' => 'Fräiroat',
-'unprotectthispage' => 'Skuts aphieuwje',
+'unprotect' => 'Siedenskuts annerje',
+'unprotectthispage' => 'Siedenskuts annerje',
 'newpage' => 'Näie Siede',
 'talkpage' => 'Diskussion',
 'talkpagelinktext' => 'Diskussion',
@@ -332,6 +332,8 @@ $1',
 'page-rss-feed' => '"$1" RSS-Feed',
 'page-atom-feed' => '"$1" Atom-Feed',
 'red-link-title' => '$1 (Siede nit deer)',
+'sort-descending' => 'Oustiegend sortierje',
+'sort-ascending' => 'Apstiegend sortierje',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Siede',
@@ -397,19 +399,22 @@ Mäld dit n [[Special:ListUsers/sysop|Administrator]] unner Naamenge fon ju URL.
 'badarticleerror' => 'Disse Honnelenge kon ap disse Siede nit moaked wäide.',
 'cannotdelete' => 'Ju Siede od Doatäi "$1" kon nit läsked wäide.
 Fielicht is ju al fon uurswál läsked wuuden.',
+'cannotdelete-title' => 'Siede "$1" kon nit läsked wäide',
 'badtitle' => 'Uungultige Tittel.',
 'badtitletext' => 'Die anfräigede Tittel waas uungultich, loos, of n uungultigen Sproaklink fon n uur Wiki.',
-'perfcached' => 'Do foulgjende Doaten stamme uut dän Cache un sunt muugelkerwiese nit aktuäl. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Disse Doaten stamme uut dän Cache, lääste Update: $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Do foulgjende Doaten stamme uut dän Cache un sunt muugelkerwiese nit aktuäl. Maximoal {{PLURAL:$1|een Resultoat is|$1 Resultoate sunt}} ferföigboar in dän Cache.',
+'perfcachedts' => 'Disse Doaten stamme uut dän Cache, lääste Update: $2, $3 Uure. Maximoal {{PLURAL:$4|een Resultoat is|$4 Resultoate sunt}} ferfïgboar in dän Cache.',
 'querypage-no-updates' => "'''Ju Aktualisierengsfunktion foar disse Siede is apstuuns deaktivierd. Do Doaten wäide toueerst nit fernäierd.'''",
 'wrong_wfQuery_params' => 'Falske Parameter foar wfQuery()<br />
 Funktion: $1<br />
 Oufroage: $2',
 'viewsource' => 'Wältext betrachtje',
+'viewsource-title' => 'Wältext fon Siede $1 bekiekje',
 'actionthrottled' => 'Aktionsantaal limitierd',
 'actionthrottledtext' => 'Ju Uutfierenge fon disse Aktion tou oafte in ne kuute Tiedoustand is limitierd. Du hääst dit Limit juust ieuwen beloanged. Fersäik et in eenige Minuten fon näien.',
 'protectedpagetext' => 'Disse Siede is foar dät Beoarbaidjen speerd.',
 'viewsourcetext' => 'Wältext fon disse Siede:',
+'viewyourtext' => "Du koast dän Wältext fon '''dien Beoarbaidenge''' fon disse Siede bekiekje un kopierje:",
 'protectedinterface' => 'Disse Siede änthaalt Text foar dät Sproak-Interface fon ju Software un is speerd, uum Misbruuk tou ferhinnerjen.',
 'editinginterface' => "'''Woarskauenge:''' Du beoarbaidest ne Siede ju der bruukt wäd, Interface-Text foar ju Software tou lääwerjen.
 Annerengen ap disse Siede wirkje sik uut ap ju Benutseruurfläche foar uur Bruukere.
@@ -418,9 +423,18 @@ Foar Uursättengen koast du fielicht beeter [//translatewiki.net/wiki/Main_Page?
 'cascadeprotected' => 'Disse Siede is tou Beoarbaidenge speerd. Ju is in do {{PLURAL:$1|foulgjende Siede|foulgjende Sieden}} ienbuunen, do der middels ju Kaskadenspeeroption skutsed {{PLURAL:$1|is|sunt}}:
 $2',
 'namespaceprotected' => "Du hääst neen Begjuchtigenge, ju Siede in dän '''$1'''-Noomensruum tou beoarbaidjen.",
+'customcssprotected' => '↓Du hääst nit ju Begjuchtegenge, disse CSS änthooldende Siede tou beoarbaidjen, deer ju do persöönelke Ienstaalengen fon n uur Benutser änthaalt.',
+'customjsprotected' => '↓Du hääst nit ju Begjuchtegenge, disse JavaScript änthooldewnde Siede tou beoarbaidjen, deer ju do persöönelke Ienstaalengen fon n uur Benutser änthaalt.',
 'ns-specialprotected' => 'Spezioalsieden konnen nit beoarbaided wäide.',
 'titleprotected' => "Ne Siede mäd dissen Noome kon nit moaked wäide.
 Ju Speere wuude truch [[User:$1|$1]] mäd ju Begruundenge ''$2'' ienroat.",
+'filereadonlyerror' => '↓Ju Doatäi „$1“ kon nit annerd wäide, deer ap dät Doatäirepositorium „$2“ bloot Leesetougriep muugelk is.
+
+Die Administrator, die dän Skrieuwtougriep speerde, roate foulgjenden Gruund an: „$3“.',
+'invalidtitle-knownnamespace' => '
+↓Ungultigen Tittel mäd Noomensruum „$2“ un Text „$3“',
+'invalidtitle-unknownnamespace' => '
+↓Ungultigen Tittel mäd unbekoanden Noomensruumnummer $1 un Text „$2“',
 
 # Virus scanner
 'virus-badscanner' => "Failerhafte Konfiguration: uunbekoanden Virenscanner: ''$1''",
@@ -456,10 +470,12 @@ Ferjeet nit, dien [[Special:Preferences|{{SITENAME}}-Ienstaalengen]] antoupaasje
 'createaccount' => 'Benutserkonto anlääse',
 'gotaccount' => "Du hääst al n Konto? '''$1'''.",
 'gotaccountlink' => 'Hier gungt dät ätter dän Login',
+'userlogin-resetlink' => '
+↓Do Anmäldedoaten ferjeeten?',
 'createaccountmail' => 'Uur Email',
 'createaccountreason' => 'Gruund:',
 'badretype' => 'Do bee Paaswoude stimme nit uureen.',
-'userexists' => 'Disse Benutsernoomen is al ferroat. Wääl jädden n uur.',
+'userexists' => 'Dissen Benutsernoome is al ferroat. Wääl jädden n uur.',
 'loginerror' => 'Failer bie ju Anmäldenge',
 'createaccounterror' => 'Benutserkonto kuud nit moaked wäide: $1',
 'nocookiesnew' => 'Dien Benutsertougong wuude kloor moaked, man du bäst nit anmälded. {{SITENAME}} benutset Cookies toun Anmäldjen fon do Benutsere. Du hääst in dien Browser-Ienstaalengen Cookies deaktivierd. Uum dien näie Benutsertougong tou bruuken, läit jädden dien Browser Cookies foar {{SITENAME}} annieme un mäldje die dan mäd dien juust iengjuchten Benutsernoome un Paaswoud an.',
@@ -503,6 +519,8 @@ Mail-Fersoand un Ämpfang foar do foulgjende Funktionen muugelk.',
 'noemailprefs' => 'Du hääst neen Email-Adrässe anroat, do foulgjende Funktione sunt deeruum apstuuns nit muugelk.',
 'emailconfirmlink' => 'Bestäätigje Jou Email-Adrässe',
 'invalidemailaddress' => 'Ju Email-Adresse wuude nit akzeptierd deeruum dät ju n ungultich Formoat tou hääben skient. Reek jädden ne Adrässe in n gultich Formoat ien of moakje dät Fäild loos.',
+'cannotchangeemail' => 'E-Mail-Adressen konnen in dissen Wiki nit annerd wäide.',
+'emaildisabled' => 'Uur disse Websiede konnen neen E-Mails fersoand wäode.',
 'accountcreated' => 'Benutserkonto näi anlaid',
 'accountcreatedtext' => 'Dät Benutserkonto $1 wuude iengjucht.',
 'createaccount-title' => 'Benutserkonto anlääse foar {{SITENAME}}',
@@ -518,6 +536,7 @@ Täif, eer du fon näien fersäkst.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Uunbekoanden Failer mäd ju Funktion mail() fon PHP',
+'user-mail-no-addy' => 'Fersoachte ne E-Mail sunner Angoawe fon ne E-Mail-Adresse tou ferseenden',
 
 # Change password dialog
 'resetpass' => 'Paaswoud annerje',
@@ -538,7 +557,19 @@ Muugelkerwiese hääst du dien Paaswoud al mäd Ärfoulch annerd of n näi tiede
 
 # Special:PasswordReset
 'passwordreset' => 'Paaswoud touräächsätte',
+'passwordreset-text' => 'Dit Formular uutfälle, uum per E-Mail ne Ärinnerenge tou do Anmäldeinformatione tou kriegen.',
+'passwordreset-legend' => 'Paaswoud touräächsätte',
+'passwordreset-disabled' => 'Dät Touräächsätten fon Paaswoude wuud in dissen Wiki deaktivierd.',
+'passwordreset-pretext' => '{{PLURAL:$1||Reek aan fon do foulgjende Doaten ien}}',
 'passwordreset-username' => 'Benutsernoome:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Ju E-Mail-Ättergjucht bekiekje?',
+'passwordreset-capture-help' => 'Wan du disse Kaste ankjuusest, wäd ju E-Mail-Ättergjucht mäd dät temporäre Paaswoud, die wiesed, as uk dän Benutser tousoand.',
+'passwordreset-email' => 'E-Mail-Adresse:',
+'passwordreset-emailtitle' => 'Benutserkontoinformatione ap {{SITENAME}}',
+'passwordreset-emailelement' => '↓Benutsernoome: $1
+Temporär Paaswoud: $2',
+'passwordreset-emailsent' => '↓Ne Ärinnerenge wuud uur E-Mail fersoand.',
 
 # Edit page toolbar
 'bold_sample' => 'Fatten Text',
@@ -641,8 +672,12 @@ of <span class="plainlinks">in do touheerige [{{fullurl:{{#special:Log}}|page={{
 'userpage-userdoesnotexist-view' => 'Benutserkonto „$1“ bestoant nit.',
 'blocked-notice-logextract' => 'Dissen Benutser is apstuuns speerd.
 Foar Information foulget n aktuellen Iendraach uut dät Benutser-Logbouk:',
-'clearyourcache' => "'''Bemäärkenge: Ätter dät Fäästlääsen kon dät nöödich weese, dän Browser-Cache loostoumoakjen, uum do Annerengen sjo tou konnen.'''
-'''Mozilla / Firefox / Safari:''' hoold ''Shift'' deel un klik ''Reload,'' of tai ''Ctrl-F5'' of ''Ctrl-R'' (''Command-R'' ap n Mac); '''Konqueror: '''klik ''Reload'' of tai ''F5;'' '''Opera:''' moak dän cache loos in ''Tools → Preferences;'' '''Internet Explorer:''' hoold ''Ctrl'' deel un klik ''Refresh,'' of tai ''Ctrl-F5.''",
+'clearyourcache' => "'''Bemäärkenge: Ätter dät Fäästlääsen  dän Browser-Cache loosmoakje, uum do Annerengen sjo tou konnen.'''
+*'''Firefox / Safari:''' hoold ''Uumskalttaste'' deel un klik deerbie ''Aktualisierje'' of tai ''Strg+F5'' of ''Strg+R'' (''⌘+R'' ap n Mac)
+* '''Google Chrome:''' ''Uumskalttaste+Strg+R'' (''⌘+Uumskalttaste+R'' ap n Mac) taie
+* '''Internet Explorer:''' ''Strg+F5'' taie of ''Strg'' taie un tou glieke Tied ''Aktualisieren'' anklikke
+* '''Opera:''' ''Extras → Internetspuuren läskje … → Individuelle Uutwoal → Dän komplette Cache läskje''
+*'''Konqueror: '''klik ''Aktualisieren'' of tai ''F5;''",
 'usercssyoucanpreview' => "'''Tipp:''' Benutse dän  „{{int:showpreview}}“-Knoop, uum dien näi CSS foar dät Spiekerjen tou tästjen.",
 'userjsyoucanpreview' => "'''Tipp:''' Benutse dän „{{int:showpreview}}“-Knoop, uum dien näi JavaScript foar dät Spiekerjen tou tästjen.",
 'usercsspreview' => "== Foarbekiek fon dien Benutser-CSS ==
@@ -656,7 +691,8 @@ Foar Information foulget n aktuellen Iendraach uut dät Benutser-Logbouk:',
 'userinvalidcssjstitle' => "'''Woarskauenge:''' Deer existiert neen Skin \"\$1\". Betoank jädden, dät benutserspezifiske .css- un .js-Sieden män n Littek-Bouksteeuwe anfange mouten, also t.B. ''{{ns:user}}:Mustermann/vector.css'', nit ''{{ns:user}}:Mustermann/Vector.css''.",
 'updated' => '(Annerd)',
 'note' => "'''Waiwiesenge:'''",
-'previewnote' => "'''Dit is man ne Foarbekiek, die Artikkel wuude noch nit spiekerd!'''",
+'previewnote' => "'''Dit is man ne Foarbekiek, ju Siede wuude noch nit spiekerd!'''",
+'continue-editing' => 'Fääre beoarbaidje',
 'previewconflict' => 'Disse Foarskau rakt dän Inhoold fon dät buppere Täkstfäild wier; so wol die Artikkel uutsjo, wan du nu spiekerjen dääst.',
 'session_fail_preview' => "Dien Beoarbaidenge kuud nit spiekerd wäide, deer dien Sitsengsdoaten ferlädden geen sunt.
 Fersäik dät jädden fonnäien, deertruch dät du unner ju foulgjende Foarskau nochmoal ap \"Siede spiekerje\" klikst.
@@ -670,6 +706,7 @@ Skuul dät Problem bestounden blieuwe, [[Special:UserLogout|mäldje die ou]] un
 Ne Spiekerenge kon dän Siedeninhoold fernäile. Dit geböärt bietiede truch ju Benutsenge fon n anonymen Proxy-Tjoonst, die der failerhaft oarbaidet.'''",
 'edit_form_incomplete' => "'''Die Inhoold fon dät Beoarbaidengsformular häd dän Server nit fulboodich beloanged. Pröif dien Beoarbaidengen ap Fulständegaid un fersäik dät noch insen.",
 'editing' => 'Beoarbaidjen fon $1',
+'creating' => 'Moakjen fon „$1“',
 'editingsection' => 'Beoarbaidje fon $1 (Apsats)',
 'editingcomment' => 'Beoarbaidjen fon $1 (Näi Stuk)',
 'editconflict' => 'Beoarbaidengs-Konflikt: "$1"',
@@ -689,7 +726,7 @@ Du toukwäst uus hiermäd, dät du dän Text '''sälwen ferfoated''' hääst, d
 'copyrightwarning2' => 'Aal Biedraage tou dän {{SITENAME}} konnen fon uur Ljuude ferannerd un fersprat wäide. Fals Jie nit moaten dät Jou Oarbaid hier fon uur Ljuude ferannerd un fersprat wäd, dan drukke Jie nit ap "Spiekerje".
 
 Jie fersicherje hiermäd uk, dät Jie dän Biedraach sälwen ferfoated hääbe blw. dät hie neen froamd Gjucht ferlätset (sjuch fääre: $1).',
-'longpageerror' => "'''FAILER: Die Text, dän du tou spiekerjen fersäkst, is $1 KB groot. Dät is gratter as dät ferlööwede Maximum fon $2 KB – Spiekerenge nit muugelk.'''",
+'longpageerror' => "'''FAILER: Die Text, dän du tou spiekerjen fersäkst, is {{PLURAL:$1|een Kilobyte|$1 Kilobyte}} groot. Dät is gratter as dät ferlööwede Maximum fon $2 KB – Spiekerenge nit muugelk.'''",
 'readonlywarning' => "'''WOARSKAUENGE: Ju Doatenboank wuude foar Wartengsoarbaiden speerd, so dät dien Annerengen apstuuns nit spiekerd wäide konnen.
 Sicherje dän Text jädden lokoal ap dien Computer un fersäik tou n leeteren Tiedpunkt, do Annerengen tou uurdreegen.'''
 
@@ -725,6 +762,7 @@ Ju wuud anskienend läsked.',
 'edit-conflict' => 'Beoarbaidengskonflikt.',
 'edit-no-change' => 'Dien Beoarbaidenge wuude ignorierd, deer neen Annerenge an dän Text foarnuumen wuude.',
 'edit-already-exists' => 'Ju näie Siede kuud nit moaked wäide, deer ju al foarhounden is.',
+'defaultmessagetext' => 'Standardtext',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Woarskauenge: Disse Siede änthaalt tou fuul Aproupe fon stuure Parserfunktione.
@@ -738,6 +776,11 @@ Der {{PLURAL:$2|duur nit moor as 1 Aproup|duuren nit moor as $1 Aproupe}} weese.
 'parser-template-loop-warning' => 'Foarloagenstrik äntdäkt: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Foarloagenrekursionsdjuptenskeed uurtreeden ($1)',
 'language-converter-depth-warning' => 'Sproakkonverter-djüptelimit uurtreeden ($1)',
+'node-count-exceeded-category' => 'Sieden, do ju Knättenantaal uurtreeden hääbe',
+'node-count-exceeded-warning' => 'Ju Siede häd ju Knättepunktantaal uurtreeden.',
+'expansion-depth-exceeded-category' => 'Sieden, do der ju Expansionsdjupte uurtreeden hääbe',
+'expansion-depth-exceeded-warning' => 'Ju Siede häd ju Expansionsdjupte uurtreeden.',
+'parser-unstrip-loop-warning' => 'Sirkelbesuch fääststoald',
 
 # "Undo" feature
 'undo-success' => 'Ju Annerenge kuud mäd Ärfoulch tourääch annerd wäide. Jädden ju Beoarbaidenge in ju Ferglieksansicht kontrollierje un dan ap „Siede spiekerje“ klikke, uum ju tou spiekerjen.',
@@ -791,28 +834,30 @@ Legende: (Aktuäl) = Unnerskeed tou ju aktuälle Version,
 Naiere Angoawen toun Läskfoargong as uk ne Begründenge fiende sik in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
 'rev-deleted-text-unhide' => "Disse Version wuud '''läsked'''.
 Details stounde in dät [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].
-As Administrator koast du noch [$1 ju Version bekiekje], wan du fääregunge moatest.",
+Du koast [$1 ju Version bekiekje], wan du fääregunge moatest.",
 'rev-suppressed-text-unhide' => "Disse Version wuud '''unnerdrukt'''.
 Details stounde in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].
-Du as Administrator koast [$1 disse Version bekiekje], wan du et wonskest.",
+Du koast [$1 disse Version bekiekje], wan du moatest.",
 'rev-deleted-text-view' => "Disse Version wuude '''läsked'''.
-As Administrator koast du ju wieders ienkiekje.
-Naiere Angoawen toun Läskfoargong as uk ne Begründenge fiende sik in dät [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
+Du koast ju ienkiekje, wan du moatest.
+Naiere Angoawen fiende sik in dät [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
 'rev-suppressed-text-view' => "Disse Version wuud '''unnerdrukt'''.
-Administratore konnen ju ienkiekje; Details stounde in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].",
+Du koast ju ienkiekje, wan du moatest. 
+Details stounde in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].",
 'rev-deleted-no-diff' => "Du koast dissen Unnerskeed nit betrachtje, deer een fon do Versione '''läsked''' wuude.
 Details stounde in dät [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
 'rev-suppressed-no-diff' => "Du koast dissen Versionsunnerskeed nit betrachtje, deer een fon do Versione '''läsked''' wuud.",
 'rev-deleted-unhide-diff' => "Een fon do Versione fon dissen Unnerskeed wuud '''läsked'''.
 Details stounde in dät [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].
-As Adminstrator koast du noch [$1 dissen Versionsunnerskeed bekiekje] wan du fääregunge wolt.",
+Du koast [$1 dissen Versionsunnerskeed bekiekje] wan du moatest.",
 'rev-suppressed-unhide-diff' => "Een fon do Versione fon dissen Unnerskeed wuud '''unnerdrukt'''.
 Details stounde in dät [{{fullurl:{{#special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].
-As Adminstrator koast du noch [$1 dissen Versionsunnerskeed bekiekje] wan du fääregunge wolt.",
-'rev-deleted-diff-view' => "Ne Version fon dissen Versionsunnerskeed wuud '''läsked'''.
-As Administrator koast du dissen Versionsunnerskeed sjo. Details fiende sik in dät [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
+Du koast [$1 dissen Versionsunnerskeed bekiekje] wan du wolt.",
+'rev-deleted-diff-view' => "Een fon do Versione fon dissen Versionsunnerskeed wuud '''läsked'''.
+Du koast dissen Versionsunnerskeed bekiekje, wan du wolt. 
+Naiere Angoawen fiende sik in dät [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Läsk-Logbouk].",
 'rev-suppressed-diff-view' => "Een fon do Versione fon dissen Versionsunnerskeed wuud '''unnerdrukt'''.
-As Administrator koast du dissen Versionsunnerskeed sjo. Details fiende sik in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].",
+Du koast dissen Versionsunnerskeed bekiekje, wan du wolt. Details fiende sik in dät [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unnerdrukkengs-Logbouk].",
 'rev-delundel' => 'wiese/ferbierge',
 'rev-showdeleted' => 'wies',
 'revisiondelete' => 'Versione läskje/wier häärstaale',
@@ -880,7 +925,8 @@ Wröigje do Logbouke.',
 
 # Suppression log
 'suppressionlog' => 'Uursicht-Logbouk',
-'suppressionlogtext' => 'Dit is dät Logbouk fon do Uursicht-Aktione (Annerengen fon ju Sichtboarhaid fon Versione, Beorbaidengskommentare, Benutsernoomen un Benutserspeeren).',
+'suppressionlogtext' => 'Dit is dät Logbouk fon do Uursicht-Aktione (Annerengen fon ju Sichtboarhaid fon Versione, Beorbaidengskommentare, Benutsernoomen un Benutserspeeren).
+Sjuch ju [[Special:BlockList|Lieste fon speerde IP-Adressen un Benutsernoomen]] foar aktuelle Speeren.',
 
 # History merging
 'mergehistory' => 'Versionsgeskichten fereenigje',
@@ -913,7 +959,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 
 # Diffs
 'history-title' => 'Versionsgeskichte fon "$1"',
-'difference' => '(Unnerskeed twiske Versione)',
 'difference-multipage' => '(Unnerskeed twiske Sieden)',
 'lineno' => 'Riege $1:',
 'compareselectedversions' => 'Wäälde Versione ferglieke',
@@ -993,6 +1038,7 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'qbsettings-fixedright' => 'Gjuchts, fääst',
 'qbsettings-floatingleft' => 'Links, swieuwjend',
 'qbsettings-floatingright' => 'Gjuchts, swieuwjend',
+'qbsettings-directionality' => 'Fääst, ouhongich fon de Skrieuwgjuchte fon ju wäälde Sproake',
 
 # Preferences page
 'preferences' => 'Ienstaalengen',
@@ -1004,7 +1050,9 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'prefs-skin' => 'Skin',
 'skin-preview' => 'Foarskau',
 'datedefault' => 'Neen Preferenz',
+'prefs-beta' => 'Beta-Funktione',
 'prefs-datetime' => 'Doatum un Tied',
+'prefs-labs' => 'Alpha-Funktione',
 'prefs-personal' => 'Benutserdoaten',
 'prefs-rc' => 'Bekoandreekenge fon "Lääste Annerengen"',
 'prefs-watchlist' => 'Beooboachtengslieste',
@@ -1038,7 +1086,7 @@ Hier n toufällich generierden Wäid, dän du ferweende koast: $1',
 'savedprefs' => 'Dien Ienstaalengen wuuden spiekerd.',
 'timezonelegend' => 'Tiedzone:',
 'localtime' => 'Tied bie Jou:',
-'timezoneuseserverdefault' => 'Standoardtied fon dän Server ($1)',
+'timezoneuseserverdefault' => 'Standoardtied fon dän Server bruuke ($1)',
 'timezoneuseoffset' => 'Uur (Unnerskeed anreeke)',
 'timezoneoffset' => 'Unnerskeed¹:',
 'servertime' => 'Tied ap dän Server:',
@@ -1073,7 +1121,8 @@ Dät kon nit moor tourääch troald wäide.',
 'prefs-registration' => 'Anmäldetiedpunkt:',
 'yourrealname' => 'Dien ächte Noome:',
 'yourlanguage' => 'Sproake fon ju Benutser-Uurfläche:',
-'yourvariant' => 'Variante:',
+'yourvariant' => 'Sproakevariante:',
+'prefs-help-variant' => 'Ju foarleekene Skrieuwwiese, in ju do Wikisieden wiesd wäide skällen.',
 'yournick' => 'Unnerskrift:',
 'prefs-help-signature' => 'Biedraage ap Diskussionssieden skuulen mäd „<nowiki>~~~~</nowiki>“ signierd wäide, wät dan in dien Signatuur mäd Tiedstämpel uumewondeld wäd.',
 'badsig' => 'Signatursyntax is uungultich; HTML uurpröiwje.',
@@ -1113,7 +1162,7 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'userrights-lookup-user' => 'Ferwaltede Gruppentouheeregaid',
 'userrights-user-editname' => 'Benutsernoome anreeke:',
 'editusergroup' => 'Beoarbaidede Benutsergjuchte',
-'editinguser' => "Uur Benutsergjuchte fon '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Uur Benutsergjuchte fon '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Beoarbaidje Gruppentouheeregaid fon dän Benutser',
 'saveusergroups' => 'Spiekerje Gruppentouheeregaid',
 'userrights-groupsmember' => 'Meeglid fon:',
@@ -1125,7 +1174,7 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'userrights-no-interwiki' => 'Du hääst neen Begjuchtigenge, do Benutsergjuchte in uur Wikis tou annerjen.',
 'userrights-nodatabase' => 'Ju Doatenboank $1 is nit deer of nit lokoal.',
 'userrights-nologin' => 'Du moast die mäd n Administrator-Benutserkonto [[Special:UserLogin|anmäldje]], uum Benutsergjuchte tou annerjen.',
-'userrights-notallowed' => 'Du hääst neen Begjuchtigenge, uum Benutsergjuchte tou reeken.',
+'userrights-notallowed' => 'Du hääst neen Begjuchtigenge, uum Benutsergjuchte tou reeken of ientouluuken.',
 'userrights-changeable-col' => 'Gruppentouheeregaid, ju du annerje koast',
 'userrights-unchangeable-col' => 'Gruppentouheeregaid, ju du nit annerje koast',
 
@@ -1139,12 +1188,12 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'group-suppress' => 'Uursichte',
 'group-all' => '(aal)',
 
-'group-user-member' => 'Benutser',
-'group-autoconfirmed-member' => 'Bestäätigede Benutser',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'Administrator',
-'group-bureaucrat-member' => 'Bürokrat',
-'group-suppress-member' => 'Uursicht',
+'group-user-member' => '{{GENDER:$1|Benutser|Benutserske}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|Automatisk bestäätigden Benutser|Automatisk bestäätigde Benutserske}}',
+'group-bot-member' => '{{GENDER:$1|Bot}}',
+'group-sysop-member' => '{{GENDER:$1|Administrator|Administratorske}}',
+'group-bureaucrat-member' => '{{GENDER:$1|Bürokroat|Bürokroatske}}',
+'group-suppress-member' => '{{GENDER:$1|Uursjooer|Uursjooerske}}',
 
 'grouppage-user' => '{{ns:project}}:Benutsere',
 'grouppage-autoconfirmed' => '{{ns:project}}:Bestäätigede Benutser',
@@ -1218,6 +1267,7 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'rightslog' => 'Gjuchte-Logbouk',
 'rightslogtext' => 'Dit is dät Logbouk fon do Annerengen fon do Benutsergjuchte.',
 'rightslogentry' => 'annerde ju Gruppentouheeregaid foar „$1“ fon „$2“ ap „$3“.',
+'rightslogentry-autopromote' => 'wuud automatisk fon „$2“ ätter „$3“ touoardend',
 'rightsnone' => '(-)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1259,7 +1309,7 @@ Ju duur maximoal $1 {{PLURAL:$1|Teeken|Teekene}} loang weese.',
 'nchanges' => '$1 {{PLURAL:$1|Annerenge|Annerengen}}',
 'recentchanges' => 'Lääste Annerengen',
 'recentchanges-legend' => 'Anwiesoptione',
-'recentchangestext' => "Ap disse Siede koast du do lääste Annerengen ap '''{{SITENAME}}''' ättergunge.",
+'recentchanges-summary' => "Ap disse Siede koast du do lääste Annerengen ap '''{{SITENAME}}''' ättergunge.",
 'recentchanges-feed-description' => 'Ferfoulge mäd dissen Feed do lääste Annerengen in {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Näie Siede',
 'recentchanges-label-minor' => 'Litje Annerenge',
@@ -1371,6 +1421,7 @@ Ferlööwed {{PLURAL:$3|is|sunt}} $2.",
 'large-file' => 'Jädden neen Bielde uur $1 hoochleede; disse Doatäi is $2 groot.',
 'largefileserver' => 'Disse Doatäi is tou groot, deer die Server so konfigurierd is, dät Doatäien bloot bit tou ne bestimde Grööte apzeptierd wäide.',
 'emptyfile' => 'Ju hoochleedene Doatäi is loos. Die Gruund kon n Typfailer in dän Doatäinoome weese. Kontrollierje jädden, of du ju Doatäi wuddelk hoochleede wolt.',
+'windows-nonascii-filename' => 'Dit Wiki unnerstöänt neen Doatäinoomen do der Sunnerteekene änthoolde.',
 'fileexists' => "Ne Doatäi mäd dissen Noome bestoant al.
 Wan du ap 'Doatäi spiekerje' klikst, wäd ju Doatäi uurskrieuwen.
 Unner '''<tt>[[:$1]]</tt>''' koast du die bewisje, of du dät wuddelk wolt.
@@ -1459,8 +1510,8 @@ Ju kon deeruum nit ap Sicherhaid wröiged wäide.',
 # img_auth script messages
 'img-auth-accessdenied' => 'Tougriep ferwäigerd',
 'img-auth-nopathinfo' => 'PATH_INFO failt.
-Dien Server is nit deerfoar iengjucht, disse Information fääretoureeken.
-Dät kuud CGI-basierd weese un unnerstutset img_auth nit.
+Die Server is nit deerfoar iengjucht, disse Information fääretoureeken.
+Ju kuud CGI-basierd weese un unnerstutset img_auth nit.
 Sjuch https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Dät wonskede Paad is nit in dät konfigurierde Uploadferteeknis.',
 'img-auth-badtitle' => 'Uut „$1“ kon naan gultigen Tittel moaked wäide.',
@@ -1473,6 +1524,7 @@ Bloot Doatäitougriep is ferlööwed.',
 Dit Wiki wuud as n eepentelk Wiki konfigurierd.
 Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
 'img-auth-noread' => 'Benutser häd neen Begjuchtigenge, „$1“ tou leesen.',
+'img-auth-bad-query-string' => 'Ju URL wiest ne uungultige Oufroageteekenfoulge ap.',
 
 # HTTP errors
 'http-invalid-url' => 'Uungultige URL:$1',
@@ -1498,7 +1550,8 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
 'upload_source_file' => ' (ne Doatäi ap Jou Computer)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Disse Spezialsiede liestet aal hoochleedene Doatäie ap. Standoardmäitich wäide do toulääst hoochleedene Doatäie toueerst anwiesd. Truch n Klik ap do Spaltenuurskrifte kon ju Sortierenge uumetroald wäide of der kon ätter ne uur Spalte sortierd wäide.',
+'listfiles-summary' => 'Disse Spezialsiede liestet aal hoochleedene Doatäie ap. 
+Sofier ätter n bestimden Benutser sieuwed wäd, wäide bloot do Doatäie wiesd, bie doo hie ju laäste Version hoochleeden häd.',
 'listfiles_search_for' => 'Säik ätter Doatäi:',
 'imgfile' => 'Doatäi',
 'listfiles' => 'Bieldelieste',
@@ -1527,13 +1580,14 @@ Uut Sicherhaidsgruunde is img_auth.php deaktivierd.',
 'filehist-filesize' => 'Doatäigrööte',
 'filehist-comment' => 'Kommentoar',
 'filehist-missing' => 'Doatäi failt',
-'imagelinks' => 'Doatäiferweendengen',
+'imagelinks' => 'Doatäiferweendenge',
 'linkstoimage' => '{{PLURAL:$1|Ju foulgjende Siede ferwoant|Do foulgjende $1 Sieden ferweende}} disse Doatäi:',
 'linkstoimage-more' => 'Moor as {{PLURAL:$1|een Siede ferlinket|$1 Sieden ferlinkje}} ap disse Doatäi.
 Ju foulgjende Lieste wiest bloot {{PLURAL:$1|dän eerste Link|do eerste $1 Linke}} ap disse Doatäi.
 Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
 'nolinkstoimage' => 'Naan Artikkel benutset disse Bielde.',
 'morelinkstoimage' => '[[Special:WhatLinksHere/$1|Wiedere Ferbiendengen]] foar disse Doatäi.',
+'linkstoimage-redirect' => '$1 (Doatäifääreleedenge) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Ju foulgjende Doatäi is n Duplikoat|Do foulgjende $1 Doatäie sunt Duplikoate}} fon disse Doatäi ([[Special:FileDuplicateSearch/$2|wiedere Details]]):',
 'sharedupload' => 'Disse Doatäi stamt uut $1 un duur fon uur Projekte ferwoand wäide.',
 'sharedupload-desc-there' => 'Disse Doatäi stamt uut $1 un duur fon uur Projekte ferwoand wäide. Sjuch ap ju [$2 Doatäibeskrieuwengssiede] ätter wiedere Informatione.',
@@ -1619,7 +1673,7 @@ Ne [[Special:WhatLinksHere/$2|fulständige Lieste]] is ferföigboar.',
 'statistics-users-active-desc' => 'Benutsere mäd Beoarbaidengen {{PLURAL:$1|in do lääste 24 Uuren|in do fergeene $1 Deege}}',
 'statistics-mostpopular' => 'Maast besoachte Sieden',
 
-'disambiguations' => 'Begriepskläärengssieden',
+'disambiguations' => 'Sieden do der ap Begriepskläärengssieden ferlinkje',
 'disambiguationspage' => 'Template:Begriepskläärenge',
 'disambiguations-text' => "Do foulgjende Sieden ferlinkje ap ne Siede tou ju '''Begriepskläärenge'''.
 Jie skuulen insteede deerfon ap ju eegentelk meende Siede ferlinkje.<br />
@@ -1692,7 +1746,7 @@ Ne Siede wäd as Begriepskläärengssiede behonneld, wan [[MediaWiki:Disambiguat
 'listusers-editsonly' => 'Wies bloot Benutsere mäd Biedraage',
 'listusers-creationsort' => 'Ätter dän Moakdoatum sortierje',
 'usereditcount' => '$1 {{PLURAL:$1|Beoarbaidenge|Beoarbaidengen}}',
-'usercreated' => 'Moaked ap n $1 uum $2',
+'usercreated' => '{{GENDER:$3|Moaked}} ap n $1 uum $2 Uure',
 'newpages' => 'Näie Sieden',
 'newpages-username' => 'Benutsernoome:',
 'ancientpages' => 'Siet loang uunbeoarbaidede Sieden',
@@ -1719,8 +1773,8 @@ Deeruum konnen do hier noch aptäld weese, wan do uk aktiv benutsed wäide.',
 'booksources-invalid-isbn' => 'Fermoudelk is ju ISBN uungultich. Säik ätter Failere in ju Kopie.',
 
 # Special:Log
-'specialloguserlabel' => 'Benutser:',
-'speciallogtitlelabel' => 'Tittel:',
+'specialloguserlabel' => 'Uutfierenden Benutser:',
+'speciallogtitlelabel' => 'Siel (Tittel of Benutser):',
 'log' => 'Logbouke',
 'all-logs-page' => 'Aal eepentelke Logbouke',
 'alllogstext' => 'Dit is ne kombinierde Anwiesenge fon aal Logbouke fon {{SITENAME}}.
@@ -1764,7 +1818,7 @@ Sjuch uk ju Lieste fon do [[Special:WantedCategories|wonskede Kategorien]].',
 'linksearch-pat' => 'Säikmuster:',
 'linksearch-ns' => 'Noomensruum:',
 'linksearch-ok' => 'Säike (012)',
-'linksearch-text' => 'Disse Spezialsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konne Wildcards as biespilswiese <tt>*.example.com</tt> benutsed wäide.<br />Unnerstutsede Protokolle: <tt>$1</tt>',
+'linksearch-text' => 'Disse Spezioalsiede moaket ju Säike muugelke ätter Sieden, in do bestimde Webferbiendengen äntheelden sunt. Deerbie konnen Ploatshooldere as biespilswiese <tt>*.biespiell.de</tt> benutsed wäide. Der mout ap minste een Top-Level-Domai, t.B. „*.org“. anroat wäide. <br />Unnerstutsede Protokolle: <tt>$1</tt> (Disse jädden nit bie ju Säikanfroage anreeke.)',
 'linksearch-line' => '$1 is ferlinked fon $2',
 'linksearch-error' => 'Wildcards konnen bloot an dän Ounfang fon ju URL ferwoand wäide.',
 
@@ -1821,6 +1875,10 @@ As Ouseender wäd ju E-Mail-Adresse uut dien [[Special:Preferences|Ienstaalengen
 'noemailtext' => 'Dissen Benutser häd neen gultige Email-Adrässe anroat.',
 'nowikiemailtitle' => 'E-Mail-Ferseendenge nit muugelk',
 'nowikiemailtext' => 'Dissen Benutser moate neen E-Mails fon uur Benutsere kriege.',
+'emailnotarget' => 'Nit foarhoundenen of uungultigen Benutsernoome foar dän Ämpfangst fon ne E-Mail.',
+'emailtarget' => 'Benutsernoome fon dän Ämpfanger ienreeke',
+'emailusername' => 'Benutsernoome:',
+'emailusernamesubmit' => 'Fääre',
 'email-legend' => 'E-Mail an n uur {{SITENAME}}-Benutser seende',
 'emailfrom' => 'Fon:',
 'emailto' => 'An:',
@@ -1845,11 +1903,13 @@ As Ouseender wäd ju E-Mail-Adresse uut dien [[Special:Preferences|Ienstaalengen
 'watchlistanontext' => 'Du moast die $1, uum dien Beooboachtengslieste tou sjoon of Iendraage ap hier tou beoarbaidjen.',
 'watchnologin' => 'Du bäst nit anmälded',
 'watchnologintext' => 'Du moast [[Special:UserLogin|anmälded]] weese, uum dien Beooboachtengslieste tou beoarbaidjen.',
+'addwatch' => 'Tou Beooboachtengslieste bietouföigje',
 'addedwatchtext' => "Die Artikkel \"[[:\$1]]\" wuude an dien [[Special:Watchlist|Foulgelieste]] touföiged.
 Leetere Annerengen an dissen Artikkel un ju touheerende Diskussionssiede wäide deer liested
 un die Artikkel wäd in ju [[Special:RecentChanges|fon do lääste Annerengen]] in '''Fatskrift''' anroat.
 
 Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede ap \"Ferjeet disse Siede\".",
+'removewatch' => 'Fon ju Beooboachtengslieste wächhoalje',
 'removedwatchtext' => 'Ju Siede „[[:$1]]“ wuude fon dien [[Special:Watchlist|Beooboachtengslieste]] wächhoald.',
 'watch' => 'Beooboachtje',
 'watchthispage' => 'Siede beooboachtje',
@@ -1872,6 +1932,7 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Beooboachtje …',
 'unwatching' => 'Nit beooboachtje …',
+'watcherrortext' => 'Bie dät Annerjen fon do Beoboachtengsliestenienstaalengen foar "$1" is n Failer aptreeden.',
 
 'enotif_mailer' => '{{SITENAME}} tält Beskeed uur Email',
 'enotif_reset' => 'Markier aal besoachte Sieden',
@@ -1901,6 +1962,9 @@ Dien früntelk {{SITENAME}} Becheedtälsystem
 
 --
 
+Uum do Ienstaaleungen fon dät E-Mail-Becheedtälsystem antoupaasjen, besäik 
+{{canonicalurl:{{#special:Preferences}}}}
+
 Uum do Ienstaalengen fon dien Beooboachtengslieste antoupaasjen, besäik
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
@@ -1959,8 +2023,8 @@ Ju lääste Annerenge stamt fon [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int
 
 # Protect
 'protectlogpage' => 'Siedenskuts-Logbouk',
-'protectlogtext' => 'Dit is ne Lieste fon do blokkierde Sieden.
-Sjuch [[Special:ProtectedPages|Skutsede Siede]] foar moor Informatione.',
+'protectlogtext' => 'Dit is dät Siedenskuts-Logbouk.
+Sjuch ju [[Special:ProtectedPages|Lieste fon skutsede Sieden]] foar aal apstuuns skutsede Sieden.',
 'protectedarticle' => 'skutsede „[[$1]]“',
 'modifiedarticleprotection' => 'annerde dän Skuts fon „[[$1]]“',
 'unprotectedarticle' => 'hieuwede dän Skuts fon "[[$1]]" ap',
@@ -2023,9 +2087,8 @@ Sjuch [[Special:ProtectedPages|Skutsede Siede]] foar moor Informatione.',
 'viewdeletedpage' => 'Läskede Versione anwiese',
 'undeletepagetext' => '{{PLURAL:$1|Ju foulgjende Siede wuud läsked un kon|Do foulgjende $1 Sieden wuuden läsked un konnen}} fon Administratore wier häärstoald wäide:',
 'undelete-fieldset-title' => 'Beoarbaidengen wier häärstaale',
-'undeleteextrahelp' => "Uum ju Siede gans mäd aal Versione wiertoumoakjen, wääl neen Versione uut, reek ne Begruundenge an un klik ap '''''Wier moakje'''''.
-* Moatest du bloot bestimde Versione wier moakje, so wääl do jädden eenpeld anhound fon do Markierengen uut, reek ne Begruundenge an un klik dan ap '''''Wier moakje'''''.
-* '''''Oubreeke''''' moaket dät Kommentoarfäild loos un hoalt aal Markierengen wäch bie do Versione.",
+'undeleteextrahelp' => '*Uum ju Siede gans mäd aal Versione wiertoumoakjen, wääl neen Versione uut, reek ne Begruundenge an un klik dan ap „{{int:undeletebtn}}“.
+* Moatest du bloot bestimde Versione wier moakje, so wääl do jädden eenpeld anhound fon do Markierengen uut, reek ne Begruundenge an un klik dan ap „{{int:undeletebtn}}“.',
 'undeleterevisions' => '{{PLURAL:$1|1 Version|$1 Versione}} archivierd',
 'undeletehistory' => 'Wan du disse Siede wier häärstoalst, wäide uk aal oolde Versione wier häärstoald. Wan siet ju Läskenge aan näien Artikkel mäd dän sälge Noome moaked wuude, wäide do wier häärstoalde Versione as oolde Versione fon dissen Artikkel ferskiene.',
 'undeleterevdel' => 'Dät wier Häärstaalen wäd nit truchfierd, wan deertruch ju aktuelste Version toun Deel läsked wäd.
@@ -2068,7 +2131,9 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Noomensruum:',
 'invert' => 'Uutwoal uumekiere',
+'tooltip-invert' => 'Dit Uutwoalfäild anklikje, uum Annerengen in dän wäälde Noomensruum un, sofier uutwääld, dän äntspreekende touheerige Noomensruum uustoubländjen',
 'namespace_association' => 'Touoardende Noomensruum',
+'tooltip-namespace_association' => 'Dit Uutwoalfäild anklikje, uum dän din Uutwoal touheerigen Diskussionsnoomenruum, of in dän uumekierde Fal, dän touheerige Noomensruum, mee ientoubeluuken',
 'blanknamespace' => '(Sieden)',
 
 # Contributions
@@ -2155,8 +2220,8 @@ Reek dän Gruund foar ju Speere oun.',
 'ipb-confirm' => 'Speerenge bestäätigje',
 'badipaddress' => 'Dissen Benutser bestoant nit, d.h. die Noome is falsk',
 'blockipsuccesssub' => 'Blokkoade geloangen',
-'blockipsuccesstext' => 'Ju IP-Adrässe [[Special:Contributions/$1|$1]] wuude blokkierd.
-<br />[[Special:BlockList|Lieste fon Blokkoaden]].',
+'blockipsuccesstext' => 'Die Benutser/ ju IP-Adrässe [[Special:Contributions/$1|$1]] wuud speerd.<br />
+Toun Aphieuwjen fon ju Speere sjuch [[Special:BlockList|Lieste fon aktive Speeren]].',
 'ipb-blockingself' => 'Du bäst tougong, die sälwen tou speeren! Moatest dät wuudelk dwo?',
 'ipb-confirmhideuser' => 'Du bäst tougong n Benutser in dän Modus "Benutser fersteete" tou speeren. Dät fiert deertou, dät die Benutsernoome in aal Liesten un Logbouke unnerdrukt wäd. Moatest dät wuudelk dwo?',
 'ipb-edit-dropdown' => 'Speergruunde beoarbaidje',
@@ -2205,9 +2270,9 @@ Reek dän Gruund foar ju Speere oun.',
 Hier foulget die Iendraach uut dät Unnerdrukkengs-Logbouk:',
 'blocklogentry' => '[[$1]] blokkierd foar n Tiedruum fon: $2 $3',
 'reblock-logentry' => 'annerde ju Speere foar „[[$1]]“ foar dän Tiedruum: $2 $3',
-'blocklogtext' => 'Dit is n Logbouk fon Speerengen un Äntspeerengen fon Benutsere un IP-Adrässe. 
+'blocklogtext' => 'Dit is n Logbouk fon Speerengen un Äntspeerengen fon Benutsere un IP-Adrässen
 Automatisk speerde IP-Adrässe sunt nit apnuumen.
-Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässe un Benutsernoomen]] foar aal aktive Speeren.',
+Sjuch ju [[Special:BlockList|Lieste fon de speerde IP-Adrässen un Benutsernoomen]] foar aal aktive Speeren.',
 'unblocklogentry' => 'Blokkade fon $1 aphieuwed',
 'block-log-flags-anononly' => 'bloot Anonyme',
 'block-log-flags-nocreate' => 'Dät Moakjen fon Benutserkonten speerd',
@@ -2257,6 +2322,7 @@ Reek jädden [[Special:UnlockDB|ju Doatenboank wier fräi]], so gau ju Fersuurge
 'unlockdbsuccesstext' => 'Ju {{SITENAME}}-Doatenboank wuude fräiroat.',
 'lockfilenotwritable' => 'Ju Doatenboank-Speerdoatäi is nit beskrieuwboar. Toun Speeren of Fräireeken fon ju Doatenboank mout ju foar dän Webserver beskrieuwboar weese.',
 'databasenotlocked' => 'Ju Doatenboank is nit speerd.',
+'lockedbyandtime' => '(fon $1 an dän $2 uum $3 Uure)',
 
 # Move page
 'move-page' => 'Ferskuuwe „$1“',
@@ -2460,7 +2526,7 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
 'tooltip-ca-viewsource' => 'Disse Siede is skutsed. Die Wältext kon ankieked wäide.',
 'tooltip-ca-history' => 'Fröiere Versione fon disse Siede',
 'tooltip-ca-protect' => 'Disse Siede skutsje',
-'tooltip-ca-unprotect' => 'Disse Siede fräireeke',
+'tooltip-ca-unprotect' => 'Siedenskuts annerje',
 'tooltip-ca-delete' => 'Disse Siede läskje',
 'tooltip-ca-undelete' => 'Iendraage wier moakje, eer disse Siede läsked wuude',
 'tooltip-ca-move' => 'Disse Siede ferskuuwe',
@@ -2541,6 +2607,19 @@ Do ap dän lokoale Reekener spiekerje un deerätter hier hoochleede.',
 'spam_reverting' => 'Lääste Version sunner Links tou $1 wier häärstoald.',
 'spam_blanking' => 'Aal Versione äntheelden Links tou $1, skeenmoaked.',
 
+# Info page
+'pageinfo-title' => 'Informatione tou „$1“',
+'pageinfo-header-edits' => 'Beoarbaidengen',
+'pageinfo-header-watchlist' => 'Beooboachtengslieste',
+'pageinfo-header-views' => 'Siedenaproupe',
+'pageinfo-subjectpage' => 'Siede',
+'pageinfo-talkpage' => 'Diskussionssiede',
+'pageinfo-watchers' => 'Antaal fon do Besäikere',
+'pageinfo-edits' => 'Antaal fon do  Beoarbaidengen',
+'pageinfo-authors' => 'Antaal fon unnerskeedelke Autoren',
+'pageinfo-views' => 'Antaal fon Siedenaproupe',
+'pageinfo-viewsperedit' => 'Siedenaproupe pro Beoarbaidenge',
+
 # Patrolling
 'markaspatrolleddiff' => 'As pröiwed markierje',
 'markaspatrolledtext' => 'Dissen Artikkel as pröiwed markierje',
@@ -2579,6 +2658,7 @@ $1',
 'widthheightpage' => '$1 × $2, {{PLURAL:$3|1 Siede|$3 Sieden}}',
 'file-info' => 'Doatäigrööte: $1, MIME-Typ: $2',
 'file-info-size' => '$1 × $2 Pixel, Doatäigrööte: $3, MIME-Typ: $4',
+'file-info-size-pages' => '$1 × $2 Pixel, Doatäigrööte: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Siede| Sieden}}',
 'file-nohires' => 'Neen haagere Aplöösenge foarhounden.',
 'svg-long-desc' => 'SVG-Doatäi, Basisgrööte: $1 × $2 Pixel, Doatäigrööte: $3',
 'show-big-image' => 'Bielde in hooge Aplöösenge',
@@ -2619,8 +2699,8 @@ Deerap foulgjende Siedenferbiendengen in jusälge Riege wäide as Uutnoamen betr
 Truch ätterdraine Beoarbaidenge fon ju Originoaldoatäi konnen eenige Details annerd wuuden weese.',
 'metadata-expand' => 'Wiedere Details ienbländje',
 'metadata-collapse' => 'Details uutbländje',
-'metadata-fields' => 'Do foulgjende Fäildere fon do EXIF-Metadoaten in disse Media Wiki-Ättergjucht wäide ap Bieldbeskrieuwengssieden anwiesd;
-wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
+'metadata-fields' => 'Do foulgjende Fäildere fon do EXIF-Metadoaten, do der in dissen Media Wiki-Systemtext anroat sunt, wäide ap Bieldbeskrieuwengssieden mäd ienklapte Metadoatentabelle anwiesd.
+Wiedere wäide standoardmäitich nit anwiesd.
 * make
 * model
 * fnumber
@@ -2669,8 +2749,8 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
 'exif-colorspace' => 'Faawenruum',
 'exif-componentsconfiguration' => 'Betjuudenge fon älke Komponente',
 'exif-compressedbitsperpixel' => 'Komprimierde Bits pro Pixel',
-'exif-pixelydimension' => 'Gultige Bieldebratte',
-'exif-pixelxdimension' => 'Gultige Bieldehöchte',
+'exif-pixelydimension' => 'Bieldebratte',
+'exif-pixelxdimension' => 'Bieldehöchte',
 'exif-usercomment' => 'Benutserkommentoare',
 'exif-relatedsoundfile' => 'Touheerige Toondoatäi',
 'exif-datetimeoriginal' => 'Ärfoatengstiedpunkt',
@@ -2684,9 +2764,9 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
 'exif-exposureprogram' => 'Beljuchtengsprogram',
 'exif-spectralsensitivity' => 'Beljoachtengstiedwäid',
 'exif-isospeedratings' => 'Film- of Sensorämpfiendelkaid (ISO)',
-'exif-shutterspeedvalue' => 'Beluchtengstiedwäid',
-'exif-aperturevalue' => 'Bländenwäid',
-'exif-brightnessvalue' => 'Ljoachtegaidswäid',
+'exif-shutterspeedvalue' => 'APEX-Beluchtengstiedwäid',
+'exif-aperturevalue' => 'APEX-Bländenwäid',
+'exif-brightnessvalue' => 'APEX-Ljoachtegaidswäid',
 'exif-exposurebiasvalue' => 'Beljuchtengsfoargoawe',
 'exif-maxaperturevalue' => 'Grootste Blände',
 'exif-subjectdistance' => 'Fierte',
@@ -2748,7 +2828,50 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
 'exif-gpsareainformation' => 'Noome fon dät GPS-Gestrich',
 'exif-gpsdatestamp' => 'GPS-Doatum',
 'exif-gpsdifferential' => 'GPS-Differentioalkorrektur',
+'exif-jpegfilecomment' => 'JPEG-Doatäikommentoar',
+'exif-keywords' => 'Koaiwoude',
+'exif-worldregioncreated' => 'Waareldregion in ju dät Foto apnuumen wuud',
+'exif-countrycreated' => 'Stoat in dän dät Foto apnuumen wuud',
+'exif-countrycodecreated' => 'Code foar dän Stoat in dän dät Foto apnuumen wuud',
+'exif-provinceorstatecreated' => 'Provinz of Glidstoat in dän dät Foto apnuumen wuud',
+'exif-citycreated' => 'Stääd in ju dät Foto aonuumen wuud',
+'exif-sublocationcreated' => 'Beräk fon de Stääd in dän dät Foto apnuumen wuud',
+'exif-worldregiondest' => 'Wiesde Waareldregione',
+'exif-countrydest' => 'Wiesden Stoat',
+'exif-countrycodedest' => 'Code foar dän wiesden Stoat',
+'exif-provinceorstatedest' => 'Wiesde Provinz of Glidstoat',
+'exif-citydest' => 'Wiesde Stääd',
+'exif-sublocationdest' => 'Beräk fon de wiesde Stääd',
 'exif-objectname' => 'Kuuten Tittel',
+'exif-specialinstructions' => 'Besunnere Anwiesengen',
+'exif-headline' => 'Tittel',
+'exif-credit' => 'Noomensnaamengte/Fereepentelker',
+'exif-source' => 'Wälle',
+'exif-editstatus' => 'Redaktionelle Stoatus fon dät Foto',
+'exif-urgency' => 'Tringelkhaid',
+'exif-fixtureidentifier' => 'Kolumne',
+'exif-locationdest' => 'Deerstoalden Standoart',
+'exif-locationdestcode' => 'Code foar dän deerstoalde Standoart',
+'exif-objectcycle' => 'Tied fon dän Dai, foar ju dit Medium bestimd is',
+'exif-contact' => 'Kontaktinformatione',
+'exif-writer' => 'Ferfoater',
+'exif-languagecode' => 'Sproake',
+'exif-iimversion' => 'IM-Version',
+'exif-iimcategory' => 'Kategorie',
+'exif-iimsupplementalcategory' => 'Kategorien uurhoop',
+'exif-datetimeexpires' => 'Nit ferweende ätter',
+'exif-originaltransmissionref' => 'Code fon dän Standoart fon dän dät Foto tousoand wuud',
+'exif-identifier' => 'Kannenge',
+'exif-lens' => 'Ferwoand Objektiv',
+'exif-serialnumber' => 'Seriennummer fon ju Kamera',
+'exif-cameraownername' => 'Kamerabesitter',
+'exif-label' => 'Beteekenge',
+'exif-datetimemetadata' => 'Doatum tou dän do Metadoaten toulääst annerd wuuden',
+'exif-nickname' => 'Gebruukelke Noome fon dät Foto',
+'exif-rating' => 'Beweertenge (uut 5)',
+'exif-rightscertificate' => 'Gjuchteferwaltengszertifikoat',
+'exif-copyrighted' => 'Uurhieuwergjuchtstoatus',
+'exif-copyrightowner' => 'Uurhieuwergjuchtsienhääber',
 
 # EXIF attributes
 'exif-compression-1' => 'Uunkomprimierd',
@@ -2760,9 +2883,9 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
 'exif-orientation-3' => 'Uum 180° uumewoand',
 'exif-orientation-4' => 'Vertikoal uumewoand',
 'exif-orientation-5' => 'Juun dän Klokkenwiesersin uum 90° troald un vertikoal uumewoand',
-'exif-orientation-6' => 'Uum 90° in Klokkenwiesersin troald',
+'exif-orientation-6' => 'Uum 90° juun dän Klokkenwiesersin troald',
 'exif-orientation-7' => 'Uum 90° in Klokkenwiesersin troald un vertikoal uumewoand',
-'exif-orientation-8' => 'Uum 90° juun dän Klokkenwiesersin troald',
+'exif-orientation-8' => 'Uum 90° in dän Klokkenwiesersin troald',
 
 'exif-planarconfiguration-1' => 'Groafformoat',
 'exif-planarconfiguration-2' => 'Planoarformoat',
@@ -2830,6 +2953,8 @@ wiedere standdoardmäitich "ienklapte" Details konnen anwiesd wäide.
 'exif-sensingmethod-7' => 'Trilinearen Sensor',
 'exif-sensingmethod-8' => 'Color sequential linear sensor',
 
+'exif-filesource-3' => 'Digitoale Standbieldekamera',
+
 'exif-scenetype-1' => 'Normoal',
 
 'exif-customrendered-0' => 'Standoard',
index 501f5b8..ff0b98d 100644 (file)
@@ -13,6 +13,7 @@
  * @author Kandar
  * @author Meursault2004
  * @author Mssetiadi
+ * @author Reedy
  * @author Urhixidur
  * @author לערי ריינהארט
  */
@@ -487,8 +488,8 @@ Sigana geus dihapus ku nu séjén.',
 'cannotdelete-title' => 'Hanteu bisa ngahapus kaca "$1"',
 'badtitle' => 'Judul goréng',
 'badtitletext' => 'Judul kaca nu dipénta teu bener, kosong, atawa judul antarbasa atawa antarwikina salah tutumbu.',
-'perfcached' => 'Data di handap ieu sindangan sahingga--meureun--teu mutahir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data di handap ieu mah sindangan, panungtungan diropéa téh $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => "Data di handap ieu mangrupa 'cache' sahingga bisa jadi henteu mutahir. 'Cache' nyadiakeun paling loba {{PLURAL:$1|hiji hasil|$1 hasil}}.",
+'perfcachedts' => "Data di handap mangrupa 'cache' anu panungtungan diropéa $1. 'Cache' nyadiakeun paling loba {{PLURAL:$4|hiji hasil|$4 hasil}}.",
 'querypage-no-updates' => 'Pangrobahan ahir ti kaca ieu keur dipaéhkeun. Data anu aya di dieu ayeuna moal dimuat deui.',
 'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamenta: $2',
 'viewsource' => 'Témbongkeun sumber',
@@ -717,7 +718,7 @@ Alesanana ''\$2''.
 * Sasaran nudipeungpeuk : \$7
 
 Anjeun bisa nepungan \$1 atawa salasahiji [[{{MediaWiki:Grouppage-sysop}}|kuncén]] séjén pikeun nyawalakeun hal ieu.
-'''<u>Catet</u>''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.
+'''Catet''': yén anjeun teu bisa maké fungsi \"surélékan pamaké ieu\" mun anjeun teu ngadaptarkeun alamat surélék nu sah kana [[Special:Preferences|préferénsi pamaké]] anjeun.
 
 Alamat IP anjeun \$3 jeung ID na #\$5.
 Lampirkeun informasi ieu dina unggal ''query'' anjeun.",
@@ -779,7 +780,7 @@ Pikeun rujukan, éntri log panungtung dipidangkeun di handap:',
 'userinvalidcssjstitle' => "'''Awas''': kulit \"\$1\" mah teu aya. Sing émut yén kaca .css jeung .js mah migunakeun aksara leutik dina judulna, contona baé {{ns:user}}:Foo/vector.css lawan {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Geus diropéa)',
 'note' => "'''Catetan:'''",
-'previewnote' => "'''Inget yén ieu ukur pramidang, can disimpen!'''
+'previewnote' => "'''Inget yén ieu ukur pratayang, can disimpen.'''
 Éditan anjeun can disimpen!",
 'previewconflict' => 'Sawangan ieu mangrupa eunteung pikeun téks na rohangan ngédit sakumaha bakal katémbong mun ku anjeun disimpen.',
 'session_fail_preview' => "'''Punten! Kami teu bisa ngolah éditan anjeun alatan leungitna data rintakan. Mangga cobian deui. Mun tetep teu bisa, cobi kaluar log lajeng lebet deui.'''",
@@ -1024,7 +1025,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 
 # Diffs
 'history-title' => 'Jujutan révisi "$1"',
-'difference' => '(Béda antarrévisi)',
 'difference-multipage' => '(béda antarkaca)',
 'lineno' => 'Baris ka-$1:',
 'compareselectedversions' => 'Bandingkeun vérsi nu dipilih',
@@ -1364,7 +1364,7 @@ Mun geus anggeus teu bisa dibolaykeun.',
 'nchanges' => '$1 {{PLURAL:$1|parobahan|parobahan}}',
 'recentchanges' => 'Anyar robah',
 'recentchanges-legend' => 'Pilihan parobahan anyar',
-'recentchangestext' => 'Lacak parobahan ka wiki panganyarna na kaca ieu.',
+'recentchanges-summary' => 'Lacak parobahan ka wiki panganyarna na kaca ieu.',
 'recentchanges-feed-description' => 'Manggihan parobahan panganyarna dina wiki di asupan ieu.',
 'recentchanges-label-newpage' => 'Ieu parobahan bakal ngahasillkeun kaca anyar',
 'recentchanges-label-minor' => 'Ieu éditan minor',
index 8835b74..9868b9b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Swedish (Svenska)
+/** Swedish (svenska)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author StefanB
  * @author Steinninn
  * @author Str4nd
+ * @author Thurs
  * @author Tobulos1
  * @author VickyC
+ * @author Warrakkk
  * @author Where next Columbus
  * @author Where next Columbus?
  * @author WikiPhoenix
@@ -358,7 +360,7 @@ $messages = array(
 'tog-watchlisthidepatrolled' => 'Göm patrullerade redigeringar från bevakningslistan',
 'tog-nolangconversion' => 'Konvertera inte mellan språkvarianter',
 'tog-ccmeonemails' => 'Skicka kopior till mig av e-post jag skickar till andra användare',
-'tog-diffonly' => 'Visa inte sidinnehåll under differenser',
+'tog-diffonly' => 'Visa inte sidinnehåll under diffar',
 'tog-showhiddencats' => 'Visa dolda kategorier',
 'tog-noconvertlink' => 'Stäng av konvertering av sidtitlar',
 'tog-norollbackdiff' => 'Visa inte diff efter tillbakarullning',
@@ -676,8 +678,8 @@ Den kanske redan har raderats av någon annan.',
 'badtitle' => 'Felaktig titel',
 'badtitletext' => 'Den begärda sidtiteln är antingen ogiltig eller tom, eller så är titeln felaktigt länkad från en annan wiki.
 Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
-'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} restultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.',
-'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} restultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.',
+'perfcached' => 'Följande data är cachad och är möjligtvis inte helt uppdaterad. Maximalt {{PLURAL:$1|ett|$1}} resultat finns {{PLURAL:$1|tillgängligt|tillgängliga}} i cachen.',
+'perfcachedts' => 'Sidan är hämtad ur ett cacheminne och uppdaterades senast $1. Maximalt {{PLURAL:$4|ett|$4}} resultat finns {{PLURAL:$4|tillgängligt|tillgängliga}} i cachen.',
 'querypage-no-updates' => 'Uppdatering av den här sidan är inte aktiverad. Datan kommer i nuläget inte att uppdateras.',
 'wrong_wfQuery_params' => 'Felaktiga parametrar för wfQuery()<br /> Funktion: $1<br /> Förfrågan: $2',
 'viewsource' => 'Visa wikitext',
@@ -702,6 +704,10 @@ Den uppgivna anledningen är "\'\'$2\'\'".',
 'filereadonlyerror' => 'Det går inte att ändra filen "$1", eftersom fildatabasen "$2" är i skrivskyddat läge.
 
 Den administratören som låste den gav denna anledning: "\'\'$3\'\'".',
+'invalidtitle-knownnamespace' => 'Ogiltig titel med namnrymden "$2" och texten "$3"',
+'invalidtitle-unknownnamespace' => 'Ogiltig titel med okänt namnrymdsnummer $1 och texten "$2"',
+'exception-nologin' => 'Inte inloggad',
+'exception-nologin-text' => 'Denna sida eller åtgärd kräver att du måste vara inloggad på denna wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Dålig konfigurering: okänd virusskanner: ''$1''",
@@ -983,7 +989,8 @@ Den har inte sparats än!'''",
 'updated' => '(Uppdaterad)',
 'note' => "'''Obs!'''",
 'previewnote' => "'''Kom ihåg att detta bara är en förhandsvisning.'''
-Dina ändringar har ännu inte sparats! [[#editform|→ Fortsätt redigera]]",
+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.',
@@ -1080,6 +1087,12 @@ 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',
+'parser-unstrip-loop-warning' => 'Tagavskalningsloop upptäcktes',
+'parser-unstrip-recursion-limit' => 'Tagavskalningsloop överskred rekursionsgränsen ($1)',
 
 # "Undo" feature
 'undo-success' => 'Redigeringen kan göras ogjord.
@@ -1226,7 +1239,7 @@ Vänligen kontrollera loggarna.',
 # Suppression log
 'suppressionlog' => 'Undanhållandelogg',
 'suppressionlogtext' => 'Nedan visas en lista över raderingar och blockeringar som berör innehåll dolt för administratörer.
-Se [[Special:BlockList|IP-blockeringslistan]] för listan över gällande blockeringar.',
+Se [[Special:BlockList|blockeringslistan]] för listan över gällande blockeringar.',
 
 # History merging
 'mergehistory' => 'Sammanfoga sidhistoriker',
@@ -1259,7 +1272,8 @@ Se till att sidhistorikens kontinuitet behålls när du sammanfogar historik.',
 
 # Diffs
 'history-title' => 'Versionshistorik för "$1"',
-'difference' => '(Skillnad mellan versioner)',
+'difference-title' => 'Skillnad mellan versioner av "$1"',
+'difference-title-multipage' => 'Skillnader mellan sidorna "$1" och "$2"',
 'difference-multipage' => '(Skillnad mellan sidor)',
 'lineno' => 'Rad $1:',
 'compareselectedversions' => 'Jämför angivna versioner',
@@ -1356,6 +1370,7 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 'prefs-beta' => 'Betafunktioner',
 'prefs-datetime' => 'Datum och tid',
 'prefs-labs' => 'Testfunktioner',
+'prefs-user-pages' => 'Användarsidor',
 'prefs-personal' => 'Mitt konto',
 'prefs-rc' => 'Senaste ändringar',
 'prefs-watchlist' => 'Bevakningslista',
@@ -1391,7 +1406,7 @@ Här är ett slumpmässigt genererat värde som du kan använda: $1',
 'savedprefs' => 'Dina inställningar har sparats',
 'timezonelegend' => 'Tidszon:',
 'localtime' => 'Lokal tid:',
-'timezoneuseserverdefault' => 'Använd wiki standard ($1)',
+'timezoneuseserverdefault' => 'Använd wikins standard ($1)',
 'timezoneuseoffset' => 'Annan (specificera skillnad)',
 'timezoneoffset' => 'Skillnad¹:',
 'servertime' => 'Serverns tid:',
@@ -1618,7 +1633,7 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'nchanges' => '$1 {{PLURAL:$1|ändring|ändringar}}',
 'recentchanges' => 'Senaste ändringarna',
 'recentchanges-legend' => 'Alternativ för senaste ändringarna',
-'recentchangestext' => 'Följ de senaste ändringarna i wikin på denna sida.',
+'recentchanges-summary' => 'Följ de senaste ändringarna i wikin på denna sida.',
 'recentchanges-feed-description' => 'Följ de senaste ändringarna i wikin genom den här matningen.',
 'recentchanges-label-newpage' => 'Denna redigering skapade en ny sida',
 'recentchanges-label-minor' => 'Detta är en mindre ändring',
@@ -1825,13 +1840,14 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 'backend-fail-closetemp' => 'Kunde inte stänga temporär fil.',
 'backend-fail-read' => 'Kunde inte läsa filen $1.',
 'backend-fail-create' => 'Kunde inte skapa filen $1.',
-'backend-fail-maxsize' => 'Kunde inte skapa filen $1, eftersom den är större än {{PLURAL:$2|$2|$2}} byte.',
+'backend-fail-maxsize' => 'Kunde inte skapa filen $1 eftersom den är större än {{PLURAL:$2|en byte|$2 bytes}}.',
 'backend-fail-readonly' => 'Lagringssystemet "$1" är för närvarande skrivskyddad. Den angivna anledningen är: "$2"',
 'backend-fail-synced' => 'Filen "$1" är i ett inkonsekvent tillstånd inom de interna lagringssystemen',
 'backend-fail-connect' => 'Kunde inte ansluta till lagringssystemet "$1".',
 'backend-fail-internal' => 'Ett okänt fel uppstod i lagringssystemet "$1".',
 'backend-fail-contenttype' => 'Kunde inte bestämma innehållstypen för filen att spara på "$1".',
 'backend-fail-batchsize' => 'Lagringssystemet gav en batch på $1 fil{{PLURAL:$1|operation|operationer}}; gränsen är $2 {{PLURAL:$2|operation|operationer}}.',
+'backend-fail-usable' => 'Kunde inte skriva filen $1 beroende på otillräckliga behörigheter eller saknade kataloger/containrar.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kunde inte ansluta till journaldatabasen för lagringssystemet "$1".',
@@ -2150,6 +2166,7 @@ Lägg märke till att andra webbplatser kan länka till en fil med en direkt URL
 Du kan avgränsa sökningen och få färre träffar genom att ange typ av logg, användarnamn (skiftlägeskänsligt), eller berörd sida (också skiftlägeskänsligt).',
 'logempty' => 'Inga matchande träffar i loggen.',
 'log-title-wildcard' => 'Sök efter sidtitlar som börjar med texten',
+'showhideselectedlogentries' => 'Visa/Dölj markerade loggposter',
 
 # Special:AllPages
 'allpages' => 'Alla sidor',
@@ -2169,6 +2186,11 @@ Du kan avgränsa sökningen och få färre träffar genom att ange typ av logg,
 'allpages-bad-ns' => 'Namnrymden "$1" finns inte på {{SITENAME}}.',
 'allpages-hide-redirects' => 'Göm omdirigeringar',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Du visar en cachad version av denna sida, som kan vara upp till $1 gammal.',
+'cachedspecial-viewing-cached-ts' => 'Du visar en cachad version av denna sida, som kanske inte är helt aktuell.',
+'cachedspecial-refresh-now' => 'Visa senaste.',
+
 # Special:Categories
 'categories' => 'Kategorier',
 'categoriespagetext' => 'Följande {{PLURAL:$1|kategori|kategorier}} innehåller sidor eller media.
@@ -2603,8 +2625,8 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
 'ipb-confirm' => 'Bekräfta blockering',
 'badipaddress' => 'Du har inte skrivit IP-adressen korrekt.',
 'blockipsuccesssub' => 'Blockeringen är utförd',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] har blockerats.
-<br />För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] har blockerats.<br />
+För att se alla aktuella blockeringar, gå till [[Special:BlockList|listan över blockeringar]].',
 'ipb-blockingself' => 'Du håller på att blockera dig själv! Är du säker på att du vill göra det?',
 'ipb-confirmhideuser' => 'Du är på väg att blockera en användare med "göm användare" aktiverat. Detta kommer upphäva användarens namn i alla listor och loggar. Är du säker på att du vill göra det?',
 'ipb-edit-dropdown' => 'Redigera blockeringsanledningar',
@@ -2659,7 +2681,7 @@ Undanhållandeloggen visas nedan för referens:',
 'reblock-logentry' => 'ändrade blockeringsinställningar för [[$1]] med en varaktighet på $2 $3',
 'blocklogtext' => 'Detta är en logg över blockeringar och avblockeringar.
 Automatiskt blockerade IP-adresser listas ej.
-I [[Special:BlockList|blockeringslistan]] listas alla IP-adresser och användare som är blockerade för närvarande.',
+Se [[Special:BlockList|blockeringslistan]] för en översikt av gällande blockeringar.',
 'unblocklogentry' => 'tog bort blockering av "$1"',
 'block-log-flags-anononly' => 'bara oinloggade',
 'block-log-flags-nocreate' => 'hindrar kontoregistrering',
@@ -3051,6 +3073,7 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'spambot_username' => 'MediaWikis spampatrull',
 'spam_reverting' => 'Återställer till den senaste versionen som inte innehåller länkar till $1',
 'spam_blanking' => 'Alla versioner innehöll en länk till $1, blankar',
+'spam_deleting' => 'Alla ändringar innehöll länkar till $1, raderar',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
@@ -3765,6 +3788,9 @@ 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',
 
 # Special:FilePath
 'filepath' => 'Sökväg till fil',
@@ -3953,4 +3979,17 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'api-error-uploaddisabled' => 'Uppladdning är inaktiverad på denna wiki.',
 'api-error-verification-error' => 'Denna fil kan vara skadad eller har fel filändelse.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund|sekunder}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minuter}}',
+'duration-hours' => '$1 {{PLURAL:$1|timme|timmar}}',
+'duration-days' => '$1 {{PLURAL:$1|dag|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|vecka|veckor}}',
+'duration-years' => '$1 {{PLURAL:$1|år|år}}',
+'duration-decades' => '$1 {{PLURAL:$1|decennium|decennier}}',
+'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Kunde inte erhålla lås på servern $1 .',
 );
index 82cf9cf..ac22a68 100644 (file)
@@ -15,6 +15,7 @@
  * @author Marcos
  * @author Muddyb Blast Producer
  * @author Robert Ullmann
+ * @author Stephenwanjau
  * @author לערי ריינהארט
  */
 
@@ -799,7 +800,7 @@ Kumbuka kwamba desturi ya kurasa za .css na .js hutumia herufi ndogo, yaani, {{n
 'updated' => '(Imesasishwa)',
 'note' => "'''Taarifa:'''",
 'previewnote' => "'''Hii ni hakikisho tu.''' 
-Mabadiliko hayajahifadhiwa bado! [[#editform|→ Endelea kuhariri]]",
+Mabadiliko hayajahifadhiwa bado!",
 'previewconflict' => 'Hakikisho hii inaonyesha maandiko yaliyopo sanduku la juu yataonekayo ukiyahifadhi.',
 'session_fail_preview' => "'''Pole! Hatukuweza kuhifadhi sahihisho lako kwa sababu data za kipindi zilipotelewa.'''
 Tafadhali jaribu tena.
@@ -1004,7 +1005,7 @@ Haliwezi kufichwa.',
 # Suppression log
 'suppressionlog' => 'Kumbukumbu za kuficha',
 'suppressionlogtext' => 'Hapo chini panaonyeshwa orodha ya matukio ya ufutaji na ya uzuio ambayo maelezo yao yamefichwa kutoka kwa wakabidhi.
-Tazama [[Special:BlockList|orodha ya uzuio wa IP]] kuona orodha ya zuio zilizopo sasa hivi.',
+Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio zilizopo sasa hivi.',
 
 # History merging
 'mergehistory' => 'Unganisha historia za kurasa',
@@ -1031,7 +1032,6 @@ Tazama [[Special:BlockList|orodha ya uzuio wa IP]] kuona orodha ya zuio zilizopo
 
 # Diffs
 'history-title' => 'Historia ya mapitio ya "$1"',
-'difference' => '(Tofauti baina ya mapitio)',
 'difference-multipage' => '(Tofauti kati ya kurasa)',
 'lineno' => 'Mstari $1:',
 'compareselectedversions' => 'Linganisha mapitio mawili uliyochagua',
@@ -1126,6 +1126,7 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 'datedefault' => 'Chaguo-msingi',
 'prefs-beta' => 'Zana za Beta',
 'prefs-datetime' => 'Tarehe na saa',
+'prefs-user-pages' => 'Kurasa za watumiaji',
 'prefs-personal' => 'Kuhusu mtumiaji',
 'prefs-rc' => 'Mabadiliko ya karibuni',
 'prefs-watchlist' => 'Maangalizi',
@@ -1251,7 +1252,7 @@ Taarifa hii itakuwa wazi.',
 'userrights-no-interwiki' => 'Huna ruhusa ya kuhariri haki za mtumiaji kwenye wiki zingine.',
 'userrights-nodatabase' => 'Hakuna hifadhidata inayoitwa $1 au haimo katiko jumuia hii ya wiki.',
 'userrights-nologin' => 'Lazima [[Special:UserLogin|uingie ndani]] ya akaunti ya mkabidhi ili kupanga haki za mtumiaji.',
-'userrights-notallowed' => 'Akaunti yako haina ruhusa ya kupanga haki za mtumiaji.',
+'userrights-notallowed' => 'Akaunti yako haina ruhusa ya kuongeza au kutoa haki za mtumiaji.',
 'userrights-changeable-col' => 'Makundi unayoweza kuyabadilisha',
 'userrights-unchangeable-col' => 'Makundi usiyoweza kuyabadilisha',
 
@@ -1314,7 +1315,7 @@ Taarifa hii itakuwa wazi.',
 'right-hideuser' => 'Kuzuia jina la mtumiaji, lisionekane mbele ya kadamnasi',
 'right-protect' => 'Badilisha viwango vya ulinzi na hariri kurasa zilizolindwa',
 'right-editinterface' => 'Kuhariri kusano ya mtumiaji',
-'right-editusercssjs' => 'Kuhariri mafaili ya CSS na JavaScript ya watumiaji wengine',
+'right-editusercssjs' => 'Hariri mafaili ya CSS na Hatijava ya watumiaji wengine',
 'right-editusercss' => 'Hariri mafaili ya CSS ya watumiaji wengine',
 'right-edituserjs' => 'Hariri mafaili ya JavaScript ya watumiaji wengine',
 'right-import' => 'Kuleta kurasa kutoka kwa wiki zingine',
@@ -1370,7 +1371,7 @@ Taarifa hii itakuwa wazi.',
 'nchanges' => '{{PLURAL:$1|badiliko|mabadiliko}} $1',
 'recentchanges' => 'Mabadiliko ya karibuni',
 'recentchanges-legend' => "Machaguo ya 'mabadaliko ya karibuni'",
-'recentchangestext' => 'Orodha ya mabadilisho yaliyofanywa katika {{SITENAME}} siku zilizopita.',
+'recentchanges-summary' => 'Orodha ya mabadilisho yaliyofanywa katika {{SITENAME}} siku zilizopita.',
 'recentchanges-feed-description' => 'Tumia tawanyiko hili kufuatilia mabadiliko yote ya hivi karibuni katika Wiki.',
 'recentchanges-label-newpage' => 'Ukurasa mpya ulianzishwa hapo',
 'recentchanges-label-minor' => 'Hili ni badiliko dogo',
@@ -1555,10 +1556,10 @@ Tatizo likiendelea, uwasiliane na [[Special:ListUsers/sysop|mkabidhi]].',
 # ZipDirectoryReader
 'zip-file-open-error' => 'Ilitokea hitilafu wakati wa kufungua faili kwa ajili ya ukaguzi wa ZIP.',
 'zip-wrong-format' => 'Faili lililotajwa si faili la ZIP.',
-'zip-bad' => 'Faili ZIP hili limevurugika ama halisomeka.
-Haliwezi kugakuliwa ili kukinga usalama.',
-'zip-unsupported' => 'Faili ZIP hili linatumia bidhaa pepe ya ZIP zisizoeleweka na MediaWiki.
-Haliwezi kugakuliwa ili kukinga usalama.',
+'zip-bad' => 'Faili hili la ZIP limevurugika ama haliwezikusomeka.
+Haliwezi kukaguliwa vilivyo kwa sababu za kiusalama.',
+'zip-unsupported' => 'Faili hili la ZIP ambalo linatumia vipengele ambavyo haviungwi mkono na MediaWiki.
+Haliwezi kukaguliwa vilivyo kwa sababu za kiusalama.',
 
 # Special:UploadStash
 'uploadstash-refresh' => 'Zimua orodha ya mafaili',
@@ -1677,7 +1678,7 @@ Pengine ungependa kuhariri maelezo yaliyopo katika [$2 ukurasa wa maelezo ya fai
 ** Faili la nakili',
 'filedelete-edit-reasonlist' => 'Kuhariri orodha ya sababu za kufuta',
 'filedelete-maintenance' => 'Tovuti inarekebishwa. Kwa muda huo kufuta na kurudisha mafaili haiwezikani.',
-'filedelete-maintenance-title' => 'Faili hilifutiki',
+'filedelete-maintenance-title' => 'Faili halifutiki',
 
 # MIME search
 'mimesearch' => 'Utafutaji wa MIME',
@@ -1720,14 +1721,14 @@ Kumbuka kuhakikisha kwamba hakuna viungo vingine vinavyoelekea kigezo fulani kab
 'statistics-edits' => 'Kurasa zilizohaririwa tangu {{SITENAME}} ilivyoanzishwa',
 'statistics-edits-average' => 'Wastani wa uhariri kwa kurasa',
 'statistics-views-total' => 'Jumla ya mitazamaji',
-'statistics-views-total-desc' => 'Ziara za kurasa zisizopatikana na kurasa maalum hazihesabiwi',
+'statistics-views-total-desc' => 'Tazamo za kurasa zisizokuwepo na kurasa maalumu hazionikani.',
 'statistics-views-peredit' => 'Mitazamaji kwa haririo',
 'statistics-users' => '[[Special:ListUsers|Watumiaji]] waliojisajiri',
 'statistics-users-active' => 'Watumiaji wanaofanya kazi',
 'statistics-users-active-desc' => 'Watumiaji waliofanya kazi katika siku {{PLURAL:$1|iliyopita|$1 zilizopita}}',
 'statistics-mostpopular' => 'Kurasa zinazotazamwa sana',
 
-'disambiguations' => 'Kurasa za kuainisha maneno',
+'disambiguations' => 'Kurasa zinazoungana na kurasa za uanishaji',
 'disambiguationspage' => 'Template:Maana',
 'disambiguations-text' => "Kurasa zinazofuata zina viungo vinavyoelekea '''kurasa ya kutofautishana maana'''.
 Ni afadhali kiungo kiende makala inayostahili moja kwa moja.<br />
@@ -1737,8 +1738,8 @@ Kurasa za kutofautishana maana ni zile zinazotumia kigezo kinachoorodheshwa kati
 'doubleredirectstext' => 'Ukurasa huu unaorodhesha kurasa zinazoelekeza kurasa zingine za kuelekeza.
 Katika kila mstari kuna viungo vinavyokwenda katika kurasa za kuelekeza zote mbili, pamoja na ukurasa wa mwishilio mwa elekezo la pili. Ukurasa huu wa mwishilio huwa ni ukurasa unaostahili kuelekezwa kutoka kwa ukurasa wa kuelekeza wa kwanza. Vitu <del>vilivyokatwa kwa mstari</del> vimeshatatuliwa.',
 'double-redirect-fixed-move' => '[[$1]] umehamishwa.
-Sasa unaelekeza [[$2]].',
-'double-redirect-fixed-maintenance' => 'Elekezo maradufu inarekebishwa toka [[$1]] kwenda [[$2]].',
+Sasa unaelekeza kwa [[$2]].',
+'double-redirect-fixed-maintenance' => 'Elekezo maradufu inarekebishwa kutoka [[$1]] kwenda [[$2]].',
 'double-redirect-fixer' => 'Boti ya kurekebisha maelekezo',
 
 'brokenredirects' => 'Maelekezo yenye hitilafu',
@@ -1773,7 +1774,7 @@ Sasa unaelekeza [[$2]].',
 'popularpages' => 'Kurasa zinazopendelewa',
 'wantedcategories' => 'Jamii zinazotakiwa',
 'wantedpages' => 'Kurasa zinazotakiwa',
-'wantedpages-badtitle' => 'Lipo jina batili katika matokeo: $1',
+'wantedpages-badtitle' => 'Kichwa batili katika seti ya matokeo: $1',
 'wantedfiles' => 'Mafaili yanayokosekana',
 'wantedtemplates' => 'Vigezo vinavyotakiwa',
 'mostlinked' => 'Kurasa zinazoungwa kuliko zote',
@@ -1788,11 +1789,13 @@ Sasa unaelekeza [[$2]].',
 'deadendpages' => 'Kurasa ambazo haziungi na ukurasa mwingine wowote',
 'deadendpagestext' => 'Kurasa zifuatazo haziungana na kurasa zingine katika {{SITENAME}}.',
 'protectedpages' => 'Kurasa zinazolindwa',
-'protectedpages-indef' => 'Zinazolindwa kwa muda wote tu',
+'protectedpages-indef' => 'Ulinzi kwa muda usiojulikana tu',
 'protectedpages-cascade' => 'zinazokuwa na ulindaji kwa kurasa chini zake tu',
-'protectedpagestext' => 'Kurasa zifuatazo zinalindwa zisisogezwe wala zisihaririwe',
+'protectedpagestext' => 'Kurasa zifuatazo zinalindwa zisisogezwe wala kuhaririwa',
+'protectedpagesempty' => 'Hakuna kurasa zinazolindwa kwa sasa kwa vigezo hivi.',
 'protectedtitles' => 'Majina yanayozuluiwa',
 'protectedtitlestext' => 'Yafuatayo ni majina ya kurasa yanayozuluiwa kuyatumia',
+'protectedtitlesempty' => 'Hakuna vichwa vinavyolindwa kwa vigezo hivi kwa sasa.',
 'listusers' => 'Orodha ya Watumiaji',
 'listusers-editsonly' => 'Onyesha watumiaji wenye kuhariri tu',
 'listusers-creationsort' => 'Panga kwa tarehe ya kuanzishwa',
@@ -1803,7 +1806,8 @@ Sasa unaelekeza [[$2]].',
 'ancientpages' => 'Kurasa za kale',
 'move' => 'Hamisha',
 'movethispage' => 'Hamisha ukurasa huu',
-'unusedcategoriestext' => 'Kurasa za jamii zifuatazo zinapatikana, ingawaje hakuna ukurasa wala jamii nyingine iliyowekwa ndani ya jamii hizi.',
+'unusedcategoriestext' => 'Kurasa za jamii zifuatazo zinapatikana, ingawaje hakuna ukurasa wala jamii nyingine inayotumia kurasa hizi.',
+'notargettitle' => 'Hakuna lengo',
 'pager-newer-n' => '{{PLURAL:$1|1 ya karibu zaidi|$1 ya karibu zaidi}}',
 'pager-older-n' => '{{PLURAL:$1|$1 ya zamani zaidi}}',
 
@@ -1862,7 +1866,8 @@ Tazama pia [[Special:WantedCategories|jamii zinazohitajika]].',
 'linksearch-ns' => 'Eneo la wiki:',
 'linksearch-ok' => 'Tafuta',
 'linksearch-text' => 'Alama maalum za kutafuta kama "*.wikipedia.org" zinaweza kutumika.<br />
-Itifaki zinazoungwa mkono: <tt>$1</tt>',
+Kikoa cha kiwango cha juu inahitajika, kwa mfano "*.org".<br />
+Itifaki zinazoungwa mkono: <tt>$1</tt> (usiongeza hizi unapotafuta).',
 'linksearch-line' => '$2 umeungwa kutoka $1',
 'linksearch-error' => 'Alama maalum za kutafuta zinaweza kutumika mwanzoni mwa URL tu.',
 
index fd0783d..7da09d3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Silesian (Å\9alůnski)
+/** Silesian (Å\9blůnski)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 
 $fallback = 'pl';
 
+$namespaceNames = array(
+       NS_SPECIAL        => 'Szpecyjalna',
+       NS_TALK           => 'Dyskusyjo',
+       NS_USER           => 'Używacz',
+       NS_USER_TALK      => 'Dyskusyjo_używacza',
+       NS_PROJECT_TALK   => 'Dyskusyjo_$1',
+       NS_FILE           => 'Plik',
+       NS_FILE_TALK      => 'Dyskusyjo_plika',
+       NS_MEDIAWIKI      => 'MediaWiki',
+       NS_MEDIAWIKI_TALK => 'Dyskusyjo_MediaWiki',
+       NS_TEMPLATE       => 'Muster',
+       NS_TEMPLATE_TALK  => 'Dyskusyjo_mustra',
+       NS_HELP           => 'Půmoc',
+       NS_HELP_TALK      => 'Dyskusyjo_půmocy',
+       NS_CATEGORY       => 'Kategoryjo',
+       NS_CATEGORY_TALK  => 'Dyskusyjo_kategoryji',
+);
+
+$namespaceAliases = array(
+       // Aliases for Polish namespaces (bug 34988).
+       'Specjalna'            => NS_SPECIAL,
+       'Dyskusja'             => NS_TALK,
+       'Użytkownik'           => NS_USER,
+       'Dyskusja_użytkownika' => NS_USER_TALK,
+       'Dyskusja_$1'          => NS_PROJECT_TALK,
+       'Dyskusja_pliku'       => NS_FILE_TALK,
+       'Dyskusja_MediaWiki'   => NS_MEDIAWIKI_TALK,
+       'Szablon'              => NS_TEMPLATE,
+       'Dyskusja_szablonu'    => NS_TEMPLATE_TALK,
+       'Pomoc'                => NS_HELP,
+       'Dyskusja_pomocy'      => NS_HELP_TALK,
+       'Kategoria'            => NS_CATEGORY,
+       'Dyskusja_kategorii'   => NS_CATEGORY_TALK,
+);
+
+// Remove Polish gender aliases
+$namespaceGenderAliases = array();
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podsztrychńyńcy linkůw:',
@@ -373,19 +411,22 @@ Eli tak ńy je, możno śe trefił feler we softwaru MediaWiki. Kej ja, pedz uo
 'formerror' => 'Feler: ńy idźe wysuać formulařa',
 'badarticleerror' => 'Tyj uoperacyje ńy idźe zrobić lo tyj zajty.',
 'cannotdelete' => 'Ńy idźe wyćepać podanyj zajty abo grafiki $1.',
+'cannotdelete-title' => 'Ńy idźie wyćepać zajty "$1".',
 'badtitle' => 'Felerno tytůua',
 'badtitletext' => 'Podano felerny titel zajty. Prawdopodańy sům w ńim znoki, kerych ńy wolno užywać we titlach abo je pusty.',
-'perfcached' => 'To co sam je naškryflane, to ino kopja s pamjyńći podrynčnyj a može ńy być aktualne. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'To co sam je naškryflane, to ino kopja s pamjyńći podrynčnyj a bůuo uaktualńůne $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a może ńy być aktualne. Nojwjyncyj {{PLURAL:$1|jydyn wynik je|$1 wyniki sům}} w tyj pamjyńći.',
+'perfcachedts' => 'To co sam je naszkryflane, to ino kopja s pamjyńći podryncznyj a bůło uaktualńůne $1. Nojwjyncyj {{PLURAL:$4|jeden wynik je|$4 wyniki sům}} dostympne.',
 'querypage-no-updates' => 'Uaktualńyńo lo tyj zajty sům terozki zawarte. Dane, kere sam sům, ńy zostouy uodśwjyžůne.',
 'wrong_wfQuery_params' => 'Felerne parametry překozane do wfQuery()<br />
 Funkcyjo: $1<br />
 Zapytańy: $2',
 'viewsource' => 'Zdrzůdłowy tekst',
+'viewsource-title' => 'Uobocz zdrzůdło lo $1',
 'actionthrottled' => 'Akcyjo wstřimano',
 'actionthrottledtext' => 'Mechańizm uobrůny před spamym uograńičo ličba wykonań tyj čynnośći we jednostce času. Průbowoužeś go uocygańić. Proša, sprůbuj na nowo za pora minut.',
 'protectedpagetext' => 'Ta zajta je zawarto před sprowjańym.',
 'viewsourcetext' => 'We tekst zdřůduowy tyj zajty možno dali filować, idźe go tyž kopjować.',
+'viewyourtext' => 'We tekst zdrzůduowy tyj zajty możno dali filować, idźe go tyż kopjować.',
 'protectedinterface' => 'Na tyj zajće znojduje śe tekst interfejsu uoprogramowańo, bestož uůna je zawarto uod sprowjańo.',
 'editinginterface' => "''''Dej pozůr:''' Sprowjosz zajta, na keryj je tekst interfejsu uoprogramowańo. Pomjyńyńa na tyj zajće zmjyńům wyglůnd interfejsu lo inkšych užytkowńikůw.",
 'sqlhidden' => '(schowano zapytańy SQL)',
@@ -397,6 +438,10 @@ $2',
 'ns-specialprotected' => 'Ńy idźe sprowjać zajtůw we přestřyni mjan {{ns:special}}.',
 'titleprotected' => "Wćepańy sam zajty uo takim mjańe zawar [[User:$1|$1]].
 Powůd zawarćo: ''$2''.",
+'filereadonlyerror' => 'Ńy idźe pomjyńać plika "$1" abo repozytorjum "$2" terozki je zawarte.
+
+Administrator kery zawarł wćepał kůmyntorz: "$3".',
+'invalidtitle-knownnamespace' => 'Felerne mjano "$3" w przestrzeńy "$2".',
 
 # Virus scanner
 'virus-badscanner' => "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''",
@@ -411,8 +456,8 @@ Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co jež
 'welcomecreation' => '== Witej, $1! ==
 Uotwarli my sam lo Ćebje kůnto.
 Ńy zapomńij poštalować [[Special:Preferences|preferencyji lo {{GRAMMAR:D.lp|{{SITENAME}}}}]].',
-'yourname' => 'Mjano užytkowńika:',
-'yourpassword' => 'Hasuo:',
+'yourname' => 'Mjano użytkowńika:',
+'yourpassword' => 'Hasło:',
 'yourpasswordagain' => 'Naszkryflej ausdruk zaś',
 'remembermypassword' => 'Pamjyntej můj ausdruk na tym kůmputrze (nojdalij bez $1 {{PLURAL:$1|dźyń|dńůw}})',
 'securelogin-stick-https' => 'Po zalogowańy mjyj połonczenie bez HTTPS',
@@ -420,15 +465,15 @@ Uotwarli my sam lo Ćebje kůnto.
 'externaldberror' => 'Je jaki feler we zewnyntřnyj baźe autentyfikacyjnyj, abo ńy moš uprawńyń potřebnych do aktualizacyji zewnyntřnego kůnta.',
 'login' => 'Zaloguj śe',
 'nav-login-createaccount' => 'Logowańy / tworzińy kůnta',
-'loginprompt' => 'Muśiš mjeć zouůnčůne cookies coby můc śe sam zalůgować.',
-'userlogin' => 'Lůgowańy / Twořyńy kůnta',
+'loginprompt' => 'Muśisz mjeć zołůnczůne cookies coby můc śe sam zalůgować.',
+'userlogin' => 'Lůgowańy / Tworzyńy kůnta',
 'userloginnocreate' => 'Zalůguj śe',
 'logout' => 'Wyloguj',
 'userlogout' => 'Uodloguj śe',
 'notloggedin' => 'Ńy ježeś zalůgowany',
-'nologin' => "Ńy moš kůnta? '''$1'''.",
-'nologinlink' => 'Twůř kůnto',
-'createaccount' => 'Zouůž nowe kůnto',
+'nologin' => "Ńy mosz kůnta? '''$1'''.",
+'nologinlink' => 'Twůrz kůnto',
+'createaccount' => 'Twůrz nowe kůnto',
 'gotaccount' => "Mosz już kůnto? '''$1'''.",
 'gotaccountlink' => 'Naloguj śe',
 'userlogin-resetlink' => 'Zapomńoł żeś dane lo nalogowańo?',
@@ -438,24 +483,24 @@ Uotwarli my sam lo Ćebje kůnto.
 'userexists' => 'Mjano użytkowńika, kere żeś wybroł, je zajynte. Wybjer, prosza, inksze mjano.',
 'loginerror' => 'Feler při logůwańu',
 'createaccounterror' => 'Ńy możno stworzić konta $1',
-'nocookiesnew' => 'Kůnto užytkowÅ\84ika zostouo utwoÅ\99ůne, nale Å\84y ježeÅ\9b zalůgowany. {{SITENAME}} užywo Ä\87osteÄ\8dek do logůwaÅ\84o. MoÅ¡ wyuůnÄ\8done Ä\87osteÄ\8dka. Coby Å\9be zalůgowaÄ\87, uodymknij Ä\87osteÄ\8dka a podej mjano a hasuo swojigo kůnta.',
+'nocookiesnew' => 'Kůnto użytkowÅ\84ika zostoÅ\82o utworzůne, nale Å\84y jeżeÅ\9b zalůgowany. {{SITENAME}} używo Ä\87osteczek do logůwaÅ\84o. Mosz wyÅ\82ůnczone Ä\87osteczka. Coby Å\9be zalůgowaÄ\87, uodymknij Ä\87osteczka a podej mjano a hasÅ\82o swojigo kůnta.',
 'nocookieslogin' => '{{SITENAME}} užywo ćosteček do lůgowańo užytkowńikůw. Moš zablokowano jejich uobsuůga. Sprůbuj zaś jak zauůnčyš uobsuůga ćosteček.',
 'nocookiesfornew' => 'Konto sprowjorza ńy uostoło stworzone. Sprawdź, cze mosz uodymkńynto obsługe cookies.',
-'noname' => 'To Å\84y je půprowne mjano užytkowńika.',
+'noname' => 'To Å\84y je půprowne mjano użytkowńika.',
 'loginsuccesstitle' => 'Lůgowańy udane',
 'loginsuccess' => "'''Terozki ježeś zalůgowany do {{SITENAME}} jako \"\$1\".'''",
 'nosuchuser' => 'Ńy ma sam użytkowńika uo mjańe "$1".
 Sprowdź szrajbůng, abo [[Special:UserLogin/signup|utwůrz nowe kůnto]].',
 'nosuchusershort' => 'Ńy mo sam užytkowńika uo mjańe "$1".',
-'nouserspecified' => 'Podej mjano užytkowńika.',
+'nouserspecified' => 'Podej mjano użytkowńika.',
 'login-userblocked' => 'Tyn sprowjorz ma zawrzite sprowjyńa. Ńy możno sie zalgować.',
-'wrongpassword' => 'Hasuo kere žeś naškryflou je felerne. Poprůbůj naškryflać je ješče roz.',
+'wrongpassword' => 'Hasło kere żeś naszkryfloł je felerne. Poprůbůj naszkryflać je jeszcze roz.',
 'wrongpasswordempty' => 'Hasuo kere žeś podou je puste. Naškryflej je ješče roz.',
 'passwordtooshort' => 'Hasło kere żeś podoł je felerne abo za krůtke.
 Hasło muśi mjeć przinojmńij {{PLURAL:$1|1 buchsztaba|$1 buchsztabůw}} a być inksze od mjana użytkowńika.',
 'password-name-match' => 'Hasło musi być inne niż nazwa użytkownika.',
 'password-login-forbidden' => 'Ńy wolno mjyć takij nazwy a hasua.',
-'mailmypassword' => 'Wyślij mi nowe hasuo bez e-brif',
+'mailmypassword' => 'Wyślij mi nowe hasło bez e-brif',
 'passwordremindertitle' => 'Nowe tymčasowe hasuo dla {{SITENAME}}',
 'passwordremindertext' => 'Ftůś (cheba Ty, s IP $1)
 pado, aże chce nowe hasło do {{SITENAME}} ($4).
@@ -481,10 +526,11 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
 'emailconfirmlink' => 'Potwjerdź swůj adres e-brifa',
 'invalidemailaddress' => 'E-brif ńy bydźe zaakceptůwany skiž tygo co jego format ńy speuńo formalnych wymagań. Proša naškryflać poprowny adres e-brifa abo wyčyśćić pole.',
 'cannotchangeemail' => 'Ńy możno pomjyńyc ausdruku e-mail.',
+'emaildisabled' => 'Ta zajta ńy je mogebna posyłać e-brify.',
 'accountcreated' => 'Utwůřůno kůnto',
 'accountcreatedtext' => 'Kůnto lo $1 zostouo utwůřůne.',
 'createaccount-title' => 'Stwořyńy kůnta na {{GRAMMAR:MS.lp|{{SITENAME}}}}',
-'createaccount-text' => 'Ktoś utwořiu na {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4) dla Twojego adresa e-brif kůnto "$2". Aktualne hasuo to "$3". Powińežeś śe terozki zalogůwać a je zmjyńić.',
+'createaccount-text' => 'Ktoś utworził na {{GRAMMAR:MS.lp|{{SITENAME}}}} ($4) dla Twojego adresa e-brif kůnto "$2". Aktualne hasło to "$3". Powińeżeś śe terozki zalogůwać a je zmjyńić.',
 'usernamehasherror' => 'Nazwa sprowjorza ńy może mjyć buchsztaby "#".',
 'login-throttled' => '!Wykonołżeś za wjela průb zalůgowańo śe na te kůnto. Poczekej chwila ńym zaś sprůbujesz.',
 'login-abort-generic' => 'Felerne logowańe',
@@ -499,9 +545,9 @@ Coby powstřimać nadužyća, možliwość wysyuańa připůmńeń naštalowano
 'resetpass' => 'Zmjyń hasło',
 'resetpass_announce' => 'Zalůgowoužeś śe s tymčasowym kodym uotřimanym bez e-brif. Coby zakůńčyć proces logůwańo muśiš naštalować nowe hasuo:',
 'resetpass_header' => 'Zmjyń hasło lů swojygo kůnta',
-'oldpassword' => 'Stare hasuo',
-'newpassword' => 'Nowe hasuo',
-'retypenew' => 'Naškryflej ješče roz nowe hasuo:',
+'oldpassword' => 'Stare hasło',
+'newpassword' => 'Nowe hasło',
+'retypenew' => 'Naszkryflej jeszcze roz nowe hasło:',
 'resetpass_submit' => 'Naštaluj hasuo a zalůguj',
 'resetpass_success' => 'Twoje hasuo zostouo půmyślńy pomjyńone! Trwo logůwańe...',
 'resetpass_forbidden' => 'Ńy idźe sam půmjyńyć hasuůw.',
@@ -627,8 +673,8 @@ Hasło można pomjyńyć [[Special:ChangePassword|tu]].',
 'newarticle' => '(Nowy)',
 'newarticletext' => 'Ńy mo sam jeszcze artikla uo takijj titli. Eli chcesz go sprowjać, naszkryflej niżyj jego tekst (wjyncy informacyj nojdźesz [[{{MediaWiki:Helppage}}|na zajće půmocy]]). Eli żeś chćoł zrobić cosik inksze, naćiś ino knefel "Nazod".',
 'anontalkpagetext' => "---- ''To je zajta godki lo anůnimowych używoczy  - takich, kerzi ńy majům jeszcze swojigo kůnta abo ńy chcům go terozki używać.
-By jeich idyntyfikować, używomy numerůw IP.
-Eli jeżeś anůnimowym używoczym a wydowo Ći śe, aże zamjyszczůne sam kůmyntorze ńy sům skjyrowane do Ćebje, [[Special:UserLogin|utwůrz prosza kůnto]] abo [[Special:UserLogin|zalůguj śe]] - bez tůż uńikńesz potym podobnych ńyporozumjyń.''",
+By jejich idyntyfikować, używomy numerůw IP.
+Eli jeżeś anůnimowym używoczym a wydowo Ći śe, aże zamjyszczůne sam kůmyntorze ńy sům skjyrowane do Ćebje, [[Special:UserLogin|utwůrz prosza kůnto]] abo [[Special:UserLogin|zalůguj śe]] - beztůż uńikńesz potym podobnych ńyporozumjyń.''",
 'noarticletext' => 'Ńy můmy zajta uo takij titli. Mogesz [{{fullurl:{{FULLPAGENAME}}|action=edit}} wćepać artikel {{FULLPAGENAME}}] abo [[Special:Search/{{PAGENAME}}|sznupać {{PAGENAME}} we inkszych]].',
 'noarticletext-nopermission' => 'Na tyj zajće ńy mo jeszcze artikla.
 Mogesz [[Special:Search/{{PAGENAME}}|wysznupać ta titla]] we treśći inkszych zajtůw
@@ -648,7 +694,8 @@ abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 'userinvalidcssjstitle' => "'''Pozůr:''' Ńy mo skůrki uo mjańe \"\$1\". Pamjyntej, aže zajty užytkowńika zawjyrajůnce CSS i JavaScript powinny začynać śe mouům buchštabům, np. {{ns:user}}:Foo/vector.css.",
 'updated' => '(Pomjyńano)',
 'note' => "'''Pozůr:'''",
-'previewnote' => "'''To je ino podglůnd - artikel ješče ńy je naškryflany!'''",
+'previewnote' => "'''To je ino podglůnd - artikel jeszcze ńy je spamjyntany!'''",
+'continue-editing' => 'Sprowjej dalej',
 'previewconflict' => 'Wersyjo podglůndano uodnośi śe do tekstu s pola edycyje na wjyrchu. Tak bydźe wyglůndać zajta jeli zdecyduješ śe jům naškryflać.',
 'session_fail_preview' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji. Sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe i zalogůj uod nowa.'''",
 'session_fail_preview_html' => "'''Přeprašomy! Serwer ńy može přetwořyć tygo sprowjyńo skuli utraty danych ze sesyji.'''
@@ -658,8 +705,9 @@ abo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}
 '''Jeli to je prawiduowo průba sprowjańo, sprůbuj ješče roz. Kejby to ńy pomoguo - wylůguj śe a zalůguj na nowo.'''",
 'token_suffix_mismatch' => "'''Twoje sprowjyńy zostouo uodćepńynte skuli tego, co twůj klijynt pomjyšou znaki uod interpůnkcyji w žetůńe sprowjyń. Twoje sprowjyńy zostouo uodćepńynte coby zapobjec zńyščyńu tekstu zajty. Take průblymy zdořajům śe w roźe kůřistańo s felernych anůnimowych śećowych usuůg proxy.'''",
 'editing' => 'Sprowjosz $1',
+'creating' => 'Tworzyńy $1',
 'editingsection' => 'Sprowjosz $1 (sekcyjo)',
-'editingcomment' => 'Sprowjosz "$1" (kůmyntorz)',
+'editingcomment' => 'Sprowjosz "$1" (nowy kůmyntorz)',
 'editconflict' => 'Kůnflikt sprowjyń: $1',
 'explainconflict' => "Ktoś zdůnžyu wćepać swoja wersyjo artikla ńim žeś naškryflou sprowjyńy.
 We polu edycyji na wjyrchu moš tekst zajty aktůalńy naškryflany w baźe danych.
@@ -676,17 +724,20 @@ By wćepać swoje pomjyńańo muśiš pomjyńać tekst w polu na wjyrchu.
 'copyrightwarning2' => "Pamjyntej uo tym, aže couki wkuod do {{GRAMMAR:MS.lp|{{SITENAME}}}} može być sprowjany, pomjyńany abo wyćepany bez inkšych užytkownikůw. Jak ńy chceš, coby koždy můg go zmjyńać i dali rozpowšychńać bez uograničyń, ńy wćepuj go sam.<br />
 Škryflajůnc sam tukej pośwjadčoš tyž, co te pisańy je twoje wuasne, abo žeś go wźůn(a) s matyrjouůw kere sům na public domain, abo kůmpatybilne (kuknij tyž: $1).
 '''PROŠA ŃY WĆEPYWAĆ SAM MATYRJOUŮW KERE SŮM CHRŮŃONE PRAWYM AUTORSKIM BEZ DOZWOLEŃO WUAŚĆIĆELA!'''",
-'longpageerror' => "'''Feler: Tekst kery Å¾eÅ\9b sam wÄ\87epywou mo $1 kilobajtůw. Maksymalno dugoÅ\9bÄ\87 tekstu Å\84y može byÄ\87 wjynkÅ¡o kej $2 kilobajtůw. Twůj tekst Å\84y bydźe sam naÅ¡kryflany.'''",
+'longpageerror' => "'''Feler: Tekst kery Å¼eÅ\9b sam wÄ\87epywoÅ\82 mo $1 kilobajtůw. Maksymalno dugoÅ\9bÄ\87 tekstu Å\84y może byÄ\87 wjynkszo kej $2 kilobajtůw. Twůj tekst Å\84y bydźe sam naszkryflany.'''",
 'readonlywarning' => "'''Dej pozůr: Baza danych zostoua filowo zawarto skuli potřeb admińistracyjnych. Bestůž ńy do śe terozki naškryflać Twojich pomjyńań. Radzymy přećepać nowy tekst kajś do plika tekstowego (wytnij/wklej) a wćepać sam zaś po uodymkńyńću bazy.'''
 
 Admińistrator kery zawar baza dou take wyjaśńyńe: $1",
-'protectedpagewarning' => "'''Dej pozůr: Sprowjańe tyj zajty zostouo zawarte. Mogům jům sprowjać ino užytkowńicy s uprawńyńami admińistratora.'''",
-'semiprotectedpagewarning' => "'''Pozůr:''' Ta zajta zostoua zawarto a ino zaregišterowani užytkownicy mogům jům sprowjać.",
+'protectedpagewarning' => "'''Dej pozůr: Sprowjańe tyj zajty zostoło zawarte. Mogům jům sprowjać ino użytkowńicy s uprawńyńami admińistratora.'''
+Uostatńy wpis w rejerze je poniżej.",
+'semiprotectedpagewarning' => "'''Pozůr:''' Ta zajta zostoła zawarto a ino zaregiszterowani użytkownicy mogům jům sprowjać.
+Uostotńy wpis w rejerze je ńyżej.",
 'cascadeprotectedwarning' => "'''Dej pozůr:''' Ta zajta zostoua zawarto a ino užytkowńicy s uprawńyńami admińistratora mogům jům sprowjać. Zajta ta je podpjynto pod {{PLURAL:$1|nastympujůnco zajta, kero zostoua zawarto|nastympujůncych zajtach, kere zostouy zawarte}} ze zauůnčonům opcjům dźedźičyńo:",
-'titleprotectedwarning' => "'''DEJ POZŮR: Zajta uo tym titlu zostoua zawarto a ino ńykeři užytkowńicy mogům jům wćepać.'''",
+'titleprotectedwarning' => "'''Dej pozůr: Zajta uo tym titlu zostoła zawarto a ino [[Special:ListGroupRights|ńykerzi użytkowńicy]] mogům jům wćepać.'''
+Uostatńy wpis z rejera je ńyżej.",
 'templatesused' => '{{PLURAL:$1|Szablon|Szablůny}} użyte na tyj zajće:',
-'templatesusedpreview' => 'Šablůny užyte we tym podglůńdźe:',
-'templatesusedsection' => 'Šablůny užyte w tyj tajli:',
+'templatesusedpreview' => '{{PLURAL:$1|Szablon|Szablůny}} użyte na tyj zajće:',
+'templatesusedsection' => '{{PLURAL:$1|Szablon|Szablůny}} użyte w tyj tajli:',
 'template-protected' => '(zawrzity uod sprowjańo)',
 'template-semiprotected' => '(tajlowo zawarte)',
 'hiddencategories' => 'Ta zajta je {{PLURAL:$1|w jednyj schrůńunyj katygoryji|we $1 schrůńunych katygoryjach}}:',
@@ -694,6 +745,8 @@ Admińistrator kery zawar baza dou take wyjaśńyńe: $1",
 'nocreatetext' => 'Na {{GRAMMAR:MS.lp|{{SITENAME}}}} twořyńy nowych zajtůw uograńičůno.
 Možeš sprowjać te co juž sům, abo [[Special:UserLogin|zalogować śe, abo zauožyć konto]].',
 'nocreate-loggedin' => 'Ńy moš uprowńyń do twořyńo nowych zajtůw.',
+'sectioneditnotsupported-title' => 'Sprowjańy tajli ńymogebne',
+'sectioneditnotsupported-text' => 'Sprowjańy tajli ńymogebne na tyj zajće.',
 'permissionserrors' => 'Felerne uprowńyńa',
 'permissionserrorstext' => 'Ńy moš uprowńyń do takij akcyje {{PLURAL:$1|skuli tego, co:|bestůž, co:}}',
 'permissionserrorstext-withaction' => 'Ńy mogesz $2, ze {{PLURAL:$1|takigo powodu|takich powodůw}}:',
@@ -711,6 +764,7 @@ Zdowo śe, co zostoua wyćepano.',
 'edit-no-change' => 'Twoje sprowjyńe uostouo zignorowane pů takymu, co ńic žeś we tekśće ńy zmjyńiu.',
 'edit-already-exists' => 'Ńy idźe utwořić nowyj zajty.
 Tako zajta juž sam je.',
+'defaultmessagetext' => 'Tekst důmyślny',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Dej pozůr: ta zajta mo za dužo uodwouań do funkcyji parsera, kere mocno uobćůnžajům systym.
@@ -733,7 +787,7 @@ Powinno być myńi jak $2 {{PLURAL:$2|wywouańy|wywouańo|wywouań}}, a terozki
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ńy idźe utwořić kůnta',
-'cantcreateaccount-text' => "Twořyńy kůnta s tygo adresu IP ('''$1''') zostouo zawarte bez užytkowńika [[User:$3|$3]].
+'cantcreateaccount-text' => "Tworzyńy kůnta s tygo adresu IP ('''$1''') zostoło zawarte bez użytkowńika [[User:$3|$3]].
 
 Skuli: ''$2''",
 
@@ -778,9 +832,12 @@ Možeš tyž [[Special:Search|šnupać]] za tům zajtům.',
 Atoli kej admińistrator {{GRAMMAR:MS.lp|{{SITENAME}}}} možeš jům uobejřeć.
 Powody wyćepańo idźe znejść we [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejeře wyćepań]',
 'rev-delundel' => 'ukoż/schrůń',
+'rev-showdeleted' => 'ukoż',
 'revisiondelete' => 'Wyćep/wćep nazod wersyje',
 'revdelete-nooldid-title' => 'Ńy wybrano wersyji',
 'revdelete-nooldid-text' => 'Ńy wybrano wersyji na kerych mo zostać wykůnano ta uoperacyjo.',
+'revdelete-no-file' => 'Ńy mo tygo plika.',
+'revdelete-show-file-confirm' => 'Jeżeś echt pewny co chcesz uobejzdrzeć wyćepano wersyjo plika „<nowiki>$1</nowiki>” s $2 $3?',
 'revdelete-show-file-submit' => 'Ja',
 'revdelete-selected' => "'''{{PLURAL:$2|Wybrano wersyja|Wybrane wersyje}} zajty [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Wybrane zdařyńy s rejeru|Wybrane zdařyńa s rejeru}}:'''",
@@ -792,7 +849,7 @@ Inkśi admińistratorzi {{GRAMMAR:D.lp|{{SITENAME}}}} dali bydům mjeć dostymp
 'revdelete-hide-image' => 'Schrůń zawartość plika',
 'revdelete-hide-name' => 'Schrůń akcyjo a cyl',
 'revdelete-hide-comment' => 'Schrůń kůmyntoř sprowjyńo',
-'revdelete-hide-user' => 'SchrůÅ\84 mjano užytkowńika/adres IP',
+'revdelete-hide-user' => 'SchrůÅ\84 mjano użytkowńika/adres IP',
 'revdelete-hide-restricted' => 'Schrůń informacyje zarůwno przed admińistratorůma jak i przed inkszymi',
 'revdelete-radio-same' => '(byz pomjyń)',
 'revdelete-radio-set' => 'Ja',
@@ -829,7 +886,7 @@ $1',
 
 # Suppression log
 'suppressionlog' => 'Log schrůńyńć',
-'suppressionlogtext' => 'Půńiżyj je lista nojnowszych wyćepań i zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przřejrzeć lista aktualnych banůw i zawarć, uobezdrzij [[Special:BlockList|IP block list]].',
+'suppressionlogtext' => 'Půńiżyj je lista nojnowszych wyćepań a zawarć s uwzglyndńyńym treśći schrůńůnej lo admińistratorůw. Coby przejrzeć lista teroźnych banůw a zawarć, uobezdrzij [[Special:BlockList|IP block list]].',
 
 # History merging
 'mergehistory' => 'Pouůnč historyjo půmjyńań zajtůw',
@@ -860,8 +917,7 @@ $1',
 'mergelogpagetext' => 'Půńižej znojduje śe lista uostatńich pouůnčyń historyji půmjyńań zajtůw.',
 
 # Diffs
-'history-title' => 'Historyjo sprowjyń "$1"',
-'difference' => '(Růžńice mjyndzy škryflańami)',
+'history-title' => 'Gyszichta sprowjyń "$1"',
 'difference-multipage' => '(Porůwnańje zajt)',
 'lineno' => 'Lińijo $1:',
 'compareselectedversions' => 'zrůwnej uobrane wersyje',
@@ -925,7 +981,7 @@ $1',
 'search-nonefound' => 'Ńy mo wynikůw, kere uodpadajům kryterjům zapytańo.',
 'powersearch' => 'Sznupańy zaawansowane',
 'powersearch-legend' => 'Šnupańy zaawansowane',
-'powersearch-ns' => 'Šnupej we přestřyńach mjan:',
+'powersearch-ns' => 'Sznupej we przestrzyńach mjan:',
 'powersearch-redir' => 'Pokož překerowańa',
 'powersearch-field' => 'Šnupej',
 'powersearch-togglelabel' => 'Zaznocz:',
@@ -955,16 +1011,19 @@ $1',
 'prefs-beta' => 'Testowe funkcyje',
 'prefs-datetime' => 'Data a czas',
 'prefs-labs' => 'Funkcyje "labs"',
+'prefs-user-pages' => 'Zajty używaczy',
 'prefs-personal' => 'Dane užytkowńika',
 'prefs-rc' => 'Ńydowno pomjyńane',
 'prefs-watchlist' => 'Pozůrlista',
 'prefs-watchlist-days' => 'Ličba dńi widočnych na liśće artikli, na kere dowoš pozůr:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Max $1 {{PLURAL:$1|dźień|dńi}}',
 'prefs-watchlist-edits' => 'Ličba půmjyńań pokazywanych we rozšyřůnyj liśće artiklůw, na kere dowoš pozůr:',
 'prefs-watchlist-edits-max' => 'Maksymalno liczba: 1000',
 'prefs-watchlist-token' => 'ID půzorlisty:',
 'prefs-misc' => 'Roztůmajte',
 'prefs-resetpass' => 'Zmjyń hasło',
+'prefs-changeemail' => 'Pomjyno ausdruka e-brif',
+'prefs-setemail' => 'Nastow e-brif',
 'prefs-email' => 'E-brif',
 'prefs-rendering' => 'Wyglůnd',
 'saveprefs' => 'Naškryflej',
@@ -1007,14 +1066,17 @@ $1',
 'default' => 'důmyślńy',
 'prefs-files' => 'Pliki',
 'youremail' => 'E-brif:',
-'username' => 'Mjano užytkowńika:',
+'username' => 'Mjano użytkowńika:',
 'uid' => 'ID užytkowńika:',
 'prefs-memberingroups' => 'Naležy do {{PLURAL:$1|grupy|grup:}}',
+'prefs-registration' => 'Czas twůrzyńa kůnta:',
 'yourrealname' => 'Prawdźiwe mjano',
 'yourlanguage' => 'Godka interfejsu',
 'yournick' => 'Twoja šrajba:',
 'badsig' => 'Felerno šrajba, sprowdź značńiki HTML.',
-'badsiglength' => 'Twůj šrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchštaby|buchštabůw}}',
+'badsiglength' => 'Twůj szrajbůng je za dugi. Maksymalno jego dugość to $1 {{PLURAL:$1|buchsztaby|buchsztabůw}}',
+'yourgender' => 'Płeć',
+'gender-unknown' => 'ńyznana',
 'gender-male' => 'chop',
 'gender-female' => 'baba',
 'email' => 'E-brif',
@@ -1078,7 +1140,7 @@ $1',
 'right-move' => 'Přećepane zajty',
 'right-move-subpages' => 'Přećep zajty wroz s jejich podzajtůma',
 'right-move-rootuserpages' => 'Překludzańy zajtůw uod užytkowńikůw',
-'right-suppressredirect' => 'Ńy twůř překerowańo ze starygo mjana jak přećepuješ zajta',
+'right-suppressredirect' => 'Ńy twůrz przekerowańo ze starygo mjana jak przećepujesz zajta',
 'right-upload' => 'Wćepane pliki',
 'right-reupload' => 'Nadpisuj pliki kere sam juž sům wćepane',
 'right-reupload-own' => 'Nadpisuj plik wćepany sam bez tygo somygo užytkowńika',
@@ -1100,7 +1162,7 @@ $1',
 'right-suppressionlog' => 'Pokož prywatne lůgi',
 'right-block' => 'Zawjyrańy sprowjorzům możebnośći edytowańo',
 'right-blockemail' => 'Zablokuj užytkowńikowi wysyuańy e-brifůw',
-'right-hideuser' => 'Zablokuj mjano užytkowÅ\84ika i schrůÅ\84 to pÅ\99ed publiÄ\8dnym dostympym',
+'right-hideuser' => 'Zablokuj mjano użytkowÅ\84ika i schrůÅ\84 to przed publicznym dostympym',
 'right-ipblock-exempt' => 'Uobejdź zawarća uod sprowjyń do IP, autozawarća i zawarća zakresůw',
 'right-proxyunbannable' => 'Uobejdź autůmatyčne zawarća uod sprowjyń do proxy',
 'right-protect' => 'Zmjyń poźůmy zawarć i sprowjej zawarte zajty',
@@ -1167,7 +1229,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|pomjyńańe|pomjyńańa|pomjyńań}}',
 'recentchanges' => 'Ńydowno půmjyńane',
 'recentchanges-legend' => 'Uopcyje ńydowno půmjyńanych',
-'recentchangestext' => 'Ta zajta předstawjo historyjo uostatńich půmjyńań na tyj wiki',
+'recentchanges-summary' => 'Ta zajta předstawjo historyjo uostatńich půmjyńań na tyj wiki',
 'recentchanges-feed-description' => 'Dowej pozůr na půmjyńane na uostatku na tyj wiki.',
 'recentchanges-label-newpage' => 'Tym sprowjyńym stworzůno nowa zajta',
 'recentchanges-label-minor' => 'To je ńywjelge sprowjyńy',
@@ -1483,7 +1545,7 @@ Zajta uznawano je za ujydnoznačńajůnco kej zawiyro šablůn uokreślůny we [
 'usereditcount' => '$1 {{PLURAL:$1|sprowjyńe|sprowjyńa|sprowjyń}}',
 'usercreated' => '{{GENDER:$3:Utworzono}} $1 uo $2',
 'newpages' => 'Nowe zajty',
-'newpages-username' => 'Mjano užytkowńika:',
+'newpages-username' => 'Mjano użytkowńika:',
 'ancientpages' => 'Nojstarše artikle',
 'move' => 'Przećep',
 'movethispage' => 'Přećepej ta zajta',
@@ -1854,7 +1916,7 @@ $1',
 'sp-contributions-talk' => '↓ dyskusyjo',
 'sp-contributions-userrights' => 'Zařůndzańy prowami užytkowńikůw',
 'sp-contributions-search' => 'Šnupej za wkuodym',
-'sp-contributions-username' => 'Adres IP abo mjano užytkowńika',
+'sp-contributions-username' => 'Adres IP abo mjano użytkowńika',
 'sp-contributions-toponly' => 'Ukoż jyno ůostanie wersyje',
 'sp-contributions-submit' => 'Šnupej',
 
@@ -1883,18 +1945,18 @@ $1',
 'blockiptext' => 'Tyn formulař suužy do zawjerańo sprowjyń spod uokreślůnygo adresu IP abo kůnkretnymu užytkowńikowi.
 Zawjerać noležy jydyńy po to, by zapobjec wandalizmům, zgodńy s [[{{MediaWiki:Policy-url}}|přijyntymi zasadami]].
 Podej powůd (np. umješčajůnc mjana zajtůw, na kerych dopuščůno śe wandalizmu).',
-'ipadressorusername' => 'Adres IP abo mjano užytkowńika',
+'ipadressorusername' => 'Adres IP abo mjano użytkowńika',
 'ipbexpiry' => 'Wygaso:',
 'ipbreason' => 'Čymu:',
 'ipbreasonotherlist' => 'Inkszy powůd',
-'ipbreason-dropdown' => '*Nojčynstše powody zawjerańo uod sprawjyń
-** Ataki na inkšych užytkowńikůw
-** Narušyńy praw autorskych
-** Å\83ydozwolůne mjano užytkowńika
-** Upen proxy/Tor
+'ipbreason-dropdown' => '*Nojczynstsze powody zawjerańo uod sprawjyń
+** Ataki na inkszych użytkowńikůw
+** Naruszyńy praw autorskych
+** Å\83ydozwolůne mjano użytkowńika
+** Open proxy/Tor
 ** Spamowańy
 ** Ůsuwańy treśći zajtůw
-** Wprowadzańy foywych informacyji
+** Wprowadzańy fołszywych informacyji
 ** Wulgaryzmy
 ** Wypisywańy guůpot na zajtach',
 'ipbcreateaccount' => 'Ńy dozwůl utwožyć kůnta',
@@ -1905,7 +1967,7 @@ Podej powůd (np. umješčajůnc mjana zajtůw, na kerych dopuščůno śe wanda
 'ipboptions' => '2 godźiny:2 hours,1 dźyń:1 day,3 dńi:3 days,1 tydźyń:1 week,2 tydńe:2 weeks,1 mjeśůnc:1 month,3 mjeśůnce:3 months,6 mjeśůncůw:6 months,1 rok:1 year,nawdy:infinite',
 'ipbotheroption' => 'inkšy',
 'ipbotherreason' => 'Inkšy powůd:',
-'ipbhidename' => 'SchrůÅ\84 mjano užytkowÅ\84ika/adres IP w rejeÅ\99e zawarÄ\87, na liÅ\9bÄ\87e aktywnych zawarÄ\87 i liÅ\9bÄ\87e užytkowńikůw',
+'ipbhidename' => 'SchrůÅ\84 mjano użytkowÅ\84ika/adres IP w rejerze zawarÄ\87, na liÅ\9bÄ\87e aktywnych zawarÄ\87 i liÅ\9bÄ\87e użytkowńikůw',
 'ipbwatchuser' => 'Dowej pozůr na zajta uosobisto i zajta godki tygo užytkowńika',
 'ipb-change-block' => 'Zmjyń sztalowańa zawarća uod sprowjyń',
 'badipaddress' => 'Felerny adres IP',
index b674c0d..5c6f837 100644 (file)
@@ -16,6 +16,7 @@
  * @author Mahir78
  * @author Mayooranathan
  * @author Naveen
+ * @author Planemad
  * @author Shanmugamp7
  * @author Sodabottle
  * @author Sundar
@@ -215,7 +216,7 @@ $messages = array(
 'mytalk' => 'என் பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
 'navigation' => 'வழிசெலுத்தல்',
-'and' => '&#32;மற்றும்',
+'and' => ' மற்றும்',
 
 # Cologne Blue skin
 'qbfind' => 'கண்டுபிடி',
@@ -725,7 +726,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'userinvalidcssjstitle' => "'''எச்சரிக்கை:'''  \"\$1\" என்றப் பெயரில் தோல்லொறுக் கிடையாது. சி.எஸ்.எஸ் மற்றும் ஜெ.எஸ். பக்கங்கள் ஆங்கில கீழ் வரிசைப் பெயர்களைக் கொண்டிருக்க வேண்டும் என்பதைக் கவனிக்கவும். எ+கா: {{ns:user}}:Foo/vector.css என்பது சரியான வடிவம் {{ns:user}}:Foo/Vector.css என்பது பிழையான வடிவம்.",
 'updated' => '(இற்றைப்படுத்தப்பட்டது)',
 'note' => "'''குறிப்பு:'''",
-'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே, உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!'''",
+'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
 'previewconflict' => 'இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.',
 'session_fail_preview' => "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
 'session_fail_preview_html' => "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''
@@ -736,6 +737,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'token_suffix_mismatch' => "'''உங்கள் தொகுப்பினுள் சேவையாளர் நிறுத்தக்குறியீடுகளை செறுகியுள்ளனதன் காரணமாக உங்களது தொகுப்பு நிராகரிக்கப்பட்டுள்ளது. இது வலைத்தளத்தை மையமாகக் கொண்ட அடையாளம் காட்டாத புரொக்சி சேவைகளிலிருந்து தொகுக்கும் போது ஏற்படலாம்.'''",
 'edit_form_incomplete' => 'இந்த திருத்து படிவத்தின் சில பகுதிகள் SERVER ஐ சென்றடையவில்லை;ஒருமுறைக்கு இருமுறை  உங்கள் திருத்தங்களை சரிபார்த்து  மீண்டும் முயற்சிக்கவும்.',
 'editing' => '$1 தொகுக்கப்படுகிறது',
+'creating' => '$1 உருவாக்கம்',
 'editingsection' => 'தொகுப்பு $1 (பிரிவு)',
 'editingcomment' => '$1 தொகுக்கப்படுகிறது (புதிய பிரிவு)',
 'editconflict' => 'முரண்பாடுகளைத் தொகுக்கவும்: $1',
@@ -994,7 +996,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" பக்கத்தின் திருத்த வரலாறு',
-'difference' => '(திருத்தங்களுக்கிடையான வேறுபாடு)',
 'difference-multipage' => 'பக்கங்களுக்கு இடையேயான வேறுபாடு',
 'lineno' => 'வரிசை $1:',
 'compareselectedversions' => 'தெரிவு செய்யப்பட்ட பதிப்புக்களை ஒப்பிடவும்',
@@ -1175,7 +1176,7 @@ $1",
 'prefs-help-gender' => 'விருப்பத் தேர்வுதான்: ஒருவரைக் குறிப்பிடும்பொழுது, அவருடைய பால் சரியானதாக இருக்க மென்கலம் பயன்படுத்தும் தகவல். இத்தகவல் பொதுவில் கிடைக்கும்படி இனி இருக்கும்.',
 'email' => 'மின்னஞ்சல்',
 'prefs-help-realname' => 'உண்மையான பெயர் கட்டாயமற்றது. நீங்கள் இதை கொடுத்தால் உங்கள் ஆக்கங்களுக்கான உரிமையளிப்புகளின் போது இது பயன்படும்.',
-'prefs-help-email' => 'மின்னஞ்சல் விருப்பத்தின் பேரில் ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல் ஒன்றை மின்னஞ்சல் மூலம் அனுப்ப வழிசெய்யும்.மேலும் உங்கள் பயனர் பக்கம் அல்லது பயனர் பேச்சுப் பக்கத்தில் இருந்து மற்ற பயனர்கள் உங்களுக்கு மின்னஞ்சல் அனுப்ப உதவும். எனினும் உங்கள் மின்னஞ்சல் முகவரி வெளிப்படுத்தப்பட மாட்டாது.',
+'prefs-help-email' => 'மின்னஞ்சல் விருப்பத் தேர்வு,  ஆனால் உங்கள் கடவுச்சொல் உங்களுக்கு நினைவில்லையென்றால், புதிய கடவுச்சொல்லை மீட்டமைக்க தேவைப்படும்.',
 'prefs-help-email-others' => 'உங்கள் பேச்சுப் பக்கத்தில் உள்ள இணைப்பு மூலம் பிற பயனர்கள் உங்களுக்கு மின்னஞ்சல் அனுப்புதலை நீங்கள் தெரிவு செய்யலாம். பிற பயனர்கள் உங்களைத் தொடர்பு கொள்ளும் அதே வேளையில் உங்கள் மின்னஞ்சல் முகவரி வெளிப்படுத்தப்பட மாட்டாது.',
 'prefs-help-email-required' => 'மின்னஞ்சல் முகவரி தேவை.',
 'prefs-info' => 'அடிப்படைச் செய்தி',
@@ -1354,7 +1355,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|ஓர் மாற்றம்|$1 மாற்றங்கள்}}',
 'recentchanges' => 'அண்மைய மாற்றங்கள்',
 'recentchanges-legend' => 'அண்மைய மாற்றங்களின் தேர்வுகள்',
-'recentchangestext' => 'இந்த விக்கிக்கு மிக அண்மையில் செய்யப்பட்ட மாற்றங்களை, இந்தப் பக்கத்தில் காணலாம்.',
+'recentchanges-summary' => 'இந்த விக்கிக்கு மிக அண்மையில் செய்யப்பட்ட மாற்றங்களை, இந்தப் பக்கத்தில் காணலாம்.',
 'recentchanges-feed-description' => 'இவ்வுள்ளீட்டில் இந்த விக்கியில் செய்யப்பட்ட் மிக அண்மைய மாற்றங்கள் கவனிக்கப்படுகின்றன.',
 'recentchanges-label-newpage' => 'இந்தத் தொகுப்பு ஒரு புதிய பக்கத்தை உருவாக்கியுள்ளது',
 'recentchanges-label-minor' => 'இது ஒரு சிறு தொகுப்பு',
@@ -1632,7 +1633,7 @@ $1',
 'file-anchor-link' => 'கோப்பு',
 'filehist' => 'கோப்பு வரலாறு',
 'filehist-help' => 'குறித்த நேரத்தில் இருந்த படிமத்தைப் பார்க்க அந்நேரத்தின் மீது சொடுக்கவும்.',
-'filehist-deleteall' => 'சகலதையும் நீக்கு',
+'filehist-deleteall' => 'à®\9aà®\95லதà¯\8dதà¯\88யà¯\81à®®à¯\8d à®¨à¯\80à®\95à¯\8dà®\95à¯\81',
 'filehist-deleteone' => 'நீக்குக',
 'filehist-revert' => 'முன்நிலையாக்கு',
 'filehist-current' => 'தற்போதைய',
@@ -1858,6 +1859,9 @@ $1',
 'allpagesbadtitle' => 'கொடுக்கப்பட்ட தலைப்பு செல்லுபடியற்றது அல்லது பிழையான விக்கியிடை அல்லது மொழி முன்னொட்டைக் கொண்டுள்ளது. இது தலைப்புக்களில் பயன்படுத்த முடியாத எழுத்துக்களையும் கொண்டிருக்கலாம்.',
 'allpages-bad-ns' => '{{SITENAME}} தளத்தில் "$1" பெயர்வெளி கிடையாது.',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'அண்மையான பதிப்பை காண்க',
+
 # Special:Categories
 'categories' => 'பகுப்புகள்',
 'categoriespagetext' => 'கீழே கொடுத்துள்ள பக்கங்கள் அல்லது ஊடகங்கள் இந்த {{PLURAL:$1|பகுப்பை|பகுப்புக்களை}} கொண்டுள்ளது.
@@ -2074,7 +2078,7 @@ $NEWPAGE
 
 # Protect
 'protectlogpage' => 'காப்புப் பதிகை',
-'protectlogtext' => 'பின்வருவது பக்க திறப்புக்களதும் பூட்டுக்களதும் பட்டியலாகும். தற்போது நடைமுறையிலுள்ள காக்கப்பட்டப் பக்கங்களைக் காண [[Special:ProtectedPages|காக்கப்பட்ட பக்கங்களின் பட்டியலைப்]] பார்க்கவும்.',
+'protectlogtext' => '!!FUzZY!!பின்வருவது பக்க திறப்புக்களதும் பூட்டுக்களதும் பட்டியலாகும். தற்போது நடைமுறையிலுள்ள காக்கப்பட்டப் பக்கங்களைக் காண [[Special:ProtectedPages|காக்கப்பட்ட பக்கங்களின் பட்டியலைப்]] பார்க்கவும்.',
 'protectedarticle' => '"[[$1]]" காக்கப்பட்டது',
 'modifiedarticleprotection' => '"[[$1]]" பக்கத்திற்கான காப்பின் அளவு மாற்றப்பட்டது',
 'unprotectedarticle' => '"[[$1]]" பக்கத்தின் காப்பு நீக்கப்பட்டது',
@@ -2770,7 +2774,8 @@ $1',
 'metadata-help' => 'இந்தக் கோப்பு கூடுதலான தகவல்களைக் கொண்டுளது, இவை பெரும்பாலும் இக்கோப்பை உருவாக்கப் பயன்படுத்திய எண்ணிம ஒளிப்படக்கருவி அல்லது ஒளிவருடியால் சேர்க்கப்பட்டிருக்கலாம். இக்கோப்பு ஏதாவது வகையில் மாற்றியமைக்கப்பட்டிருந்தால் இத்தகவல்கள் அவற்றைச் சரிவர தராமல் இருக்கலாம்.',
 'metadata-expand' => 'மேலதிகத் தகவல்களைக் காட்டு',
 'metadata-collapse' => 'மேலதிகத் தகவல்களை மறை',
-'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் காட்டப்படும். ஏனைய தரவுகள் இயல்பிருப்பாக மறைக்கப்பட்டிருக்கும்.
+'metadata-fields' => 'இங்கே காட்டப்பட்டுள்ள எக்சிப் மேல்நிலைத் தரவுகள் படிமவிளக்கப்பக்கத்தில் மேல்நிலைத் தரவுகள் அட்டவணை மறைக்கப்பட்டிருக்கும் பொழுது
+ காட்டப்படும்.
 * make
 * model
 * datetimeoriginal
@@ -3336,7 +3341,7 @@ $5
 'version-variables' => 'மாறிகள்',
 'version-antispam' => ' குப்பை (spam) தடுப்பு',
 'version-skins' => 'தோல்கள்',
-'version-other' => 'மறà¯\8dறவà¯\88',
+'version-other' => 'பிறரà¯\8d',
 'version-mediahandlers' => 'ஊடக கையாளிகள்',
 'version-hooks' => 'கொக்கிகள்',
 'version-extension-functions' => 'நீட்சி செயற்பாடுகள்',
@@ -3347,13 +3352,14 @@ $5
 'version-version' => '(பதிப்பு $1)',
 'version-license' => 'அனுமதி',
 'version-poweredby-credits' => "இந்த் விக்கி '''[//www.mediawiki.org/ MediaWiki]''' இதன் மூலம் வழங்கப்படுகிறது, காப்புரிமை © 2001-$1 $2.",
-'version-poweredby-others' => 'மறà¯\8dறவà¯\88à®\95ள்',
+'version-poweredby-others' => 'பிறர்',
 'version-license-info' => 'மீடியாவிக்கியானது இலவச மென்பொருள்.இதை நீங்கள் மற்றவர்களுக்கு கொடுப்பது அல்லது திருத்தம் செய்வது இலவச மென்பொருள் அறக்கட்டளை வழங்கிய   GNUவின் பொது உரிம விதிகளுக்குட்பட்டது;உரிமத்தின் இரண்டாவது பதிப்பு அல்லது அதற்கு மேற்பட்ட பதிப்பு (உங்கள் விருப்பத்திற்க்கேற்றவாறு).
 மீடியா உபயோகப்படக்கூடியது என்ற நம்பிக்கையில் வெளியிடப்பட்டுள்ளது, ஆனால் இதற்க்கு உத்தரவாதம் கிடையாது.மேலும் வணிகத்தன்மைக்கான அல்லது ஒரு குறிப்பிட்ட செயலுக்காகவும் உத்தரவாதம் கிடையாது.மேலும் விவரங்களுக்கு GNU பொது உரிமத்தை பார்க்கவும்.
 நீங்கள் இந்த  மென்பொருளுடன் [{{SERVER}}{{SCRIPTPATH}}/COPYING a copy of the 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 read it online].',
 'version-software' => 'நிறுவப்பட்ட மென்பொருள்',
 'version-software-product' => 'உற்பத்திப்பொருள்',
 'version-software-version' => 'பதிப்பு',
+'version-entrypoints-header-url' => 'உரலி (URL)',
 
 # Special:FilePath
 'filepath' => 'கோப்பு வழி',
@@ -3457,7 +3463,7 @@ $5
 'sqlite-no-fts' => '$1 முழு-உரை தேடல் ஆதரவு இல்லாமல்',
 
 # New logging system
-'logentry-delete-delete' => 'பக்கம் $3 ஐ $1 நீக்கினார்',
+'logentry-delete-delete' => '$3 பக்கத்தை $1 நீக்கினார்',
 'logentry-delete-restore' => '$1 பயனரால் $3 பக்கம் மீட்டமைக்கப்பட்டது',
 'logentry-delete-event' => '$1 மாற்றிய காட்சித்தன்மை  {{PLURAL:$5| ஒரு நிகழ்வு குறிப்பேடு| $5  நிகழ்வுகள் குறிப்பேடு}} இதில்   $3 :$4',
 'logentry-delete-revision' => '$1 மாற்றப்பட்ட  காட்சித்தன்மைக்கு  {{PLURAL:$5| ஒருபரிசீலனை| $5  பரிசீலனைகளுக்கும்}} இந்த பக்கம்  $3 :$4',
index 15cbc6f..f0a254e 100644 (file)
@@ -553,7 +553,6 @@ $messages = array(
 
 # Diffs
 'history-title' => '"$1" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸ',
-'difference' => '(ಆವೃತ್ತಿಲೆದ ನಡುತ ವ್ಯತ್ಯಾಸ)',
 'lineno' => '$1 ನೇ ಸಾಲ್:',
 'compareselectedversions' => 'ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ',
 'editundo' => 'ದುಂಬುದಲೆಕ',
@@ -663,7 +662,7 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}',
 'recentchanges' => 'ಇಂಚಿಪದ ಬದಲಾವಣೆಲು',
 'recentchanges-legend' => 'ಇಂಚಿಪದ ಬದಲಾವಣೆಲು ಆಯ್ಕೆಲು',
-'recentchangestext' => 'ಈ ವಿಕಿಟ್ ಇಂಚಿಪ್ಪ ಆತಿನ ಬದಲಾವಣೆನ್ ಟ್ರಾಕ್ ಮಲ್ಪುಲೆ',
+'recentchanges-summary' => 'ಈ ವಿಕಿಟ್ ಇಂಚಿಪ್ಪ ಆತಿನ ಬದಲಾವಣೆನ್ ಟ್ರಾಕ್ ಮಲ್ಪುಲೆ',
 'recentchanges-feed-description' => 'ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.',
 'recentchanges-label-newpage' => 'ಇರ್ನ ಈ ಬದಲಾವಣೆ ಪೊಸ ಪುಟೊನು ಸುರು ಮಲ್ಪುಂಡು',
 'recentchanges-label-minor' => 'ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ',
index 68af6ea..eae871d 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Chaduvari
+ * @author Jprmvnvijay5
  * @author Kaganer
  * @author Kiranmayee
  * @author Meno25
@@ -304,23 +305,23 @@ $messages = array(
 'vector-view-history' => 'చరిత్రని చూడండి',
 'vector-view-view' => 'చదువు',
 'vector-view-viewsource' => 'మూలాన్ని చూడండి',
-'actions' => 'à°\9aà°°à±\8dà°¯లు',
-'namespaces' => 'à°¨à±\87à°\82à°¸à±\8dà°ªà±\87à°¸ులు',
-'variants' => 'à°µà±\88విధà±\8dà°¯ాలు',
+'actions' => 'పనà±\81లు',
+'namespaces' => 'à°ªà±\87à°°à±\81బరులు',
+'variants' => 'à°°à°\95à°°à°\95ాలు',
 
 'errorpagetitle' => 'పొరపాటు',
 'returnto' => 'తిరిగి $1కి.',
 'tagline' => '{{SITENAME}} నుండి',
 'help' => 'సహాయం',
-'search' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£',
+'search' => 'à°µà±\86à°¤à±\81à°\95à±\81',
 'searchbutton' => 'వెతుకు',
 'go' => 'వెళ్లు',
 'searcharticle' => 'వెళ్లు',
 'history' => 'పేజీ చరిత్ర',
 'history_short' => 'చరిత్ర',
 'updatedmarker' => 'నేను కిందటిసారి వచ్చిన తరువాత జరిగిన మార్పులు',
-'printableversion' => 'à°®à±\81à°¦à±\8dà°°à°¿à°\82à°\9aà±\81à°\95à±\8bదగ్గ కూర్పు',
-'permalink' => 'శాశà±\8dవత à°²à°¿à°\82à°\95à±\81',
+'printableversion' => 'à°\85à°\9aà±\8dà°\9aà±\81à°¤à±\80à°¯దగ్గ కూర్పు',
+'permalink' => 'శాశà±\8dవత à°²à°\82à°\95à±\86',
 'print' => 'ముద్రించు',
 'view' => 'చూచుట',
 'edit' => 'సవరించు',
@@ -340,12 +341,12 @@ $messages = array(
 'talkpage' => 'ఈ పేజీని చర్చించండి',
 'talkpagelinktext' => 'చర్చ',
 'specialpage' => 'ప్రత్యేక పేజీ',
-'personaltools' => 'à°µà±\8dà°¯à°\95à±\8dతిà°\97à°¤ పనిముట్లు',
+'personaltools' => 'తన పనిముట్లు',
 'postcomment' => 'కొత్త విభాగం',
 'articlepage' => 'విషయపు పేజీని చూడండి',
 'talk' => 'చర్చ',
-'views' => 'à°ªà±\87à°\9cà±\80 à°²à°¿à°\82à°\95ులు',
-'toolbox' => 'పరిà°\95రాలపెట్టె',
+'views' => 'à°\9aà±\82à°ªులు',
+'toolbox' => 'పనిమà±\81à°\9fà±\8dà°² పెట్టె',
 'userpage' => 'వాడుకరి పేజీని చూడండి',
 'projectpage' => 'ప్రాజెక్టు పేజీని చూడు',
 'imagepage' => 'ఫైలు పేజీని చూడండి',
@@ -362,7 +363,7 @@ $messages = array(
 'protectedpage' => 'సంరక్షణలోని పేజీ',
 'jumpto' => 'ఇక్కడికి గెంతు:',
 'jumptonavigation' => 'పేజీకి సంబంధించిన లింకులు',
-'jumptosearch' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£',
+'jumptosearch' => 'à°µà±\86à°¤à±\81à°\95à±\81',
 'view-pool-error' => 'క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.
 చాలామంది వాడుకరులు ఈ పేజీని చూస్తున్నారు.
 ఈ పేజీని వీక్షించడానికి కొద్దిసేపు నిరీక్షించండి.
@@ -377,15 +378,15 @@ $1',
 'aboutpage' => 'Project:గురించి',
 'copyright' => 'విషయ సంగ్రహం $1  కి లోబడి లభ్యం.',
 'copyrightpage' => '{{ns:project}}:ప్రచురణ హక్కులు',
-'currentevents' => 'వరà±\8dతమాన à°\98à°\9fà°¨లు',
-'currentevents-url' => 'Project:వరà±\8dతమాన à°\98à°\9fà°¨లు',
+'currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
+'currentevents-url' => 'Project:à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dలు',
 'disclaimers' => 'అస్వీకారములు',
 'disclaimerpage' => 'Project:సాధారణ నిష్పూచీ',
 'edithelp' => 'దిద్దుబాటు సహాయం',
 'edithelppage' => 'Help:దిద్దుబాట్లు ఎలా చెయ్యాలి',
 'helppage' => 'Help:సూచిక',
 'mainpage' => 'మొదటి పేజీ',
-'mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80',
+'mainpage-description' => 'తలపà±\81à°\9f',
 'policy-url' => 'Project:విధానం',
 'portal' => 'సముదాయ పందిరి',
 'portal-url' => 'Project:సముదాయ పందిరి',
@@ -511,8 +512,9 @@ $1',
 'viewsource-title' => '$1 యొక్క సోర్సు చూడండి',
 'actionthrottled' => 'కార్యాన్ని ఆపేసారు',
 'actionthrottledtext' => 'స్పామును తగ్గించటానికి తీసుకున్న నిర్ణయాల వల్ల, మీరు ఈ కార్యాన్ని అతి తక్కువ సమయంలో బోలెడన్ని సార్లు చేయకుండా అడ్డుకుంటున్నాము. కొన్ని నిమిషాలు ఆగి మరలా ప్రయత్నించండి.',
-'protectedpagetext' => 'à°\88 à°ªà±\87à°\9cà±\80à°ªà±\88 à°¦à°¿à°¦à±\8dà°¦à±\81బాà°\9fà±\8dà°²à±\81 à°\9aà±\86à°¯à±\8dయనివà±\8dà°µà°\95à±\81à°\82à°¡à°¾ à°²à°¾à°\95à±\81 à°\9aà±\87సాà°\82.',
+'protectedpagetext' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à°¾à°°à±\8dà°\9aà°\95à±\81à°\82à°¡à°¾ à°\89à°\82à°¡à±\87à°\82à°¦à±\81à°\95à±\81 à°¸à°\82à°°à°\95à±\8dà°·à°¿à°\82à°\9aారà±\81.',
 'viewsourcetext' => 'మీరీ పేజీ సోర్సును చూడవచ్చు, కాపీ చేసుకోవచ్చు:',
+'viewyourtext' => "ఈ పేజీకి '''మీ మార్పుల''' యొక్క మూలాన్ని చూడవచ్చు లేదా కాపీచేసుకోవచ్చు:",
 'protectedinterface' => 'సాఫ్టువేరు ఇంటరుఫేసుకు చెందిన టెక్స్టును ఈ పేజీ అందిస్తుంది. దుశ్చర్యల నివారణ కోసమై దీన్ని లాకు చేసాం.',
 'editinginterface' => "'''హెచ్చరిక''': సాఫ్టువేరుకు ఇంటరుఫేసు టెక్స్టును అందించే పేజీని మీరు సరిదిద్దుతున్నారు.
 ఈ పేజీలో చేసే మార్పుల వల్ల ఇతర వాడుకరులకు ఇంటరుఫేసు కనబడే విధానంలో తేడావస్తుంది.
@@ -546,7 +548,7 @@ $2',
 'securelogin-stick-https' => 'ప్రవేశం తర్వాత కూడా HTTPSకి అనుసంధానమై ఉండు',
 'yourdomainname' => 'మీ డోమైను',
 'externaldberror' => 'డేటాబేసు అధీకరణలో పొరపాటు జరిగింది లేదా మీ బయటి ఖాతాని తాజాకరించడానికి మీకు అనుమతి లేదు.',
-'login' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aండి',
+'login' => 'à°²à±\8bనిà°\95à°¿ à°°ండి',
 'nav-login-createaccount' => 'లోనికి ప్రవేశించండి / ఖాతాని సృష్టించుకోండి',
 'loginprompt' => '{{SITENAME}}లోకి ప్రవేశించాలంటే మీ విహారిణిలో కూకీలు చేతనమై ఉండాలి.',
 'userlogin' => 'ప్రవేశించండి / ఖాతాను సృష్టించుకోండి',
@@ -657,6 +659,7 @@ $2',
 'passwordreset-disabled' => 'ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.',
 'passwordreset-pretext' => '{{PLURAL:$1||డేటా శకలాల్లోంచి ఒకదాన్ని ఇవ్వండి}}',
 'passwordreset-username' => 'వాడుకరిపేరు:',
+'passwordreset-domain' => 'డొమైన్:',
 'passwordreset-email' => 'ఈ-మెయిలు చిరునామా:',
 'passwordreset-emailtitle' => '{{SITENAME}}లో ఖాతా వివరాలు',
 'passwordreset-emailtext-ip' => 'ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ ఖాతా వివరాలను చెప్పమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}
@@ -676,6 +679,7 @@ $2
 'passwordreset-emailelement' => 'వాడుకరిపేరు: $1
 తాత్కాలిక సంకేతపదం: $2',
 'passwordreset-emailsent' => 'జ్ఞాపకం ఈమెయిలు పంపించాం.',
+'passwordreset-emailsent-capture' => 'క్రింద చూపబడిన, గుర్తుచేయు సందేశమును పంపినాము.',
 
 # Special:ChangeEmail
 'changeemail' => 'ఈ-మెయిలు చిరునామా మార్పు',
@@ -760,7 +764,7 @@ $2
 'nosuchsectiontext' => 'మీరు లేని విభాగాన్ని మార్చడానికి ప్రయత్నించారు.
 మీరు పేజీని చూస్తూన్నప్పుడు దాన్ని ఎవరైనా తరలించి లేదా తొలగించి ఉండవచ్చు.',
 'loginreqtitle' => 'ప్రవేశము తప్పనిసరి',
-'loginreqlink' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aి',
+'loginreqlink' => 'à°²à±\8bనిà°\95à°¿ à°°à°\82à°¡ి',
 'loginreqpagetext' => 'ఇతర పుటలను చూడడానికి మీరు $1 ఉండాలి.',
 'accmailtitle' => 'సంకేతపదం పంపించబడింది.',
 'accmailtext' => "[[User talk:$1|$1]] కొరకు ఒక యాదృచ్చిక సంకేతపదాన్ని $2కి పంపించాం.
@@ -795,8 +799,8 @@ $2
 అభిమత .css మరియు .js పుటల శీర్షికలు ఇంగ్లీషు చిన్నబడి అక్షరాల లోనే ఉండాలని గుర్తుంచుకోండి, ఉదాహరణకు ఇలా {{ns:user}}:Foo/vector.css అంతేగానీ, {{ns:user}}:Foo/Vector.css ఇలా కాదు.",
 'updated' => '(నవీకరించబడింది)',
 'note' => "'''గమనిక:'''",
-'previewnote' => "'''ఇది మునుజూపు మాత్రమే;
-మారà±\8dà°ªà±\81లని à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరపరà°\9aà°²à±\87à°¦à±\81!'''",
+'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
+à°®à±\80 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\87à°\82à°\95à°¾ à°­à°¦à±\8dరమవà±\8dవలà±\87à°¦à±\81!",
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
 'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
 దయచేసి మళ్ళీ ప్రయత్నించండి.
@@ -809,6 +813,7 @@ $2
 'token_suffix_mismatch' => "'''మీ క్లయంటు, దిద్దుబాటు టోకెన్‌లోని వ్యాకరణ గుర్తులను గజిబిజి చేసింది కాబట్టి మీ దిద్దుబాటును తిరస్కరించాం. పేజీలోని పాఠ్యాన్ని చెడగొట్టకుండా ఉండేందుకు గాను, ఆ దిద్దుబాటును రద్దు చేశాం. వెబ్‌లో ఉండే లోపభూయిష్టమైన అజ్ఞాత ప్రాక్సీ సర్వీసులను వాడినపుడు ఒక్కోసారి ఇలా జరుగుతుంది.'''",
 'edit_form_incomplete' => '’’’ఈ ఎడిట్ ఫారంలోని కొన్ని భాగాలు సర్వరును చేరలేదు; మీ మార్పుచేర్పులు భద్రంగా ఉన్నాయని ధృవపరచుకుని, మళ్ళీ ప్రయత్నించండి.’’’',
 'editing' => '$1కి మార్పులు',
+'creating' => '$1 పేజీని సృష్టిస్తున్నారు',
 'editingsection' => '$1కు మార్పులు (విభాగం)',
 'editingcomment' => '$1 దిద్దుబాటు (కొత్త విభాగం)',
 'editconflict' => 'దిద్దుబాటు ఘర్షణ: $1',
@@ -1058,8 +1063,8 @@ $1",
 'mergelogpagetext' => 'ఒక పేజీ చరితాన్ని మరో పేజీ చరితం లోకి ఇటీవల చేసిన విలీనాల జాబితా ఇది.',
 
 # Diffs
-'history-title' => '"$1" à°\95à±\82à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à°\82',
-'difference' => '(సంచికల మధ్య తేడా)',
+'history-title' => '"$1" à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°°',
+'difference-title' => '"$1" యొక్క తిరిగిచూపుల నడుమ తేడాలు',
 'difference-multipage' => '(పేజీల మధ్య తేడా)',
 'lineno' => 'పంక్తి $1:',
 'compareselectedversions' => 'ఎంచుకున్న సంచికలను పోల్చిచూడు',
@@ -1069,7 +1074,7 @@ $1",
 'diff-multi-manyusers' => '$2 మంది పైన ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)',
 
 # Search results
-'searchresults' => 'à°\85à°¨à±\8dà°µà±\87à°·à°£ ఫలితాలు',
+'searchresults' => 'à°µà±\86à°¦à±\81à°\95à±\81లాà°\9f ఫలితాలు',
 'searchresults-title' => '"$1"కి అన్వేషణ ఫలితాలు',
 'searchresulttext' => '{{SITENAME}}లో అన్వేషించే విషయమై మరింత సమాచారం కొరకు [[{{MediaWiki:Helppage}}|{{int:help}}]] చూడండి.',
 'searchsubtitle' => 'మీరు \'\'\'[[:$1]]\'\'\' కోసం వెతికారు ([[Special:Prefixindex/$1|"$1"తో మొదలయ్యే అన్ని పేజీలు]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1"కి లింకు ఉన్న అన్ని పేజీలు]])',
@@ -1154,8 +1159,9 @@ $1",
 'prefs-beta' => 'బీటా సౌలభ్యాలు',
 'prefs-datetime' => 'తేదీ, సమయం',
 'prefs-labs' => 'ప్రయోగాత్మక సౌలభ్యాలు',
+'prefs-user-pages' => 'వాడుకరి పేజీలు',
 'prefs-personal' => 'వాడుకరి వివరాలు',
-'prefs-rc' => 'ఇటీవలి మార్పులు, మొలకలు',
+'prefs-rc' => 'ఇటీవలి మార్పులు',
 'prefs-watchlist' => 'వీక్షణ జాబితా',
 'prefs-watchlist-days' => 'వీక్షణ జాబితాలో చూపించవలసిన రోజులు:',
 'prefs-watchlist-days-max' => '$1 {{PLURAL:$1|రోజు|రోజులు}} గరిష్ఠం',
@@ -1284,7 +1290,7 @@ $1",
 # Groups
 'group' => 'గుంపు:',
 'group-user' => 'వాడుకరులు',
-'group-autoconfirmed' => 'à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°¥ారించబడిన వాడుకరులు',
+'group-autoconfirmed' => 'à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°§ారించబడిన వాడుకరులు',
 'group-bot' => 'బాట్‌లు',
 'group-sysop' => 'నిర్వాహకులు',
 'group-bureaucrat' => 'అధికారులు',
@@ -1292,14 +1298,14 @@ $1",
 'group-all' => '(అందరూ)',
 
 'group-user-member' => '{{GENDER:$1|వాడుకరి}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°¥ారించబడిన వాడుకరి}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°§ారించబడిన వాడుకరి}}',
 'group-bot-member' => '{{GENDER:$1|బాట్}}',
 'group-sysop-member' => '{{GENDER:$1|నిర్వాహకుడు|నిర్వాహకురాలు}}',
 'group-bureaucrat-member' => '{{GENDER:$1|అధికారి|అధికారిణి}}',
 'group-suppress-member' => 'పరాకు',
 
 'grouppage-user' => '{{ns:project}}:వాడుకరులు',
-'grouppage-autoconfirmed' => '{{ns:project}}:à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°¥ారించబడిన వాడుకరులు',
+'grouppage-autoconfirmed' => '{{ns:project}}:à°\86à°\9fà±\8bమాà°\9fà°¿à°\97à±\8dà°\97à°¾ à°¨à°¿à°°à±\8dà°§ారించబడిన వాడుకరులు',
 'grouppage-bot' => '{{ns:project}}:బాట్లు',
 'grouppage-sysop' => '{{ns:project}}:నిర్వాహకులు',
 'grouppage-bureaucrat' => '{{ns:project}}:అధికార్లు',
@@ -1411,7 +1417,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}',
 'recentchanges' => 'ఇటీవలి మార్పులు',
 'recentchanges-legend' => 'ఇటీవలి మార్పుల ఎంపికలు',
-'recentchangestext' => 'వికీలో ఇటీవల జరిగిన మార్పులను ఈ పుటలో గమనించవచ్చు.',
+'recentchanges-summary' => 'వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.',
 'recentchanges-feed-description' => 'ఈ ఫీడు ద్వారా వికీలో జరుగుతున్న మార్పుల గురించి ఎప్పటికప్పుడు సమాచారాన్ని పొందండి.',
 'recentchanges-label-newpage' => 'ఈ మార్పు కొత్త పేజీని సృష్టించింది',
 'recentchanges-label-minor' => 'ఇది ఒక చిన్న మార్పు',
@@ -1444,7 +1450,7 @@ $1",
 # Recent changes linked
 'recentchangeslinked' => 'సంబంధిత మార్పులు',
 'recentchangeslinked-feed' => 'సంబంధిత మార్పులు',
-'recentchangeslinked-toolbox' => 'à°¸à°\82à°¬à°\82ధిత మార్పులు',
+'recentchangeslinked-toolbox' => 'à°ªà±\8aà°\82తనà°\97à°² మార్పులు',
 'recentchangeslinked-title' => '$1 కు సంబంధించిన మార్పులు',
 'recentchangeslinked-noresult' => 'మీరిచ్చిన కాలంలో ఇక్కడికి లింకు ఉన్న పేజీలలో ఎటువంటు మార్పులూ జరగలేదు.',
 'recentchangeslinked-summary' => "దీనికి లింకై ఉన్న పేజీల్లో జరిగిన చివరి మార్పులు ఇక్కడ చూడవచ్చు. మీ వీక్షణ జాబితాలో ఉన్న పేజీలు '''బొద్దు'''గా ఉంటాయి.",
@@ -1583,6 +1589,7 @@ $1',
 'backend-fail-delete' => '$1 ఫైలును తొలగించలేకున్నాం.',
 'backend-fail-alreadyexists' => '$1 అనే దస్త్రం ఇప్పటికే ఉంది.',
 'backend-fail-opentemp' => 'తాత్కాలిక దస్త్రాన్ని తెరవలేకపోతున్నాం.',
+'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ఈ ఫైలును ZIP పరీక్ష కోసం తెరవబోతే, ఏదో తెలియని లోపం ఎదురైంది.',
@@ -1641,12 +1648,11 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'upload_source_file' => ' (మీ కంప్యూటర్లో ఒక ఫైలు)',
 
 # Special:ListFiles
-'listfiles-summary' => 'ఈ ప్రత్యేక పేజీ ఇప్పటి వరకూ అప్లోడయిన ఫైళ్లను చూపిస్తుంది.
-ఏ క్రమాన్నీ పేర్కొనకపోతే ఇటీవలే అప్లోడయిన ఫైళ్లను ముందుగా చూపిస్తుంది.
-నిలువు వరుసలకున్న శీర్షికలపై నొక్కితే క్రమపరిచే విధానం మారుతుంది.',
+'listfiles-summary' => 'ఈ ప్రత్యేక పేజీ ఇప్పటి వరకూ ఎక్కించిన దస్త్రాలన్నింటినీ చూపిస్తుంది.
+వాడుకరి పేరు మీద వడపోసినప్పుడు, ఆ వాడుకరి ఎక్కించిన కూర్పు ఆ దస్త్రం యొక్క సరికొత్త కూర్పు అయితేనే చూపిస్తుంది.',
 'listfiles_search_for' => 'మీడియా పేరుకై వెతుకు:',
-'imgfile' => 'à°«à±\88à°²à±\81',
-'listfiles' => 'à°«à±\88à°³à±\8dà°³ జాబితా',
+'imgfile' => 'దసà±\8dà°¤à±\8dà°°à°\82',
+'listfiles' => 'దసà±\8dà°¤à±\8dరాల జాబితా',
 'listfiles_thumb' => 'నఖచిత్రం',
 'listfiles_date' => 'తేదీ',
 'listfiles_name' => 'పేరు',
@@ -1759,7 +1765,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'statistics-articles' => 'విషయపు పేజీలు',
 'statistics-pages' => 'పేజీలు',
 'statistics-pages-desc' => 'ఈ వికీలోని అన్ని పేజీలు (చర్చా పేజీలు, దారిమార్పులు, మొదలైనవన్నీ కలుపుకొని).',
-'statistics-files' => 'à°\8eà°\97à±\81మతà±\88à°¨ à°«à±\88à°³à±\8dà°³ు',
+'statistics-files' => 'à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°¿à°¨ à°¦à°¸à±\8dà°¤à±\8dరాలు',
 'statistics-edits' => '{{SITENAME}}ని మొదలుపెట్టినప్పటినుండి జరిగిన మార్పులు',
 'statistics-edits-average' => 'పేజీకి సగటు మార్పులు',
 'statistics-views-total' => 'మొత్తం వీక్షణలు',
@@ -1879,7 +1885,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 
 # Special:AllPages
 'allpages' => 'అన్ని పేజీలు',
-'alphaindexline' => '$1 నుండి $2',
+'alphaindexline' => '$1 నుండి $2 వరకు',
 'nextpage' => 'తరువాతి పేజీ ($1)',
 'prevpage' => 'మునుపటి పేజీ ($1)',
 'allpagesfrom' => 'ఇక్కడ మొదలు పెట్టి పేజీలు చూపించు:',
@@ -1893,6 +1899,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 'allpagesprefix' => 'ఈ ఆదిపదం కలిగిన పేజీలను చూపించు:',
 'allpagesbadtitle' => 'మీరిచ్చిన పేజీ పేరు సరైనది కాకపోయి ఉండాలి లేదా దానికి భాషాంతర లేదా అంతర్వికీ ఆదిపదమైనా ఉండి ఉండాలి. పేర్లలో వాడకూడని కారెక్టర్లు ఆ పేరులో ఉండి ఉండవచ్చు.',
 'allpages-bad-ns' => '{{SITENAME}} లో "$1" అనే నేమ్&zwnj;స్పేస్ లేదు.',
+'allpages-hide-redirects' => 'దారిమార్పులను దాచు',
 
 # Special:Categories
 'categories' => 'వర్గాలు',
@@ -2255,7 +2262,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'sp-contributions-submit' => 'వెతుకు',
 
 # What links here
-'whatlinkshere' => 'ఇక్కడికి లంకెలున్న పుటలు',
+'whatlinkshere' => 'ఇక్కడికి లంకెలున్నవి',
 'whatlinkshere-title' => '"$1"కి లింకున్న పుటలు',
 'whatlinkshere-page' => 'పేజీ:',
 'linkshere' => "కిందనున్న పేజీల నుండి '''[[:$1]]'''కు లింకులు ఉన్నాయి:",
@@ -2274,6 +2281,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'whatlinkshere-filters' => 'వడపోతలు',
 
 # Block/unblock
+'autoblockid' => 'tanaDDu #$1',
 'block' => 'వాడుకరి నిరోధం',
 'unblock' => 'వాడుకరిపై నిరోధాన్ని తీసెయ్యండి',
 'blockip' => 'వాడుకరి నిరోధం',
@@ -2618,10 +2626,10 @@ $UNWATCHURL కి వెళ్ళండి.
 'tooltip-pt-anonlogin' => 'మీరు లోనికి ప్రవేశించడాన్ని ప్రోత్సహిస్తాం; కానీ, అది తప్పనిసరి కాదు',
 'tooltip-pt-logout' => 'నిష్క్రమించండి',
 'tooltip-ca-talk' => 'విషయపు పుట గురించి చర్చ',
-'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°­à°¦à±\8dరపరిచేముందు మునుజూపు బొత్తాన్ని వాడండి.',
+'tooltip-ca-edit' => 'à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°¦à°¾చేముందు మునుజూపు బొత్తాన్ని వాడండి.',
 'tooltip-ca-addsection' => 'కొత్త విభాగాన్ని మొదలుపెట్టండి',
 'tooltip-ca-viewsource' => 'ఈ పుటని సంరక్షించారు. మీరు దీని మూలాన్ని చూడవచ్చు',
-'tooltip-ca-history' => 'à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\97à°¤ à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\81.',
+'tooltip-ca-history' => 'à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°µà±\86à°¨à±\81à°\95à°\9fà°¿ à°\95à±\82à°°à±\8dà°ªà±\81à°²à±\81',
 'tooltip-ca-protect' => 'ఈ పేజీని సంరక్షించండి',
 'tooltip-ca-unprotect' => 'ఈ పేజీ సంరక్షణను మార్చండి',
 'tooltip-ca-delete' => 'ఈ పేజీని తొలగించండి',
@@ -2633,24 +2641,24 @@ $UNWATCHURL కి వెళ్ళండి.
 'tooltip-search-go' => 'ఇదే పేరుతో పేజీ ఉంటే అక్కడికి తీసుకెళ్ళు',
 'tooltip-search-fulltext' => 'పేజీలలో ఈ పాఠ్యం కొరకు వెతుకు',
 'tooltip-p-logo' => 'మొదటి పుటను దర్శించండి',
-'tooltip-n-mainpage' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80ని à°¦à°°à±\8dశిà°\82à°\9aండి',
-'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\87à°\9cà±\80ని à°¦à°°à±\8dశిà°\82à°\9aండి',
+'tooltip-n-mainpage' => 'తలపà±\81à°\9fà°¨à±\81 à°\9aà±\82à°¡ండి',
+'tooltip-n-mainpage-description' => 'à°®à±\8aà°¦à°\9fà°¿ à°ªà±\81à°\9fà°¨à±\81 à°\9aà±\82à°¡ండి',
 'tooltip-n-portal' => 'ప్రాజెక్టు గురించి, మీరేం చేయవచ్చు, సమాచారం ఎక్కడ దొరుకుతుంది',
-'tooltip-n-currentevents' => 'వరà±\8dతమాన à°\98à°\9fనలà°\95à±\81 à°¸à°\82à°¬à°\82ధిà°\82à°\9aà°¿à°¨ à°¸à°®à°¾à°\9aారానà±\8dని à°ªà±\8aà°\82à°¦à°\82à°¡à°¿.',
+'tooltip-n-currentevents' => 'à°\87à°ªà±\8dà°ªà°\9fà°¿ à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¨à±\81à°ªà°\9fà°¿ à°®à°\82దలనà±\81 à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8aà°¨à±\81à°¡à°¿',
 'tooltip-n-recentchanges' => 'వికీలో ఇటీవల జరిగిన మార్పుల జాబితా.',
 'tooltip-n-randompage' => 'ఓ యాదృచ్చిక పేజీని చూడండి',
 'tooltip-n-help' => 'తెలుసుకోడానికి ఓ మంచి ప్రదేశం.',
-'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°\95à°¿ à°²à°¿à°\82à°\95యి à°\89à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\87à°\9cà±\80లు',
-'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\87à°\9cà±\80à°¨à±\81à°\82à°¡à°¿ à°²à°¿à°\82à°\95à±\81à°¨à±\8dà°¨ à°ªà±\87à°\9cà±\80à°²à°\95à±\81 జరిగిన ఇటీవలి మార్పులు',
+'tooltip-t-whatlinkshere' => 'à°\87à°\95à±\8dà°\95à°¡à°¿à°¤à±\8b à°®à±\81డిపడియà±\81à°¨à±\8dà°¨ à°\85à°¨à±\8dని à°µà°¿à°\95à±\80 à°ªà±\81à°\9fà°² à°²à°\82à°\95à±\86లు',
+'tooltip-t-recentchangeslinked' => 'à°\88 à°ªà±\81à°\9fà°\95à±\81 à°®à±\81డివడియà±\81à°¨à±\8dà°¨ à°ªà±\81à°\9fలలà±\8b జరిగిన ఇటీవలి మార్పులు',
 'tooltip-feed-rss' => 'ఈ పేజీకి RSS ఫీడు',
 'tooltip-feed-atom' => 'ఈ పేజీకి Atom ఫీడు',
 'tooltip-t-contributions' => 'ఈ వాడుకరి యొక్క రచనల జాబితా చూడండి',
 'tooltip-t-emailuser' => 'ఈ వాడుకరికి ఓ ఈమెయిలు పంపండి',
 'tooltip-t-upload' => 'దస్త్రాలను ఎక్కించండి',
 'tooltip-t-specialpages' => 'అన్ని ప్రత్యేక పుటల యొక్క జాబితా',
-'tooltip-t-print' => 'à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°®à±\81à°¦à±\8dరణా కూర్పు',
-'tooltip-t-permalink' => 'à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\88 à°\95à±\82à°°à±\8dà°ªà±\81à°\95à°¿ à°¶à°¾à°¶à±\8dవత à°²à°¿à°\82à°\95à±\81',
-'tooltip-ca-nstab-main' => 'విషయపà±\81 à°ªà±\87à°\9cà±\80ని చూడండి',
+'tooltip-t-print' => 'à°\88 à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°\85à°\9aà±\8dà°\9aà±\81à°¤à±\80యదà°\97à±\8dà°\97 కూర్పు',
+'tooltip-t-permalink' => 'à°ªà±\81à°\9f à°¯à±\8aà°\95à±\8dà°\95 à°\88 à°\95à±\82à°°à±\8dà°ªà±\81à°\95à°¿ à°¶à°¾à°¶à±\8dవత à°²à°\82à°\95à±\86',
+'tooltip-ca-nstab-main' => 'à°®à±\81à°\9aà±\8dà°\9aà°\9fà±\8dà°² à°ªà±\81à°\9fà°¨à±\81 చూడండి',
 'tooltip-ca-nstab-user' => 'వాడుకరి పేజీని చూడండి',
 'tooltip-ca-nstab-media' => 'మీడియా పేజీని చూడండి',
 'tooltip-ca-nstab-special' => 'ఇది ఒక ప్రత్యేక పుట, దీన్ని మీరు సరిదిద్దలేరు',
@@ -3471,6 +3479,10 @@ $5
 '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-newusers-newusers' => '$1 వాడుకరి ఖాతాను సృష్టించారు',
 'logentry-newusers-create' => '$1 ఒక వాడుకరి ఖాతాను సృష్టించారు',
 'logentry-newusers-create2' => '$1  వాడుకరి ఖాతా $3ను సృష్టించారు',
@@ -3491,6 +3503,7 @@ $5
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
 'api-error-empty-file' => 'మీరు దాఖలుచేసిన ఫైల్ ఖాళీది.',
+'api-error-emptypage' => 'కొత్త మరియు ఖాళీ పేజీలను సృష్టించడానికి అనుమతి లేదు.',
 'api-error-filename-tooshort' => 'దస్త్రపు పేరు మరీ చిన్నగా ఉంది.',
 'api-error-filetype-banned' => 'ఈ రకపు దస్త్రాలని నిషేధించారు.',
 'api-error-http' => 'అంతర్గత దోషము: సేవకానికి అనుసంధానమవలేకపోతున్నది.',
@@ -3505,4 +3518,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 f0915d8..4ba5883 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tetum (Tetun)
+/** Tetum (tetun)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -346,7 +346,7 @@ Check your spelling, ka [[Special:UserLogin/signup|kria konta foun]].',
 'newarticle' => '(Foun)',
 'noarticletext' => "Iha momentu lá'os testu iha pájina ne'e, bele [[Special:Search/{{PAGENAME}}|buka naran pájina nian]] iha pájina seluk, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs], ka [{{fullurl:{{FULLPAGENAME}}|action=edit}} edita pájina ne'e]</span>.",
 'previewnote' => "'''Ne'e de'it pájina ba kontrola.'''
-Ita-nia mudansa la armazenadu seidauk! [[#editform|→ Nafatin edita]]",
+Ita-nia mudansa la armazenadu seidauk!",
 'editing' => 'Edita $1',
 'editingsection' => 'Edita $1 (seksaun)',
 'editingcomment' => 'Edita $1 (seksaun foun)',
index 919b4c7..534440a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tajik (Cyrillic script) (Тоҷикӣ)
+/** Tajik (Cyrillic script) (тоҷикӣ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -798,7 +798,6 @@ $1',
 
 # Diffs
 'history-title' => 'Таърихчаи вироишҳои "$1"',
-'difference' => '(Фарқияти байни нусхаҳо)',
 'lineno' => 'Сатри $1:',
 'compareselectedversions' => 'Нусхаҳои интихобшударо муқоиса кунед',
 'editundo' => 'ботил',
@@ -1026,7 +1025,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|тағйир|тағйирот}}',
 'recentchanges' => 'Тағйироти охирин',
 'recentchanges-legend' => 'Ихтиёроти тағйироти охирин',
-'recentchangestext' => 'Назорати тағйиротҳои навтарин дар Википедиа дар ҳамин саҳифа аст.',
+'recentchanges-summary' => 'Назорати тағйиротҳои навтарин дар Википедиа дар ҳамин саҳифа аст.',
 'recentchanges-feed-description' => 'Радёбии охирин тағйироти ин вики дар ин хурд.',
 'rcnote' => "Дар поён  {{PLURAL:$1|'''1''' тағйире аст|'''$1''' тағйирот мебошанд}}, ки дар давоми {{PLURAL:$2|рӯҳ|'''$2''' рӯзҳои}} охир, сар карда аз $5, $4.",
 'rcnotefrom' => 'Дар зер тағйиротҳои охирин аз <b>$2</b> (то <b>$1</b> нишон дода шудааст).',
index 913d6ae..2ab317f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tajik (Latin script) (Tojikī)
+/** Tajik (Latin script) (tojikī)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -689,7 +689,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 
 # Diffs
 'history-title' => 'Ta\'rixcai viroişhoi "$1"',
-'difference' => '(Farqijati bajni nusxaho)',
 'lineno' => 'Satri $1:',
 'compareselectedversions' => 'Nusxahoi intixobşudaro muqoisa kuned',
 'editundo' => 'botil',
@@ -909,7 +908,7 @@ On bojad kamtar az $1 {{PLURAL:$1|alomat|alomatho}} boşad.',
 'nchanges' => '$1 {{PLURAL:$1|taƣjir|taƣjirot}}',
 'recentchanges' => 'Taƣjiroti oxirin',
 'recentchanges-legend' => 'Ixtijoroti taƣjiroti oxirin',
-'recentchangestext' => 'Nazorati taƣjirothoi navtarin dar Vikipedia dar hamin sahifa ast.',
+'recentchanges-summary' => 'Nazorati taƣjirothoi navtarin dar Vikipedia dar hamin sahifa ast.',
 'recentchanges-feed-description' => 'Radjobiji oxirin taƣjiroti in viki dar in xurd.',
 'rcnote' => "Dar pojon  {{PLURAL:$1|'''1''' taƣjire ast|'''$1''' taƣjirot meboşand}}, ki dar davomi {{PLURAL:$2|rūh|'''$2''' rūzhoi}} oxir, sar karda az $5, $4.",
 'rcnotefrom' => 'Dar zer taƣjirothoi oxirin az <b>$2</b> (to <b>$1</b> nişon doda şudaast).',
index f26f2f0..0a65a7e 100644 (file)
@@ -224,9 +224,11 @@ $messages = array(
 'tog-watchlisthideliu' => 'ซ่อนการแก้ไขโดยผู้ใช้ล็อกอินจากรายการเฝ้าดู',
 'tog-watchlisthideanons' => 'ซ่อนการแก้ไขโดยผู้ใช้นิรนามจากรายการเฝ้าดู',
 'tog-watchlisthidepatrolled' => 'ซ่อนการแก้ไขที่ตรวจแล้วจากรายการเฝ้าดู',
+'tog-nolangconversion' => 'ปิดใช้งานการแปลงอักษรต่างรูป',
 'tog-ccmeonemails' => 'ส่งสำเนาอีเมลกลับมาทุกครั้งที่ส่งหาคนอื่น',
 'tog-diffonly' => 'ไม่แสดงเนื้อหาใต้ส่วนต่างการแก้ไข',
 'tog-showhiddencats' => 'แสดงหมวดหมู่ที่ซ่อนอยู่',
+'tog-noconvertlink' => 'ปิดใช้งานการแปลงชื่อเรื่องของลิงก์',
 'tog-norollbackdiff' => 'ข้ามแสดงความเปลี่ยนแปลงหลังจากดำเนินการย้อนกลับ',
 
 'underline-always' => 'เสมอ',
@@ -720,7 +722,9 @@ $1',
 'headline_tip' => 'หัวข้อ',
 'nowiki_sample' => 'ใส่ข้อความที่ไม่จัดรูปแบบ',
 'nowiki_tip' => 'ข้ามการจัดรูปแบบวิกิ',
+'image_sample' => 'ตัวอย่าง.jpg',
 'image_tip' => 'ใส่ภาพ',
+'media_sample' => 'ตัวอย่าง.ogg',
 'media_tip' => 'เชื่อมโยงไฟล์สื่อ',
 'sig_tip' => 'ลายเซ็นพร้อมลงเวลา',
 'hr_tip' => 'เส้นนอน',
@@ -799,11 +803,12 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 'userpage-userdoesnotexist-view' => 'ไม่มีบัญชีผู้ใช้ลงทะเบียนในชื่อ "$1"',
 'blocked-notice-logextract' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก
 ปูมการบล็อกล่าสุดแสดงด้านล่างนี้เพื่อการอ้างอิง:',
-'clearyourcache' => "'''คำแนะนำ:''' หลังจากบันทึกผลแล้ว คุณอาจจะต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูผลการเปลี่ยนแปลง <br />
-'''มอซิลลา / ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะกดปุ่ม ''รีโหลด'' หรือกด  ''Ctrl-F5'' หรือกด ''Ctrl-R'' (''Command-R'' สำหรับเครื่องแมคอินทอช); <br />
-'''คองเคอเรอร์:''' กดปุ่ม ''รีโหลด'' หรือกด ''F5;'' <br />
-'''โอเปร่า:''' อาจต้องล้างแคชทั้งหมดผ่านเมนู ''Tools → Preferences;'' <br />
-'''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กด  ''Ctrl'' ค้างไว้ขณะที่กดปุ่ม ''รีเฟรช'' หรือกด ''Ctrl-F5;''",
+'clearyourcache' => "'''หมายเหตุ:''' หลังจากบันทึกแล้ว คุณอาจจะต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
+* '''ไฟร์ฟอกซ์ / ซาฟารี:''' กดปุ่ม ''Shift'' ค้างไว้ขณะคลิก ''Reload'' หรือกดปุ่ม ''Ctrl-F5'' หรือ ''Ctrl-R'' (''⌘-R'' บนแมคอินทอช)
+* '''กูเกิล โครม:''' กดปุ่ม ''Ctrl-Shift-R'' (''⌘-Shift-R'' บนแมคอินทอช)
+* '''อินเทอร์เน็ตเอกซ์พลอเรอร์:''' กดปุ่ม ''Ctrl'' ค้างไว้ขณะคลิก ''Refresh'' หรือกดปุ่ม ''Ctrl-F5''
+* '''คองเคอเรอร์:''' คลิก ''Reload'' หรือกดปุ่ม ''F5''
+* '''โอเปร่า:''' ล้างแคชในเมนู ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม \"{{int:showpreview}}\" เพื่อทดสอบ CSS สไตล์ชีทก่อนทำการบันทึก",
 'userjsyoucanpreview' => "'''คำแนะนำ:''' กดปุ่ม 'แสดงตัวอย่าง' เพื่อทดสอบสไตล์ชีตหรือจาวาสคริปต์ก่อนทำการบันทึก",
 'usercsspreview' => "'''อย่าลืมว่าสไตล์ชีตที่คุณสร้างยังไม่ได้ถูกบันทึก'''
@@ -816,7 +821,8 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 'userinvalidcssjstitle' => "'''คำเตือน:''' ไม่มีแบบหน้าตา \"\$1\" อย่าลืมว่าหน้า .css และ .js ที่ปรับแต่งเอง ใช้เป็นอักษรตัวพิมพ์เล็กทั้งหมด เช่น ใช้ {{ns:user}}:Foo/vector.css แทนที่จะเป็น {{ns:user}}:Foo/Vector.css",
 'updated' => '(ปรับปรุงแล้ว)',
 'note' => "'''คำแนะนำ:'''",
-'previewnote' => "'''พึงระลึกว่านี่เป็นเพียงตัวอย่างเท่านั้น การเปลี่ยนแปลงของคุณยังไม่ได้ถูกบันทึก!'''",
+'previewnote' => "'''พึงระลึกว่านี่เป็นเพียงตัวอย่างเท่านั้น'''
+การเปลี่ยนแปลงของคุณยังไม่ได้ถูกบันทึก!",
 'previewconflict' => 'การแสดงผลส่วนนี้เป็นตัวอย่างของการแก้ไขด้านบน  ถ้ากดบันทึกการแสดงผลจะแสดงในลักษณะนี้ทันที',
 'session_fail_preview' => "'''ขออภัย ไม่สามารถดำเนินการแก้ไขต่อได้ เนื่องจากข้อมูลเชื่อมต่อสูญหาย
 ให้ทดลองแก้ไขอีกครั้งหนึ่ง ถ้ายังไม่สามารถทำได้ ให้ลองล็อกเอาต์และล็อกอินกลับมาอีกครั้ง'''",
@@ -830,6 +836,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 ในบางครั้งปัญหานี้จะเกิดขึ้นถ้าคุณใช้บริการเว็บพร็อกซีนิรนามที่มีบั๊ก",
 'edit_form_incomplete' => "'''บางส่วนของแบบฟอร์มแก้ไขไม่ได้ติดต่อเซิร์ฟเวอร์ ตรวจสอบอีกครั้งว่าการแก้ไขของคุณยังคงอยู่และลองใหม่อีกครั้ง'''",
 'editing' => 'กำลังแก้ไข $1',
+'creating' => 'สร้างหน้า $1',
 'editingsection' => 'กำลังแก้ไข $1 (เฉพาะส่วน)',
 'editingcomment' => 'กำลังแก้ไข $1 (หัวข้อใหม่)',
 'editconflict' => 'แก้ไขชนกัน: $1',
@@ -951,35 +958,35 @@ $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' => '[ชื่อผู้ใช้หรือหมายเลขไอพีถูกลบแล้ว - การแก้ไขถูกซ่อนจากรายการแก้ไข]',
 'rev-deleted-text-permission' => "รุ่นการปรับปรุงนี้ของหน้านี้'''ถูกลบแล้ว'''
 รายละเอียดอาจยังคงมีอยู่ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} บันทึกการลบ]",
-'rev-deleted-text-unhide' => "รุà¹\88à¸\99à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9aà¹\81ลà¹\89ว'''
-รายละà¹\80อียà¸\94อาà¸\88ยัà¸\87à¸\84à¸\87มีอยูà¹\88à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9aัà¸\99à¸\97ึà¸\81การลบ]
-สำหรัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¹\80รียà¸\81à¸\94ูรุà¹\88à¸\99à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89]หาà¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81าร",
-'rev-suppressed-text-unhide' => "à¸\89à¸\9aัà¸\9aà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ยัà¸\9aยัà¹\89à¸\87à¹\81ลà¹\89ว'''
-à¸\8bึà¹\88à¸\87อาà¸\88มีรายละà¹\80อียà¸\94à¹\83à¸\99 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bระวัà¸\95ิการยับยั้ง]
¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\89à¸\9aัà¸\9aà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81าร",
-'rev-deleted-text-view' => "รุà¹\88à¸\99à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9aà¹\81ลà¹\89ว'''
-สำหรัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93ยัà¸\87สามารà¸\96à¹\80รียà¸\81à¸\94ูà¹\84à¸\94à¹\89 à¸£à¸²à¸¢à¸¥à¸°à¹\80อียà¸\94อาà¸\88ยัà¸\87à¸\84à¸\87มีอยูà¹\88à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9aัà¸\99à¸\97ึà¸\81การลบ]",
-'rev-suppressed-text-view' => "à¸\89à¸\9aัà¸\9aà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ยัà¸\9aยัà¹\89à¸\87à¹\81ลà¹\89ว'''
¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¸\84ุà¸\93à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9aà¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\89à¸\9aัà¸\9aà¸\9bรัà¸\9aà¸\9bรุà¸\87à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87อาà¸\88à¸\88ะมีรายละà¹\80อียà¸\94à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bระวัà¸\95ิการยับยั้ง]",
+'rev-deleted-text-unhide' => "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ลà¸\9aออà¸\81'''
+รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมการลบ]
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\95à¹\88อ",
+'rev-suppressed-text-unhide' => "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ยัà¸\9aยัà¹\89à¸\87à¹\84วà¹\89'''
+รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมการยับยั้ง]
¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\95à¹\88อ",
+'rev-deleted-text-view' => "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ลà¸\9aออà¸\81'''
+à¸\84ุà¸\93สามารà¸\96à¸\94ูรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมการลบ]",
+'rev-suppressed-text-view' => "รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\82อà¸\87หà¸\99à¹\89าà¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ยัà¸\9aยัà¹\89à¸\87à¹\84วà¹\89'''
¸\84ุà¸\93สามารà¸\96à¸\94ูรุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมการยับยั้ง]",
 'rev-deleted-no-diff' => "คุณไม่สามารถเรียกดูความเปลี่ยนแปลงนี้ เนื่องจากรุ่นการปรับปรุงที่นำมาเปรียบเทียบมีบางรุ่น'''ถูกลบออก'''
 รายละเอียดอาจยังคงมีอยู่ใน[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} บันทึกการลบ]",
 'rev-suppressed-no-diff' => "คุณไม่สามารถดูความแตกต่างระหว่างรุ่นที่เลือกได้ เนื่องจากมีความแตกต่างระหว่างรุ่นที่'''ถูกลบ'''",
-'rev-deleted-unhide-diff' => "รุà¹\88à¸\99à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\9aาà¸\87รุà¹\88à¸\99à¸\82อà¸\87à¸\84วามà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87à¸\99ีà¹\89'''à¸\96ูà¸\81ลà¸\9aà¹\81ลà¹\89ว'''
-รายละà¹\80อียà¸\94อาà¸\88ยัà¸\87à¸\84à¸\87มีอยูà¹\88à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9aัà¸\99à¸\97ึà¸\81การลบ]
-สำหรัà¸\9aà¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¹\80รียà¸\81à¸\94ูรุà¹\88à¸\99à¸\81ารà¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\99ีà¹\89]หาà¸\81à¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81าร",
+'rev-deleted-unhide-diff' => "หà¸\99ึà¹\88à¸\87à¹\83à¸\99รุà¹\88à¸\99à¸\9bรัà¸\9aà¸\9bรุà¸\87à¸\97ัà¹\89à¸\87หมà¸\94à¸\82อà¸\87รายà¸\81ารà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89à¸\96ูà¸\81'''ลà¸\9aออà¸\81'''
+รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมการลบ]
+à¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\95à¹\88อ",
 'rev-suppressed-unhide-diff' => "หนึ่งในรุ่นปรับปรุงทั้งหมดของรายการความแตกต่างนี้ได้ถูก'''ยับยั้งไว้'''
-à¸\8bึà¹\88à¸\87อาà¸\88à¸\88ะมีรายละà¹\80อียà¸\94à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸£à¸²à¸¢การยับยั้ง]
¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93สามารà¸\96 [$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¹\84à¸\94à¹\89]à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81าร",
+รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมการยับยั้ง]
¸\84ุà¸\93ยัà¸\87สามารà¸\96[$1 à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89]à¹\84à¸\94à¹\89à¸\96à¹\89าà¸\84ุà¸\93à¸\95à¹\89อà¸\87à¸\81ารà¸\94ำà¹\80à¸\99ิà¸\99à¸\95à¹\88อ",
 'rev-deleted-diff-view' => "หนึ่งในรุ่นปรับปรุงทั้งหมดของรายการความแตกต่างนี้ได้ถูก'''ลบออก'''
¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87อาà¸\88à¸\88ะมีรายละà¹\80อียà¸\94à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸£à¸²à¸¢การลบ]",
¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} à¸\9bูมการลบ]",
 'rev-suppressed-diff-view' => "หนึ่งในรุ่นปรับปรุงทั้งหมดของรายการความแตกต่างนี้ได้ถูก'''ยับยั้งไว้'''
¹\83à¸\99à¸\90าà¸\99ะà¸\97ีà¹\88à¹\80à¸\9bà¹\87à¸\99à¸\9cูà¹\89à¸\94ูà¹\81ลระà¸\9aà¸\9a à¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87อาà¸\88à¸\88ะมีรายละà¹\80อียà¸\94à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸£à¸²à¸¢à¸\81ารยัà¸\87ยั้ง]",
¸\84ุà¸\93สามารà¸\96à¸\94ูà¸\84วามà¹\81à¸\95à¸\81à¸\95à¹\88าà¸\87à¸\99ีà¹\89à¹\84à¸\94à¹\89 à¸\8bึà¹\88à¸\87รายละà¹\80อียà¸\94สามารà¸\96à¸\9eà¸\9aà¹\84à¸\94à¹\89à¹\83à¸\99[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} à¸\9bูมà¸\81ารยัà¸\9aยั้ง]",
 'rev-delundel' => 'แสดง/ซ่อน',
 'rev-showdeleted' => 'แสดง',
 'revisiondelete' => 'รุ่นการปรับปรุง การลบ/การย้อนการลบ',
@@ -1047,8 +1054,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'บันทึกการระงับ',
-'suppressionlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ือรายà¸\81ารลà¸\9aà¹\81ละระà¸\87ัà¸\9a à¸£à¸§à¸¡à¹\84à¸\9bà¸\96ึà¸\87à¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¹\82à¸\94ยผู้ดูแลระบบ
-ดู [[Special:IPBlockList|รายการหมายเลขไอพีที่ถูกระงับ]] สำหรับรายการระงับและห้ามใช้ที่ยังมีผลอยู่',
+'suppressionlogtext' => 'à¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\99ีà¹\89à¸\84ือรายà¸\81ารà¸\81ารลà¸\9aà¹\81ละà¸\81ารà¸\9aลà¹\87อà¸\81à¸\97ีà¹\88à¹\80à¸\81ีà¹\88ยวà¸\82à¹\89อà¸\87à¸\81ัà¸\9aà¹\80à¸\99ืà¹\89อหาà¸\97ีà¹\88à¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¸\88าà¸\81ผู้ดูแลระบบ
+ดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน',
 
 # History merging
 'mergehistory' => 'ประวัติการรวมหน้า',
@@ -1080,8 +1087,7 @@ $1",
 'mergelogpagetext' => 'ด้านล่างนี้แสดงรายการล่าสุดของการรวมประวัติหน้าหนึ่งๆ เข้ากับอีกหน้าหนึ่ง',
 
 # Diffs
-'history-title' => 'ประวัติการแก้ไขหน้า "$1"',
-'difference' => '(ความแตกต่างระหว่างรุ่นปรับปรุง)',
+'history-title' => 'ประวัติรุ่นปรับปรุงของ "$1"',
 'difference-multipage' => '(ความแตกต่างระหว่างหน้าต่างๆ)',
 'lineno' => 'แถว $1:',
 'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
@@ -1246,7 +1252,7 @@ $1",
 'prefs-registration' => 'วันเวลาที่ลงทะเบียน:',
 'yourrealname' => 'ชื่อจริง:',
 'yourlanguage' => 'ภาษา:',
-'yourvariant' => 'ภาษาอืà¹\88à¸\99',
+'yourvariant' => 'อัà¸\81ษรà¸\95à¹\88าà¸\87รูà¸\9bà¸\82อà¸\87à¹\80à¸\99ืà¹\89อหา:',
 'yournick' => 'ลายเซ็น:',
 'prefs-help-signature' => 'คอมเมนต์ในหน้าพูดคุยควรจะเซ็นด้วย "<nowiki>~~~~</nowiki>" ซึ่งจะถูกแปลงเป็นลายเซ็นและลงวันที่เขียน',
 'badsig' => 'ลายเซ็นที่ใช้ผิดพลาด กรุณาตรวจสอบคำสั่งเอชทีเอ็มแอล',
@@ -1299,7 +1305,7 @@ $1",
 'userrights-no-interwiki' => 'คุณไม่ได้รับสิทธิในการแก้ไขสิทธิของผู้ใช้บนวิกิอื่นๆ',
 'userrights-nodatabase' => 'ไม่มีฐานข้อมูล $1 อยู่ หรือ ฐานข้อมูลอยู่บนเครื่องอื่น',
 'userrights-nologin' => 'คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ใช้ที่เป็นผู้ดูแลสิทธิแต่งตั้ง จึงจะสามารถกำหนดสิทธิต่างๆ ของผู้ใช้ได้',
-'userrights-notallowed' => 'à¸\9aัà¸\8dà¸\8aีà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aสิà¸\97à¸\98ิà¹\83à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82สิทธิของผู้ใช้',
+'userrights-notallowed' => 'à¸\9aัà¸\8dà¸\8aีà¸\82อà¸\87à¸\84ุà¸\93à¹\84มà¹\88à¹\84à¸\94à¹\89รัà¸\9aอà¸\99ุà¸\8dาà¸\95à¹\83หà¹\89à¹\80à¸\9eิà¹\88มหรือลà¸\94สิทธิของผู้ใช้',
 'userrights-changeable-col' => 'กลุ่มที่คุณสามารถเปลี่ยนได้',
 'userrights-unchangeable-col' => 'กลุ่มที่คุณไม่สามารถเปลี่ยนได้',
 
@@ -1434,7 +1440,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|การแก้ไข|การแก้ไข}}',
 'recentchanges' => 'ปรับปรุงล่าสุด',
 'recentchanges-legend' => 'ตัวเลือกปรับปรุงล่าสุด',
-'recentchangestext' => 'ในหน้านี้เป็นรายการล่าสุดที่มีการปรับปรุง',
+'recentchanges-summary' => 'ในหน้านี้เป็นรายการล่าสุดที่มีการปรับปรุง',
 'recentchanges-feed-description' => 'ฟีดนี้แสดงการเปลี่ยนแปลงล่าสุด',
 'recentchanges-label-newpage' => 'การแก้ไขนี้เป็นการสร้างหน้าใหม่',
 'recentchanges-label-minor' => 'เป็นการแก้ไขเล็กน้อย',
@@ -1668,9 +1674,8 @@ $1',
 'upload_source_file' => ' (ไฟล์จากคอมพิวเตอร์คุณ)',
 
 # Special:ListFiles
-'listfiles-summary' => 'หน้าพิเศษนี้แสดงไฟล์ทั้งหมดที่ถูกอัปโหลด
-โดยปริยาย ไฟล์ที่ถูกอัปโหลดล่าสุด จะแสดงอยู่บนสุดของรายการไฟล์
-คลิกที่คอมลัมน์บนสุดจะเปลี่ยนการจัดแยกประเภท',
+'listfiles-summary' => 'หน้าพิเศษนี้แสดงไฟล์ทั้งหมดที่อัปโหลด
+เมื่อกรองตามผู้ใช้แล้ว จะแสดงเฉพาะไฟล์รุ่นล่าสุดที่ผู้ใช้นั้นอัปโหลด',
 'listfiles_search_for' => 'ค้นหาชื่อภาพ:',
 'imgfile' => 'ไฟล์',
 'listfiles' => 'รายชื่อไฟล์',
@@ -1699,7 +1704,7 @@ $1',
 'filehist-filesize' => 'ขนาดไฟล์',
 'filehist-comment' => 'ความเห็น',
 'filehist-missing' => 'ไฟล์หายไป',
-'imagelinks' => 'หà¸\99à¹\89าà¸\97ีà¹\88มีà¹\84à¸\9fลà¹\8cà¸\99ีà¹\89',
+'imagelinks' => 'à¸\81ารà¹\83à¸\8aà¹\89à¹\84à¸\9fลà¹\8c',
 'linkstoimage' => '{{PLURAL:$1|หน้า|หน้า}}ที่ลิงก์มายังไฟล์นี้:',
 'linkstoimage-more' => 'ไฟล์นี้มีการเชื่อมโยงมากกว่า $1 {{PLURAL:$1|แห่ง|แห่ง}}
 รายชื่อต่อไปนี้แสดงการเชื่อมโยง $1 {{PLURAL:$1|แห่งแรก|แห่งแรก}}ที่มายังไฟล์นี้เท่านั้น
@@ -1794,7 +1799,7 @@ $1',
 'statistics-users-active-desc' => 'ผู้ใช้ที่ได้แก้ไขในช่วง $1 วันที่ผ่านมา',
 'statistics-mostpopular' => 'หน้าที่มีการเข้าชมมากที่สุด',
 
-'disambiguations' => 'หน้าแก้ความกำกวม',
+'disambiguations' => 'หà¸\99à¹\89าà¸\97ีà¹\88à¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87à¸\81ัà¸\9aหà¸\99à¹\89าà¹\81à¸\81à¹\89à¸\84วามà¸\81ำà¸\81วม',
 'disambiguationspage' => 'Template:แก้กำกวม',
 'disambiguations-text' => "หน้าต่อไปนี้เชื่อมโยงไปยัง '''หน้าคำกำกวม''' ซึ่งเนื้อหาในหน้าเหล่านั้นควรถูกเชื่อมโยงไปยังหัวข้อที่เหมาะสมแทนที่<br />
 
@@ -1894,7 +1899,7 @@ $1',
 
 # Special:Log
 'specialloguserlabel' => 'ผู้ดำเนินการ:',
-'speciallogtitlelabel' => 'à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87:',
+'speciallogtitlelabel' => 'à¹\80à¸\9bà¹\89าหมาย (à¸\8aืà¹\88อà¹\80รืà¹\88อà¸\87หรือà¸\9cูà¹\89à¹\83à¸\8aà¹\89):',
 'log' => 'ปูม',
 'all-logs-page' => 'ปูมสาธารณะทั้งหมด',
 'alllogstext' => 'แสดงปูมทั้งหมดของ{{SITENAME}}
@@ -1938,8 +1943,9 @@ $1',
 'linksearch-pat' => 'รูปแบบการค้นหา:',
 'linksearch-ns' => 'เนมสเปซ:',
 'linksearch-ok' => 'สืบค้น',
-'linksearch-text' => 'สามารถใช้เครื่องหมายแทนอักขระใดๆ (wildcard) ได้ เช่น "*.wikipedia.org"<br />
-โปรโตคอลที่รองรับ: <tt>$1</tt>',
+'linksearch-text' => 'อักขระตัวแทนเช่น "*.wikipedia.org" สามารถใช้ได้
+โดเมนระดับบนสุดจำเป็นต้องมีเป็นอย่างน้อย เช่น "*.org"<br />
+โพรโทคอลที่รองรับ: <tt>$1</tt> (อย่าใส่คำเหล่านี้ในการสืบค้นของคุณ)',
 'linksearch-line' => '$1 ถูกลิงก์จาก $2',
 'linksearch-error' => 'เครื่องหมายแทนอักขระ (wildcard) อยู่หน้าชื่อโฮสต์ได้เท่านั้น',
 
@@ -2140,7 +2146,8 @@ $UNWATCHURL
 
 # Protect
 'protectlogpage' => 'ปูมการล็อก',
-'protectlogtext' => 'รายการด้านล่างแสดงการล็อกหน้าและการปลดล็อก สำหรับหน้าที่โดนล็อกในปัจจุบันดูที่ [[Special:ProtectedPages|รายการหน้าที่ถูกล็อก]]',
+'protectlogtext' => 'ด้านล่างนี้คือรายการการเปลี่ยนแปลงการป้องกันหน้า
+ดู[[Special:ProtectedPages|รายการหน้าที่ถูกป้องกัน]]สำหรับการป้องกันหน้าในปัจจุบัน',
 'protectedarticle' => '"[[$1]]" ถูกล็อก',
 'modifiedarticleprotection' => 'เปลี่ยนระดับการล็อกสำหรับ "[[$1]]"',
 'unprotectedarticle' => 'ลบการปกป้องข้อมูลออกจาก "[[$1]]" แล้ว',
@@ -2341,8 +2348,8 @@ $1',
 'ipb-confirm' => 'ยืนยันการบล็อก',
 'badipaddress' => 'หมายเลขไอพีไม่ถูกต้อง',
 'blockipsuccesssub' => 'บล็อกสำเร็จ',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ถูกบล็อก
-<br />ดู  [[Special:BlockList|รายการไอพีที่ถูกบล็อก]] เพื่อตรวจสอบการบล็อก',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ถูกบล็อก<br />
+ดู[[Special:BlockList|รายการบล็อกไอพี]]เพื่อตรวจสอบการบล็อก',
 'ipb-blockingself' => 'คุณกำลังทำการบล็อกตัวคุณเอง คุณแน่ใจแล้วหรือว่าต้องการทำเช่นนั้น',
 'ipb-edit-dropdown' => 'แก้ไขสาเหตุการบล็อก',
 'ipb-unblock-addr' => 'เลิกบล็อก $1',
@@ -2356,7 +2363,7 @@ $1',
 'unblocked-range' => '$1 ถูกปลดบล็อกแล้ว',
 'unblocked-id' => 'เลิกบล็อก $1',
 'blocklist' => 'ผู้ใช้ที่ถูกบล็อก',
-'ipblocklist' => 'หมายà¹\80ลà¸\82à¹\84อà¸\9eีà¹\81ละà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88à¸\96ูà¸\81à¸\9aลà¹\87อà¸\81',
+'ipblocklist' => 'ผู้ใช้ที่ถูกบล็อก',
 'ipblocklist-legend' => 'ค้นหาผู้ใช้ที่ถูกระงับการใช้งาน',
 'blocklist-userblocks' => 'ซ่อนบล็อกบัญชี',
 'blocklist-tempblocks' => 'ซ่อนบล็อกชั่วคราว',
@@ -2392,7 +2399,9 @@ $1',
 ปูมการระงับแสดงไว้ด้านล่างนี้เพื่อการอ้างอิง:',
 'blocklogentry' => 'บล็อก "[[$1]]" หมดอายุ $2 $3',
 'reblock-logentry' => 'เปลี่ยนระดับการบล็อกสำหรับ [[$1]] หมดอายุ $2 $3',
-'blocklogtext' => 'ด้านล่างเป็นบันทึกการบล็อกและการเลิกบล็อก  ส่วนการบล็อกอัตโนมัติจะไม่ถูกรวมอยู่ในรายการนี้ ดู [[Special:BlockList|รายการบล็อกไอพี]] สำหรับการบล็อกทั้งหมด',
+'blocklogtext' => 'นี่คือบันทึกการบล็อกและการเลิกบล็อกผู้ใช้
+การบล็อกที่อยู่ไอพีโดยอัตโนมัติจะไม่แสดงในรายการ
+ดู[[Special:BlockList|รายการบล็อกไอพี]]สำหรับการบล็อกและการระงับในปัจจุบัน',
 'unblocklogentry' => 'เลิกบล็อก $1',
 'block-log-flags-anononly' => 'ผู้ใช้นิรนามเท่านั้น',
 'block-log-flags-nocreate' => 'ห้ามสร้างบัญชีผู้ใช้',
@@ -2590,7 +2599,8 @@ $1',
 'import-interwiki-namespace' => 'เนมสเปซปลายทาง:',
 'import-upload-filename' => 'ชื่อไฟล์:',
 'import-comment' => 'ความเห็น:',
-'importtext' => 'กรุณาส่งออกไฟล์จากวิกิอื่นโดยใช้[[Special:Export|เครื่องมือส่งออก]] บันทึก และทำการอัปโหลดมาที่นี่',
+'importtext' => 'กรุณาส่งออกไฟล์จากวิกิต้นทางโดยใช้[[Special:Export|เครื่องมือส่งออก]]
+บันทึกลงคอมพิวเตอร์ของคุณ และอัปโหลดที่นี่',
 'importstart' => 'กำลังนำเข้าหน้า...',
 'import-revision-count' => '$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}',
 'importnopages' => 'ไม่มีหน้าให้นำเข้า',
@@ -2648,7 +2658,7 @@ $1',
 'tooltip-ca-viewsource' => 'หน้านี้ถูกล็อก แต่ยังดูโค้ดได้',
 'tooltip-ca-history' => 'รุ่นที่แล้วของหน้านี้',
 'tooltip-ca-protect' => 'ล็อกหน้านี้',
-'tooltip-ca-unprotect' => 'ยà¸\81à¹\80ลิà¸\81การป้องกันหน้านี้',
+'tooltip-ca-unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลà¸\87การป้องกันหน้านี้',
 'tooltip-ca-delete' => 'ลบหน้านี้',
 'tooltip-ca-undelete' => 'เรียกคืนการแก้ไขหน้านี้กลับมาเป็นรุ่นก่อนที่ถูกลบ',
 'tooltip-ca-move' => 'เปลี่ยนชื่อหน้านี้',
@@ -2700,12 +2710,30 @@ $1',
 'tooltip-summary' => 'ใส่คำอธิบายอย่างย่อสั้น ๆ',
 
 # Stylesheets
-'common.css' => '/** CSS ที่อยู่ในหน้านี้จะมีผลต่อทุกสกินในเว็บไซต์ */',
-'monobook.css' => '/* CSS ที่อยู่ในหน้านี้จะมีผลต่อสกิน Monobook */',
+'common.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทุกสกิน */',
+'standard.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
+'nostalgia.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
+'cologneblue.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
+'monobook.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
+'myskin.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินมายสกิน */',
+'chick.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินชิก */',
+'simple.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
+'modern.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
+'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
+'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
+'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่อุปกรณ์เคลื่อนที่ โดยขึ้นอยู่กับสกินที่ตั้งค่าไว้ใน $wgHandheldStyle */',
 
 # Scripts
-'common.js' => '/* จาวาสคริปต์ในหน้านี้จะถูกใช้งานต่อผู้ใช้ทุกคน */',
-'monobook.js' => '/* ถ้าไม่เห็นด้วย ให้ใช้ [[MediaWiki:common.js]] */',
+'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */',
+'standard.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินคลาสสิก */',
+'nostalgia.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินนอสตัลเจีย */',
+'cologneblue.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโคโลญจ์บลู */',
+'monobook.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมโนบุ๊ก */',
+'myskin.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินมายสกิน */',
+'chick.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินชิก */',
+'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
+'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
+'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 
 # Metadata
 'notacceptable' => 'เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้',
@@ -2751,6 +2779,7 @@ $1',
 'skinname-chick' => 'ชิก',
 'skinname-simple' => 'ซิมเปิล',
 'skinname-modern' => 'โมเดิร์น',
+'skinname-vector' => 'เวกเตอร์',
 
 # Patrolling
 'markaspatrolleddiff' => 'ทำเครื่องหมายว่าตรวจสอบแล้ว',
@@ -2829,7 +2858,7 @@ $1',
 'metadata-help' => 'ไฟล์นี้มีข้อมูลเพิ่มเติมแนบไว้ อาจจะมาจาก กล้องดิจิทัล สแกนเนอร์ หรือเครื่องรับส่งจีพีเอส อย่างไรก็ตามข้อมูลที่เก็บไว้อาจถูกดัดแปลงถ้าไฟล์ต้นฉบับถูกแก้ไขจากซอฟต์แวร์อื่น',
 'metadata-expand' => 'แสดงข้อมูลเพิ่มเติม',
 'metadata-collapse' => 'ซ่อนข้อมูลเพิ่มเติม',
-'metadata-fields' => 'à¸\84à¹\88าà¹\80อà¸\81à¸\8bิà¸\9f (Exif) à¸\82อà¸\87ภาà¸\9eà¸\94à¹\89าà¸\99ลà¹\88าà¸\87à¸\88ะà¹\81สà¸\94à¸\87à¸\84วà¸\9aà¸\84ูà¹\88à¹\84à¸\9bà¸\81ัà¸\9aภาà¸\9e
+'metadata-fields' => 'à¹\80à¸\82à¸\95à¸\82à¹\89อมูลà¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\82อà¸\87ภาà¸\9eà¸\94ัà¸\87à¸\97ีà¹\88à¹\81สà¸\94à¸\87รายà¸\81ารà¹\84วà¹\89à¹\83à¸\99à¸\82à¹\89อà¸\84วามà¸\99ีà¹\89 à¸\88ะà¸\96ูà¸\81รวมà¸\9aà¸\99หà¸\99à¹\89าภาà¸\9eà¹\80มืà¹\88อà¸\95าราà¸\87à¹\80มà¸\97าà¹\80à¸\94à¸\95าà¸\96ูà¸\81ยุà¸\9a à¹\80à¸\82à¸\95à¸\82à¹\89อมูลอืà¹\88à¸\99 à¹\86 à¸\88ะà¸\96ูà¸\81à¸\8bà¹\88อà¸\99à¹\82à¸\94ยà¸\9bริยาย
 * make
 * model
 * datetimeoriginal
@@ -2878,8 +2907,8 @@ $1',
 'exif-colorspace' => 'สเปซสี',
 'exif-componentsconfiguration' => 'ความหมายของแต่ละคอมโพเนนต์',
 'exif-compressedbitsperpixel' => 'โหมดการบีบอัดภาพ',
-'exif-pixelydimension' => 'à¸\84วามà¸\81วà¹\89าà¸\87à¸\97ีà¹\88à¸\99ำà¹\84à¸\9bà¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89',
-'exif-pixelxdimension' => 'à¸\84วามยาวà¸\97ีà¹\88à¸\99ำà¹\84à¸\9bà¹\83à¸\8aà¹\89à¹\84à¸\94à¹\89',
+'exif-pixelydimension' => 'à¸\84วามà¸\81วà¹\89าà¸\87à¸\82อà¸\87ภาà¸\9e',
+'exif-pixelxdimension' => 'à¸\84วามสูà¸\87à¸\82อà¸\87ภาà¸\9e',
 'exif-usercomment' => 'ความเห็นผู้ใช้',
 'exif-relatedsoundfile' => 'ไฟล์เสียงที่เกี่ยวข้อง',
 'exif-datetimeoriginal' => 'วันที่และเวลาที่สร้าง',
@@ -2893,9 +2922,9 @@ $1',
 'exif-exposureprogram' => 'โปรแกรมเอกซ์โพเชอร์',
 'exif-spectralsensitivity' => 'ความไวสเปกตรัม',
 'exif-isospeedratings' => 'อัตราความเร็ว ISO',
-'exif-shutterspeedvalue' => 'à¸\84วามà¹\84วà¸\8aัà¸\95à¹\80à¸\95อรà¹\8c',
-'exif-aperturevalue' => 'รูรับแสง',
-'exif-brightnessvalue' => 'ความสว่าง',
+'exif-shutterspeedvalue' => 'à¸\84วามà¹\80รà¹\87วà¸\8aัà¸\95à¹\80à¸\95อรà¹\8c APEX',
+'exif-aperturevalue' => 'รูรับแสง APEX',
+'exif-brightnessvalue' => 'ความสว่าง APEX',
 'exif-exposurebiasvalue' => 'เอกซ์โพเชอร์ไบแอส',
 'exif-maxaperturevalue' => 'รูรับแสงกว้างสุด',
 'exif-subjectdistance' => 'ระยะวัตถุ',
@@ -2976,9 +3005,9 @@ $1',
 'exif-orientation-3' => 'ถูกหมุน 180°',
 'exif-orientation-4' => 'ถูกสลับแนวตั้ง',
 'exif-orientation-5' => 'ถูกหมุน 90° ทวนเข็มนาฬิกา และถูกสลับแนวตั้ง',
-'exif-orientation-6' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\95ามเข็มนาฬิกา',
+'exif-orientation-6' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\97วà¸\99เข็มนาฬิกา',
 'exif-orientation-7' => 'ถูกหมุน 90° ตามเข็มนาฬิกา และถูกสลับแนวตั้ง',
-'exif-orientation-8' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\97วà¸\99เข็มนาฬิกา',
+'exif-orientation-8' => 'à¸\96ูà¸\81หมุà¸\99 90° à¸\95ามเข็มนาฬิกา',
 
 'exif-planarconfiguration-1' => 'รูปแบบชังกี',
 'exif-planarconfiguration-2' => 'รูปแบบเพลนาร์',
@@ -3046,6 +3075,8 @@ $1',
 'exif-sensingmethod-7' => 'เซนเซอร์สามแนว',
 'exif-sensingmethod-8' => 'เซนเซอร์สามแนวสี',
 
+'exif-filesource-3' => 'กล้องถ่ายภาพนิ่งดิจิทัล',
+
 'exif-scenetype-1' => 'ภาพถ่ายโดยตรง',
 
 'exif-customrendered-0' => 'โพลเซสส์ปกติ',
index 48ab680..e840332 100644 (file)
@@ -7,10 +7,12 @@
  * @ingroup Language
  * @file
  *
+ * @author Amire80
  * @author Cekli829
  * @author Flrn
  * @author Hanberke
  * @author Kaganer
+ * @author Reedy
  * @author Runningfridgesrule
  * @author The Evil IP address
  */
@@ -146,7 +148,7 @@ $messages = array(
 'dec' => 'dek',
 
 # Categories related messages
-'pagecategories' => 'Sahypanyň {{PLURAL:$1|kategoriýasy|kategoriýalary}}',
+'pagecategories' => '{{PLURAL:$1|Kategoriýa|Kategoriýalar}}',
 'category_header' => '"$1" kategoriýasyndaky sahypalar',
 'subcategories' => 'Kiçi kategoriýalar',
 'category-media-header' => '"$1" kategoriýasyndaky multimediýa faýllary',
@@ -297,7 +299,7 @@ Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Specia
 
 'ok' => 'OK',
 'retrievedfrom' => '"$1" adresinden alyndy.',
-'youhavenewmessages' => 'Size <u>$1</u> bar. ($2)',
+'youhavenewmessages' => 'Size $1 bar. ($2)',
 'newmessageslink' => 'täze habarlaşyk',
 'newmessagesdifflink' => 'soňky üýtgeşme',
 'youhavenewmessagesmulti' => 'Size $1-de täze habarlaşyk bar.',
@@ -445,6 +447,7 @@ Hasabyňyz açyldy.
 'createaccount' => 'Täze hasap aç',
 'gotaccount' => "Eýýäm hasap açdyňyzmy? '''$1'''.",
 'gotaccountlink' => 'Onda giriberiň!',
+'userlogin-resetlink' => 'Giriş maglumatlaryňyzy ýatdan çykardyňyzmy?',
 'createaccountmail' => 'e-poçta bilen',
 'createaccountreason' => 'Sebäp:',
 'badretype' => 'Girizen parollaryňyz biri-birine gabat gelmeýär.',
@@ -646,7 +649,7 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
 Hususy .css we .js sahypalarynyň setir harp bilen ýazylýandygyny ýatda saklaň, ýagny {{ns:user}}:Ulanyjy/Vector.css däl-de, eýsem {{ns:user}}:Ulanyjy/vector.css.",
 'updated' => '(Täzelenen)',
 'note' => "'''Bellik:'''",
-'previewnote' => "'''Bu bir ýöne deslapky syn. Üýtgeşmeleriňiz heniz ýazdyrylan däldir!'''",
+'previewnote' => "'''Ýatda saklaň, bu bir ýöne deslapky syn.''' Üýtgeşmeleriňiz heniz ýazdyrylan däldir!",
 'previewconflict' => 'Bu deslapky syn redaktirleme penjiresiniň üstünde ýerleşip, ol ýazdyran mahalyňyz sahypanyň nähili görünjekdigini görkezýär.',
 'session_fail_preview' => "'''Bagyşlaň! Sessiýa maglumatynyň ýitirilmegi zerarly serwer özgerdişiňizi işläp bilenok.'''
 Gaýtadan synanyşmagyňyzy haýyş edýäris.
@@ -677,10 +680,10 @@ Sahypalary howpsuz ýagdaýda rdaktirlemegiňiz şeýle aýlawly ýol bar: ASCII
 'editingold' => "'''Duýdyryş: Sahypanyň möwriti geçen bir wersiýasyny redaktirleýärsiňiz.
 Eger ony ýazdyraýsaňyz, onda şu wersiýadan bäri edilen ähli özgerdişler ýok bolar.'''",
 'yourdiff' => 'Aratapawutlar',
-'copyrightwarning' => "'''Üns beriň:''' {{SITENAME}} saýtyna edilen ähli goşantlar <i>$2</i> ygtyýarnamasyna laýyklykdadyr (jikme-jiklikler üçin serediň:  $1).
+'copyrightwarning' => "'''Üns beriň:''' {{SITENAME}} saýtyna edilen ähli goşantlar $2 ygtyýarnamasyna laýyklykdadyr (jikme-jiklikler üçin serediň:  $1).
 Eden goşandyňyzyň başga ulanyjylar tarapyndan gypynç etmezden redaktirlenmegini ýa-da erkin hem-de çäklendirilmedik tertipde başga ýerlere paýlanmagyny islemeýän bolsaňyz, goşant etmäň.<br />
 Mundan hem başga, siz bu ýere goşant goşmak bilen bu goşandyň özüňiz tarapyndan ýazylandygyna, ýa-da jemgyýetçilige açyk bir çeşmeden ýa-da başga bir erkin çeşmeden göçürilip alnandygyna güwä geçýärsiňiz.<br />
-'''<center>AWTORLYK HUKUGY BOÝUNÇA GORALÝAN HIÇ BIR IŞI BU ÝERE BIRUGSAT GOŞMAŇ!</center>'''",
+'''AWTORLYK HUKUGY BOÝUNÇA GORALÝAN HIÇ BIR IŞI BU ÝERE BIRUGSAT GOŞMAŇ!'''",
 'copyrightwarning2' => "Üns beriň,  {{SITENAME}} saýtyna edilen ähli goşantlaryň başga ulanyjylar tarapyndan redaktirlenmegi, düzedilmegi ýa-da aýyrylmagy mümkindir.
 Eger-de işiňiziň gypynç etmezden redaktirlenmegini islemeýän bolsaňyz, onda ony goşant etmäň.<br />
 Şeýle-de, siz ony özüňiziň ýazandygyňyza ýa-da jemgyýetçilige açyk bir çeşmeden ýa-da bolmasa şoňa meňzeş bir erkin çeşmeden göçürip alandygyňyza güwä geçýärsiňiz (jikme-jiklikler üçin serediň: $1).
@@ -923,7 +926,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 
 # Diffs
 'history-title' => '"$1" sahypasynyň geçmişi',
-'difference' => '(Wersiýalaryň aratapawudy)',
 'difference-multipage' => '(Sahypalaryň arasyndaky tapawut)',
 'lineno' => 'Setir $1:',
 'compareselectedversions' => 'Saýlanan wersiýalary deňeşdir',
@@ -1099,8 +1101,8 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'prefs-help-gender' => 'Hökmany däl: programma tarapyndan ulanyjynyň jynsyna görä ýüzlenmek üçin ulanylýar. Bu maglumat köpçülige açyk boljakdyr.',
 'email' => 'E-poçta',
 'prefs-help-realname' => 'Hakyky at (hökmany däl): eger hakyky adyňyz berseňiz, onda eden işleriňiz görkezilende ulanyljakdyr.',
-'prefs-help-email' => 'E-poçta adresi hökmany däl; ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.
-Şeýle-de ol başga ulanyjylaryň ulanyjy we pikir alyşma sahypalaryňyzyň üsti bilen kimdigiňizi bilmezden siziň bilen habarlaşyp bilmeklerine şert döredýär.',
+'prefs-help-email' => 'E-poçta adresi hökmany däl, ýöne parolyňyz ýadyňyzdan çykan ýagdaýynda e-poçta adresiňize täze parol iberilmegine mümkinçilik berýär.',
+'prefs-help-email-others' => 'Ulanyjy ýa-da çekişme sahypaňyzdaky bir çykgydyň üsti bilen başga ulanyjylaryň size e-poçta ibermegine rugsat hem berip bilersiňiz. Başga ulanyjylar siziň bilen habarlaşan wagty e-poçta adresiňiz görkezilmez.',
 'prefs-help-email-required' => 'E-poçta adresi talap edilýär.',
 'prefs-info' => 'Esasy maglumat',
 'prefs-i18n' => 'Halkaralaşdyryş',
@@ -1268,7 +1270,7 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'nchanges' => '$1 {{PLURAL:$1|üýtgeşme|üýtgeşme}}',
 'recentchanges' => 'Soňky üýtgeşmeler',
 'recentchanges-legend' => 'Soňky üýtgeşmeleriň opsiýalary',
-'recentchangestext' => 'Wikidäki iň soňky üýtgeşmeleri şu sahypadan yzarlaň.',
+'recentchanges-summary' => 'Wikidäki iň soňky üýtgeşmeleri şu sahypadan yzarlaň.',
 'recentchanges-feed-description' => 'Bu lentadaky wikide edilen iň soňky üýtgeşmeleri yzarlaň.',
 'recentchanges-label-newpage' => 'Bu özgerdiş täze bir sahypa döretdi',
 'recentchanges-label-minor' => 'Bu bir ujypsyzja özgerdiş',
@@ -1518,7 +1520,7 @@ Bir sütüniň adyna tyklap sortirowkanyň tertibini üýtgedip bilersiňiz.',
 'filehist-filesize' => 'Faýl ölçegi',
 'filehist-comment' => 'Teswirleme',
 'filehist-missing' => 'Faýl ýok',
-'imagelinks' => 'Faýlyň çykgytlary',
+'imagelinks' => 'Faýlyň ulanylyşy',
 'linkstoimage' => 'Bu faýla çykgydy bar bolan {{PLURAL:$1|sahypa|$1 sahypa}}:',
 'linkstoimage-more' => '$1 gowrak {{PLURAL:$1|sahypa|sahypa}} bu faýla çykgyt berýär.
 Aşakdaky sanaw diňe şu faýla çykgyt berýän {{PLURAL:$1|ilkinji faýly |ilkinji $1 faýly}} görkezýär.
@@ -1683,7 +1685,7 @@ Ol indi [[$2]] sahypasyna gönükdirýär.',
 'listusers-editsonly' => 'Diňe özgerdiş eden ulanyjylary görkez',
 'listusers-creationsort' => 'Döredilen senesi boýunça tertiple',
 'usereditcount' => '$1 {{PLURAL:$1|özgerdiş|özgerdiş}}',
-'usercreated' => '$2, $1 senesinde döredildi',
+'usercreated' => '$2, $1 senesinde {{GENDER:$3|döredildi}}.',
 'newpages' => 'Täze sahypalar',
 'newpages-username' => 'Ulanyjy ady:',
 'ancientpages' => 'Iň köne sahypalar',
@@ -2094,6 +2096,7 @@ $1',
 'sp-contributions-newbies-title' => 'Täze hasaplar üçin ulanyjy goşantlary',
 'sp-contributions-blocklog' => 'Blokirleme gündeligi',
 'sp-contributions-deleted' => 'öçürilen ulanyjy goşantlary',
+'sp-contributions-uploads' => 'ýüklemeler',
 'sp-contributions-logs' => 'gündelikler',
 'sp-contributions-talk' => 'çekişme',
 'sp-contributions-userrights' => 'ulanyjy hukuklary dolandyryşy',
@@ -2590,7 +2593,7 @@ Ondan soňraky çykgyt(lar) kadadan çykma hökmünde kabul edilýär, meselem:
 'metadata-help' => 'Bu faýlda, ähtimal, dijital fotoapparat ýa-da skaner tarapyndan goşulan goşmaça maglumatlar bardyr. Eger faýl soňradan redaktirlenen bolsa, onda käbir maglumatlar häzirki redaktirlenen faýly görä köneligine galan bolup biler.',
 'metadata-expand' => 'Jikme-jiklikleri görkez',
 'metadata-collapse' => 'Jikme-jiklikleri görkezme',
-'metadata-fields' => 'Bu habarlaşykda sanalýan EXIF meta-maglumat meýdançalary meta-maglumat tablisasy çöken mahaly surat görkeziş sahypalarynda ulanylýar. Galanlary gaýybana tertipde gizlenilýär.
+'metadata-fields' => 'Bu habarda sanalýan şekil meta-maglumat meýdançalary meta-maglumat tablisasy düýrlenen mahaly şekil sahypasynyň displeýine goşular. Galanlary gaýybana tertipde gizlenilýär.
 * make
 * model
 * datetimeoriginal
index 4c4d860..c084e11 100644 (file)
@@ -140,7 +140,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ikubli ang napatrolyang mga pagbabagong nasa kamakailang mga pagbabago',
 'tog-newpageshidepatrolled' => 'Itago ang napatrolyang mga pahina mula talaan ng bagong pahina',
 'tog-extendwatchlist' => 'Palawigin ang talaan ng mga binabantayan upang maipakita ang lahat ng mga pagbabago, hindi lamang ang pinakakamakailan lamang',
-'tog-usenewrc' => 'Gamitin ang pinadagdagang huling binago (kailangan ng JavaScript)',
+'tog-usenewrc' => 'Mga pagbabago ng pangkat ayon sa pahina sa kamakailang mga pagbabago at bantayan (nangangailangan ng JavaScript)',
 'tog-numberheadings' => 'Automatikong bilangin ang mga pamagat',
 'tog-showtoolbar' => "Ipakita ang ''toolbar'' ng pagbabago (JavaScript)",
 'tog-editondblclick' => 'Magbago ng mga pahina sa dalawahang pagpindot (JavaScript)',
@@ -159,7 +159,7 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'Padalhan ako ng e-liham kapag nabago ang isa sa mga pahinang binabantayan ko',
 'tog-enotifusertalkpages' => 'Padalhan ako ng e-liham kapag binago ang aking pahina ng usapan',
 'tog-enotifminoredits' => 'Padalhan din ako ng e-liham para sa mga maliliit na pagbabago ng mga pahina',
-'tog-enotifrevealaddr' => 'Ipakita ang adres ng e-liham ko sa loob ng mga e-liham ng pagpapahayag',
+'tog-enotifrevealaddr' => 'Ipakita ang aking direksiyong e-liham sa loob ng mga e-liham ng pagpapahayag',
 'tog-shownumberswatching' => 'Ipakita ang bilang ng mga nagbabantay na tagagamit',
 'tog-oldsig' => 'Umiiral na lagda:',
 'tog-fancysig' => 'Ituring ang lagda bilang teksto ng wiki (walang automatikong pagkawing)',
@@ -390,9 +390,9 @@ $1',
 'badaccess-group0' => 'Hindi ka pinahintulutang isagawa ang hiniling mong kilos.',
 'badaccess-groups' => 'Ang kilos na hiniling mo ay nakatakda lamang para sa mga tagagamit sa {{PLURAL:$2|pangkat na|isa sa mga pangkat na}}: $1.',
 
-'versionrequired' => 'Kinakailangan ang bersyong $1 ng MediaWiki',
+'versionrequired' => 'Kinakailangan ang bersiyong $1 ng MediaWiki',
 'versionrequiredtext' => 'Kinakailangan ang bersyong $1 ng MediaWiki upang magamit ang pahinang ito.
-Tingnan ang [[Special:Version|pahina ng bersyon]].',
+Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 
 'ok' => 'Sige',
 'retrievedfrom' => 'Ikinuha mula sa "$1"',
@@ -413,7 +413,7 @@ Tingnan ang [[Special:Version|pahina ng bersyon]].',
 'collapsible-expand' => 'Ibuka',
 'thisisdeleted' => 'Tingnan o ibalik ang $1?',
 'viewdeleted' => 'Tingnan ang $1?',
-'restorelink' => '{{PLURAL:$1|isang binurang pagbabagp|$1 binurang pagbabago}}',
+'restorelink' => '{{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}',
 'feedlinks' => 'Subo/Karga:',
 'feed-invalid' => 'Hindi tanggap na uri ng serbisyo ng pagpaparating.',
 'feed-unavailable' => 'Walang serbisyo mula sa sindikasyong pangpaglalathala',
@@ -495,8 +495,8 @@ Maaaring ibinura na ito ng iba.',
 'badtitle' => 'Hindi kanais-nais na pamagat',
 'badtitletext' => 'Ang hiniling na pamagat ng pahina ay hindi katanggap-tanggap, wala, o isang may-maling kawing na pamagat na pangugnayang-wika (interwika) o pangugnayang wiki (interwiki).
 Maaaring naglalaman ito ng isa o higit pang mga panitik (karakter) na hindi maaaring gamitin para sa mga pamagat.',
-'perfcached' => 'Ang sumusunod na datos ay nakaligpit at maaaring wala na sa panahon. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Ang sumusunod na datos ay nakaligpit, at dating isinapanahon noong $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Ang sumusunod na mga dato ay nakaligpit at maaaring hindi na napapanahon. Isang pinakamataas na {{PLURAL:$1|isang resulta|$1 mga resulta ang}} ang makukuha mula sa taguan.',
+'perfcachedts' => 'Ang sumusunod na mga dato ay nakaligpit, at dating isinapanahon noong $1. Isang pinakamataas na {{PLURAL:$4|isang resulta ang|$4 mga resulta ang}} makukuha mula sa taguan.',
 'querypage-no-updates' => 'Kasulukuyang hindi gumagana ang mga pagbabago para sa pahinang ito.
 Ang mga dato dito ay hindi pa masasariwa sa kasalukuyan.',
 'wrong_wfQuery_params' => 'Maling mga parametro sa wfQuery()<br />
@@ -509,6 +509,7 @@ Tanong: $2',
 Pakisubok na lang ulit pagkaraan ng kaunting mga minuto.",
 'protectedpagetext' => 'Kinandado ang pahinang ito upang mahadlangang ang pagbago.',
 'viewsourcetext' => 'Maaari mong tingnan at kopyahin ang pinagmulan ng pahinang ito:',
+'viewyourtext' => "Matitingnan at makukopya mo ang pinagmulan ng '''mga pagbabago''' papunta sa pahinang ito:",
 'protectedinterface' => "Nagbibigay ang pahinang ito ng tekstong panghangganan (''interface'') para sa sopwer, at ikinandado para maiwasan ang pangaabuso.",
 'editinginterface' => "'''Babala:''' Binabago mo ang isang pahinang ginagamit sa pagbibigay ng tekstong panghangganan para sa sopwer.
 Makakaapekto ang mga pagbago sa pahinang ito sa anyo ng hangganang (''interface'') pangtagagamit na para sa ibang mga tagagamit.
@@ -517,9 +518,16 @@ Para sa mga salinwika, paki isang-alang-alang o konsiderahin ang paggamit ng [//
 'cascadeprotected' => 'Nakasanggalang ang pahinang ito mula sa mga pagbabago, dahil kabilang ito sa sumusunod na {{PLURAL:$1|pahinang|mga pahinang}} nakasanggalang sa pamamagitan ng binuhay na opsyong "nahuhulog" (kumakaskada):
 $2',
 'namespaceprotected' => "Wala kang pahintulot na magbago ng mga pahinang nasa ngalan-espasyong '''$1'''.",
+'customcssprotected' => 'Wala kang pahintulot na baguhin ang pahina ng CSS na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
+'customjsprotected' => 'Wala kang pahintulot na baguhin ang pahina ng JavaScript na ito, dahil naglalaman ito ng mga katakdaang pansarili ng ibang tagagamit.',
 'ns-specialprotected' => 'Hindi pwedeng baguhin ang mga natatanging pahina.',
 'titleprotected' => "Nakasanggalang ang pamagat na ito mula sa paglikha ni [[User:$1|$1]].
 Ang ibinigay na dahilan ay ''$2''.",
+'filereadonlyerror' => 'Hindi nabago ang talaksang "$1" dahil ang repositoryong talaksan na "$2" ay nasa kalakarang mababasa lang.
+
+Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
+'invalidtitle-knownnamespace' => 'Hindi katanggap-tanggap na pamagat na may puwang na pampangalang "$2" at tekstong "$3"',
+'invalidtitle-unknownnamespace' => 'Hindi katanggap-tanggap na pamagat na mayroong hindi nalalamang bilang na pampuwang ng pangalan na $1 at tekstong "$2"',
 
 # Virus scanner
 'virus-badscanner' => "Masamang kompigurasyon: hindi kilalang tagahagilap (iskaner) ng birus: ''$1''",
@@ -619,6 +627,7 @@ Walang e-liham na ipapadala para sa anumang sumusunod na tampok na kasangkapang-
 'invalidemailaddress' => 'Hindi matatanggap ang direksiyong e-liham na ito dahil tila mayroon itong maling anyo.
 Pakipasok ang isang may mahusay na anyong adres o paki-iwang walang laman na lang ang lagayan.',
 'cannotchangeemail' => 'Hindi maaaring baguhin ang mga direksiyong e-liham sa wiking ito.',
+'emaildisabled' => 'Ang sityong ito ay hindi makapagpapadala ng mga e-liham.',
 'accountcreated' => 'Nilikha na ang kuwenta',
 'accountcreatedtext' => 'Nilikha na ang kuwentang tagagamit para kay $1.',
 'createaccount-title' => 'Paglikha ng kuwenta para sa {{SITENAME}}',
@@ -635,6 +644,7 @@ Maghintay po muna bago subukan uli.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Hindi malamang kamalian sa tungkulin ng liham ng PHP ()',
+'user-mail-no-addy' => 'Sinubukang magpadala ng e-liham na walang tirahan na para sa e-liham.',
 
 # Change password dialog
 'resetpass' => 'Palitan ang hudyat',
@@ -660,15 +670,18 @@ Maaaring matagumpay mo nang nabago ang iyong hudyat o nakahiling na ng isang bag
 'passwordreset-text' => 'Punuin ang pormularyong ito upang makatanggap ng isang pampaalalang e-liham ng iyong mga detalye ng akawnt.',
 'passwordreset-legend' => 'Itakdang muli ang hudyat',
 'passwordreset-disabled' => 'Hindi pinagagana sa wiking ito ang muling mga pagtatakda ng hudyat.',
-'passwordreset-pretext' => '{{PLURAL:$1| | Ipasok ang isa sa mga piraso ng dato sa ibaba}}',
+'passwordreset-pretext' => '{{PLURAL:$1| | Ipasok ang isa sa mga piraso ng datos sa ibaba}}',
 'passwordreset-username' => 'Pangalan ng tagagamit:',
-'passwordreset-email' => 'Tirahan ng e-liham:',
-'passwordreset-emailtitle' => 'Mga detalye ng akawnt sa {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Isang tao (marahil ay ikaw, mula sa tirahan ng IP na $1) ang humiling ng isang paalala sa iyong mga detalye ng akawnt para sa {{SITENAME}} ($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:
+'passwordreset-domain' => 'Nasasakupan:',
+'passwordreset-capture' => 'Tingnan ang lumabas na e-liham?',
+'passwordreset-capture-help' => 'Kapag tsetsekan mo ang kahong ito, ang e-liham (may pansamantalang hudyat) ay ipapakita sa iyo at ipapadala rin sa tagagamit.',
+'passwordreset-email' => 'Direksiyong e-liham:',
+'passwordreset-emailtitle' => 'Mga detalye ng kuwenta sa {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Isang tao (marahil ay ikaw, mula sa direksiyong IP na $1) ang humiling ng isang paalala sa iyong mga detalye ng kuwenta para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|kuwenta ng tagagamit ay|mga kuwenta ng tagagamit ay}} may kaugnayan sa direksiyong e-liham na ito:
 
 $2
 
-{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.
+{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang mga pansamantalang hudyat na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.
 Dapat kang lumagda at pumili ng isang bagong hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong hudyat, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong hudyat.',
 'passwordreset-emailtext-user' => 'Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}
 ($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:
@@ -680,13 +693,18 @@ Dapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa n
 'passwordreset-emailelement' => 'Pangalan ng tagagamit: $1
 Pansamantalang hudyat: $2',
 'passwordreset-emailsent' => 'Naipadala na ang isang e-liham na pampaalala.',
+'passwordreset-emailsent-capture' => 'Naipadala na ang isang e-liham na paalala, na ipinapakita sa ibaba.',
+'passwordreset-emailerror-capture' => 'Nalikha na ang isang e-liham na paalala, na ipinapakita sa ibaba, subalit nabigo ang pagpapadala sa tagagamit: $1',
 
 # Special:ChangeEmail
 'changeemail' => 'Baguhin ang direksiyong e-liham',
 'changeemail-header' => 'Baguhin ang direksiyong e-liham ng kuwenta',
+'changeemail-text' => 'Kumpletuhin ang pormularyong ito upang mabago ang tirahan na para sa e-liham mo. Kakailanganin mong ipasok ang iyong hudyat upang tiyakin ang pagbabagong ito.',
+'changeemail-no-info' => 'Kailangan mong lumagda upang tuwirang mapuntahan ang pahinang ito.',
 'changeemail-oldemail' => 'Kasalukuyang direksiyong e-liham:',
 'changeemail-newemail' => 'Bagong direksiyong e-liham:',
 'changeemail-none' => '(wala)',
+'changeemail-submit' => 'Baguhin ang e-liham',
 'changeemail-cancel' => 'Kanselahin',
 
 # Edit page toolbar
@@ -720,8 +738,8 @@ Pansamantalang hudyat: $2',
 'showlivepreview' => 'Buhay na paunang tingin',
 'showdiff' => 'Ipakita ang mga pagbabago',
 'anoneditwarning' => "'''Babala:''' Hindi ka nakalagda.
-Matatala ang adres ng IP mo sa kasaysayan ng pagbabago ng pahinang ito.",
-'anonpreviewwarning' => "''Hindi ka nakalagda.  Itatala sa inyong pagtatala ang inyong adres ng IP sa kasaysayan ng pagbabago ng pahinang ito.''",
+Matatala ang iyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.",
+'anonpreviewwarning' => "''Hindi ka nakalagda.  Itatala sa inyong pagtatala ang inyong direksiyong IP sa kasaysayan ng pagbabago ng pahinang ito.''",
 'missingsummary' => "'''Paalala:''' Hindi ka nagbigay ng buod ng pagbabago.
 Kapag pinindot mo uli ang Sagip, masasagip ang pagbabago mo na wala nito.",
 'missingcommenttext' => 'Magbigay ng isang kumento/puna sa ibaba.',
@@ -730,17 +748,18 @@ Kapag pinindot mo uli ang \"{{int:savearticle}}\", masasagip ang pagbabago mo na
 'summary-preview' => 'Paunang tingin sa buod:',
 'subject-preview' => 'Paunang tingin sa paksa/paulo:',
 'blockedtitle' => 'Hinarang ang tagagamit',
-'blockedtext' => "'''Hinarang/hinadlangan ang iyong pangalan ng tagagamit o adres ng IP.'''
+'blockedtext' => "'''Hinarang/hinadlangan ang iyong pangalan ng tagagamit o direksiyong IP.'''
 
-Ginawa ang pagharang/paghadlang ni $1. Ito ang ibinigay na dahilan: ''$2''.
+Ginawa ni $1 ang pagharang/paghadlang.
+Ito ang ibinigay na dahilan: ''$2''.
 
 * Simula ng pagharang/paghadlang: $8
 * Katapusan ng pagharang/paghadlang: $6
 * Ang hinarang/hinadlangan ay si: $7
 
-Maaari kang makipag-ugnayan kay $1 o sa iba pang [[{{MediaWiki:Grouppage-sysop}}|tagapangasiwa]] upang pagusapan ang pagharang/paghadlang na ito.
-Hindi mo magagamit ang kasangkapang-katangiang 'magpadala ng e-liham sa tagagamit' hangga't hindi tinutukoy ang isang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka pa hinaharangan/hinahadlangan sa paggamit nito.
-Ang pangkasalukuyang adres ng IP mo ay $3, at ang ID ay #$5.
+Maaari kang makipag-ugnayan kay $1 o sa ibang [[{{MediaWiki:Grouppage-sysop}}|tagapangasiwa]] upang pagusapan ang pagharang/paghadlang na ito.
+Hindi mo magagamit ang kasangkapang-katangiang 'magpadala ng e-liham sa tagagamit' hangga't hindi tinutukoy ang isang tanggap na direksiyong e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka pa hinaharangan/hinahadlangan sa paggamit nito.
+Ang kasalukuyan mong direksiyong IP ay $3, at ang ID ng pagharang/paghadlang ay #$5.
 Pakisama ang lahat ng mga detalye sa anumang mga pagtatanong na ginagawa/gagawin mo.",
 'autoblockedtext' => 'Kusang hinadlangan/hinarang ang adres ng IP mo dahil ginamit ito ng ibang tagagamit, na hinadlangan/hinarang ni $1.
 Ang ibinigay na dahilan ay:
@@ -791,12 +810,12 @@ Pakisuri kung ibig mong likhain/baguhin ang pahinang ito.',
 'userpage-userdoesnotexist-view' => 'Hindi nakatala ang kuwenta ng tagagamit na "$1".',
 'blocked-notice-logextract' => 'Kasalukuyang hinarang ang tagagamit na ito.
 Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa baba para sa inyong pagsasangguni:',
-'clearyourcache' => "'''Tandaan: Pagkatapos magtala, baka kailangan mong linisin ang baunan ng iyong pambasa-basa upang makita ang mga pagbabago.'''
-'''Firefox / Safari:''' Panatilihing nakapindot ang ''Shift'' habang kiniklik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''Command-R'' sa isang Mac)
-'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''Command-Shift-R'' sa isang Mac)
-'''Internet Explorer:''' Panatilihing nakapindot ang ''Ctrl'' habang kiniklik ang ''Refresh'', o pindutin ang ''Ctrl-F5''.
-'''Konqueror:''' I-klik ang ''Reload'' o pindutin ang ''F5''
-'''Opera:''' Linisin ang baunan sa ''Tools → Preferences''",
+'clearyourcache' => "'''Paunawa: Pagkatapos magsagip, baka kailangan mong laktawan ang taguan ng pantingin-tingin mo upang makita ang mga pagbabago.
+'''Firefox / Safari:''' Panatilihin ang pagpindot sa ''Shift'' habang nilalagitik ang ''Reload'', o pindutin ang ''Ctrl-F5'' o ''Ctrl-R'' (''⌘-R'' sa Mac)
+'''Google Chrome:''' Pindutin ang ''Ctrl-Shift-R'' (''⌘-Shift-R'' sa Mac)
+'''Internet Explorer:''' Panatilihin ang pagpindot sa ''Ctrl'' habang nilalagitik ang ''Refresh'', o pindutin ang ''Ctrl-F5''
+'''Konqueror:''' Lagitikin ang ''Reload'' o pindutin ang ''F5''
+'''Opera:''' Linisin ang taguan sa ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong CSS bago sagipin.",
 'userjsyoucanpreview' => "'''Balato:''' Gamitin ang pindutang \"{{int:showpreview}}\" upang masubok ang bago mong JavaScript bago sagipin.",
 'usercsspreview' => "'''Tandaan mong paunang tingin pa lamang ito ng iyong CSS na pantagagamit.'''
@@ -811,8 +830,9 @@ Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa baba para sa iny
 Tandaang gumagamit ang pinasadyang mga pahinang .css at .js ng mga pamagat na may maliliit na mga titik, halimbawa na ang {{ns:user}}:Foo/vector.css na taliwas sa {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Naisapanahon na)',
 'note' => "'''Paunawa:'''",
-'previewnote' => "'''Isang lamang itong paunang tingin;
-hindi pa nasasagip ang mga pagbabago!'''",
+'previewnote' => "'''Tandaan na isa lamang itong paunang tingin.'''
+Hindi pa nasasagip ang mga binago mo!",
+'continue-editing' => 'Ipagpatuloy ang pamamatnugot',
 'previewconflict' => 'Ipinamamalas ng paunang tinging ito ang teksto sa loob ng pangitaas na pook-patnugutan ng teksto ayon sa lilitaw na anyo nito kapag pinili mo ang pagsagip.',
 'session_fail_preview' => "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng sesyon ng datos.
 Paki ulit muli. Kung hindi ito gumana, subukang umalis sa pagkalagda at bumalik muli.'''",
@@ -827,6 +847,7 @@ Tinanggihan ang pagbabago upang maiwasan ang korapsyon ng teksto ng artikulo.
 Kadalasang nangyayari ito kapag gumagamit ka ng masurot na serbisyo ng hindi-nakikilalang apoderadong (''anonymous proxy'') nasa web.",
 'edit_form_incomplete' => "'''Ilan sa mga bahagi ng pormularyong pampatnugot ay hindi nakarating sa tagapaghain; suriing muli na ang iyong mga pagbabago ay buo at subukang muli.'''",
 'editing' => 'Binabago ang $1',
+'creating' => 'Nililikha ang $1',
 'editingsection' => 'Binabago ang $1 (bahagi)',
 'editingcomment' => 'Binabago ang $1 (bagong seksyon)',
 'editconflict' => 'Alitan sa pagbabago: $1',
@@ -850,8 +871,8 @@ Nangangako ka rin sa amin na ikaw mismo ang sumulat nito, sumipi/kumopya nito mu
 Kung ayaw mong mabago nang labis-labis ang mga isinulat mo, mas mabuting huwag mo na lamang ipasa iyan dito.<br />
 Nangangako ka rin sa amin na ikaw ang mismong sumulat nito, o sinipi/kinopya mo ito mula sa isang pinagmulang nasa dominyo na ng publiko o katulad (tingnan ang $1 para sa mga detalye).
 '''HUWAG MAGTALA NG AKDANG NAKAKARAPATANG-ARI (NAKAKOPIRAYT) NA HINDI MUNA HUMIHINGI NG PAHINTULOT!'''",
-'longpageerror' => "'''KAMALIAN: May habang $1 ''kilobyte'' ang ipinasa mong teksto, na mas mahaba kaysa $2 ''kilobyte'' na siyang pinakamataas na nakatakdang halaga.
-Hindi ito masasagip.'''",
+'longpageerror' => "'''Kamalian: May haba na {{PLURAL:$1|isang kilobyte|$1 mga kilobyte}} ang ipinasa mong teksto, na mas mahaba kaysa sa pinakamataas na nakatakdang halaga na {{PLURAL:$2|isang kilobyte|$2 mga kilobyte}}.''' 
+Hindi ito masasagip.",
 'readonlywarning' => "'''BABALA: Ikinandado ang kalipunan ng dato para sa gawaing pampagpapanatili, kaya't hindi mo pa masasagip ang mga pagbabagong ginawa mo ngayon.
 Maaaring ibigin mong gupitin at idikit ang teksto patungo sa isang talaksang pangteksto at sagipin ito mamaya.'''
 
@@ -894,6 +915,7 @@ Tila binura na ito.',
 'edit-no-change' => 'Binalewala ang pagbabago mo, dahil walang pagbabagong ginawa sa teksto.',
 'edit-already-exists' => 'Hindi makalikha ng isang bagong pahina.
 Umiiral na ito.',
+'defaultmessagetext' => 'Nakatakdang teksto ng mensahe',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Babala: Naglalaman ang pahinang ito ng napakaraming mamahaling mga tawag na pantungkulin.
@@ -908,6 +930,12 @@ Hindi isasama ang ilang mga suleras.',
 'parser-template-loop-warning' => 'Nadiskubreng silo ng suleras: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Lumabis na sa nakatakdang lalim ng rekursyon (pormula) ng suleras ($1)',
 'language-converter-depth-warning' => 'Lumampas sa ($1) ang hangganan ng lalim ng pampalit ng wika',
+'node-count-exceeded-category' => 'Mga pahina kung saan nalampasan ang bilang ng buko',
+'node-count-exceeded-warning' => 'Lumampas ang pahina sa bilang ng buko',
+'expansion-depth-exceeded-category' => 'Mga pahina kung saan lampas ang lalim ng paglawak',
+'expansion-depth-exceeded-warning' => 'Lumampas ang pahina sa lalim ng paglawak',
+'parser-unstrip-loop-warning' => 'Napansin ang silo ng hindi pagtalop',
+'parser-unstrip-recursion-limit' => 'Nalampasan ang hangganan ng rekursiyon ng hindi pagtalop ($1)',
 
 # "Undo" feature
 'undo-success' => 'Matatanggal ang pagbabago.
@@ -962,28 +990,28 @@ Subukang [[Special:Search|hanapin sa wiki]] para sa mga kaugnay na mga bagong pa
 'rev-deleted-user-contribs' => '[itinanggal ang bansag o adres ng IP - itinago ang pagbabago mula sa mga ambag]',
 'rev-deleted-text-permission' => "Itong pagbabago ng pahina ay '''ibinura'''.
 Maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagbubura].",
-'rev-deleted-text-unhide' => "Itong pagbabago ng pahina ay '''ibinura'''.
-Maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagbubura].
-Bilang isang tagapangasiwa, maaari mo pang [$1 tingnan ang pagbabagong ito] kung nais mong tumuloy.",
-'rev-suppressed-text-unhide' => "Itong pagbabago ng pahina ay '''isinugpo'''.
-Maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagsusugpo].
-Bilang isang tagapangasiwa, maaari mo pang [$1 tingnan ang pagbabagong ito] kung nais mong tumuloy.",
-'rev-deleted-text-view' => "Itong pagbabago ng pahina ay '''ibinura'''.
-Bilang isang tagapangasiwa, maaari mo itong makita; maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tala ng pagbubura].",
-'rev-suppressed-text-view' => "Itong pagbabago ng pahina ay '''isinugpo'''.
-Bilang isang tagapangasiwa, maaari mo itong makita; maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagsusugpo].",
+'rev-deleted-text-unhide' => "'''Binura''' ang pahinang ito ng pagbabago.
+Maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].
+Maaari mo pa ring [$1 tingnan ang pagbabagong ito] kung nais mong magpatuloy.",
+'rev-suppressed-text-unhide' => "Ang pagbabagong ito ng pahina ay '''pinigilan'''.
+Maaaring matagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan ng pagsupil].
+Maaari mo pa ring [$1 tingnan ang rebisyong ito] kung nais mong magpatuloy.",
+'rev-deleted-text-view' => "Ang pagbabagong ito sa pahina ay '''binura'''.
+Maaarin mo itong makita; matatagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
+'rev-suppressed-text-view' => "Ang pagbabagong ito sa pahina ay '''pinigilan'''.
+Maaari mo itong makita; matatagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan ng pagsupil].",
 'rev-deleted-no-diff' => "Hindi mo maaaring makita ang pagkakaibang ito dahil '''binura na''' ang isa sa mga pagbabago.  Matatagpuan ang mga detalye mula sa loob ng [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
 'rev-suppressed-no-diff' => "Hindi mo maaaring tingnan ang pagkakaibang ito dahil '''ibinura''' ang isa sa mga pagbabago.",
-'rev-deleted-unhide-diff' => "'''Binura''' ang isa sa mga pagbabago ng pagkakaibang ito.
-Maaaring matagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].
-Bilang isang tagapangasiwa, maaari mo pa ring [$1 tingnan ang pagkakaibang ito] kung nais mong magpatuloy.",
-'rev-suppressed-unhide-diff' => "Isa sa mga pagbabago ng pagkakaibang ito ay '''isinugpo'''.
-Maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagsusugpo].
-Bilang isang tagapangasiwa, maaari mo pang [$1 tingnan ang pagbabagong ito] kung nais mong tumuloy.",
-'rev-deleted-diff-view' => "Isa sa mga pagbabago ng pagkakaibang ito ay '''binura'''.
-Bilang isang tagapangasiwa, maaari mo itong makita; maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} tala ng pagbubura].",
-'rev-suppressed-diff-view' => "Isa sa mga pagbabago ng pagkakaibang ito ay '''isinugpo'''.
-Bilang isang tagapangasiwa, maaari mo itong makita; maaaring hanapin ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} tala ng pagsusugpo].",
+'rev-deleted-unhide-diff' => "'''Nabura''' ang isa sa mga pagbabago para sa kaibahang ito.
+Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].
+Maaari mo pa ring [$1 makita ang pagkakaibang ito] kung nais mong magpatuloy.",
+'rev-suppressed-unhide-diff' => "Ang isa sa mga pagbabago para sa kaibahang ito ay '''pinigilan'''.
+Matatagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan ng pagsupil].
+Maaari mo pa ring [$1 tingnan ang pagbabagong ito] kung nais mong magpatuloy.",
+'rev-deleted-diff-view' => "'''Nabura''' ang isa sa mga pagbabago para sa kaibahang ito.
+Makikita mo pa rin pagkakaibang ito; matatagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} talaan ng pagbura].",
+'rev-suppressed-diff-view' => "'''Pinigalan''' ang isa sa mga pagbabago para sa kaibahang ito.
+Makikita mo ang pagkakaibang ito; matatagpuan ang mga detalye sa [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} talaan ng pagsupil].",
 'rev-delundel' => 'ipakita/itago',
 'rev-showdeleted' => 'ipakita',
 'revisiondelete' => 'Burahin/ibalik ang mga pagbabago',
@@ -1051,8 +1079,8 @@ Pakitingnan ang mga talaan.',
 
 # Suppression log
 'suppressionlog' => 'Tala ng pagpipigil',
-'suppressionlogtext' => "Nasa ibaba ang isang tala ng mga pagbura at mga pagharang/paghadlang na kinakasangkutan ng nilalamang nakatago sa mga ''sysop''.
-Tingnan ang [[Special:IPBlockList|talaan ng hinarang na/hinadlangang IP]] para sa isang talaan ng mga pangkasalukuyan at gumaganang mga pinagbawalan at mga pagharang/paghadlang.",
+'suppressionlogtext' => 'Nasa ibaba ang isang talaan ng mga pagbura at mga pagharang na kinakasangkutan ng nilalamang nakatago sa mga tagapangasiwa.
+Tingnan ang [[Special:BlockList||talaan ng pagharang]] para sa isang talaan ng mga pangkasalukuyang gumaganang mga pinagbawalan at mga pagharang.',
 
 # History merging
 'mergehistory' => 'Pagsanibin mga pahina ng kasaysayan',
@@ -1084,8 +1112,9 @@ Tiyakin na ang pagbabago ay makapagpapanatili ng pagkakatuluy-tuloy ng pahinang
 'mergelogpagetext' => 'Nasa ibaba ang isang talaan ng mga pinakakamakailan lamang na mga pagsasanib ng isang kasaysayan ng pahina patungo sa isa pa.',
 
 # Diffs
-'history-title' => 'Kasaysayan ng pagbabago ng "$1"',
-'difference' => '(Pagkakaiba sa pagitan ng mga pagbabago)',
+'history-title' => 'Kasaysayan sa pagbago ng "$1"',
+'difference-title' => 'Pagkakaiba sa pagitan ng mga pagbago ng "$1"',
+'difference-title-multipage' => 'Kaibahan sa pagitan ng mga pahinang "$1" at "$2"',
 'difference-multipage' => '(Pagkakaiba sa pagitan ng mga pahina)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'Paghambingin ang mga napiling bersyon',
@@ -1166,10 +1195,11 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'qbsettings-fixedright' => 'Inayos ang kanan',
 'qbsettings-floatingleft' => 'Kaliwa lumulutang',
 'qbsettings-floatingright' => 'Kanan lumulutang',
+'qbsettings-directionality' => 'Naayos na, ayon sa kapupuntahan ng panitik ng wika mo',
 
 # Preferences page
 'preferences' => 'Mga kagustuhan',
-'mypreferences' => 'Aking mga kagustuhan',
+'mypreferences' => 'Mga nais ko',
 'prefs-edits' => 'Bilang ng mga pagbabago:',
 'prefsnologin' => 'Hindi nakalagda/nakatala',
 'prefsnologintext' => 'Kailangan mong <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} lumagda/tumala]</span> para makapagtakda ng mga kagustuhang ng tagagamit.',
@@ -1180,17 +1210,19 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'prefs-beta' => 'Mga kaangkapang-katangiang pang-beta',
 'prefs-datetime' => 'Petsa at oras',
 'prefs-labs' => 'Mga kasangkapang-katangiang pang-Labs',
+'prefs-user-pages' => 'Mga pahina ng tagagamit',
 'prefs-personal' => 'Sanligang pangkatangian ng tagagamit',
 'prefs-rc' => 'Kamakailan lamang na mga pagbabago',
 'prefs-watchlist' => 'Talaan ng mga binabantayan',
 'prefs-watchlist-days' => 'Mga araw na ipapakita sa talaan ng mga binabantayan:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Pinakamataas ang $1 {{PLURAL:$1|araw|mga araw}}',
 'prefs-watchlist-edits' => 'Pinakamaraming bilang ng mga pagbabagong ipapakita sa pinalawak na talaan ng mga binabantayan:',
 'prefs-watchlist-edits-max' => 'Pinakamataas na bilang: 1000',
 'prefs-watchlist-token' => 'Balap ng talaan ng mga binabantayan:',
 'prefs-misc' => 'Bala-balaki',
 'prefs-resetpass' => 'Baguhin ang hudyat',
-'prefs-setemail' => 'Itakda ang bagong tirahan ng e-liham $1',
+'prefs-changeemail' => 'Baguhin ang direksiyong e-liham',
+'prefs-setemail' => 'Magtakda ng direksiyong e-liham',
 'prefs-email' => 'Mga pagpipilian para sa e-liham',
 'prefs-rendering' => 'Hitsura',
 'saveprefs' => 'Sagipin',
@@ -1212,7 +1244,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'savedprefs' => 'Nasagip na ang mga kagustuhan mo.',
 'timezonelegend' => 'Sona ng oras:',
 'localtime' => 'Lokal na oras:',
-'timezoneuseserverdefault' => 'Gamitin ang itinakda ng serbidor',
+'timezoneuseserverdefault' => 'Gamitin ang katakdaan ng wiki ($1)',
 'timezoneuseoffset' => "Iba pa (tukuyin ang pambawi o ''offset'')",
 'timezoneoffset' => "Pambawi/pambalanse (''offset'')¹:",
 'servertime' => 'Oras sa serbidor',
@@ -1247,7 +1279,8 @@ Hindi ito maibabalik sa dating gawi.',
 'prefs-registration' => 'Oras ng pagtatala:',
 'yourrealname' => 'Tunay na pangalan:',
 'yourlanguage' => 'Wika:',
-'yourvariant' => 'Naiiba pa:',
+'yourvariant' => 'Iba pang anyo ng wika ng nilalaman:',
+'prefs-help-variant' => 'Ang nais mong kaibahan o ortograpiya sa pagpapakita ng mga pahina ng nilalaman ng wiking ito.',
 'yournick' => 'Panglagda:',
 'prefs-help-signature' => 'Ang mga puna sa mga pahina ng usapan ay dapat na lagdaan ng "<nowiki>~~~~</nowiki>" na magiging lagda mo at marka ng oras.',
 'badsig' => 'Hindi tamang hilaw na lagda.
@@ -1264,7 +1297,7 @@ Dapat na mas mababa kaysa $1 {{PLURAL:$1|panitik|mga panitik}}.',
 Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para iyong mga ginawa.",
 'prefs-help-email' => 'Hindi talaga kailangang may tirahan ng e-liham, subalit kailangan para sa muling pagtatakda ng hudyat, kung makalimutan mo ang hudyat mo.',
 'prefs-help-email-others' => 'Mapipili mo rin na makipag-ugnayan sa iyo ang iba sa pamamagitan ng iyong pahina ng tagagamit o usapan na hindi kailangang ilantad ang katauhan mo.',
-'prefs-help-email-required' => 'Kailangan ang adres ng e-liham.',
+'prefs-help-email-required' => 'Kailangan ang direksiyong e-liham.',
 'prefs-info' => 'Payak na kabatiran',
 'prefs-i18n' => 'Internasyonalisasyon',
 'prefs-signature' => 'Lagda',
@@ -1281,15 +1314,15 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'prefs-diffs' => 'Mga pagkakaiba',
 
 # User preference: e-mail validation using jQuery
-'email-address-validity-valid' => 'Mukhang katanggap-tanggap ang tirahan ng e-liham',
-'email-address-validity-invalid' => 'Magpasok ng isang tanggap na tirahan ng e-liham',
+'email-address-validity-valid' => 'Mukhang katanggap-tanggap ang direkisyong e-liham',
+'email-address-validity-invalid' => 'Magpasok ng isang tanggap na direksiyong e-liham',
 
 # User rights
 'userrights' => 'Pamamahala ng mga karapatan ng tagagamit',
 'userrights-lookup-user' => 'Pamahalaan ang mga pangkat ng tagagamit',
 'userrights-user-editname' => 'Magpasok ng isang pangalan ng tagagamit:',
 'editusergroup' => 'Baguhin ang mga pangkat ng tagagamit',
-'editinguser' => "Binabago ang mga karapatang pangtagagamit ng tagagamit na si '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Binabago ang mga karapatang pangtagagamit ng tagagamit na si '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Baguhin ang mga pangkat ng tagagamit',
 'saveusergroups' => 'Sagipin ang mga pangkat ng tagagamit',
 'userrights-groupsmember' => 'Kasapi ng:',
@@ -1302,7 +1335,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'userrights-no-interwiki' => 'Wala kang pahintulot na baguhin ang mga karapatan ng tagagamit sa ibang mga wiki.',
 'userrights-nodatabase' => 'Hindi umiiral o hindi lokal ang kalipunan ng datos na $1',
 'userrights-nologin' => 'Kailangang [[Special:UserLogin|nakalagda ka]] bilang tagapangasiwa upang maitalaga ang mga karapatan ng tagagamit.',
-'userrights-notallowed' => 'Walang pahintulot ang iyong akawnt na magtalaga ng mga karapatan ng tagagamit.',
+'userrights-notallowed' => 'Walang pahintulot ang akawnt mo na magdagdag o magtanggal ng mga karapatan ng tagagamit.',
 'userrights-changeable-col' => 'Mga pangkat na maaari mong baguhin',
 'userrights-unchangeable-col' => 'Mga pangkat na hindi mo mababago',
 
@@ -1312,16 +1345,16 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'group-autoconfirmed' => 'Mga tagagamit na nakompirma sa kusang paraan (autokompirmasyon)',
 'group-bot' => "Mga ''bot''",
 'group-sysop' => 'Mga tagapangasiwa',
-'group-bureaucrat' => 'Mga burokrato',
+'group-bureaucrat' => 'Mga burokrata',
 'group-suppress' => 'Mga tagapagingat-tago',
 'group-all' => '(lahat)',
 
-'group-user-member' => 'Tagagamit',
-'group-autoconfirmed-member' => 'Kusang nakumpirmang tagagamit',
-'group-bot-member' => 'Bot',
-'group-sysop-member' => 'tagapangasiwa',
-'group-bureaucrat-member' => 'Burokrato',
-'group-suppress-member' => 'Tagapagingat-tago',
+'group-user-member' => '{{GENDER:$1|tagagamit}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|tagagamit na kusang natiyak}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|tagapangasiwa}}',
+'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
+'group-suppress-member' => '{{GENDER:$1|tagapangalingat}}',
 
 'grouppage-user' => '{{ns:project}}:Mga tagagamit',
 'grouppage-autoconfirmed' => '{{ns:project}}:Kusang nakumpirmang mga tagagamit',
@@ -1389,12 +1422,13 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'right-siteadmin' => 'Ikandado at alisin ang pagkakakandado ng kalipunan ng dato',
 'right-override-export-depth' => 'Iluwas ang mga pahina na kabilang ang mga pahinang nakakawing magpahanggang sa isang lalim na 5',
 'right-sendemail' => 'Magpadala ng e-liham sa ibang mga tagagamit',
-'right-passwordreset' => 'Muling itinakdang hudyat para sa isang tagagamit ([[Special:PasswordReset|natatanging pahina]])',
+'right-passwordreset' => 'Tingnan ang mga e-liham ng muling pagtatakda ng hudyat',
 
 # User rights log
 'rightslog' => 'Tala ng mga karapatan ng tagagamit',
 'rightslogtext' => 'Isa itong tala ng mga pagbabago sa mga karapatan ng tagagamit.',
 'rightslogentry' => 'binago ang kasapiang pampangkat para kay $1 mula sa $2 patungong $3',
+'rightslogentry-autopromote' => 'ay kusang naitaas ang ranggo mula $2 upang maging $3',
 'rightsnone' => '(wala)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1422,6 +1456,7 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'action-suppressionlog' => 'tingnan itong pribadong tala',
 'action-block' => 'harangin sa paggawa ng pagbabago ang tagagamit na ito',
 'action-protect' => 'baguhin ang mga antas ng pagsasanggalang para sa pahinang ito',
+'action-rollback' => 'mabilisang igulong na pabalik ang mga pagbabago ng huling tagagamit na namatnugot ng isang partikular na pahina',
 'action-import' => 'angkatin itong pahina mula sa ibang wiki',
 'action-importupload' => 'angkatin ang pahinang ito mula sa isang ikinargang talaksan',
 'action-patrol' => 'tatakan bilang napatrolya na ang mga pagbabagong ginawa ng iba',
@@ -1431,12 +1466,13 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'action-userrights' => 'baguhin ang lahat ng karapatan ng tagagamit',
 'action-userrights-interwiki' => 'baguhin ang mga karapatan ng tagagamit na nasa ibang mga wiki',
 'action-siteadmin' => 'ikandado o tanggalin ang pagkakakandado ng kalipunan ng dato',
+'action-sendemail' => 'magpadala ng mga e-liham',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
 'recentchanges' => 'Kamakailang pagbabago',
 'recentchanges-legend' => 'Mga pagpipilian para sa kamakailang mga pagbabago',
-'recentchangestext' => 'Subaybayan ang mga pinakahuling pagbabago sa wiki sa pahinang ito.',
+'recentchanges-summary' => 'Subaybayan ang mga pinakahuling pagbabago sa wiki sa pahinang ito.',
 'recentchanges-feed-description' => 'Sundan ang pinakahuling mga pagbabago sa wiki sa pamamagitan ng feed na ito.',
 'recentchanges-label-newpage' => 'Lumikha ng isang bagong pahina ang pagbabagong ito',
 'recentchanges-label-minor' => 'Isa itong munting pagbabago',
@@ -1462,9 +1498,11 @@ Kung pipiliin mong ibigay ito, gagamitin ito para mabigyan ka ng pagkilala para
 'number_of_watching_users_pageview' => '[$1 binabantayang {{PLURAL:$1|tagagamit|mga tagagamit}}]',
 'rc_categories' => 'Itakda lang sa mga kaurian (ihiwalay sa pamamagitan ng "|")',
 'rc_categories_any' => 'Kahit ano',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|mga byte}} pagkaraan ng pagbabago',
 'newsectionsummary' => '/* $1 */ bagong seksyon',
 'rc-enhanced-expand' => 'Ipakita ang mga detalye (kailangan ng JavaScript)',
 'rc-enhanced-hide' => 'Itago ang mga detalye',
+'rc-old-title' => 'dating nalikha bilang "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Kaugnay na mga pagbabago',
@@ -1514,6 +1552,7 @@ Para maisama ang isang talaksan sa loob ng isang pahina, gumamit ng isang kawing
 'ignorewarnings' => 'Balewalain ang anumang mga babala',
 'minlength1' => 'Dapat may kahit na isang titik lang ang mga pangalan ng talaksan.',
 'illegalfilename' => 'Ang pangalan ng talaksan (filename) na "$1" ay mayroon mga karakter na hindi pinapahintulot bilang pamagat ng isang pahina. Paki palitan ang pangalan at subukang ikarga muli.',
+'filename-toolong' => 'Ang mga pangalan ng talaksan ay hindi maaaring maging mas mahaba kaysa sa 240 mga byte.',
 'badfilename' => 'Pinalitan ang pangalan ng talaksan na naging "$1".',
 'filetype-mime-mismatch' => 'Hindi tumutugma ang dugtong ng talaksan na ".$1" sa napansing uri ng MIME ng talaksan ($2).',
 'filetype-badmime' => 'Hindi pinapahintulutang maikarga ang uring "$1" ng mga talaksang MIME.',
@@ -1539,6 +1578,7 @@ Ang mga pinapayagang {{PLURAL:$3|uri ng talaksan ay ang|mga uri ng talaksan ay a
 ang talaksang ito ay $2.',
 'largefileserver' => 'Mas malaki ang talaksan kaysa nakatakdang papahintulutan ng serbidor.',
 'emptyfile' => 'Mukhang walang laman ang talaksan (file) na ikinarga mo. Maaaring dahil ito sa maling pagkapasok ng pangalan ng talaksan.  Paki tingin kung gusto mo talagang ikarga ang talaksan na ito.',
+'windows-nonascii-filename' => 'Ang wiking ito ay hindi nagsusuporta ng mga pangalan ng talaksan na mayroong natatanging mga panitik.',
 'fileexists' => "Mayroon ng talaksan na ganitong pangalan, paki tingin ang '''<tt>[[:$1]]</tt>''' kung tiyak ka na babaguhin ito.
 [[$1|thumb]]",
 'filepageexists' => "Ang pahina ng paglalarawan para sa talaksan na ito ay nalikha na sa '''<tt>[[:$1]]</tt>''', ngunit walang talaksang umiiral na may ganitong pangalan.
@@ -1546,8 +1586,8 @@ Hindi lilitaw ang buod na ipapasok mo sa pahina ng paglalarawan.
 Para lumitaw ang buod mo doon, kailangan mong kinakamay na baguhin ito.
 [[$1|thumb]]",
 'fileexists-extension' => "Mayroon talaksan na ganitong pangalan: [[$2|thumb]]
-* Pangalan ng ikakargang talaksan: '''<tt>[[:$1]]</tt>'''
-* Pangalan ng mayroon nang talaksan: '''<tt>[[:$2]]</tt>'''
+* Pangalan ng ikinakargang talaksan: '''<tt>[[:$1]]</tt>'''
+* Pangalan ng umiiral na talaksan: '''<tt>[[:$2]]</tt>'''
 Pumili ng ibang pangalan.",
 'fileexists-thumbnail-yes' => "Mukhang pinaliit ''(thumbnail)'' na larawan ang talaksan. [[$1|thumb]]
 Paki tingin ang talaksan '''<tt>[[:$1]]</tt>'''.
@@ -1604,6 +1644,48 @@ Kapag nagpatuloy ang suliranin, makipagugnayan sa isang [[Special:ListUsers/syso
 'upload-too-many-redirects' => 'Naglalaman ng napakaraming panlipat ng pupuntahan ang URL',
 'upload-unknown-size' => 'Hindi nalalamang laki',
 'upload-http-error' => 'Naganap ang isang kamaliang pang-HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'Hindi makakakuha ng mga pagkakarga ng kopya mula sa nasasakupang ito.',
+
+# File backend
+'backend-fail-stream' => 'Hindi mapadaloy ang talaksang $1.',
+'backend-fail-backup' => 'Hindi na makatigan ng kopya ang talaksang $1.',
+'backend-fail-notexists' => 'Hindi umiiral ang talaksang $1.',
+'backend-fail-hashes' => 'Hindi makuha ang mga tadtad ng talaksan para sa paghahambing.',
+'backend-fail-notsame' => 'Isang hindi kamukhang talaksan ang umiiral na sa $1.',
+'backend-fail-invalidpath' => 'Ang $1 ay hindi isang katanggap-tanggap na landas ng imbakan.',
+'backend-fail-delete' => 'Hindi mabura ang talaksang $1.',
+'backend-fail-alreadyexists' => 'Umiiral na ang pahinang $1.',
+'backend-fail-store' => 'Hindi maimbak ang talaksang $1 sa $2.',
+'backend-fail-copy' => 'Hindi makopya ang talaksang $1 sa $2.',
+'backend-fail-move' => 'Hindi mailipat ang talaksang $1 sa $2.',
+'backend-fail-opentemp' => 'Hindi mabuksan ang pansamantalang talaksan.',
+'backend-fail-writetemp' => 'Hindi maisulat sa pansamantalang talaksan.',
+'backend-fail-closetemp' => 'Hindi maisara ang pansamantalang talaksan.',
+'backend-fail-read' => 'Hindi mabasa ang talaksang $1.',
+'backend-fail-create' => 'Hindi maisulat ang talaksang $1.',
+'backend-fail-maxsize' => 'Hindi maisulat ang talaksang $1 dahil mas malaki ito kaysa sa {{PLURAL:$2|isang byte|$2 mga byte}}.',
+'backend-fail-readonly' => 'Ang hulihang likuran ng pag-iimbak na "$1" ay kasalukuyang mababasa lamang. Ang dahilang ibinigay ay: "\'\'$2\'\'"',
+'backend-fail-synced' => 'Ang talaksang "$1" ay nasa isang katayuang pabagu-bago sa loob ng mga panloob na hulihang likuran ng pag-iimbak',
+'backend-fail-connect' => 'Hindi makakunekta sa hulihang panlikod ng imbakan na "$1".',
+'backend-fail-internal' => 'Naganap ang isang hindi mapag-alamang kamalian sa huling likuran ng imbakan na "$1".',
+'backend-fail-contenttype' => 'Hindi matukoy ang uri ng nilalaman ng talaksang maiimbak sa "$1".',
+'backend-fail-batchsize' => 'Ang hulihang panlikuran ay nabigyan ng isang pulutong na $1 talaksan ng {{PLURAL:$1|operasyon|mga operasyon}}; ang hangganan ay $2 {{PLURAL:$2|operasyon|mga operasyon}}.',
+'backend-fail-usable' => 'Hindi maisulat ang talaksang $1 dahil sa hindi sapat na mga kapahintulutan o nawawalang mga direktoryo/mga lalagyan.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Hindi makakunekta sa kalipunang pandato ng talaarawan para sa hulihang panlikuran ng imbakang "$1".',
+'filejournal-fail-dbquery' => 'Hindi maisapanahon ang kalipunan ng dato ng talaarawan para sa hulihang panlikod ng imbakang "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Hindi mabuksan ang "$1"; hindi ito nakakandado.',
+'lockmanager-fail-closelock' => 'Hindi maisara ang talaksan ng kandado para sa "$1".',
+'lockmanager-fail-deletelock' => 'Hindi mabura ang talaksan ng kandado para sa "$1".',
+'lockmanager-fail-acquirelock' => 'Hindi makamtan ang kandado para sa "$1".',
+'lockmanager-fail-openlock' => 'Hindi mabuksan ang talaksan ng kandado para sa "$1".',
+'lockmanager-fail-releaselock' => 'Hindi mapakawalan ang kandado para sa "$1".',
+'lockmanager-fail-db-bucket' => 'Hindi sapat na makaugnay sa mga kalipunang pandato ng kandado sa timba na $1.',
+'lockmanager-fail-db-release' => 'Hindi mapakawalan ang mga kandado sa kalipunan ng dato na $1.',
+'lockmanager-fail-svr-release' => 'Hindi mapakawalan ang mga kandado sa tagapaghain na $1.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Nakaranas ng isang kamalian habang binubuksan ang talaksan para sa mga pagsusuri ng ZIP.',
@@ -1621,12 +1703,13 @@ Hindi ito maaaring suriin ng tama para sa kaligtasan.',
 'uploadstash-badtoken' => 'Hindi matagumpay ang pagsasagawa ng mga galaw, maaaring dahil wala nang bisa ang iyong mga katibayan ng kapangyarihang mamatnugot.  Subukang muli.',
 'uploadstash-errclear' => 'Nabigo ang paghawi ng mga talaksan.',
 'uploadstash-refresh' => 'Sariwain ang talaan ng mga talaksan',
+'invalid-chunk-offset' => 'Hindi katanggap-tanggap na pagbawi ng tipak',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Hindi pinayagan ang pagpunta',
-'img-auth-nopathinfo' => 'Nawawalang PATH_INFO.
-Ang tagapaghain mo ay hindi nakatakdang na maipasa ang kabatirang ito.
-Maaaring pang-CGI ito at hindi makatangkilik ng img_auth.
+'img-auth-nopathinfo' => 'Nawawala ang PATH_INFO.
+Ang tagapaghain mo ay hindi nakatakda na magpasa ng ganitong kabatiran.
+Maaaring pang-CGI ito at hindi sumusuporta ng img_auth.
 Tingnan ang https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Ang hiniling na daan ay wala sa loob ng isinaayos na direktoryo ng pagkarga.',
 'img-auth-badtitle' => 'Hindi nagawang makabuo ng tanggap na pamagat mula sa "$1".',
@@ -1660,17 +1743,16 @@ Pakisuring muli kung tama ang URL at kung buhay ang sityo/sayt.',
 Pakisuri kung buhay ang sayt, maghintay ng kaunti at subukin uli.
 Maaaring ibigin mong subukin uli sa isang hindi gaanong abalang panahon.',
 
-'license' => 'Paglilisensya:',
-'license-header' => 'Paglilisensya',
+'license' => 'Paglilisensiya:',
+'license-header' => 'Paglilisensiya',
 'nolicense' => 'Walang napili',
 'license-nopreview' => '(Walang makuhang paunang tingin)',
 'upload_source_url' => ' (isang tanggap at napupuntahan ng publikong URL)',
 'upload_source_file' => ' (isang talaksan sa iyong kompyuter)',
 
 # Special:ListFiles
-'listfiles-summary' => 'Ipinapakita nitong natatanging pahinang ang lahat ng naikargang mga talaksan.
-Bilang naitakda ipinapakita sa itaas ng talaan ang huling ikinargang mga talaksan.
-Mababago ang pagkakapangkat-pangkat sa pamamagitan ng pagpindot sa isang paulo ng pahabang kahanayan.',
+'listfiles-summary' => 'Ipinapakita ng natatanging pahinang ito ang lahat ng naikargang mga talaksan.
+Kapag sinala ng tagagamit, tanging mga talaksan lang kung saan nagkarga ang tagagamit na iyan ng pinaka kamakailang bersiyon ng talaksan ang ipinapakita.',
 'listfiles_search_for' => 'Hanapin ang pangalan ng midya:',
 'imgfile' => 'talaksan',
 'listfiles' => 'Talaan ng talaksan',
@@ -1680,7 +1762,7 @@ Mababago ang pagkakapangkat-pangkat sa pamamagitan ng pagpindot sa isang paulo n
 'listfiles_user' => 'Tagagamit',
 'listfiles_size' => 'Sukat',
 'listfiles_description' => 'Paglalarawan',
-'listfiles_count' => 'Mga bersyon',
+'listfiles_count' => 'Mga bersiyon',
 
 # File description page
 'file-anchor-link' => 'Talaksan',
@@ -1699,19 +1781,24 @@ Mababago ang pagkakapangkat-pangkat sa pamamagitan ng pagpindot sa isang paulo n
 'filehist-filesize' => 'Sukat ng talaksan',
 'filehist-comment' => 'Puna/Kumento',
 'filehist-missing' => 'Nawawala ang talaksan',
-'imagelinks' => 'Mga kawing ng talaksan',
+'imagelinks' => 'Paggamit ng talaksan',
 'linkstoimage' => 'Nakakawing ang sumusunod na {{PLURAL:$1|pahina|$1 mga pahina}} sa talaksang ito.',
 'linkstoimage-more' => 'Mahigit sa $1 {{PLURAL:$1|pahina|mga pahina}} ang nakakawing sa talaksang ito.
 Ipinapakita sa sumusunod na talaan ang {{PLURAL:$1|unang pahina lamang|unang $1 mga pahina lamang}} na nakakawing sa talaksang ito.
 Mayroong makukuhang [[Special:WhatLinksHere/$2|buong talaan]].',
 'nolinkstoimage' => 'Walang pahinang nakakawing sa talaksang ito.',
 'morelinkstoimage' => 'Tingnan ang [[Special:WhatLinksHere/$1|mas marami pang mga kawing]] para sa pahinang ito.',
+'linkstoimage-redirect' => '$1 (pagpapapunta ng talaksan sa ibang lugar) $2',
 'duplicatesoffile' => 'Ang sumusunod na {{PLURAL:$1|file is a duplicate|$1 mga talaksan ay mga kapareho}} ng talaksang ito ([[Special:FileDuplicateSearch/$2|mas marami pang mga detalye]]):',
 'sharedupload' => 'Ang talaksang ito ay nagmula sa $1 at maaaring gamitin ng iba pang mga proyekto.',
 'sharedupload-desc-there' => 'Ang talaksang ito ay nagmula sa $1 at maaaring gamitin sa ibang mga proyekto.
 Pakitingnan ang [$2 pahina ng paglalarawan ng talaksan] para sa iba pang kabatiran.',
 'sharedupload-desc-here' => 'Ang talaksang ito ay nagmula sa $1 at maaaring gamitin sa ibang mga proyekto.
 Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito doon ay ipinapakita sa ibaba.',
+'sharedupload-desc-edit' => 'Ang talaksang ito ay mula sa $1 at maaaring gamitin ng iba pang mga proyekto.
+Marahil ay nais mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawan ng talaksan] nito.',
+'sharedupload-desc-create' => 'Ang talaksang ito ay mula sa $1 at maaaring gamitin ng iba pang mga proyekto.
+Marahil ay naisa mong baguhin ang paglalarawan doon sa [$2 pahina ng paglalarawan ng talaksan] nito.',
 'filepage-nofile' => 'Walang talaksang umiiral sa pangalang ito.',
 'filepage-nofile-link' => 'Walang talaksang umiiral sa pangalang ito, ngunit maaari mong [$1 kargahin ito].',
 'uploadnewversion-linktext' => 'Magkarga ng isang bagong bersyon ng talaksang ito',
@@ -1746,6 +1833,7 @@ Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito do
 ** Nagkadalawang talaksan',
 'filedelete-edit-reasonlist' => 'Baguhin ang mga dahilan ng pagbura',
 'filedelete-maintenance' => 'Pansamantalang hindi pinagana ang pagbura at pagpapnumbalik ng mga talaksan habang nagpapanatili ng kaayusan.',
+'filedelete-maintenance-title' => 'Hindi mabura ang talaksan',
 
 # MIME search
 'mimesearch' => 'Maghanap ng MIME',
@@ -1793,7 +1881,7 @@ Ang paglalarawang nasa ibabaw ng [$2 pahina ng paglalarawan ng talaksan] nito do
 'statistics-users-active-desc' => 'Mga tagagamit na nagsagawa ng isang galaw/gawain sa huling {{PLURAL:$1|araw|$1 mga araw}}',
 'statistics-mostpopular' => 'Mga pinakarinarayong pahina',
 
-'disambiguations' => 'Mga pahina ng paglilinaw',
+'disambiguations' => 'Mga pahinang nakakawing sa mga pahina ng paglilinaw',
 'disambiguationspage' => 'Template:disambig',
 'disambiguations-text' => "Ang sumusunod ay mga pahinang may ugnay (link) sa isang '''pahinang naglilinaw'''.
 Dapat silang umugnay sa tamang paksa<br />
@@ -1841,6 +1929,8 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 'wantedpages' => 'Kinakailangang mga pahina',
 'wantedpages-badtitle' => 'Hindi tanggap na pamagat sa loob ng pangkat ng kinalabasan: $1',
 'wantedfiles' => 'Ninanais na mga talaksan',
+'wantedfiletext-cat' => 'Ang sumusunod na mga talaksan ay ginagamit ngunit hindi naman umiiral. Ang mga talaksang nagmumula sa mga repositoryong dayuhan ay maaariing nakalista kahit na umiiral. Ang anumang ganyang mga kamalian sa pagiging positibo ay <del>aalisin</del>. Bilang karagdagan, ang mga pahinang may nakabaon na mga talaksang hindi umiiral ay nakatala sa [[:$1]]',
+'wantedfiletext-nocat' => 'Ginagamit ang sumusunod na mga talaksan ngunit hindi naman umiiral. Ang mga talaksan mula sa mga repositoryong dayuhan ay maaaring nakalista kahit na umiiral. Ang ganyang mga kamalian sa pagiging positibo ay <del>aalisin</del>.',
 'wantedtemplates' => 'Ninanais na mga suleras',
 'mostlinked' => 'Pinakamaraming ugnay sa mga pahina',
 'mostlinkedcategories' => 'Pinakamaraming ugnay sa mga kategorya',
@@ -1849,9 +1939,10 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 'mostimages' => 'Pinakamaraming ugnay sa mga larawan',
 'mostrevisions' => 'Mga artikulong may pinakamaraming pagbabago',
 'prefixindex' => 'Lahat ng mga pahinang may unlapi',
+'prefixindex-namespace' => 'Lahat ng mga pahinang may unlapi ($1 puwang ng pangalan)',
 'shortpages' => 'Mga maiikling pahina',
 'longpages' => 'Mga mahahabang pahina',
-'deadendpages' => 'Mga pahinang walang panloob na ugnay (internal link)',
+'deadendpages' => 'Mga pahinang walang kawing panloob (internal link)',
 'deadendpagestext' => "Ang mga sumusunod na mga pahina'y hindi umuugnay sa ibang mga pahina sa wiking ito.",
 'protectedpages' => 'Mga nakaprotektang pahina',
 'protectedpages-indef' => 'Mga walang katiyakang proteksyon lamang',
@@ -1865,7 +1956,7 @@ Nasugpo na ang mga ipinasok na <del>inekisan</del>.',
 'listusers-editsonly' => 'Ipakita lamang ang mga tagagamit na gumawa/nakagawa na ng mga pagbabago',
 'listusers-creationsort' => 'Pagsama-samahin ayon sa petsa ng pagkakalikha',
 'usereditcount' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
-'usercreated' => 'Nalikha noong $1 sa ika-$2',
+'usercreated' => '{{GENDER:$3|Nalikha}} noong $1 sa ika-$2',
 'newpages' => 'Mga bagong pahina',
 'newpages-username' => 'Bansag:',
 'ancientpages' => 'Mga pinakalumang pahina',
@@ -1892,14 +1983,15 @@ na iba pang impormasyon tungkol sa mga aklat na hinahanap mo:',
 'booksources-invalid-isbn' => 'Tila mukhang hindi yata katanggap-tanggap ang ibinigay na ISBN; pakisuri kung may mga kamalian ang pagkakasip/pagkakakopya mula sa orihinal na pinagmulan.',
 
 # Special:Log
-'specialloguserlabel' => 'Tagagamit:',
-'speciallogtitlelabel' => 'Pamagat:',
+'specialloguserlabel' => 'Tagaganap:',
+'speciallogtitlelabel' => 'Pinupukol (pamagat o tagagamit):',
 'log' => 'Mga talaan',
 'all-logs-page' => 'Lahat ng mga pampublikong tala',
 'alllogstext' => 'Pinagsama-samang mga pagpapakita ng makukuhang mga talaan ng {{SITENAME}}.
 Maaari mong pakitirin/pakiputin ang ipinapakita sa pamamagitan ng pagpili ng uri ng mga talaan, ang pangalan ng tagagamit (maselan ang pagmamakiniliya ng panitik), o ang naaapektuhang pahina (maselan din ang pagmamakinilya ng panitik).',
 'logempty' => 'Walang katumbas na bagay sa talaan.',
 'log-title-wildcard' => 'Hanapin ang mga pamagat na nagsisimula sa tekstong ito',
+'showhideselectedlogentries' => 'Ipakita/itago ang napiling mga lahok sa talaan',
 
 # Special:AllPages
 'allpages' => 'Lahat ng pahina',
@@ -1917,6 +2009,12 @@ Maaari mong pakitirin/pakiputin ang ipinapakita sa pamamagitan ng pagpili ng uri
 'allpagesprefix' => 'Ipakita ang mga pahinang may unlaping:',
 'allpagesbadtitle' => 'Ang binagay na pamagat ng pahina ay hindi tinatanggap o may unlapi na tumuturo sa ibang wika o wiki.  Maaaring naglalaman ito ng isa o higit pa na mga karakter na hindi ginagamit bilang pamagat.',
 'allpages-bad-ns' => 'Wala sa {{SITENAME}} ang espasyo ng pangalang "$1".',
+'allpages-hide-redirects' => 'Itago ang mga pagpapapunta sa iba',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tinatanaw mo ang isang bersyong nakatago ng pahinang ito, na maaaring $1 na ang katagalan.',
+'cachedspecial-viewing-cached-ts' => 'Tinatanaw mo ang isang bersyong nakatago ng pahinang ito, na maaaring hindi buo ang katalagahan.',
+'cachedspecial-refresh-now' => 'Tingnan ang pinakahuli.',
 
 # Special:Categories
 'categories' => 'Mga kategorya',
@@ -1933,12 +2031,13 @@ Tingnan din ang [[Special:WantedCategories|ninanais na mga kategorya]].',
 'sp-deletedcontributions-contribs' => 'mga ambag',
 
 # Special:LinkSearch
-'linksearch' => 'Panlabas na mga kawing',
+'linksearch' => 'Paghanap sa mga kawing na panlabas',
 'linksearch-pat' => 'Huwaran ng hanap',
 'linksearch-ns' => 'Pangalang espasyo',
 'linksearch-ok' => 'Hanapin',
-'linksearch-text' => 'Maaaring gamitin ang mga "barahang panghalili/pamalit" (mga \'\'wildcard\'\') katulad ng "*.wikipedia.org".<br />
-Sinusuportahang mga protokolo: <tt>$1</tt>',
+'linksearch-text' => 'Maaaring gamitin ang mga "barahang pamalit" na katulad ng "*.wikipedia.org".
+Kailangan ng kahit na isang nasasakupang mataas ang kaantasan, halimbawa na ang "*.org".<br />
+Sinusuportahang mga protokolo: <tt>$1</tt> (huwag idagdag ang anuman sa mga ito sa paghahanap mo).',
 'linksearch-line' => '$1 nakakawing/nakaugnay mula sa $2',
 'linksearch-error' => "Lilitaw lamang ang mga \"barahang-pamalit\" (''wildcard'') sa simula ng pangunahin/punong-abalang pangalan.",
 
@@ -1985,9 +2084,9 @@ Maaaring may mga [[{{MediaWiki:Listgrouprights-helppage}}|karagdagang kabatiran]
 'emailuser' => 'Padalhan ng e-liham ang tagagamit',
 'emailpage' => 'Magpadala ng e-liham sa tagagamit',
 'emailpagetext' => 'Magagamit mo ang pormularyo sa ibaba para makapagpadala ng mensahe sa pamamagitan ng isang e-liham para sa tagagamit na ito.
-Ang ipinasok mong adres ng e-liham sa [[Special:Preferences|iyong mga kagustuhan ng tagagamit]] ay lilitaw bilang adres na "Mula kay" ng e-liham, para tuwirang makatugon sa iyo ang nakatanggap.',
+Ang ipinasok mong direksiyong e-liham sa [[Special:Preferences|iyong mga kagustuhan ng tagagamit]] ay lilitaw bilang adres na "Mula kay" ng e-liham, para tuwirang makatugon sa iyo ang nakatanggap.',
 'usermailererror' => 'Pagkakamaling sanhi ng pagkakabalik ng liham mula sa puntirya:',
-'defemailsubject' => 'E-liham ng {{SITENAME}}',
+'defemailsubject' => 'E-liham ng {{SITENAME}} mula sa tagagamit na si "$1"',
 'usermaildisabled' => 'Hindi pinagana ang e-liham ng tagagamit',
 'usermaildisabledtext' => 'Hindi maaaring magpadala ng e-liham sa ibang mga tagagamit sa wiki na ito.',
 'noemailtitle' => 'Walang adres ng e-liham',
@@ -2020,10 +2119,12 @@ Ang ipinasok mong adres ng e-liham sa [[Special:Preferences|iyong mga kagustuhan
 'watchlistfor2' => 'Para sa $1 $2',
 'nowatchlist' => 'Wala kang pahinang binabantayan.',
 'watchlistanontext' => 'Paki $1 upang makita o mabago ang mga aytem sa iyong binabantayan.',
-'watchnologin' => 'Di ka naka-lagda',
+'watchnologin' => 'Hindi nakalagda',
 'watchnologintext' => 'Dapat kang [[Special:UserLogin|nakalagda]] upang mabago ang talaan mo ng mga binabantayan.',
+'addwatch' => 'Idagdag sa bantayan',
 'addedwatchtext' => "Dinagdag na ang pahinang \"[[:\$1]]\" sa iyong [[Special:Watchlist|Babantayan]].
 Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang usapang pahina, at ang pahina ay makikitang sa '''malalaking titik''' ('''''bold''''') sa [[Special:RecentChanges|tala ng mga huling binago]] para madaling makita.",
+'removewatch' => 'Alisin mula sa bantayan',
 'removedwatchtext' => 'Ang pahinang "[[:$1]]" ay tinanggal na mula sa [[Special:Watchlist|iyong talaan ng binabantayan]].',
 'watch' => 'Bantayan ito',
 'watchthispage' => 'Bantayan ang pahinang ito',
@@ -2039,13 +2140,14 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 'watchmethod-list' => 'sinusuri ang binabantayang mga pahina para sa mga kamakailan lamang na mga pagbabago',
 'watchlistcontains' => 'Naglalaman ng $1 {{PLURAL:$1|pahina|mga pahina}} ang iyong talaan ng mga binabantayan.',
 'iteminvalidname' => "May suliranin ang bagay na '$1', hindi tanggap na pangalan...",
-'wlnote' => "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}.",
+'wlnote' => "Nasa ibaba ang {{PLURAL:$1|pinakahuling pagbabago|pinakahuling '''$1''' mga pagbabago}} sa loob ng huling {{PLURAL:$2|oras|'''$2''' mga oras}}, magmula noong $3 sa ganap na ika-$4.",
 'wlshowlast' => 'Ipakita ang huling $1 mga oras $2 mga araw $3',
 'watchlist-options' => 'Mga pagpipilian para sa talaan ng mga binabantayan',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Isinasama sa mga binabantayan...',
 'unwatching' => 'Tinatanggal mula sa mga binabantayan...',
+'watcherrortext' => 'Naganap ang isang kamalian habang binabago ang mga katakdaan ng bantayan mo para sa "$1".',
 
 'enotif_mailer' => 'Tagapagpadala ng mga Pahayag ng {{SITENAME}}',
 'enotif_reset' => 'Tatakan ang lahat ng pahina bilang nadalaw na',
@@ -2057,29 +2159,35 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 'enotif_lastvisited' => 'Tingnan ang $1 para sa lahat ng mga pagbabago magmula noong huling pagdalaw mo.',
 'enotif_lastdiff' => 'Tingnan ang $1 para makita ang pagbabagong ito.',
 'enotif_anon_editor' => 'hindi nakikilalang tagagamit $1',
-'enotif_body' => 'Mahal na $WATCHINGUSERNAME,
+'enotif_body' => 'Mahal naming $WATCHINGUSERNAME,
 
 
-Ang pahinang $PAGETITLE ng {{SITENAME}} ay $CHANGEDORCREATED noong $PAGEEDITDATE ni $PAGEEDITOR, tingnan ang $PAGETITLE_URL para sa pangkasalukuyang rebisyon.
+Ang pahinang $PAGETITLE ng {{SITENAME}} ay $CHANGEDORCREATED ni $PAGEEDITOR noong $PAGEEDITDATE, tingnan ang $PAGETITLE_URL para sa pangkasalukuyang rebisyon.
 
 $NEWPAGE
 
-Buod mula sa patnugot: $PAGESUMMARY $PAGEMINOREDIT
+Buod ng patnugot: $PAGESUMMARY $PAGEMINOREDIT
 
 Makipagugnayan sa patnugot:
 liham: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
 Wala nang iba pang mga pagpapahayag sa pagkakataon ng pagkakaroon ng karagdagang mga pagbabago maliban na lamang kung dadalawin mo ang pahinang ito.
-Maaari mo ring muling itakda ang mga watawat na pangpag-uulat para sa lahat ng mga pahinang binabantayan mo sa loob ng iyong talaan ng mga binabantayan.
+Maaari mo ring itakda muli ang mga watawat na pangpagpapabatid para sa lahat ng mga pahinang binabantayan mo sa loob ng iyong talaan ng mga binabantayan.
 
-             Ang iyong palakaibigang sistemang pangpag-uulat ng {{SITENAME}}
+Ang iyong maginhawang sistema ng pagpapabatid ng {{SITENAME}}
 
 --
-Para baguhin ang mga pagtatakda ng iyong talaan ng mga binabantayan, puntahan ang
+Upang mabago ang mga katakdaan sa iyong talaan ng mga binabantayan, dalawin ang
+{{canonicalurl:{{#special:Preferences}}}}
+
+Upang baguhin ang mga katakdaan ng bantayan mo, dumalaw sa
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Upang burahin ang pahina mula sa pahina mo ng mga binabantayan, dumalaw sa
 $UNWATCHURL
 
-Balik-tugon at karagdagang tulong:
+Tugon at karagdagang tulong:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2138,14 +2246,17 @@ Pakipindot ang pindutang \"ibalik\" (''back'') at ikarga uli ang pinanggalingan
 
 # Protect
 'protectlogpage' => 'Talaan ng pagsasanggalang',
-'protectlogtext' => 'Nasa ibaba ang isang talaan ng mga pagkandado at pagtanggal na mga pagkandado ng pahina.
-Tingnan ang [[Special:ProtectedPages|talaan ng nakasanggalang na mga pahina]] para sa talaan ng mga pangkasalukuyang gumaganang mga pagsasanggalang ng pahina.',
+'protectlogtext' => 'Nasa ibaba ang isang talaan ng mga pagbabago sa mga pruteksiyon ng pahina.
+Tingnan ang [[Special:ProtectedPages|talaan ng pinuprutektahang mga pahina]] para sa talaan ng kasalukuyang gumaganang mga pagprutekta ng pahina.',
 'protectedarticle' => 'ipinagsanggalang ang "[[$1]]"',
 'modifiedarticleprotection' => 'binago ang antas ng panananggalang para sa "[[$1]]"',
-'unprotectedarticle' => 'tinanggal sa panananggalang ang "[[$1]]"',
+'unprotectedarticle' => 'tinanggal ang pruteksiyon mula sa "[[$1]]"',
 'movedarticleprotection' => 'inilipat ang pagtatakdang pampanananggalang mula sa "[[$2]]" patungong "[[$1]]"',
 'protect-title' => 'Palitan ang antas ng panananggalang para sa "$1"',
+'protect-title-notallowed' => 'Tingnan ang antas ng proteksiyon ng "$1"',
 'prot_1movedto2' => 'Inilipat ang [[$1]] patungo sa [[$2]]',
+'protect-badnamespace-title' => 'Hindi mapupruteksiyunang puwang ng pangalan',
+'protect-badnamespace-text' => 'Hindi mapupruteksiyunan ang mga pahinang nasa puwang na pampangalang ito.',
 'protect-legend' => 'Pagtibayin/tiyakin ang panananggalang',
 'protectcomment' => 'Dahilan:',
 'protectexpiry' => 'Magtatapos sa:',
@@ -2167,6 +2278,7 @@ Maaari mong baguhin ang antas ng panananggalang ng pahina, ngunit hindi ito maka
 'protect-level-sysop' => "Mga tagapangasiwa (''sysop'') lamang",
 'protect-summary-cascade' => 'baita-baitang',
 'protect-expiring' => 'mawawalan ng bisa sa $1 (UTC)',
+'protect-expiring-local' => 'magtatapos sa $1',
 'protect-expiry-indefinite' => 'walang katiyakan',
 'protect-cascade' => 'Ipagsanggalang ang mga pahinang kasama/kabilang sa pahinang ito (baita-baitang na panananggalang)',
 'protect-cantedit' => 'Hindi mo mababago ang mga antas ng panananggalang ng pahinang ito, dahil wala kang pahintulot para baguhin ito.',
@@ -2207,8 +2319,8 @@ Maaari mong baguhin ang antas ng panananggalang ng pahina, ngunit hindi ito maka
 'undeletepagetext' => 'Ang sumusunod na {{PLURAL:$1|pahina ay nabura na subalit |$1 mga pahina ay nabura na subalit}} nananatili pa rin sa sinupan/arkibo at maaaring bang ibalik mula sa pagkakabura.
 Maaaring palagiang linisin o tanggalan ng laman ang sinupan/arkibo.',
 'undelete-fieldset-title' => 'Ibalik ang mga pagbabago',
-'undeleteextrahelp' => "Para maibalik ang kabuoan ng kasaysayan ng pahina, iwanang walang laman ang mga kahong lagayan ng mga tsek at pindutin ang '''''Ibalik'''''. Para maisagawa ang pagbabalik na may pagpili, lagyan ng tsek ang mga kahong may kaugnayan sa pagpapabalik ng mga pagbabago at pindutin ang '''''Ibalik'''''.
-Malilinis ang pook ng kumento/puna at iba pang mga kahong lagayan ng mga tsek kapag pinindot ang '''''Magtakda uli'''''.",
+'undeleteextrahelp' => "Upang maibalik ang buong kasaysayan ng pahina, iwanang walang mga tsek ang lahat ng mga kahon at lagitikin ang '''''{{int:undeletebtn}}'''''.
+Upang makapagsagawa ng pagpapanumbalik na may pinipili, tsekan ang mga kahon na tumutugma sa mga pagbabagong ibabalik, at pindutin ang '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => 'Sininop/nilagay sa sinupan o arkibo ang $1 {{PLURAL:$1|pagbabago|mga pagbabago}}',
 'undeletehistory' => 'Kapag ibinalik mo ang pahina, ibabalik ang lahat ng mga pagbabago sa kasaysayan.
 Kapag nalikha ang isang bagong pahinang may katulad na pangalan mula noong pagbura, lilitaw ang naibalik na mga pagbabago sa sinaunang kasaysayan.',
@@ -2232,6 +2344,7 @@ Sa ganitong mga pagkakataon, dapat mong tanggalin ang tsek o huwag itago ang pin
 
 Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng mga kamakailan lamang na mga pagbubura at mga pagbabalik mula sa pagkakabura.",
 'undelete-header' => 'Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa kamakailan lamang na  binura/naburang mga pahina.',
+'undelete-search-title' => 'Hanapin ang binurang mga pahina',
 'undelete-search-box' => 'Hanapin ang binura/naburang mga pahina',
 'undelete-search-prefix' => 'Ipakita ang mga pahinang nagsisimula sa:',
 'undelete-search-submit' => 'Maghanap',
@@ -2240,6 +2353,7 @@ Tingnan ang [[Special:Log/delete|talaan ng pagbubura]] para sa isang talaan ng m
 'undelete-bad-store-key' => 'Hindi maibalik mula sa pagkakabura ang pagbabagong pangtalaksang may tatak ng oras na $1: nawawala na ang talaksan bago pa maganap ang pagbura.',
 'undelete-cleanup-error' => 'Mali ang pagbura sa hindi ginagamit na talaksan ng sinupan/arkibong "$1".',
 'undelete-missing-filearchive' => 'Hindi naibalik mula sa pagkakabura ang sinupan/arkibo ng talaksang may ID na $1 dahil wala ito sa kalipunan ng dato.  Maaaring naibalik na ito dati mula sa pagkakabura.',
+'undelete-error' => 'Kamalian sa hindi pagbura ng pahina',
 'undelete-error-short' => 'May mali sa pagkakabalik mula sa pagkakabura ng talaksang: $1',
 'undelete-error-long' => 'Nakaranas ng mga kamalian habang ibinabalik mula sa pagkakabura ang talaksang:
 
@@ -2250,13 +2364,15 @@ $1',
 # Namespace form on various pages
 'namespace' => 'Espasyo ng pangalan:',
 'invert' => 'Baligtarin and pinili',
+'tooltip-invert' => 'Tsekan ang kahong ito upang ikubli ang mga pagbabago sa mga pahina sa loob ng napiling mga puwang ng pangalan (at ang kaugnay na puwang ng pangalan kung may tsek)',
 'namespace_association' => 'Kaugnay na mga puwang na pampangalan',
+'tooltip-namespace_association' => 'Tsekan ang kahong ito upang maisama ang puwang na pampangalan ng usapan o paksa na may kaugnayan sa napiling puwang na pampangalan',
 'blanknamespace' => '(Pangunahin)',
 
 # Contributions
 'contributions' => 'Mga ambag ng tagagamit',
 'contributions-title' => 'Mga ambag ng tagagamit na si $1',
-'mycontris' => 'Aking mga ginawa',
+'mycontris' => 'Mga ambag ko',
 'contribsub2' => 'Para kay $1 ($2)',
 'nocontribs' => 'Walang pagbabagong nakita sa binigay na kondisyon.',
 'uctop' => ' (itaas)',
@@ -2290,7 +2406,7 @@ Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa ibaba para sa pa
 'nolinkshere-ns' => "Walang pahinang nakakawing sa '''[[:$1]]''' mula sa loob ng napiling espasyo ng pangalan.",
 'isredirect' => 'pahinang panturo/panuto',
 'istemplate' => 'pagsasali',
-'isimage' => 'kawing ng/sa larawan',
+'isimage' => 'kawing sa talaksan',
 'whatlinkshere-prev' => '{{PLURAL:$1|nakaraang|nakaraang $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|susunod|susunod na $1}}',
 'whatlinkshere-links' => '← mga kawing',
@@ -2339,7 +2455,7 @@ Punan ang espesipikong dahilan sa ibaba (halimbawa, magbanggit ng partikular na
 'badipaddress' => 'Hindi tanggap na adres ng IP',
 'blockipsuccesssub' => 'Matagumpay ang pagharang/paghadlang',
 'blockipsuccesstext' => 'Hinadlangan ang  [[Special:Contributions/$1|$1]].<br />
-Tingnan ang [[Special:BlockList|talaan ng mga hinadlangang IP]] upang makita ang mga paghadlang.',
+Tingnan ang [[Special:BlockList|talaan ng mga hinadlangan]] upang suriin ang mga paghadlang.',
 'ipb-blockingself' => 'Hahadlangan mo na ang sarili mo!  Nakatitiyak ka bang nais mong gawin iyan?',
 'ipb-confirmhideuser' => 'Hahadlangan mo na ang isang tagagamit na pinagagana ang "ikubli ang tagagamit".  Susupilin nito ang pangalan ng tagagamit sa lahat ng mga pagpapasok sa mga tala at mga talaan.  Nakatitiyak ka bang nais mong gawin iyan?',
 'ipb-edit-dropdown' => 'Baguhin ang mga dahilan sa pagharang',
@@ -2359,6 +2475,7 @@ Tingnan ang [[Special:BlockList|talaan ng mga hinadlangang IP]] upang makita ang
 'blocklist-userblocks' => 'Itago ang mga paghahadlang ng akawnt',
 'blocklist-tempblocks' => 'Pansamantalang ikubli ang mga pagharang',
 'blocklist-addressblocks' => 'Itago ang isahang mga paghadlang sa IP',
+'blocklist-rangeblocks' => 'Itago ang mga tipak ng nasasaklawan',
 'blocklist-timestamp' => 'Tatak ng oras',
 'blocklist-target' => 'Puntirya',
 'blocklist-expiry' => 'Magtatapos sa',
@@ -2381,6 +2498,7 @@ Tingnan ang [[Special:BlockList|talaan ng mga hinadlangang IP]] upang makita ang
 'unblocklink' => 'tanggalin ang pagharang/paghadlang',
 'change-blocklink' => 'baguhin ang pagharang/paghadlang',
 'contribslink' => 'ambag',
+'emaillink' => 'ipadala ang e-liham',
 'autoblocker' => 'Kusang hinarang dahil ang iyong adres ng IP ay kamakailan lamang na ginamit ni "[[User:$1|$1]]".
 Ang dahilang ibinigay para sa pagharang kay $1 ay: "$2"',
 'blocklogpage' => 'Tala ng pagharang',
@@ -2390,9 +2508,9 @@ Ibinigay sa ibaba ang talaan ng pagharang upang mapagsanggunian:',
 Ang tala ng pagpigil ay ibinigay sa ibaba upang mapagsanggunian:',
 'blocklogentry' => 'hinarang/hinadlangan si [[$1]] na may oras/panahon ng pagtatapos na $2 $3',
 'reblock-logentry' => 'binago ang itinakdang pagharang/paghadlang kay [[$1]] na may oras/panahon ng pagtatapos na $2 $3',
-'blocklogtext' => 'Tala ito ng paghaharang at pagpapawawalang bisa ng pagharang/paghadlang.
-Hindi nakatala rito ang mga awtomatiko/kusang hinarang/hinadlangang mga adres ng IP.
-Tingnan ang [[Special:BlockList|talaan ng mga hinarang na/hinadlangang IP]] para sa talaan ng pangkasalukuyang gumagana pang mga pinagbabawalan at mga pagharang/paghadlang.',
+'blocklogtext' => 'Isa itong talaan ng mga gawain ng pagharang at hindi pagharang sa tagagamit.
+Hindi nakalista ang mga tirahan ng IP ng kusang hinadlangan.
+Tingnan ang [[Special:BlockList|talaan ng pagharang]] para sa lista ng kasalukuyang may bisa na mga pagbabawal at mga paghadlang.',
 'unblocklogentry' => 'tinanggal ang pagharang/paghadlang kay $1',
 'block-log-flags-anononly' => 'mga di-kilalang tagagamit lamang',
 'block-log-flags-nocreate' => 'Nakapatay ang paglikha ng akawnt',
@@ -2446,6 +2564,7 @@ Huwag kalimutang [[Special:UnlockDB|tanggalin ang kandado]] pagkaraan mong maisa
 'lockfilenotwritable' => "Hindi masusulatan ang talaksang pangkandado ng kalipunan ng dato.
 Para ikandado o tanggalin ang kandado ng kalipunan ng dato, kailangan nitong maging nasusulatan/masusulatan ng serbidor ng ''web''.",
 'databasenotlocked' => 'Hindi nakakandado ang kalipunan ng datos.',
+'lockedbyandtime' => '(ni {{GENDER:$1|$1}} noong $2 sa ganap na ika- $3)',
 
 # Move page
 'move-page' => 'Ilipat ang $1',
@@ -2518,7 +2637,7 @@ Pumili muli ng ibang pangalan.',
 
 Mayroon na ang pupuntahang artikulo na "[[$1]]". Nais mo bang burahin ito para magbigay daan para sa paglipat?',
 'delete_and_move_confirm' => 'Oo, burahin ang pahina',
-'delete_and_move_reason' => 'Binura upang makalipat',
+'delete_and_move_reason' => 'Binura upang makapagbigay ng daan para sa paglipat mula sa "[[$1]]"',
 'selfmove' => 'Magkatulad ang pinagmulan at pupuntahan ng mga titulo; hindi mailipat ang isang pahina sa kanyang sarili.',
 'immobile-source-namespace' => 'Hindi mailipat ang mga pahinang nasa espasyo ng pangalang "$1"',
 'immobile-target-namespace' => 'Hindi mailipat ang mga pahina patungo sa espasyo ng pangalang "$1"',
@@ -2547,9 +2666,11 @@ Pumili lang po ng ibang pangalan.',
 Para ilabas ang mga pahina, ipasok ang mga pamagat sa tekstong kahon sa ibaba, isang pamagat bawat guhit, at piliin kung gusto mo rin ang kasalukuyang bersyon o mga lumang bersyon, kasama ang mga pahina ng kasaysayan, o iyon lamang kasalukuyang bersyon kasama ang mga kaalaman tungkol sa huling binago.
 
 Sa huling kaso, maaari mong gumamit ng ungay, hal. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para sa pahinang "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Iluwas ang lahat ng mga pahina',
 'exportcuronly' => 'Isama lamang ang kasalukuyang rebisyon, hindi ang buong kasaysayan',
 'exportnohistory' => "----
 '''Tandaan:''' Nakapatay ang paglalabas ng buong kasaysayan ng pahina ng mga pahina sa pamamagitan ng ''form'' na ito dahil maaaring bumagal ang sayt.",
+'exportlistauthors' => 'Magsama ng isang buong listahan ng mga tagapab-ambag para sa bawat isang pahina',
 'export-submit' => 'Magluwas',
 'export-addcattext' => 'Magdagdag ng mga pahina mula sa kategorya:',
 'export-addcat' => 'Magdagdag',
@@ -2582,6 +2703,8 @@ Pakidalaw ang [//www.mediawiki.org/wiki/Localisation Lokalisasyong MediaWiki] at
 'thumbnail_error' => "May kamalian sa paglikha ng kagyat (''thumbnail''): $1",
 'djvu_page_error' => 'Wala sa nasasakupan ang pahinang DjVu',
 'djvu_no_xml' => 'Hindi makuha ang XML para sa talaksang DjVu',
+'thumbnail-temp-create' => 'Hindi nakalikha ng pansamantalang talaksan ng kagyat',
+'thumbnail-dest-create' => 'Hindi nasagip ang kagyat sa kapupuntahan',
 'thumbnail_invalid_params' => "Hindi tanggap ang mga parametro para sa kagyat (''thumbnail'')",
 'thumbnail_dest_directory' => 'Hindi malikha ang papuntahang direktoryo',
 'thumbnail_image-type' => 'Hindi tinatangkili ang uri ng larawan',
@@ -2626,6 +2749,11 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'import-upload' => 'Magkarga ng datos na XML',
 'import-token-mismatch' => 'Nawala ang dato ng pagpupulong.  Pakisubok muli.',
 'import-invalid-interwiki' => 'Hindi maangkat mula sa tinukoy na wiki.',
+'import-error-edit' => 'Hindi naangkat ang pahinang "$1" dahil  wala kang pahintulot na baguhin ito.',
+'import-error-create' => 'Hindi naangkat ang "$1" dahil wala kang pahintulot na likhain ito.',
+'import-error-interwiki' => 'Hindi naangkat ang pahinang "$1" dahil ang pangalan nito ay nakalaan para sa pagkakawing na panlabas (interwiki).',
+'import-error-special' => 'Hindi naangkat ang pahinang "$1" dahil pag-aari ito ng isang natatanging puwang na pampangalan na hindi nagpapahintulot ng mga pahina.',
+'import-error-invalid' => 'Hindi naangkat ang pahinang "$1" dahil hindi katanggap-tanggap ang pangalan nito.',
 
 # Import log
 'importlogpage' => 'Talaan ng pagaangkat',
@@ -2635,12 +2763,23 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'import-logentry-interwiki' => 'Na-i-transwiki na ang $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|pagbabago|mga pagbabago}} mula sa $2',
 
+# JavaScriptTest
+'javascripttest' => 'Pagsubok sa JavaScript',
+'javascripttest-disabled' => 'Hindi gumagana ang tungkuling ito sa wiking ito.',
+'javascripttest-title' => 'Pinatatakbo ang mga pagsubok ng $1',
+'javascripttest-pagetext-noframework' => 'Nakalaan ang pahinang ito para sa pagpapatakbo ng mga pagsubok ng JavaScript.',
+'javascripttest-pagetext-unknownframework' => 'Hindi napag-aalamang balangkas ng pagsubok na "$1".',
+'javascripttest-pagetext-frameworks' => 'Mangyaring pumili ng isa sa sumusunod na mga  balangkas na pangsubok: $1',
+'javascripttest-pagetext-skins' => 'Pumili ng isang pabalat na patatakbuhan ng mga pagsubok:',
+'javascripttest-qunit-intro' => 'Tingnan ang [$1 dokumentasyon ng pagsubok] sa mediawiki.org.',
+'javascripttest-qunit-heading' => 'Pook na subukan ng QUnit ng JavaScript ng MediaWiki',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ang iyong pahina ng tagagamit',
 'tooltip-pt-anonuserpage' => 'Ang pahina ng tagagamit para sa IP na iyong binabago bilang',
 'tooltip-pt-mytalk' => 'Ang iyong pahina ng usapan',
 'tooltip-pt-anontalk' => 'Usapang tungkol sa mga pagbabagong ginawa sa ip address na ito',
-'tooltip-pt-preferences' => 'Aking mga kagustuhan',
+'tooltip-pt-preferences' => 'Mga nais ko',
 'tooltip-pt-watchlist' => 'Ang talaan ng mga pagbabago sa mga pahinang binabantayan mo',
 'tooltip-pt-mycontris' => 'Talaan ng mga ambag mo',
 'tooltip-pt-login' => 'Hinihimok kang lumagda, bagaman hindi ito kinakailangan.',
@@ -2652,7 +2791,7 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-ca-viewsource' => 'Nakaprotekta ang pahinang ito. Makikita mo lamang ang pinagmulan (source) nito.',
 'tooltip-ca-history' => 'Nakaraang bersyon ng pahinang ito.',
 'tooltip-ca-protect' => 'Iprotekta ang pahinang ito',
-'tooltip-ca-unprotect' => 'Huwag prutektahan ang pahinang ito',
+'tooltip-ca-unprotect' => 'Baguhin ang pruteksiyon ng pahinang ito',
 'tooltip-ca-delete' => 'Burahin ang pahinang ito',
 'tooltip-ca-undelete' => 'Ibalik ang mga pagbabagong ginawa sa pahinang ito bago ito binura',
 'tooltip-ca-move' => 'Ilipat ang pahinang ito',
@@ -2695,6 +2834,8 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 'tooltip-diff' => 'Ipakita ang mga pagbabagong ginawa mo sa teksto.',
 'tooltip-compareselectedversions' => 'Tingnan ang pagkakaiba sa pagitan ng dalawang napiling bersyon ng pahinang ito.',
 'tooltip-watch' => 'Idagdag ang pahinang ito sa iyong tala ng mga binabantayan',
+'tooltip-watchlistedit-normal-submit' => 'Tanggalin ang mga pamagat',
+'tooltip-watchlistedit-raw-submit' => 'Isapanahon ang bantayan',
 'tooltip-recreate' => 'Muling likhain ang pahina kahit na nabura na ito',
 'tooltip-upload' => 'Simulan ang pagkarga',
 'tooltip-rollback' => 'Ibinabalik ng "Pagulungin pabalik sa dati" ang (mga) pagbabago sa pahinang ito patungo sa huling bersyon ng huling tagapagambag sa pamamagitan ng isang pindot lamang.',
@@ -2749,6 +2890,20 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 'spambot_username' => "Paglilinis ng ''spam'' ng MediaWiki",
 'spam_reverting' => "Ibinabalik sa huling bersyon na 'di-naglalaman ng mga kawing sa $1",
 'spam_blanking' => 'Lahat ng mga pagbabago ay naglalaman ng mga kawing sa $1, pagpapatlang',
+'spam_deleting' => 'Lahat ng mga pagbabago ay naglalaman ng mga kawing sa $1, binubura',
+
+# Info page
+'pageinfo-title' => 'Kabatiran para sa "$1"',
+'pageinfo-header-edits' => 'Mga pagpatnugot',
+'pageinfo-header-watchlist' => 'Bantayan ko',
+'pageinfo-header-views' => 'Mga pagtanaw',
+'pageinfo-subjectpage' => 'Pahina',
+'pageinfo-talkpage' => 'Pahina ng usapan',
+'pageinfo-watchers' => 'Bilang ng mga nagbabantay',
+'pageinfo-edits' => 'Bilang ng mga pamamatnugot',
+'pageinfo-authors' => 'Bilang ng magkakabukod na mga may-akda',
+'pageinfo-views' => 'Bilang ng mga pagtanaw',
+'pageinfo-viewsperedit' => 'Pagtanaw sa bawat pagbago',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -2804,7 +2959,7 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 'svg-long-desc' => 'Talaksang SVG, nasa mga bilang na $1 × $2 mga piksel, sukat ng talaksan: $3',
 'show-big-image' => 'Buong resolusyon (kalinawan)',
 'show-big-image-preview' => 'Sukat ng paunang-tingin na ito: $1.',
-'show-big-image-other' => 'Iba pang mga resolusyon: $1.',
+'show-big-image-other' => 'Iba pang {{PLURAL:$2|resolusyon|mga resolusyon}}: $1.',
 'show-big-image-size' => '$1 x $2 mga piksel',
 'file-info-gif-looped' => 'nasilo na',
 'file-info-gif-frames' => '$1 {{PLURAL:$1|banhay|mga banhay}}',
@@ -2826,6 +2981,11 @@ Maaaring manganib ang iyong sistema kapag ipinagana mo ito.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'hours-abbrev' => '$1o',
+'seconds' => '{{PLURAL:$1|$1 segundo|$1 mga segundo}}',
+'minutes' => '{{PLURAL:$1|$1 minuto|$1 mga minuto}}',
+'hours' => '{{PLURAL:$1|$1 horas|$1 mga oras}}',
+'days' => '{{PLURAL:$1|$1 araw|$1 mga araw}}',
+'ago' => '$1 na ang nakalipas',
 
 # Bad image list
 'bad_image_list' => 'Ang anyo ay ang mga sumusunod:
@@ -3036,6 +3196,9 @@ Likas na nakatakdang itago ang iba pa.
 
 # EXIF attributes
 'exif-compression-1' => 'Walang kompresyon',
+'exif-compression-2' => 'CCITT Pangkat 3 1-kodigo sa haba ng pagtakbo ng Pangdimensiyong Huffman na May Bahagyang Pagbabago',
+'exif-compression-3' => 'Kodigo ng Pangkat 3 ng CCITT',
+'exif-compression-4' => 'Kodigo ng Pangkat 4 ng CCITT',
 
 'exif-copyrighted-true' => 'Nakakarapatang-ari',
 'exif-copyrighted-false' => 'Nasasakupan ng madla',
@@ -3047,9 +3210,9 @@ Likas na nakatakdang itago ang iba pa.
 'exif-orientation-3' => 'Pinaikot ng 180°',
 'exif-orientation-4' => 'Pinihit ng patayo',
 'exif-orientation-5' => 'Pinaikot ng 90° CCW at pinihit ng patayo',
-'exif-orientation-6' => 'Pinaikot ng 90° CW',
+'exif-orientation-6' => 'Pinaikot ng 90° na salungat sa galaw ng kamay ng orasan',
 'exif-orientation-7' => 'Pinaikot ng 90° CW at pinihit ng patayo',
-'exif-orientation-8' => 'Pinaikot ng 90° CCW',
+'exif-orientation-8' => 'Pinaikot ng 90° na nakaayon sa galaw ng kamay ng orasan',
 
 'exif-planarconfiguration-1' => 'pagkaayos sa malalaking bahagi (chunky)',
 'exif-planarconfiguration-2' => 'planar na pagkaayos',
@@ -3339,6 +3502,12 @@ Pakitiyak kung ibig mo talagang likhain muli ang pahinang ito.",
 'confirm-purge-top' => 'Linisin/hawiin ang taguan ng pahinang ito?',
 'confirm-purge-bottom' => 'Nililinis ng pagdadalisay ng isang pahina ang taguan at mapipilitang palitawin ang pinakapangkasalukuyang bersyon.',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Sige',
+'confirm-watch-top' => 'Idaragdag ba ang pahinang ito sa bantayan mo?',
+'confirm-unwatch-button' => 'Sige',
+'confirm-unwatch-top' => 'Aalisin ba ang pahinang ito mula sa bantayan mo?',
+
 # Multipage image navigation
 'imgmultipageprev' => '← nakaraang pahina',
 'imgmultipagenext' => 'susunod na pahina →',
@@ -3445,6 +3614,9 @@ Maaari mo ring [[Special:EditWatchlist|gamitin ang pangkaraniwang pampatnugot]].
 'hebrew-calendar-m11' => 'Av',
 'hebrew-calendar-m12' => 'Elul',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|makipag-usap]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Hindi nalalamang tatak ng karugtong na "$1"',
 'duplicate-defaultsort' => 'Babala: Madadaig ng susi ng pagtatakdang "$2" ang mas naunang susi ng pagtatakdang "$1".',
@@ -3475,14 +3647,16 @@ Dapat na nakatanggap ka ng [{{SERVER}}{{SCRIPTPATH}}/COPYING isang sipi ng Pangk
 'version-software' => 'Inistalang software',
 'version-software-product' => 'Produkto',
 'version-software-version' => 'Bersyon',
+'version-entrypoints' => 'Mga URL na butas-pasukan',
+'version-entrypoints-header-entrypoint' => 'Butas na pasukan',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Lokasyon ng talaksan (file path)',
 'filepath-page' => 'Talaksan:',
 'filepath-submit' => 'Gawin',
-'filepath-summary' => 'Ibinabalik ng natatanging pahinang ito ang buong daanan ng isang talaksan.  Ipinapakita ang mga larawan na may buong resolusyon (kalinawan), tuwirang sinimulan ang ibang uri ng mga talaksan sa pamamagitan ng kaugnay nilang mga programa.
-
-Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
+'filepath-summary' => 'Ibinabalik ng natatanging pahinang ito ang buong landas para sa isang talaksan.  
+Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang uri ng mga talaksan sa pamamagitan ng kaugnay nilang mga programa.',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Maghanap ng kaparehong mga talaksan',
@@ -3498,9 +3672,8 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 # Special:SpecialPages
 'specialpages' => 'Mga natatanging pahina',
 'specialpages-note' => '----
-* Pangkaraniwang natatanging mga pahina.
-* <strong class="mw-specialpagerestricted">Pinaghihigpitang natatanging mga pahina.</strong>
-* <span class="mw-specialpagecached">Nakakubli lamang na natatanging mga pahina.</span>',
+* Normal na natatanging mga pahina.
+* <span class="mw-specialpagerestricted">Pinaghihigpitang natatanging mga pahina.</span>',
 'specialpages-group-maintenance' => 'Mga pagpapanatiling ulat',
 'specialpages-group-other' => 'Iba pang natatanging mga pahina',
 'specialpages-group-login' => 'Lumagda/tumala',
@@ -3548,6 +3721,9 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 'compare-rev1' => 'Rebisyon 1',
 'compare-rev2' => 'Rebisyon 2',
 'compare-submit' => 'Paghambingin',
+'compare-invalid-title' => 'Hindi katanggap-tanggap ang tinukoy mong pamagat.',
+'compare-title-not-exists' => 'Hindi umiiral ang tinukoy mong pamagat.',
+'compare-revision-not-exists' => 'Hindi umiiral ang tinukoy mong rebisyon.',
 
 # Database error messages
 'dberr-header' => 'May isang suliranin ang wiking ito',
@@ -3575,11 +3751,40 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 'sqlite-no-fts' => '$1 na walang suporta ng paghahanap ng buong teksto',
 
 # New logging system
+'logentry-delete-delete' => 'Binura ni $1 ang pahinang $3',
+'logentry-delete-restore' => 'Ibinalik ni $1 ang pahinang $3',
+'logentry-delete-event' => 'Binago ni $1 ang antas ng pagkanatatanaw ng {{PLURAL:$5|isang pangyayari sa talaan|$5 mga pangyayari sa talaan}} sa $3: $4',
+'logentry-delete-revision' => 'Binago ni $1 ang antas ng pagtanaw sa {{PLURAL:$5|isang rebisyon|$5 mga rebisyon}} sa pahinang $3: $4',
+'logentry-delete-event-legacy' => 'Binago ni $1 ang antas ng pagtanaw sa mga pangyayari sa talaan sa $3',
+'logentry-delete-revision-legacy' => 'Binago ni $1 ang antas ng pagtanaw sa mga rebisyong nasa pahinang $3',
+'logentry-suppress-delete' => 'Sinupil ni $1 ang pahinang $3',
+'logentry-suppress-event' => 'Palihim na binago ni $1 ang antas ng pagtanaw sa {{PLURAL:$5|isang pangyayari sa talaan|$5 mga pangyayari sa talaan}} sa $3: $4',
+'logentry-suppress-revision' => 'Palihim na binago ni  $1 ang antas ng pagkanakikita ng {{PLURAL:$5|isang rebisyon|$5 mga rebisyon}} sa pahinang $3: $4',
+'logentry-suppress-event-legacy' => 'Palihim na binago ni $1 ang antas ng pagtanaw sa mga kaganapan sa talaan sa $3',
+'logentry-suppress-revision-legacy' => 'Palihim na binago ni $1 ang antas ng pagtanaw ng mga rebisyon sa pahinang $3',
+'revdelete-content-hid' => 'nakatago ang nilalaman',
+'revdelete-summary-hid' => 'nakatago ang buod ng pagbago',
+'revdelete-uname-hid' => 'nakatago ang pangalan ng tagagamit',
+'revdelete-content-unhid' => 'hindi na nakatago ang nilalaman',
+'revdelete-summary-unhid' => 'pinalitaw ang buod ng pagpatnugot',
+'revdelete-uname-unhid' => 'pinalitaw ang pangalan ng tagagamit',
 'revdelete-restricted' => 'nilapat na mga paghihigpit sa mga tagapangasiwa',
 'revdelete-unrestricted' => 'tinanggal ang mga pagbabawal para sa mga tagapangasiwa',
+'logentry-move-move' => 'Inilipat ni $1 ang pahinang $3 papunta sa $4',
+'logentry-move-move-noredirect' => 'Inilipat ni $1 ang pahinang $3 papunta sa $4 na hindi nag-iiwan ng ibang kapupuntahan',
+'logentry-move-move_redir' => 'Inilipat ni $1 ang pahinang $3 papunta sa $4 na nasa ibayo ng ibang kapupuntahan',
+'logentry-move-move_redir-noredirect' => 'Inilipat ni $1 ang pahinang $3 papunta sa $4 sa ibabaw ng isang pagpapunta sa iba na hindi nag-iiwan ng isang pagpapapunta sa iba',
+'logentry-patrol-patrol' => 'Minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na',
+'logentry-patrol-patrol-auto' => 'Kusang minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na',
+'logentry-newusers-newusers' => 'Lumikha si $1 ng isang akawnt ng tagagamit',
+'logentry-newusers-create' => 'Lumikha si $1 ng isang akawnt ng tagagamit',
+'logentry-newusers-create2' => 'Lumikha si $1 ng isang akawnt ng tagagamit na $3',
+'logentry-newusers-autocreate' => 'Kusang nalikha ang akawnt na $1',
 'newuserlog-byemail' => 'Ipinadala ang hudyat sa pamamagitan ng e-liham',
 
 # Feedback
+'feedback-bugornote' => 'Kung handa ka nang detalyadong maglarawan ng isang suliraning teknikal mangyaring [$1 iulat ang sira].
+O kaya, maaari mong gamitin ang maginhawang pormularyo sa ibaba. Ang iyong pagpuna ay idaragdag sa pahinang "[$3 $2]", kasama ang iyong pangalan na pangtagagamit at kung anong pantingin-tingin ang ginagamit mo.',
 'feedback-subject' => 'Paksa:',
 'feedback-message' => 'Mensahe:',
 'feedback-cancel' => 'Huwag ituloy',
@@ -3588,6 +3793,10 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 'feedback-error1' => 'Kamalian: Hindi nakikilalang kinalabasan mula sa API',
 'feedback-error2' => 'Kamalian: Nabigo ang pagpatnugot',
 'feedback-error3' => 'Kamalian: Walang tugon mula sa API',
+'feedback-thanks' => 'Salamat! Ang katugunan mo ay naipaskil na sa pahinang "[$2 $1]".',
+'feedback-close' => 'Nagawa na',
+'feedback-bugcheck' => 'Mahusay! Suriin lang na hindi pa ito isa sa [$1 nalalamang mga depekto].',
+'feedback-bugnew' => 'Sinuri ko na. Mag-ulat ng panibagong sira',
 
 # API errors
 'api-error-badaccess-groups' => 'Hindi ka pinapayagang makapagkarga ng mga talaksan papunta sa wiking ito.',
@@ -3598,6 +3807,7 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 'api-error-duplicate-archive-popup-title' => 'Nabura nang kakambal na {{PLURAL:$1|talaksan|mga talaksan}}',
 'api-error-duplicate-popup-title' => 'Kagayang {{PLURAL:$1|talaksan|mga talaksan}}',
 'api-error-empty-file' => 'Walang laman ang ipinasa mong talaksan.',
+'api-error-emptypage' => 'Lumilikha ng bago, hindi pinapayagan ang mga pahinang walang laman.',
 'api-error-fetchfileerror' => 'Panloob na kamalian: may naganap na pagkakamali habang kinukuha ang talaksan.',
 'api-error-file-too-large' => 'Napakalaki ng talaksang ipinasa mo.',
 'api-error-filename-tooshort' => 'Napakaiksi ng pangalan ng talaksan.',
@@ -3622,7 +3832,21 @@ Ipasok ang pangalan ng talaksan na hindi kasama ang unlaping "{{ns:image}}:".',
 'api-error-unknown-code' => 'Hindi malamang kamalian: "$1"',
 'api-error-unknown-error' => 'Panloob na kamalian: may nangyaring kamalian habang sinusubok mong ikarga ang talaksan mo.',
 'api-error-unknown-warning' => 'Hindi nalalamang babala: $1',
+'api-error-unknownerror' => 'Hindi malamang kamalian: "$1".',
 'api-error-uploaddisabled' => 'Hindi pinapagana ang pagkakargang paitaas sa wiking ito.',
 'api-error-verification-error' => 'Maaaring sira ang talaksang ito, o may maling karugtong.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|mga segundo}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|mga minuto}}',
+'duration-hours' => '$1 {{PLURAL:$1|oras|mga oras}}',
+'duration-days' => '$1 {{PLURAL:$1|araw|mga araw}}',
+'duration-weeks' => '$1 {{PLURAL:$1|linggo|mga linggo}}',
+'duration-years' => '$1 {{PLURAL:$1|taon|mga taon}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekada|mga dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|daantaon|mga daantaon}}',
+'duration-millennia' => '$1 {{PLURAL:$1|milenyo|mga milenyo}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Hindi magawang kunin ang mga kandado sa tagapaghain na $1.',
 );
index 3d5997b..5b7947c 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Толышә зывон (Толышә зывон)
+/** толышә зывон (толышә зывон)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -7,19 +7,52 @@
  * @ingroup Language
  * @file
  *
+ * @author Erdemaslancan
+ * @author Ganbarzada
+ * @author Tuzkozbir
  * @author Гусейн
  */
 
+$namespaceNames = array(
+       NS_MEDIA            => 'Medja',
+       NS_SPECIAL          => 'Xususi',
+       NS_TALK             => 'Nopegət',
+       NS_USER             => 'Okoədə',
+       NS_USER_TALK        => 'Okoədəj_nopegət',
+       NS_PROJECT_TALK     => '$1_Nopegətəti',
+       NS_FILE             => 'Fajl',
+       NS_FILE_TALK        => 'Fajli_nopegət',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_nopegət',
+       NS_TEMPLATE         => 'Numunə',
+       NS_TEMPLATE_TALK    => 'Numunə_nopegət',
+       NS_HELP             => 'Koməg',
+       NS_HELP_TALK        => 'Koməgi_nopegət',
+       NS_CATEGORY         => 'Tispir',
+       NS_CATEGORY_TALK    => 'Tispiron_nopegət',
+);
+
 $messages = array(
 # User preference toggles
+'tog-underline' => 'Линки жинтоно ријә быкәш:',
+'tog-justify' => 'Мәтни бә сәһифә кәно бәробәр быкә.',
+'tog-hideminor' => 'Охоминә дәгишонәдә гәдә дәгишон нишо мәдә.',
+'tog-hidepatrolled' => 'Нујә дәгишон сијоһијәдә дәвинә кардә быә дәгишон нишо мәкә.',
 'tog-newpageshidepatrolled' => 'Нијони огәтеј ноғо доә быә сәһифон бә тожә сәһифон сијоһиәдә',
+'tog-usenewrc' => 'Охоминә дәгишон ән чокә сијоһи око дој (гәрәке JavaScript)',
+'tog-numberheadings' => 'Автоматик башлығон нумрәләмиш быкә',
+'tog-showtoc' => 'Мындәриҹоти сијоһи нишо быдә (3 сәрловһәсә веј быә сәһифон)',
 'tog-watchcreations' => 'Зијод кардеј чымы офәјә быә сәһифон бә ноғо доә сијоһи',
-'tog-enotifwatchlistpages' => 'Ноғо доә сијоһиәдә сәһифон кејнә дәгиш бәбен бәмы е-номә бывығанд',
+'tog-watchdefault' => 'Зијод кардеј демы дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
+'tog-watchmoves' => 'Зијод кардеј ном дәгиш кардә быә сәһифон бә ноғо доә сијоһи',
+'tog-watchdeletion' => 'Зијод кардеј сәһифон комон аз рәдд кардәме бә ноғо доә сијоһи',
+'tog-enotifwatchlistpages' => 'Ноғо доә сијоһиәдә кејнә сәһифон дәгиш бәбен бәмы е-номә бывығанд',
 'tog-watchlisthideown' => 'Чымы дәгишон ноғо доә сијһиәдә нијо кардеј',
+'tog-watchlisthidebots' => 'Нијо кардеј ботон дәгишон ноғо доә сијоһиәдә',
 'tog-watchlisthideminor' => 'Нијо кардеј гәдә дәгишон ноғо доә сијоһиәдә',
 
 # Dates
-'sunday' => 'Ð\98Ñ\88анбә',
+'sunday' => 'Ð\98Ñ\88амбә',
 'monday' => 'Дышанбә',
 'tuesday' => 'Сешанбә',
 'wednesday' => 'Чошанбә',
@@ -78,16 +111,20 @@ $messages = array(
 'category-empty' => "''Ын категоријә бы дәғиғәдә тәјлије.''",
 'hidden-categories' => '{{PLURAL:$1|Нијони категоријә|Нијони категоријон}}',
 'hidden-category-category' => 'Нијони категоријон',
+'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 фајл}} бы категоријәдә.}}',
 'category-file-count-limited' => 'Ын категоријәдә  {{PLURAL:$1|$1 фајл}} һесте.',
-'listingcontinuesabbrev' => '(дәвом карде)',
+'listingcontinuesabbrev' => '(дәвом)',
+'index-category' => 'Индекс быә сәһифон.',
+'noindex-category' => 'Индекс нибыә саһифон',
 
 'about' => 'Тәсвир',
 'article' => 'Мәғолә',
 'newwindow' => '(нујә пенҹәдә окардеј)',
 'cancel' => 'Ләғв кардеј',
+'moredotdotdot' => 'Веј...',
 'mypage' => 'Чымы сәһифә',
 'mytalk' => 'Чымы мызокирә сәһифә',
 'anontalk' => 'Бо ын IP-унвони мызокирә',
@@ -99,8 +136,9 @@ $messages = array(
 'qbbrowse' => 'Дијә кардеј',
 'qbedit' => 'Сәрост кардеј',
 'qbpageoptions' => 'Ым сәһифә',
+'qbpageinfo' => 'Мәзмун.',
 'qbmyoptions' => 'Чымы сәһифон',
-'qbspecialpages' => 'Хысусиә сәһифон',
+'qbspecialpages' => 'Хысусијә сәһифон',
 'faq' => 'РАП',
 'faqpage' => 'Project:РАП',
 
@@ -150,7 +188,7 @@ $messages = array(
 'newpage' => 'Тожә сәһифә',
 'talkpage' => 'Ым сәһифә мызокирә кардеј',
 'talkpagelinktext' => 'Мызокирә',
-'specialpage' => 'Хысусиә сәһифә',
+'specialpage' => 'Хысусијә сәһифә',
 'personaltools' => 'Шәхси диләгон',
 'postcomment' => 'Нујә ғысм',
 'articlepage' => 'Мәғолә дијә кардеј',
@@ -160,16 +198,20 @@ $messages = array(
 'userpage' => 'Иштирокәкә сәһифә дијә кардеј',
 'projectpage' => 'Нәхши сәһифә дијә кардеј',
 'imagepage' => 'Фајли сәһифә дијә кардеј',
+'mediawikipage' => 'Мәктуби сәһифә нишо быдә.',
+'templatepage' => 'Ғәлиби сәһифә нишо быдә.',
 'viewhelppage' => 'Араијш сәј',
 'categorypage' => 'Категоријон сәһифә дијә кардеј',
 'viewtalkpage' => 'Мызокирә дијә кардеј',
 'otherlanguages' => 'Ҹо зывононәдә',
 'redirectedfrom' => '($1 чыјо унвон дәгиш кардә быә)',
+'redirectpagesub' => 'Увони дәгиш кардә сәһифәје',
 'lastmodifiedat' => 'Ын сәһифә охонә кәрә дәгиш беј: $2, $1.',
 'protectedpage' => 'Мыдофијә кардә быә сәһифә',
 'jumpto' => 'Дәвардеј бә:',
 'jumptonavigation' => 'навигасијә',
 'jumptosearch' => 'нәве',
+'pool-timeout' => 'Че блоки чәш кардә вахт сәбе.',
 '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).
@@ -178,18 +220,22 @@ $messages = array(
 'copyrightpage' => '{{ns:project}}:Мыәллифә һуғуғ',
 'currentevents' => 'Есәтнә һодисон',
 'currentevents-url' => 'Project: Есәтнә һодисон',
-'disclaimers' => 'Ð\94еÑ\98ни Ð±Ó\99 Ð³Ð¸Ñ\98 Ð½Ñ\8bгÓ\99Ñ\82еÑ\98',
+'disclaimers' => 'ЧÑ\8b Ð¼Ó\99Ñ\81Ñ\83лиÑ\98Ñ\98Ó\99Ñ\82икÑ\83 Ð¸Ð¼Ñ\82ина.',
 'disclaimerpage' => 'Project:Дејни бә гиј ныгәтеј',
 'edithelp' => 'Арајиш бо редактә кардеј',
 'edithelppage' => 'Help:Арајиш бо сәрост кардеј',
 'helppage' => 'Help:Мындәриҹот',
-'mainpage' => 'Јолә сәһифә',
-'mainpage-description' => 'Јолә сәһифә',
+'mainpage' => 'Әсосә сәһифә',
+'mainpage-description' => 'Әсосә сәһифә',
+'policy-url' => 'Project:Ғајдон',
 'portal' => 'Ҹәмјәт',
 'portal-url' => 'Project:Ҹәмјәти портал',
 'privacy' => 'Мәхфијәти сијосәт',
 'privacypage' => 'Project:Мәхфијәти сијосәт',
 
+'badaccess' => 'Иҹазә хәта.',
+'badaccess-group0' => 'Ын фәалијјәти ичра карде әзынишон.',
+
 'ok' => 'OK',
 'retrievedfrom' => 'Сәвон "$1"',
 'youhavenewmessages' => 'Шымә сәјоне $1 ($2).',
@@ -204,6 +250,8 @@ $messages = array(
 'toc' => 'Мындәриҹот',
 'showtoc' => 'нишо дој',
 'hidetoc' => 'нијо кардеј',
+'collapsible-collapse' => 'Бурмә кардеј',
+'collapsible-expand' => 'Һовуж кардеј',
 'thisisdeleted' => 'Дијә кардеј јаанки бәрпо кардеј $1?',
 'viewdeleted' => 'Дијә кардеј $1?',
 'restorelink' => '{{PLURAL:$1|иглә рәдд кардә быә дәгиши|$1 рәдд кардә быә дәгишон}}',
@@ -215,7 +263,7 @@ $messages = array(
 'nstab-main' => 'Мәғолә',
 'nstab-user' => 'Иштирокәкә сәһифә',
 'nstab-media' => 'Медијә сәһифә',
-'nstab-special' => 'Хысусиә сәһифә',
+'nstab-special' => 'Хысусијә сәһифә',
 'nstab-project' => 'Нахшә бәрәдә',
 'nstab-image' => 'Фајл',
 'nstab-template' => 'Ғәлиб',
@@ -223,14 +271,28 @@ $messages = array(
 
 # General errors
 'error' => 'Сәһв',
+'readonly' => 'Бә база нывыште блок быә.',
+'missing-article' => 'База мәлумотон дыләдә бә ахтар кардә быә саһифон «$1» $2 барәдә мәлумот пәјдо карде ныбе.
+Жыго вәзијјәт бе бәзне бә вахтики, ым сәһифә че рәдд кардә быә сәһифә канә рәвојәте.
+Гирәм ым жыго ни, жәгәдә шымә програм тәминатијәдә сәһв пәјдо кардәјоне.
+Хаһиш кардәмон че сәһифә URL-и бә [[Special:ListUsers/sysop|администратори]] бывғандәнән.',
 'missingarticle-rev' => '(рәвојәт#: $1)',
+'missingarticle-diff' => '(Фәрг: $1, $2)',
+'internalerror' => 'Дахили хәта',
+'internalerror_info' => 'Дахили хәта: $1',
+'fileappenderrorread' => 'Әлавон гејд карде быәдә"$1" һанде ныбе.',
+'formerror' => 'Хәта: Че формә мәлумотон әкс карде ғерри мумкуне.',
+'cannotdelete-title' => 'Сәһифә әбыни рәдд кардеј "$1"',
 'badtitle' => 'Роныдоә ном',
+'badtitletext' => 'Ахтар кардә быә сәһифә ном сәһве, тәјлије, јаанки сәрост доә быәнин мијонзывонон ја мијонвики номон.
+Бе бәзне ки кали рәмзон сәрловһәдә око дој әбыни.',
 'viewsource' => 'Дијә кардеј',
 
 # Login and logout pages
 'yourname' => 'Иштирокәкә ном:',
 'yourpassword' => 'Парол:',
 'yourpasswordagain' => 'Пароли сәнибәтон гырдә карде:',
+'remembermypassword' => 'Мыни ым компутерәдә јодәдә огәт (максимум $1 {{PLURAL:$1|руж|руж}})',
 'login' => 'Ыштәни едаштеј',
 'nav-login-createaccount' => 'Ыштәни едаштеј / ыштәни ғејд кардовнијеј',
 'loginprompt' => '{{SITENAME}}-әдә ыштәни едәште горнә, шымә бәбе бә «cookies» иҹозә быдән.',
@@ -265,7 +327,9 @@ $messages = array(
 # Special:ChangeEmail
 'changeemail' => 'Е-номә унвони дәгиш кардеј',
 'changeemail-newemail' => 'Е-номә тожә унвон:',
+'changeemail-none' => '(ни)',
 'changeemail-submit' => 'Е-номә дәгиш кардеј',
+'changeemail-cancel' => 'Ләғв карде',
 
 # Edit page toolbar
 'bold_sample' => 'Нимәтындә шрифт',
@@ -309,14 +373,19 @@ $messages = array(
 Шымә бәзынејон [[Special:Search/{{PAGENAME}}|пәјдо кардеј конҹо ым ном һесте]] бә ҹо мәғолонәдә,
 јаанки <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналон ујғунә нывыштәјон пәјдо кардеј].</span>',
 'previewnote' => "'''Јодәдә огәтән ки ым һәлә сыфтәнә нишо доје.'''
-Шымә дәгишон һәлә огәтә быәнин! [[#editform|→ дәвом кардеј сәрост карде]]",
+Шымә дәгишон һәлә огәтә быәнин!",
 'editing' => 'Редәктә кардеј $1',
 'editingsection' => 'Редактә кардеј $1 (ғысм)',
 'yourtext' => 'Шымә мәтн',
 'templatesused' => '{{PLURAL:$1|Ғәлиб:|Ғәлибон}} есәтнә сәһифә истифодә кардејдә:',
 'template-protected' => '(Мыдофиә кардә быә)',
+'template-semiprotected' => 'тики муһафизә быә',
 'hiddencategories' => 'Ын сәһифә аидијотыш һесте бә {{PLURAL:$1|1 нијони категоријә|$1 нијони категоријон}}:',
 'permissionserrorstext-withaction' => "Шымәку ни иҹозә ба ым һәрәкәти «'''$2'''», бә жыго {{PLURAL:$1|сәбәби|сәбәбон}} горнә:",
+'recreate-moveddeleted-warn' => "''Дыггәт! Шымә нафко позулмуш быә сәһифон бәрпа кардеон пидә.'''
+
+Ым сәһифә чоәдәнә дуз карде зәруријјәти јохләмишкәнән.
+Жинтоно нышу доә быә бычи ым сәһифә позулмуш быә.",
 'moveddeleted-notice' => 'Ым сәһифә молә быә.
 Арајиши горнә жинтоно нишо доә быән чы сәһифә молә ијән ном дәгиш кардә нывыштәјон.',
 
@@ -324,6 +393,9 @@ $messages = array(
 'post-expand-template-inclusion-warning' => "'''Дығғәт:''' Дахыл кардә быә ғәлибон сәкыштә памјә ве јоле.
 Хәјли ғәлибон дахыл ныбабен.",
 'post-expand-template-inclusion-category' => 'Бо сәһифон дахыл кардә быә ғәлибон рәво зынә быә улгу бә кәно бешә',
+'post-expand-template-argument-warning' => "'''Дығғәт:''' Ым сәһифәдә ән ками иглә аргумент һесте, ә аргумент ки һәддиндән зијодә памјә һестыше бо окарде.
+Жыго аргументон вадоә быән.",
+'post-expand-template-argument-category' => 'Вадо быә ғәлибон аргументон огәтә сәһифон',
 
 # History pages
 'viewpagelogs' => 'Бо ым сәһифә журналон нишо дој',
@@ -338,8 +410,12 @@ $messages = array(
 'last' => 'навы.',
 'page_first' => 'иминә',
 'page_last' => 'охонә',
+'histlegend' => "Рәвојәтон выжнијеј: кон сәһифә рәвојәтон фәрғи виндеј пидәјоне нышон быжәнән ијән егәтән \"Enter\".<br />
+Изоһ: '''(исә)''' = де исәтнә рәвојәти фәрғ, '''(охо)''' = де навконә рәвојәти фәрғ, '''(г)''' = гәдә дәгиш.",
 'history-fieldset-title' => 'Тарыхи дијә кардеј',
 'history-show-deleted' => 'Әнҹәх рәдд кардә быән',
+'histfirst' => 'Ән канә',
+'histlast' => 'Охонәни',
 'historyempty' => '(тәјли)',
 
 # Revision feed
@@ -362,11 +438,11 @@ $messages = array(
 'revertmerge' => 'Бахш кардеј',
 
 # Diffs
-'history-title' => 'Дәгишон тарых "$1"',
-'difference' => '(Рәвојәтон мијонәдә фәрғ)',
+'history-title' => '$1: Дәгишон тарых',
 'lineno' => 'Сәтыр $1:',
 'compareselectedversions' => 'Сәчын кардә быә рәвојәтон мығојисә кардеј.',
 'editundo' => 'ләғв кардеј',
+'diff-multi' => '({{PLURAL:$2|Иглә истифадәчи|$2 истифадәчи}} тәрәфәдә кардә быә {{PLURAL:$1|иглә арә редактә|$1 арә редактә}} нушо додәни)',
 
 # Search results
 'searchresults' => 'Нәве нәтиҹон',
@@ -390,6 +466,7 @@ $messages = array(
 'searchprofile-everything-tooltip' => 'Һәммәј сәһифонәдә нәве (мызокирә сәһифонәдән)',
 'searchprofile-advanced-tooltip' => 'Бә асбардә быә номон мәкононәдә нәве',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сыхан|$2 сыханон}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 елемент|$1 елементон}} ({{PLURAL:$2|$2 жинә категоријә$2 жинә категоријон }}, {{PLURAL:$3|$3 фајл|$3 фајлон}})',
 'search-redirect' => '(Унвони дәгиш кардеј  $1)',
 'search-section' => '(семонә $1)',
 'search-suggest' => 'Еһтимол шымә нәзәрәдә ым гәтејдәбијон: $1',
@@ -398,7 +475,7 @@ $messages = array(
 'showingresultsheader' => "{{PLURAL:$5|Нәтиҹә'''$1''' из '''$3'''|Нәтиҹон '''$1 — $2''' чы '''$3'''}} бо '''$4'''",
 'search-nonefound' => 'Бә шымә хәбәсә ујғун омә сәкыштә пәјдо ныбе.',
 'powersearch-field' => 'Нәве',
-'powersearch-toggleall' => 'Һаммај',
+'powersearch-toggleall' => 'Һәммәј',
 
 # Preferences page
 'preferences' => 'Чичсә печыније',
@@ -407,9 +484,10 @@ $messages = array(
 'prefsnologintext' => 'Шымә бәбе <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ыштәни едәштән]</span> бо иштирокәкә пеғәндон дәгиш кардеј.',
 'changepassword' => 'Пароли дәгиш кардеј',
 'skin-preview' => 'Сыфтәнә нишо дој',
-'prefs-rc' => 'Ән нуә дәгишон',
+'prefs-user-pages' => 'Иштирокәкә сәһифон',
+'prefs-rc' => 'Ән нујә дәгишон',
 'prefs-changeemail' => 'Е-номә дәгиш кардеј',
-'saveprefs' => 'Огәте',
+'saveprefs' => 'Огәтеј',
 'searchresultshead' => 'Нәве',
 'timezoneregion-america' => 'Америка',
 'timezoneregion-europe' => 'Авропа',
@@ -423,6 +501,7 @@ $messages = array(
 'yourlanguage' => 'Зывон:',
 'email' => 'E-номә',
 'prefs-help-email' => 'Е-номә унвони нывыштеј һукман ни, интаси ав бә шымә гәрәк бәбе гирам шымә пароли виро бебәкардејон.',
+'prefs-help-email-others' => 'Комәг бәка бә ҹо иштироәкон шымә е-номә унвони оныкарде, че шымә шәхси сәһифәдә быә линки де шымә әлогә огәтеј.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'Ым сәһифә сәрост кардеј',
@@ -431,13 +510,16 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|дәгиши|дәгишон}}',
 'recentchanges' => 'Ән нујә дәгишон',
 'recentchanges-legend' => 'Ән нујә дәгишон печыније',
+'recentchanges-summary' => 'Тәмшо быкән бы сәһифәдә че вики охоминә дәгишон нишо доә быән.',
+'recentchanges-feed-description' => 'Ым каналәдә быә охонә дәгишон дығғәтәдә огәт.',
 'recentchanges-label-newpage' => 'Де ым дәгиши тожә сәһифә сохтә бе',
 'recentchanges-label-minor' => 'Ым гадә дәгишије',
 'recentchanges-label-bot' => 'Ым дәгиши бот кардәше',
+'recentchanges-label-unpatrolled' => 'Ым редактә һәлә нәзәрәдә давардәни',
 'rcnote' => "Бә жиј нишо доә быә {{PLURAL:$1|'''1''' дәгиши|'''$1''' дәгиши}}, бә охонә {{PLURAL:$2|ружәдә|'''$2''' ружәдә}}, саат $5, $4.",
 'rcnotefrom' => "Бә жиј доә быән дәгишон че вахтику '''$2''' (тосә '''$1''').",
 'rclistfrom' => '$1 вахтику дәгишон нишо быдә',
-'rcshowhideminor' => '$1 гәдәлиә дәгишон',
+'rcshowhideminor' => '$1 гәдәлијә дәгишон',
 'rcshowhidebots' => '$1 ботон',
 'rcshowhideliu' => '$1 ыштәни едаштә иштирокәкон',
 'rcshowhideanons' => '$1 әнәномә иштирокәкон',
@@ -451,6 +533,8 @@ $messages = array(
 'minoreditletter' => 'г',
 'newpageletter' => 'Т',
 'boteditletter' => 'б',
+'rc_categories_any' => 'Һар гылә',
+'newsectionsummary' => '/* $1 */ нујә мывзу',
 'rc-enhanced-expand' => 'Тәфсилотон нишо дој (JavaScript истифодә бедә)',
 'rc-enhanced-hide' => 'Тәфсилотон нијо кардеј',
 
@@ -473,10 +557,22 @@ $messages = array(
 'license' => 'Лисензијә:',
 'license-header' => 'Лисензијә',
 
+# Special:ListFiles
+'imgfile' => 'фајл',
+'listfiles' => 'Фајлон сијоһи',
+'listfiles_thumb' => 'Гәдә шикил',
+'listfiles_name' => 'Фајли ном',
+'listfiles_user' => 'Иштирокәкә',
+'listfiles_size' => 'Улгу',
+'listfiles_description' => 'Тәсвир',
+'listfiles_count' => 'Рәвојәт',
+
 # File description page
 'file-anchor-link' => 'Фајл',
 'filehist' => 'Фајли тарых',
 'filehist-help' => 'Фајли сыфтә рәвојәти виндеј горә бә тарых/вахт егәтән.',
+'filehist-deleteall' => 'һәммәј рәдд кардеј',
+'filehist-revert' => 'Огард',
 'filehist-current' => 'есәтнә',
 'filehist-datetime' => 'Тарых/Вахт',
 'filehist-thumb' => 'Гәдә шикил',
@@ -493,13 +589,20 @@ $messages = array(
 # Random page
 'randompage' => 'Рајрастә мәғолә',
 
+# Statistics
+'statistics' => 'Статистика',
+
+'disambiguationspage' => 'Template:дәгиг кардеј',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|бајт|бајтон}}',
 'nmembers' => '$1 {{PLURAL:$1|узв|узвон}}',
+'prefixindex' => 'Һәммәј сәһифон де префикси',
 'usercreated' => '{{GENDER:$3|Офәјеј быә}} $1 $2',
 'newpages' => 'Тожә сәһифон',
 'move' => 'Ном дәгиш кардеј',
-'pager-newer-n' => '{{PLURAL:$1|ән нујә 1|ән нујә $1}}',
+'pager-newer-n' => '{{PLURAL:$1|ән нујә1|ән нујә $1}}',
+'pager-older-n' => '{{PLURAL:$1|1 тикиән канә|$1 ән канә}}',
 
 # Book sources
 'booksources' => 'Китобон сәвонон',
@@ -555,9 +658,12 @@ $messages = array(
 # Undelete
 'undeletelink' => 'чәшику дәвонијеј/бәрпо кардеј',
 'undeleteviewlink' => 'тәмшо кардеј',
+'undelete-search-submit' => 'Нәве',
+'undelete-show-file-submit' => 'Бәле',
 
 # Namespace form on various pages
 'namespace' => 'Номон мәкон:',
+'invert' => 'Выжнијә быәгылон дәгишкә',
 'blanknamespace' => '(Әсос)',
 
 # Contributions
@@ -566,8 +672,8 @@ $messages = array(
 'mycontris' => 'Чымы гәнҹ',
 'contribsub2' => 'Гәнҹ $1 ($2)',
 'uctop' => '(охонәни)',
-'month' => 'Чы мангику (һәнијән рә):',
-'year' => 'Чы сорику (һәнијән рә):',
+'month' => 'Че мангику (һәнијән рә):',
+'year' => 'Че сорику (һәнијән рә):',
 
 'sp-contributions-newbies' => 'Әнҹәх нујә иштирокәкон гәнҹи нишо дој',
 'sp-contributions-blocklog' => 'бастә быә чијон',
@@ -585,7 +691,7 @@ $messages = array(
 'whatlinkshere-page' => 'Сәһифә:',
 'linkshere' => "Ым сәһифон сәбон вардән ијо ''[[:$1]]''':",
 'nolinkshere' => "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''[[:$1]]'''.",
-'isredirect' => 'увони дәгиш кардә сәһифәје',
+'isredirect' => 'Ñ\83нвони Ð´Ó\99гиÑ\88 ÐºÐ°Ñ\80дÓ\99 Ñ\81Ó\99һиÑ\84Ó\99Ñ\98е',
 'istemplate' => 'әловә',
 'isimage' => 'фајлинә сәбон',
 'whatlinkshere-prev' => '{{PLURAL:$1|навынәни|навынәни $1}}',
@@ -603,23 +709,30 @@ $messages = array(
 'blocklink' => 'Бә гырд гәтеј',
 'unblocklink' => 'Ошко кардеј',
 'change-blocklink' => 'Блок быә ҹо дәгиш кардеј',
-'contribslink' => 'Гәнҹ',
+'contribslink' => 'Комәкон',
+'blocklogpage' => 'Блок быәјон',
 'blocklogentry' => 'бастәше [[$1]] бә ын мыддәт $2 $3',
 'block-log-flags-nocreate' => 'нујә иштирокәкон ғејд карде ғәдәғәне',
 
 # Move page
+'move-page-legend' => 'Сәһифә номи дәгиш карде',
+'newtitle' => 'Нујә ном:',
+'movepagebtn' => 'Сәһифә номи дәгиш кардеј',
 'movelogpage' => 'Ном дәгиш кардә быә чијон журнал',
 'revertmove' => 'Бә кәно окырније',
 
 # Export
 'export' => 'Сәһифон ихроҹ кардеј',
+'export-addcat' => 'Зијод кардеј',
 
 # Namespace 8 related
 'allmessagesname' => 'Хәбә',
 'allmessagesdefault' => 'Иминә огәтә быә мәтн',
+'allmessages-filter-all' => 'Һаммај',
 
 # Thumbnails
 'thumbnail-more' => 'Һејве кардеј',
+'thumbnail_error' => 'Гәдә шикили туму кардејәдә сәһв: $1',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Шымә иштирокәкә сәһифә',
@@ -642,9 +755,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' => 'Охонә дәгишон сијоһи',
@@ -655,12 +768,13 @@ $messages = array(
 'tooltip-feed-atom' => 'Транслјасијә кардеј бә Atom бо ым сәһифә',
 'tooltip-t-contributions' => 'Чы иштирок кардәкәси дагиш кардә быә сәһифон сијоһи',
 'tooltip-t-emailuser' => 'Бы иштироәкә номә вығәнде',
-'tooltip-t-upload' => 'Шикилон јаанки мултимедиә фајлон бо жај',
+'tooltip-t-upload' => 'Шикилон јаанки мултимедијә фајлон бо жај',
 'tooltip-t-specialpages' => 'Хыдмәтә сәһифон сијоһи',
 'tooltip-t-print' => 'Ым сәһифә рәвојәт бо чап кардеј',
 'tooltip-t-permalink' => 'Бә ым сәһифә рәвојәти еғрорә сәбон',
 'tooltip-ca-nstab-main' => 'Мәғолә мығдор',
 'tooltip-ca-nstab-user' => 'Иштирок кардәкәси сәһифә',
+'tooltip-ca-nstab-media' => 'Медиа-фајл',
 'tooltip-ca-nstab-special' => 'Ым хыдмәтә сәһифәје бычыми горә дәгиш кардеј әбыни',
 'tooltip-ca-nstab-project' => 'Нәхши сәһифә',
 'tooltip-ca-nstab-image' => 'Фајли сәһифә',
@@ -672,10 +786,16 @@ $messages = array(
 'tooltip-diff' => 'Бешемонә мәтни һәхәдә сохтә быә дәгишон нишо дој.',
 'tooltip-compareselectedversions' => 'Че ым сәһифә ды гылә выжнијә быә рәвојәтон мијонәдә фәрғи едјәсеј.',
 'tooltip-watch' => 'Ым сәһифә зијод кардеј бә ыштә нығо доә сијоһи',
+'tooltip-upload' => 'Бо жәј бино кардеј',
 'tooltip-rollback' => 'Охонә редактори дәгиш кардә быә чијон де и гылә егәте ләғв кардеј',
 'tooltip-undo' => 'Дәғандә дәгиши рәдд кардеј ијән "сыфтәнә нишо дој" окардеј, де ләғви сәбәби нышон дој имкони.',
 'tooltip-summary' => 'Кыртә тәсвир бынывыштән',
 
+# Info page
+'pageinfo-header-edits' => 'Сәрост кардеј',
+'pageinfo-header-views' => 'Тәмшо',
+'pageinfo-subjectpage' => 'Сәһифә',
+
 # Browsing diffs
 'previousdiff' => '← Навынәни дәгиши',
 'nextdiff' => 'Думотоно шә дәгиши →',
@@ -684,6 +804,10 @@ $messages = array(
 'file-info-size' => '$1 × $2 пиксел, фајли памјә: $3, MIME тип: $4',
 'file-nohires' => 'Ән барзә рәвојәт ни.',
 'svg-long-desc' => 'SVG фајл, номинәләдә $1 × $2 пиксел, фајли памјә: $3',
+'show-big-image' => 'Тикәјән јолә кејфијјәтинә шикил',
+
+# Special:NewFiles
+'ilsubmit' => 'Нәве',
 
 # Bad image list
 'bad_image_list' => 'Формат бәпе быбу жыго:
@@ -694,6 +818,7 @@ $messages = array(
 
 # Metadata
 'metadata' => 'Метамәлумотон',
+'metadata-help' => 'Ым фајләдә фотоапарати јаанки сканери әловә кардә быә мәлумотон һестин. Гирәм фајл сохте бә пешто сәрост кардә быә, бе бәзнеки кали мәлумотон ијо нишо дојәдә фәрғ бәдон.',
 'metadata-fields' => 'Кејнә шикили сәһифәдә метадата ҹәдвәл гырдә карда быә бәвәдә бы сијоһиәдә гылә-гылә ашмардә быә метадата шикили мәрон виндеј бәбе. 
 Әмандәј мәрон нијони бәманден.
 * make
@@ -710,6 +835,15 @@ $messages = array(
 * gpslongitude
 * gpsaltitude',
 
+# EXIF tags
+'exif-imagewidth' => 'Һовужи',
+'exif-imagelength' => 'Былынди',
+'exif-languagecode' => 'Зывон',
+
+'exif-gaincontrol-0' => 'Ни',
+
+'exif-saturation-0' => 'Ади',
+
 # External editor support
 'edit-externally' => 'Редактә кардеј ым фајли де заһири програм',
 'edit-externally-help' => '(Бо мыффәссәлә мәлумотон бә [//www.mediawiki.org/wiki/Manual:External_editors дәрсәвон бо сохтәј] дијә быкан)',
@@ -724,8 +858,33 @@ $messages = array(
 'watchlisttools-edit' => 'Дијә кардеј/сәрост кардеј сијоһи',
 'watchlisttools-raw' => 'Сәрост кардеј бәнә мәтни',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Дыггәт:\'\'\' Еһтимал кардә быә "$2" классификасијә ачари нафконә "$1" классификасијә ачари етиборсоз кардә',
+
+# Special:Version
+'version' => 'Рәвојәт',
+'version-specialpages' => 'Хысусијә сәһифон',
+'version-entrypoints-header-url' => 'URL',
+
+# Special:FilePath
+'filepath-page' => 'Фајл:',
+'filepath-submit' => 'Давард',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch-submit' => 'Нәве',
+
 # Special:SpecialPages
-'specialpages' => 'Хысусиә сәһифон',
+'specialpages' => 'Хысусијә сәһифон',
+
+# External image whitelist
+'external_image_whitelist' => ' #Ым сәтри огәтәнән чокнәј әв һесте<pre>
+#Рә рә истифадә быә фрагментон ијо быдәнән (ә һиссә, че // мијонәдә бедә )
+#Әвон ды харичи шикили URL и дуз бәбен.
+#Дуз омә гылә бәнә шикили нишо бәбе, амандәни бәнә шикили линк нишо бәбе.
+#Сәтрон де # комментариј һисоб бедән.
+#Сәтрон бә регистри һәссос нин.
+
+#Рә рә око доә быә фрагментон че сәтри пентоно ијо быдәнән. Ым сәтри огәтәнән чокнәј һесте.</pre>',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|нышонон]] филтр:',
index b59f23d..0b9588d 100644 (file)
@@ -425,7 +425,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'revertmerge' => 'Vete ʻa e fakataha',
 
 # Diffs
-'difference' => '(Kehekehe he ongo paaki)',
 'lineno' => 'Laini hono $1:',
 'compareselectedversions' => 'Fakatatau ongo paaki fili',
 'editundo' => 'vete',
index 46da045..b1c53ba 100644 (file)
@@ -32,486 +32,486 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Putim lain ananit long ol link:',
-'tog-justify'                 => "Soim ol paragraf i pulmapim sipes long lephan i go long raithan (''justify'')",
-'tog-hideminor'               => 'Noken soim ol liklik senis insait long ol nupela senis',
-'tog-hidepatrolled'           => 'Noken soim ol lukluk senis insait long ol nupela senis',
-'tog-newpageshidepatrolled'   => 'Noken soim ol lukluk senis insait long ol nupela pes',
-'tog-extendwatchlist'         => 'Larim lukautbuk i go longpela long soim olgeta senis',
-'tog-usenewrc'                => 'Moa beta stail bilong nupela senis (i nidim JavaScript)',
-'tog-numberheadings'          => 'Putim ol namba i go long wanwan hap bilong pes',
-'tog-showtoolbar'             => 'Soim ol liklik link long wokim senis kwiktaim (i nidim JavaScript)',
-'tog-editondblclick'          => 'Senisim pes taim yu paitim tupela taim kwiktaim (i nidim JavaScript)',
-'tog-editsection'             => 'Soim ol [senisim] link long wanwan hap bilong ol pes',
+'tog-underline' => 'Putim lain ananit long ol link:',
+'tog-justify' => "Soim ol paragraf i pulmapim sipes long lephan i go long raithan (''justify'')",
+'tog-hideminor' => 'Noken soim ol liklik senis insait long ol nupela senis',
+'tog-hidepatrolled' => 'Noken soim ol lukluk senis insait long ol nupela senis',
+'tog-newpageshidepatrolled' => 'Noken soim ol lukluk senis insait long ol nupela pes',
+'tog-extendwatchlist' => 'Larim lukautbuk i go longpela long soim olgeta senis',
+'tog-usenewrc' => 'Moa beta stail bilong nupela senis (i nidim JavaScript)',
+'tog-numberheadings' => 'Putim ol namba i go long wanwan hap bilong pes',
+'tog-showtoolbar' => 'Soim ol liklik link long wokim senis kwiktaim (i nidim JavaScript)',
+'tog-editondblclick' => 'Senisim pes taim yu paitim tupela taim kwiktaim (i nidim JavaScript)',
+'tog-editsection' => 'Soim ol [senisim] link long wanwan hap bilong ol pes',
 'tog-editsectiononrightclick' => 'Senisim ol hap bilong pes taim yu paitim nem bilong hap<br />wantaim raithan-klik (i nidim Javascript)',
-'tog-showtoc'                 => 'Soim ol nem bilong hap insait long liklik bokis, taim igat antap long 3 hap long pes',
-'tog-rememberpassword'        => 'Holim nem bilong yusa bilong mi long dispela kompiuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'          => 'Putim ol nupela pes mi wokim long lukautbuk',
-'tog-watchdefault'            => 'Putim ol pes mi senisim long lukautbuk bilong mi',
-'tog-watchmoves'              => 'Putim ol pes mi surikim long lukautbuk bilong mi',
-'tog-watchdeletion'           => 'Putim ol pes mi rausim long lukautbuk bilong mi',
-'tog-minordefault'            => 'Makim ol senis mi wokim olsem ol i liklik, sapos mi no makim',
-'tog-previewontop'            => 'Soim pes mi senisim (pastaim long raitim) antap long bokis bilong wokim senis',
-'tog-previewonfirst'          => 'Soim pes mi senisim pastaim long raitim',
-'tog-enotifwatchlistpages'    => 'Salim imel (e-mail) long mi taim wanpela pes mi lukautim i senis',
-'tog-shownumberswatching'     => 'Soim hamas yusa i lukautim pes',
-'tog-uselivepreview'          => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
-'tog-watchlisthideown'        => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
-'tog-watchlisthidebots'       => 'Haitim ol senis ol bot i wokim long lukautbuk bilong mi',
-'tog-watchlisthideminor'      => 'Haitim ol liklik senis long lukautbuk bilong mi',
-'tog-showhiddencats'          => 'Soim ol grup hait',
+'tog-showtoc' => 'Soim ol nem bilong hap insait long liklik bokis, taim igat antap long 3 hap long pes',
+'tog-rememberpassword' => 'Holim nem bilong yusa bilong mi long dispela kompiuta (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-watchcreations' => 'Putim ol nupela pes mi wokim long lukautbuk',
+'tog-watchdefault' => 'Putim ol pes mi senisim long lukautbuk bilong mi',
+'tog-watchmoves' => 'Putim ol pes mi surikim long lukautbuk bilong mi',
+'tog-watchdeletion' => 'Putim ol pes mi rausim long lukautbuk bilong mi',
+'tog-minordefault' => 'Makim ol senis mi wokim olsem ol i liklik, sapos mi no makim',
+'tog-previewontop' => 'Soim pes mi senisim (pastaim long raitim) antap long bokis bilong wokim senis',
+'tog-previewonfirst' => 'Soim pes mi senisim pastaim long raitim',
+'tog-enotifwatchlistpages' => 'Salim imel (e-mail) long mi taim wanpela pes mi lukautim i senis',
+'tog-shownumberswatching' => 'Soim hamas yusa i lukautim pes',
+'tog-uselivepreview' => 'Soim ol senis kwiktaim taim mi wokim (i nidim Javascript)',
+'tog-watchlisthideown' => 'Haitim ol senis mi wokim long lukautbuk bilong mi',
+'tog-watchlisthidebots' => 'Haitim ol senis ol bot i wokim long lukautbuk bilong mi',
+'tog-watchlisthideminor' => 'Haitim ol liklik senis long lukautbuk bilong mi',
+'tog-showhiddencats' => 'Soim ol grup hait',
 
 'underline-always' => 'Olgeta taim',
-'underline-never'  => 'No gat',
+'underline-never' => 'No gat',
 
 # Font style option in Special:Preferences
 'editfont-monospace' => 'Monospaced rait',
 'editfont-sansserif' => 'Sans-serif rait',
-'editfont-serif'     => 'Serif rait',
+'editfont-serif' => 'Serif rait',
 
 # Dates
-'sunday'        => 'Sande',
-'monday'        => 'Mande',
-'tuesday'       => 'Tunde',
-'wednesday'     => 'Trinde',
-'thursday'      => 'Fonde',
-'friday'        => 'Fraide',
-'saturday'      => 'Sarere',
-'sun'           => 'San',
-'mon'           => 'Man',
-'tue'           => 'Tun',
-'wed'           => 'Tri',
-'thu'           => 'Fon',
-'fri'           => 'Frai',
-'sat'           => 'Sar',
-'january'       => 'Janueri',
-'february'      => 'Februeri',
-'march'         => 'Mas',
-'april'         => 'Epril',
-'may_long'      => 'Me',
-'june'          => 'Jun',
-'july'          => 'Julai',
-'august'        => 'Ogas',
-'september'     => 'Septemba',
-'october'       => 'Oktoba',
-'november'      => 'Novemba',
-'december'      => 'Disemba',
-'january-gen'   => 'Janueri',
-'february-gen'  => 'Februeri',
-'march-gen'     => 'Mas',
-'april-gen'     => 'Epril',
-'may-gen'       => 'Me',
-'june-gen'      => 'Jun',
-'july-gen'      => 'Julai',
-'august-gen'    => 'Ogas',
+'sunday' => 'Sande',
+'monday' => 'Mande',
+'tuesday' => 'Tunde',
+'wednesday' => 'Trinde',
+'thursday' => 'Fonde',
+'friday' => 'Fraide',
+'saturday' => 'Sarere',
+'sun' => 'San',
+'mon' => 'Man',
+'tue' => 'Tun',
+'wed' => 'Tri',
+'thu' => 'Fon',
+'fri' => 'Frai',
+'sat' => 'Sar',
+'january' => 'Janueri',
+'february' => 'Februeri',
+'march' => 'Mas',
+'april' => 'Epril',
+'may_long' => 'Me',
+'june' => 'Jun',
+'july' => 'Julai',
+'august' => 'Ogas',
+'september' => 'Septemba',
+'october' => 'Oktoba',
+'november' => 'Novemba',
+'december' => 'Disemba',
+'january-gen' => 'Janueri',
+'february-gen' => 'Februeri',
+'march-gen' => 'Mas',
+'april-gen' => 'Epril',
+'may-gen' => 'Me',
+'june-gen' => 'Jun',
+'july-gen' => 'Julai',
+'august-gen' => 'Ogas',
 'september-gen' => 'Septemba',
-'october-gen'   => 'Oktoba',
-'november-gen'  => 'Novemba',
-'december-gen'  => 'Disemba',
-'jan'           => 'Jan',
-'feb'           => 'Feb',
-'mar'           => 'Mas',
-'apr'           => 'Epr',
-'may'           => 'Me',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Oga',
-'sep'           => 'Sep',
-'oct'           => 'Okt',
-'nov'           => 'Nov',
-'dec'           => 'Dis',
+'october-gen' => 'Oktoba',
+'november-gen' => 'Novemba',
+'december-gen' => 'Disemba',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mas',
+'apr' => 'Epr',
+'may' => 'Me',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Oga',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Nov',
+'dec' => 'Dis',
 
 # Categories related messages
-'pagecategories'           => '{{PLURAL:$1|Grup|Ol grup}}',
-'category_header'          => 'Ol pes insait long grup "$1"',
-'subcategories'            => 'Ol grup insait long grup',
-'category-media-header'    => 'Ol media (olsem piksa) insait long grup "$1"',
-'category-empty'           => "''Dispela grup i no gat wanpela pes o media (olsem piksa) insait long en nau.''",
-'hidden-categories'        => '{{PLURAL:$1|Grup hait|Ol grup hait}}',
+'pagecategories' => '{{PLURAL:$1|Grup|Ol grup}}',
+'category_header' => 'Ol pes insait long grup "$1"',
+'subcategories' => 'Ol grup insait long grup',
+'category-media-header' => 'Ol media (olsem piksa) insait long grup "$1"',
+'category-empty' => "''Dispela grup i no gat wanpela pes o media (olsem piksa) insait long en nau.''",
+'hidden-categories' => '{{PLURAL:$1|Grup hait|Ol grup hait}}',
 'hidden-category-category' => 'Ol grup hait',
-'listingcontinuesabbrev'   => 'moa',
+'listingcontinuesabbrev' => 'moa',
 
-'about'         => 'Long',
-'article'       => 'Stori',
-'newwindow'     => '(bai kamap long nupela windo)',
-'cancel'        => 'Toromwe senis',
+'about' => 'Long',
+'article' => 'Stori',
+'newwindow' => '(bai kamap long nupela windo)',
+'cancel' => 'Toromwe senis',
 'moredotdotdot' => 'Moa...',
-'mypage'        => 'Pes bilong mi',
-'mytalk'        => 'Toktok bilong mi',
-'anontalk'      => 'Toktok bilong dispela IP',
-'navigation'    => 'Ol bikpela pes',
-'and'           => '&#32;na',
+'mypage' => 'Pes bilong mi',
+'mytalk' => 'Toktok bilong mi',
+'anontalk' => 'Toktok bilong dispela IP',
+'navigation' => 'Ol bikpela pes',
+'and' => '&#32;na',
 
 # Cologne Blue skin
-'qbfind'         => 'Painim',
-'qbbrowse'       => 'Lukim',
-'qbedit'         => 'Senisim',
-'qbpageoptions'  => 'Dispela pes',
-'qbmyoptions'    => 'Ol pes bilong mi',
+'qbfind' => 'Painim',
+'qbbrowse' => 'Lukim',
+'qbedit' => 'Senisim',
+'qbpageoptions' => 'Dispela pes',
+'qbmyoptions' => 'Ol pes bilong mi',
 'qbspecialpages' => 'Ol sipesol pes',
 
 # Vector skin
-'vector-action-delete'   => 'Rausim',
-'vector-action-move'     => 'Surikim',
-'vector-action-protect'  => 'Tambuim',
-'vector-view-create'     => 'Kirapim',
-'vector-view-edit'       => 'Senisim',
-'vector-view-history'    => 'Ol senis',
-'vector-view-view'       => 'Rit',
+'vector-action-delete' => 'Rausim',
+'vector-action-move' => 'Surikim',
+'vector-action-protect' => 'Tambuim',
+'vector-view-create' => 'Kirapim',
+'vector-view-edit' => 'Senisim',
+'vector-view-history' => 'Ol senis',
+'vector-view-view' => 'Rit',
 'vector-view-viewsource' => 'Lukim as tok',
 
-'errorpagetitle'   => 'Samting i kranki',
-'returnto'         => 'Go bek long $1',
-'tagline'          => 'Long {{SITENAME}}',
-'help'             => 'Halivim mi',
-'search'           => 'Painim',
-'searchbutton'     => 'Painim',
-'go'               => 'Go',
-'searcharticle'    => 'Go',
-'history'          => 'Ol senis long dispela pes',
-'history_short'    => 'Ol senis',
-'print'            => 'Prinim',
-'edit'             => 'Senisim',
-'create'           => 'Kirapim',
-'editthispage'     => 'Senisim dispela pes',
+'errorpagetitle' => 'Samting i kranki',
+'returnto' => 'Go bek long $1',
+'tagline' => 'Long {{SITENAME}}',
+'help' => 'Halivim mi',
+'search' => 'Painim',
+'searchbutton' => 'Painim',
+'go' => 'Go',
+'searcharticle' => 'Go',
+'history' => 'Ol senis long dispela pes',
+'history_short' => 'Ol senis',
+'print' => 'Prinim',
+'edit' => 'Senisim',
+'create' => 'Kirapim',
+'editthispage' => 'Senisim dispela pes',
 'create-this-page' => 'Kirapim dispela pes',
-'delete'           => 'Rausim',
-'deletethispage'   => 'Rausim dispela pes',
-'protect'          => 'Tambuim',
-'protect_change'   => 'senisim',
-'newpage'          => 'Nupela pes',
-'talkpage'         => 'Toktok bilong dispela pes',
+'delete' => 'Rausim',
+'deletethispage' => 'Rausim dispela pes',
+'protect' => 'Tambuim',
+'protect_change' => 'senisim',
+'newpage' => 'Nupela pes',
+'talkpage' => 'Toktok bilong dispela pes',
 'talkpagelinktext' => 'Toktok',
-'specialpage'      => 'Sipesol pes',
-'personaltools'    => 'Ol pes bilong mi',
-'postcomment'      => 'Nupela hap bilong pes',
-'talk'             => 'Toktok',
-'views'            => 'Ol lukluk',
-'toolbox'          => 'Sipesol bokis',
-'userpage'         => 'Lukim pes bilong yusa',
-'projectpage'      => 'Lukim pes bilong projek',
-'imagepage'        => 'Lukim pes bilong fail',
-'mediawikipage'    => 'Lukim pes bilong toksave',
-'templatepage'     => 'Lukim templet pes',
-'viewhelppage'     => 'Lukim pes long halivim',
-'categorypage'     => 'Lukim pes bilong grup',
-'viewtalkpage'     => 'Lukim toktok',
-'otherlanguages'   => 'Long ol narapela tokples',
-'redirectedfrom'   => '(Nupela rot i pinis long $1)',
-'redirectpagesub'  => 'Nupela rot',
-'protectedpage'    => 'Pes i tambu',
-'jumpto'           => 'Go stret long:',
+'specialpage' => 'Sipesol pes',
+'personaltools' => 'Ol pes bilong mi',
+'postcomment' => 'Nupela hap bilong pes',
+'talk' => 'Toktok',
+'views' => 'Ol lukluk',
+'toolbox' => 'Sipesol bokis',
+'userpage' => 'Lukim pes bilong yusa',
+'projectpage' => 'Lukim pes bilong projek',
+'imagepage' => 'Lukim pes bilong fail',
+'mediawikipage' => 'Lukim pes bilong toksave',
+'templatepage' => 'Lukim templet pes',
+'viewhelppage' => 'Lukim pes long halivim',
+'categorypage' => 'Lukim pes bilong grup',
+'viewtalkpage' => 'Lukim toktok',
+'otherlanguages' => 'Long ol narapela tokples',
+'redirectedfrom' => '(Nupela rot i pinis long $1)',
+'redirectpagesub' => 'Nupela rot',
+'protectedpage' => 'Pes i tambu',
+'jumpto' => 'Go stret long:',
 'jumptonavigation' => 'ol bikpela pes',
-'jumptosearch'     => 'painim',
+'jumptosearch' => 'painim',
 
 # 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'            => 'Long {{SITENAME}}',
-'aboutpage'            => 'Project:Long',
-'copyrightpage'        => '{{ns:project}}:Ol laisens',
-'currentevents'        => 'Karen afeas',
-'currentevents-url'    => 'Project:Karen afeas',
-'disclaimers'          => 'Ol toksave bilong lo',
-'disclaimerpage'       => 'Project:Ol tok warn long lo',
-'edithelp'             => 'Halivim mi long pasin bilong wokim senis',
-'edithelppage'         => 'Help:Senisim',
-'mainpage'             => 'Fran Pes',
+'aboutsite' => 'Long {{SITENAME}}',
+'aboutpage' => 'Project:Long',
+'copyrightpage' => '{{ns:project}}:Ol laisens',
+'currentevents' => 'Karen afeas',
+'currentevents-url' => 'Project:Karen afeas',
+'disclaimers' => 'Ol toksave bilong lo',
+'disclaimerpage' => 'Project:Ol tok warn long lo',
+'edithelp' => 'Halivim mi long pasin bilong wokim senis',
+'edithelppage' => 'Help:Senisim',
+'mainpage' => 'Fran Pes',
 'mainpage-description' => 'Fran Pes',
-'portal'               => 'Bung ples',
-'portal-url'           => 'Project:Bung ples',
-'privacy'              => 'Polisi long praivet',
-'privacypage'          => 'Project:Polisi long praivet',
+'portal' => 'Bung ples',
+'portal-url' => 'Project:Bung ples',
+'privacy' => 'Polisi long praivet',
+'privacypage' => 'Project:Polisi long praivet',
 
 'badaccess' => 'Kranki long tok orait.',
 
-'ok'                 => 'OK',
-'retrievedfrom'      => 'Ikam long "$1"',
+'ok' => 'OK',
+'retrievedfrom' => 'Ikam long "$1"',
 'youhavenewmessages' => '$1 i kam ($2).',
-'newmessageslink'    => 'Ol nupela toksave',
-'editsection'        => 'senisim',
-'editold'            => 'senisim',
-'viewsourceold'      => 'lukim as tok',
-'editlink'           => 'senisim',
-'viewsourcelink'     => 'lukim as tok',
-'editsectionhint'    => 'Senisim seksen: $1',
-'showtoc'            => 'soim',
-'hidetoc'            => 'haitim',
-'viewdeleted'        => 'Lukim $1?',
-'restorelink'        => '{{PLURAL:$1|wanpela senis i raus pinis|$1 senis i raus pinis}}',
-'feedlinks'          => 'Fid:',
-'site-rss-feed'      => '$1 RSS toksave',
-'site-atom-feed'     => '$1 Atom fid',
-'page-rss-feed'      => '"$1" RSS fid',
-'page-atom-feed'     => '"$1" Atom fid',
-'red-link-title'     => '$1 (pes i nogat stap)',
+'newmessageslink' => 'Ol nupela toksave',
+'editsection' => 'senisim',
+'editold' => 'senisim',
+'viewsourceold' => 'lukim as tok',
+'editlink' => 'senisim',
+'viewsourcelink' => 'lukim as tok',
+'editsectionhint' => 'Senisim seksen: $1',
+'showtoc' => 'soim',
+'hidetoc' => 'haitim',
+'viewdeleted' => 'Lukim $1?',
+'restorelink' => '{{PLURAL:$1|wanpela senis i raus pinis|$1 senis i raus pinis}}',
+'feedlinks' => 'Fid:',
+'site-rss-feed' => '$1 RSS toksave',
+'site-atom-feed' => '$1 Atom fid',
+'page-rss-feed' => '"$1" RSS fid',
+'page-atom-feed' => '"$1" Atom fid',
+'red-link-title' => '$1 (pes i nogat stap)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Stori',
-'nstab-user'      => 'Pes bilong yusa',
-'nstab-media'     => 'Media pes',
-'nstab-special'   => 'Sipesol pes',
-'nstab-project'   => 'Pes bilong projek',
-'nstab-image'     => 'Fail',
+'nstab-main' => 'Stori',
+'nstab-user' => 'Pes bilong yusa',
+'nstab-media' => 'Media pes',
+'nstab-special' => 'Sipesol pes',
+'nstab-project' => 'Pes bilong projek',
+'nstab-image' => 'Fail',
 'nstab-mediawiki' => 'Toksave',
-'nstab-template'  => 'Templet',
-'nstab-help'      => 'Pes bilong halivim',
-'nstab-category'  => 'Grup',
+'nstab-template' => 'Templet',
+'nstab-help' => 'Pes bilong halivim',
+'nstab-category' => 'Grup',
 
 # General errors
-'error'      => 'Birua',
-'badtitle'   => 'Nem bilong pes i no stret',
+'error' => 'Birua',
+'badtitle' => 'Nem bilong pes i no stret',
 'viewsource' => 'Lukim as tok',
 
 # Login and logout pages
-'yourname'            => 'Yusanem:',
-'yourpassword'        => 'Paswot:',
-'logout'              => 'Logaut',
-'userlogout'          => 'Logaut',
-'gotaccountlink'      => 'Log in',
-'createaccountmail'   => 'Long e-mel',
+'yourname' => 'Yusanem:',
+'yourpassword' => 'Paswot:',
+'logout' => 'Logaut',
+'userlogout' => 'Logaut',
+'gotaccountlink' => 'Log in',
+'createaccountmail' => 'Long e-mel',
 'createaccountreason' => 'As bilong en:',
-'mailmypassword'      => 'E-mel nupela paswot',
-'loginlanguagelabel'  => 'Tokples: $1',
+'mailmypassword' => 'E-mel nupela paswot',
+'loginlanguagelabel' => 'Tokples: $1',
 
 # Edit page toolbar
-'link_sample'    => 'Link taitel',
+'link_sample' => 'Link taitel',
 'extlink_sample' => 'http://www.example.com link taitel',
-'media_tip'      => 'Link bilong fail',
+'media_tip' => 'Link bilong fail',
 
 # Edit pages
-'summary'                => 'Liklik toksave bilong senis:',
-'subject'                => 'Nem bilong pes (o hap bilong pes):',
-'minoredit'              => 'Dispela emi liklik senis',
-'watchthis'              => 'Putim dispela pes long lukautbuk bilong mi',
-'savearticle'            => 'Raitim pes',
-'preview'                => 'Pes wantaim senis (pastaim long raitim)',
-'showpreview'            => 'Soim pes wantaim senis (pastaim long raitim)',
-'showlivepreview'        => 'Soim senis kwiktaim taim mi wokim (pastaim long raitim)',
-'showdiff'               => 'Soim ol senis',
-'missingcommenttext'     => 'Plis raitim tingting daunbilo.',
-'summary-preview'        => 'Toksave bilong senis bai luk olsem:',
-'subject-preview'        => 'Nem bilong pes (o hap bilong pes) bai olsem:',
-'blockedtitle'           => 'Yusa i pas',
-'blockednoreason'        => 'Nogat as bilong en',
-'newarticle'             => '(Nupela)',
-'updated'                => '(i nupela)',
-'editing'                => 'Senisim $1',
-'editingsection'         => 'Senisim $1 (seksen)',
-'editconflict'           => 'Kranki long senisim: $1',
-'yourtext'               => 'Raitim bilong yu',
-'yourdiff'               => 'Ol hap i senis',
-'copyrightwarning'       => "Toksave: olgeta senis yu wokim long long {{SITENAME}} bai stap ananit long tokorait $2 (lukim $1 long painimaut moa long dispela). Sapos yu no laikim narapela manmeri long senisim olgeta, o salim dispela i go long ol kainkain hap, noken raitim long hia.<br />
+'summary' => 'Liklik toksave bilong senis:',
+'subject' => 'Nem bilong pes (o hap bilong pes):',
+'minoredit' => 'Dispela emi liklik senis',
+'watchthis' => 'Putim dispela pes long lukautbuk bilong mi',
+'savearticle' => 'Raitim pes',
+'preview' => 'Pes wantaim senis (pastaim long raitim)',
+'showpreview' => 'Soim pes wantaim senis (pastaim long raitim)',
+'showlivepreview' => 'Soim senis kwiktaim taim mi wokim (pastaim long raitim)',
+'showdiff' => 'Soim ol senis',
+'missingcommenttext' => 'Plis raitim tingting daunbilo.',
+'summary-preview' => 'Toksave bilong senis bai luk olsem:',
+'subject-preview' => 'Nem bilong pes (o hap bilong pes) bai olsem:',
+'blockedtitle' => 'Yusa i pas',
+'blockednoreason' => 'Nogat as bilong en',
+'newarticle' => '(Nupela)',
+'updated' => '(i nupela)',
+'editing' => 'Senisim $1',
+'editingsection' => 'Senisim $1 (seksen)',
+'editconflict' => 'Kranki long senisim: $1',
+'yourtext' => 'Raitim bilong yu',
+'yourdiff' => 'Ol hap i senis',
+'copyrightwarning' => "Toksave: olgeta senis yu wokim long long {{SITENAME}} bai stap ananit long tokorait $2 (lukim $1 long painimaut moa long dispela). Sapos yu no laikim narapela manmeri long senisim olgeta, o salim dispela i go long ol kainkain hap, noken raitim long hia.<br />
 Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap we lo i tok olsem i orait long kisim (Tok Inglis: <i>public domain</i>).
 '''YU NOKEN RAITIM WANPELA SAMTING SAPOS YU NO WOKIM YU YET, O YU KISIM TOKORAIT LONG PUTIM LONG HIA!'''",
-'copyrightwarning2'      => "Toksave: olgeta senis yu wokim long long {{SITENAME}} bai inap senis o raus long han bilong ol narapela manmeri. Sapos yu no laikim narapela manmeri long senisim olgeta samting yu raitim, o salim dispela i go long ol kainkain hap, noken raitim long hia.<br />
+'copyrightwarning2' => "Toksave: olgeta senis yu wokim long long {{SITENAME}} bai inap senis o raus long han bilong ol narapela manmeri. Sapos yu no laikim narapela manmeri long senisim olgeta samting yu raitim, o salim dispela i go long ol kainkain hap, noken raitim long hia.<br />
 Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap we lo i tok olsem i orait long kisim (Tok Inglis: <i>public domain</i>). Lukim $1 long painimaut moa long dispela.<br />
 '''YU NOKEN RAITIM WANPELA SAMTING IGAT COPYRIGHT LONG EN (NARAPELA MANMERI I RAITIM)!'''",
-'templatesused'          => '{{PLURAL:$1|Templet|Ol templet}} dispela pes i yusim:',
-'templatesusedpreview'   => '{{PLURAL:$1|Templet|Ol templet}} dispela pes i yusim (bihain long dispela senis):',
-'template-protected'     => '(itambu)',
+'templatesused' => '{{PLURAL:$1|Templet|Ol templet}} dispela pes i yusim:',
+'templatesusedpreview' => '{{PLURAL:$1|Templet|Ol templet}} dispela pes i yusim (bihain long dispela senis):',
+'template-protected' => '(itambu)',
 'template-semiprotected' => '(i hap tambu)',
-'hiddencategories'       => 'Dispela pes emi stap insait long {{PLURAL:$1|wanpela grup hait|$1 grup hait}}:',
-'log-fulllog'            => 'Lukim olgeta ripot',
+'hiddencategories' => 'Dispela pes emi stap insait long {{PLURAL:$1|wanpela grup hait|$1 grup hait}}:',
+'log-fulllog' => 'Lukim olgeta ripot',
 
 # History pages
-'viewpagelogs'     => 'Lukim ol ripot bilong dispela pes',
+'viewpagelogs' => 'Lukim ol ripot bilong dispela pes',
 'previousrevision' => '← Moa olpela',
-'nextrevision'     => 'Moa yangpela →',
-'cur'              => 'nau',
-'histfirst'        => 'Nambawan',
-'histlast'         => 'Bilong nau',
+'nextrevision' => 'Moa yangpela →',
+'cur' => 'nau',
+'histfirst' => 'Nambawan',
+'histlast' => 'Bilong nau',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 long $2',
 
 # Revision deletion
-'rev-delundel'               => 'soim/haitim',
+'rev-delundel' => 'soim/haitim',
 'revdelete-show-file-submit' => 'Yes',
-'revdelete-radio-set'        => 'Yes',
-'revdelete-radio-unset'      => 'Nogat',
-'pagehist'                   => 'Ol senis bilong pes',
+'revdelete-radio-set' => 'Yes',
+'revdelete-radio-unset' => 'Nogat',
+'pagehist' => 'Ol senis bilong pes',
 
 # History merging
 'mergehistory-from' => 'As pes:',
 
 # Diffs
-'lineno'   => 'Lain $1:',
+'lineno' => 'Lain $1:',
 'editundo' => 'go bek',
 
 # Search results
-'searchresults'                  => 'Ol painim',
-'searchresults-title'            => 'Ol painim long "$1"',
-'searchresulttext'               => 'Long moa infomesen bilong painim {{SITENAME}}, lukim [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitleinvalid'          => "Yu painim '''$1'''",
-'viewprevnext'                   => 'Lukim ($1 {{int:pipe-separator}} $2) ($3)',
-'searchprofile-images'           => 'Media',
-'searchprofile-everything'       => 'Olgeta',
+'searchresults' => 'Ol painim',
+'searchresults-title' => 'Ol painim long "$1"',
+'searchresulttext' => 'Long moa infomesen bilong painim {{SITENAME}}, lukim [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitleinvalid' => "Yu painim '''$1'''",
+'viewprevnext' => 'Lukim ($1 {{int:pipe-separator}} $2) ($3)',
+'searchprofile-images' => 'Media',
+'searchprofile-everything' => 'Olgeta',
 'searchprofile-articles-tooltip' => 'Painim long $1',
-'searchprofile-project-tooltip'  => 'Painim long $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|1 wot|ol $2 wot}})',
-'search-redirect'                => '(nupela rot long $1)',
-'search-section'                 => '(seksen $1)',
-'search-suggest'                 => 'Yu laik tok: $1',
-'search-interwiki-default'       => '$1 ol painim:',
-'search-interwiki-more'          => '(moa)',
-'search-mwsuggest-enabled'       => 'halivim mi',
-'search-mwsuggest-disabled'      => 'nogat halivim mi',
-'searchall'                      => 'olgeta',
-'powersearch'                    => 'Mobeta Painim',
-'powersearch-legend'             => 'Mobeta Painim',
-'powersearch-ns'                 => 'Painim long ol nem',
-'powersearch-redir'              => 'Soim ol nupela rot',
-'powersearch-field'              => 'Painim long',
-'powersearch-toggleall'          => 'Olgeta',
-'powersearch-togglenone'         => 'I nogat wanpela',
+'searchprofile-project-tooltip' => 'Painim long $1',
+'search-result-size' => '$1 ({{PLURAL:$2|1 wot|ol $2 wot}})',
+'search-redirect' => '(nupela rot long $1)',
+'search-section' => '(seksen $1)',
+'search-suggest' => 'Yu laik tok: $1',
+'search-interwiki-default' => '$1 ol painim:',
+'search-interwiki-more' => '(moa)',
+'search-mwsuggest-enabled' => 'halivim mi',
+'search-mwsuggest-disabled' => 'nogat halivim mi',
+'searchall' => 'olgeta',
+'powersearch' => 'Mobeta Painim',
+'powersearch-legend' => 'Mobeta Painim',
+'powersearch-ns' => 'Painim long ol nem',
+'powersearch-redir' => 'Soim ol nupela rot',
+'powersearch-field' => 'Painim long',
+'powersearch-toggleall' => 'Olgeta',
+'powersearch-togglenone' => 'I nogat wanpela',
 
 # Quickbar
 'qbsettings-none' => 'I nogat wanpela',
 
 # Preferences page
-'preferences'               => 'Ol laik',
-'mypreferences'             => 'Ol laik bilong mi',
-'prefs-edits'               => 'Hamas senis:',
-'changepassword'            => 'Senis paswot',
-'prefs-skin'                => 'Skin',
-'skin-preview'              => 'pes mi senisim, pastaim long raitim',
-'datedefault'               => 'Nogat laik',
-'prefs-rc'                  => 'Nupela senis',
-'prefs-watchlist'           => 'Lukautbuk',
-'prefs-watchlist-days-max'  => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'preferences' => 'Ol laik',
+'mypreferences' => 'Ol laik bilong mi',
+'prefs-edits' => 'Hamas senis:',
+'changepassword' => 'Senis paswot',
+'prefs-skin' => 'Skin',
+'skin-preview' => 'pes mi senisim, pastaim long raitim',
+'datedefault' => 'Nogat laik',
+'prefs-rc' => 'Nupela senis',
+'prefs-watchlist' => 'Lukautbuk',
+'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
 'prefs-watchlist-edits-max' => 'No moa long: 1000',
-'prefs-resetpass'           => 'Senis paswot',
-'saveprefs'                 => 'Holim long tingting',
-'prefs-editing'             => 'Senisim',
-'searchresultshead'         => 'Painim',
-'recentchangesdays-max'     => 'No moa long $1 {{PLURAL:$1|de|ol de}}',
-'timezoneregion-africa'     => 'Aprika',
-'timezoneregion-america'    => 'Amerika',
+'prefs-resetpass' => 'Senis paswot',
+'saveprefs' => 'Holim long tingting',
+'prefs-editing' => 'Senisim',
+'searchresultshead' => 'Painim',
+'recentchangesdays-max' => 'No moa long $1 {{PLURAL:$1|de|ol de}}',
+'timezoneregion-africa' => 'Aprika',
+'timezoneregion-america' => 'Amerika',
 'timezoneregion-antarctica' => 'Antatika',
-'timezoneregion-asia'       => 'Esia',
-'timezoneregion-atlantic'   => 'Atlantik solwara',
-'timezoneregion-australia'  => 'Ostrelia',
-'timezoneregion-europe'     => 'Yurop',
-'timezoneregion-indian'     => 'Indian solwara',
-'timezoneregion-pacific'    => 'Pasifik solwara',
-'prefs-files'               => 'Ol fail',
-'prefs-custom-css'          => 'Praivet CSS',
-'prefs-custom-js'           => 'Praivet JavaScript',
-'youremail'                 => 'E-mel:',
-'username'                  => 'Yusanem:',
-'uid'                       => 'Yusa ID:',
-'yourrealname'              => 'Tru nem:',
-'yourlanguage'              => 'Tokples:',
-'yourgender'                => 'Man/Meri:',
-'gender-male'               => 'Man',
-'gender-female'             => 'Meri',
-'email'                     => 'E-mel',
-'prefs-info'                => 'Liklik infomesen',
+'timezoneregion-asia' => 'Esia',
+'timezoneregion-atlantic' => 'Atlantik solwara',
+'timezoneregion-australia' => 'Ostrelia',
+'timezoneregion-europe' => 'Yurop',
+'timezoneregion-indian' => 'Indian solwara',
+'timezoneregion-pacific' => 'Pasifik solwara',
+'prefs-files' => 'Ol fail',
+'prefs-custom-css' => 'Praivet CSS',
+'prefs-custom-js' => 'Praivet JavaScript',
+'youremail' => 'E-mel:',
+'username' => 'Yusanem:',
+'uid' => 'Yusa ID:',
+'yourrealname' => 'Tru nem:',
+'yourlanguage' => 'Tokples:',
+'yourgender' => 'Man/Meri:',
+'gender-male' => 'Man',
+'gender-female' => 'Meri',
+'email' => 'E-mel',
+'prefs-info' => 'Liklik infomesen',
 
 # User rights
-'editusergroup'           => 'Senisim ol grup bilong yusa',
+'editusergroup' => 'Senisim ol grup bilong yusa',
 'userrights-groupsmember' => 'Memba bilong:',
-'userrights-reason'       => 'As bilong en:',
+'userrights-reason' => 'As bilong en:',
 
 # Groups
-'group'      => 'Grup:',
+'group' => 'Grup:',
 'group-user' => 'Ol yusa',
-'group-bot'  => 'Ol bot',
-'group-all'  => '(olgeta)',
+'group-bot' => 'Ol bot',
+'group-all' => '(olgeta)',
 
 'group-user-member' => 'yusa',
-'group-bot-member'  => 'bot',
+'group-bot-member' => 'bot',
 
 'grouppage-user' => '{{ns:project}}:Ol yusa',
-'grouppage-bot'  => '{{ns:project}}:Ol bot',
+'grouppage-bot' => '{{ns:project}}:Ol bot',
 
 # Rights
-'right-read'           => 'Ridim ol pes',
-'right-edit'           => 'Senisim ol pes',
-'right-move'           => 'Surikim ol pes',
-'right-movefile'       => 'Surikim ol fail',
-'right-upload'         => 'Salim media fail',
-'right-delete'         => 'Rausim ol pes',
+'right-read' => 'Ridim ol pes',
+'right-edit' => 'Senisim ol pes',
+'right-move' => 'Surikim ol pes',
+'right-movefile' => 'Surikim ol fail',
+'right-upload' => 'Salim media fail',
+'right-delete' => 'Rausim ol pes',
 'right-suppressionlog' => 'Lukim ol praivet ripot',
 
 # User rights log
-'rightslog'  => 'Ripot long ol pawa bilong ol yusa',
+'rightslog' => 'Ripot long ol pawa bilong ol yusa',
 'rightsnone' => 'i nogat wanpela',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-read'          => 'ridim dispela pes',
-'action-edit'          => 'senisim dispela pes',
-'action-move'          => 'surikim dispela pes',
+'action-read' => 'ridim dispela pes',
+'action-edit' => 'senisim dispela pes',
+'action-move' => 'surikim dispela pes',
 'action-move-subpages' => 'surikim dispela pes, na ol pes ananit long en',
-'action-movefile'      => 'surikim dispela fail',
-'action-delete'        => 'rausim dispela pes',
+'action-movefile' => 'surikim dispela fail',
+'action-delete' => 'rausim dispela pes',
 
 # Recent changes
-'nchanges'                  => '$1 senis',
-'recentchanges'             => 'Nupela senis',
+'nchanges' => '$1 senis',
+'recentchanges' => 'Nupela senis',
 'recentchanges-label-minor' => 'Dispela emi liklik senis',
-'rcnote'                    => "Ananit yu lukim '''$1 senis''' long '''$2 de''' igo pinis, na i olsem long $3.",
-'rcshowhideminor'           => '$1 ol liklik senis',
-'rcshowhidebots'            => '$1 ol bot',
-'rcshowhideliu'             => '$1 ol yusa',
-'rcshowhideanons'           => '$1 ol IP yusa',
-'rcshowhidemine'            => '$1 ol senis bilong mi',
-'diff'                      => 'dispela senis',
-'hist'                      => 'olgeta senis',
-'hide'                      => 'Haitim',
-'show'                      => 'Soim',
-'minoreditletter'           => 'm',
-'newpageletter'             => 'N',
-'boteditletter'             => 'b',
-'rc_categories'             => 'Soim ol senis insait long ol dispela grup tasol (raitim wantaim "|" namel long wanwan)',
-'rc_categories_any'         => 'Olgeta',
+'rcnote' => "Ananit yu lukim '''$1 senis''' long '''$2 de''' igo pinis, na i olsem long $3.",
+'rcshowhideminor' => '$1 ol liklik senis',
+'rcshowhidebots' => '$1 ol bot',
+'rcshowhideliu' => '$1 ol yusa',
+'rcshowhideanons' => '$1 ol IP yusa',
+'rcshowhidemine' => '$1 ol senis bilong mi',
+'diff' => 'dispela senis',
+'hist' => 'olgeta senis',
+'hide' => 'Haitim',
+'show' => 'Soim',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
+'rc_categories' => 'Soim ol senis insait long ol dispela grup tasol (raitim wantaim "|" namel long wanwan)',
+'rc_categories_any' => 'Olgeta',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Ol senis klostu',
-'recentchangeslinked-feed'    => 'Ol senis klostu',
+'recentchangeslinked' => 'Ol senis klostu',
+'recentchangeslinked-feed' => 'Ol senis klostu',
 'recentchangeslinked-toolbox' => 'Ol senis klostu',
-'recentchangeslinked-page'    => 'Nem bilong pes:',
+'recentchangeslinked-page' => 'Nem bilong pes:',
 
 # Upload
-'upload'          => 'Salim media fail',
-'uploadbtn'       => 'Salim media fail',
-'uploaderror'     => 'Salim i kranki',
-'uploadlogpage'   => 'Ripot long salim',
-'filename'        => 'Nem bilong fail',
-'filesource'      => 'As:',
+'upload' => 'Salim media fail',
+'uploadbtn' => 'Salim media fail',
+'uploaderror' => 'Salim i kranki',
+'uploadlogpage' => 'Ripot long salim',
+'filename' => 'Nem bilong fail',
+'filesource' => 'As:',
 'watchthisupload' => 'Lukautim dispela fail',
 
-'license'            => 'Laisens:',
-'license-header'     => 'Laisens',
+'license' => 'Laisens:',
+'license-header' => 'Laisens',
 'upload_source_file' => '(fail long kompyuta bilong yu)',
 
 # Special:ListFiles
-'imgfile'        => 'fail',
-'listfiles'      => 'Lista bilong ol fail',
+'imgfile' => 'fail',
+'listfiles' => 'Lista bilong ol fail',
 'listfiles_date' => 'De',
 'listfiles_name' => 'Nem',
 'listfiles_user' => 'Yusa',
 
 # File description page
-'file-anchor-link'    => 'Fail',
-'filehist'            => 'Ol senis bilong dispela fail',
-'filehist-deleteall'  => 'rausim olgeta',
-'filehist-deleteone'  => 'rausim',
-'filehist-current'    => 'bilong nau',
-'filehist-datetime'   => 'De/Taim',
-'filehist-thumb'      => 'Liklik',
-'filehist-user'       => 'Yusa',
+'file-anchor-link' => 'Fail',
+'filehist' => 'Ol senis bilong dispela fail',
+'filehist-deleteall' => 'rausim olgeta',
+'filehist-deleteone' => 'rausim',
+'filehist-current' => 'bilong nau',
+'filehist-datetime' => 'De/Taim',
+'filehist-thumb' => 'Liklik',
+'filehist-user' => 'Yusa',
 'filehist-dimensions' => 'Ol sais',
-'filehist-comment'    => 'Tingting',
-'filehist-missing'    => 'Fail i no kamap',
-'imagelinks'          => 'Ol fail link',
-'linkstoimage'        => 'Dispela {{PLURAL:$1|pes i link|$1 pes i link}} long dispela fail:',
-'shared-repo-from'    => 'long $1',
+'filehist-comment' => 'Tingting',
+'filehist-missing' => 'Fail i no kamap',
+'imagelinks' => 'Ol fail link',
+'linkstoimage' => 'Dispela {{PLURAL:$1|pes i link|$1 pes i link}} long dispela fail:',
+'shared-repo-from' => 'long $1',
 
 # File deletion
-'filedelete'                  => 'Rausim $1',
-'filedelete-legend'           => 'Rausim fail',
-'filedelete-comment'          => 'As bilong en:',
-'filedelete-submit'           => 'Rausim',
+'filedelete' => 'Rausim $1',
+'filedelete-legend' => 'Rausim fail',
+'filedelete-comment' => 'As bilong en:',
+'filedelete-submit' => 'Rausim',
 'filedelete-reason-otherlist' => 'Arapela as bilong en',
 
 # Random page
@@ -523,47 +523,47 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
 'withoutinterwiki-submit' => 'Soim',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|byte|bytes}}',
-'ncategories'             => '$1 {{PLURAL:$1|grup|grup}}',
-'nmembers'                => '$1 {{PLURAL:$1|memba|memba}}',
-'uncategorizedpages'      => 'Ol pes i no stap insait long grup',
+'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
+'ncategories' => '$1 {{PLURAL:$1|grup|grup}}',
+'nmembers' => '$1 {{PLURAL:$1|memba|memba}}',
+'uncategorizedpages' => 'Ol pes i no stap insait long grup',
 'uncategorizedcategories' => 'Ol grup i no stap insait long grup',
-'uncategorizedimages'     => 'Ol piksa i no stap insait long grup',
-'uncategorizedtemplates'  => 'Ol templet i no stap insait long grup',
-'unusedcategories'        => 'Ol grup i no gat samting insait long ol',
-'unusedimages'            => 'Ol media (olsem piksa) i no gat wanpela pes i soim ol',
-'wantedcategories'        => 'Ol grup i no stap yet tasol igat link i kam long ol',
-'wantedpages'             => 'Ol pes i no stap yet tasol igat link i kam long ol',
-'mostlinked'              => 'Ol pes i gat planti link i kam long ol',
-'mostlinkedcategories'    => 'Ol grup igat planti link i kam long ol',
-'mostlinkedtemplates'     => 'Ol templet igat planti link i kam long ol',
-'mostcategories'          => 'Ol pes bilong buk istap insait long planti grup',
-'listusers'               => 'Lista long ol yusa',
-'newpages'                => 'Ol nupela pes',
-'newpages-username'       => 'Yusanem:',
-'ancientpages'            => 'Ol pes i lapun tru',
-'move'                    => 'Surikim',
-'movethispage'            => 'Surikim dispela pes',
-'unusedcategoriestext'    => 'Ol dispela grup istap yet, tasol i no gat wanpela pes o grup i stap insait long ol.',
+'uncategorizedimages' => 'Ol piksa i no stap insait long grup',
+'uncategorizedtemplates' => 'Ol templet i no stap insait long grup',
+'unusedcategories' => 'Ol grup i no gat samting insait long ol',
+'unusedimages' => 'Ol media (olsem piksa) i no gat wanpela pes i soim ol',
+'wantedcategories' => 'Ol grup i no stap yet tasol igat link i kam long ol',
+'wantedpages' => 'Ol pes i no stap yet tasol igat link i kam long ol',
+'mostlinked' => 'Ol pes i gat planti link i kam long ol',
+'mostlinkedcategories' => 'Ol grup igat planti link i kam long ol',
+'mostlinkedtemplates' => 'Ol templet igat planti link i kam long ol',
+'mostcategories' => 'Ol pes bilong buk istap insait long planti grup',
+'listusers' => 'Lista long ol yusa',
+'newpages' => 'Ol nupela pes',
+'newpages-username' => 'Yusanem:',
+'ancientpages' => 'Ol pes i lapun tru',
+'move' => 'Surikim',
+'movethispage' => 'Surikim dispela pes',
+'unusedcategoriestext' => 'Ol dispela grup istap yet, tasol i no gat wanpela pes o grup i stap insait long ol.',
 
 # Book sources
-'booksources'               => 'Ol as bilong buk',
+'booksources' => 'Ol as bilong buk',
 'booksources-search-legend' => 'Painim long ol buk as',
-'booksources-go'            => 'Go',
+'booksources-go' => 'Go',
 
 # Special:Log
-'specialloguserlabel'  => 'Yusa:',
+'specialloguserlabel' => 'Yusa:',
 'speciallogtitlelabel' => 'Nem:',
-'log'                  => 'Ol ripot',
+'log' => 'Ol ripot',
 
 # Special:AllPages
-'allpages'       => 'Olgeta pes',
+'allpages' => 'Olgeta pes',
 'alphaindexline' => '$1 inap long $2',
-'allarticles'    => 'Ol pes',
+'allarticles' => 'Ol pes',
 'allpagessubmit' => 'Go',
 
 # Special:Categories
-'categories'         => 'Ol grup',
+'categories' => 'Ol grup',
 'categoriespagetext' => 'Ol dispela grup istap.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
@@ -578,198 +578,198 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'newuserlogpage' => 'Ripot long ol nupela yusa',
 
 # Special:ListGroupRights
-'listgrouprights-group'   => 'Grup',
+'listgrouprights-group' => 'Grup',
 'listgrouprights-members' => '(lista bilong ol memba)',
 
 # E-mail user
-'emailuser'       => 'E-mel dispela yusa',
-'emailpage'       => 'E-mel yusa',
+'emailuser' => 'E-mel dispela yusa',
+'emailpage' => 'E-mel yusa',
 'defemailsubject' => '{{SITENAME}} e-mel',
-'noemailtitle'    => 'Nogat e-mel',
-'emailfrom'       => 'I kam long:',
-'emailto'         => 'I go long:',
-'emailmessage'    => 'Toksave:',
-'emailsend'       => 'Salim',
+'noemailtitle' => 'Nogat e-mel',
+'emailfrom' => 'I kam long:',
+'emailto' => 'I go long:',
+'emailmessage' => 'Toksave:',
+'emailsend' => 'Salim',
 
 # Watchlist
-'watchlist'            => 'Lukautbuk bilong mi',
-'mywatchlist'          => 'Lukautbuk bilong mi',
-'watchlistfor2'        => 'Bilong $1 $2',
-'nowatchlist'          => 'Nogat wanpela samting istap long lukautbuk bilong yu.',
-'watchlistanontext'    => 'Yu mas $1 long lukim o senisim ol samting long lukautbuk bilong yu.',
-'watchnologintext'     => 'Yu mas [[Special:UserLogin|login]] long senisim lukautbuk bilong yu.',
-'addedwatchtext'       => "Pes \"[[:\$1]]\" igo insait long [[Special:Watchlist|lukautbuk]] bilong yu nau.
+'watchlist' => 'Lukautbuk bilong mi',
+'mywatchlist' => 'Lukautbuk bilong mi',
+'watchlistfor2' => 'Bilong $1 $2',
+'nowatchlist' => 'Nogat wanpela samting istap long lukautbuk bilong yu.',
+'watchlistanontext' => 'Yu mas $1 long lukim o senisim ol samting long lukautbuk bilong yu.',
+'watchnologintext' => 'Yu mas [[Special:UserLogin|login]] long senisim lukautbuk bilong yu.',
+'addedwatchtext' => "Pes \"[[:\$1]]\" igo insait long [[Special:Watchlist|lukautbuk]] bilong yu nau.
 Bai yu lukim ol nupela senis long dispela pes, na pes toktok bilong en, long lukautbuk,
 na dispela pes bai kamap '''strongpela''' long [[Special:RecentChanges|pes bilong ol nupela senis]]
 na olsem bai isi long lukim em.
 
 Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis long lukautim\" taim yu lukim pes.",
-'removedwatchtext'     => 'Pes "[[:$1]]" i raus pinis long [[Special:Watchlist|lukautbuk bilong yu]].',
-'watch'                => 'Lukautim',
-'watchthispage'        => 'Lukautim dispela pes',
-'unwatch'              => 'Pinis long lukautim',
-'unwatchthispage'      => 'Pinis long lukautim',
-'watchlist-details'    => '$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).',
+'removedwatchtext' => 'Pes "[[:$1]]" i raus pinis long [[Special:Watchlist|lukautbuk bilong yu]].',
+'watch' => 'Lukautim',
+'watchthispage' => 'Lukautim dispela pes',
+'unwatch' => 'Pinis long lukautim',
+'unwatchthispage' => 'Pinis long lukautim',
+'watchlist-details' => '$1 pes istap long lukautbuk (dispela namba i no kaunim ol pes bilong toktok).',
 'wlheader-showupdated' => "* Ol pes i senis pinis bihain long taim yu lukim ol igat nem i '''strongpela'''",
-'wlshowlast'           => 'Lukim dispela $1 aua $2 de $3',
-'watchlist-options'    => 'Ol laik bilong Lukautbuk',
+'wlshowlast' => 'Lukim dispela $1 aua $2 de $3',
+'watchlist-options' => 'Ol laik bilong Lukautbuk',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Wet liklik, i go insait long lukautbuk nau...',
+'watching' => 'Wet liklik, i go insait long lukautbuk nau...',
 'unwatching' => 'Wet liklik, i raus nau long lukautbuk...',
 
-'enotif_reset'                 => 'Makim olgeta pes olsem mi lukim pinis',
-'enotif_newpagetext'           => 'Dispela emi nupela pes.',
+'enotif_reset' => 'Makim olgeta pes olsem mi lukim pinis',
+'enotif_newpagetext' => 'Dispela emi nupela pes.',
 'enotif_impersonal_salutation' => 'yusa long {{SITENAME}}',
-'changed'                      => 'i senisim',
-'created'                      => 'i kirapim',
-'enotif_subject'               => '$PAGEEDITOR $CHANGEDORCREATED pes $PAGETITLE long {{SITENAME}}',
-'enotif_anon_editor'           => 'IP yusa $1',
+'changed' => 'i senisim',
+'created' => 'i kirapim',
+'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pes $PAGETITLE long {{SITENAME}}',
+'enotif_anon_editor' => 'IP yusa $1',
 
 # Delete
-'deletepage'            => 'Rausim dispela pes',
-'delete-confirm'        => 'Rausim $1',
-'delete-legend'         => 'Rausim',
-'dellogpage'            => 'Ripot long rausim ol pes',
-'deletecomment'         => 'As bilong en:',
+'deletepage' => 'Rausim dispela pes',
+'delete-confirm' => 'Rausim $1',
+'delete-legend' => 'Rausim',
+'dellogpage' => 'Ripot long rausim ol pes',
+'deletecomment' => 'As bilong en:',
 'deletereasonotherlist' => 'Arapela as bilong en',
 
 # Protect
-'protectlogpage'            => 'Ripot long tambuim ol pes',
-'protectedarticle'          => 'tambuim "[[$1]]"',
+'protectlogpage' => 'Ripot long tambuim ol pes',
+'protectedarticle' => 'tambuim "[[$1]]"',
 'modifiedarticleprotection' => 'senisim tambu bilong "[[$1]]"',
-'prot_1movedto2'            => '[[$1]] i surik i go long [[$2]] pinis',
-'protectcomment'            => 'As bilong en:',
-'protect-othertime'         => 'Arapela taim:',
-'protect-othertime-op'      => 'arapela taim',
-'protect-otherreason'       => 'Arapela/moa as bilong en',
-'protect-otherreason-op'    => 'Arapela as bilong en',
+'prot_1movedto2' => '[[$1]] i surik i go long [[$2]] pinis',
+'protectcomment' => 'As bilong en:',
+'protect-othertime' => 'Arapela taim:',
+'protect-othertime-op' => 'arapela taim',
+'protect-otherreason' => 'Arapela/moa as bilong en',
+'protect-otherreason-op' => 'Arapela as bilong en',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Senisim',
-'restriction-move'   => 'Surikim',
+'restriction-edit' => 'Senisim',
+'restriction-move' => 'Surikim',
 'restriction-create' => 'Kirapim',
 
 # Undelete
-'undeletelink'              => 'soim/restore',
-'undeleteviewlink'          => 'lukim',
-'undeletecomment'           => 'As bilong en:',
-'undelete-search-submit'    => 'Painim',
+'undeletelink' => 'soim/restore',
+'undeleteviewlink' => 'lukim',
+'undeletecomment' => 'As bilong en:',
+'undelete-search-submit' => 'Painim',
 'undelete-show-file-submit' => 'Yes',
 
 # Namespace form on various pages
-'invert'         => 'Tanbek',
+'invert' => 'Tanbek',
 'blanknamespace' => '(Nambawan)',
 
 # Contributions
-'contributions'       => 'Ol senis yusa i wokim',
+'contributions' => 'Ol senis yusa i wokim',
 'contributions-title' => 'Ol yusa senis long $1',
-'mycontris'           => 'Ol senis mi wokim',
-'contribsub2'         => 'Long $1 ($2)',
-'uctop'               => '(antap)',
-'month'               => 'Long mun (na bifo):',
-'year'                => 'Long yia (na bifo):',
+'mycontris' => 'Ol senis mi wokim',
+'contribsub2' => 'Long $1 ($2)',
+'uctop' => '(antap)',
+'month' => 'Long mun (na bifo):',
+'year' => 'Long yia (na bifo):',
 
 'sp-contributions-blocklog' => 'ripot long pasim ol yusa',
-'sp-contributions-talk'     => 'toktok',
-'sp-contributions-submit'   => 'Painim',
+'sp-contributions-talk' => 'toktok',
+'sp-contributions-submit' => 'Painim',
 
 # What links here
-'whatlinkshere'            => 'Ol link ikam long hia',
-'whatlinkshere-page'       => 'Pes:',
-'isredirect'               => 'nupela rot',
-'isimage'                  => 'link long piksa',
-'whatlinkshere-links'      => '← ol link',
+'whatlinkshere' => 'Ol link ikam long hia',
+'whatlinkshere-page' => 'Pes:',
+'isredirect' => 'nupela rot',
+'isimage' => 'link long piksa',
+'whatlinkshere-links' => '← ol link',
 'whatlinkshere-hideredirs' => '$1 ol nupela rot',
-'whatlinkshere-hidelinks'  => '$1 ol link',
+'whatlinkshere-hidelinks' => '$1 ol link',
 
 # Block/unblock
-'blockip'            => 'Pasim yusa (Block user)',
-'ipboptions'         => '2 awa:2 hours,1 de:1 day,3 de:3 days,1 wik:1 week,2 wik:2 weeks,1 mun:1 month,3 mun:3 months,6 mun:6 months,1 yia:1 year,oltaim:infinite',
-'ipbotheroption'     => 'narapela',
-'ipblocklist'        => 'Ol IP adres na yusanem i pas',
+'blockip' => 'Pasim yusa (Block user)',
+'ipboptions' => '2 awa:2 hours,1 de:1 day,3 de:3 days,1 wik:1 week,2 wik:2 weeks,1 mun:1 month,3 mun:3 months,6 mun:6 months,1 yia:1 year,oltaim:infinite',
+'ipbotheroption' => 'narapela',
+'ipblocklist' => 'Ol IP adres na yusanem i pas',
 'ipblocklist-submit' => 'Painim',
-'blocklink'          => 'pasim',
-'unblocklink'        => 'larim',
-'change-blocklink'   => 'senis pasim',
-'contribslink'       => 'wok',
-'blocklogpage'       => 'Ripot long pasim ol yusa',
+'blocklink' => 'pasim',
+'unblocklink' => 'larim',
+'change-blocklink' => 'senis pasim',
+'contribslink' => 'wok',
+'blocklogpage' => 'Ripot long pasim ol yusa',
 
 # Move page
-'move-page'        => 'Surikim $1',
+'move-page' => 'Surikim $1',
 'move-page-legend' => 'Surikim pes',
-'movearticle'      => 'Surikim pes:',
-'newtitle'         => 'Nupela nem bilong pes:',
-'movepagebtn'      => 'Surikim',
-'pagemovedsub'     => 'Pes i surik pinis',
-'movepage-moved'   => '\'\'\'"$1" i surikim pinis long "$2"\'\'\'',
-'articleexists'    => 'Wanpela pes wantaim dispela nem i stap pinis, o dispela nem i no stret.
+'movearticle' => 'Surikim pes:',
+'newtitle' => 'Nupela nem bilong pes:',
+'movepagebtn' => 'Surikim',
+'pagemovedsub' => 'Pes i surik pinis',
+'movepage-moved' => '\'\'\'"$1" i surikim pinis long "$2"\'\'\'',
+'articleexists' => 'Wanpela pes wantaim dispela nem i stap pinis, o dispela nem i no stret.
 Yu mas painim narapela nem.',
-'talkexists'       => "'''Pes bilong buk i surik pinis, tasol pes bilong toktok i no inap surik, bilong wanem wanpela pes bilong toktok istap pinis wantaim dispela nam.  Yu mas pasim wantaim tupela pes bilong toktok yu yet.'''",
-'movedto'          => 'i surik i go long',
-'movetalk'         => 'Surikim pes bilong toktok wantaim',
-'movelogpage'      => 'Buk bilong ol surik',
-'movelogpagetext'  => 'Hia yumi lukim ol pes i surik pinis.',
-'movereason'       => 'As bilong en:',
-'revertmove'       => 'go bek',
+'talkexists' => "'''Pes bilong buk i surik pinis, tasol pes bilong toktok i no inap surik, bilong wanem wanpela pes bilong toktok istap pinis wantaim dispela nam.  Yu mas pasim wantaim tupela pes bilong toktok yu yet.'''",
+'movedto' => 'i surik i go long',
+'movetalk' => 'Surikim pes bilong toktok wantaim',
+'movelogpage' => 'Buk bilong ol surik',
+'movelogpagetext' => 'Hia yumi lukim ol pes i surik pinis.',
+'movereason' => 'As bilong en:',
+'revertmove' => 'go bek',
 
 # Namespace 8 related
-'allmessages'               => 'Ol toksave bilong sistem',
-'allmessagesname'           => 'Nem',
-'allmessages-filter-all'    => 'Olgeta',
-'allmessages-language'      => 'Tokples:',
+'allmessages' => 'Ol toksave bilong sistem',
+'allmessagesname' => 'Nem',
+'allmessages-filter-all' => 'Olgeta',
+'allmessages-language' => 'Tokples:',
 'allmessages-filter-submit' => 'Go',
 
 # Thumbnails
 'thumbnail-more' => 'Moa bikpela',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'Pes bilong yu (Your user page)',
-'tooltip-pt-preferences'         => 'Ol laik bilong yu (Your preferences)',
-'tooltip-pt-mycontris'           => 'Lista long ol senis yu wokim (List of your contributions)',
-'tooltip-pt-logout'              => 'Logaut',
-'tooltip-ca-talk'                => 'Toktok long dispela pes',
-'tooltip-ca-addsection'          => 'Kirapim nupela seksen',
-'tooltip-ca-viewsource'          => 'Dispela pes i tambu long senisim.
+'tooltip-pt-userpage' => 'Pes bilong yu (Your user page)',
+'tooltip-pt-preferences' => 'Ol laik bilong yu (Your preferences)',
+'tooltip-pt-mycontris' => 'Lista long ol senis yu wokim (List of your contributions)',
+'tooltip-pt-logout' => 'Logaut',
+'tooltip-ca-talk' => 'Toktok long dispela pes',
+'tooltip-ca-addsection' => 'Kirapim nupela seksen',
+'tooltip-ca-viewsource' => 'Dispela pes i tambu long senisim.
 Yu inap lukim as tok bilong em',
-'tooltip-ca-protect'             => 'Tambuim dispela pes',
-'tooltip-ca-delete'              => 'Rausim dispela pes',
-'tooltip-ca-move'                => 'Surikim dispela pes (Move this page)',
-'tooltip-ca-watch'               => 'Skruim dispela pes long lukautbuk bilong yu',
-'tooltip-ca-unwatch'             => 'Rausim dispela pes long lukautbuk bilong yu (Remove this page from your watchlist)',
-'tooltip-search'                 => 'Painim long {{SITENAME}}',
-'tooltip-search-fulltext'        => 'Painim dispela hap tok insait long olgeta pes',
-'tooltip-p-logo'                 => 'Lukim fran pes (Visit the main page)',
-'tooltip-n-mainpage'             => 'Lukim fran pes (Visit the main page)',
+'tooltip-ca-protect' => 'Tambuim dispela pes',
+'tooltip-ca-delete' => 'Rausim dispela pes',
+'tooltip-ca-move' => 'Surikim dispela pes (Move this page)',
+'tooltip-ca-watch' => 'Skruim dispela pes long lukautbuk bilong yu',
+'tooltip-ca-unwatch' => 'Rausim dispela pes long lukautbuk bilong yu (Remove this page from your watchlist)',
+'tooltip-search' => 'Painim long {{SITENAME}}',
+'tooltip-search-fulltext' => 'Painim dispela hap tok insait long olgeta pes',
+'tooltip-p-logo' => 'Lukim fran pes (Visit the main page)',
+'tooltip-n-mainpage' => 'Lukim fran pes (Visit the main page)',
 'tooltip-n-mainpage-description' => 'Lukim fran pes (Visit the main page)',
-'tooltip-n-help'                 => 'Ples long painim halivim',
-'tooltip-feed-rss'               => 'RSS fid bilong dispela pes',
-'tooltip-feed-atom'              => 'Atom fid bilong dispela pes',
-'tooltip-t-emailuser'            => 'Salim e-mel long dispela yusa',
-'tooltip-t-upload'               => 'Sutim ol fail olsem piksa igo insait',
-'tooltip-t-specialpages'         => 'Lista long ol sipesol pes (List of all special pages)',
-'tooltip-ca-nstab-main'          => 'Lukim stori (View the content page)',
-'tooltip-ca-nstab-user'          => 'Lukim pes bilong yusa',
-'tooltip-ca-nstab-media'         => 'Lukim media pes (View the media page)',
-'tooltip-ca-nstab-image'         => 'Lukim pes bilong fail',
-'tooltip-ca-nstab-template'      => 'Lukim templet',
-'tooltip-ca-nstab-category'      => 'Lukim grup',
-'tooltip-save'                   => 'Raitim senis bilong yu (Save your changes)',
+'tooltip-n-help' => 'Ples long painim halivim',
+'tooltip-feed-rss' => 'RSS fid bilong dispela pes',
+'tooltip-feed-atom' => 'Atom fid bilong dispela pes',
+'tooltip-t-emailuser' => 'Salim e-mel long dispela yusa',
+'tooltip-t-upload' => 'Sutim ol fail olsem piksa igo insait',
+'tooltip-t-specialpages' => 'Lista long ol sipesol pes (List of all special pages)',
+'tooltip-ca-nstab-main' => 'Lukim stori (View the content page)',
+'tooltip-ca-nstab-user' => 'Lukim pes bilong yusa',
+'tooltip-ca-nstab-media' => 'Lukim media pes (View the media page)',
+'tooltip-ca-nstab-image' => 'Lukim pes bilong fail',
+'tooltip-ca-nstab-template' => 'Lukim templet',
+'tooltip-ca-nstab-category' => 'Lukim grup',
+'tooltip-save' => 'Raitim senis bilong yu (Save your changes)',
 
 # Attribution
 'siteuser' => '{{SITENAME}} yusa $1',
-'others'   => 'ol narapela',
+'others' => 'ol narapela',
 
 # Browsing diffs
 'previousdiff' => '← Moa olpela senis',
-'nextdiff'     => 'Moa nupela senis →',
+'nextdiff' => 'Moa nupela senis →',
 
 # Media information
 'show-big-image' => 'Bikpela piksa',
 
 # Special:NewFiles
 'showhidebots' => '($1 ol bot)',
-'ilsubmit'     => 'Painim',
+'ilsubmit' => 'Painim',
 
 # Metadata
 'metadata' => 'Metadata',
@@ -782,8 +782,8 @@ Yu inap lukim as tok bilong em',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'olgeta',
 'namespacesall' => 'ol',
-'monthsall'     => 'olgeta',
-'limitall'      => 'olgeta',
+'monthsall' => 'olgeta',
+'limitall' => 'olgeta',
 
 # Scary transclusion
 'scarytranscludetoolong' => '[URL i longpela tumas]',
@@ -798,47 +798,47 @@ Yu inap lukim as tok bilong em',
 'table_pager_limit_submit' => 'Go',
 
 # Watchlist editor
-'watchlistedit-numitems'       => 'Igat {{PLURAL:$1|1 samting|$1 samting}} insait long lukautbuk bilong yu (ol pes bilong toktok i no stap long dispela namba).',
-'watchlistedit-noitems'        => 'Nogat wanpela samting long lukautbuk bilong yu.',
-'watchlistedit-normal-title'   => 'Senisim lukautbuk',
-'watchlistedit-normal-legend'  => 'Rausim ol samting long lukautbuk',
+'watchlistedit-numitems' => 'Igat {{PLURAL:$1|1 samting|$1 samting}} insait long lukautbuk bilong yu (ol pes bilong toktok i no stap long dispela namba).',
+'watchlistedit-noitems' => 'Nogat wanpela samting long lukautbuk bilong yu.',
+'watchlistedit-normal-title' => 'Senisim lukautbuk',
+'watchlistedit-normal-legend' => 'Rausim ol samting long lukautbuk',
 'watchlistedit-normal-explain' => 'Ananit yu lukim ol samting long lukautbuk. Long rausim wanpela samting, makim liklik boxis long sait bilong en, na paitim "Rausim ol samting".  Na tu yu inap [[Special:EditWatchlist/raw|senisim lukautbuk long wanpela bokis]].',
-'watchlistedit-normal-submit'  => 'Rausim ol samting',
-'watchlistedit-normal-done'    => '{{PLURAL:$1|Wanpela|$1}} samting i raus pinis long lukautbuk bilong yu:',
-'watchlistedit-raw-title'      => 'Senisim lukautbuk long wanpela bokis',
-'watchlistedit-raw-legend'     => 'Senisim lukautbuk insait long wanpela bokis',
-'watchlistedit-raw-explain'    => 'Ananit yu lukim ol samting long lukautbuk bilong yu insait long wanpela bokis.
+'watchlistedit-normal-submit' => 'Rausim ol samting',
+'watchlistedit-normal-done' => '{{PLURAL:$1|Wanpela|$1}} samting i raus pinis long lukautbuk bilong yu:',
+'watchlistedit-raw-title' => 'Senisim lukautbuk long wanpela bokis',
+'watchlistedit-raw-legend' => 'Senisim lukautbuk insait long wanpela bokis',
+'watchlistedit-raw-explain' => 'Ananit yu lukim ol samting long lukautbuk bilong yu insait long wanpela bokis.
        Yu inap putim sampela moa samting igo insait, o rausim sampela ol samting. Putim
        wanpela samting i go long wanwan lain.  Taim yu pinisim ol senis, paitim "Senisim lukautbuk".
        Na tu yu inap [[Special:EditWatchlist|senisim lukautbuk long planti liklik bokis]].',
-'watchlistedit-raw-titles'     => 'Ol samting:',
-'watchlistedit-raw-submit'     => 'Senisim lukautbuk',
-'watchlistedit-raw-done'       => 'Lukautbuk bilong yu i senis pinis.',
-'watchlistedit-raw-added'      => '{{PLURAL:$1|wanpela|$1}} samting igo insait:',
-'watchlistedit-raw-removed'    => '{{PLURAL:$1|Wanpela|$1}} samting i raus pinis:',
+'watchlistedit-raw-titles' => 'Ol samting:',
+'watchlistedit-raw-submit' => 'Senisim lukautbuk',
+'watchlistedit-raw-done' => 'Lukautbuk bilong yu i senis pinis.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|wanpela|$1}} samting igo insait:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|Wanpela|$1}} samting i raus pinis:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Lukim ol senis',
 'watchlisttools-edit' => 'Lukim na senisim lukautbuk',
-'watchlisttools-raw'  => 'Senisim lukautbuk insait long wanpela bokis',
+'watchlisttools-raw' => 'Senisim lukautbuk insait long wanpela bokis',
 
 # Special:Version
-'version-other'            => 'Narapela',
-'version-license'          => 'Laisens',
+'version-other' => 'Narapela',
+'version-license' => 'Laisens',
 'version-poweredby-others' => 'ol narapela',
 
 # Special:FilePath
-'filepath-page'   => 'Fail:',
+'filepath-page' => 'Fail:',
 'filepath-submit' => 'Go',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Nem bilong fail:',
-'fileduplicatesearch-submit'   => 'Painim',
+'fileduplicatesearch-submit' => 'Painim',
 
 # Special:SpecialPages
-'specialpages'                 => 'Ol sipesol pes',
-'specialpages-group-other'     => 'Ol narapela sipesol pes',
-'specialpages-group-pages'     => 'Lista long ol pes',
+'specialpages' => 'Ol sipesol pes',
+'specialpages-group-other' => 'Ol narapela sipesol pes',
+'specialpages-group-pages' => 'Lista long ol pes',
 'specialpages-group-pagetools' => 'Ol tul bilong pes',
 
 # Special:Tags
index 7f356ae..62be8db 100644 (file)
@@ -9,16 +9,19 @@
  *
  * @author 82-145
  * @author Bekiroflaz
+ * @author Bilalokms
  * @author Bombola
  * @author Cekli829
  * @author Dbl2010
  * @author Don Alessandro
  * @author Emperyan
+ * @author Erdemaslancan
  * @author Erkan Yilmaz
  * @author Fryed-peach
  * @author Goktr001
  * @author Hanberke
  * @author Hcagri
+ * @author Ijon
  * @author Incelemeelemani
  * @author Joseph
  * @author Kaganer
@@ -32,7 +35,9 @@
  * @author Mirzali
  * @author Mskyrider
  * @author Myildirim2007
+ * @author Reedy
  * @author Runningfridgesrule
+ * @author Sadrettin
  * @author Srhat
  * @author Stultiwikia
  * @author Suelnur
@@ -578,7 +583,7 @@ $1',
 'ok' => 'TAMAM',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'retrievedfrom' => '"$1" adresinden alındı.',
-'youhavenewmessages' => 'Yeni <u>$1</u> var. ($2)',
+'youhavenewmessages' => 'Yeni $1 var ($2).',
 'newmessageslink' => 'mesajınız',
 'newmessagesdifflink' => 'son değişiklik',
 'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
@@ -709,8 +714,8 @@ Verilen sebep: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Oturumu kapattınız.'''
 
-Şimdi kimliğinizi belirtmeksizin {{SITENAME}} sitesini kullanmaya devam edebilirsiniz, ya da [[Special:UserLogin|yeniden oturum açabilirsiniz]] (ister aynı kullanıcı adıyla, ister başka bir kullanıcı adıyla).
-Web tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hala oturumunuz açıkmış gibi görünebilir.",
+Şimdi kimliğinizi belirtmeksizin {{SITENAME}} sitesini kullanmaya devam edebilirsiniz ya da aynı kullanıcı adıyla ya da ister başka bir kullanıcı adıyla [[Special:UserLogin|yeniden oturum açabilirsiniz]].
+Tarayıcınızın önbelleğini temizleyene kadar bazı sayfalar sanki hâlâ oturumunuz açıkmış gibi görünebilir.",
 'welcomecreation' => '== Hoş geldin, $1! ==
 
 Hesabınız açıldı.
@@ -983,7 +988,8 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
 'updated' => '(Güncellendi)',
 'note' => "'''Not: '''",
 'previewnote' => "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''
-Yaptığınız değişiklikler henüz kaydedilmedi! [[#editform|→ Düzenlemeye devam edin]]",
+Yaptığınız değişiklikler henüz kaydedilmedi!",
+'continue-editing' => 'Düzenlemeye devam et',
 'previewconflict' => 'Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.',
 'session_fail_preview' => 'Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.',
 'session_fail_preview_html' => "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''
@@ -996,6 +1002,7 @@ Değişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.
 Eğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
 'edit_form_incomplete' => "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
 'editing' => '"$1" sayfasını değiştirmektesiniz',
+'creating' => 'Oluşturuluyor $1',
 'editingsection' => '"$1" sayfasında bölüm değiştirmektesiniz',
 'editingcomment' => '$1 değiştiriliyor (yeni bölüm)',
 'editconflict' => 'Değişiklik çakışması: $1',
@@ -1015,7 +1022,7 @@ Yaptığınız katkının başka katılımcılar tarafından acımasızca deği
 Ayrıca buraya katkıda bulunarak, bu katkının kendiniz tarafından yazıldığına ya da kamuya açık bir kaynaktan ya da başka bir özgür/ücretsiz kaynaktan kopyalandığına güvence vermiş oluyorsunuz. '''Buraya, telif sahibinin izni olmadan telif hakkı ile korunan eserleri eklemeyiz! '''",
 'copyrightwarning2' => 'Lütfen, {{SITENAME}} sitesine bulunacağınız tüm katkıların diğer üyeler tarafından düzenlenebileceğini, değiştirilebileceğini ya da silinebileceğini hatırlayın. Yazılarınızın merhametsizce değiştirilebilmesine rıza göstermiyorsanız buraya katkıda bulunmayın. <br />
 Ayrıca bu ekleyeceğiniz yazıyı sizin yazdığınızı ya da serbest kopyalama izni veren bir kaynaktan kopyaladığınızı bize taahhüt etmektesiniz (ayrıntılar için referans: $1).',
-'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu $1 kilobayt, ve en fazla uzunluktan $2 kilobayt daha fazladır.
+'longpageerror' => "'''HATA: Girdiğiniz metnin uzunluğu {{PLURAL:$1|bir kilobayt|$1 kilobayt}}, ve en fazla uzunluktan {{PLURAL:$2|bir kilobayt|$2 kilobayt}} daha fazladır.
 Kaydedilmesi mümkün değildir.'''",
 'readonlywarning' => "'''DİKKAT: Bakım nedeni ile veritabanı şu anda kilitlidir. Bu sebeple değişiklikleriniz şu anda kaydedilememektedir. Yazdıklarınızı başka bir editöre alıp saklayabilir ve daha sonra tekrar buraya getirip kaydedebilirsiniz'''
 
@@ -1058,6 +1065,7 @@ Silinmiş görünüyor.',
 'edit-no-change' => 'Değişikliğiniz yoksayıldı, çünkü metinde bir değişiklik yapılmadı.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
+'defaultmessagetext' => 'Varsayılan mesaj metni',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
@@ -1250,7 +1258,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 
 # Diffs
 'history-title' => '"$1" sayfasının geçmişi',
-'difference' => '(Sürümler arası farklar)',
 'difference-multipage' => '(Sayfalar arasındaki fark)',
 'lineno' => '$1. satır:',
 'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
@@ -1607,7 +1614,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'nchanges' => '$1 {{PLURAL:$1|değişiklik|değişiklik}}',
 'recentchanges' => 'Son değişiklikler',
 'recentchanges-legend' => 'Son değişiklikler seçenekleri',
-'recentchangestext' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
+'recentchanges-summary' => 'Yapılan en son değişiklikleri bu sayfadan izleyin.',
 'recentchanges-feed-description' => "Bu beslemede, viki'de yapılan en son değişiklikleri takip edin.",
 'recentchanges-label-newpage' => 'Bu değişiklik yeni bir sayfa oluşturdu',
 'recentchanges-label-minor' => 'Bu küçük bir değişiklik',
@@ -1637,6 +1644,7 @@ Diğer kullanıcılar sizinle bu yolla iletişime geçtiğinde e-posta adresiniz
 'newsectionsummary' => '/* $1 */ yeni başlık',
 'rc-enhanced-expand' => 'Ayrıntıları göster (JavaScript gerekir)',
 'rc-enhanced-hide' => 'Ayrıntıları gizle',
+'rc-old-title' => 'ilk olarak oluşturulan "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'İlgili değişiklikler',
@@ -1795,6 +1803,7 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
 'upload-http-error' => 'Bir HTTP hatası oluştu: $1',
 
 # File backend
+'backend-fail-notexists' => '$1 dosyası mevcut değil.',
 'backend-fail-delete' => '"$1" dosyası silinemedi.',
 'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
 'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
@@ -1817,6 +1826,7 @@ Güvenlik denetimi uygun bir şekilde gerçekleştirilemiyor.',
 'uploadstash-badtoken' => 'İşlemin gerçekleştirilmesi başarısız oldu, muhtemelen düzenleme yetkileriniz zaman aşımına uğradı. Yeniden deneyin.',
 'uploadstash-errclear' => 'Dosyaların silinmesi başarısız oldu.',
 'uploadstash-refresh' => 'Dosya listelerini yenile',
+'invalid-chunk-offset' => 'Geçersiz öbek ofset',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Erişim engellendi',
@@ -2111,6 +2121,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',
@@ -2269,8 +2280,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.
 
@@ -2857,8 +2868,8 @@ Geçici dosya kayıp.',
 'tooltip-pt-preferences' => 'Tercihleriniz (ayarlarınız)',
 'tooltip-pt-watchlist' => 'Değişiklikler için izlemeye aldığınız sayfaların listesi',
 'tooltip-pt-mycontris' => 'Katkılarınızın listesi',
-'tooltip-pt-login' => 'Mecbur değilsiniz fakat oturum açmanız tavsiye olunur',
-'tooltip-pt-anonlogin' => 'Oturum açmanız tavsiye olunur ama mecbur değilsiniz.',
+'tooltip-pt-login' => 'Oturum açmanızı tavsiye ederiz; ancak zorunda değilsiniz',
+'tooltip-pt-anonlogin' => 'Oturum açmanızı tavsiye ederiz; ancak zorunda değilsiniz',
 'tooltip-pt-logout' => 'Sistemden çık',
 'tooltip-ca-talk' => 'İçerik ile ilgili tartışma',
 'tooltip-ca-edit' => 'Bu sayfayı değiştirebilirsiniz. Lütfen kaydetmeden önce önizleme düğmesini kullanın.',
@@ -3227,6 +3238,8 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-subjectnewscode' => 'Konu kodu',
 'exif-event' => 'Adı geçen olay',
 'exif-personinimage' => 'Adı geçen kişi',
+'exif-originalimageheight' => 'Resmin kırpılmadan önceki yükseliği',
+'exif-originalimagewidth' => 'Resmin kırpılmadan önceki genişliği',
 
 # EXIF attributes
 'exif-compression-1' => 'Sıkıştırılmamış',
@@ -3814,6 +3827,7 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'api-error-mustbeposted' => 'İç hata: İstek HTTP POST gerektiriyor.',
 'api-error-nomodule' => 'İç hata: Yükleme modülü ayarı yapılmadı.',
 'api-error-ok-but-empty' => 'İç hata: Sunucu yanıt vermiyor.',
+'api-error-overwrite' => 'Varolan dosyanın üzerine yazmaya izin verilmiyor.',
 'api-error-stashfailed' => 'İç hata: Sunucu, geçici dosyaları kaybetti.',
 'api-error-unclassified' => 'Bilinmeyen bir hata oluştu.',
 'api-error-unknown-code' => 'Bilinmeyen hata: "$1"',
@@ -3821,5 +3835,6 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'api-error-unknown-warning' => 'Bilinmeyen uyarı: $1',
 'api-error-unknownerror' => 'Bilinmeyen hata: "$1".',
 'api-error-uploaddisabled' => 'Yükleme bu vikide devre dışı bırakılmıştır.',
+'api-error-verification-error' => 'Dosya bozuk veya yanlış uzantıya sahip olabilir.',
 
 );
index 6d0e3b4..726ecba 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-justify'              => 'Hikahata xirhapa',
-'tog-hideminor'            => 'Tumbeta mindzulamiso leyi tsongo',
-'tog-usenewrc'             => 'Kucinca ka sweswinyana loku hlutiweke (JavaScript)',
-'tog-showtoc'              => 'Komba nxaxamelo wa leswingandzeni (eka tinhlokomhaka tinharhu kumbe kutlula)',
-'tog-rememberpassword'     => 'Tsundzuka ku nghena eka Khompuyuta leyi (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'       => 'Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke',
-'tog-watchdefault'         => 'Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke',
-'tog-watchmoves'           => "Hoxa matluka lawa ndzi mayisaka kun'wana eka leswi ndziswi languteke",
-'tog-watchdeletion'        => 'Hoxa matluka lawa ndzi masulaka eka leswi ndziswi languteke',
+'tog-underline' => 'Hlanganisa nkhwatiheto:',
+'tog-justify' => 'Hikahata xirhapa',
+'tog-hideminor' => 'Tumbeta mindzulamiso leyi tsongo',
+'tog-hidepatrolled' => 'Tumbeta ku cinca loku languteriweke eka kucinca ka sweswinyana',
+'tog-newpageshidepatrolled' => 'Tumbeta kucinca loku languteriweke eka nxaxamelo wa matluka lamantswa',
+'tog-extendwatchlist' => 'Ndlandlamuxa ku komba kucinca hikwako, handle ka ku cinca ka sweswinyana ntsena',
+'tog-usenewrc' => 'Tirhisa kucinca ka sweswinyana loku hlutiweke (yitirhisa ntsalo wa Java)',
+'tog-numberheadings' => 'Tinhloko-mhaka leti hleriweke',
+'tog-showtoolbar' => 'Komba xiangarhi xo cinca (yitirhisa ntsalo wa Java)',
+'tog-editondblclick' => 'Lulamisa matluka hi ku thlava kambirhi (yitirhisa ntsalo wa Java)',
+'tog-editsection' => 'Pfula ku lulamisa xiyenge hi ku tirhisa xithlavinyeti xo [edit|lulamisa]',
+'tog-editsectiononrightclick' => 'Pfula ku lulamisa hi swiyenge hi ku thlava nhlokomhaka ya xiyenge (yitirhisa ntsalo wa Java)',
+'tog-showtoc' => 'Komba nxaxamelo wa leswingandzeni (eka tinhlokomhaka tinharhu kumbe kutlula)',
+'tog-rememberpassword' => 'Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})',
+'tog-watchcreations' => 'Hoxa matluka lawa ndzi matumbuluxaka eka leswi ndziswi languteke',
+'tog-watchdefault' => 'Hoxa matluka lawa ndzi malulamisaka eka leswi ndziswi languteke',
+'tog-watchmoves' => "Hoxa matluka lawa ndzi mayisaka kun'wana eka leswi ndziswi languteke",
+'tog-watchdeletion' => 'Hoxa matluka lawa ndzi masulaka eka leswi ndziswi languteke',
+'tog-minordefault' => 'Funga mindzulamiso hinkwayo leyi ntsongo handle ka xivangelo',
+'tog-previewontop' => 'Komba kuringanisa ungasi lulamisa bokisi',
+'tog-previewonfirst' => 'Komba kuringanisa eka ndzulamiso wo sungula',
 'tog-enotifwatchlistpages' => 'ndzurhumele e-mail loko leswi ndzi swi languteke swi lulamisiwa',
-'tog-enotifusertalkpages'  => 'ndzurhumele e-mail loko tluka ra mbulavulo na mina ri lulamisiwa',
-'tog-enotifminoredits'     => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
-'tog-enotifrevealaddr'     => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
-'tog-shownumberswatching'  => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
-'tog-forceeditsummary'     => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
-'tog-watchlisthideown'     => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
-'tog-watchlisthidebots'    => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
-'tog-watchlisthideminor'   => 'Tumbeta mindzulamiso leyi tsongo eka leswi ndzi swi languteke',
-'tog-watchlisthideliu'     => 'Tumbeta mindzulamiso ya vatirhisiwa lava ngheneke eka leswi ndzi swi languteke',
-'tog-watchlisthideanons'   => 'Tumbeta mindzulamiso ya vatirhisiwa lavanga tivekiki eka leswi ndzi swi languteke',
-'tog-ccmeonemails'         => "Ndzirhumele khopi ya ti e-mail leti ndzi ti rhumelaka van'wana",
+'tog-enotifusertalkpages' => 'ndzurhumele e-mail loko tluka ra mbulavulo na mina ri lulamisiwa',
+'tog-enotifminoredits' => 'ndzurhumele e-mail loko ku endleka mindzulamiso leyi ntsongo',
+'tog-enotifrevealaddr' => 'Paluxa e-mail yamina eka mapapila lawa ndzimarhumelaka',
+'tog-shownumberswatching' => 'Komba ntsengo wa vatirhisi lava hlaleleke tluka',
+'tog-externaleditor' => 'Tirhisa xilulamisi xalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
+'tog-externaldiff' => 'Tirhisa phurogiremi yalehandle hikukongoma (Nhlawulo lowu i wavatirhisi lavangani ntokoto ntsena, wu lava ku cinca kokarhi eka khompuyuta yawena. [//www.mediawiki.org/wiki/Manual:External_editors vuxokoxoko hi mhakaleyi.])',
+'tog-forceeditsummary' => 'Ndzivutisisi loko ndzinga hoxi nkomiso wa ndzulamiso lowu ndzi wu endleke',
+'tog-watchlisthideown' => 'Tumbeta mindzulamiso ya mina eka leswi ndzi swi languteke',
+'tog-watchlisthidebots' => 'Tumbeta mindzulamiso ya rhobhoti eka leswi ndzi swi languteke',
+'tog-watchlisthideminor' => 'Tumbeta mindzulamiso leyi tsongo eka leswi ndzi swi languteke',
+'tog-watchlisthideliu' => 'Tumbeta mindzulamiso ya vatirhisiwa lava ngheneke eka leswi ndzi swi languteke',
+'tog-watchlisthideanons' => 'Tumbeta mindzulamiso ya vatirhisiwa lavanga tivekiki eka leswi ndzi swi languteke',
+'tog-watchlisthidepatrolled' => 'Tumbeta mindzulamiso leyi languteriweke eka leswilangutiweke',
+'tog-ccmeonemails' => "Ndzirhumele khopi ya ti e-mail leti ndzi ti rhumelaka van'wana",
+'tog-showhiddencats' => 'Komba mintlawa leyi tumbetiweke',
 
 'underline-always' => 'Nkarhi hinkwawo',
-'underline-never'  => "Swinga endleki ni kan'we",
+'underline-never' => "Swinga endleki ni kan'we",
 
 # Dates
-'sunday'    => 'Sonto',
-'mon'       => 'Musombhunuko',
-'tue'       => 'Ravumbirhi',
-'wed'       => 'Ravunharhu',
-'thu'       => 'Ravumune',
-'fri'       => 'Ravunthlanu',
-'sat'       => 'Muqhivela',
-'january'   => 'Sunguti',
-'february'  => 'Nyenyenyani',
-'march'     => 'Nyenyankulu',
-'april'     => 'Dzivamusoko',
-'may_long'  => 'Mudyaxihi',
-'june'      => 'Khotavuxika',
-'july'      => 'Mawuwani',
-'august'    => 'Mhawuri',
+'sunday' => 'Sonto',
+'monday' => 'Musombhunuko',
+'tuesday' => 'Ravumbirhi',
+'wednesday' => 'Ravunharhu',
+'thursday' => 'Ravumune',
+'friday' => 'Ravunthlanu',
+'saturday' => 'Muqhivela',
+'sun' => 'Sont',
+'mon' => 'Musombhunuko',
+'tue' => 'Ravumbirhi',
+'wed' => 'Ravunharhu',
+'thu' => 'Ravumune',
+'fri' => 'Ravunthlanu',
+'sat' => 'Muqhivela',
+'january' => 'Sunguti',
+'february' => 'Nyenyenyani',
+'march' => 'Nyenyankulu',
+'april' => 'Dzivamusoko',
+'may_long' => 'Mudyaxihi',
+'june' => 'Khotavuxika',
+'july' => 'Mawuwani',
+'august' => 'Mhawuri',
 'september' => 'Ndzhati',
-'october'   => 'Nhlangula',
-'november'  => 'Hukuri',
-'december'  => "N'wendzamhala",
-
-'newwindow'     => '(Yi pfula e ndhzawini yintswa)',
-'cancel'        => 'Thsika',
+'october' => 'Nhlangula',
+'november' => 'Hukuri',
+'december' => "N'wendzamhala",
+'january-gen' => 'Sunguti',
+'february-gen' => 'Nyenyenyani',
+'march-gen' => 'Nyenyankulu',
+'april-gen' => 'Dzivamusoko',
+'may-gen' => 'Mudyaxihi',
+'june-gen' => 'Khotavuxika',
+'july-gen' => 'Mawuwani',
+'august-gen' => 'Mhawuri',
+'september-gen' => 'Ndzhati',
+'october-gen' => 'Nhlangula',
+'november-gen' => 'Hukuri',
+'december-gen' => "N'wendzamhala",
+'jan' => 'Nsungu',
+'feb' => 'Nyenye',
+'mar' => 'Nyenya',
+'apr' => 'Dziva',
+'may' => 'Mudya',
+'jun' => 'Khota',
+'jul' => 'Mawu',
+'aug' => 'Mhawu',
+'sep' => 'Ndzha',
+'oct' => 'Nhla',
+'nov' => 'Huk',
+'dec' => "N'wen",
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Ntlawa|intlawa}}',
+'category_header' => 'Matluka eka ntlawa wa "$1"',
+'subcategories' => 'Mintlawa-ntsongo',
+'category-media-header' => 'Matluka ya xifaniso kumbe mpfumawulo eka ntlawa wa "$1"',
+'category-empty' => "''Ntlawa lowu eka nkarhi wa sweswi, wuhava matluka kumbe swifaniso.''",
+'hidden-categories' => '{{PLURAL:$1|Ntlawa lowu tumbetiweke|Mintlawa leyi tumbetiweke}}',
+'hidden-category-category' => 'Mintlawa leyi tumbetiweke',
+'category-subcat-count' => '{{PLURAL:$2|Ntlawa lowu wukhome mintlawa-ntsongo leyi landzelaka.|Ntlawa lowu wuni  {{PLURAL:$1|ntlwa-ntsongo|$1 wa mintlaw-ntsongo}}, eka $2 wa mintlawa-ntsongo.}}',
+'category-subcat-count-limited' => 'Ntlawa lowu wuna {{PLURAL:$1|ntlawa-ntsongo lowu|$1 mintlawa-ntsongo leyi}} landzelaka.',
+'category-article-count' => '{{PLURAL:$2|Ntlawa lowu wukhome matluka lamalandzelaka ntsena.| {{PLURAL:$1|Tluka leri ri le|$1 matluka lawa male}} ndzeni ka ntlawa lowu, eka $2 wamintlawa.}}',
+'category-article-count-limited' => '{{PLURAL:$1|Tluka leri rile|$1 Matluka lawa male}} ndzeni ka ntlawa lowu.',
+'category-file-count' => '{{PLURAL:$2|Ntlawa lowu wukhome matluka lamalandzelaka ntsena.| {{PLURAL:$1|Tluka leri ri le|$1 matluka lawa male}} ndzeni ka ntlawa lowu, eka $2 wamintlawa.}}',
+'category-file-count-limited' => '{{PLURAL:$1|Fayili leyi yile|$1 Tifayili leti tile}} ndzeni ka ntlawa lowu.',
+'listingcontinuesabbrev' => 'Mahlwe.',
+'noindex-category' => 'Matluka lama kayivelaka xikombandlela xa tinhlokomhaka',
+'broken-file-category' => 'Matluka lamangana minkhwekelo ya tifayili leyi tshovekeke',
+
+'about' => 'Timhaka hi',
+'article' => 'Matluka lama tsariweke',
+'newwindow' => '(Yi pfula e ndhzawini yintswa)',
+'cancel' => 'Thsika',
 'moredotdotdot' => "Swin'wana...",
-'mypage'        => 'Tluka ramina',
-'mytalk'        => 'Mbulavulo namina',
-'anontalk'      => 'Vulavula na IP leyi',
-'and'           => '&#32;nakambe',
+'mypage' => 'Tluka ramina',
+'mytalk' => 'Mbulavulo namina',
+'anontalk' => 'Vulavula na IP leyi',
+'navigation' => 'Xikomba ndlela',
+'and' => '&#32;nakambe',
 
 # Cologne Blue skin
-'qbfind'         => 'Kuma',
-'qbedit'         => 'Lulamisa',
-'qbpageoptions'  => 'Tluka leri',
-'qbpageinfo'     => 'mongo',
-'qbmyoptions'    => 'Matluka ya mina',
+'qbfind' => 'Kuma',
+'qbedit' => 'Lulamisa',
+'qbpageoptions' => 'Tluka leri',
+'qbpageinfo' => 'mongo',
+'qbmyoptions' => 'Matluka ya mina',
 'qbspecialpages' => 'Matluka yohlawuleka',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-delete'  => 'Sula',
+'vector-action-addsection' => 'Veka nholoko ya mhaka',
+'vector-action-delete' => 'Sula',
+'vector-action-move' => 'Yi sa kunwana',
 'vector-action-protect' => 'Sirhelela',
-'vector-view-create'    => 'Tumbuluxa',
-
-'errorpagetitle'   => 'Xihoxo',
-'returnto'         => 'Thlelela e $1.',
-'tagline'          => 'Kusuka e {{SITENAME}}',
-'help'             => 'Mpfuno',
-'search'           => 'Lava',
-'searchbutton'     => 'Lava',
-'go'               => 'Nghena',
-'searcharticle'    => 'Nghena',
-'history'          => 'Matimu yaTluka',
-'history_short'    => 'Matimu',
+'vector-action-undelete' => 'Cinca kusula',
+'vector-action-unprotect' => 'Cinca kusirhelela',
+'vector-view-create' => 'Tumbuluxa',
+'vector-view-edit' => 'Lulamisa',
+'vector-view-history' => 'Languta matimu',
+'vector-view-view' => 'Hlaya',
+'vector-view-viewsource' => 'Languta xihlovo',
+'actions' => 'Swiendlo',
+'namespaces' => 'Swikhomela viti',
+'variants' => 'Tinxaka hi ku hambana',
+
+'errorpagetitle' => 'Xihoxo',
+'returnto' => 'Thlelela e $1.',
+'tagline' => 'Kusuka e {{SITENAME}}',
+'help' => 'Mpfuno',
+'search' => 'Lava',
+'searchbutton' => 'Lava',
+'go' => 'Nghena',
+'searcharticle' => 'Nghena',
+'history' => 'Matimu yaTluka',
+'history_short' => 'Matimu',
+'updatedmarker' => 'leswi lunghisiweke kusukela loko nihetelela nxaxamelo lowu',
 'printableversion' => 'Vona Ngangliso',
-'edit'             => 'Lulamisa',
-'create'           => 'Tumbuluxa',
-'editthispage'     => 'Lulamisa Tluka leri',
+'permalink' => 'Xithlavinyeti xa nkarhi hinkwawo',
+'print' => 'Gandlisa',
+'view' => 'Langutisa',
+'edit' => 'Lulamisa',
+'create' => 'Tumbuluxa',
+'editthispage' => 'Lulamisa Tluka leri',
 'create-this-page' => 'Tumbuluxa tluka leri',
-'delete'           => 'Sula',
-'deletethispage'   => 'Sula tluka leri',
-'protect'          => 'Sirhelela',
-'protect_change'   => 'Cinca',
-'newpage'          => 'Tluka rintswa',
+'delete' => 'Sula',
+'deletethispage' => 'Sula tluka leri',
+'undelete_short' => 'Cinca kusula {{PLURAL:$1|ndzulamiso|$1 mindzulamiso}}',
+'viewdeleted_short' => 'Vona {{PLURAL:$1|ndzulamiso lowu suriweke|$1 mindzulamiso leyi suriweke}}',
+'protect' => 'Sirhelela',
+'protect_change' => 'Cinca',
+'protectthispage' => 'Sirhelela tluka leri',
+'unprotect' => 'Cinca kusirhelela',
+'unprotectthispage' => 'Cinca kusirhelela tluka leri',
+'newpage' => 'Tluka rintswa',
+'talkpage' => 'Burisana hi tluka leri',
 'talkpagelinktext' => 'Mbulavulo',
-'talk'             => 'Mbulavuriswano',
-'toolbox'          => 'Bokisi ra switirhisiwa',
-'jumptosearch'     => 'Lava',
+'specialpage' => 'Tluka ro hlawuleka',
+'personaltools' => "Switirhisi swa n'wini",
+'postcomment' => 'Xiyenge xintswa',
+'articlepage' => 'Langutisa tluka ra matsalwa',
+'talk' => 'Mbulavuriswano',
+'views' => 'Kulanguteka',
+'toolbox' => 'Bokisi ra switirhisiwa',
+'userpage' => 'Vona tluka ramutirhisi',
+'projectpage' => 'Vona tluka ra phurojeki',
+'imagepage' => 'Vona tluka ra fayili',
+'mediawikipage' => 'Vona tluka ra hungu',
+'templatepage' => 'Vona tluka ra xivumbiwa-ntirho',
+'viewhelppage' => 'Vona tluka ra mpfuno',
+'categorypage' => 'Vona tluka ra ntlawa',
+'viewtalkpage' => 'Vona bulo',
+'otherlanguages' => "Hi ti ndzimi tin'wana",
+'redirectedfrom' => '(Ritlerisewe kusuka e $1)',
+'redirectpagesub' => 'Tluka ro kongomisa',
+'lastmodifiedat' => 'Tluka leri rihetelele ku lulamisiwa hi $1, nkarhi kuri $2.',
+'viewcount' => "Tluka leri ri vhakeriwe {{PLURAL:$1|kan'we|makhambi ya $1}}.",
+'protectedpage' => 'Tluka leri sirheleriweke',
+'jumpto' => 'Tlulela eka:',
+'jumptonavigation' => 'Xikomba-ndlela',
+'jumptosearch' => 'Lava',
+'pool-errorunknown' => 'xiphiqo xoka xingativeki',
 
 # 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'            => 'ta {{SITENAME}}',
-'aboutpage'            => 'Project:ta',
-'currentevents'        => 'Leswi endlekaka sweswi',
-'disclaimers'          => 'Swi alanandzu',
-'disclaimerpage'       => 'Project:Swithsuxa nadzu hikuangara',
-'edithelp'             => 'Mpfuno hi ta mindzulamiso',
-'edithelppage'         => 'Help:Mindzulamiso',
-'helppage'             => 'Help:Leswinga ndzeni',
-'mainpage'             => 'Tlukankulu',
+'aboutsite' => 'ta {{SITENAME}}',
+'aboutpage' => 'Project:ta',
+'copyright' => 'Matsalwa makumeka ehansi ka $1.',
+'copyrightpage' => '{{ns:project}}:Swisivela ku encenyeta',
+'currentevents' => 'Leswi endlekaka sweswi',
+'currentevents-url' => 'Project:Leswi endlekaka sweswi',
+'disclaimers' => 'Swi alanandzu',
+'disclaimerpage' => 'Project:Swithsuxa nadzu hikuangara',
+'edithelp' => 'Mpfuno hi ta mindzulamiso',
+'edithelppage' => 'Help:Mindzulamiso',
+'helppage' => 'Help:Leswinga ndzeni',
+'mainpage' => 'Tlukankulu',
 'mainpage-description' => 'Tluka-Nkulu',
-'policy-url'           => 'Project:Policy',
-'portal'               => 'Ntsindza wa muganga',
-'portal-url'           => 'Project:Community Portal',
-'privacy'              => 'Privacy policy',
-'privacypage'          => 'Project:Privacy policy',
+'policy-url' => 'Project:Policy',
+'portal' => 'Ntsindza wa muganga',
+'portal-url' => 'Project:Community Portal',
+'privacy' => 'Privacy policy',
+'privacypage' => 'Project:Privacy policy',
 
-'badaccess'        => 'Xihoxo hita mpfumelelo',
+'badaccess' => 'Xihoxo hita mpfumelelo',
 'badaccess-group0' => 'U hava mpumelelo wo endla xikombelo lexi.',
 'badaccess-groups' => 'The action you have requested is limited to users in one of the groups $1.',
 
-'versionrequired'     => 'Version $1 of MediaWiki required',
+'versionrequired' => 'Version $1 of MediaWiki required',
 'versionrequiredtext' => 'Version $1 of MediaWiki is required to use this page.
 See [[Special:Version|version page]].',
 
-'ok'                      => 'Hiswona',
-'retrievedfrom'           => 'ku suka e "$1"',
-'youhavenewmessages'      => 'U na $1 ($2).',
-'newmessageslink'         => 'Marungula mantswa',
-'newmessagesdifflink'     => 'last change',
+'ok' => 'Hiswona',
+'retrievedfrom' => 'ku suka e "$1"',
+'youhavenewmessages' => 'U na $1 ($2).',
+'newmessageslink' => 'Marungula mantswa',
+'newmessagesdifflink' => 'last change',
 'youhavenewmessagesmulti' => 'Una marungula mantswa hi $1',
-'editsection'             => 'Lulamisa',
-'editold'                 => 'Lulamisa',
-'viewsourceold'           => 'Languta vutsari-ntumbuluko',
-'editlink'                => 'Lulamisa',
-'editsectionhint'         => 'Lulamisa xiphemu: $1',
-'toc'                     => 'Leswinga ndzeni',
-'showtoc'                 => 'Kombisa',
-'hidetoc'                 => 'Tumbeta',
-'thisisdeleted'           => 'Langutisa kumbe Thlerisela $1?',
-'viewdeleted'             => 'Langutisa $1?',
-'restorelink'             => '{{PLURAL:$1|ndzulamiso lowu suriweke|$1 mindzulamiso leyi suriweke}}',
-'feedlinks'               => 'Feed:',
-'feed-invalid'            => 'Invalid subscription feed type.',
-'feed-unavailable'        => 'Syndication feeds are not available on {{SITENAME}}',
-'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 (Arisi tsariwa)',
+'editsection' => 'Lulamisa',
+'editold' => 'Lulamisa',
+'viewsourceold' => 'Languta vutsari-ntumbuluko',
+'editlink' => 'Lulamisa',
+'viewsourcelink' => 'Languta xihlovo',
+'editsectionhint' => 'Lulamisa xiphemu: $1',
+'toc' => 'Leswinga ndzeni',
+'showtoc' => 'Kombisa',
+'hidetoc' => 'Tumbeta',
+'collapsible-collapse' => 'Tsongahata',
+'collapsible-expand' => 'Ndlandlamuxa',
+'thisisdeleted' => 'Langutisa kumbe Thlerisela $1?',
+'viewdeleted' => 'Langutisa $1?',
+'restorelink' => '{{PLURAL:$1|ndzulamiso lowu suriweke|$1 mindzulamiso leyi suriweke}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Invalid subscription feed type.',
+'feed-unavailable' => 'Syndication feeds are not available on {{SITENAME}}',
+'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 (Tluka leri, arisi tsariwa)',
+'sort-descending' => 'Xaxameta kuya ehansi',
+'sort-ascending' => 'Xaxameta kuya ehenhla',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Tluka',
-'nstab-user'      => 'Tluka ra mutirhisi',
-'nstab-media'     => 'Media page',
-'nstab-special'   => 'Hlawuleka',
-'nstab-project'   => 'Tluka ra Phurojeki',
-'nstab-image'     => 'Fayili',
+'nstab-main' => 'Tluka',
+'nstab-user' => 'Tluka ra mutirhisi',
+'nstab-media' => 'Media page',
+'nstab-special' => 'Tluka ro hlawuleka',
+'nstab-project' => 'Tluka ra Phurojeki',
+'nstab-image' => 'Fayili',
 'nstab-mediawiki' => 'Rungula',
-'nstab-template'  => 'Template',
-'nstab-help'      => 'Tluka ra mpfuno',
-'nstab-category'  => 'Xiyenge',
+'nstab-template' => 'Template',
+'nstab-help' => 'Tluka ra mpfuno',
+'nstab-category' => 'Xiyenge',
 
 # Main script and global functions
-'nosuchaction'      => 'Kuhava xiendlo xo tano',
-'nosuchactiontext'  => 'Xikombelo xa URL a xitwisisiwi hi wiki',
+'nosuchaction' => 'Kuhava xiendlo xo tano',
+'nosuchactiontext' => 'Xikombelo xa URL a xitwisisiwi hi wiki.
+Ungava uhoxise kupeleta, kumbe u landze nkhwekelo lowu hoxeke.
+Xiphiqo lixe xingava xikomba xigalana eka software ya {{SITENAME}}.',
 'nosuchspecialpage' => 'Ku hava Tluka rero rohlawuleka',
 'nospecialpagetext' => '<strong>U kombele tluka ro hlawuleka ro ka ri nga ri kona.</strong>
 
 Vona nxaxamelo wa ma tluka yo hlawuleka e [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error'                => 'Xihoxo',
-'databaseerror'        => 'Xihoxo xo Database',
-'dberrortext'          => 'A database query syntax error has occurred.
+'error' => 'Xihoxo',
+'databaseerror' => 'Xihoxo xo Database',
+'dberrortext' => 'A database query syntax error has occurred.
 This may indicate a bug in the software.
 The last attempted database query was:
 <blockquote><tt>$1</tt></blockquote>
 from within function "<tt>$2</tt>".
 MySQL returned error "<tt>$3: $4</tt>".',
-'dberrortextcl'        => 'A database query syntax error has occurred.
+'dberrortextcl' => 'A database query syntax error has occurred.
 The last attempted database query was:
 "$1"
 from within function "$2".
 MySQL returned error "$3: $4"',
-'laggedslavemode'      => 'Warning: Page may not contain recent updates.',
-'readonly'             => 'Database locked',
-'enterlockreason'      => 'Enter a reason for the lock, including an estimate of when the lock will be released',
-'readonlytext'         => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
+'laggedslavemode' => 'Warning: Page may not contain recent updates.',
+'readonly' => 'Database locked',
+'enterlockreason' => 'Enter a reason for the lock, including an estimate of when the lock will be released',
+'readonlytext' => 'The database is currently locked to new entries and other modifications, probably for routine database maintenance, after which it will be back to normal.
 
 The administrator who locked it offered this explanation: $1',
-'missing-article'      => 'The database did not find the text of a page that it should have found, named "$1" $2.
-
-This is usually caused by following an outdated diff or history link to a page that has been deleted.
-
-If this is not the case, you may have found a bug in the software.
-Please report this to an administrator, making note of the URL.',
-'missingarticle-rev'   => '(revision#: $1)',
-'missingarticle-diff'  => '(Diff: $1, $2)',
-'readonly_lag'         => 'The database has been automatically locked while the slave database servers catch up to the master',
-'internalerror'        => 'Xihoxo xa le ndzeni',
-'internalerror_info'   => 'Internal error: $1',
-'filecopyerror'        => 'Could not copy file "$1" to "$2".',
-'filerenameerror'      => 'Could not rename file "$1" to "$2".',
-'filedeleteerror'      => 'Could not delete file "$1".',
+'missing-article' => 'Tsalwa leri uri lavaka eka tluka leri vuriwaka  "$1" $2, ari kumekanga eka nghula.
+
+Leswi swinga vangiwa hi kuva u landzele xithlavinyeti lexi hundzeriweke hi nkari kumbe tluka leri suriweke.
+
+Loko leswi swingari xona xivangelo, ungava ukume xigalana eka xitirhisi lexi.
+Ukomberiwa ku pota xigalana lexi eka [[Special:ListUsers/sysop|mulanguteri]], u rhumela na xithlavinyeti xa URL.',
+'missingarticle-rev' => '(revision#: $1)',
+'missingarticle-diff' => '(Diff: $1, $2)',
+'readonly_lag' => 'The database has been automatically locked while the slave database servers catch up to the master',
+'internalerror' => 'Xihoxo xa le ndzeni',
+'internalerror_info' => 'Internal error: $1',
+'fileappenderrorread' => 'Hitsandzeke ku hlaya "$1" eku lulamiseni loku.',
+'fileappenderror' => 'Hintsndzeke ku lulamisa "$1" leswaku yiva "$2".',
+'filecopyerror' => 'Could not copy file "$1" to "$2".',
+'filerenameerror' => 'Could not rename file "$1" to "$2".',
+'filedeleteerror' => 'Could not delete file "$1".',
 'directorycreateerror' => 'Could not create directory "$1".',
-'filenotfound'         => 'Could not find file "$1".',
-'fileexistserror'      => 'Unable to write to file "$1": file exists',
-'unexpected'           => 'Unexpected value: "$1"="$2".',
-'formerror'            => 'Error: could not submit form',
-'badarticleerror'      => 'This action cannot be performed on this page.',
-'cannotdelete'         => 'Could not delete the page or file specified.
+'filenotfound' => 'Could not find file "$1".',
+'fileexistserror' => 'Unable to write to file "$1": file exists',
+'unexpected' => 'Unexpected value: "$1"="$2".',
+'formerror' => 'Error: could not submit form',
+'badarticleerror' => 'This action cannot be performed on this page.',
+'cannotdelete' => 'Could not delete the page or file specified.
 It may have already been deleted by someone else.',
-'badtitle'             => 'Bad title',
-'badtitletext'         => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
+'cannotdelete-title' => 'Tluka "$1", ari suleki',
+'badtitle' => 'Bad title',
+'badtitletext' => 'The requested page title was invalid, empty, or an incorrectly linked inter-language or inter-wiki title.
 It may contain one or more characters which cannot be used in titles.',
 'querypage-no-updates' => 'Updates for this page are currently disabled.
 Data here will not presently be refreshed.',
 'wrong_wfQuery_params' => 'Incorrect parameters to wfQuery()<br />
 Function: $1<br />
 Query: $2',
-'viewsource'           => 'Vona tsalwa-tumbuluxa',
+'viewsource' => 'Vona tsalwa-tumbuluxa',
+'viewsource-title' => 'vona xihlovo xa $1',
+'protectedpagetext' => 'Tluka leri riserheleriwile kusivele ndzulamiso.',
+'viewsourcetext' => 'Unga langutisa naswona u kopa xihlovo xa tluka leri.',
+'viewyourtext' => 'Unga langutisa naswona ukopa xihlovo xa "mindzulamiso yawena" eka tluka leri.',
+'protectedinterface' => 'Tluka leri rina xihlanganisi xa software, naswona risirheleriwile kusivela kuthyakisiwa.',
+'editinginterface' => "'''Tivonele:''' ulekululamiseni tlika leri tirhisiwaka ku komba matsalwa yo hlanganisa ya software.
+Kucinca eka tluka leri kunga onha kulanguteka ka matluka eka vatirhisi van'wana.
+Leswaku uvona kuhundzuluxa langutisa [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], Phurojeki yo hundzuluxa tindzimi ya MediaWiki.",
+'cascadeprotected' => 'Tluka leri risirheleriwile eka mindzulamiso, hikwalaho kaleswi rikatsiweke eka {{PLURAL:$1|tluka, leri|matluka, lama}} sirheleriweke nswona mangana nhlawulo wo "katsakanya" lowu hlawuriweke:
+$2',
+'namespaceprotected' => "Uhava mfumelelo wo lulamisa matluka eka maviti-vundzawu bya '''$1'''.",
+'customcssprotected' => "Uhava mpfumelelo wo ulamisa tluka leri ra CSS, hikuva rina minhlawulo ya mutirhisi un'wana.",
+'customjsprotected' => "Uhava mpfumelelo wolulamisa tluka-xirhumiwa xa Java, hiuva ringava rikhome minhlawulo yamutirhisi un'wana.",
+'ns-specialprotected' => 'Matluka yohlawuleka amalulamisiwi.',
+'titleprotected' => 'Nhlokomhaka leyi yisirheleriwile ekutumbuluxiwa hi [[User:$1|$1]].
+Hikwlaho ka xivangelo xa "\'\'$2\'\'".',
 
 # Login and logout pages
-'yourname'                => 'Vito ra vutirhisi',
-'yourpassword'            => 'Vito-mpfungulo:',
-'login'                   => 'Pfula u nghena',
+'logouttext' => "'''Uhumile eka wiki leyi.'''
+
+Ungaya emahlweni utirhisa {{SITENAME}} handle ko tipaluxa, kumbe unga [[Special:UserLogin|pfula unghena nakambe]] tani hi mutirhisa un'wana kumbe kumbe hivuxokoxoko bya wena.
+Tsundzuka leswaku matluka man'wana mangaha komba onge upfule unghena eka wiki, loko ungasi sula tluka rakhompuyuta leri tsundzukaka matluka lawa uma vhakeleke.",
+'welcomecreation' => '== Hoyohoyo, eka Wena $1 ! ==
+Akhawunti yawena yitumbuluxiwile.
+Unda rivali ku cinca [[Special:Preferences|{{SITENAME}} minhlawulo ya wena]].',
+'yourname' => 'Vito ra vutirhisi',
+'yourpassword' => 'Vito-mpfungulo:',
+'yourpasswordagain' => 'Thlela u hoxa ritompfungulo ra wena:',
+'remembermypassword' => 'Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})',
+'login' => 'Pfula u nghena',
 'nav-login-createaccount' => 'Pfula unghena / Tumbuluxa akhawunti',
-'userlogin'               => 'Pfula unghena / Tumbuluxa akhawunti',
-'logout'                  => 'Pfala u famba',
-'userlogout'              => 'Pfala u famba',
-'nologinlink'             => 'Tumbuluxa akhawunti',
-'createaccount'           => 'Tumbuluxa akhawunti',
+'loginprompt' => 'U fanele ku pfumelela swipfuneti leswaku u pfula unghena eka {{SITENAME}}.',
+'userlogin' => 'Pfula unghena / Tumbuluxa akhawunti',
+'userloginnocreate' => 'Pfula unghena',
+'logout' => 'Pfala u famba',
+'userlogout' => 'Pfala u famba',
+'notloggedin' => 'A wusipfula unghena',
+'nologin' => 'Xana upfumala akhawunti? $1.',
+'nologinlink' => 'Tumbuluxa akhawunti',
+'createaccount' => 'Tumbuluxa akhawunti',
+'gotaccount' => 'Xna una akhawunti hi khale? $1.',
+'gotaccountlink' => 'Pfula unghena',
+'userlogin-resetlink' => 'Xana u rivele vuxokoxoko bya wena byo pfula unghena?',
+'createaccountreason' => 'Xivangelo:',
+'loginsuccess' => "'''Ule ndzeni ka {{SITENAME}} tani hi \"\$1\".'''",
+'mailmypassword' => 'Rhumela vito-mpfungulo lerintwsa',
+'loginlanguagelabel' => 'Ririmi: $1',
+
+# Edit page toolbar
+'bold_sample' => 'Marito yo bumbula',
+'bold_tip' => 'Marito yo bumbula',
+'italic_sample' => 'Tsalawa ra xitaliki',
+'italic_tip' => 'Tsalawa ra xitaliki',
+'link_sample' => 'Khwekerisa nhlokomhaka',
+'link_tip' => 'Xikhwekerisi xala ndzeni ka wiki leyi',
+'extlink_sample' => 'http://www.example.com khwekerisa nhlokomhaka',
+'extlink_tip' => 'Xikhwekerisi xa tluka ralehandle ka wiki leyi (tsundzuka xi rhangi xa http:// )',
+'headline_sample' => 'tsala ra nhlokomhaka',
+'headline_tip' => 'Nhloko mhaka ya xiyenge xa 2',
+'nowiki_sample' => 'Hoxa xivulwa lexi nga sasekisiwangiki mavonele laha',
+'nowiki_tip' => 'bakanya kuxongisa marito ka wiki',
+'image_tip' => 'Fayili leyi angarhiweke',
+'media_tip' => 'Xikhwekerisi xa fayili',
+'sig_tip' => 'Nsayino wawena wurina mfungo wa nkarhi',
+'hr_tip' => 'Ntila wo khwatiheta (wu tirhise hivukheta)',
 
 # Edit pages
-'summary'          => 'Nkomiso:',
-'minoredit'        => 'Lowu i ndzulamiso wu tsongo',
-'watchthis'        => 'Langutisa tluka leri',
-'savearticle'      => 'Hlayisa tluka',
-'preview'          => 'Ringanisa',
-'showpreview'      => 'Komba kuringanisa',
-'showdiff'         => 'Komba ku cinca',
-'previewnote'      => "'''Lowu i ndzinganiso ntsena;
+'summary' => 'Nkomiso:',
+'minoredit' => 'Lowu i ndzulamiso wu tsongo',
+'watchthis' => 'Langutisa tluka leri',
+'savearticle' => 'Hlayisa tluka',
+'preview' => 'Ringanisa',
+'showpreview' => 'Komba kuringanisa',
+'showdiff' => 'Komba ku cinca',
+'anoneditwarning' => "'''Watsundzuxiwa:''' awu pfulanga unghena eka wiki leyi.
+Adirese ya khompuyuta ya wena ya IP yita tsariwa eka matimu ya ku lulamisiwa ka tluka leri.",
+'newarticle' => '(yintswa)',
+'newarticletext' => "Ulandzele xikhwekerisi lexi kombaka tluka leringasi tsariwaka.
+Leswaku u tumbuluxa tluka leri, tsala eka bokisi leringa e hansi (Nkambe unga ye eka [[{{MediaWiki:Helppage}}|tluka ra mpfuno]] kukuma vuxokoxoko lebyi engetelekeke).
+Loko ufike eka tluka leri hixihoxo, thlava bhatheni leyinge '''thlelela'''.",
+'noarticletext' => 'Kuhava matsalwa eka tluka leri.
+Unga [[Special:Search/{{PAGENAME}}|lavalava nhlokomhaka ya tluka leri]] eka matluka man\'wana,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} lavalava eka nghula leyiyelanaka],
+kumbe [{{fullurl:{{FULLPAGENAME}}|action=edit}} u hlakarhelisa tluka leri]</span>.',
+'noarticletext-nopermission' => 'Kuhava matsalwa eka tluka leri.
+Unga [[Special:Search/{{PAGENAME}}|lavalava nhlokomhaka ya tluka leri]] endzeni ka matluka man\'wana,
+kumbe u <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} lavalava eka nghula leyiyelanaka]</span>.',
+'previewnote' => "'''Lowu i ndzinganiso ntsena;
 kucinca a ku sihlayisiwa!'''",
+'editing' => 'Ulekululamiseni ka $1',
+'editingsection' => 'Ndzulamiso wa $1 (Xiyenge)',
 'copyrightwarning' => "Xiya leswaku minyikelo hinkwayo e ka {{SITENAME}} yi tekiwa yitshuxiwe e hansi ka $2 (Vona $1 ku kuma vuxokoxoko).
 loko unga tsakeli leswaku vutsari bya wena byi lulamisiwa no aviwa handle ko tweriwa vusiwana, unga tsari laha.<br />
 U hi tshembisa nakambe leswaku hi wena mutsari wa leswi nyikeriwaka laha, kumbe leswi u swinyikelaka u swi tekile e xihloveni xa lerivaleni kumbe laha kunga na mpfumelelo wa mani na mani.
 '''UNGA RHUMERI MATSALWA LA MA SIRHELERIWEKE HANDLE KA MPFUMELELO!'''",
+'templatesused' => '{{PLURAL:$1|Xivumbiwa ntirho lexi|Swivumbiwa ntirho leswi}} tirhisiweke eka tluka leri:',
+'template-protected' => '(Ri sirheleriwile)',
+'template-semiprotected' => '(lisirheleriwile switsanana)',
+'hiddencategories' => 'Tluka leri i nandza wa {{PLURAL:$1|ntlwa lowu tumbetiweke|$1 mintlawa leyi tumbetiweke}}:',
+'permissionserrorstext-withaction' => 'Awupfumeleriwanga ku $2, hikwalaho ka {{PLURAL:$1|wa xivangelo|wa swivangelo}}:',
+'recreate-moveddeleted-warn' => "'''Tivonele: utumbuluxa tluka leri raha ku suriwa kungarikhale.'''
+
+Nhlahluvisisa loko swifanerile ku ya emahlweni u lulamisa tluka leri.
+Matimu yo sula no susa ma kombila laha ehansi ku ku pfuna:",
+'moveddeleted-notice' => 'Tluka leri ri suriwile.
+nhula ya minxaxamelo leyi kombaka ku suriwa na ku susiwa ka tluka leri ya kombiwa laha ehansi.',
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Tivonele:''' xivumbiwa-ntirho xa ntsengo xitele ngopfu.
+swivumbiwa-ntirho swin'wana aswinge xaxametiwi.",
+'post-expand-template-inclusion-category' => 'Matluka lawa xivumbiwa-ntirho xa wona xi lavaka ntsengo ma hundze mpimo',
+'post-expand-template-argument-warning' => "'''Tivonele:''' Tluka leri ritamele xin'we xaswi hlamuseri kumbe kutlula xa xivumbiwa ntirho lexi tlulaka mpiwo wo ndlndlamuxa xivumbiwa-ntirho lexi.
+Swi hlamuseri leswi swi susiwile eka tluka leri.",
+'post-expand-template-argument-category' => 'Matluka lama kayivelaka swihlamuseri leswitirhisiwaka hi swivumbiwa-ntirho',
 
 # History pages
-'next'                 => 'Leswilandzelaka',
-'last'                 => 'Swo hetelela',
-'page_first'           => 'Xo sungula',
+'viewpagelogs' => 'Vona nghula ya minxaxamelo ya tluka leri',
+'currentrev-asof' => 'Mindzulamiso ya sweswinyana ya $1',
+'revisionasof' => 'Ndzulamiso kusukela hi $1',
+'revision-info' => 'Mindzulamiso ku sukela hi $1 leyi endliweke hi $2',
+'previousrevision' => '← Ndzulamiso wakhale',
+'nextrevision' => 'Ndzulamiso wa sweswinyana →',
+'currentrevisionlink' => 'Ndzulamiso wasweswinyana',
+'cur' => 'sweswi',
+'next' => 'Leswilandzelaka',
+'last' => 'Swo hetelela',
+'page_first' => 'Xo sungula',
+'histlegend' => "Leswaku uhambanisa mindzulamiso: thlava eka swifungu swa xirhendzevutana swa mindzulamiso leyi hambanaka ivi u thlava bhatheni leyi nge \"Enter\" eka Khibhodi ya wena kumbe bhatheni leyi kombiweke ehansi.<br />
+Swihlamuseri: '''({{int:sweswi}})''' = kuhambana na ndzulamiso wa sweswinyana, '''({{int:khale}})''' = kuhambana na ndzulamiso lowu tlhandlamaka lowu, '''{{int:minoreditletter}}''' = ndzulamiso lowu tsanana.",
+'history-fieldset-title' => 'Langutisa matimu',
 'history-show-deleted' => 'Leswi suriweke ntsena',
+'histfirst' => 'Swa khalenyana',
+'histlast' => 'Swa sweswinyana',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 hi $2',
 
 # Revision deletion
 'rev-delundel' => 'Komba/Tumbeta',
-'pagehist'     => 'Matimu ya tluka',
-'deletedhist'  => 'Matimu lamasuriweke',
+'revdel-restore' => 'Cinca kuvoniwa',
+'revdel-restore-deleted' => 'Mindzulamiso leyi suriweke',
+'revdel-restore-visible' => 'mindzulamiso leyi voniwaka himani na mani',
+'pagehist' => 'Matimu ya tluka',
+'deletedhist' => 'Matimu lamasuriweke',
 
 # Merge log
 'revertmerge' => 'Hambanisa',
 
+# Diffs
+'history-title' => 'Matimu ya mindulamiso ya "$1"',
+'lineno' => 'Ntila $1:',
+'compareselectedversions' => 'Hambaniisa exikarhi ka mindzulamiso leyi langiweke',
+'editundo' => 'Thlerisela',
+'diff-multi' => '({{PLURAL:$1|ndzulamiso lowu landzeleke|$1 mindzulamiso leyi landzeleke}} hi {{PLURAL:$2|mutirhisi|$2 wavatirhisi}} leyingakombiwangiki)',
+
 # Search results
-'searchhelp-url'        => 'Help:Leswinga ndzeni',
+'searchresults' => 'Lavisisa eka mimbuyelo',
+'searchresults-title' => 'Lavisisa "$1" eka mimbuyelo',
+'prevn' => 'Leswihundzeke  {{PLURAL:$1|$1}}',
+'nextn' => 'Leswilandzelaka  {{PLURAL:$1|$1}}',
+'prevn-title' => '$1 {{PLURAL:$1|nkutlunya lo wu|minkutlunya leyi}} hundzeke',
+'nextn-title' => '$1 {{PLURAL:$1|nkutlunya lowu|minkutlunya leyi}} landzelaka',
+'shown-title' => "Komba $1 {{PLURAL:$1|mbuyelo|mimbuyelo}} eka tluka rin'wana na ri n'wana",
+'viewprevnext' => 'Vona ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Tluka leri vuriwaka \"[[:\$1]]\" ikhale ririkona eka wiki leyi.'''",
+'searchmenu-new' => "'''Tumbuluxa tluka ra \"[[:\$1]]\" eka wiki leyi!'''",
+'searchhelp-url' => 'Help:Leswinga ndzeni',
+'searchprofile-articles' => 'Matluka lama tsariweke',
+'searchprofile-project' => 'Mpfuno na matluka ya phurojeki',
+'searchprofile-images' => 'Tifayili ta mfpumawulo na swifaniso',
+'searchprofile-everything' => 'Hinkwaswo',
+'searchprofile-advanced' => 'Rharhangana',
+'searchprofile-articles-tooltip' => 'Lavisisa eka $1',
+'searchprofile-project-tooltip' => 'Lavisisa eka $1',
+'searchprofile-images-tooltip' => 'Lava tifayili',
+'searchprofile-everything-tooltip' => 'Lavalava eka matsalwa hinkwawo  (kuhlanganisa na matluka ya mbulavulo)',
+'searchprofile-advanced-tooltip' => 'Lavalava eka swisivela mavito leswi tolovelekeke',
+'search-result-size' => '$1 ({{PLURAL:$2|1 viti|$2 maviti}})',
+'search-result-category-size' => '{{PLURAL:$1|nandza|$1 wa malandza}} ({{PLURAL:$2|ntlawa-ntsongo|$2 wa mintlawa-ntsongo}}, {{PLURAL:$3|fayili|$3 wa tifayili}})',
+'search-redirect' => '(nkongomiso kusaka e $1)',
+'search-section' => '(Xiyenge $1)',
+'search-suggest' => 'Xana uvula: $1',
 'search-interwiki-more' => '(Leswi engetelekeke)',
 'search-relatedarticle' => 'Leswi yelanaka',
-'searchrelated'         => 'Yelanaka',
-'searchall'             => 'Hinkwaswo',
-'showingresults'        => "Kombisa e hansi kufika eka {{PLURAL:$1|'''1''' mbuyelo|'''$1''' mimbuyelo}} Kusungula hi#'''$2'''.",
-'powersearch'           => 'Ndzavisiso',
+'searchrelated' => 'Yelanaka',
+'searchall' => 'Hinkwaswo',
+'showingresults' => "Kombisa e hansi kufika eka {{PLURAL:$1|'''1''' mbuyelo|'''$1''' mimbuyelo}} Kusungula hi#'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|nkutlunya '''$1''' wa '''$3''' lowu|minkutlunya '''$1 - $2''' ya '''$3''' leyi}} yelanaka na '''$4'''",
+'search-nonefound' => 'Kuhava mimbuyelo leyi yelanaka xikombelo lexi.',
+'powersearch' => 'Ndzavisiso',
 
 # Preferences page
-'mypreferences'   => 'Minhlawulo ya mina',
-'prefs-edits'     => 'Ntsengo wa mindzulamiso:',
-'skin-preview'    => 'Ndzinganiso',
-'prefs-datetime'  => 'Siku na nkarhi',
+'mypreferences' => 'Minhlawulo ya mina',
+'prefs-edits' => 'Ntsengo wa mindzulamiso:',
+'skin-preview' => 'Ndzinganiso',
+'prefs-datetime' => 'Siku na nkarhi',
 'prefs-watchlist' => 'Nxaxamelo wa Leswivoniwaka',
-'saveprefs'       => 'Hlayisa',
-'resetprefs'      => 'sula kucinca lokungahlayisiwangiki',
-'prefs-editing'   => 'Kululamisa',
-'yourrealname'    => 'Vito ra ntiyiso:',
-'yourlanguage'    => 'Ririmi:',
+'saveprefs' => 'Hlayisa',
+'resetprefs' => 'sula kucinca lokungahlayisiwangiki',
+'prefs-editing' => 'Kululamisa',
+'youremail' => 'E-mail:',
+'yourrealname' => 'Vito ra ntiyiso:',
+'yourlanguage' => 'Ririmi:',
+'prefs-help-email' => 'Adiresi ya e-mail ayibohi, kambe yita laveka leswaku u cinca ritompfungulo ra wena, loko swiendleka leswaku u ri rivala.',
+'prefs-help-email-others' => "Unga langa leswaku van'wana va bula na wena hi e-mail hikutirhisa xikhwekeri eka tluka ra wena ravutirhis kumbe eka tluka ra mbulavulo.
+Adiresi ya wena ya e-mail yitunberile loko van'wana va bula na wena.",
 
 # Rights
-'right-read'       => 'Matluka yo Hlaya',
-'right-edit'       => 'Lulamisa ma tluka',
+'right-read' => 'Matluka yo Hlaya',
+'right-edit' => 'Lulamisa ma tluka',
 'right-createpage' => 'Tumbuluxa matluka (mangariki eka matluka ya mbulavulo)',
 'right-createtalk' => 'Tumbuluxa matluka ya mbulavulo',
+'right-move' => "Yisa matluka lawa kun'wana",
+'right-move-subpages' => "yisa matluka lawa na matluka-ntsongo ya wona, kun'wana",
+'right-delete' => 'Sula matluka lawa',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'hlaya tluka leri',
 'action-edit' => 'Lulamisa tluka leri',
+'action-createpage' => 'tumuluxa matluka',
+'action-createtalk' => 'tumbuluxa matluka ya mbulavulo',
+'action-createaccount' => 'tumbuluxa akhawunti ya mutirhisi loyi',
+'action-minoredit' => 'funga ndzulamiso lowu wulri lowintsanana',
+'action-move' => 'Yisa tluka leri ndhzawini yinwana',
+'action-move-subpages' => "Yisa tlukaleri na matluka-nstongo ya rona, endzawini yinw'ana",
 
 # Recent changes
-'recentchanges'    => 'Ku cinca ka sweswi-nyana',
-'hide'             => 'Tumbeta',
-'show'             => 'Komba',
+'nchanges' => '$1 {{PLURAL:$1|wa ndzulamiso|wa mindzulamiso}}',
+'recentchanges' => 'Ku cinca ka sweswi-nyana',
+'recentchanges-legend' => 'Tindlela to langutisa ku cinca ka sweswinyana',
+'recentchanges-summary' => 'Landzelela mindzulamiso ya sweswinyana ya wiki leyi eka tluka leri.',
+'recentchanges-feed-description' => 'Landzelela mindzulamiso ya sweswinyana eka wiki leyi hi xiphameri-hungu lexi.',
+'recentchanges-label-newpage' => 'Ndzulamiso lowu wu tumbuluxe tluka rintswa',
+'recentchanges-label-minor' => 'Lowu i ndzulamiso wu tsongo',
+'recentchanges-label-bot' => 'Ndzulamiso lowu wu endliwe hi rhobhoto',
+'recentchanges-label-unpatrolled' => 'Ndzulamiso lowu awusi languteriwa',
+'rcnote' => "Lha hansi ku kombiwa {{PLURAL:$1|ku cinca|''$1''' wa mindzulamiso}} endzeni ka  {{PLURAL:$2|siku|'''$2''' wa masiku}} lamahundzeke, hi $5, $4.",
+'rcnotefrom' => "Laha hansi kuxaxametiwe ku cinca kusukela hi '''$2''' (kuya ka '''$1''').",
+'rclistfrom' => 'Komba mindzilamiso leyintswa kusukela eka $1',
+'rcshowhideminor' => '$1 wa mindzulamiso leyi ntsanana',
+'rcshowhidebots' => '$1 wati rhobhoto',
+'rcshowhideliu' => '$1 wa va tirhisi lavanga kona sweswi',
+'rcshowhideanons' => '$1 wa vatirhisi lava tumbeleke',
+'rcshowhidepatr' => '$1 mundzulamiso leyi languteriweke',
+'rcshowhidemine' => '$1 wa mindzulamiso ya mina',
+'rclinks' => 'Kumba $1 ya ku cinca eka $2 wa masiku lamahundzeke<br />$3',
+'diff' => 'Hamban',
+'hist' => 'Matimu',
+'hide' => 'Tumbeta',
+'show' => 'Komba',
+'minoreditletter' => 'Tsan',
+'newpageletter' => 'Rintswa',
+'boteditletter' => 'Rhob',
+'rc-enhanced-expand' => 'Komba vuxokoxoko (yi tirhisa tswala ra Java)',
 'rc-enhanced-hide' => 'Tumbeta vuxokoxoko',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Kuncica loku yelanaka',
-'recentchangeslinked-feed'    => 'Kuncica loku yelanaka',
+'recentchangeslinked' => 'Kuncica loku yelanaka',
+'recentchangeslinked-feed' => 'Kuncica loku yelanaka',
 'recentchangeslinked-toolbox' => 'Kuncica loku yelanaka',
+'recentchangeslinked-title' => 'Kucinca loku yelanaka na "$1"',
+'recentchangeslinked-noresult' => 'Kuhava mindzulamiso eka matluka lawa eka nkarhi lowu langiweke',
+'recentchangeslinked-summary' => "Lowu inxaxamelo wa kucinca kasweswinyana loku endliweke eka matluka la ma khwekelaka eka tluka leri u rilavaka (kumbe yinw'ana ya mitlawa leyi yelanaka).Matluka lawa [[Special:Watchlist|umalanguteke]] ma '''bumburisiwile'''.",
+'recentchangeslinked-page' => 'Vito ratluka:',
+'recentchangeslinked-to' => 'Komba kucinca eka matluka lama khwekelaka eka tluka leri ntsena',
 
 # Upload
 'upload' => 'Khandziyisa fayili',
+'uploadlogpage' => 'Ngula ya nxaxamelo wa swilo leswi hoxiweke',
+'filedesc' => 'Nkomiso',
+'uploadedimage' => 'kuhoxiwe fayili ya "[[$1]]"',
+
+'license' => 'Nawu wo pfumelela',
+'license-header' => 'Nawu wo pfumelela',
 
 # Special:ListFiles
-'imgfile'        => 'fayili',
-'listfiles'      => 'Nxaxamelo wa tifayili',
+'imgfile' => 'fayili',
+'listfiles' => 'Nxaxamelo wa tifayili',
 'listfiles_date' => 'Siku',
 'listfiles_name' => 'vito',
 
 # File description page
-'file-anchor-link'   => 'Fayili',
+'file-anchor-link' => 'Fayili',
+'filehist' => 'Matimu ya fayili',
+'filehist-help' => 'thlava eka siku/nkarhi leswaku u vona leswi fayili ayirixiswona hi knarhi walowo',
 'filehist-deleteall' => 'sula hinkwaswo',
 'filehist-deleteone' => 'Dlaya',
-'filehist-revert'    => 'thlerisela',
-'filehist-datetime'  => 'Siku/Nkarhi',
-'filehist-user'      => 'Mutirhisi',
+'filehist-revert' => 'thlerisela',
+'filehist-current' => 'Sweswinyana',
+'filehist-datetime' => 'Siku/Nkarhi',
+'filehist-thumb' => 'Xifanisonyana',
+'filehist-thumbtext' => 'Xifaniso lexi tsongahatiweke kusukela hi $1',
+'filehist-user' => 'Mutirhisi',
+'filehist-dimensions' => 'Mpimo',
+'filehist-comment' => 'Nhlamulo',
+'imagelinks' => 'Ntsengo wakutirhisiwa ka fiyili leyi',
+'linkstoimage' => ' {{PLURAL:$1|tluka leri rikhekela|$1 matluka lawa makhwekela}} eka fayili leyi:',
+'nolinkstoimage' => 'Kuhava tluka leri khwekelaka eka fayili leyi',
+'sharedupload-desc-here' => "Fayili leyi yi suka e $1 naswona swinga endleka leswaku yi tirhisiwa hiti phurojeki tin'wanana.
+Nhlamuselo ya yona leyi nge ndzeni ka [$2 tluka ro hlamusela] hi yona leyi kombiweke ehansi.",
+
+# Random page
+'randompage' => "Tluka rin'wana na rin'wana",
 
 # Statistics
 'statistics' => 'Mintsengo',
 
+'disambiguationspage' => 'Template:Hambanisa marito',
+
 # Miscellaneous special pages
-'newpages'     => 'Matluka mantswa',
-'move'         => 'Yi sa kunwana',
+'nbytes' => '$1 {{PLURAL:$1|wa bayiti|wa tibayit}}',
+'nmembers' => '$1 {{PLURAL:$1|museketeri| wa vaseketeri}}',
+'prefixindex' => 'Matluka hinkwawo lama sungulaka hi',
+'usercreated' => '{{GENDER:$3|u tumbuluxe}} hi siku ra $1 hinkarhi wa $2',
+'newpages' => 'Matluka mantswa',
+'move' => 'Yi sa kunwana',
 'movethispage' => 'Yisa tluka leri ndhzawini yinwana',
+'pager-newer-n' => '{{PLURAL:$1|xa khale|$1 swa khale}}',
+'pager-older-n' => '{{PLURAL:$1|ra khale|$1 ya khale}}',
+
+# Book sources
+'booksources' => 'Swihlovo swatibuku',
+'booksources-search-legend' => 'Lavalava swihlovo swa tibuku',
+'booksources-go' => 'Nghena',
 
 # Special:Log
 'specialloguserlabel' => 'Mutirhisi:',
+'log' => 'Nghula ya minxaxamelo',
 
 # Special:AllPages
-'allpages'       => 'Matluka hinkwawo',
+'allpages' => 'Matluka hinkwawo',
 'alphaindexline' => '$1 kuya fika eka $2',
-'allarticles'    => 'Matluka hinkwawo',
+'allarticles' => 'Matluka hinkwawo',
+'allpagessubmit' => 'Nghena',
+
+# Special:Categories
+'categories' => 'Mintlawa',
 
 # Special:LinkSearch
 'linksearch-ok' => 'Lava',
+'linksearch-line' => '$1 yi khwekerisiwe kusuka eka $2',
+
+# Special:Log/newusers
+'newuserlogpage' => 'Nghula ya nxaxamelo wa ku tumbuluxiwa ka vatirhisi',
+
+# Special:ListGroupRights
+'listgrouprights-members' => '(nxaxamelo wa valandzeri)',
 
 # E-mail user
 'emailuser' => 'rhumela mutirhisi loyi E-mail',
 
 # Watchlist
-'watchlist'     => 'Leswi ndziswilanguteke',
-'mywatchlist'   => 'Leswi ndziswilanguteke',
-'watch'         => 'Languta',
+'watchlist' => 'Leswi ndziswilanguteke',
+'mywatchlist' => 'Leswi ndziswilanguteke',
+'watchlistfor2' => 'Swa $1 $2',
+'watch' => 'Languta',
 'watchthispage' => 'Languta tluka leri',
-'unwatch'       => 'Ungalanguti',
+'unwatch' => 'Ungalanguti',
+'watchlist-details' => '{{PLURAL:$1|$1 tluka|$1 wa matluka}} eka nxaxamelo wa leswi uswilanguteke, kungasi hlayiwa matluka yu mbulavulo.',
+'wlshowlast' => 'Komba $1 wati awara  $2 wa masiku kumbe $3',
+'watchlist-options' => 'Minhlawulo ya nxaxamelo wa leswilangutiweke',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Ulangutile...',
+'watching' => 'Ulangutile...',
 'unwatching' => 'Utshika ku languta...',
 
+# Delete
+'actioncomplete' => 'Swiendlekile',
+'actionfailed' => 'Switsandzile',
+'dellogpage' => 'Nghula ya matluka lama suriweke',
+
+# Rollback
+'rollbacklink' => 'thlerisela ku cinca',
+
+# Protect
+'protectlogpage' => 'Nghula ya minxaxamelo ya matsalwa lama sirheleriweke',
+'protectedarticle' => '"[[$1]]" risirheleriwile',
+
+# Undelete
+'undeletelink' => 'Langutisa/thlerisela',
+'undeleteviewlink' => 'Langutisa',
+
 # Namespace form on various pages
-'invert'         => 'Invert selection',
+'namespace' => 'Swikhomela viti',
+'invert' => 'Invert selection',
 'blanknamespace' => '(Ntsindza)',
 
 # Contributions
 'contributions' => 'Minyikelo ya mutirhisi',
-'mycontris'     => 'Minyikelo ya mina',
-'contribsub2'   => 'For $1 ($2)',
-'nocontribs'    => 'Ku hava ku cinca loku kumiweke eka xiyenge lexi.',
-'uctop'         => '(Henhla)',
-'month'         => 'Kusukela e ka nhweti ya (kuya endhzaku):',
-'year'          => 'Ku sukela e ka lembe ra (kuya endhzaku):',
-
-'sp-contributions-newbies'     => 'Komba minyikela ya ti akhawunti tintswa ntsena',
+'contributions-title' => 'Minyikelo ya vutirhisi ya $1',
+'mycontris' => 'Minyikelo ya mina',
+'contribsub2' => 'For $1 ($2)',
+'nocontribs' => 'Ku hava ku cinca loku kumiweke eka xiyenge lexi.',
+'uctop' => '(Henhla)',
+'month' => 'Kusukela e ka nhweti ya (kuya endhzaku):',
+'year' => 'Ku sukela e ka lembe ra (kuya endhzaku):',
+
+'sp-contributions-newbies' => 'Komba minyikela ya ti akhawunti tintswa ntsena',
 'sp-contributions-newbies-sub' => 'Eka ti akhawunti ti ntswa',
-'sp-contributions-talk'        => 'Mbulavulo',
-'sp-contributions-search'      => 'Lava minyikelo',
+'sp-contributions-blocklog' => 'Ngula ya nxaxamelo wa kusivela',
+'sp-contributions-uploads' => 'Nxaxamelo wa ku nghenisa',
+'sp-contributions-logs' => 'Nghula ya nxaxamelo',
+'sp-contributions-talk' => 'Mbulavulo',
+'sp-contributions-search' => 'Lava minyikelo',
+'sp-contributions-username' => 'Hoxa Direse ya IP kumbe vito ra mutirhisi:',
+'sp-contributions-toponly' => 'Komba ntsena mindzulamiso leyi yinga haku endliwa sweswinyana',
+'sp-contributions-submit' => 'Lava',
 
 # What links here
 'whatlinkshere' => 'Leswi khwekelaka laha',
+'whatlinkshere-title' => 'Matluka lama khwekelaka eka $1',
+'whatlinkshere-page' => 'Tluka:',
+'linkshere' => "Matluka lama landzelaka makhwekela eka '''[[:$1]]''':",
+'nolinkshere' => "Kuhava matluka lama khwekelaka eka  '''[[:$1]]'''.",
+'isredirect' => 'Tluka ro kongomisa',
+'istemplate' => 'Swisivela ndhzawu',
+'isimage' => 'Xikhwekerisi xa fayili',
+'whatlinkshere-prev' => '{{PLURAL:$1|leri hundzeka| $1 lama hundzeke}}',
+'whatlinkshere-next' => '{{PLURAL:$1|lowu landzelaka| $1 leyi landzelaka}}',
+'whatlinkshere-links' => '← Swikhwekerisi',
+'whatlinkshere-hideredirs' => '$1 ya matluka yo thlerisela',
+'whatlinkshere-hidetrans' => '$1 wa swisivela ndhzawu',
+'whatlinkshere-hidelinks' => '$1 wa swikhwekeri',
+'whatlinkshere-hideimages' => '$1 swikhwekerisi saw xifaniso',
+'whatlinkshere-filters' => 'Tinhlelo',
 
 # Block/unblock
+'ipboptions' => "Ti awara timbirhi:2 hours,Siku rin'we:1 day,Masiku manharhu:3 days,Vhiki rin'we:1 week,Mavhiki manbirhi:2 weeks,Nhweti yin'we:1 month,Tinwheti tinharhu:3 months,Tinhweti ta ntsevu:6 months,Lembe rin'we:1 year,hilaha kungaheriki:infinite",
+'ipblocklist' => 'Vatirhisi lava siveriweke',
+'blocklink' => 'Sivela',
+'unblocklink' => 'Cinca kusivela',
+'change-blocklink' => 'Cinca xirhapa',
 'contribslink' => 'Minyikelo',
+'blocklogpage' => 'Ngula ya nxaxamelo wa kusiverwa ka vatirhisi',
+'blocklogentry' => 'Nsivelo wa mutirhisi  [[$1]] wu hela hi $2 $3',
+'block-log-flags-nocreate' => 'Kupfula akhawunti swa arisiwa',
+
+# Move page
+'movelogpage' => 'Nghula ya nxaxamelo waku susiwa',
+'revertmove' => 'thlerisela',
+
+# Export
+'export' => 'Rhumela matluka ehandle ka wiki',
 
 # Namespace 8 related
 'allmessagesname' => 'Vito',
+'allmessagesdefault' => 'Tsalwa-hungu leri tolovelekeke',
+
+# Thumbnails
+'thumbnail-more' => 'Kurisa',
+'thumbnail_error' => 'Kuvena xihoxo ekutumbuluxiweni ka xifaniso-ntongo hkwalaho ka: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'     => 'Tluka ra vutirhisi',
-'tooltip-pt-mytalk'       => 'Mbulavulo namina',
-'tooltip-pt-preferences'  => 'Minyikelo ya mina',
-'tooltip-pt-mycontris'    => 'Nxaxamelo wa minyikelo ya mina',
-'tooltip-pt-logout'       => 'pfala u famba',
-'tooltip-ca-protect'      => 'Sirhelela tluka leri',
-'tooltip-ca-delete'       => 'Sula tluka leri',
-'tooltip-ca-move'         => 'Veka tluka endhzawini yinwana',
-'tooltip-ca-watch'        => 'Hoxa tluka leri eka leswi uswilanguteke',
-'tooltip-n-mainpage'      => 'Endzela tlukankulu',
+'tooltip-pt-userpage' => 'Tluka ra wena ra vutirhisi',
+'tooltip-pt-mytalk' => 'Tluka ro vulavula ra wena',
+'tooltip-pt-preferences' => 'Minyikelo ya mina',
+'tooltip-pt-watchlist' => 'Nxaxamelo wa matluka lawa umalanguteleke kucinca',
+'tooltip-pt-mycontris' => 'Nxaxamelo wa minyikelo hinkwayo ya wena',
+'tooltip-pt-login' => 'Utsundzuxiwa ku pfula unghena; hambiswiritano, aswi bohi',
+'tooltip-pt-logout' => 'pfala u famba',
+'tooltip-ca-talk' => 'Mbulavuriswano hi tluka',
+'tooltip-ca-edit' => 'Unga lulamisa tluka leri. Ukomberiwa ku komba kuringanisa ka ku cinca ka wena ungasi rihlayisa',
+'tooltip-ca-addsection' => 'Sungula xiyenge lexinthswa',
+'tooltip-ca-viewsource' => 'Papila leri risirheleriwile.
+Unga vona xit\\holvo xa rona',
+'tooltip-ca-history' => 'Mindzulamiso yakhale ya tluka leri',
+'tooltip-ca-protect' => 'Sirhelela tluka leri',
+'tooltip-ca-delete' => 'Sula tluka leri',
+'tooltip-ca-move' => 'Veka tluka endhzawini yinwana',
+'tooltip-ca-watch' => 'Hoxa tluka leri eka leswi uswilanguteke',
+'tooltip-ca-unwatch' => 'Susa tluka leri eka leswi uswi languteke',
+'tooltip-search' => 'Lavisisa {{SITENAME}}',
+'tooltip-search-go' => 'Yana eka tluka leri fanaka na viti leri loko ririkona',
+'tooltip-search-fulltext' => 'Lavisisa riviti leri eka matluka lawa',
+'tooltip-p-logo' => 'Vhakela tluka-nkulu',
+'tooltip-n-mainpage' => 'Endzela tlukankulu',
+'tooltip-n-mainpage-description' => 'Vhakela tlukankulu',
+'tooltip-n-portal' => 'Leswi engetelekeke hi phurojeki leyi, leswi undla swi endlaka, laha unga kumana kona switirhisiwa',
+'tooltip-n-currentevents' => 'Kuma vuxokoxoko hi leswi endlekaka sweswi',
+'tooltip-n-recentchanges' => 'Nxaxamelo wa kucinca ka sweswinyana eka wiki',
+'tooltip-n-randompage' => "Vona tluka rin'wana na rin'wana",
+'tooltip-n-help' => 'Ndzawu yo twisisa leswi',
 'tooltip-t-whatlinkshere' => 'Nxaxamelo wa matluka lama khwekelaka laha',
-'tooltip-t-upload'        => 'Khandziyisa tifayili',
-'tooltip-t-specialpages'  => 'Nxaxamelo wa matluka yo hlawuleka',
-'tooltip-ca-nstab-user'   => 'Vona tluka ra mutirhisi',
-'tooltip-save'            => 'Hlayiso ku cinca ka wena',
-'tooltip-preview'         => 'Ringanisa ku cinca loku uku endleke, Tirhisa Xitirhisiwa lexi ungasi hlayisa tluka leri!',
-'tooltip-summary'         => 'Tsala nkomiso',
+'tooltip-t-recentchangeslinked' => 'Kucinca kasweswinyana ka matluka la ma thlavinyetiweke eka tluka leri',
+'tooltip-feed-atom' => 'Vuhaxi bya Atom bya tluka leri',
+'tooltip-t-contributions' => 'Nxaxamelo wa minyikelo ya mutirhisi loyi',
+'tooltip-t-emailuser' => 'Rhumela mutirhisa loyi e-mail',
+'tooltip-t-upload' => 'Khandziyisa tifayili',
+'tooltip-t-specialpages' => 'Nxaxamelo wa matluka yo hlawuleka',
+'tooltip-t-print' => 'Gangliso wa tluka leri',
+'tooltip-t-permalink' => 'Xithlavinyeti xa nkarhi hinkwawo xa ndzulamiso wa tluka',
+'tooltip-ca-nstab-main' => 'Langutisa tluka ra matsalwa',
+'tooltip-ca-nstab-user' => 'Vona tluka ra mutirhisi',
+'tooltip-ca-nstab-special' => 'Tluka leri rihlawulekile, awu pfumeleriwanga ku endla ndzulamiso eka rona hikukongoma',
+'tooltip-ca-nstab-project' => 'Vona tluka ra phurojeki',
+'tooltip-ca-nstab-image' => 'Vona tluka ra fayili leyi',
+'tooltip-ca-nstab-template' => 'Langutisa xivumbiwa-ntirho',
+'tooltip-ca-nstab-category' => 'Langutisa tluka ra ntlawa',
+'tooltip-minoredit' => 'Fungha ndzulamiso lowu wuri lowu tsanana',
+'tooltip-save' => 'Hlayiso ku cinca ka wena',
+'tooltip-preview' => 'Ringanisa ku cinca loku uku endleke, Tirhisa Xitirhisiwa lexi ungasi hlayisa tluka leri!',
+'tooltip-diff' => 'Komba kucinca loku uku endleke aka xivulwa',
+'tooltip-compareselectedversions' => 'Vona kuhambana exikarhi ka mindzulamiso leyi uyilangeke ya tluka leri',
+'tooltip-watch' => 'Hoxa tluka leri eka nxaxamelo wa matluka lawa umalanguteke',
+'tooltip-rollback' => 'Xirhangi "Thlerisela" xita thlerisela ku cinca lokuendliweke hi mutirhisi wo hetelela eka tluka leri hi ku thlava kan\'we',
+'tooltip-undo' => 'xi angi "thlerisela" xithlerisela ndzulamiso lowu naswona xi pfula foromo yo lulamisa eka matsamelo yo ringanisa ndzulamiso. Yipfumela leswaku u engetela xivangela xa ndzulamiso lowu eka nkomiso.',
+'tooltip-summary' => 'Tsala nkomiso',
+
+# Browsing diffs
+'previousdiff' => '← Ndzulamiso wakhale',
+'nextdiff' => 'Ndzulamiso lowu ntswa →',
+
+# Media information
+'file-info-size' => '$1 × $2 ku anama na leha hi ti phikisele, Vukulu bya fayili: $3, muxaka waMIME: $4',
+'file-nohires' => 'Xifaniso lexi axikuriseki kuhundza laha.',
+'svg-long-desc' => 'Fayili ya SVG, vukulu lebyi ringaneke $1 × $2 hi ti phikisele, vukulu bya fayili: $3',
+'show-big-image' => 'kuleha na ku anama hixitalo',
+
+# Bad image list
+'bad_image_list' => 'Minxaxamelo leyi landzelaka yi andlariwe hindlela leyi:
+
+nxaxamelo wa mintila (Mintila leyi sungulaka hi *) ntsena le yi kombiwaka.
+Xithlavinyeti xo sungula eka ntila i xithlavinyeta fayili leyi onhiweke.
+Swithlavinyeti leswi engetelekeke eka ntila lowu fanaka swilangutiwa swiri swihambukisi, hileswaku matluka lawa fiyili yinga kumekaka kona endzeni.',
+
+# Metadata
+'metadata' => 'Nghula ya vuxokoxoko',
+'metadata-help' => 'Fayili leyi yi khome vuxokoxoko lebyi engetelekeke, swingaendleka yi hoxiwile kusuka eka Khemera kumbe muchini wo gandlisa lowu tirhisiweke ku yi tumbuluxa.
+Loko fayili yi antswisiwile kusukela eka matshamelo ya yona yo sungula, vuxokoxoko bya yona byinga va byi cincile.',
+'metadata-fields' => "Vuxokoxoko bya xifaniso lexi nga eka hungu leri byi ta kombiwa eka tluka leri kombaka xifaniso lexi loko tafula ra nxaxamela wa vuxokoxoko ri pfariwa.
+Lebyi n'wana vuxokoxoko bya finiso byitumbetiwile.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude",
+
+# External editor support
+'edit-externally' => 'Lulamisa fayili leyi utirhisa xilulamisi xale handle ka wiki leyi',
+'edit-externally-help' => '(Vona [//www.mediawiki.org/wiki/Manual:External_editors swiletelo swo sungurisa] leswaku ukuma vuxokoxoko lebyi engetelekeke)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'Hinkwawo',
+'namespacesall' => 'Hinkwawo',
+'monthsall' => 'hikwato',
+
+# Watchlist editing tools
+'watchlisttools-view' => 'Vona kucinca loku yelanaka',
+'watchlisttools-edit' => 'Langutisa naswona u lulamisa nxaxamelo wa leswilangutiweke',
+'watchlisttools-raw' => 'Lulamisa nxaxamelo-mbisi wa leswilangutiweke',
+
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Tivonele\'\'\' mpfungulo wo hluta wa "$2" wu rhangela lowa "$1"',
 
 # Special:SpecialPages
 'specialpages' => 'Matluka yo hlawuleka',
 
+# External image whitelist
+'external_image_whitelist' => ' #Tshika ntila lowu wunga cinciwanga<pre>
+#Hoxa hlamuselo lowu tolovelekeke (xiphemu lexi nga exikarhi ka //) laha hansi
+#Swita hlanganisiwa na  tiURL to swifaniso swa le handle (leswi khwekerisiweke)
+#Leswi yelanaka swi ta kombiwa swiri swifaniso, lokoswingaritano kuta kombiwa ntsena swikhwekerisi swa xifaniso 
+#Mintila leyi sungulaka # yivona kuri ma vonele/nlhamulo
+#Xi lava marito lama xaxametiweke hi marito-nkulu na lama tsongo
+
+#hoxa swiphemu hinkwaswo swa regex ehenhla ka ntilalowu. Tshika ntila lowu wuri leswi wunga xiswona</pre>',
+
+# Special:Tags
+'tag-filter' => 'Xihluti xa [[Special:Tags|Xi angi]]:',
+
 );
index 0cea054..3015bec 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tatar (Cyrillic script) (Татарча)
+/** Tatar (Cyrillic script) (татарча)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -1104,11 +1104,11 @@ $1",
 
 # Diffs
 'history-title' => '$1 битенең үзгәртү тарихы',
-'difference' => '(Юрамалар арасында аерма)',
 'lineno' => '$1 юл:',
 'compareselectedversions' => 'Сайланган юрамаларны чагыштыру',
 'showhideselectedversions' => 'Сайланган юрамаларны күрсәтү/яшерү',
 'editundo' => 'үткәрмәү',
+'diff-multi' => '({{PLURAL:$2|бер кулланучының|$2 кулланучының}} {{PLURAL:$1|арадагы $1 версиясе күрсәтелмәгән}})',
 
 # Search results
 'searchresults' => 'Эзләү нәтиҗәләре',
@@ -1120,6 +1120,8 @@ $1",
 'notextmatches' => 'Тиңдәш текстлы битләр юк',
 'prevn' => 'алдагы {{PLURAL:$1|$1}}',
 'nextn' => 'чираттагы {{PLURAL:$1|$1}}',
+'prevn-title' => 'Алдагы $1  {{PLURAL:$1|язма}}',
+'nextn-title' => 'Киләсе $1  {{PLURAL:$1|язма}}',
 'shown-title' => 'Сәхифәдә $1 {{PLURAL:$1|язма|язма}} күрсәтелсен',
 'viewprevnext' => 'Күрсәтелүе: ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Эзләү көйләнмәләре',
@@ -1138,6 +1140,7 @@ $1",
 'searchprofile-everything-tooltip' => 'Барлык битләрдә дә эзләү',
 'searchprofile-advanced-tooltip' => 'Бирелгән исемнәр мәйданында эзләү',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сүз}})',
+'search-result-category-size' => '{{PLURAL:$1|1 әгъза|$1 әгъза}} ({{PLURAL:$2|1 асттөркем|$2 асттөркем}}, {{PLURAL:$3|1 файл|$3 файл}})',
 'search-result-score' => 'Релевантлыгы: $1 %',
 'search-redirect' => '(юнәлтү $1)',
 'search-section' => '($1 бүлеге)',
@@ -1361,7 +1364,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|үзгәртү|үзгәртү}}',
 'recentchanges' => 'Соңгы үзгәртүләр',
 'recentchanges-legend' => 'Соңгы үзгәртүләр көйләүләре',
-'recentchangestext' => 'Бу биттә {{grammar:genitive|{{SITENAME}}}} проектының соңгы үзгәртүләре күрсәтелә.',
+'recentchanges-summary' => 'Бу биттә {{grammar:genitive|{{SITENAME}}}} проектының соңгы үзгәртүләре күрсәтелә.',
 'recentchanges-feed-description' => 'Бу агымда соңгы үзгәртүләрне күзәтү.',
 'recentchanges-label-newpage' => 'Бу үзгәртү белән яңа бит төзелде',
 'recentchanges-label-minor' => 'Бу кече үзгәртү',
@@ -1633,6 +1636,7 @@ PICT # төрле
 'protectedpages' => 'Якланган битләр',
 'protectedtitles' => 'Тыелган исемнәр',
 'listusers' => 'Кулланучылар исемлеге',
+'usercreated' => '$3 $1 көнне $2 вакытта {{GENDER:$3|теркәлде}}',
 'newpages' => 'Яңа битләр',
 'newpages-username' => 'Кулланучы:',
 'ancientpages' => 'Иң иске битләр',
@@ -1740,6 +1744,7 @@ PICT # төрле
 # Watchlist
 'watchlist' => 'Күзәтү исемлегем',
 'mywatchlist' => 'Күзәтү исемлегем',
+'watchlistfor2' => '$1 $2 өчен',
 'nowatchlist' => 'Күзәтү исемлегегездә битләр юк.',
 'watchnologin' => 'Кермәдегез',
 'watchnologintext' => 'Күзәтү исемлегегезне үзгәртү өчен сез [[Special:UserLogin|керергә]] тиешсез.',
@@ -1924,6 +1929,7 @@ $1',
 'sp-contributions-talk' => 'бәхәс',
 'sp-contributions-search' => 'Кертемне эзләү',
 'sp-contributions-username' => 'Кулланучының IP адресы яки исеме:',
+'sp-contributions-toponly' => 'Соңгы версия булган үзгәртүләрне генә күрсәтергә',
 'sp-contributions-submit' => 'Эзләү',
 
 # What links here
@@ -2427,6 +2433,9 @@ $1',
 'hijri-calendar-m7' => 'Раҗәб',
 'hijri-calendar-m9' => 'Рамазан',
 
+# Core parser functions
+'duplicate-defaultsort' => 'Игътибар. Уйланма куелган "$2" бүлгәләү ачкычы элеккеге уйланма куелган "$1" бүлгәләү ачкычын үзгәртә.',
+
 # Special:Version
 'version' => 'Юрама',
 'version-extensions' => 'Куелган киңәйтүләр',
@@ -2470,6 +2479,16 @@ $1',
 'blankpage' => 'Буш бит',
 'intentionallyblankpage' => 'Бу бит махсус буш калдырылган',
 
+# External image whitelist
+'external_image_whitelist' => '#Бу юлны ничек бар, шулаө калдырыгыз<pre>
+#Монда даими фразаларның фрагментларын куегыз (// арасында торган өлешен)
+#алар тышкы сурәтләрнең URL белән бәйләнерләр.
+#Туры килгәннәре сурәт буларак, туры килмәгәннәре сурәткә сылтама буларак күрсәтеләчәкләр.
+# # билгесе белән башланучы юллар шәрехнамә дип саналалар.
+#Юллар регистрга игътибар бирмиләр.
+
+#Даими фразаларның фрагментларын бу кыр өстендә куегыз. Бу кырны ничек бар, шулай калдырыгыз.</pre>',
+
 # Special:Tags
 'tags' => 'Гамәлдә булучы үзгәртүләр билгеләре',
 'tag-filter' => '[[Special:Tags|Tag]] фильтры:',
index ad119c1..af7b3b2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Tatar (Latin script) (Tatarça)
+/** Tatar (Latin script) (tatarça)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -886,7 +886,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
 
 # Diffs
 'history-title' => '$1 biteneñ üzgärtü tarixı',
-'difference' => '(Yuramalar arasında ayırma)',
 'lineno' => '$1 yul:',
 'compareselectedversions' => 'Saylanğan yuramalarnı çağıştıru',
 'showhideselectedversions' => 'Saylanğan yuramalarnı kürsätü/yäşerü',
@@ -1137,7 +1136,7 @@ Ul $1 {{PLURAL:$1|xäreftän}} kübräk bulırğa tieş tügel.',
 'nchanges' => '$1 {{PLURAL:$1|üzgärtü|üzgärtü}}',
 'recentchanges' => 'Soñğı üzgärtülär',
 'recentchanges-legend' => 'Soñğı üzgärtülär köyläwläre',
-'recentchangestext' => 'Bu bittä {{grammar:genitive|{{SITENAME}}}} proyektınıñ soñğı üzgärtüläre kürsätelä.',
+'recentchanges-summary' => 'Bu bittä {{grammar:genitive|{{SITENAME}}}} proyektınıñ soñğı üzgärtüläre kürsätelä.',
 'recentchanges-feed-description' => 'Bu ağımda soñğı üzgärtülärne küzätü.',
 'recentchanges-label-newpage' => 'Bu üzgärtü belän yaña bit tözelde',
 'recentchanges-label-minor' => 'Bu keçe üzgärtü',
index 669acb8..6dd36aa 100644 (file)
@@ -60,22 +60,24 @@ $fallback8bitEncoding = "windows-1251";
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Холбааны шыяры:',
-'tog-justify' => 'Арынның дооразынга сөзүглелди дескилээри',
+'tog-justify' => 'Арынның дооразының аайы-биле сөзүглелди дескилээри',
 'tog-hideminor' => 'Сөөлгү өскерлиишкиннер арында бичии өскерлиишкиннерни чажырар',
 'tog-hidepatrolled' => 'Амгы өскерлиишкиннер арында истээн өскерлиишкиннерни чажырары',
 'tog-newpageshidepatrolled' => 'Чаа арыннарның даңзындан истээн арыннарны чажырары',
-'tog-usenewrc' => 'Use enhanced recent changes (JavaScript херек)',
+'tog-usenewrc' => 'Чаа өскерлиишкиннерниң өөделеттинген даңзызын ажыглаар (JavaScript херек)',
+'tog-numberheadings' => 'Эгелерин авто-санаар',
 'tog-showtoolbar' => 'Өскертир херекселдерни көргүзер (JavaScript)',
 'tog-editondblclick' => 'Арынны өскертирде ийи катап базар (JavaScript)',
 'tog-editsection' => '[өскертири] деп холбаалар-биле section editing enable.',
-'tog-rememberpassword' => 'Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|хүн|хүн}}ге чедир)',
-'tog-watchcreations' => 'Мээң чогааткан арыннарымны хайгаарал даңзымга немерелээри.',
-'tog-watchdefault' => 'Мээң өскерткен арыннарымны хайгаарал даңзымга немерелээри.',
-'tog-watchmoves' => 'Мээң шимчеткен арыннарымны хайгаарал даңзымга немерелээри.',
+'tog-rememberpassword' => 'Мени бо компьютерге сактыры ($1 {{PLURAL:$1|хүн|хүн}} ишти)',
+'tog-watchcreations' => 'Мээң чаяан арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchdefault' => 'Мээң өскерткен арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchmoves' => 'Мээң катап адаан арыннарымны хайгаарал даңзымче немээри.',
+'tog-watchdeletion' => 'Мээң казаан арыннарымны хайгаарал даңзымче немээри.',
 'tog-oldsig' => 'Амгы хол үжүү:',
-'tog-watchlisthideown' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ð¼Ñ\8dÑ\8dÒ£ Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80Ñ\8bмнÑ\8b Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
-'tog-watchlisthidebots' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ñ\80обоÑ\82Ñ\82аÑ\80нÑ\8bÒ£ Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80Ñ\8bн Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
-'tog-watchlisthideminor' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bндан Ð±Ð¸Ñ\87ии Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80нÑ\8b Ñ\87ажÑ\8bÑ\80аÑ\80Ñ\8b',
+'tog-watchlisthideown' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ñ\8dдиглеÑ\80имни Ñ\87ажÑ\8bÑ\80',
+'tog-watchlisthidebots' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ñ\80обоÑ\82Ñ\82аÑ\80нÑ\8bÒ£ Ñ\8dдиглеÑ\80ин Ñ\87ажÑ\8bÑ\80',
+'tog-watchlisthideminor' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bндан Ð±Ð¸Ñ\87ии Ñ\8dдиглеÑ\80ни Ñ\87ажÑ\8bÑ\80',
 'tog-watchlisthidepatrolled' => 'Хайгаарал даңзындан истээн өскерлиишкиннерны чажырары',
 'tog-showhiddencats' => 'Чажыт бөлүктерни көргүзери',
 
@@ -113,42 +115,43 @@ $messages = array(
 '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' => '1.ай',
-'feb' => '2.ай',
-'mar' => '3.ай',
-'apr' => '4.ай',
-'may' => '5.ай',
-'jun' => '6.ай',
-'jul' => '7.ай',
-'aug' => '8.ай',
-'sep' => '9.ай',
-'oct' => '10.ай',
-'nov' => '11.ай',
-'dec' => '12.ай',
+'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' => '1 ай',
+'feb' => '2 ай',
+'mar' => '3 ай',
+'apr' => '4 ай',
+'may' => '5 ай',
+'jun' => '6 ай',
+'jul' => '7 ай',
+'aug' => '8 ай',
+'sep' => '9 ай',
+'oct' => '10 ай',
+'nov' => '11 ай',
+'dec' => '12 ай',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Бөлүк|Бөлүктер}}',
 'category_header' => '«$1» деп бөлүктүң арыннары',
-'subcategories' => 'Ð\91иÑ\87ии бөлүктер',
-'category-media-header' => '«$1» деп бөлүкте медиа',
+'subcategories' => 'Ð\90даккÑ\8b бөлүктер',
+'category-media-header' => '«$1» деп бөлүкте файлдар',
 'category-empty' => "''Амгы бо бөлүкте медиа база арыннар чок.''",
 'hidden-categories' => '{{PLURAL:$1|Чажыт бөлүк|Чажыт бөлүктер}}',
 'hidden-category-category' => 'Чажыт бөлүктер',
-'category-subcat-count-limited' => 'Ð\91о Ð±Ó©Ð»Ò¯Ðº {{PLURAL:$1|биÑ\80|$1}} Ð±Ð¸Ñ\87ии бөлүктүү.',
+'category-subcat-count-limited' => 'Ð\91о Ð±Ó©Ð»Ò¯Ðº {{PLURAL:$1|биÑ\80|$1}} Ð°Ð´Ð°ÐºÐºÑ\8b бөлүктүү.',
 'listingcontinuesabbrev' => '(уланчы)',
 'noindex-category' => 'Индекстелбес арынар',
+'broken-file-category' => 'Ажылдавайн турар файл-шөлүлгелиг арыннар',
 
 'about' => 'Дугайында',
 'article' => 'Допчу арын',
@@ -166,6 +169,7 @@ $messages = array(
 'qbbrowse' => 'Каралаары',
 'qbedit' => 'Өскертири',
 'qbpageoptions' => 'Бо арын',
+'qbpageinfo' => 'Арын дугайында медээ',
 'qbmyoptions' => 'Мээң арыннарым',
 'qbspecialpages' => 'Тускай арыннар',
 'faq' => 'Бо-ла салыр айтырыглар (БлСА)',
@@ -176,9 +180,10 @@ $messages = array(
 'vector-action-delete' => 'Ырадыры',
 'vector-action-move' => 'Шимчээри',
 'vector-action-protect' => 'Камгалаары',
+'vector-action-undelete' => 'Эгидер',
 'vector-action-unprotect' => 'Камгалалды өскертири',
-'vector-view-create' => 'ЧогаадÑ\8bры',
-'vector-view-edit' => 'Өскертири',
+'vector-view-create' => 'ЧаÑ\8fары',
+'vector-view-edit' => 'Эдери',
 'vector-view-history' => 'Төөгүнү көөрү',
 'vector-view-view' => 'Номчууру',
 'vector-view-viewsource' => 'Дөзү бижиин көөрү',
@@ -194,18 +199,19 @@ $messages = array(
 'searchbutton' => 'Дилээри',
 'go' => 'Баары',
 'searcharticle' => 'Күүcедири',
-'history' => 'Арынның Төөгүзү',
+'history' => 'Арынның төөгүзү',
 'history_short' => 'Төөгү',
 'printableversion' => 'Саазынга үндүрерин көөрү',
 'permalink' => 'Турум холбаа',
 'print' => 'Саазынга үндүрер',
 'view' => 'Көөрү',
-'edit' => 'Өскертири',
+'edit' => 'Эдери',
 'create' => 'Чогаадыры',
 'editthispage' => 'Бо арынны өскертири',
 'create-this-page' => 'Бо арынны чогаадыры',
 'delete' => 'Ырадыры',
 'deletethispage' => 'Бо арынны ырадыры',
+'undelete_short' => '$1 {{PLURAL:$1|эдигни|эдиглерни}} катап үндүрери',
 'viewdeleted_short' => '{{PLURAL:$1|Бир ыраткан өскерлиишкинни|$1 ыраткан өскерлиишкиннерни}} көөрү',
 'protect' => 'Камгалаары',
 'protect_change' => 'өскертири',
@@ -231,7 +237,9 @@ $messages = array(
 'categorypage' => 'Бөлүктүң арынын көөрү',
 'viewtalkpage' => 'Чугааны көөрү',
 'otherlanguages' => 'Өске дылдарга',
-'lastmodifiedat' => 'Бо арын сөөлгү каттап $2, $1 өскерилген.',
+'redirectedfrom' => '($1 шигленген)',
+'redirectpagesub' => 'шигледир арын',
+'lastmodifiedat' => 'Бо арын сөөлгү катап $1, $2 өскерилген.',
 'protectedpage' => 'Камгалаган арын',
 'jumpto' => 'Шилчиир:',
 'jumptonavigation' => 'навигация',
@@ -246,17 +254,19 @@ $messages = array(
 'currentevents-url' => 'Project:Амгы үеде болуушкуннар',
 'disclaimers' => 'Ажыглаар харысаалгазын чөрчүүрү (ойталаары)',
 'disclaimerpage' => 'Project:Ажыглаар харысаалгазын ойталаары',
-'edithelp' => 'Өскертиринге дуза',
-'edithelppage' => 'Help:Өскертири',
+'edithelp' => 'Эдеринге дуза',
+'edithelppage' => 'Help:Эдери',
 'helppage' => 'Help:Допчузу',
 'mainpage' => 'Кол Арын',
 'mainpage-description' => 'Кол Арын',
-'policy-url' => 'Project:Ð\9fолиÑ\82ика',
+'policy-url' => 'Project:ЧÑ\83Ñ\80Ñ\83м',
 'portal' => 'Ниитилелдиң хаалгазы',
 'portal-url' => 'Project:Ниитилелдиң хаалгазы',
-'privacy' => 'Актыг бүзүрел дугуржулга',
+'privacy' => 'Актыг бүзүрел дугуржулгазы',
 'privacypage' => 'Project:Актыг бүзүрел дугуржулгазы',
 
+'badaccess' => 'Алдаг:Эргеңер чок.',
+
 'versionrequired' => 'МедиаВикиниң $1 үндүреризи херек',
 
 'ok' => 'Чөп',
@@ -265,12 +275,12 @@ $messages = array(
 'newmessageslink' => 'чаа чагаалар',
 'newmessagesdifflink' => 'эрткен өскерлиишкин',
 'youhavenewmessagesmulti' => '«$1» деп арында силерге чаа чагаалар бар.',
-'editsection' => 'өскертири',
-'editold' => 'өскертири',
+'editsection' => 'эдер',
+'editold' => 'эдер',
 'viewsourceold' => 'дөзү кодун көөрү',
-'editlink' => 'өскертири',
+'editlink' => 'эдер',
 'viewsourcelink' => 'дөзү кодун көөрү',
-'editsectionhint' => '«$1» деп салбырны өскертири',
+'editsectionhint' => '«$1» деп салбырны эдер',
 'toc' => 'Допчузу',
 'showtoc' => 'көргүзери',
 'hidetoc' => 'чажырары',
@@ -279,12 +289,12 @@ $messages = array(
 'viewdeleted' => '{{grammar:accusative|$1}} көөр?',
 'restorelink' => '{{PLURAL:$1|$1 балаттынган өскерилгелер}}',
 'feedlinks' => 'Агым:',
-'feed-invalid' => 'Ð\91ижидилгениң Ð°Ð³Ñ\8bм Ñ\8fнзÑ\8b багай-дыр.',
+'feed-invalid' => 'Ð\91ижидилгениң Ð°Ð³Ñ\8bм Ñ\85евиÑ\80и багай-дыр.',
 'site-rss-feed' => '$1 RSS Медээ Агымы',
 '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' => 'Арын',
@@ -318,24 +328,26 @@ Please report this to an [[Special:ListUsers/sysop|administrator]], making note
 'internalerror' => 'Иштики алдаг',
 'internalerror_info' => 'Иштики алдаг: $1',
 'badtitle' => 'Багай ат',
-'viewsource' => 'Ð\91ажÑ\8b көөрү',
+'viewsource' => 'Ð\94өзүн көөрү',
 'actionthrottled' => 'Шеглээн дүрген',
+'sqlhidden' => '(SQL айтырыгны чажырган)',
 
 # Login and logout pages
 'welcomecreation' => '== Кирип моорлаңар, $1! ==
-Your account has been created.
+Силер бүрүткел бижик has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname' => 'Aжыглакчының ады',
 'yourpassword' => 'Чажыт сөс',
 'yourpasswordagain' => 'Чажыт сөзүңерни катап бижиңер:',
 'remembermypassword' => 'Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|хүн|хүн}}ге чедир)',
 'login' => 'Кирери',
-'nav-login-createaccount' => 'Кирери / бүрүткел бижикти бүдүрери',
-'userlogin' => 'Кирери / бүрүткел бижикти бүдүрери',
+'nav-login-createaccount' => 'Кирери / бүрүткел бижикти чогаадыры',
+'userlogin' => 'Кирери / бүрүткел бижикти чогаадыры',
 'userloginnocreate' => 'Кирери',
 'logout' => 'Үнери',
 'userlogout' => 'Үнери',
 'notloggedin' => 'Кирбес',
+'nologin' => 'Силерде бүрүткел бижик чок? $1',
 'nologinlink' => 'Бүрүткел бижикти бүдүрери',
 'createaccount' => 'Бүрүткел бижикти бүдүрери',
 'gotaccount' => "Силер бүрүтекнип алдыңар де? '''$1'''.",
@@ -352,6 +364,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'mailmypassword' => 'Меңээ чаа чажыт сөсту чорудаары',
 'accountcreated' => 'Бүрүткел бижикти бүдүрген',
 'accountcreatedtext' => '«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.',
+'login-abort-generic' => 'Системаже таптыг эвес кирип тур силер',
 'loginlanguagelabel' => 'Дыл: $1',
 
 # E-mail sending
@@ -371,6 +384,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'resetpass-temp-password' => 'Түр чажыт сөс:',
 
 # Special:PasswordReset
+'passwordreset-legend' => 'Чажыт атты дүжүр',
 'passwordreset-username' => 'Aжыглакчының ады:',
 'passwordreset-domain' => 'Домен:',
 'passwordreset-email' => 'Э-чагааның адреси:',
@@ -379,6 +393,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 
 # Special:ChangeEmail
 'changeemail' => 'Э-чагааның адресин өскертири',
+'changeemail-header' => 'Бүрүткел бижиктиң э-чагааның адресин өскертири',
 'changeemail-oldemail' => 'Амгы э-чагааның адреси:',
 'changeemail-newemail' => 'Чаа э-чагааның адреси:',
 'changeemail-none' => '(чок)',
@@ -402,11 +417,12 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'image_tip' => 'Киир туткан файл',
 'media_sample' => 'Чижек.ogg',
 'media_tip' => 'Файлдың холбаазы',
+'hr_tip' => 'Доора шугум (use sparingly)',
 
 # Edit pages
 'summary' => 'Түңнел:',
 'subject' => 'Кол сөс:',
-'minoredit' => 'Бо өскерлиишкин бичии-дир',
+'minoredit' => 'Бо эдилге бичии-дир',
 'watchthis' => 'Бо арынны хайгаараары',
 'savearticle' => 'Арынны шыгжаары',
 'preview' => 'Чижеглей көөрү',
@@ -423,25 +439,31 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 
 The password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
 'newarticle' => '(Чаа)',
+'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» деп ажыглакчы is not registered.
+Please check if you want to create/edit this page.',
+'userpage-userdoesnotexist-view' => '«$1» деп ажыглакчы not registered.',
 'note' => "'''Тайылбыр:'''",
 'previewnote' => "'''Бо чүгле шенеп көөрү-дүр.'''
- Бижик ам-даа шыгжатынмаан! [[#editform|→ Continue editing]]",
-'editing' => '«$1» деп арынны өскертип турар',
-'editingsection' => '«$1» деп арынның салбырын өскертип турар',
+ Бижик ам-даа шыгжатынмаан!",
+'editing' => '«$1» деп арынны эдери',
+'editingsection' => '«$1» деп арынның салбырын эдери',
 'editingcomment' => '«$1» деп арынны өскертип турар (чаа салбыр)',
 'yourtext' => 'Силерниң сөзүглелиңер',
 'yourdiff' => 'Ылгалдар',
 'templatesused' => 'Бо арында {{PLURAL:$1|Майык|Майыктар}} ажыглаттырган:',
 'template-protected' => '(камгалаан)',
 'template-semiprotected' => '(четпес камгалаан)',
-'moveddeleted-notice' => 'Бо арын ырадыпкан.
-The deletion and move log for the page are provided below for reference.',
+'permissionserrorstext-withaction' => "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|чылдагааны|чылдагааннары}}:",
+'moveddeleted-notice' => 'Бо арын ап каавыткан.
+Адаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.',
 
 # History pages
 'viewpagelogs' => 'Бо арынның журналын көргүзери',
 'nohistory' => 'Бо арынның өскерлиишкин төөгүзү чок.',
 'currentrev' => 'Амгы үе үндүрери',
+'currentrev-asof' => 'Амгы $1 үениң бижээни',
 'revisionasof' => '$1 версиязы',
+'revision-info' => '$2 киржикчиниң $1 хүнүнде киирилдези',
 'previousrevision' => '←Артык эрги үндүрери',
 'nextrevision' => 'Артык чаа үндүрери→',
 'currentrevisionlink' => 'Амгы үе үндүрери',
@@ -489,7 +511,6 @@ The deletion and move log for the page are provided below for reference.',
 
 # Diffs
 'history-title' => '«$1» деп арынның үндүрери төөгүзү',
-'difference' => '(Үндүрерилер аранда ылгал)',
 'lineno' => 'Одуруг $1:',
 'compareselectedversions' => 'Шилип алган хевирлери деңнээри',
 'editundo' => 'чөрчүүрү',
@@ -499,24 +520,27 @@ The deletion and move log for the page are provided below for reference.',
 'searchresults-title' => '«$1» диле',
 'prevn' => 'эрткен {{PLURAL:$1|$1}}',
 'nextn' => 'дараазында {{PLURAL:$1|$1}}',
-'prevn-title' => 'Эрткен $1 {{PLURAL:$1|түңнел|түңнел}}',
-'nextn-title' => 'Дараазында $1 {{PLURAL:$1|түңнел|түңнел}}',
+'prevn-title' => 'Эрткен $1 {{PLURAL:$1|бижик|бижик}}',
+'nextn-title' => 'Дараазында $1 {{PLURAL:$1|бижик|бижик}}',
 'shown-title' => 'Арынга $1 {{PLURAL:$1|түңнелди|түңнелди}} көргүзери',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) көөрү',
-'searchmenu-new' => "'''Бо вики-проектиге «[[:$1]]» арынны чогаадыры'''",
+'searchmenu-exists' => "'''Бо викиде \"[[:\$1]]\" деп арын бар.'''",
+'searchmenu-new' => "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
 'searchhelp-url' => 'Help:Допчузу',
 'searchprofile-articles' => 'үндезин арыннар',
 'searchprofile-project' => 'Төлевилел биле дуза арыннары',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Бүгүде',
-'searchprofile-advanced' => 'делгем',
+'searchprofile-advanced' => 'Ð\9aалбаÑ\80Ñ\82Ñ\8bÑ\80Ñ\8b',
 'searchprofile-articles-tooltip' => '$1 иштинден дилээри',
 'searchprofile-project-tooltip' => '$1 иштинде дилээри',
 'searchprofile-images-tooltip' => 'Файлдар дилээри',
 'searchprofile-everything-tooltip' => 'Шупту арыннардан дилээри (сумележиишкиннерден база)',
 'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
+'search-redirect' => '(шигледир $1)',
 'search-section' => '(«$1» деп салбыр)',
+'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
 'search-mwsuggest-enabled' => 'саналдар',
 'search-mwsuggest-disabled' => 'саналдар чок',
@@ -630,7 +654,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'бо арынны номчууру',
-'action-edit' => 'бо арынны өскертири',
+'action-edit' => 'бо арынны эдери',
 'action-createpage' => 'арыннарны чогаадыры',
 'action-createtalk' => 'чугаалажырга арыннарны чогаадыры',
 'action-createaccount' => 'бо бүрүткел бижиктерин бүдүрери',
@@ -642,18 +666,20 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'nchanges' => '$1 {{PLURAL:$1|өскерлиишкин}}',
 'recentchanges' => 'Амгы өскерлиишкиннер',
 'recentchanges-legend' => 'Амгы өскерлиишкиннерниң эдиглери',
-'recentchangestext' => 'Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.',
+'recentchanges-summary' => 'Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.',
 'recentchanges-feed-description' => 'Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.',
 'recentchanges-label-newpage' => 'Бо өскерлиишкин чаа арынны чогааткан.',
 'recentchanges-label-minor' => 'Бо өскерлиишкин бичии-дир',
+'recentchanges-label-bot' => 'Бо эдилгени робот күүсетти.',
 'recentchanges-label-unpatrolled' => 'Бо өскерлиишкин истенмейн каан',
+'rclistfrom' => 'Starting from $1 чаа өскерлиишкиннерни көргүзери',
 'rcshowhideminor' => 'Бичии өскерлиишкиннерни $1',
 'rcshowhidebots' => 'Роботтарну $1',
 'rcshowhideliu' => 'Кирер ажыглакчыларны $1',
 'rcshowhideanons' => 'Ат эвес ажыглакчыларны $1',
 'rcshowhidepatr' => 'истээн өскерлиишкиннерни $1',
 'rcshowhidemine' => 'Мээң өскерлиишкинимни $1',
-'rclinks' => ' $2 буруңу хүнде $1 өскерлиишкиннерни көргүзери<br />$3',
+'rclinks' => '$2 хүнде эрткен $1 өскерлиишкиннерни көргүзери<br />$3',
 'diff' => 'ылгал',
 'hist' => 'төөгү',
 'hide' => 'чажырары',
@@ -669,6 +695,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Recent changes linked
 'recentchangeslinked' => 'Хамааржыр өскерлиишкиннер',
 'recentchangeslinked-toolbox' => 'Хамааржыр өскерлиишкиннер',
+'recentchangeslinked-title' => '«$1» деп арынга хамаарыштырган өскерлиишкиннер',
 'recentchangeslinked-page' => 'Арынның ады:',
 
 # Upload
@@ -713,7 +740,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'filehist-revert' => 'эгидип тургузары',
 'filehist-current' => 'амгы',
 'filehist-datetime' => 'Ай, Хүн/Шак',
-'filehist-thumb' => 'Бичии чурук',
+'filehist-thumb' => 'Бичии чурумал',
+'filehist-thumbtext' => 'Бичии чурумал for version as of $1',
 'filehist-user' => 'Ажыглакчы',
 'filehist-dimensions' => 'Хемчээлдери',
 'filehist-filesize' => 'Файл хемчээли',
@@ -735,6 +763,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'filedelete-reason-otherlist' => 'Өске чылдагаан',
 
 # MIME search
+'mimetype' => 'MIME хевири:',
 'download' => 'алыры',
 
 # Unwatched pages
@@ -751,6 +780,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'statistics' => 'Статистика',
 'statistics-pages' => 'Арыннар',
 
+'disambiguationspage' => 'Майык: уш-бажы билдинмес',
+
 'brokenredirects-edit' => 'өскертири',
 'brokenredirects-delete' => 'ырадыры',
 
@@ -782,10 +813,12 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'mostlinkedtemplates' => 'Эң холбаалар майыктар',
 'mostcategories' => 'Эңне бөлүктер арыннар',
 'mostimages' => 'Эң холбаалар файлдар',
+'prefixindex' => 'Арыннарның эгезиниң аайы-биле айтыкчы',
 'shortpages' => 'Чолдак арыннар',
 'longpages' => 'Узун арыннар',
 'protectedpages' => 'Камгалаган арыннар',
 'listusers' => 'Ажыглакчылар даңзызы',
+'usereditcount' => '$1 {{PLURAL:$1|эдилге}}',
 'newpages' => 'Чаа арыннар',
 'newpages-username' => 'Ажыглакчының ады:',
 'ancientpages' => 'Эң эрги арыннар',
@@ -800,7 +833,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'booksources-go' => 'Күүcедири',
 
 # Special:Log
-'specialloguserlabel' => 'Ð\90жÑ\8bглакÑ\87Ñ\8b:',
+'specialloguserlabel' => 'Ð\9aÒ¯Ò¯Ñ\81едикÑ\87и:',
 'speciallogtitlelabel' => 'Target (aтка азы ажыглакчыга):',
 'log' => 'Журналдар',
 
@@ -817,6 +850,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Special:Categories
 'categories' => 'Бөлүктер',
 
+# Special:DeletedContributions
+'sp-deletedcontributions-contribs' => 'салыышкыннар',
+
 # Special:LinkSearch
 'linksearch' => 'Даштыкы холбааларга дилээри',
 'linksearch-ns' => 'Аттар делгеми:',
@@ -857,6 +893,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'watchthispage' => 'Бо арынны хайгаараары',
 'unwatch' => 'Хайгааравас',
 'unwatchthispage' => 'Бо арынны хайгаарабас',
+'watchlist-details' => 'Not counting talk pages, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.',
 'wlshowlast' => 'Сөөлү $1 шак болгаш $2 хүн иштинде $3 көргүзери',
 'watchlist-options' => 'Хайгаарал даңзының эдиглери',
 
@@ -866,6 +903,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 'enotif_newpagetext' => 'Бо чаа арын-дыр.',
 'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} ажыглакчызы',
+'changed' => 'өскертти',
 'enotif_anon_editor' => 'ат эвес ажыглакчы $1',
 
 # Delete
@@ -912,39 +950,49 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'blanknamespace' => '(Кол)',
 
 # Contributions
-'contributions' => 'Ажыглакчыниң немелделери',
-'contributions-title' => '«$1» деп ажыглакчының немелделери',
-'mycontris' => 'Мээң немелделерим',
+'contributions' => 'Ажыглакчыниң салыышкыннары',
+'contributions-title' => '«$1» деп ажыглакчының салыышкыннары',
+'mycontris' => 'Мээң салыышкыннарым',
 'contribsub2' => '$1 ($2)',
 'uctop' => '(баш)',
 'month' => 'Айдан:',
 'year' => 'Чылдан:',
 
-'sp-contributions-newbies' => 'Чүгле Ñ\87аа ÐºÐ¸Ñ\80еÑ\80илеÑ\80ниң Ð½ÐµÐ¼ÐµÐ»Ð´ÐµÐ»ÐµÑ\80ин ÐºÓ©Ñ\80гүзеÑ\80н',
+'sp-contributions-newbies' => 'Чүгле Ñ\87аа ÐºÐµÐ¶Ð¸Ð³Ò¯Ð½Ð½ÐµÑ\80ниң Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8bн ÐºÓ©Ñ\80гүзеÑ\80и',
 'sp-contributions-blocklog' => 'кызыгаарлаашкынның журналы',
 'sp-contributions-uploads' => 'киирген чүүлдер',
 'sp-contributions-logs' => 'журналдар',
 'sp-contributions-talk' => 'чугаалажыры',
-'sp-contributions-search' => 'Ð\9dемелделеÑ\80ин дилээри',
+'sp-contributions-search' => 'СалÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8bн дилээри',
 'sp-contributions-username' => 'ИП-адрес азы ажыглачының ады:',
 'sp-contributions-submit' => 'Дилээри',
 
 # What links here
 'whatlinkshere' => 'Шөлүлгелерни бээр',
+'whatlinkshere-title' => '«$1» деп арынга шөлүтген арыннар',
 'whatlinkshere-page' => 'Арын:',
+'nolinkshere' => "'''[[:$1]]''' деп арынга шөлүтген арыннар чок.",
+'isredirect' => 'шиглидер арын',
+'istemplate' => 'киирткен арыннар',
 'isimage' => 'файлдың холбаазы',
 'whatlinkshere-prev' => '{{PLURAL:$1|эрткен|эрткен $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|дараазында|дараазында $1}}',
 'whatlinkshere-links' => '← холбаалар',
+'whatlinkshere-hideredirs' => '$1-че шиглиглер',
+'whatlinkshere-hidetrans' => '$1 даңзылааннар',
 'whatlinkshere-hidelinks' => 'холбааларны $1',
 'whatlinkshere-hideimages' => 'Чурумалдың холбааларын $1',
 'whatlinkshere-filters' => 'Шүүрлер',
 
 # Block/unblock
+'block' => 'Ажыглакчыны кызыгаарлаары',
 'blockip' => 'Ажыглакчыны кызыгаарлаары',
+'blockip-title' => 'Ажыглакчыны кызыгаарлаары',
+'blockip-legend' => 'Ажыглакчыны кызыгаарлаары',
 'ipadressorusername' => 'ИП-адрес азы aжыглaкчының aды',
 'ipbreason' => 'Чылдагаан:',
 'ipbreasonotherlist' => 'Өске чылдагаан',
+'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' => 'өске',
@@ -955,8 +1003,9 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'ipblocklist-submit' => 'Дилээр',
 'infiniteblock' => 'кезээ-мөңгеде',
 'blocklink' => 'кызыгаарлаары',
+'unblocklink' => 'ажыдып хостаар',
 'change-blocklink' => 'кызыгаарлаашкынны өскертири',
-'contribslink' => 'немелделер',
+'contribslink' => 'салыышкыннар',
 'blocklogpage' => 'Кызыгаарлаашкынның журналы',
 'blocklogentry' => ', [[$1]] $2 дургузунда кызыгаарлаттынган: $3',
 'block-log-flags-anononly' => 'чүгле ат эвес ажыглакчылар',
@@ -995,6 +1044,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Thumbnails
 'thumbnail-more' => 'Улгаттыр',
+'thumbnail_error' => 'Error creating бичии чурумал: $1',
 
 # Special:Import
 'import-comment' => 'Тайылбыр:',
@@ -1006,11 +1056,11 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-pt-userpage' => 'Силерниң ажыглакчы арыныңнар',
 'tooltip-pt-mytalk' => 'Силерниң чугаалажыр арыныңар',
 'tooltip-pt-preferences' => 'Силерниң шилилгеңер',
-'tooltip-pt-mycontris' => 'Силерниң немелделериңерның даңзызы',
+'tooltip-pt-mycontris' => 'Силерниң салыышкыннарыңарның даңзызы',
 'tooltip-pt-login' => 'Маңаа системаже киир бүрүткенип болур, ынчалза-даа ол албан эвес.',
 'tooltip-pt-logout' => 'Үнери',
 'tooltip-ca-talk' => 'Бо арын дугайында чыгаалажыры',
-'tooltip-ca-edit' => 'Силер бо арынны өскертип болур. Шыгжаар мурунда чижеглеп көрем.',
+'tooltip-ca-edit' => 'Силер бо арынны эдип болур. Шыгжаар мурунда чижеглеп көрем.',
 'tooltip-ca-addsection' => 'Чаа салбыр чаяар',
 'tooltip-ca-viewsource' => 'Бо арын камгалаттырган.
 Дөзү кодун көрүп болур силер.',
@@ -1030,10 +1080,11 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-n-recentchanges' => 'Викиниң энир өскерлиишкиннери',
 'tooltip-n-randompage' => 'Душ арынны көөрү',
 'tooltip-n-help' => 'Төлевилелдиң тайылбыры «{{SITENAME}}»',
+'tooltip-t-whatlinkshere' => 'Бүгү маңаа шөлүтген вики арыннарның даңзызы',
 'tooltip-t-recentchangeslinked' => 'Бо арындан шөлүткен өске арыннарның сөөлгү өскерлиишкиннери',
 'tooltip-feed-rss' => 'Бо арының РСС медээ агымы',
 'tooltip-feed-atom' => 'Бо арының Атом медээ агымы',
-'tooltip-t-contributions' => 'Бо ажыглакчының немелделериниң даңзазын көөрү.',
+'tooltip-t-contributions' => 'Бо ажыглакчының салыышкыннарының даңзазын көөрү.',
 'tooltip-t-emailuser' => 'Бо ажыглакчыга э-чагааны чорудаары',
 'tooltip-t-upload' => 'Файлдарны киирери',
 'tooltip-t-specialpages' => 'Шупту тускай арыннар даңзызы',
@@ -1075,9 +1126,14 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'nextdiff' => 'Артык чаа үндүрери →',
 
 # Media information
+'thumbsize' => 'Бичии чурумалдың хемчээли:',
 'widthheightpage' => '$1x$2, $3 {{PLURAL:$3|арын}}',
-'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME янзызы: $4',
+'file-info' => 'файлдың хемчээли: $1, MIME хевири: $2',
+'file-info-size' => '$1 × $2 пиксел, Файл хемчээли: $3, MIME хевири: $4',
+'file-info-size-pages' => '$1 × $2 пикcелдер, файл хемчээли: $3, MIME хевири: $4, $5 {{PLURAL:$5|арын|арын}}',
+'file-nohires' => 'Оон улуг хевири чок',
 'svg-long-desc' => 'SVG файл, $1 x $2 пиксел, файл хемчээли: $3',
+'show-big-image' => 'Улуг чурумал',
 'show-big-image-size' => '$1 × $2 пиксел',
 
 # Special:NewFiles
@@ -1086,6 +1142,31 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'noimages' => 'Nothing to see.',
 'ilsubmit' => 'Дилээр',
 
+# 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 бурунгаар',
+
+# Metadata
+'metadata' => 'Чурумал дугайында медээлер',
+'metadata-fields' => 'Чурумал дугайында медээлер listed in this message will be included on image page display when the metadata table is collapsed.
+Others will be hidden by default.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
 # EXIF tags
 'exif-imagewidth' => 'Калбаа',
 'exif-imagelength' => 'Бедик',
@@ -1094,21 +1175,38 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'exif-usercomment' => 'Ажыглакчының тайылбырлары',
 'exif-jpegfilecomment' => 'JPEG фалй тайылбыры',
 'exif-headline' => 'Баш ат',
+'exif-languagecode' => 'Дыл',
 'exif-pngfilecomment' => 'PNG фалй тайылбыры',
 'exif-giffilecomment' => 'GIF фалй тайылбыры',
 
 'exif-subjectdistancerange-2' => 'Чоок көрүш',
 'exif-subjectdistancerange-3' => 'ырак көрүш',
 
+'exif-dc-type' => 'Медиа хевири',
+
+'exif-iimcategory-sci' => 'Эртем база техника',
+'exif-iimcategory-spo' => 'Спорт',
+'exif-iimcategory-wea' => 'Агаар',
+
+# External editor support
+'edit-externally' => 'Бо файлды даштыки application-биле эдер',
+
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'шупту',
 'namespacesall' => 'шупту',
 'monthsall' => 'шупту',
 'limitall' => 'шупту',
 
+# Delete conflict
+'recreate' => 'Катап чогаадыры',
+
 # action=purge
 'confirm_purge_button' => 'Чөп',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Чөп',
+'confirm-unwatch-button' => 'Чөп',
+
 # Multipage image navigation
 'imgmultipageprev' => '← эрткен арын',
 'imgmultipagenext' => 'дараазында арын →',
@@ -1134,7 +1232,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Даңзы арыннарының өскерлиишкиннери',
-'watchlisttools-edit' => 'Хайгаарал даңзыны көөрү болгаш өскертири',
+'watchlisttools-edit' => 'Хайгаарал даңзыны көөрү/эдери',
 'watchlisttools-raw' => 'Чиг хайгаарал даңзыны өскертири',
 
 # Special:Version
@@ -1150,11 +1248,12 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлдың ады:',
 'fileduplicatesearch-submit' => 'Дилээри',
-'fileduplicatesearch-info' => '$1 Ã\97 $2 Ð¿Ð¸ÐºÑ\81ел<br />Файл Ñ\85емÑ\87Ñ\8dÑ\8dли: $3<br />MIME Ñ\8fнзÑ\8bзÑ\8b: $4',
+'fileduplicatesearch-info' => '$1 Ã\97 $2 Ð¿Ð¸ÐºÑ\81ел<br />Файл Ñ\85емÑ\87Ñ\8dÑ\8dли: $3<br />MIME Ñ\85евиÑ\80и: $4',
 
 # Special:SpecialPages
 'specialpages' => 'Тускай арыннар',
 'specialpages-group-other' => 'Өске тускай арыннар',
+'specialpages-group-pages' => 'Арыннарның даңзызы',
 'specialpages-group-pagetools' => 'Арын херекселдери',
 
 # Special:BlankPage
@@ -1165,6 +1264,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tag-filter-submit' => 'Шүүрү',
 'tags-title' => 'Демдеглелдер',
 'tags-edit' => 'өскертири',
+'tags-hitcount' => '$1 {{PLURAL:$1|өскерлиишкин}}',
 
 # Special:ComparePages
 'comparepages' => 'Арыннарны дөмейлеп көөрү',
@@ -1182,4 +1282,14 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'feedback-message' => 'Чагаа:',
 'feedback-cancel' => 'Соксаары',
 
+# 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|чүс чыл|чүс чыл}}',
+
 );
index a3e3934..1c5a17c 100644 (file)
@@ -40,7 +40,7 @@ $namespaceGenderAliases = array();
 
 $linkTrail = '/^([a-zа-яёӝӟӥӧӵ“»]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1251';
-$separatorTransformTable = array( ',' => ' ', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $messages = array(
 # User preference toggles
index 354dff7..2423ec2 100644 (file)
@@ -1005,7 +1005,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" نىڭ ئۆزگەرتىش خاتىرىسى',
-'difference' => '(تۈزەتكەن نەشرىلىرىنىڭ پەرقى)',
 'difference-multipage' => '(بەتلەر ئارىسىدىكى پەرق)',
 'lineno' => '$1 -قۇر:',
 'compareselectedversions' => 'تاللانغان نەشرىنى سېلىشتۇر',
@@ -1365,7 +1364,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'nchanges' => '$1 {{PLURAL:$1|ئۆزگەرتىش|ئۆزگەرتىش}}',
 'recentchanges' => 'يېقىنقى ئۆزگەرتىشلەر',
 'recentchanges-legend' => 'يېقىنقى ئۆزگەرتىش تاللانمىسى',
-'recentchangestext' => 'بۇ wiki نىڭ يېقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
+'recentchanges-summary' => 'بۇ wiki نىڭ يېقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
 'recentchanges-feed-description' => 'بۇ قانالنىڭ wiki دىكى يېقىنقى ئۆزگىرىشىنى ئىز قوغلا.',
 'recentchanges-label-newpage' => 'بۇ قېتىملىق تەھىر يېڭى بەتتىن بىرنى قۇرىدۇ',
 'recentchanges-label-minor' => 'بۇ ئازراقلا تەھرىرلەش',
index e4ffdb9..4d1ce94 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Ukrainian (Українська)
+/** Ukrainian (українська)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Sodmy
  * @author Urhixidur
  * @author VolodymyrF
+ * @author Vox
  * @author Yuriy Apostol
  * @author Дар'я Козлова
  * @author Тест
  */
 
-/**
- * УВАГА! НЕ РЕДАГУЙТЕ ЦЕЙ ФАЙЛ!
- *
- * Якщо необхідно змінити переклад окремих частин інтерфейсу,
- * то це можна зробити редагуючи сторінки типу «MediaWiki:*».
- * Їх список можна знайти на сторінці «Special:Allmessages».
- */
-
 $separatorTransformTable = array(
        ',' => "\xc2\xa0", # nbsp
        '.' => ','
@@ -108,6 +101,104 @@ $bookstoreList = array(
        'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Активні_учасники' ),
+       'Allmessages'               => array( 'Системні_повідомлення' ),
+       'Allpages'                  => array( 'Усі_сторінки' ),
+       'Ancientpages'              => array( 'Давні_сторінки' ),
+       'Badtitle'                  => array( 'Помилковий_заголовок' ),
+       'Blankpage'                 => array( 'Порожня_сторінка' ),
+       'Block'                     => array( 'Заблокувати' ),
+       'Blockme'                   => array( 'Заблокуйте_мене' ),
+       'Booksources'               => array( 'Джерела_книг' ),
+       'BrokenRedirects'           => array( 'Розірвані_перенаправлення' ),
+       'Categories'                => array( 'Категорії' ),
+       'ChangeEmail'               => array( 'Змінити_e-mail' ),
+       'ChangePassword'            => array( 'Змінити_пароль' ),
+       'ComparePages'              => array( 'Порівняння_сторінок' ),
+       'Confirmemail'              => array( 'Підтвердити_e-mail' ),
+       'Contributions'             => array( 'Внесок' ),
+       'CreateAccount'             => array( 'Створити_обліковий_запис' ),
+       'Deadendpages'              => array( 'Сторінки_без_посилань' ),
+       'DeletedContributions'      => array( 'Вилучений_внесок' ),
+       'Disambiguations'           => array( 'Неоднозначні_посилання' ),
+       'DoubleRedirects'           => array( 'Подвійні_перенаправлення' ),
+       'EditWatchlist'             => array( 'Правити_список_спостереження' ),
+       'Emailuser'                 => array( 'Лист_користувачеві' ),
+       'Export'                    => array( 'Експорт' ),
+       'Fewestrevisions'           => array( 'Найменші_перевірки' ),
+       'FileDuplicateSearch'       => array( 'Пошук_дублікатів_файлів' ),
+       'Filepath'                  => array( 'Шлях_до_файлу' ),
+       'Import'                    => array( 'Імпорт' ),
+       'Invalidateemail'           => array( 'Нечинна_e-mail' ),
+       'BlockList'                 => array( 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес' ),
+       'LinkSearch'                => array( 'Пошук_посилань' ),
+       'Listadmins'                => array( 'Список_адміністраторів' ),
+       'Listbots'                  => array( 'Список_ботів' ),
+       'Listfiles'                 => array( 'Список_файлів' ),
+       'Listgrouprights'           => array( 'Список_прав_груп', 'Права_груп_користувачів' ),
+       'Listredirects'             => array( 'Список_перенаправлень' ),
+       'Listusers'                 => array( 'Список_користувачів' ),
+       'Lockdb'                    => array( 'Заблокувати_базу_даних' ),
+       'Log'                       => array( 'Журнали' ),
+       'Lonelypages'               => array( 'Ізольовані_сторінки' ),
+       'Longpages'                 => array( 'Найдовші_сторінки' ),
+       'MergeHistory'              => array( 'Об\'єднання_історії' ),
+       'MIMEsearch'                => array( 'Пошук_по_MIME' ),
+       'Mostcategories'            => array( 'Найкатегоризовуваніші' ),
+       'Mostimages'                => array( 'Найбільш_використовувані_файли' ),
+       'Mostlinkedcategories'      => array( 'Найуживаніші_категорії' ),
+       'Mostlinkedtemplates'       => array( 'Найуживаніші_шаблони' ),
+       'Mostrevisions'             => array( 'Найбільш_редаговані' ),
+       'Movepage'                  => array( 'Перейменувати' ),
+       'Mycontributions'           => array( 'Мій_внесок' ),
+       'Mypage'                    => array( 'Моя_сторінка' ),
+       'Mytalk'                    => array( 'Моє_обговорення' ),
+       'Myuploads'                 => array( 'Мої_завантаження' ),
+       'Newimages'                 => array( 'Нові_файли' ),
+       'Newpages'                  => array( 'Нові_сторінки' ),
+       'PasswordReset'             => array( 'Скинути_пароль' ),
+       'PermanentLink'             => array( 'Постійне_посилання' ),
+       'Popularpages'              => array( 'Популярні_сторінки' ),
+       'Preferences'               => array( 'Налаштування' ),
+       'Protectedpages'            => array( 'Захищені_сторінки' ),
+       'Protectedtitles'           => array( 'Захищені_назви_сторінок' ),
+       'Randompage'                => array( 'Випадкова_сторінка' ),
+       'Randomredirect'            => array( 'Випадкове_перенаправлення' ),
+       'Recentchanges'             => array( 'Нові_редагування' ),
+       'Recentchangeslinked'       => array( 'Пов\'язані_редагування' ),
+       'Revisiondelete'            => array( 'Перевірити_видалення' ),
+       'Search'                    => array( 'Пошук' ),
+       'Shortpages'                => array( 'Короткі_сторінки' ),
+       'Specialpages'              => array( 'Спеціальні_сторінки' ),
+       'Statistics'                => array( 'Статистика' ),
+       'Tags'                      => array( 'Мітки' ),
+       'Unblock'                   => array( 'Розблокувати' ),
+       'Uncategorizedcategories'   => array( 'Некатегоризовані_категорії' ),
+       'Uncategorizedimages'       => array( 'Некатегоризовані_файли' ),
+       'Uncategorizedpages'        => array( 'Некатегоризовані_сторінки' ),
+       'Uncategorizedtemplates'    => array( 'Некатегоризовані_шаблони' ),
+       'Undelete'                  => array( 'Відновити' ),
+       'Unlockdb'                  => array( 'Розблокувати_базу_даних' ),
+       'Unusedcategories'          => array( 'Порожні_категорії' ),
+       'Unusedimages'              => array( 'Невикористовувані_файли' ),
+       'Unusedtemplates'           => array( 'Невикористовувані_шаблони' ),
+       'Unwatchedpages'            => array( 'Неспостережувані' ),
+       'Upload'                    => array( 'Завантаження' ),
+       'UploadStash'               => array( 'Приховане_завантаження' ),
+       'Userlogin'                 => array( 'Вхід' ),
+       'Userlogout'                => array( 'Вихід' ),
+       'Userrights'                => array( 'Керування_правами_користувачів' ),
+       'Version'                   => array( 'Версія' ),
+       'Wantedcategories'          => array( 'Потрібні_категорії' ),
+       'Wantedfiles'               => array( 'Потрібні_файли' ),
+       'Wantedpages'               => array( 'Потрібні_сторінки' ),
+       'Wantedtemplates'           => array( 'Потрібні_шаблони' ),
+       'Watchlist'                 => array( 'Список_спостереження' ),
+       'Whatlinkshere'             => array( 'Посилання_сюди' ),
+       'Withoutinterwiki'          => array( 'Без_інтервікі' ),
+);
+
 $magicWords = array(
        'redirect'                => array( '0', '#ПЕРЕНАПРАВЛЕННЯ', '#ПЕРЕНАПР', '#перенапр', '#перенаправление', '#REDIRECT' ),
        'notoc'                   => array( '0', '__БЕЗ_ЗМІСТУ__', '__БЕЗ_ОГЛАВЛЕНИЯ__', '__БЕЗ_ОГЛ__', '__NOTOC__' ),
@@ -262,10 +353,10 @@ $messages = array(
 'tog-hideminor' => 'Ховати незначні редагування у списку останніх змін',
 'tog-hidepatrolled' => 'Приховувати патрульовані редагування у списку нових редагувань',
 'tog-newpageshidepatrolled' => 'Приховувати патрульовані сторінки у списку нових сторінок',
-'tog-extendwatchlist' => 'РозÑ\88иÑ\80ений Ñ\81пиÑ\81ок Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f, Ñ\89о Ð²ÐºÐ»Ñ\8eÑ\87аÑ\94 Ð²сі зміни, а не лише останню',
-'tog-usenewrc' => 'Ð\92икоÑ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð¿Ð¾ÐºÑ\80аÑ\89ений Ñ\81пиÑ\81ок Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96н (JavaScript)',
+'tog-extendwatchlist' => 'РозÑ\88иÑ\80ений Ñ\81пиÑ\81ок Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f, Ñ\89о Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\83сі зміни, а не лише останню',
+'tog-usenewrc' => 'Ð\9dа Ñ\81Ñ\82оÑ\80Ñ\96нкаÑ\85 Ð¾Ñ\81Ñ\82аннÑ\96Ñ\85 Ð·Ð¼Ñ\96н Ñ\82а Ð² Ñ\81пиÑ\81кÑ\83 Ñ\81поÑ\81Ñ\82еÑ\80еженнÑ\8f Ð³Ñ\80Ñ\83пÑ\83ваÑ\82и Ñ\80едагÑ\83ваннÑ\8f (поÑ\82Ñ\80Ñ\96бен JavaScript)',
 'tog-numberheadings' => 'Автоматично нумерувати заголовки',
-'tog-showtoolbar' => 'Показувати панель інструментів при редагуванні (JavaScript)',
+'tog-showtoolbar' => 'Показувати панель інструментів (JavaScript)',
 'tog-editondblclick' => 'Редагувати сторінки при подвійному клацанні мишкою (JavaScript)',
 'tog-editsection' => 'Показувати посилання [ред.] для кожного розділу',
 'tog-editsectiononrightclick' => 'Редагувати розділи при клацанні правою кнопкою мишки на заголовку (JavaScript)',
@@ -277,7 +368,7 @@ $messages = array(
 'tog-watchdeletion' => 'Додавати вилучені мною сторінки до мого списку спостереження',
 'tog-minordefault' => 'Спочатку позначати всі зміни незначними',
 'tog-previewontop' => 'Показувати попередній перегляд перед вікном редагування, а не після',
-'tog-previewonfirst' => 'Ð\9fоказÑ\83ваÑ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ð¿Ñ\80и Ð¿ÐµÑ\80Ñ\88омÑ\83 Ñ\80едагÑ\83ваннÑ\96',
+'tog-previewonfirst' => 'Ð\9fоказÑ\83ваÑ\82и Ð¿Ð¾Ð¿ÐµÑ\80еднÑ\96й Ð¿ÐµÑ\80еглÑ\8fд Ð¿Ñ\96д Ñ\87аÑ\81 Ð¿ÐµÑ\80Ñ\88ого Ñ\80едагÑ\83ваннÑ\8f',
 'tog-nocache' => 'Відключити кешування сторінок браузером',
 'tog-enotifwatchlistpages' => 'Повідомляти електронною поштою, коли сторінка з мого списку спостереження змінилася',
 'tog-enotifusertalkpages' => 'Повідомляти електронною поштою про зміну моєї сторінки обговорення',
@@ -298,7 +389,7 @@ $messages = array(
 'tog-watchlisthideanons' => 'Ховати редагування анонімів у списку спостереження',
 'tog-watchlisthidepatrolled' => 'Приховувати патрульовані редагування у списку спостререження',
 'tog-nolangconversion' => 'Відключити перетворення систем письма',
-'tog-ccmeonemails' => 'Ð\92Ñ\96дпÑ\80авлÑ\8fти мені копії листів, які я надсилаю іншим користувачам',
+'tog-ccmeonemails' => 'Ð\9dадÑ\81илати мені копії листів, які я надсилаю іншим користувачам',
 'tog-diffonly' => 'Не показувати вміст сторінки під різницею версій',
 'tog-showhiddencats' => 'Показувати приховані категорії',
 'tog-noconvertlink' => 'Вимкнути конвертацію назви посилання',
@@ -375,11 +466,11 @@ $messages = array(
 'category-empty' => "''Ця категорія зараз порожня.''",
 'hidden-categories' => '{{PLURAL:$1|Прихована категорія|Приховані категорії}}',
 'hidden-category-category' => 'Приховані категорії',
-'category-subcat-count' => '{{PLURAL:$1|Показана $1 підкатегорія|Показані $1 підкатегорії|Показані $1 підкатегорій}} із $2.',
+'category-subcat-count' => 'Показано $1 {{PLURAL:$1|підкатегорію з|підкатегорії з|підкатегорій із}} $2.',
 'category-subcat-count-limited' => 'У цій категорії {{PLURAL:$1|$1 підкатегорія|$1 підкатегорії|$1 підкатегорій}}.',
-'category-article-count' => '{{PLURAL:$1|Показана $1 сторінка|Показані $1 сторінки|Показані $1 сторінок}} цієї категорії з $2.',
+'category-article-count' => 'Показано $1 {{PLURAL:$1|сторінку|сторінки|сторінок}} цієї категорії (із $2).',
 'category-article-count-limited' => 'У цій категорії {{PLURAL:$1|$1 сторінка|$1 сторінки|$1 сторінок}}.',
-'category-file-count' => '{{PLURAL:$2|Ця категорія містить $2 файл.|{{PLURAL:$1|Показаний $1 файл|Показані $1 файли|Показані $1 файлів}} цієї категорії з $2.}}',
+'category-file-count' => 'Показано $1 {{PLURAL:$1|файл|файли|файлів}} цієї категорії (із $2).',
 'category-file-count-limited' => 'У цій категорії {{PLURAL:$1|$1 файл|$1 файли|$1 файлів}}.',
 'listingcontinuesabbrev' => '(прод.)',
 'index-category' => 'Індексовані сторінки',
@@ -487,7 +578,7 @@ $messages = array(
 Будь ласка, почекайте і повторіть спробу отримати доступ пізніше.
 
 $1',
-'pool-timeout' => 'ЧаÑ\81 Ð¾Ñ\87Ñ\8bкування блокування вичерпано',
+'pool-timeout' => 'ЧаÑ\81 Ð¾Ñ\87Ñ\96кування блокування вичерпано',
 'pool-queuefull' => 'Сервер запитів заповнений',
 'pool-errorunknown' => 'Невідома помилка',
 
@@ -636,7 +727,7 @@ $1',
 'actionthrottledtext' => 'Як захід боротьби зі спамом, установлено обмеження на багаторазове застосування цієї дії протягом короткого проміжку часу. Будь ласка, повторіть спробу через кілька хвилин.',
 'protectedpagetext' => 'Ця сторінка закрита для редагування.',
 'viewsourcetext' => 'Ви можете переглянути та скопіювати початковий текст цієї сторінки:',
-'viewyourtext' => "Ви можете переглянути або скопіювати вихідний текст '''ваших редагувань''' на цю сторінку:",
+'viewyourtext' => "Ви можете переглянути та скопіювати текст '''ваших редагувань''' на цій сторінці:",
 'protectedinterface' => 'Ця сторінка є частиною інтерфейсу програмного забезпечення і її можуть редагувати лише адміністратори проекту.',
 'editinginterface' => "'''Увага:''' Ви редагуєте сторінку, що є частиною текстового інтерфейсу. Зміни цієї сторінки викличуть зміну інтерфейсу для інших користувачів. Для перекладу повідомлення використовуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проект, що займається локалізацією MediaWiki.",
 'sqlhidden' => '(SQL запит приховано)',
@@ -647,8 +738,11 @@ $1',
 'ns-specialprotected' => 'Спеціальні сторінки не можна редагувати.',
 'titleprotected' => "Створення сторінки з такою назвою було заборонене користувачем [[User:$1|$1]].
 Зазначена наступна причина: ''$2''.",
-'filereadonlyerror' => 'Не вдалося змінити файл «$1» тому, що файловий архів «$2» знаходиться в режимі «лише для читання».
-Вказана причина — «$3».',
+'filereadonlyerror' => "Неможливо змінити файл «$1» тому, що файловий архів «$2» перебуває в режимі «лише для читання».
+Адміністратор, що заблокував його, залишив таке пояснення: «''$3''».",
+'invalidtitle-knownnamespace' => 'Неприйнятна назва у просторі імен «$2» і текстом «$3»',
+'exception-nologin' => 'Не виконано вхід',
+'exception-nologin-text' => 'Ця сторінка чи дія потребує, щоб Ви ввійшли до цієї Вікі.',
 
 # Virus scanner
 'virus-badscanner' => "Помилка налаштування: невідомий сканер вірусів: ''$1''",
@@ -679,7 +773,7 @@ $1',
 'notloggedin' => 'Ви не ввійшли до системи',
 'nologin' => "Ви ще не зареєструвались? '''$1'''.",
 'nologinlink' => 'Створіть обліковий запис',
-'createaccount' => 'СÑ\82воÑ\80иÑ\82и',
+'createaccount' => 'Ð\97аÑ\80еÑ\94Ñ\81Ñ\82Ñ\80Ñ\83ваÑ\82иÑ\81Ñ\8f',
 'gotaccount' => "Ви вже зареєстровані? '''$1'''.",
 'gotaccountlink' => 'Увійдіть',
 'userlogin-resetlink' => 'Забули дані, потрібні для входу?',
@@ -745,6 +839,7 @@ $1',
 'invalidemailaddress' => 'Уведена адреса не може бути прийнята, бо вона не відповідає формату адрес електронної пошти.
 Будь ласка, введіть коректну адресу або залиште поле порожнім.',
 'cannotchangeemail' => 'У цій вікі не можна міняти свою адресу ел. пошти.',
+'emaildisabled' => 'Цей сайт не може надіслати електронні листи.',
 'accountcreated' => 'Обліковий запис створено.',
 'accountcreatedtext' => 'Обліковий запис для $1 створено.',
 'createaccount-title' => 'Створення облікового запису для {{SITENAME}}',
@@ -922,12 +1017,12 @@ $2
 'userpage-userdoesnotexist-view' => 'Обліковий запис користувача „$1“ не зареєстровано.',
 'blocked-notice-logextract' => 'Цей користувач наразі заблокований.
 Останній запис у журналі блокувань такий:',
-'clearyourcache' => "'''Ð\97аÑ\83важеннÑ\8f:''' Ð¿Ñ\96Ñ\81лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ð\92и Ð¼Ð°Ñ\94Ñ\82е Ñ\83никнÑ\83Ñ\82и Ð·Ð°Ð²Ð°Ð½Ñ\82аженнÑ\8f Ð· ÐºÐµÑ\88Ñ\83 Ð²Ð°Ñ\88ого браузера, щоб побачити зміни.
-* '''Firefox / Safari:''' тримайте ''Shift'', коли натискаєте ''Reload'' або натисніть ''Ctrl-F5'' або ''Ctrl-R'' (''⌘-R'' на Apple Mac)
+'clearyourcache' => "'''Увага:''' Ð\9fÑ\96Ñ\81лÑ\8f Ð·Ð±ÐµÑ\80еженнÑ\8f Ñ\81лÑ\96д Ð¾Ñ\87иÑ\81Ñ\82иÑ\82и ÐºÐµÑ\88 браузера, щоб побачити зміни.
+* '''Firefox / Safari:''' тримайте ''Shift'', коли натискаєте ''Оновити'', або натисніть ''Ctrl-F5'' чи ''Ctrl-Shift-R'' (''⌘-R'' на Apple Mac)
 * '''Google Chrome:''' натисніть ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Apple Mac)
-* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Refresh'' або натисніть ''Ctrl-F5''
-* '''Konqueror:''' натисніть кнопку ''Reload'' або клавішу ''F5''
-* '''Opera:''' очистіть кеш за допомогою ''Tools → Preferences''",
+* '''Internet Explorer:''' тримайте ''Ctrl'', коли натискаєте ''Оновити'' або натисніть ''Ctrl-F5''
+* '''Konqueror:''' натисніть кнопку ''Оновити'' або клавішу ''F5''
+* '''Opera:''' очистіть кеш за допомогою ''Інструменти → Налаштування''",
 'usercssyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий css-файл перед збереженням.",
 'userjsyoucanpreview' => "'''Підказка:''' використовуйте кнопку «{{int:showpreview}}», щоб протестувати ваш новий код JavaScript перед збереженням.",
 'usercsspreview' => "'''Пам'ятайте, що це лише попередній перегляд вашого css-файлу.'''
@@ -941,8 +1036,9 @@ $2
 Пам'ятайте, що користувацькі .css та .js сторінки повинні мати назву, що складається лише з малих літер, наприклад «{{ns:user}}:Хтось/vector.css», а не «{{ns:user}}:Хтось/Vector.css».",
 'updated' => '(Оновлена)',
 'note' => "'''Зауваження:'''",
-'previewnote' => "'''Це лише попередній перегляд,
-текст ще не збережений!'''",
+'previewnote' => "'''Це лише попередній перегляд.'''
+Ваші зміни ще не збережено!",
+'continue-editing' => 'Продовжити редагування',
 'previewconflict' => 'Цей попередній перегляд відображає текст з верхнього вікна редагування так, як він буде виглядіти, якщо ви вирішите зберегти його.',
 'session_fail_preview' => "'''Система не може зберегти ваші редагування, оскільки втрачені дані сеансу. Будь ласка, повторіть вашу спробу.
 Якщо помилка буде повторюватись, спробуйте [[Special:UserLogout|вийти з системи]] і зайти знову.'''",
@@ -955,6 +1051,7 @@ $2
 Подібні проблеми можуть виникати при використанні анонімізуючих веб-проксі, що містять помилки.'''",
 'edit_form_incomplete' => "'''Частина даних із форми редагування не досягла сервера. Уважно перевірте чи не пошкоджено ваших правок і спробуйте ще раз.'''",
 'editing' => 'Редагування $1',
+'creating' => 'Створення $1',
 'editingsection' => 'Редагування $1 (розділ)',
 'editingcomment' => 'Редагування $1 (новий розділ)',
 'editconflict' => 'Конфлікт редагування: $1',
@@ -965,7 +1062,8 @@ $2
 Якщо ви натиснете «{{int:savearticle}}», то буде збережено '''тільки''' текст у верхньому вікні редагування.",
 'yourtext' => 'Ваш текст',
 'storedversion' => 'Збережена версія',
-'nonunicodebrowser' => "'''ПОПЕРЕДЖЕННЯ: Ваш [[браузер]] не підтримує кодування [[Юнікод]]. При редагуванні статей всі не-ASCII символи будуть замінені на свої шіснадцяткові коди.'''",
+'nonunicodebrowser' => "'''ПОПЕРЕДЖЕННЯ: Ваш [[браузер]] не підтримує [[Юнікод]].''' 
+Щоб подолати це обмеження та дозволити Вам безпечно редагувати сторінки, усі не-ASCII символи буде показано їх шістнадцятковими кодами.",
 'editingold' => "'''ПОПЕРЕДЖЕННЯ: Ви редагуєте застарілу версію даної статті.
 Якщо ви збережете її, будь-які редагування, зроблені між версіями, будуть втрачені.'''",
 'yourdiff' => 'Відмінності',
@@ -1023,6 +1121,7 @@ $2
 'edit-no-change' => 'Ваше редагування відхилене, оскільки в тексті не було зроблено змін.',
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
+'defaultmessagetext' => 'Текст «за замовчування»',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Увага: Ця сторінка містить дуже багато викликів ресурсомістких функцій.
@@ -1038,6 +1137,11 @@ $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' => 'На сторінці перевищено межу глибини вкладеності',
+'parser-unstrip-loop-warning' => 'Виявлено незакритий тег (такий, як <pre>)',
 
 # "Undo" feature
 'undo-success' => 'Редагування може бути скасовано.
@@ -1182,8 +1286,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'Журнал приховувань',
-'suppressionlogtext' => 'Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸Ð¹ Ñ\81пиÑ\81ок Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\8c Ñ\82а Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c, Ñ\8fкÑ\96 Ñ\81Ñ\82оÑ\81Ñ\83Ñ\8eÑ\82Ñ\8cÑ\81Ñ\8f Ð¼Ð°Ñ\82еÑ\80Ñ\96алÑ\96в, Ð¿Ñ\80иÑ\85ованиÑ\85 від адміністраторів.
£ [[Special:BlockList|Ñ\81пиÑ\81кÑ\83 Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c]] Ð¼Ð¾Ð¶Ð½Ð° Ð¿ÐµÑ\80еглÑ\8fнÑ\83Ñ\82и Ñ\81пиÑ\81ок поточних блокувань.',
+'suppressionlogtext' => 'Ð\9dижÑ\87е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ Ñ\81пиÑ\81ок Ð²Ð¸Ð»Ñ\83Ñ\87енÑ\8c Ñ\82а Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c, Ð²ÐºÐ»Ñ\8eÑ\87аÑ\8eÑ\87и Ð¼Ð°Ñ\82еÑ\80Ñ\96али, Ð¿Ñ\80иÑ\85ованÑ\96 від адміністраторів.
\94ивÑ\96Ñ\82Ñ\8cÑ\81Ñ\8f [[Special:BlockList|Ñ\81пиÑ\81ок Ð±Ð»Ð¾ÐºÑ\83ванÑ\8c]] Ð´Ð»Ñ\8f Ð¿ÐµÑ\80еглÑ\8fдÑ\83 поточних блокувань.',
 
 # History merging
 'mergehistory' => "Об'єднання історій редагувань",
@@ -1215,8 +1319,9 @@ $1",
 'mergelogpagetext' => "Нижче наведений список останніх об'єднань історій сторінок.",
 
 # Diffs
-'history-title' => 'Історія змін сторінки «$1»',
-'difference' => '(відмінності між версіями)',
+'history-title' => '$1: Історія змін',
+'difference-title' => '$1: Відмінності між версіями',
+'difference-title-multipage' => 'Різниця між сторінками «$1» та «$2»',
 'difference-multipage' => '(Різниця між сторінками)',
 'lineno' => 'Рядок $1:',
 'compareselectedversions' => 'Порівняти вибрані версії',
@@ -1311,6 +1416,7 @@ $1",
 'prefs-beta' => 'Бета-функції',
 'prefs-datetime' => 'Дата й час',
 'prefs-labs' => 'Експериментальні функції',
+'prefs-user-pages' => 'Сторінки користувача',
 'prefs-personal' => 'Особисті дані',
 'prefs-rc' => 'Сторінка останніх редагувань',
 'prefs-watchlist' => 'Список спостереження',
@@ -1336,10 +1442,10 @@ $1",
 'resultsperpage' => 'Кількість результатів на сторінку:',
 'stub-threshold' => 'Поріг для визначення оформлення <a href="#" class="stub">посилань на стаби</a> (у байтах):',
 'stub-threshold-disabled' => 'Вимкнений',
-'recentchangesdays' => 'Ð\9dа скільки днів показувати нові редагування:',
+'recentchangesdays' => 'Ð\97а скільки днів показувати нові редагування:',
 'recentchangesdays-max' => '(максимум $1 {{PLURAL:$1|день|дні|днів}})',
 'recentchangescount' => 'Кількість редагувань для показу за умовчанням:',
-'prefs-help-recentchangescount' => 'Це Ñ\82оÑ\80кається нових редагувань, історій сторінок і журналів.',
+'prefs-help-recentchangescount' => 'Це Ñ\81Ñ\82оÑ\81Ñ\83ється нових редагувань, історій сторінок і журналів.',
 'prefs-help-watchlist-token' => 'Заповнення цього поля секретним ключем буде створювати RSS-трансляцію для вашого списку спостереження.
 Кожен, хто знає ключ в цьому полі, зможе читати ваш список спостереження, тому оберіть секретне значення.
 Ви можете використати це випадково згенероване значення: $1',
@@ -1395,7 +1501,8 @@ $1",
 'gender-unknown' => 'не зазначена',
 'gender-male' => 'чоловіча',
 'gender-female' => 'жіноча',
-'prefs-help-gender' => "Необов'язкове поле: використовується в деяких повідомленнях двигуна, які залежать від статі користувача. Значення параметра загальнодоступне.",
+'prefs-help-gender' => "Необов'язково. Застосовується рушієм у тих звертаннях до користувача, які залежать від статі.
+Ця інформація загальнодоступна.",
 'email' => 'Електронна пошта',
 'prefs-help-realname' => "Справжнє ім'я необов'язково вказувати.
 Якщо ви його зазначите, то воно буде використовуватися, щоб показати, хто редагував сторінку.",
@@ -1577,7 +1684,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|зміна|зміни|змін}}',
 'recentchanges' => 'Нові редагування',
 'recentchanges-legend' => 'Налаштування нових редагувань',
-'recentchangestext' => 'На цій сторінці показані останні зміни на сторінках {{grammar:genitive|{{SITENAME}}}}.',
+'recentchanges-summary' => 'Відстеження останніх змін на сторінках {{grammar:genitive|{{SITENAME}}}}.',
 'recentchanges-feed-description' => 'Відстежувати останні зміни у вікі в цьому потоці.',
 'recentchanges-label-newpage' => 'Цим редагуванням створена нова сторінка',
 'recentchanges-label-minor' => 'Це незначна зміна',
@@ -1618,7 +1725,7 @@ $1",
 'recentchangeslinked-title' => "Пов'язані редагування для «$1»",
 'recentchangeslinked-noresult' => "На пов'язаних сторінках не було змін протягом зазначеного періоду.",
 'recentchangeslinked-summary' => "Це список нещодавніх змін на сторінках, на які посилається зазначена сторінка (або на сторінках, що містяться в цій категорії).
-Сторінки з [[Special:Watchlist|вашого списку спостереження]] виділені '''жирним шрифтом'''.",
+Сторінки з [[Special:Watchlist|вашого списку спостереження]] виділено '''жирним шрифтом'''.",
 'recentchangeslinked-page' => 'Назва сторінки:',
 'recentchangeslinked-to' => "Показати зміни на сторінках, пов'язаних з даною",
 
@@ -1684,7 +1791,7 @@ $1",
 'filename-tooshort' => 'Назва файлу занадто коротка.',
 'filetype-banned' => 'Цей тип файлів заборонений.',
 'verification-error' => 'Файлу не вдалося пройти процедуру перевірки.',
-'hookaborted' => 'Ð\97апÑ\80опонованÑ\83 Ð²Ð°Ð¼Ð¸ Ð·Ð¼Ñ\96нÑ\83 Ð¿ÐµÑ\80еÑ\80вав Ð¾Ð±Ñ\80обник Ñ\80озÑ\88иÑ\80еннÑ\8f.',
+'hookaborted' => 'Ð\97мÑ\96нÑ\83, Ñ\89о Ð\92и Ð½Ð°Ð¼Ð°Ð³Ð°Ð»Ð¸Ñ\81Ñ\8f Ð·Ñ\80обиÑ\82и, Ð²Ñ\96дкинÑ\83Ñ\82о Ð¾Ð±Ñ\80обником.',
 'illegal-filename' => 'Недозволена назва файлу.',
 'overwrite' => 'Заміну існуючого файлу не дозволено.',
 'unknown-error' => 'Трапилась невідома помилка.',
@@ -1790,14 +1897,15 @@ $1',
 'backend-fail-writetemp' => 'Не вдалося записати до тимчасового файлу.',
 'backend-fail-closetemp' => 'Не вдалося закрити тимчасовий файл.',
 'backend-fail-read' => 'Не вдалося прочитати файл $1.',
-'backend-fail-create' => 'Не вдалося створити файл $1.',
-'backend-fail-maxsize' => 'Неможливо створити файл $1, бо він більший, ніж {{PLURAL:$2|$2 байт|$2 байти|$2 байтів}}.',
+'backend-fail-create' => 'Не вдалося зберегти файл $1.',
+'backend-fail-maxsize' => 'Неможливо зберегти файл $1, бо він більший, ніж {{PLURAL:$2|$2 байт|$2 байти|$2 байтів}}.',
 'backend-fail-readonly' => 'Інтерфейс сховища "$1" зараз доступний тільки для читання. Причина: "$2"',
 'backend-fail-synced' => 'Файл "$1" у внутрішньому сховищі рушія перебуває в неузгодженому стані',
 'backend-fail-connect' => 'Неможливо підключитися до сховища рушія "$1".',
 'backend-fail-internal' => 'Сталася невідома помилка у сховищі рушія "$1".',
 'backend-fail-contenttype' => 'Не вдалося визначити тип вмісту файла, щоб зберегти його в "$1".',
 'backend-fail-batchsize' => 'Серверна частина отримала блок із $1 {{PLURAL:$1|файлової операції|файлових операцій}}; обмеження складає $2 {{PLURAL:$2|файлову операцію|файлові операції|файлових операцій}}.',
+'backend-fail-usable' => 'Файл $1 не може бути записано через недостатні повноваження чи відсутність каталогів (контейнерів).',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не вдалося підключитися до бази даних журналу для сховища «$1».',
@@ -1922,6 +2030,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' => 'Завантажити нову версію цього файлу',
@@ -2115,6 +2227,7 @@ $1',
 Ви можете відфільтрувати результати за типом журналу, іменем користувача (враховується регістр) або зазначеною сторінкою (також враховується регістр).',
 'logempty' => 'В журналі немає подібних записів.',
 'log-title-wildcard' => 'Знайти заголовки, що починаються з цих символів',
+'showhideselectedlogentries' => 'Показати/приховати виділені записи журналу',
 
 # Special:AllPages
 'allpages' => 'Усі сторінки',
@@ -2132,6 +2245,12 @@ $1',
 'allpagesprefix' => 'Знайти сторінки, що починаються з:',
 'allpagesbadtitle' => 'Неприпустима назва сторінки: можливо, заголовок містить міжмовний або міжпроектний префікс чи заборонені символи.',
 'allpages-bad-ns' => '{{SITENAME}} не має простору назв «$1».',
+'allpages-hide-redirects' => 'Сховати перенаправлення',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Ви переглядаєте кешовану версію сторінки, яка могла бути оновлена $1 тому.',
+'cachedspecial-viewing-cached-ts' => 'Ви переглядаєте кешовану версію сторінки, яка могла втратити актуальність',
+'cachedspecial-refresh-now' => 'Показати останні',
 
 # Special:Categories
 'categories' => 'Категорії',
@@ -2243,8 +2362,8 @@ $1',
 'watchnologin' => 'Ви не ввійшли до системи',
 'watchnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до системи]], щоб мати можливість змінювати список спостереження.',
 'addwatch' => 'Додати до списку спостереження',
-'addedwatchtext' => "Сторінка «[[:$1]]» додана до вашого [[Special:Watchlist|списку спостереження]].
\9dаÑ\81Ñ\82Ñ\83пнÑ\96 Ñ\80едагÑ\83ваннÑ\8f Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82аÑ\82Ñ\82Ñ\96 Ñ\96 Ð¿Ð¾Ð²'Ñ\8fзаноÑ\97 Ð· Ð½ÐµÑ\8e Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80еннÑ\8f Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð²Ñ\96добÑ\80ажаÑ\82иÑ\81Ñ\8f Ð² Ñ\86Ñ\8cомÑ\83 Ñ\81пиÑ\81кÑ\83, Ð° Ñ\82акож Ð±Ñ\83дÑ\83Ñ\82Ñ\8c Ð²Ð¸Ð´Ñ\96ленÑ\96 '''жирним шрифтом''' на сторінці зі [[Special:RecentChanges|списком останніх редагувань]], щоб їх було легше помітити.",
+'addedwatchtext' => "Сторінку «[[:$1]]» додано до вашого [[Special:Watchlist|списку спостереження]].
\9fодалÑ\8cÑ\88Ñ\96 Ñ\80едагÑ\83ваннÑ\8f Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81Ñ\82оÑ\80Ñ\96нки (Ñ\82а Ð¿Ð¾Ð²'Ñ\8fзаноÑ\97 Ð· Ð½ÐµÑ\8e Ñ\81Ñ\82оÑ\80Ñ\96нки Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ\80еннÑ\8f) Ð²Ñ\96добÑ\80ажаÑ\82имÑ\83Ñ\82Ñ\8cÑ\81Ñ\8f Ð² Ñ\86Ñ\8cомÑ\83 Ñ\81пиÑ\81кÑ\83. Ð¢Ð°ÐºÐ¾Ð¶ Ñ\97Ñ\85 Ð±Ñ\83де Ð²Ð¸Ð´Ñ\96лено '''жирним шрифтом''' на сторінці зі [[Special:RecentChanges|списком останніх редагувань]], щоб їх було легше помітити.",
 'removewatch' => 'Видалити зі списку спостереження',
 'removedwatchtext' => 'Сторінка «[[:$1]]» вилучена з вашого [[Special:Watchlist|списку спостереження]].',
 'watch' => 'Спостерігати',
@@ -2271,7 +2390,7 @@ $1',
 'watcherrortext' => 'Сталася помилка при заміні налаштувань списку спостереження для " $1 ".',
 
 'enotif_mailer' => '{{SITENAME}} Служба сповіщення поштою',
-'enotif_reset' => 'Ð\9fомÑ\96Ñ\82ити всі сторінки як переглянуті',
+'enotif_reset' => 'Ð\9fознаÑ\87ити всі сторінки як переглянуті',
 'enotif_newpagetext' => 'Це нова сторінка.',
 'enotif_impersonal_salutation' => 'Користувач {{grammar:genitive|{{SITENAME}}}}',
 'changed' => 'змінена',
@@ -2314,7 +2433,7 @@ $UNWATCHURL
 'deletepage' => 'Вилучити сторінку',
 'confirm' => 'Підтвердження',
 'excontent' => 'зміст: «$1»',
-'excontentauthor' => 'змÑ\96Ñ\81Ñ\82 Ð±Ñ\83в: Â«$1» (Ñ\94диним Ð°Ð²Ñ\82оÑ\80ом Ð±Ñ\83в [[Special:Contributions/$2|$2]])',
+'excontentauthor' => 'змÑ\96Ñ\81Ñ\82 Ð±Ñ\83в: Â«$1» (Ñ\94диний Ð°Ð²Ñ\82оÑ\80: [[Special:Contributions/$2|$2]])',
 'exbeforeblank' => 'зміст до очистки: «$1»',
 'exblank' => 'стаття була порожньою',
 'delete-confirm' => 'Вилучення «$1»',
@@ -2563,7 +2682,7 @@ $1',
 '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' => "Приховати ім'я користувача у редагуваннях ті списках",
+'ipbhidename' => "Приховати ім'я користувача у редагуваннях та списках",
 'ipbwatchuser' => 'Додати до списку спостереження сторінку користувача і його обговорення',
 'ipb-disableusertalk' => 'Заборонити користувачу редагувати свою сторінку обговорення під час блокування',
 'ipb-change-block' => 'Переблокувати користувача з цими налаштуваннями',
@@ -2571,7 +2690,7 @@ $1',
 'badipaddress' => 'IP-адреса записана в невірному форматі, або користувача з таким іменем не існує.',
 'blockipsuccesssub' => 'Блокування проведено',
 'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] заблоковано.<br />
-Див. [[Special:BlockList|список заблокованих IP-адрес]].',
+Див. [[Special:BlockList|список заблокованих IP-адрес]] для перегляду блокувань.',
 'ipb-blockingself' => 'Ви збираєтеся заблокувати себе!  Ви дійсно бажаєте це зробити?',
 'ipb-confirmhideuser' => "Ви збираєтеся заблокувати користувача з опцією приховання імені. Це вилучить його ім'я з усіх списків та журналів. Ви точно хочете це зробити?",
 'ipb-edit-dropdown' => 'Редагувати причини блокувань',
@@ -2621,9 +2740,9 @@ $1',
 'blocklog-showsuppresslog' => 'Цього користувача вже заблоковано і приховано. Далі наведено журнал приховань:',
 'blocklogentry' => 'заблокував [[$1]] на термін $2 $3',
 'reblock-logentry' => 'переблокував [[$1]] на термін $2 $3',
-'blocklogtext' => 'Ð\96Ñ\83Ñ\80нал Ð±Ð»Ð¾ÐºÑ\83ваннÑ\8f Ð¹ розблокування користувачів.
-IP-адреси, що блокуються автоматично тут не вказуються. Див.
-[[Special:BlockList|список поточних заборон і блокувань]].',
+'blocklogtext' => 'Ð\96Ñ\83Ñ\80нал Ð´Ñ\96й Ñ\89одо Ð±Ð»Ð¾ÐºÑ\83ваннÑ\8f Ñ\82а розблокування користувачів.
+Автоматично заблоковані IP-адреси тут не вказуються. 
+Див. [[Special:BlockList|перелік чинних обмежень]] .',
 'unblocklogentry' => 'розблокував $1',
 'block-log-flags-anononly' => 'тільки анонімні користувачі',
 'block-log-flags-nocreate' => 'заборонена реєстрація облікових записів',
@@ -3026,6 +3145,7 @@ The wiki server can't provide data in a format your client can read.",
 'spambot_username' => 'Очистка спаму',
 'spam_reverting' => 'Відкинути до останньої версії, що не містить посилання на $1',
 'spam_blanking' => 'Всі версії містять посилання на $1, очистка',
+'spam_deleting' => 'Все версії, що містили посилання на $1, вилучаються',
 
 # Info page
 'pageinfo-title' => 'Інформація про " $1 "',
@@ -3783,8 +3903,8 @@ $5
 'livepreview-error' => "Не вдалося встановити з'єднання: $1 «$2». Спробуйте скористатися звичайним попереднім переглядом.",
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Зміни, зроблені $1 {{PLURAL:$1|секунду|секунди|секунд}} тому, можуть бути не показані в цьому списку.',
-'lag-warn-high' => 'ЧеÑ\80ез Ð²ÐµÐ»Ð¸ÐºÐµ Ð²Ñ\96дÑ\81Ñ\82аваннÑ\8f Ñ\83 Ñ\81инÑ\85Ñ\80онÑ\96заÑ\86Ñ\96Ñ\97 Ñ\81еÑ\80веÑ\80Ñ\96в Ð±Ð°Ð· Ð´Ð°Ð½Ð¸Ñ\85 Ð·Ð¼Ñ\96ни, Ð·Ñ\80обленÑ\96 Ð¼ÐµÐ½Ñ\88 Ð½Ñ\96ж $1 {{PLURAL:$1|Ñ\81екÑ\83ндÑ\83\81екÑ\83нди|Ñ\81екÑ\83нд}} Ñ\82омÑ\83, Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð½Ðµ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ\96 Ð² Ñ\86Ñ\8cомÑ\83 Ñ\81пиÑ\81кÑ\83.',
+'lag-warn-normal' => 'Зміни, зроблені менш ніж $1 {{PLURAL:$1|секунду|секунди|секунд}} тому, можуть не відображатися в цьому переліку.',
+'lag-warn-high' => 'Ð\97мÑ\96ни, Ð·Ñ\80обленÑ\96 Ð¼ÐµÐ½Ñ\88 Ð½Ñ\96ж $1 {{PLURAL:$1|Ñ\81екÑ\83ндÑ\83\81екÑ\83нди|Ñ\81екÑ\83нд}} Ñ\82омÑ\83, Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð½Ðµ Ð²Ñ\96добÑ\80ажаÑ\82иÑ\81Ñ\8f Ð² Ñ\86Ñ\8cомÑ\83 Ð¿ÐµÑ\80елÑ\96кÑ\83 Ð²Ð½Ð°Ñ\81лÑ\96док Ð·Ð½Ð°Ñ\87ноÑ\97 Ð·Ð°Ñ\82Ñ\80имки Ñ\81еÑ\80веÑ\80а Ð\91Ð\94.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Ваш список спостереження містить {{PLURAL:$1|$1 запис|$1 записи|$1 записів}}, не включаючи сторінок обговорення.',
@@ -3907,6 +4027,7 @@ MediaWiki поширюється в надії, що вона буде кори
 'version-software' => 'Установлене програмне забезпечення',
 'version-software-product' => 'Продукт',
 'version-software-version' => 'Версія',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Шлях до файлу',
@@ -4059,7 +4180,7 @@ MediaWiki поширюється в надії, що вона буде кори
 
 # API errors
 'api-error-badaccess-groups' => 'Вам не дозволено завантажувати файли до цього вікіпроекту.',
-'api-error-badtoken' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ð¿Ð¾Ð³Ð°Ð½Ð¸Ð¹ Ð·Ð½Ð°Ðº.',
+'api-error-badtoken' => 'Ð\92нÑ\83Ñ\82Ñ\80Ñ\96Ñ\88нÑ\8f Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: Ð½ÐµÐºÐ¾Ñ\80екÑ\82ний Ñ\82окен.',
 'api-error-copyuploaddisabled' => 'На цьому сервері вимкнене завантаження за URL-адресою.',
 'api-error-duplicate' => 'Вже {{PLURAL:$1|існує  [$2 інший файл]|існують [$2 інші файли]}} з таким самим вмістом.',
 'api-error-duplicate-archive' => 'Раніше на сайті вже {{PLURAL:$1|був [$2 файл]|були [$2 файли]}} з ідентичним вмістом, але {{PLURAL:$1|був|були}} вилучені.',
@@ -4072,7 +4193,7 @@ MediaWiki поширюється в надії, що вона буде кори
 'api-error-filename-tooshort' => 'Назва файлу занадто коротка.',
 'api-error-filetype-banned' => 'Цей тип файлів заборонений.',
 'api-error-filetype-missing' => 'У цього файла відсутнє розширення.',
-'api-error-hookaborted' => 'Зміни, які ви намагалися зробити перервав обробник розширення.',
+'api-error-hookaborted' => 'Зміну, що Ви намагалися зробити, відкинуто обробником.',
 'api-error-http' => 'Внутрішня помилка: Не вдається підключитися до сервера.',
 'api-error-illegal-filename' => "Неприпустиме ім'я файлу.",
 'api-error-internal-error' => 'Внутрішня помилка: Щось пішло не так під час обробки вашого завантаження на вікі.',
@@ -4095,4 +4216,17 @@ 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|тисячоліття|тисячоліття|тисячоліть}}',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Не вдалося одержати блокування на сервері $1.',
 );
index af3489a..0dc37af 100644 (file)
@@ -14,6 +14,7 @@
  * @author Rachitrali
  * @author Reedy
  * @author Wisesabre
+ * @author ZxxZxxZ
  * @author לערי ריינהארט
  * @author سمرقندی
  * @author محبوب عالم
@@ -745,7 +746,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1" کا نظرثانی تاریخچہ',
-'difference' => '(اصلاحات میں فرق)',
 'lineno' => 'لکیر $1:',
 'compareselectedversions' => 'منتخب متـن کا موازنہ',
 'editundo' => 'استرجع',
@@ -902,7 +902,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' => 'دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.',
@@ -930,7 +930,7 @@ HTML tags جانچئے.',
 'nchanges' => '$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
 'recentchanges' => 'حالیہ تبدیلیاں',
 'recentchanges-legend' => 'اِختیاراتِ حالیہ تبدیلیاں',
-'recentchangestext' => 'اس صفحے پر ویکی میں ہونے والی تازہ تریں تبدیلیوں کا مشاہدہ کیجیۓ۔',
+'recentchanges-summary' => 'اس صفحے پر ویکی میں ہونے والی تازہ تریں تبدیلیوں کا مشاہدہ کیجیۓ۔',
 'recentchanges-feed-description' => 'اس خورد میں ویکی پر ہونے والی تازہ تریں تبدیلیوں کا مشاہدہ کیجیۓ۔',
 'recentchanges-label-newpage' => 'اِس ترمیم نے نیا صفحہ تخلیق کردیا',
 'recentchanges-label-minor' => 'یہ ایک معمولی ترمیم ہے',
index 5523ea3..21ff98b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Uzbek (O'zbek)
+/** Uzbek (Oʻzbekcha)
  *
  * 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,250 @@ $namespaceAliases = array(
 $linkTrail = '/^([a-zʻʼ“»]+)(.*)$/sDu';
 
 $messages = array(
+# User preference toggles
+'tog-oldsig' => 'Mavjud imzo:',
+'tog-fancysig' => 'Imzoni wikimatn sifatida qara (avtomatik ishoratsiz)',
+
+'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 +303,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 +331,153 @@ 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',
+'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',
+'recentchanges-summary' => "Bu sahifada siz oxirgi o'zgartirishlarni ko'rishingiz mumkin.",
+'recentchanges-label-newpage' => 'Bu tahrir yangi sahifani yaratdi',
+'recentchanges-label-minor' => 'Bu kichik tahrir',
+'recentchanges-label-bot' => 'Bu tahrirni bot bajardi',
+'recentchanges-label-unpatrolled' => 'Bu tahrir hali tekshirilmadi',
+'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 +488,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..73c51f3 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Vèneto (Vèneto)
+/** vèneto (vèneto)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -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,11 @@ $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".',
+'invalidtitle-knownnamespace' => 'Titoło no vałido co namespace "$2" e testo "$3"',
+'invalidtitle-unknownnamespace' => 'Titoło no vałido co namespace sconosùo "$1" e testo "$2"',
 
 # Virus scanner
 'virus-badscanner' => 'Erore de configurasion: antivirus sconossuo: "$1"',
@@ -566,8 +578,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 +621,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 +633,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 +659,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 +803,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 +819,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 +832,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 +855,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 +894,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 +910,12 @@ 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',
+'node-count-exceeded-warning' => 'Sta pajina ga superà el numaro limite de nodi',
+'expansion-depth-exceeded-category' => 'Pajine ndove che vien superà ła profondità de espansion',
+'expansion-depth-exceeded-warning' => 'Sta pajina ga superà el limite de profondità de espansion',
+'parser-unstrip-loop-warning' => 'Xe sta riłevà un ciclo de Unstrip',
+'parser-unstrip-recursion-limit' => 'Superadi i limiti de recursion de Unstrip ($1)',
 
 # "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.',
@@ -882,37 +961,35 @@ Legenda: '''({{int:cur}})''' = difarense co l'ultima version, '''({{int:last}})'
 'history-feed-empty' => 'La pàxena richiesta no la esiste; la podarìa èssar stà scancełà dal sito o rinominà. Verifica con la [[Special:Search|pàxena de riserca]] se ghe xè nove pàxene.',
 
 # Revision deletion
-'rev-deleted-comment' => '(comento cavà)',
+'rev-deleted-comment' => 'Comento cavà',
 'rev-deleted-user' => '(nome utente cavà)',
 'rev-deleted-event' => '(elemento cavà)',
 '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-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-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 dełe revixion de sto confronto de version ła xe stà '''rimosa'''.
+Te połi uncora vixuałixare sto confronto; controłare el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rejistro dełe rimosion] par ulteriori detaji.",
 'rev-delundel' => 'mostra/scondi',
 'rev-showdeleted' => 'mostra',
 'revisiondelete' => 'Scanceła o ripristina version',
@@ -978,7 +1055,7 @@ No ti gà acesso su de ela.',
 
 # Suppression log
 'suppressionlog' => 'Registro dei ocultamenti',
-'suppressionlogtext' => "Qua soto se cata na lista de le ultime scancelazioni e blochi che riguarda contenuti sconti dai aministradori. Varda la [[Special:IPBlockList|lista dei IP blocà]] par védar l'elenco dei blochi atualmente ativi.",
+'suppressionlogtext' => "Cua soto se cata na lista de łe ultime scancełasion e rimosion che riguarda contenuti sconti dai aministradori. Varda ła [[Special:BlockList|lista dei IP blocadi]] par vedare l'elenco de łe operasion de bloco atualmente ative.",
 
 # History merging
 'mergehistory' => 'Union cronologie',
@@ -1010,8 +1087,9 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
 'mergelogpagetext' => "Qua de seguito vien presentà na lista de le ultime operazion de unione de la cronologia de na pagina in un'altra.",
 
 # Diffs
-'history-title' => "Storia dei canbiamenti de ''$1''",
-'difference' => '(Difarense fra le version)',
+'history-title' => '$1: cronołojia dełe modifeghe',
+'difference-title' => '$1: difarense fra łe version',
+'difference-title-multipage' => '$1 e $2: difarense fra łe pajine',
 'difference-multipage' => '(Difarensa tra le pagine)',
 'lineno' => 'Riga $1:',
 'compareselectedversions' => 'Confronta le version segnàe',
@@ -1092,6 +1170,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'qbsettings-fixedright' => 'Fisso a destra',
 'qbsettings-floatingleft' => 'Fluttuante a sinistra',
 'qbsettings-floatingright' => 'Fluttuante a destra',
+'qbsettings-directionality' => 'Fiso, a seconda de ła diresion del testo nte ła to lengua',
 
 # Preferences page
 'preferences' => 'Prefarense',
@@ -1110,12 +1189,14 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'prefs-rc' => 'Ultime modifeghe',
 'prefs-watchlist' => 'Tegnùi de òcio',
 'prefs-watchlist-days' => 'Nùmaro de giòrni da far védar nei osservati speciali:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Masimo $1 dì',
 'prefs-watchlist-edits' => 'Nùmaro de modifiche da far védar con le funzion avanzade:',
-'prefs-watchlist-edits-max' => '(nùmaro massimo: 1000)',
+'prefs-watchlist-edits-max' => 'Numaro massimo: 1000',
 'prefs-watchlist-token' => "Segnal par le pagine tegnùe d'ocio:",
 'prefs-misc' => 'Preferense varie',
 'prefs-resetpass' => 'Cànbia password',
+'prefs-changeemail' => 'Canbia indiriso de posta ełetronega',
+'prefs-setemail' => 'Inposta un indiriso de posta ełetronega',
 'prefs-email' => 'Preferense e-mail',
 'prefs-rendering' => 'Aspeto grafico',
 'saveprefs' => 'Salva le preferense',
@@ -1137,7 +1218,7 @@ Prova a métarghe \"all:\" davanti al testo che te serchi par vardar in tuti i n
 'savedprefs' => 'Le to preferense łe xè stà salvae.',
 'timezonelegend' => 'Fuso orario:',
 'localtime' => 'Ora locale:',
-'timezoneuseserverdefault' => "Dòpara l'ora del server",
+'timezoneuseserverdefault' => 'Dopara el orario predefinìo de wiki ($1)',
 'timezoneuseoffset' => 'Altro (spesifica difarensa)',
 'timezoneoffset' => 'Difarensa¹:',
 'servertime' => 'Ora del server:',
@@ -1172,7 +1253,8 @@ Sta operassion no la pol èssar anulà.',
 'prefs-registration' => 'Data de registrassion:',
 'yourrealname' => 'El to vero nome:',
 'yourlanguage' => 'Lengua:',
-'yourvariant' => 'Variante de linguaggio:',
+'yourvariant' => 'Variante de ła lengua:',
+'prefs-help-variant' => 'La variante o grafia in cui te preferisi che te vegna mostrade łe pajine de wiki.',
 'yournick' => 'Firma:',
 'prefs-help-signature' => 'Co se scrive in te le pagine de discussion, a se gà senpre da firmar scrivendo "<nowiki>~~~~</nowiki>", che vegnarà convertìo in te la propria firma seguìa da data e ora.',
 'badsig' => 'Erór ne ła firma non standard, verifica i tag HTML.',
@@ -1204,12 +1286,16 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'prefs-displaywatchlist' => 'Opzioni de visualixassion',
 'prefs-diffs' => 'Difarense',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "L'indiriso de posta eletronega pararìa vałido",
+'email-address-validity-invalid' => 'Inserisi un indiriso de posta eletronega vałido',
+
 # User rights
 'userrights' => 'Gestion dei parmessi relativi ai utenti',
 'userrights-lookup-user' => 'Gestion de i gruppi utente',
 'userrights-user-editname' => 'Inserir el nome utente:',
 'editusergroup' => 'Modifica grupi utente',
-'editinguser' => "Modifica dei diriti assegnà a l'utente '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Modifega dei diriti utente de'l utente '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Modifica grupi utente',
 'saveusergroups' => 'Salva grupi utente',
 'userrights-groupsmember' => 'Apartien ai grupi:',
@@ -1222,7 +1308,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'userrights-no-interwiki' => 'No te ghè i parmessi necessari par modificar i diriti dei utenti su altri siti.',
 'userrights-nodatabase' => "El database $1 no l'esiste mìa o no l'è un database local.",
 'userrights-nologin' => "Par assegnarghe diriti ai utenti te ghè da [[Special:UserLogin|efetuar l'acesso]] come aministrador.",
-'userrights-notallowed' => 'No te ghè i parmessi necessari par assegnarghe diriti ai utenti.',
+'userrights-notallowed' => 'No te ghe i parmesi necesari par xontarghe o cavarghe diriti ai utenti.',
 'userrights-changeable-col' => 'Grupi che te pol canbiar',
 'userrights-unchangeable-col' => 'Grupi che no te pol canbiar',
 
@@ -1309,11 +1395,13 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'right-siteadmin' => 'Bloca e desbloca el database',
 'right-override-export-depth' => 'Esporta le pàxene, includendo le pàxene ligàe fin a na profondità de 5',
 'right-sendemail' => 'Mandarghe e-mail a cheialtri utenti',
+'right-passwordreset' => 'Vedi i mesaji de rinpostasion de ła password',
 
 # User rights log
 'rightslog' => 'Diriti de i utenti',
 'rightslogtext' => 'Sto qua el xe el registro de le modifiche ai diriti assegnà ai utenti.',
 'rightslogentry' => "gà modificà l'apartenenza de $1 dal grupo $2 al grupo $3",
+'rightslogentry-autopromote' => 'xe stà automategamente promoso/a da $2 a $3',
 'rightsnone' => '(nissun)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1341,6 +1429,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'action-suppressionlog' => 'vardar sto registro privato',
 'action-block' => 'blocar sto utente in scritura',
 'action-protect' => 'canbiar i livèi de protession par sta pàxena',
+'action-rollback' => "Anuła in presa łe modifeghe fate da l'ultimo utente intervegnù so' na determinada pajina.",
 'action-import' => "inportar sta pàxena da n'antra wiki",
 'action-importupload' => 'inportar sta pàxena tramite caricamento da file',
 'action-patrol' => 'segnar le modìfeghe dei altri utenti come verificàe',
@@ -1356,7 +1445,7 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'nchanges' => '$1 {{PLURAL:$1|canbiamento|canbiamenti}}',
 'recentchanges' => 'Ultimi canbiamenti',
 'recentchanges-legend' => 'Prefarense par i ultimi canbiamenti',
-'recentchangestext' => 'Qua se vede i ultimi canbiamenti fati a sto sito.',
+'recentchanges-summary' => 'Qua se vede i ultimi canbiamenti fati a sto sito.',
 'recentchanges-feed-description' => 'Tien tracia dei ultimi canbiamenti fati a sto sito',
 'recentchanges-label-newpage' => 'Sta modifica la ga creà na pagina nova',
 'recentchanges-label-minor' => 'Sto qua el xe un canbiamento picenin',
@@ -1382,9 +1471,11 @@ Co qualcheduni te scrivarà, nol vedarà mia el to indirizo.',
 'number_of_watching_users_pageview' => '[osservà da {{PLURAL:$1|un utente|$1 utenti}}]',
 'rc_categories' => 'Limita a le categorie (separà da "|")',
 'rc_categories_any' => 'Qualsiasi',
+'rc-change-size-new' => '$1 byte dopo ła modifega',
 'newsectionsummary' => '/* $1 */ sezion nova',
 'rc-enhanced-expand' => 'Mostra detaji (richiede JavaScript)',
 'rc-enhanced-hide' => 'Scondi detaji',
+'rc-old-title' => 'creà in orijine come "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Canbiamenti ligà a sta pagina',
@@ -1436,12 +1527,13 @@ Varda la [[Special:NewFiles|galerìa dei file nóvi]] par na vision de insieme.'
 'ignorewarnings' => 'Ignora i messagi de avertimento del sistema',
 'minlength1' => 'El nome del file el ga da contegner almanco un caràtere.',
 'illegalfilename' => 'El nome file "$1" el contien caràteri che no xè permessi nei titoli de le pagine. Par piaser, rinomina el file e próa a ricaricarlo.',
+'filename-toolong' => 'I nomi dei file no połe superare i 240 byte.',
 'badfilename' => 'El nome de el file el xè stà convertio in "$1".',
-'filetype-mime-mismatch' => "L'estension del file no a corisponde con el tipo MIME.",
+'filetype-mime-mismatch' => 'L\'estension del file ".$1" no corisponde al tipo MIME del file ($2).',
 'filetype-badmime' => 'No xe consentìo de cargar file de tipo MIME "$1".',
 'filetype-bad-ie-mime' => 'No se pode cargar sto file, parché da Internet Explorer el vegnarìa rilevà come "$1", che xe un tipo de file disativà e potensialmente pericoloso.',
 'filetype-unwanted-type' => "Cargar file de tipo '''\".\$1\"''' xe sconsiglià. {{PLURAL:\$3|El tipo de file consiglià el|I tipi de file consiglià i}} xe \$2.",
-'filetype-banned-type' => "Cargar file de tipo '''\".\$1\"''' no xe mìa consentìo. {{PLURAL:\$3|El tipo de file consentìo el|I tipi de file consentìi i}} xe \$2.",
+'filetype-banned-type' => "'''\".\$1\"''' {{PLURAL:\$4|no'l xe un tipo de file consentìo|no łi xe tipi de file consentidi}}. {{PLURAL:\$3|El tipo de file consentìo xe|I tipi de file consentidi xe}} \$2.",
 'filetype-missing' => 'El file no\'l gà nissuna estension (ad es. ".jpg").',
 'empty-file' => 'El file che te ghè cargà el xe vodo.',
 'file-too-large' => 'El file che te ghè cargà el xe massa grando.',
@@ -1457,6 +1549,7 @@ Varda la [[Special:NewFiles|galerìa dei file nóvi]] par na vision de insieme.'
 'large-file' => 'Se racomanda de no superar mìa le dimension de $1 par ciascun file; sto file el xe grando $2.',
 'largefileserver' => 'El file el supera le dimension consentìe da la configurazion del server.',
 'emptyfile' => 'El file che te ghè caricà el xè aparentemente vodo. Podarìa èssar par un eror nel nome del file. Par piaser controla se te vol dal bon caricar sto file.',
+'windows-nonascii-filename' => 'Sta wiki no suporta nomi de file co carateri speciałi.',
 'fileexists' => "Un file co sto nome el esiste de xà, par piaser controła '''<tt>[[:$1]]</tt>''' se no te sì sicuro de volerlo sovrascrìvar.
 [[$1|thumb]]",
 'filepageexists' => "La pagina de descrizion de sto file la xe zà stà creà a '''<tt>[[:$1]]</tt>''', anca se no ghe xe gnancora un file co sto nome.
@@ -1490,6 +1583,8 @@ Se te vol cargar el file istesso, par piaser torna indrio e canbia el nome che t
 'php-uploaddisabledtext' => 'El caricamento de file tramite PHP el xe disabilità. Contròla la configurassion de file_uploads.',
 'uploadscripted' => 'Sto file contegne codexe HTML o de script, che podaria essere interpretà eroneamente da un browser web.',
 'uploadvirus' => 'Sto file contegne un virus! Detagli: $1',
+'uploadjava' => 'Sto file xe un file ZIP che contien un file Java ".class".
+Cargar file Java no xe consentìo, parché łi podarìa cauxare on ajiramento de łe restrision de sicuresa.',
 'upload-source' => 'File de origine',
 'sourcefilename' => 'Nome del file de origine:',
 'sourceurl' => 'URL de origine:',
@@ -1521,6 +1616,31 @@ Se el problema el persiste, contatar un [[Special:ListUsers/sysop|aministrador]]
 'upload-too-many-redirects' => "In te l'URL ghe jera massa rimandi",
 'upload-unknown-size' => 'Dimension sconossiùa',
 'upload-http-error' => 'Se gà verificà un eròr HTTP: $1',
+'upload-copy-upload-invalid-domain' => 'No xe consentìo cargare copie da sto dominio.',
+
+# File backend
+'backend-fail-stream' => 'Inposibiłe traxmetare el file $1.',
+'backend-fail-backup' => 'Inposibiłe fare el backup del file $1.',
+'backend-fail-notexists' => 'El file $1 no existe.',
+'backend-fail-hashes' => "Inposibiłe otegnere el hash dei file pa'l confronto.",
+'backend-fail-notsame' => 'Existe xà un file no identico a  $1 .',
+'backend-fail-invalidpath' => '$1 no xe un percorso de archiviasion vałido.',
+'backend-fail-delete' => 'Inposibiłe scançełare el file "$1".',
+'backend-fail-alreadyexists' => 'El file $1 existe xà.',
+'backend-fail-store' => 'Inposibiłe memorixare el file  $1  in  $2 .',
+'backend-fail-copy' => 'Inposibiłe copiare el file "$1" in "$2".',
+'backend-fail-move' => 'Inposibiłe spostare el file  $1  in  $2 .',
+'backend-fail-opentemp' => 'Inposibiłe verxare el file tenporaneo',
+'backend-fail-writetemp' => 'Inposibiłe creare el file tenporaneo.',
+'backend-fail-closetemp' => 'Inposibiłe sarare el file tenporaneo',
+'backend-fail-read' => 'Inposibiłe lexare el file $1.',
+'backend-fail-create' => 'Inposibiłe creare el file "$1".',
+'backend-fail-maxsize' => 'Inposibiłe creare el file $1 parché el xe pi grando de {{PLURAL:$2|un|$2}} byte.',
+'backend-fail-readonly' => 'El backend "$1" xe atualmente in soła letura. La raxon indicà xe: "$2"',
+'backend-fail-synced' => 'El file "$1" xe incoerente rento i backend de ła memoria interna.',
+'backend-fail-connect' => 'Inposibiłe conétarse al backend de memoria "$1".',
+'backend-fail-internal' => 'Se ga verifegà on erore sconosùo nte\'l backend de memoria "$1".',
+'backend-fail-usable' => 'Inposibiłe modifegare el file $1 a cauxa de autorixasion insuficenti o directory mancanti.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Acesso negà',
@@ -1539,6 +1659,7 @@ Xe parmesso entrar solo in tei file, no in te le cartèle.',
 Sta wiki la xe configurà come pùblica.
 Par na major sicuressa, img_auth.php el xe disabilità.',
 'img-auth-noread' => 'L\'utente no\'l gà mia dirito de lèzar "$1".',
+'img-auth-bad-query-string' => "L'indiriso URL contien na stringa de query invałida.",
 
 # HTTP errors
 'http-invalid-url' => 'URL mia valido: $1',
@@ -1564,9 +1685,8 @@ Par na major sicuressa, img_auth.php el xe disabilità.',
 'upload_source_file' => ' (un file sul to computer)',
 
 # Special:ListFiles
-'listfiles-summary' => "Sta pagina speciale la fa védar tuti i file caricài.
-I file caricài piessè de recente i vien mostrà a l'inizio de la lista.
-Par modificar l'ordinamento, struca su l'intestazion de la colona presièlta.",
+'listfiles-summary' => "Sta pajina speciałe ła fa vedare tuti i file caricadi.
+Se l'utente modifega l'ordenamento, vien mostradi soło i file caricadi pi de recente da l'utente.",
 'listfiles_search_for' => 'Serca file par nome:',
 'imgfile' => 'file',
 'listfiles' => 'Lista dei file',
@@ -1689,7 +1809,7 @@ Qua soto vien mostrà la descrission presente in te la [$2 pàxena de descrissio
 'statistics-users-active-desc' => "Utenti che gà fato almanco un'azion in {{PLURAL:$1|tel'ultimo zorno|in tei ultimi $1 zorni}}",
 'statistics-mostpopular' => 'Pagine piassè visità',
 
-'disambiguations' => 'Pagine de disanbigua',
+'disambiguations' => 'Pajine cołegade a pajine de dixanbiguasion',
 'disambiguationspage' => 'Template:Disambigua',
 'disambiguations-text' => "Le pagine ne la lista che segue le contien dei colegamenti a '''pagine de disanbiguazion''' e no a l'argomento a cui le dovarìà far riferimento.<br />
 Vien considerà pagine de disanbiguazion tute quele che contien i modèi elencà in [[MediaWiki:Disambiguationspage]]",
@@ -1785,8 +1905,8 @@ Par piaser tien conto che altri siti web i podarìa realizar colegamenti ai file
 'booksources-invalid-isbn' => "El nùmaro ISBN inserìo no'l xe mia valido: controla de novo se te lo ghè copià justo da la fonte originale.",
 
 # Special:Log
-'specialloguserlabel' => 'Utente:',
-'speciallogtitlelabel' => 'Titolo:',
+'specialloguserlabel' => 'Asion efetuà da:',
+'speciallogtitlelabel' => 'Asion efetuà so:',
 'log' => 'Registri',
 'all-logs-page' => 'Tuti i registri pùblici',
 'alllogstext' => 'Vixualixazion unificà de tuti i registri disponibili de {{SITENAME}}.
@@ -1826,12 +1946,13 @@ Varda anca le [[Special:WantedCategories|categorie domandà]].',
 'sp-deletedcontributions-contribs' => 'contributi',
 
 # Special:LinkSearch
-'linksearch' => 'Colegamenti foresti',
+'linksearch' => 'Riçerca cołegamenti esterni',
 'linksearch-pat' => 'Espression de riserca:',
 'linksearch-ns' => 'Namespace:',
 'linksearch-ok' => 'Serca',
-'linksearch-text' => 'Se pol doparar dei metacaràteri, par es. "*.wikipedia.org".<br />
-Protocòli suportè: <tt>$1</tt>',
+'linksearch-text' => 'Xe posibiłe doparare metacarateri, come "*.wikipedia.org".<br />
+Xe necesario almanco un dominio de primo liveło, tipo "*.org".<br />
+Protocołi suportadi: <tt>$1</tt> (no sta xontare nesuno de sti cuà inte ła to riçerca).',
 'linksearch-line' => '$1 presente ne la pagina $2',
 'linksearch-error' => "I metacaràteri i pode vegner doparài solo a l'inizio del nome de l'host.",
 
@@ -2024,7 +2145,8 @@ L'ultima modefega l'è stà fata da [[User:$3|$3]] ([[User talk:$3|discussion]]{
 
 # Protect
 'protectlogpage' => 'Protesion',
-'protectlogtext' => 'De seguito xe elencàe le azion de protezion e sbloco de le pagine.',
+'protectlogtext' => "De seguito xe elencade łe modifeghe ałe protesion dełe pajine.
+Vedi ła [[Special:ProtectedPages|lista dełe pajine protete]] pa l'elenco de łe protesion de pajina atualmente ative.",
 'protectedarticle' => 'ga proteto "[[$1]]"',
 'modifiedarticleprotection' => "gà canbià el livèl de protession de ''[[$1]]''",
 'unprotectedarticle' => 'gà sblocà "[[$1]]"',
@@ -2217,8 +2339,8 @@ $1',
 'ipb-confirm' => 'Conferma el bloco',
 'badipaddress' => "L'indirisso IP indicà no'l xè mìa coreto.",
 'blockipsuccesssub' => 'Bloco eseguìo',
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] l'è sta bloccà.<br />
-Varda [[Special:BlockList|lista IP bloccati]] par védar tuti i blochi.",
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] xe stà blocà.<br />
+Varda [[Special:BlockList|lista IP blocadi]] par vedare tuti i blochi.',
 'ipb-blockingself' => 'Sito drio blocar te steso! Sito sicuro de voerlo fare?',
 'ipb-edit-dropdown' => 'Motivi par el bloco',
 'ipb-unblock-addr' => 'Sbloca $1',
@@ -2257,7 +2379,7 @@ Qua soto ghe xe el registro dei blochi:',
 Qua soto ghe xe el registro de le sopression:',
 'blocklogentry' => 'ga blocà [[$1]] par un periodo de $2 $3',
 'reblock-logentry' => "gà canbià le inpostassion del bloco par [[$1]] co' na scadensa de $2 $3",
-'blocklogtext' => "Sto qua xè un elenco de azioni de bloco e sbloco dei indirizi IP. I indirizi blocai in automatico no i xè mìa elencai. Varda l'[[Special:BlockList|elenco dei IP blocà]] par la lista dei indirizi el cui bloco el xè operativo.",
+'blocklogtext' => "Sto cua xe un elenco de asion de bloco e sbloco de indirizi IP de utenti. I indirisi blocadi in automatego no xe elencadi. Varda l'[[Special:BlockList|elenco dei IP blocadi]] pa ła lista dei indirisi che ga un bloco operativo.",
 'unblocklogentry' => 'ga sblocà $1',
 'block-log-flags-anononly' => 'solo utenti anonimi',
 'block-log-flags-nocreate' => 'creasion acount blocà',
@@ -2460,8 +2582,8 @@ Tute łe operazion de inportazion trans-wiki łe xè notà nel [[Special:Log/imp
 'import-interwiki-namespace' => 'Namespace de destinassion:',
 'import-upload-filename' => 'Nome del file:',
 'import-comment' => 'Comento:',
-'importtext' => 'Par piaser, esporta el file da la wiki de origine doparando la [[Special:Export|funsion de esportassion]].
-Salvalo sul to computer e càrghelo qua.',
+'importtext' => "Se połe esportare el file da ła fonte wiki doparando ła [[Special:Export|funsion de esportasion]].
+Salveło so'l to conpiuter e carghelo cuà.",
 'importstart' => 'Inportazion de łe pàxene in corso...',
 'import-revision-count' => '{{PLURAL:$1|una revixion importà|$1 revixion importae}}',
 'importnopages' => 'Nissuna pàxena da inportar.',
@@ -2511,7 +2633,7 @@ Salvalo sul to computer e càrghelo qua.',
 'tooltip-ca-viewsource' => 'Sta pagina la xe proteta, ma te poli vardar el so testo',
 'tooltip-ca-history' => 'Version vece de sta pagina',
 'tooltip-ca-protect' => 'Protezi sta pagina',
-'tooltip-ca-unprotect' => 'Cava la protession a sta pagina',
+'tooltip-ca-unprotect' => 'Canbia ła protesion de sta pajina',
 'tooltip-ca-delete' => 'Scansela sta pagina',
 'tooltip-ca-undelete' => "Ripristina la pàxena come l'era prima de la scancelassion",
 'tooltip-ca-move' => 'Sposta sta pagina',
@@ -2710,8 +2832,8 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-colorspace' => 'Spazio de i cołori',
 'exif-componentsconfiguration' => 'Significato de ciascuna componente',
 'exif-compressedbitsperpixel' => 'Modalità de compression imagine',
-'exif-pixelydimension' => 'Largheza efetiva imagine',
-'exif-pixelxdimension' => 'Alteza efetiva imagine',
+'exif-pixelydimension' => 'Larghesa imajine',
+'exif-pixelxdimension' => 'Altesa imajine',
 'exif-usercomment' => "Note de l'utente",
 'exif-relatedsoundfile' => 'File audio cołegà',
 'exif-datetimeoriginal' => 'Data e ora de creassion de i dati',
@@ -2725,9 +2847,9 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-exposureprogram' => 'Programa de esposission',
 'exif-spectralsensitivity' => 'Sensibilità spetrałe',
 'exif-isospeedratings' => 'Sensibiłità ISO',
-'exif-shutterspeedvalue' => 'Tenpo de esposission',
-'exif-aperturevalue' => 'Apertura',
-'exif-brightnessvalue' => 'Luminosità',
+'exif-shutterspeedvalue' => "Vełoçità de l'oturatore APEX",
+'exif-aperturevalue' => 'Apertura APEX',
+'exif-brightnessvalue' => 'Luminoxità APEX',
 'exif-exposurebiasvalue' => 'Coression esposission',
 'exif-maxaperturevalue' => 'Massima apertura',
 'exif-subjectdistance' => 'Distansa de el sojeto',
@@ -2789,6 +2911,7 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-gpsareainformation' => 'Nome de ła xòna GPS',
 'exif-gpsdatestamp' => 'Data GPS',
 'exif-gpsdifferential' => 'Corezion diferensiałe GPS',
+'exif-objectname' => 'Titoło curto',
 
 # EXIF attributes
 'exif-compression-1' => 'No conpresso',
@@ -2800,9 +2923,9 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-orientation-3' => 'Ruotà de 180°',
 'exif-orientation-4' => 'Roersà verticalmente',
 'exif-orientation-5' => 'Ruotà 90° in senso antiorario e roersà verticalmente',
-'exif-orientation-6' => 'Ruotà 90° in senso orario',
+'exif-orientation-6' => 'Jirare de 90° in senso antiorario',
 'exif-orientation-7' => 'Ruotà 90° in senso orario e capovolto verticalmente',
-'exif-orientation-8' => 'Ruotà 90° in senso antiorario',
+'exif-orientation-8' => 'Jirà de 90° in senso orario',
 
 'exif-planarconfiguration-1' => 'a blochi (chunky)',
 'exif-planarconfiguration-2' => 'lineare (planar)',
@@ -2877,6 +3000,8 @@ I colegamenti dopo, su la stessa riga, i xe considerai come ecession (cioè, pag
 'exif-sensingmethod-7' => 'Sensore triłineare',
 'exif-sensingmethod-8' => 'Sensor łinear cołor sequensiałe',
 
+'exif-filesource-3' => 'Fotocamara dijitałe',
+
 'exif-scenetype-1' => 'Fotografia direta',
 
 'exif-customrendered-0' => 'Processo normałe',
@@ -2996,6 +3121,17 @@ $3
 Se l\'acount *no* te o ghe rejistrà ti, verzi st\'altro cołegamento par anułar ła conferma de l\'indiriso e-mail:
 $5
 El codexe de conferma el scadrà en automatego a łe $4.',
+'confirmemail_body_set' => 'Qualcheduni, probabilmente ti steso da l\'indiriso IP $1, el ga rejistrà n\'acount "$2" con sto indiriso de posta eletronega so {{SITENAME}}.
+
+Par confermare che sto acount el xe veramente tuo e poder riativar łe funsion rełative a l\'e-mail so {{SITENAME}} verxi sto cołegamento ntel to browser:
+
+$3
+
+Se l\'acount *no* te o ghe rejistrà ti, verxi st\'altro cołegamento par anułar ła conferma de l\'indiriso de posta eletronega:
+
+$5
+
+El codexe de conferma el scadarà en automatego a łe $4.',
 'confirmemail_invalidated' => 'Richiesta de conferma indirizo e-mail anulà',
 'invalidateemail' => 'Anula richiesta de conferma e-mail',
 
@@ -3092,6 +3228,7 @@ Nota che te pol anca [[Special:EditWatchlist|modificar la lista con l'interfacia
 'version-specialpages' => 'Pagine speciali',
 'version-parserhooks' => 'Hook del parser',
 'version-variables' => 'Variabili',
+'version-skins' => 'Aspeto grafego',
 'version-other' => 'Altro',
 'version-mediahandlers' => 'Gestori de contenuti multimediài',
 'version-hooks' => 'Hook',
@@ -3210,28 +3347,28 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'sqlite-no-fts' => '$1 sensa la possibilità de riserca completa nel testo',
 
 # New logging system
-'logentry-delete-delete' => '$1 ga scanselà la pajina $3',
+'logentry-delete-delete' => '$1 ga scansełà ła pajina $3',
 'logentry-delete-restore' => '$1 ga ripristinà "$3"',
-'logentry-delete-event' => '$1 ga canbià la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
-'logentry-delete-revision' => '$1 ga canbià la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de la pajina"$3": $4',
-'logentry-delete-event-legacy' => '$1 ga canbià la vixibilità de calche asion del registro de "$3"',
-'logentry-delete-revision-legacy' => '$1 ga canbià la vixibilità par le revixion de la pajina $3',
+'logentry-delete-event' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
+'logentry-delete-revision' => '$1 ga canbià ła vixibiłità de {{PLURAL:$5|na revixion|$5 revixion}} de ła pajina"$3": $4',
+'logentry-delete-event-legacy' => '$1 ga canbià ła vixibiłità de calche asion del registro de "$3"',
+'logentry-delete-revision-legacy' => '$1 ga canbià ła vixibiłità par łe revixion de ła pajina $3',
 'logentry-suppress-delete' => '$1 ga sconto la pajina "$3"',
 'logentry-suppress-event' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|n\'asion del registro|$5 asion del registro}} de "$3": $4',
 'logentry-suppress-revision' => '$1 ga canbià de scondón la vixibilità de {{PLURAL:$5|na revixion|$5 revixion}} de "$3": $4',
 'logentry-suppress-event-legacy' => '$1 ga canbià de scondón la vixibilità de calche asion del registro de "$3"',
 'logentry-suppress-revision-legacy' => '$1 ga canbià de scondón la vixibilità de calche revixion de $3',
 'revdelete-content-hid' => 'contegnùo sconto',
-'revdelete-summary-hid' => 'ogeto de la modifega sconto',
+'revdelete-summary-hid' => 'ogeto de ła modifega sconto',
 'revdelete-uname-hid' => 'nome utente sconto',
 'revdelete-content-unhid' => 'contegnùo ripristinà',
 'revdelete-summary-unhid' => 'ogeto ripristinà',
 'revdelete-uname-unhid' => 'nome utente ripristinà',
 'revdelete-restricted' => 'aplicà restrizioni ai aministradori',
 'revdelete-unrestricted' => 'gà cavà le limitazion par i aministradori',
-'logentry-move-move' => '$1 ga spostà la pajina $3 a $4',
-'logentry-move-move-noredirect' => '$1 ga spostà la pajina $3 a $4 sensa metare un rimando',
-'logentry-move-move_redir' => '$1 ga spostà la pajina $3 a $4 metendo un rimando',
+'logentry-move-move' => '$1 ga spostà ła pajina $3 a $4',
+'logentry-move-move-noredirect' => '$1 ga spostà ła pajina $3 a $4 sensa metare un rimando',
+'logentry-move-move_redir' => '$1 ga spostà ła pajina $3 a $4 lasiando un rimando',
 'logentry-move-move_redir-noredirect' => '$1 ga spostà la pajina $3 a $4 al posto de un rimando sensa metare un rimando',
 'logentry-patrol-patrol' => '$1 ga segnà la revixion $4 de la pajina $3 come verifegà',
 'logentry-patrol-patrol-auto' => '$1 ga segnà automategamente la revixion $4 de la pajina $3 come verifegà',
index 1ab293b..0ae2302 100644 (file)
@@ -277,6 +277,7 @@ $messages = array(
 'delete' => 'Čuta poiš',
 'deletethispage' => "Čuta nece lehtpol'",
 'undelete_short' => "Endištada {{PLURAL:$1|üks' redakcii|$1 redakcijad}}",
+'viewdeleted_short' => 'Kc. {{PLURAL:$1|čutud redakcii|$1 čutud redakcijad}}',
 'protect' => 'Kaita',
 'protect_change' => 'toižetada',
 'protectthispage' => "Kaita nece lehtpol'",
@@ -583,7 +584,10 @@ Aigaline peitsana: $2',
 'passwordreset-emailsent' => 'Muštatai kirjeine oigetihe e-počtadme',
 
 # Special:ChangeEmail
+'changeemail' => 'Toižetada e-počtan adres',
+'changeemail-no-info' => 'Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.',
 'changeemail-newemail' => "Uz' e-počtan adres",
+'changeemail-none' => '(ei ole)',
 'changeemail-submit' => 'Toižetada e-počtan adres',
 'changeemail-cancel' => 'Heitta',
 
@@ -689,9 +693,10 @@ Alemba om anttud jälgmäine kirjutuz blokiruindaiglehtesespäi:",
 'updated' => '(Udištadud)',
 'note' => "'''Homaičend:'''",
 'previewnote' => "'''Muštkat, miše nece om vaiše ezikacund.''' 
-Teiden toižetused ei olgoi völ kirjutadud! [[#editform|→ jatkta redakrtiruind]]",
+Teiden toižetused ei olgoi völ kirjutadud!",
 'previewconflict' => "Tekst redaktiruindan üläiknas kuvazub neche ezikacundha muga, kut se nägub lopkirjutamižen jäl'ghe.",
 'editing' => '$1-lehtpolen redaktiruind',
+'creating' => 'Sätas $1',
 'editingsection' => '$1-lehtpolen redaktiruind (jaguz)',
 'editingcomment' => "$1-lehtpolen redaktiruind (uz' jaguz)",
 'editconflict' => 'Redaktiruindan konflikt: $1',
@@ -754,6 +759,7 @@ Voib olda, se om jo čutud.",
 'edit-no-change' => 'Teiden redakcii ignoriruidihe, sikš miše tekst ei ole toižetadud.',
 'edit-already-exists' => "Ei voi säta uz' lehtpol'.
 Wikiš om jo mugoi lehtpol'.",
+'defaultmessagetext' => 'Tekst augotižjärgendusen mödhe',
 
 # Parser/template warnings
 'expensive-parserfunction-category' => 'Lehtpoled, kudambil kävutadas äjahko resursokahid funkcijoid',
@@ -900,7 +906,7 @@ Tö ei voigoi kävutada sidä.',
 
 # Diffs
 'history-title' => '"$1"-lehtpolen toižetusiden istorii',
-'difference' => '(Erod versijoiden keskes)',
+'difference-multipage' => '(Lehtpoliden erinend)',
 'lineno' => 'Rivi $1:',
 'compareselectedversions' => 'Rindatada valitud versijad',
 'showhideselectedversions' => 'Ozutada/peitta valitud versijad',
@@ -1051,6 +1057,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 'prefs-files' => 'Failad',
 'prefs-custom-css' => 'Ičeze CSS',
 'prefs-custom-js' => 'Ičeze JS',
+'prefs-common-css-js' => 'Ühthižed CSS/JavaScript kaikiden temiden täht:',
 'prefs-reset-intro' => "Tö sat kävutada nece lehtpol', miše pördutada teiden järgendused saitan ezijärgendusidennoks.
 Necidä tegendad ei sa toižetada.",
 'prefs-emailconfirm-label' => 'E-počtan vahvištand:',
@@ -1242,7 +1249,7 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 'nchanges' => '$1 {{PLURAL:$1|toižetuz|toižetust}}',
 'recentchanges' => 'Tantoižed toižetused',
 'recentchanges-legend' => 'Tantoižiden toižetusiden järgendused',
-'recentchangestext' => 'Necil lehtpolil om tantoižid toižetusid {{SITENAME}}-saital.',
+'recentchanges-summary' => 'Necil lehtpolil om tantoižid toižetusid {{SITENAME}}-saital.',
 'recentchanges-feed-description' => "Kacelta jäl'gmäižid toižetusid wikiš neciš valus.",
 'recentchanges-label-newpage' => 'Nece redakcii sädi uden lehtpolen',
 'recentchanges-label-minor' => 'Nece redakcii om penikaine',
@@ -1269,6 +1276,7 @@ Ku tö kirjutat sen, nece nimi kävutadas, miše ozutada lehtpolen toižetajad.'
 'rc_categories' => 'Vaiše kategorijoišpäi (erigoitkat znamaižel "|")',
 'rc_categories_any' => 'Eraz',
 'rc-change-size' => '$1',
+'rc-change-size-new' => "$1 {{PLURAL:$1|bait|baitad}} jäl'ges toižetamišt",
 'newsectionsummary' => "/* $1 */ uz' jaguz",
 'rc-enhanced-expand' => 'Ozutada detalid (JavaScript)',
 'rc-enhanced-hide' => 'Peitta detalid',
@@ -2389,7 +2397,7 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
 
 # Patrolling
 'markaspatrolleddiff' => 'Znamoita kut patruliruidud',
-'markaspatrolledtext' => "Zmamoita nece lehtpol' kut patruliruidud",
+'markaspatrolledtext' => "Znamoita nece lehtpol' kut patruliruidud",
 'markedaspatrolled' => 'Om znamoitud kut patruliruidud',
 'markedaspatrolledtext' => 'Valitud [[:$1]]-n versii om znamoitud kut patruliruidud.',
 'rcpatroldisabled' => "Jäl'gmäižiden toižetusiden patruliruind ei ole kävutamas",
@@ -2871,7 +2879,7 @@ Necen vahvištoitandkodan kävutamižen lopstrok om $4.',
 'autosumm-blank' => 'Lehtpolen südäiolend om čutud',
 'autosumm-replace' => "Lehtpolen südäiolend om vajehtud '$1'-südäiolendaks",
 'autoredircomment' => 'Om läbioigetud [[$1]]-lehtpolele',
-'autosumm-new' => "Om sätud uz' lehtpol', kudamban suruz om '$1'",
+'autosumm-new' => "Om sätud uz' lehtpol', kudamban südäiolend om '$1'",
 
 # Size units
 'size-bytes' => '$1 b',
index 64aa47b..82292c3 100644 (file)
@@ -15,6 +15,7 @@
  * @author Mxn
  * @author Neoneurone
  * @author Nguyễn Thanh Quang
+ * @author Prenn
  * @author Thaisk
  * @author Thanhtai2009
  * @author Tmct
@@ -58,12 +59,14 @@ $specialPageAliases = array(
        'Allmessages'               => array( 'Mọi_thông_báo' ),
        'Allpages'                  => array( 'Mọi_bài' ),
        'Ancientpages'              => array( 'Trang_cũ' ),
+       'Badtitle'                  => array( 'Tựa_đề_hỏng' ),
        'Blankpage'                 => array( 'Trang_trắng' ),
        'Block'                     => array( 'Cấm_IP' ),
        'Blockme'                   => array( 'Khóa_tôi', 'Khoá_tôi' ),
        'Booksources'               => array( 'Nguồn_sách' ),
        'BrokenRedirects'           => array( 'Đổi_hướng_sai' ),
        'Categories'                => array( 'Thể_loại' ),
+       'ChangeEmail'               => array( 'Đổi_thư_điện_tử' ),
        'ChangePassword'            => array( 'Đổi_mật_khẩu' ),
        'ComparePages'              => array( 'So_sánh_trang' ),
        'Confirmemail'              => array( 'Xác_nhận_thư' ),
@@ -81,11 +84,12 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'Đường_dẫn_tập_tin', 'Đường_dẫn_file' ),
        'Import'                    => array( 'Nhập' ),
        'Invalidateemail'           => array( 'Hủy_thư', 'Hủy_thư_điện_tử', 'Huỷ_thư', 'Huỷ_thư_điện_tử', 'Tắt_thư' ),
+       'JavaScriptTest'            => array( 'Thử_JavaScript' ),
        'BlockList'                 => array( 'Danh_sách_cấm' ),
        'LinkSearch'                => array( 'Tìm_liên_kết' ),
        'Listadmins'                => array( 'Danh_sách_bảo_quản_viên', 'Danh_sách_admin' ),
        'Listbots'                  => array( 'Danh_sách_bot', 'Danh_sách_robot' ),
-       'Listfiles'                 => array( 'Danh_sách_hình', 'Danh_sách_tập_tin' ),
+       'Listfiles'                 => array( 'Danh_sách_tập_tin', 'Danh_sách_hình' ),
        'Listgrouprights'           => array( 'Quyền_nhóm_người_dùng' ),
        'Listredirects'             => array( 'Trang_đổi_hướng' ),
        'Listusers'                 => array( 'Danh_sách_thành_viên' ),
@@ -297,7 +301,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Ẩn sửa đổi đã tuần tra trong trang thay đổi gần đây',
 'tog-newpageshidepatrolled' => 'Ẩn trang đã tuần tra trong danh sách các trang mới',
 'tog-extendwatchlist' => 'Mở rộng danh sách theo dõi để hiển thị tất cả các thay đổi, chứ không chỉ các thay đổi gần đây',
-'tog-usenewrc' => 'Sử dụng Thay đổi gần đây nâng cao (cần JavaScript)',
+'tog-usenewrc' => 'Thu gọn các thay đổi theo trang trong thay đổi gần đây và danh sách theo dõi (cần JavaScript)',
 'tog-numberheadings' => 'Tự động đánh số các đề mục',
 'tog-showtoolbar' => 'Hiển thị thanh định dạng (JavaScript)',
 'tog-editondblclick' => 'Nhấn đúp để sửa đổi trang (JavaScript)',
@@ -415,7 +419,7 @@ $messages = array(
 'category-article-count-limited' => '{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại hiện hành.',
 'category-file-count' => '{{PLURAL:$2|Thể loại này có tập tin sau.|{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại này, trong tổng số $2 tập tin.}}',
 'category-file-count-limited' => '{{PLURAL:$1|Tập tin|$1 tập tin}} sau nằm trong thể loại hiện hành.',
-'listingcontinuesabbrev' => 'tiếp',
+'listingcontinuesabbrev' => '(tiếp theo)',
 'index-category' => 'Trang được ghi chỉ mục',
 'noindex-category' => 'Trang không hiển thị trong bộ máy tìm kiếm',
 'broken-file-category' => 'Trang nhúng tập tin không tồn tại',
@@ -453,7 +457,7 @@ $messages = array(
 'vector-view-create' => 'Tạo',
 'vector-view-edit' => 'Sửa',
 'vector-view-history' => 'Xem lịch sử',
-'vector-view-view' => 'Xem',
+'vector-view-view' => 'Đọc',
 'vector-view-viewsource' => 'Xem mã nguồn',
 'actions' => 'Tác vụ',
 'namespaces' => 'Không gian tên',
@@ -677,6 +681,10 @@ Lý do được cung cấp là ''$2''.",
 'filereadonlyerror' => 'Không thể sửa đổi tập tin “$1” vì kho tập tin “$2” đang ở chế độ chỉ-đọc.
 
 Bảo quản viên khóa nó đưa lý do là: “$3”.',
+'invalidtitle-knownnamespace' => 'Tựa trang không hợp lệ có không gian tên “$2” và văn bản “$3”',
+'invalidtitle-unknownnamespace' => 'Tựa trang không hợp lệ có không gian tên số $1 không rõ và văn bản “$2”',
+'exception-nologin' => 'Chưa đăng nhập',
+'exception-nologin-text' => 'Bạn cần phải đăng nhập để truy cập trang hoặc thực hiện tác vụ này tại wiki này.',
 
 # Virus scanner
 'virus-badscanner' => "Cấu hình sau: không nhận ra bộ quét virus: ''$1''",
@@ -776,7 +784,7 @@ Xin hãy đợi chốc lát rồi thử lại.',
 
 # Change password dialog
 'resetpass' => 'Đổi mật khẩu',
-'resetpass_announce' => 'Bạn Ä\91ã Ä\91Ä\83ng nhập bằng mật khẩu tạm gá»\9fi qua e-mail. Để hoàn tất việc đăng nhập, bạn phải tạo lại mật khẩu mới tại đây:',
+'resetpass_announce' => 'Bạn Ä\91ã Ä\91Ä\83ng nhập bằng mật khẩu tạm gá»­i qua thÆ° Ä\91iá»\87n tá»­. Để hoàn tất việc đăng nhập, bạn phải tạo lại mật khẩu mới tại đây:',
 'resetpass_text' => '<!-- Nhập văn bản vào đây -->',
 'resetpass_header' => 'Đổi mật khẩu cho tài khoản',
 'oldpassword' => 'Mật khẩu cũ:',
@@ -959,7 +967,8 @@ Nó chưa được lưu!'''",
 'updated' => '(Cập nhật)',
 'note' => "'''Ghi chú:'''",
 'previewnote' => "'''Đây chỉ mới là xem thử.'''
-Các thay đổi của bạn vẫn chưa được lưu! [[#editform|→ Sửa tiếp]]",
+Các thay đổi của bạn vẫn chưa được lưu!",
+'continue-editing' => 'Sửa tiếp',
 'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
 'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
 Xin hãy thử lần nữa.
@@ -975,7 +984,7 @@ sửa đổi. Việc hủy bỏ này nhằm tránh nội dung trang bị hỏng.
 Điều này thường xảy ra khi bạn sử dụng một dịch vụ proxy vô danh trên web có vấn đề.'''",
 'edit_form_incomplete' => "'''Một số phần của biểu mẫu sửa đổi không tới được máy chủ. Hãy kiểm tra rằng các sửa đổi của bạn còn nguyên và thử lại.'''",
 'editing' => 'Sửa đổi $1',
-'creating' => 'Đang tạo $1',
+'creating' => 'Tạo $1',
 'editingsection' => 'Sửa đổi $1 (đề mục)',
 'editingcomment' => 'Sửa đổi $1 (đề mục mới)',
 'editconflict' => 'Sửa đổi mâu thuẫn: $1',
@@ -1054,6 +1063,12 @@ 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á',
+'parser-unstrip-loop-warning' => 'Vòng lặp unstrip',
+'parser-unstrip-recursion-limit' => 'Đã vượt quá giới hạn về độ sâu đệ quy unstrip ($1)',
 
 # "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.',
@@ -1198,7 +1213,7 @@ Xin hãy kiểm tra nhật trình.',
 # Suppression log
 'suppressionlog' => 'Nhật trình ẩn giấu',
 'suppressionlogtext' => 'Dưới đây là danh sách các tác vụ xóa và cấm liên quan đến nội dung mà các quản lý không nhìn thấy.
-Xem [[Special:BlockList|danh sách các IP bị cấm]] để xem danh sách các tác vụ cấm chỉ và cấm thông thường hiện nay.',
+Xem [[Special:BlockList|danh sách cấm]] để xem danh sách các tác vụ cấm chỉ và cấm thông thường hiện nay.',
 
 # History merging
 'mergehistory' => 'Trộn lịch sử trang',
@@ -1231,7 +1246,8 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
 
 # Diffs
 'history-title' => 'Lịch sử sửa đổi của “$1”',
-'difference' => '(Khác biệt giữa các bản)',
+'difference-title' => 'Khác biệt giữa các bản “$1”',
+'difference-title-multipage' => 'Khác biệt giữa các trang “$1” và “$2”',
 'difference-multipage' => '(Khác biệt giữa các trang)',
 'lineno' => 'Dòng $1:',
 'compareselectedversions' => 'So sánh các bản đã chọn',
@@ -1326,6 +1342,7 @@ Xin hãy bảo đảm giữ vững tính liên tục của lịch sử trang.',
 'prefs-beta' => 'Tính năng beta',
 'prefs-datetime' => 'Ngày tháng',
 'prefs-labs' => 'Tính năng phòng thí nghiệm',
+'prefs-user-pages' => 'Trang cá nhân',
 'prefs-personal' => 'Thông tin cá nhân',
 'prefs-rc' => 'Thay đổi gần đây',
 'prefs-watchlist' => 'Theo dõi',
@@ -1414,7 +1431,7 @@ Thông tin này là công khai.',
 Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao của bạn.',
 'prefs-help-email' => 'Địa chỉ thư điện tử là tùy chọn, nhưng nó giúp chúng tôi gửi cho bạn mật khẩu mới qua thư điện tử nếu bạn quên mật khẩu của mình.',
 'prefs-help-email-others' => 'Bạn cũng có thể lựa chọn cho phép người khác liên lạc với bạn thông qua trang cá nhân hoặc trang thảo luận cá nhân mà không cần để lộ danh tính.',
-'prefs-help-email-required' => 'Bắt buộc phải có địa chỉ e-mail.',
+'prefs-help-email-required' => 'Bắt buộc phải có địa chỉ thư điện tử.',
 'prefs-info' => 'Thông tin cơ bản',
 'prefs-i18n' => 'Quốc tế hóa',
 'prefs-signature' => 'Chữ ký',
@@ -1513,7 +1530,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'right-suppressrevision' => 'Xem lại và phục hồi phiên bản mà Sysop không thấy',
 'right-suppressionlog' => 'Xem nhật trình riêng tư',
 'right-block' => 'Cấm thành viên khác sửa đổi',
-'right-blockemail' => 'Cấm thành viên gửi thư',
+'right-blockemail' => 'Cấm người dùng gửi thư điện tử',
 'right-hideuser' => 'Cấm thành viên, rồi ẩn nó đi',
 'right-ipblock-exempt' => 'Bỏ qua cấm IP, tự động cấm và cấm dải IP',
 'right-proxyunbannable' => 'Bỏ qua cấm proxy tự động',
@@ -1589,7 +1606,7 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'nchanges' => '$1 {{PLURAL:$1|thay đổi|thay đổi}}',
 'recentchanges' => 'Thay đổi gần đây',
 'recentchanges-legend' => 'Tùy chọn thay đổi gần đây',
-'recentchangestext' => 'Xem các thay đổi gần đây nhất tại wiki trên trang này.',
+'recentchanges-summary' => 'Xem các thay đổi gần đây nhất tại wiki trên trang này.',
 'recentchanges-feed-description' => 'Theo dõi các thay đổi gần đây nhất của wiki dùng nguồn tin này.',
 'recentchanges-label-newpage' => 'Bản sửa này tạo ra trang mới',
 'recentchanges-label-minor' => 'Đây là một sửa đổi nhỏ',
@@ -1795,14 +1812,15 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
 'backend-fail-writetemp' => 'Không thể ghi vào tập tin tạm thời.',
 'backend-fail-closetemp' => 'Không thể đóng tập tin tạm thời.',
 'backend-fail-read' => 'Không thể đọc tập tin $1.',
-'backend-fail-create' => 'Không thể tạo tập tin $1.',
-'backend-fail-maxsize' => 'Không thể tạo tập tin $1 vì nó lớn hơn $2 byte.',
+'backend-fail-create' => 'Không thể ghi tập tin $1.',
+'backend-fail-maxsize' => 'Không thể ghi tập tin $1 vì nó lớn hơn $2 byte.',
 'backend-fail-readonly' => 'Phía sau lưu trữ “$1” đang ở chế độ chỉ-đọc. Lý do đưa ra là: “$2”',
 'backend-fail-synced' => 'Tập tin “$1” đang có trạng thái không nhất quán đối với các phía sau lưu trữ nội bộ',
 'backend-fail-connect' => 'Không thể kết nối đến phía sau lưu trữ “$1”.',
 'backend-fail-internal' => 'Lỗi không rõ xuất hiện trong phía sau lưu trữ “$1”.',
 'backend-fail-contenttype' => 'Không thể xác định kiểu nội dung của tập tin để lưu giữ tại “$1”.',
 'backend-fail-batchsize' => 'Phía sau lưu trữ đã nhận một loạt $1 thao tác tập tin; mức hạn là $2 thao tác.',
+'backend-fail-usable' => 'Không thể ghi tập tin $1 vì không có đủ quyền hoặc những thư mục hay nơi đựng bị thiếu.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Không thể kết nối với cơ sở dữ liệu nhật ký của phía sau lưu trữ “$1”.',
@@ -2121,6 +2139,7 @@ Xin lưu ý là các trang Web bên ngoài có thể liên kết đến một t
 Bạn có thể thu hẹp kết quả bằng cách chọn loại nhật trình, tên thành viên (phân biệt chữ hoa-chữ thường), hoặc các trang bị ảnh hưởng (cũng phân biệt chữ hoa-chữ thường).',
 'logempty' => 'Không có mục nào khớp với từ khóa.',
 'log-title-wildcard' => 'Tìm các tựa trang bắt đầu bằng các chữ này',
+'showhideselectedlogentries' => 'Hiện/ẩn các mục nhật trình đã chọn',
 
 # Special:AllPages
 'allpages' => 'Mọi trang',
@@ -2140,6 +2159,11 @@ Bạn có thể thu hẹp kết quả bằng cách chọn loại nhật trình,
 'allpages-bad-ns' => '{{SITENAME}} không có không gian tên “$1”',
 'allpages-hide-redirects' => 'Ẩn trang đổi hướng',
 
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Bạn đang xem phiên bản vùng nhớ đệm của trang này có thể lỗi thời cho tới $1.',
+'cachedspecial-viewing-cached-ts' => 'Bạn đang xem phiên bản vùng nhớ đệm của trang này có thể không đúng thời hoàn toàn.',
+'cachedspecial-refresh-now' => 'Xem phiên bản mới nhất.',
+
 # Special:Categories
 'categories' => 'Thể loại',
 'categoriespagetext' => '{{PLURAL:$1|Thể loại|Các thể loại}} dưới đây có trang hoặc tập tin phương tiện.
@@ -2565,7 +2589,7 @@ $1',
 ** Con rối của thành viên bị cấm',
 'ipb-hardblock' => 'Ngăn không cho thành viên đã đăng nhập sửa đổi từ địa chỉ IP này',
 'ipbcreateaccount' => 'Cấm mở tài khoản',
-'ipbemailban' => 'Không cho gửi email',
+'ipbemailban' => 'Không cho gửi thư điện tử',
 'ipbenableautoblock' => 'Tự động cấm các địa chỉ IP mà thành viên này sử dụng',
 'ipbsubmit' => 'Cấm',
 'ipbother' => 'Thời hạn khác:',
@@ -2579,8 +2603,8 @@ $1',
 'ipb-confirm' => 'Xác nhận cấm',
 'badipaddress' => 'Địa chỉ IP không hợp lệ',
 'blockipsuccesssub' => 'Cấm thành công',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] đã bị cấm.
-<br />Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] đã bị cấm.<br />
+Xem lại những lần cấm tại [[Special:BlockList|danh sách cấm]].',
 'ipb-blockingself' => 'Bạn sẽ tự bỏ cấm cho mình! Bạn có chắc chắn muốn làm vậy không?',
 'ipb-confirmhideuser' => 'Bạn sẽ cấm người dùng với tùy chọn “ẩn người dùng”. Bạn có chắc chắn muốn dời tên người dùng khỏi tất cả mọi danh sách và nhật trình?',
 'ipb-edit-dropdown' => 'Sửa đổi lý do cấm',
@@ -3019,7 +3043,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'spamprotectionmatch' => 'Nội dung sau đây đã kích hoạt bộ lọc thư rác: $1',
 'spambot_username' => 'Bộ dọn dẹp thư rác MediaWiki',
 'spam_reverting' => 'Lùi lại đến phiên bản cuối không chứa liên kết đến $1',
-'spam_blanking' => 'Tất cả các phiên bản có liên kết đến $1, đang tẩy trống',
+'spam_blanking' => 'Tất cả các phiên bản có liên kết đến $1; tẩy trống',
+'spam_deleting' => 'Tất cả các phiên bản có liên kết đến $1; xóa',
 
 # Info page
 'pageinfo-title' => 'Thông tin về “$1”',
@@ -3260,7 +3285,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 'exif-scenetype' => 'Loại cảnh',
 'exif-customrendered' => 'Sửa hình thủ công',
 'exif-exposuremode' => 'Chế độ phơi sáng',
-'exif-whitebalance' => 'Độ sáng trắng',
+'exif-whitebalance' => 'Cân bằng trắng',
 'exif-digitalzoomratio' => 'Tỷ lệ phóng lớn kỹ thuật số',
 'exif-focallengthin35mmfilm' => 'Tiêu cự trong phim 35 mm',
 'exif-scenecapturetype' => 'Kiểu chụp cảnh',
@@ -3831,6 +3856,9 @@ hoặc [//www.gnu.org/licenses/old-licenses/gpl-2.0.html đọc nó trực tuy
 'version-software' => 'Phần mềm được cài đặt',
 'version-software-product' => 'Phần mềm',
 'version-software-version' => 'Phiên bản',
+'version-entrypoints' => 'Các URL lối vào',
+'version-entrypoints-header-entrypoint' => 'Lối vào',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Đường dẫn tập tin',
@@ -3953,14 +3981,14 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'revdelete-uname-unhid' => 'đã hiện tên người dùng',
 'revdelete-restricted' => 'đã áp dụng hạn chế cho bảo quản viên',
 'revdelete-unrestricted' => 'đã gỡ bỏ hạn chế cho bảo quản viên',
-'logentry-move-move' => '$1 đã đổi trang $3 thành $4',
-'logentry-move-move-noredirect' => '$1 đã đổi trang $3 thành $4 mà không để lại một trang đổi hướng',
-'logentry-move-move_redir' => '$1 đã đổi trang $3 thành $4 qua trang đổi hướng',
-'logentry-move-move_redir-noredirect' => '$1 đã đổi trang $3 thành $4 qua trang đổi hướng mà không để lại một trang đổi hướng',
+'logentry-move-move' => '$1 đã đổi $3 thành $4',
+'logentry-move-move-noredirect' => '$1 đã đổi $3 thành $4 (đã tắt đổi hướng)',
+'logentry-move-move_redir' => '$1 đã đổi $3 thành $4 qua đổi hướng',
+'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
 'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
 'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => '$1 đã mở một tài khoản người dùng',
-'logentry-newusers-create' => '$1 đã mở một tài khoản người dùng',
+'logentry-newusers-newusers' => '$1 đã mở tài khoản mới',
+'logentry-newusers-create' => '$1 đã mở tài khoản mới',
 'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
 'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
 'newuserlog-byemail' => 'gửi mật khẩu qua thư điện tử',
@@ -4019,4 +4047,17 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'api-error-uploaddisabled' => 'Chức năng tải lên đã bị tắt trên wiki này.',
 'api-error-verification-error' => 'Tập tin này có thể bị hỏng hoặc có phần mở rộng sai.',
 
+# Durations
+'duration-seconds' => '$1 giây',
+'duration-minutes' => '$1 phút',
+'duration-hours' => '$1 giờ',
+'duration-days' => '$1 ngày',
+'duration-weeks' => '$1 tuần',
+'duration-years' => '$1 năm',
+'duration-decades' => '$1 thập niên',
+'duration-centuries' => '$1 thế kỷ',
+'duration-millennia' => '$1 thiên niên kỷ',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => 'Không thể lấy các chìa khóa trên máy chủ $1.',
 );
index cfa3c22..3b9e36f 100644 (file)
@@ -439,7 +439,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 
 # Diffs
 'history-title' => 'Wärsjoonsfolche fo „$1“',
-'difference' => '(Undârschiid dswischâ wärsjoonâ)',
 'lineno' => 'Dsajln $1:',
 'compareselectedversions' => 'Ausgwäälde wärsjoona fârglajchn',
 'editundo' => 'riggängich machng',
index dce62a5..d382711 100644 (file)
@@ -685,6 +685,7 @@ Memolös, das pads: .css e .js mutons labön tiädi minudik: {{ns:user}}:Foo/vec
 Redakam perefudon ad vitön dädükami padavödema.
 Atos jenon ömna ven geboy düni pladulöma nennemik bevüresodik säkädik.'''",
 'editing' => 'Redakam pada: $1',
+'creating' => 'Jafäd pada: $1',
 'editingsection' => 'Redakam pada: $1 (diläd)',
 'editingcomment' => 'Redakam pada: $1 (diläd nulik)',
 'editconflict' => 'Redakamakonflit: $1',
@@ -882,7 +883,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 
 # Diffs
 'history-title' => 'Revidajenotem pada: "$1"',
-'difference' => '(Dif vü revids)',
 'difference-multipage' => '(Dif vü pads)',
 'lineno' => 'Lien $1:',
 'compareselectedversions' => 'Leigodolöd fomamis pevälöl',
@@ -1190,7 +1190,7 @@ Dalol i dälön votikanes kosikön ko ol yufü gebana- u bespikapad olik nes sä
 'nchanges' => '{{PLURAL:$1|votükam|votükams}} $1',
 'recentchanges' => 'Votükams nulik',
 'recentchanges-legend' => 'Votükams nulik: paramets',
-'recentchangestext' => 'Su pad at binons votükams nulikün in vüki at.',
+'recentchanges-summary' => 'Su pad at binons votükams nulikün in vüki at.',
 'recentchanges-feed-description' => 'Getön votükamis nulikün in vük at me nünakanad at.',
 'recentchanges-label-newpage' => 'Redakam at päjafon pad nulik',
 'recentchanges-label-minor' => 'Atos binon redakam pülik',
index debee28..df09c18 100644 (file)
@@ -10,6 +10,7 @@
  * @author Kaganer
  * @author Niklas Laxström
  * @author Pikne
+ * @author Reedy
  * @author Sulev Iva (Võrok)
  * @author Trixt
  * @author Võrok
@@ -639,7 +640,7 @@ Ku klõpsahtat nuppi \"{{int:savearticle}}\", sis pästetäs '''õnnõ''' ülemb
 'copyrightwarning2' => "Rehkendäq tuud, et kõiki seo lehe pääle tettüid kirotuisi ja toimõnduisi või kiä taht muutaq vai ärq kistutaq. Ku sa taha-i, et su tüüd armuhiitmäldä ümbre tetäs ja uma ärqnägemise perrä pruugitas, sis pästku-i taad siiäq. Sa piät ka lubama, et kirotit uma jutu esiq vai võtit kopimiskeelüldä paigast (täpsämbält kaeq $1). '''PANGU-I TAAHA TEGIJÄÕIGUISIGA KAIDSÕTUT MATÕRJAALI ILMA LUALDA!'''",
 'longpageerror' => "'''VIGA: Lehe suurus om $1 kilobaiti. Taad saa-i pästäq, selle et kõgõ suurõmb lubat suurus om $2 kilobaiti.'''",
 'readonlywarning' => "'''HOIATUS: Teedüskogo om huuldustöie jaos lukku pant, nii et parhilla saa-i paranduisi pästäq. Võit teksti alalõ hoitaq tekstifailin ja pästäq taa siiäq peränpoolõ.'''",
-'protectedpagewarning' => '<center><small>Taa leht om lukun. Taad saavaq toimõndaq õnnõ kõrraldajaõiguisiga pruukjaq.</small></center>',
+'protectedpagewarning' => 'Taa leht om lukun. Taad saavaq toimõndaq õnnõ kõrraldajaõiguisiga pruukjaq.',
 'semiprotectedpagewarning' => 'Seod lehte saavaq muutaq õnnõ nimega sisse lännüq pruukjaq.',
 'cascadeprotectedwarning' => 'Taad lehte võivaq toimõndaq õnnõ kõrraldajaõiguisiga pruukjaq, selle et taa kuulus $1 järgmädse kaidsõdu lehe hulka:',
 'templatesused' => 'Seo lehe pääl om pruugit {{PLURAL:$1|näüdüst|näüdüssit}}:',
@@ -752,7 +753,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 
 # Diffs
 'history-title' => '"$1" muutmiisi nimekiri',
-'difference' => '(Kujjõ lahkominegiq)',
 'lineno' => 'Rida $1:',
 'compareselectedversions' => 'Võrdõlõq valituid kujjõ',
 'editundo' => 'võtaq tagasi',
@@ -960,7 +960,7 @@ Taa tohe-i ollaq rohkõmb ku $1 {{PLURAL:$1|märk|märki}}.",
 'nchanges' => '$1 {{PLURAL:$1|muutminõ|muutmiisi}}',
 'recentchanges' => 'Viimädseq muutmisõq',
 'recentchanges-legend' => 'Viimätside muutmiisi säädmine',
-'recentchangestext' => 'Kaeq seo lehe päält viimätsit muutmiisi.',
+'recentchanges-summary' => 'Kaeq seo lehe päält viimätsit muutmiisi.',
 'recentchanges-feed-description' => 'Kaeq seo lehe pääl {{SITENAME}} viimätsit muutmiisi.',
 'rcnote' => 'Tan ommaq {{PLURAL:$1|üts muutus|$1 viimäst muutmist}}, miä ommaq tettüq {{PLURAL:$2|üte viimädse päävä|$2 viimädse päävä}} seen (kuupääväst $5, $4 lugõma naatõn).',
 'rcnotefrom' => "Tan ommaq muutmisõq kuupääväst '''$2''' pääle (näüdätäs kooniq '''$1''' muutmist).",
@@ -2167,7 +2167,7 @@ Kokkovõttõria pääle või kirotaq tagasivõtmisõ põhjusõ.',
 'scarytranscludetoolong' => "[Võrgoaadrõs om pall'o pikk]",
 
 # Delete conflict
-'deletedwhileediting' => "<center>'''Hoiatus''': taa leht om ärq kistutõt päält tuud, ku sa taad toimõndama naksit!</center>",
+'deletedwhileediting' => "'''Hoiatus''': taa leht om ärq kistutõt päält tuud, ku sa taad toimõndama naksit!",
 'confirmrecreate' => "Pruukja '''[[User:$1|$1]]''' ([[User talk:$1|arotus]]) kistut' taa lehe ärq päält tuud, ku sa naksit taad toimõndama. Põhjus oll':
 : ''$2''
 Olõq hää, kinnüdäq, et tahat taad lehte vahtsõst luvvaq.",
index 682ab5b..1e4980e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Walloon (Walon)
+/** Walloon (walon)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -55,6 +55,19 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Categoreye_copene',
 );
 
+$specialPageAliases = array(
+       'Allpages'                  => array( 'Totes_les_pådjes' ),
+       'Block'                     => array( 'Bloker', 'Blocaedje' ),
+       'Categories'                => array( 'Categoreyes' ),
+       'Preferences'               => array( 'Preferinces' ),
+       'Prefixindex'               => array( 'Indecse_pa_betchete' ),
+       'Search'                    => array( 'Cweri' ),
+       'Specialpages'              => array( 'Pådjes_sipeciåles' ),
+       'Statistics'                => array( 'Sitatistikes' ),
+       'Version'                   => array( 'Modêye' ),
+       'Watchlist'                 => array( 'Pådjes_shuvowes' ),
+);
+
 # definixha del cogne po les limeros
 # (number format definition)
 # en: 12,345.67 -> wa: 12 345,67
@@ -63,26 +76,22 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 # $linkTrail = '/^([a-zåâêîôûçéèA-ZÅÂÊÎÔÛÇÉÈ]+)(.*)$/sDu';
 $linkTrail = '/^([a-zåâêîôûçéè]+)(.*)$/sDu';
 
-#
-# NOTE:
-# sysop = manaedjeu
-# bureaucrat = mwaisse-manaedjeu
-#
-
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sorlignî les loyéns',
+'tog-underline' => 'Sorlignî les loyéns:',
 'tog-justify' => 'Djustifyî les hagnons',
-'tog-hideminor' => 'Èn nén mostrer les <i>dierins candjmints</i> mineurs',
-'tog-extendwatchlist' => "Ragrandi l' djivêye po mostrer tos les candjmints",
-'tog-usenewrc' => 'Ramidrés <i>dierins candjmints</i> (JavaScript)',
+'tog-hideminor' => 'Èn nén mostrer les dierins candjmints mineurs',
+'tog-hidepatrolled' => 'Èn nén mostrer les candjmints ddja patrouyîs',
+'tog-newpageshidepatrolled' => 'Èn nén mostrer el djivêye des novelès pådjes les cenes dedja patrouyeyes',
+'tog-extendwatchlist' => "Ragrandi l' djivêye po mostrer tos les candjmints, nén seulmint les dierins",
+'tog-usenewrc' => "Relére par pådje dins les dierins candjmints et l' djivêye des shuvous (i fåt JavaScript)",
 'tog-numberheadings' => 'Limerotaedje otomatike des tites',
 'tog-showtoolbar' => "Mostrer l' bår d' usteyes e môde candjmint (JavaScript)",
 'tog-editondblclick' => 'Candjî les pådjes avou on dobe-clitch (JavaScript)',
 'tog-editsection' => "Eployî les loyéns «[candjî]» po candjî rén k' ene seccion",
 'tog-editsectiononrightclick' => 'Candjî les seccions avou on dobe-clitch sol tite (JavaScript)',
 'tog-showtoc' => "Mostrer l' tåvlea d' ådvins<br />(po ls årtikes avou pus di 3 seccions)",
-'tog-rememberpassword' => 'Rimimbrer li scret inte les sessions (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-rememberpassword' => "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})",
 'tog-watchcreations' => "Mete les pådjes ki dj' askepeye dins l' djivêye des pådjes shuvowes",
 'tog-watchdefault' => "Shuve les årtikes ki dj' fwai ou ki dj' candje",
 'tog-watchmoves' => "Radjouter a m' djivêye des shuvous les pådjes ki dji displaece",
@@ -96,16 +105,20 @@ $messages = array(
 'tog-enotifminoredits' => "M' emiler eto po les ptits candjmints",
 'tog-enotifrevealaddr' => 'Mostrer mi adresse emile dins les emiles di notifiaedje',
 'tog-shownumberswatching' => "Mostrer l' nombe d' uzeus ki shuvèt l' pådje",
-'tog-fancysig' => 'Sinateure brute (sins loyén otomatike)',
-'tog-externaleditor' => "Eployî on dfoûtrin aspougneu d' tecse come prémetowe dujhance",
-'tog-externaldiff' => 'Eployî on dfoûtrin programe di diferinces come prémetowe dujhance',
+'tog-oldsig' => 'Siné pol moumint:',
+'tog-fancysig' => 'Sinateure avou do tecse wiki (sins loyén otomatike)',
+'tog-externaleditor' => "Eployî on dfoûtrin aspougneu d' tecse come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).",
+'tog-externaldiff' => 'Eployî on dfoûtrin programe di diferinces come prémetowe dujhance (po les spepieus uzeus seulmint, ca i vs fåt fé des apontiaedjes sol sopiutrece da vosse, [//www.mediawiki.org/wiki/Manual:External_editors loukîz chal po pus di racsegnes]).',
 'tog-showjumplinks' => 'Mete en alaedje les loyéns di naiviaedje «potchî a» å dzeu del pådje (pol pea «Myskin» et ds ôtes)',
 'tog-uselivepreview' => "Eployî l' prévoeyaedje abeye (JavaScript) (Esperimintå)",
 'tog-forceeditsummary' => "M' advierti cwand dji lai vude on rascourti",
 'tog-watchlisthideown' => 'Èn nén mostrer les candjmints da minne',
 'tog-watchlisthidebots' => 'Èn nén mostrer les candjmints des robots',
-'tog-watchlisthideminor' => "Catchî les candjmints mineurs dins l' djivêye des shuvous",
-'tog-ccmeonemails' => "m' evoyî ene copeye des emiles ki dj' evoye ås ôtes",
+'tog-watchlisthideminor' => 'Èn nén mostrer les candjmints mineurs',
+'tog-watchlisthideliu' => 'Èn nén mostrer les candjmints fwait pa des uzeus edjîstrés',
+'tog-watchlisthideanons' => 'Èn nén mostrer les candjmints fwait pa des uzeus anonimes',
+'tog-watchlisthidepatrolled' => 'Èn nén mostrer les candjmints ddja patrouyîs',
+'tog-ccmeonemails' => "M' evoyî ene copeye des emiles ki dj' evoye ås ôtes",
 'tog-diffonly' => "Èn nén håyner l' contnou del pådje pa dzo l' pådje des diferinces",
 'tog-showhiddencats' => 'Mostrer les categoreyes mucheyes',
 
@@ -113,6 +126,10 @@ $messages = array(
 'underline-never' => 'Måy',
 'underline-default' => 'Valixhance do betchteu',
 
+# Font style option in Special:Preferences
+'editfont-style' => 'Stîle del fonte pol boesse di tecse',
+'editfont-default' => 'Valixhance do betchteu',
+
 # Dates
 'sunday' => 'dimegne',
 'monday' => 'londi',
@@ -171,12 +188,15 @@ $messages = array(
 'subcategories' => 'Dizo-categoreyes',
 'category-media-header' => 'Media el categoreye «$1»',
 'category-empty' => "''Cisse categoreye ci n' a pol moumint nol årtike ni media.''",
+'hidden-categories' => '{{PLURAL:$1|Categoreye catcheye|Categoreyes catcheyes}}',
+'hidden-category-category' => 'Categoreyes catcheyes',
 'category-subcat-count' => 'Dins cisse categoreye, gn a {{PLURAL:$2|li dzo-categoreye|$2 dizo-categoreyes, inte di zeles {{PLURAL:$1|li cene|les $1}}}} cial pa-dzo.',
 'category-subcat-count-limited' => "Dins cisse categoreye, gn a {{PLURAL:$1|l' dizo-categoreye|les dzo-categoreyes}} shuvantes.",
-'category-article-count' => 'Dins cisse categoreye cial, gn a {{PLURAL:$2|li pådje ki shût|$2 pådje, inte di zeles {{PLURAL:$1|li cene|les $1}} cial padzo}}.',
+'category-article-count' => 'Dins cisse categoreye cial, gn a {{PLURAL:$2|li pådje ki shût|$2 pådjes, inte di zeles {{PLURAL:$1|li cene|les $1}} cial padzo}}.',
 'category-article-count-limited' => "{{PLURAL:$1|Gn a l' pådje ki shût|Les $1 pådjes ki shuvnut si trovèt ddja}} dins cisse categoreye ci.",
 'category-file-count' => "{{PLURAL:$2|Dins cisse categoreye ci, gn a k' ene pådje.|{{PLURAL:$1|Gn a cisse pådje ci|Gn a les $1 pådjes ki shuvèt}} dins cisse categoreye ci, po $2 pådjes å totå.}}",
 'category-file-count-limited' => "{{PLURAL:$1|Gn a k' cisse pådje cial|Gn a les $1 pådjes ciddé padzo}} dins cisse categoreye ci.",
+'listingcontinuesabbrev' => '(shûte)',
 
 'about' => 'Åd fwait',
 'article' => 'Årtike',
@@ -198,6 +218,23 @@ $messages = array(
 'qbmyoptions' => 'Mes pådjes',
 'qbspecialpages' => 'Pådjes sipeciåles',
 
+# Vector skin
+'vector-action-addsection' => 'Radjouter on sudjet',
+'vector-action-delete' => 'Disfacer',
+'vector-action-move' => 'Displaecî',
+'vector-action-protect' => 'Protedjî',
+'vector-action-undelete' => 'Rapexhî',
+'vector-action-unprotect' => "Candjî l' protedjaedje",
+'vector-simplesearch-preference' => 'Permete les amidreyès sudjestions di cweraedje (pea «Vector» seulmint)',
+'vector-view-create' => 'Ahiver',
+'vector-view-edit' => 'Candjî',
+'vector-view-history' => "Vey l' istwere",
+'vector-view-view' => 'Lére',
+'vector-view-viewsource' => 'Vey côde sourdant',
+'actions' => 'Accions',
+'namespaces' => 'Espåces di lomaedje',
+'variants' => 'Variantes',
+
 'errorpagetitle' => 'Aroke',
 'returnto' => 'Rivni al pådje «$1».',
 'tagline' => 'Èn årtike di {{SITENAME}}.',
@@ -212,6 +249,7 @@ $messages = array(
 'printableversion' => 'Modêye sicrirece-amiståve',
 'permalink' => 'Hårdêye viè cisse modêye ci',
 'print' => 'Imprimer',
+'view' => 'Vey',
 'edit' => 'Candjî',
 'create' => 'Ahiver',
 'editthispage' => "Candjî l' pådje",
@@ -219,29 +257,30 @@ $messages = array(
 'delete' => 'Disfacer',
 'deletethispage' => "Disfacer l' pådje",
 'undelete_short' => 'Rapexhî {{PLURAL:$1|on candjmint|$1 candjmints}}',
+'viewdeleted_short' => 'Vey {{PLURAL:$1|on candjmint disfacé|$1 candjmints disfacés}}',
 'protect' => 'Protedjî',
-'protect_change' => "candjî l' protedjaedje",
+'protect_change' => 'candjî',
 'protectthispage' => "Protedjî l' pådje",
-'unprotect' => 'Disprotedjî',
-'unprotectthispage' => "Disprotedjî l' pådje",
+'unprotect' => "Candjî l' protedjaedje",
+'unprotectthispage' => "Candjî l' protedjaedje del pådje",
 'newpage' => 'Novele pådje',
 'talkpage' => 'Copene sol pådje',
 'talkpagelinktext' => 'Copiner',
 'specialpage' => 'Pådje sipeciåle',
 'personaltools' => 'Usteyes da vosse',
-'postcomment' => 'Sicrire on comintaire',
+'postcomment' => 'Novele seccion',
 'articlepage' => "Vey l' årtike",
 'talk' => 'Copene',
 'views' => 'Vuwes',
 'toolbox' => 'Boesse ås usteyes',
 'userpage' => "Vey li pådje di l' uzeu",
 'projectpage' => 'Vey li pådje do pordjet',
-'imagepage' => "Vey li pådje di l' imådje",
+'imagepage' => 'Vey li pådje do fitchî',
 'viewtalkpage' => 'Vey li pådje di copene',
 'otherlanguages' => 'Ôtes lingaedjes',
 'redirectedfrom' => '(Redjiblé di $1)',
 'redirectpagesub' => 'Pådje di redjiblaedje',
-'lastmodifiedat' => 'Cisse pådje a stî candjeye pol dierin côp li $2, $1.',
+'lastmodifiedat' => 'Cisse pådje a stî candjeye pol dierin côp li $2 a $1.',
 'viewcount' => 'Cisse pådje la a stî léjhowe {{PLURAL:$1|on côp|$1 côps}}.',
 'protectedpage' => 'Pådje protedjeye',
 'jumpto' => 'Potchî a:',
@@ -252,6 +291,7 @@ Gn a trop d' uzeus ki saynut di vey cisse pådje ci.
 Soeyoz vayant di ratinde ene miete divant di rsayî di vey cisse pådje ci.
 
 $1",
+'pool-errorunknown' => 'Aroke nén cnoxhowe',
 
 # 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' => 'Åd fwait di {{SITENAME}}',
@@ -271,7 +311,7 @@ $1",
 'badaccess' => "Åk n' a nén stî avou les permissions",
 
 'versionrequired' => "I vs fåt l' modêye $1 di MediaWiki",
-'versionrequiredtext' => "I vs fåt l' modêye $1 di MediaWiki po-z eployî cisse pådje ci. Loukîz a [[Special:Version]]",
+'versionrequiredtext' => "I vs fåt l' modêye $1 di MediaWiki po-z eployî cisse pådje ci. Loukîz [[Special:Version|al pådje des modêyes]]",
 
 'ok' => "'l est bon",
 'retrievedfrom' => 'Prin del pådje «$1»',
@@ -281,26 +321,33 @@ $1",
 'youhavenewmessagesmulti' => 'Vos avoz des noveas messaedjes so $1',
 'editsection' => 'candjî',
 'editold' => 'candjî',
+'viewsourceold' => 'vey côde sourdant',
 'editlink' => 'candjî',
 'viewsourcelink' => 'Vey côde sourdant',
 'editsectionhint' => "Candjî l' seccion: $1",
 'toc' => 'Ådvins',
 'showtoc' => 'mostrer',
 'hidetoc' => 'catchî',
+'collapsible-collapse' => 'erôler',
+'collapsible-expand' => 'diswalper',
 'thisisdeleted' => 'Vey ou rapexhî $1?',
 'viewdeleted' => 'Vey $1?',
 'restorelink' => '{{PLURAL:$1|on candjmint disfacé|$1 candjmints disfacés}}',
 'feedlinks' => 'Sindicåcion:',
 'feed-invalid' => 'Sôre di sindicåcion nén valide.',
+'site-atom-feed' => 'Floûs Atom di $1',
+'page-atom-feed' => 'Floûs Atom di «$1»',
 'red-link-title' => '$1 (nén co ataké)',
+'sort-descending' => 'Discrexhant relijhaedje',
+'sort-ascending' => 'Acrexhant relijhaedje',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Årtike',
 'nstab-user' => "Pådje di l' uzeu",
 'nstab-media' => 'Media',
-'nstab-special' => 'Sipeciås',
+'nstab-special' => 'Pådje sipeciåle',
 'nstab-project' => 'Pådje',
-'nstab-image' => 'Imådje',
+'nstab-image' => 'Fitchî',
 'nstab-mediawiki' => 'Messaedje',
 'nstab-template' => 'Modele',
 'nstab-help' => 'Aidance',
@@ -308,7 +355,9 @@ $1",
 
 # Main script and global functions
 'nosuchaction' => 'Nole sifwaite accion',
-'nosuchactiontext' => "L' accion specifieye pal hårdêye n' est nén ricnoxhowe på wiki.",
+'nosuchactiontext' => "L' accion specifieye pal hårdêye n' est nén ricnoxhowe på wiki.
+Motoit ki vos avoz må scrît l' hårdêye ou shuvou on cron loyén.
+Ça pôreut eto esse on bug do programe eployî pa {{SITENAME}}.",
 'nosuchspecialpage' => 'Nole sifwaite pådje',
 'nospecialpagetext' => 'Vos avoz dmandé ene pådje sipeciåle nén valide, po ene djivêye des pådjes sipeciåles valides, loukîz a [[Special:SpecialPages]].',
 
@@ -320,14 +369,24 @@ $1",
 Li dierin cweraedje del båze di dnêyes di sayî esteut:
 <blockquote><tt>$1</tt></blockquote>
 a pårti del fonccion «<tt>$2</tt>».
-MySQL a rtourné l' aroke «<tt>$3: $4</tt>».",
+Li båze di dnêyes a rtourné l' aroke «<tt>$3: $4</tt>».",
 'dberrortextcl' => "Åk n' a nén stî avou l' sintacse do cweraedje del båze di dnêyes.
 Li dierin cweraedje del båze di dnêyes di sayî esteut:
 «$1»
 a pårti del fonccion «$2».
-MySQL a rtourné l' aroke «$3: $4».",
+Li båze di dnêyes a rtourné l' aroke «$3: $4».",
 'laggedslavemode' => "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.",
+'readonly' => 'Li båze di dnêyes est aclawêye',
+'missing-article' => "Li båze di dnêyes n' a nén trové l' tecse d' ene pådje k' åreut dvou esse trovêye, lomêye «$1» $2.
+
+Çoula arive cwand on shût on loyén po ene diferince k' est houte ou viè l' istwere d' ene pådej disfacêye.
+
+Si c' est nén çoula, motoit k' vos avoz trové on bug dins l' programe.
+Adon dijhoz l' a on [[Special:ListUsers/sysop|manaedjeu]], sins rovyî d' mete li hårdêye (URL) ki mostere l' aroke.",
+'missingarticle-rev' => '(l° del modêye: $1)',
+'missingarticle-diff' => '(dif: $1, $2)',
 'internalerror' => 'Divintrinne aroke',
+'internalerror_info' => 'Divintrinne aroke: $1',
 'filecopyerror' => "Dji n' a savou copyî l' fitchî «$1» viè «$2».",
 'filerenameerror' => "Dji n' a savou rlomer l' fitchî «$1» e «$2».",
 'filedeleteerror' => "Dji n' a savou disfacer l' fitchî «$1».",
@@ -335,31 +394,36 @@ MySQL a rtourné l' aroke «$3: $4».",
 'filenotfound' => "Dji n' a savou trover l' fitchî «$1».",
 'unexpected' => 'Valixhance nén ratindowe: «$1»=«$2».',
 'badarticleerror' => "Cisse accion la n' si pout nén fé so cisse pådje ci.",
-'cannotdelete' => "Dji n' sai disfacer l' pådje ou l' imådje dimandêye (ça s' pôreut k' ene ôte sakî l' a ddja disfacé).",
+'cannotdelete' => "Dji n' sai disfacer l' pådje ou l' fitchî «$1».
+Ça s' pôreut k' ene ôte sakî l' a ddja disfacé.",
+'cannotdelete-title' => "Dji n' sai disfacer l' pådje «$1»",
 'badtitle' => 'Måva tite',
 'badtitletext' => "Li tite del pådje dimandêye n' esteut nén valide, il estet vude, oudonbén c' esteut on cron loyén eterlingaedje ou eterwiki. Ça s' pout k' il åye onk ou sacwants caracteres ki n' polèt nén esse eployîs dins les tites.",
-'perfcached' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, et ça s' pout ki ça n' soeye nén ttafwaitmint a djoû. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-'perfcachedts' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, ey elle ont stî metowes a djoû pol dierin côp li $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
+'perfcached' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, et ça s' pout ki ça n' soeye nén ttafwaitmint a djoû. Li muchete a-st on macsimom {{PLURAL:$1|d' on rzultat|di $1 rizultats}}.",
+'perfcachedts' => "Les dnêyes ki shuvèt c' est ene copeye e muchete, ey elle ont stî metowes a djoû pol dierin côp li $1. Li muchete a-st on macsimom {{PLURAL:$4|d' on rzultat|di $4 rizultats}}.",
 'wrong_wfQuery_params' => 'Parametes incoreks po wfQuery()<br />
 Fonccion: $1<br />
 Cweraedje: $2',
 'viewsource' => 'Vey côde sourdant',
-'viewsourcetext' => 'Loukîz li contnou di l’ årtike, et s’ li rcopyî si vos vloz, por vos bouter dsu foû des fyis :',
+'viewsource-title' => 'Côde sourdant di «$1»',
+'viewsourcetext' => "Loukîz li contnou d' l’ årtike, et s’ li rcopyî si vos vloz, por vos bouter dsu foû des fyis:",
 'protectedinterface' => "Cisse pådje ci dene on tecse d' eterface pol programe, eyet elle a stî protedjeye po s' waeranti siconte des abus.",
-'editinginterface' => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
-Changes to this page will affect the appearance of the user interface for other users.
-For translations, please consider using [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project.",
+'editinginterface' => "'''Asteme:''' Vos estoz ki candje ene pådje eployeye po fé l' tecse po l' eterface do programe.
+Les candjmints ki vso frîz vont candjî l' rivnance di l' eterface po ds ôtes uzeus.
+Po des ratournaedjes, loukîz purade a [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], li pordjet di locålijhaedje da MediaWiki.",
+'cascadeprotected' => "Cisse pådje ci a stî protedjeye siconte des candjmints, pask' ele est eploye ådvins {{PLURAL:$1|del pådje shuvante k' est protedjeye|des pådjes shuvantes ki sont protedjeyes}} avou l' tchuze «e cascåde» en alaedje:
+$2",
 
 # Login and logout pages
 'logouttext' => "'''Vos vs avoz dislodjî.'''
 
-Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén vos relodjî dizo l' minme uzeu ou dizo èn uzeu diferin.
+Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén [[Special:UserLogin|vos relodjî]], dizo l' minme uzeu ou dizo èn uzeu diferin.
 Notez ki des pådjes k' i gn a si pôrént continowuer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.",
 'welcomecreation' => '== Bénvnowe, $1! ==
 
 Vosse conte a stî ahivé.
-Èn rovyîz nén di candjî les preferinces di {{SITENAME}} a vosse môde.',
-'yourname' => "Vosse no d' elodjaedje",
+Èn rovyîz nén di candjî les [[Special:Preferences|preferinces di {{SITENAME}}]] a vosse môde.',
+'yourname' => "Vosse no d' elodjaedje:",
 'yourpassword' => 'Vosse sicret',
 'yourpasswordagain' => 'Ritapez vosse sicret',
 'remembermypassword' => "Rimimbrer m' sicret inte les sessions (nén dpus ki po $1 {{PLURAL:$1|djoû|djoûs}})",
@@ -368,18 +432,21 @@ Vosse conte a stî ahivé.
 'nav-login-createaccount' => "Ahiver on conte, udon-bén s' elodjî",
 'loginprompt' => 'Vos dvoz permete les coûkes po vs elodjî so {{SITENAME}}.',
 'userlogin' => "S' elodjî",
+'userloginnocreate' => "S' elodjî",
 'logout' => 'Si dislodjî',
 'userlogout' => 'Si dislodjî',
 'notloggedin' => 'Nén elodjî',
-'nologin' => "Vos n' avoz nén d' conte so ç' wiki ci? '''$1'''.",
+'nologin' => "Vos n' avoz nén d' conte so ç' wiki ci? $1.",
 'nologinlink' => 'Ahivez on conte da vosse',
 'createaccount' => 'Ahiver on novea conte',
 'gotaccount' => "Vos avoz ddja on conte so ç' wiki ci? '''$1'''.",
 'gotaccountlink' => 'Elodjîz vs',
+'userlogin-resetlink' => "Avoz rovyî vos detays d' elodjaedje?",
 'createaccountmail' => 'pa emile',
 'createaccountreason' => 'Råjhon:',
 'badretype' => 'Vos avoz dné deus screts diferins.',
-'userexists' => "Li no d' uzeu ki vs avoz tchoezi est ddja eployî. Tchoezixhoz è èn ôte s' i vs plait.",
+'userexists' => "Li no d' uzeu ki vs avoz tchoezi est ddja eployî.
+Tchoezixhoz è èn ôte s' i vs plait.",
 'loginerror' => "Aroke d' elodjaedje",
 'nocookiesnew' => "Li conte a stî ahivé, mins vos n' estoz nén elodjî. {{SITENAME}} eploye des coûkes po l' elodjaedje des uzeus. Vos avoz dismetou l' sopoirt des coûkes dins vosse betchteu waibe; rimetoz l' en alaedje et relodjîz vs avou vosse novea no d' elodjaedje eyet scret, s' i vs plait.",
 'nocookieslogin' => "{{SITENAME}} eploye des coûkes po l' elodjaedje des uzeus. Vos avoz dismetou l' sopoirt des coûkes dins vosse betchteu waibe; rimetoz l' en alaedje et relodjîz vs s' i vs plait.",
@@ -387,41 +454,86 @@ Vosse conte a stî ahivé.
 'loginsuccesstitle' => 'Vos estoz elodjî',
 'loginsuccess' => "'''L' elodjaedje a stî comifåt, asteure vos estoz elodjî dins {{SITENAME}} dizo l' no d' uzeu «$1».'''",
 'nosuchuser' => "I g na nou uzeu dizo l' no «$1».
-Verifyîz çou k' vos avoz tapé, oudonbén rimplixhoz les ôtes tchamps
-et clitchîz sol boton po-z ahiver on novea conte.",
+Notez k' les nos d' uzeu fjhèt l' diferince etur pitites et grandès letes.
+Verifyîz çou k' vos avoz tapé, oudonbén [[Special:UserLogin/signup|ahivez on novea conte]].",
 'nosuchusershort' => "I g na nou uzeu dizo l' no «$1». Verifyîz çou k' vos avoz tapé.",
 'nouserspecified' => "Vos dvoz dner on no d' elodjaedje.",
 'wrongpassword' => "Li scret ki vs avoz dné est måva. Rissayîz s' i vs plait.",
 'wrongpasswordempty' => "Vos avoz dné on vude sicret. Rissayîz s' i vs plait.",
-'passwordtooshort' => 'Li scret est pår trop court. I doet esse di pol moens {{PLURAL:$1|1 caractere|$1 caracteres}}.',
+'passwordtooshort' => 'Li scret doet esse di pol moens {{PLURAL:$1|1 caractere|$1 caracteres}}.',
 'mailmypassword' => "M' emiler on novea scret",
-'passwordremindertitle' => 'Rimimbraedje do scret po {{SITENAME}}',
-'passwordremindertext' => "Ene sakî (probåblumint vos-minme, avou l' adresse IP $1) a dmandé k' on vs emile on novea scret po {{SITENAME}} ($4).
-Li scret po l' uzeu «$2» est asteure «$3».
-Po pus di såvrité, vos vos dvrîz elodjî eyet rcandjî vosse sicret å pus abeye.
-
-Si ene ôte sakî a fwait l' dimande, ou si vos vs avoz rtrové l' vî scret eyet nel pus vleur candjî, vos ploz djusse ignorer ci messaedje ci eyet continouwer avou l' vî scret.",
+'passwordremindertitle' => 'Novea scret timporaire po {{SITENAME}}',
+'passwordremindertext' => "Ene sakî (probåblumint vos-minme, avou l' adresse IP $1) a dmandé 
+on novea scret po {{SITENAME}} ($4).
+On scret timporare po l' uzeu «$2» a stî fwait, c' est «$3».
+Si c' est vos k' a fwait l' dimande, vos vs divoz elodjî eyet tchoezi on novea scret.
+Li scret timporaire ni srè pus valide après {{PLURAL:$5|on djoû|$5 djoûs}}.
+
+Si c' est ene ôte sakî k' a fwait l' dimande, ou si vos vs avoz rtrové l' vî scret eyet 
+nel pus vleur candjî, vos ploz djusse ignorer ci messaedje ci eyet continouwer avou l' vî scret.",
 'noemail' => "I n' a pont d' adresse emile di cnoxhowe po l' uzeu «$1».",
+'noemailcreate' => 'Vos dvoz dner ene adresse emile valide.',
 'passwordsent' => "On novea scret a stî emilé a l' adresse emile
 racsegneye po l' uzeu «$1».
 Relodjîz vs avou ç' noû scret on côp ki vos l' åroz rçuvou s' i vs plait.",
+'blocked-mailpassword' => "Voste adresse IP est blokêye pol sicrijhaedje, et do côp vos n' poloz nén eployî l' fonccion d' rapexhaedje do scret po-z eviter les abus.",
 'eauthentsent' => "Èn emile d' acertinaedje a stî evoyî a l' adresse emile tchoezeye.
 Divant d' poleur evoyî èn ôte emile a ci conte la, vos dvroz shure les instruccions di l' emile ki vos alez rçure, po-z acertiner ki l' conte est bén da vosse.",
 'mailerror' => "Åk n' a nén stî tot-z evoyant l' emile: $1",
-'acct_creation_throttle_hit' => "Mande escuzes, mins vos avoz ddja ahivé {{PLURAL:$1|1 conte|$1 contes}}. Vos n' endè ploz nén fé des ôtes.",
-'emailauthenticated' => 'Voste adresse emile a stî acertinêye li $1.',
+'acct_creation_throttle_hit' => "Ene sakî a ddja ahivé {{PLURAL:$1|1 conte|$1 contes}} dins les dierinnes 24 eures a pårti dek minme adresse IP, çou k' est l' limite acceptêye po ene sifwaite termene.
+Ça fwait ki l' ahivaedje di contes a p·årti di ciste adresse IP la a stî dismetou pol moumint.",
+'emailauthenticated' => 'Voste adresse emile a stî acertinêye li $2 a $3.',
 'emailnotauthenticated' => "Voste adresse emile n' a nén co stî acertinêye. Nol emile ni serè-st evoyî po les fonccions shuvantes.",
 'noemailprefs' => 'Dinez ene adresse emile po ces fonccions si mete en alaedje.',
 'emailconfirmlink' => 'Acertinaedje di voste adresse emile',
-'invalidemailaddress' => "L' adresse emile ni pout nén esse acceptêye la k' i shonnreut k' ele soeye dins ene cogne nén valide. Tapez ene adresse emile sicrîte comifåt oudobén vudîz l' tchamp, s' i vs plait.",
+'invalidemailaddress' => "L' adresse emile ni pout nén esse acceptêye la k' i shonnreut k' ele soeye dins ene cogne nén valide.
+Tapez ene adresse emile sicrîte comifåt oudobén vudîz l' tchamp, s' i vs plait.",
 'accountcreated' => 'Conte ahivé',
 'accountcreatedtext' => "Li conte d' uzeu «$1» a stî ahivé.",
 'loginlanguagelabel' => 'Lingaedje: $1',
 
 # Change password dialog
-'oldpassword' => 'Vî scret',
-'newpassword' => 'Noû scret',
-'retypenew' => "Ritapez l' noû scret",
+'resetpass' => "Candjî l' sicret",
+'resetpass_announce' => "Vos vs avoz elodjî avou on scret timporaire ki vos a stî emilé.
+Por vos fini l' elodjaedje, vos dvoz defini on novea scret:",
+'resetpass_header' => "Candjî l' sicret do conte",
+'oldpassword' => 'Vî scret:',
+'newpassword' => 'Noû scret:',
+'retypenew' => "Ritapez l' noû scret:",
+'resetpass_submit' => "Defini on scret et s' elodjî",
+'resetpass_success' => "Vosse sicret a stî candjî comifåt!
+Asteure l' elodjaedje...",
+'resetpass_forbidden' => "Les screts n' polèt nén esse candjîs",
+'resetpass-no-info' => 'Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.',
+'resetpass-submit-loggedin' => "Candjî l' sicret",
+'resetpass-submit-cancel' => 'Rinoncî',
+'resetpass-wrong-oldpass' => "Li scret timporaire ou do moumint n' est nén valide.
+Motoit ki vos l' avoz ddja candjî ou ridmandé on novea scret timporaire.",
+'resetpass-temp-password' => 'Sicret timporaire:',
+
+# Special:PasswordReset
+'passwordreset' => "Rifé l' sicret",
+'passwordreset-text' => 'Completez cisse formulrece ci po rçure èn emile ki dene les detays do conte da vosse.',
+'passwordreset-legend' => "Rifé l' sicret",
+'passwordreset-disabled' => "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
+'passwordreset-pretext' => '{{PLURAL:$1||Dinez onk des elemints di dnêyes shuvants}}',
+'passwordreset-username' => "No d' elodjaedje:",
+'passwordreset-domain' => 'Dominne:',
+'passwordreset-capture' => "Vey li messaedje di l' emile?",
+'passwordreset-capture-help' => "Si vos clitchîz cisse boesse ci, l' emile (eyet li scret timporaire) vos srè håyné e minme tins k' il est emilé.",
+'passwordreset-email' => 'Adresse emile:',
+'passwordreset-emailtitle' => 'Detays do contre so {{SITENAME}}',
+
+# Special:ChangeEmail
+'changeemail' => "Candjî l' emile",
+'changeemail-header' => "Candjî l' adresse emile do conte",
+'changeemail-text' => "Rimplixhoz l' formulrece po candjî voste adresse emile. Vos dvroz dner vosse sicret po-z acertiner l' candjmint.",
+'changeemail-no-info' => 'Vos dvoz esse elodjî po pleur aveur accès a cisse pådje ci.',
+'changeemail-oldemail' => 'Adresse emile pol moumint:',
+'changeemail-newemail' => 'Novele adresse emile:',
+'changeemail-none' => '(nole)',
+'changeemail-submit' => "Candjî l' emile",
+'changeemail-cancel' => 'Rinoncî',
 
 # Edit page toolbar
 'bold_sample' => 'Cråssès letes',
@@ -431,7 +543,7 @@ Divant d' poleur evoyî èn ôte emile a ci conte la, vos dvroz shure les instru
 'link_sample' => 'Tecse pol loyén',
 'link_tip' => 'Divintrin loyén',
 'extlink_sample' => 'http://www.example.com tecse pol hårdêye',
-'extlink_tip' => 'Difoûtrinne hårdêye (en rovyîz nén di mete «http://» pa dvant)',
+'extlink_tip' => 'Difoûtrinne hårdêye (èn rovyîz nén di mete «http://» pa dvant)',
 'headline_sample' => 'Tecse di tite',
 'headline_tip' => 'Tite di 2inme livea',
 'nowiki_sample' => "Tapez l' tecse nén wiki chal",
@@ -453,49 +565,99 @@ Divant d' poleur evoyî èn ôte emile a ci conte la, vos dvroz shure les instru
 'showpreview' => 'Vey divant',
 'showlivepreview' => 'Vey divant',
 'showdiff' => 'Vey les candjmints',
-'anoneditwarning' => "'''Asteme:''' Vos n' estoz nén elodjî. Voste adresse IP serè rashiowe dins l' istwere di cisse pådje ci.",
+'anoneditwarning' => "'''Asteme:''' Vos n' estoz nén elodjî.
+Voste adresse IP serè rashiowe dins l' istwere di cisse pådje ci.",
+'anonpreviewwarning' => "''Vos n' estoz nén elodjî. Si vos schapez c' est voste adresse IP ki serè wårdêye dins l' istwere des candjmints.''",
 'missingsummary' => "'''Asteme:''' Vos n' avoz nén dné on tecse di rascourti po vosse candjmint. Si vos rclitchîz sol boton «Schaper», li candjmint da vosse serè schapé sins nou tecse di rascourti po l' istwere del pådje.",
 'missingcommenttext' => "Tapez on comintaire chal pa dzo s' i vs plait.",
 'blockedtitle' => "L' uzeu est bloké",
-'blockedtext' => "Vosse no d' uzeu ou voste adresse IP a stî blokêye pa $1.
-Li råjhon dnêye est:<br />''$2''<p>Vos ploz contacter $1 oudonbén onk des
+'blockedtext' => "'''Vosse no d' uzeu ou voste adresse IP a stî blokêye.'''
+
+Li blocaedje a stî fwait pa $1.
+Li råjhon dnêye est ''$2''.
+
+* Comince do blocaedje: $8
+* Fén do blocaedje: $6
+* Blocaedje di: $7
+
+Vos ploz contacter $1 oudonbén onk des
+[[{{MediaWiki:Grouppage-sysop}}|manaedjeus]] po discuter do blocaedje.
+Notez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]] et ki cisse possibilité n' a nén stî blokêye.
+Voste adresse IP est $3 eyet l' ID di blocaedje est $5.
+S' i vs plait racsegnoz totes les racsegnes chal å dzeur dins les dmandes ki vos frîz.",
+'autoblockedtext' => "Voste adresse IP a stî ablokêye otomaticmint, pask' elle a stî eployeye pa èn ôte uzeu, lu-minme dedja rbouté pa $1.
+Li råjhon k' on-z a dné, c' est:
+
+:''$2''.
+
+* Comince do blocaedje: $8
+* Fén do blocaedje: $6
+* Blocaedje di: $7
+
+Vos ploz contacter $1 oudonbén onk des
 [[{{MediaWiki:Grouppage-sysop}}|manaedjeus]] po discuter do blocaedje.
 
-Notez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]].
+Notez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]] et ki cisse possibilité n' a nén stî blokêye.
 
-Voste adresse IP est $3. S' i vs plait racsegnoz ciste adresse IP la dins les dmandes ki vos frîz.",
+Voste adresse IP est $3 eyet l' ID di blocaedje est $5.
+S' i vs plait racsegnoz totes les racsegnes chal å dzeur dins les dmandes ki vos frîz.",
+'blockednoreason' => 'sins dire pocwè',
 'whitelistedittext' => 'I vs fåt $1 po pleur candjî les årtikes.',
 'confirmedittext' => "I vs fåt acertiner vost emile po pleur candjî les årtikes. Dinez èn emile eyet l' acertiner dins vos [[Special:Preferences|preferinces d' uzeu]].",
 'loginreqtitle' => 'I vs fåt esse elodjî',
 'loginreqlink' => 'elodjî',
 'loginreqpagetext' => 'Vos vs divoz $1 po vey des ôtès pådjes.',
 'accmailtitle' => 'Li scret a stî evoyî.',
-'accmailtext' => 'Li scret po «$1» a stî evoyî a $2.',
+'accmailtext' => "On scret costrût a l' astcheyance po [[User talk:$1|$1]] a stî evoyî a $2.
+
+Li scret po ci novea conte ci pout esse candjî sol pådje di ''[[Special:ChangePassword|candjmint di scret]]'' après l' elodjaedje.",
 'newarticle' => '(Novea)',
 'newarticletext' => "Vos avoz clitchî so on loyén viè ene pådje ki n' egzistêye nén co.
 Mins '''vos''' l' poloz askepyî! Po çoula, vos n' avoz k' a cmincî a taper vosse tecse dins l' boesse di tecse chal pa dzo (alez vey li [[{{MediaWiki:Helppage}}|pådje d' aidance]] po pus d' infôrmåcion).
 Si vos n' voloz nén scrire cisse pådje chal, clitchîz simplumint sol boton '''En erî''' di vosse betchteu waibe po rivni al pådje di dvant.",
-'anontalkpagetext' => "---- ''Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén (co) fwait on conte por lu s' elodjî, ou ki n' l' eploye nén. Ça fwait k' on doet eployî si adresse IP limerike po l' idintifyî. Come ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos voeyoz chal des rmåkes et des messaedjes ki n' sont nén por vos. Loukîz s' i vs plait po [[Special:UserLogin|fé on novea conte ou s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.''",
-'noarticletext' => "I gn a pol moumint nou tecse e cisse pådje chal, vos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes, oudonbén [{{fullurl:{{FULLPAGENAME}}|action=edit}} ahiver l' pådje].",
-'clearyourcache' => "'''Note:''' après aveur schapé l' pådje, vos l' divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe: '''Mozilla / Firefox / Safari:''' tchôkîz so ''Shift'' to clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-Shift-R'' (''Cmd-Shift-R'' so on Mac); '''IE:''' tchôkîz so ''Ctrl'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5''; '''Konqueror:''' simplumint clitchîz so ''Rafrister'' ou l' tape ''F5''; les uzeus d' '''Opera''' dvront motoit netyî pår leu muchete, dins ''Usteyes→Preferinces''.",
-'usercssyoucanpreview' => "'''Racsegne:''' eployîz l' boton «Vey divant» po sayî vosse novea CSS divant del schaper.",
-'userjsyoucanpreview' => "'''Racsegne:''' eployîz l' boton «Vey divant» po sayî vosse novea JS divant del schaper.",
-'usercsspreview' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje di vosse stîle CSS d' uzeu, i n' a nén co stî schapé!'''",
+'anontalkpagetext' => "---- ''Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén (co) fwait on conte por lu s' elodjî, ou ki n' l' eploye nén.
+Ça fwait k' on doet eployî si adresse IP limerike po l' idintifyî.
+Come ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos voeyoz chal des rmarkes et des messaedjes ki n' sont nén por vos.
+Loukîz s' i vs plait po [[Special:UserLogin/signup|fé on novea conte]] ou [[Special:UserLogin|s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.''",
+'noarticletext' => 'I gn a pol moumint nou tecse e cisse pådje chal.
+Vos ploz [[Special:Search/{{PAGENAME}}|cweri après l\' tite di cisse pådje ci]] dins des ôtès pådjes,
+oudonbén <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås],
+ou co [{{fullurl:{{FULLPAGENAME}}|action=edit}} ahiver l\' pådje]</span>.',
+'noarticletext-nopermission' => 'I gn a pol moumint nou tecse e cisse pådje chal.
+Vos ploz [[Special:Search/{{PAGENAME}}|cweri après l\' tite di cisse pådje ci]] dins des ôtès pådjes,
+oudonbén <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås]</span>.',
+'blocked-notice-logextract' => '{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}} pol moumint.
+Li dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:',
+'clearyourcache' => "'''Note:''' après aveur schapé l' pådje, vos l' divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe.
+* '''Firefox / Safari:''' tchôkîz so ''Shift'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' so on Mac)
+* '''Google Chrome:''' tchôkîz so ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)
+* '''Internet Explorer:''' tchôkîz so ''Ctrl'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5''
+* '''Konqueror:''' clitchîz so ''Rafrister'' ou tchôkîz so ''F5''
+* '''Opera:''' vudîz l' muchete dins ''Usteyes → Preferinces''.",
+'usercssyoucanpreview' => "'''Racsegne:''' eployîz l' boton «{{int:showpreview}}» po sayî vosse novea CSS divant del schaper.",
+'userjsyoucanpreview' => "'''Racsegne:''' eployîz l' boton «{{int:showpreview}}» po sayî vosse novea JavaScript divant del schaper.",
+'usercsspreview' => "Èn rovyîz nén ki c' est djusse on prévoeyaedje di vosse stîle CSS d' uzeu.'''
+'''I n' a nén co stî schapé!'''",
 'userjspreview' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje/saye di vosse JavaScript d' uzeu, i n' a nén co stî schapé!'''",
 'userinvalidcssjstitle' => "'''Asteme:''' I n' a pont d' pea lomêye «$1». Tuzez ki les pådjes .css eyet .js des uzeus eployèt des tite e ptitès letes, metans {{ns:user}}:Toto/vector.css et nén {{ns:user}}:Toto/Vector.css.",
 'updated' => '(Ramidré)',
-'previewnote' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje, li pådje n' est nén co schapêye!'''",
-'previewconflict' => 'Ci prévoeyaedje ci mostere kimint kel tecse del boesse di tecse do dzeu sereut håyné si vos decidez di clitchî so «schaper».',
+'note' => "'''Note :'''",
+'previewnote' => "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje.'''
+'''Les candmints n' ont nén co stî schapés!'''",
+'continue-editing' => 'Continouwer a candjî',
+'previewconflict' => 'Ci prévoeyaedje ci mostere kimint kel tecse del boesse di tecse do dzeu sereut håyné si vos decidez del schaper.',
 'session_fail_preview' => "'''Mande escuzes! Mins dji n' a nén polou traitî vosse candjmint paski les dnêyes del session ont stî pierdowes.
 Rissayîz s' i vs plait. Si çoula n' va todi nén, sayîz di vs dislodjî eyet di vs relodjî.'''",
 'session_fail_preview_html' => "'''Mande escuzes! Mins dji n' a nén polou traitî vosse candjmint paski les dnêyes del session ont stî pierdowes.'''
 
-''Come ci wiki chal a-st en alaedje li HTML brut, li prévoeyaedje est catchî, come proteccion siconte des atakes JavaScript.''
+''Come {{SITENAME}} a-st en alaedje li HTML brut, li prévoeyaedje est catchî, come proteccion siconte des atakes JavaScript.''
 
-'''Si c' est ene saye oniesse di candjî l' pådje, rissayîz s' i vs plait. Si çoula n' va todi nén, sayîz di vs dislodjî eyet di vs relodjî.'''",
+'''Si c' est ene saye oniesse di candjî l' pådje, rissayîz s' i vs plait.'''
+Si çoula n' va todi nén, sayîz di vs [[Special:UserLogout|dislodjî]] eyet di vs relodjî.",
 'editing' => 'Candjant $1',
+'creating' => 'Ahivant $1',
 'editingsection' => 'Candjant $1 (seccion)',
-'editingcomment' => 'Candjant $1 (comintaire)',
+'editingcomment' => 'Candjant $1 (novele seccion)',
 'editconflict' => 'Ecramiaedje inte deus candjmints: $1',
 'explainconflict' => "Ene sakî a candjî l' pådje do tins ki vos estîz a scrire.
 Li boesse di tecse do dzeur mostere li tecse del pådje come il est
@@ -518,18 +680,30 @@ Vos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz c
 Si vos n' voloz nén scrire des årtikes ki polèt esse candjîs pa des ôtes, adon nels evoyîz nén chal.<br />
 Vos nos acertinez eto ki vos avoz scrît l' tecse vos-minme, oudonbén l' avoz copyî d' on sourdant libe (voeyoz $1 po pus di racsegnes).
 '''N' EVOYÎZ NÉN DES TECSES DIZO ABONDROETS SINS PERMISSION!'''",
-'longpageerror' => "'''AROKE: Li tecse ki vos avoz evoyî fwait di pus d' $1 kilo-octets, çou k' est pus ki l' macsimom di $2 kilo-octets. C' est nén possible del schaper sol sierveu.'''",
+'longpageerror' => "'''AROKE: Li tecse ki vos avoz evoyî fwait di pus d' $1 kilo-octet{{PLURAL:$1||s}}, çou k' est pus ki l' macsimom di $2 kilo-octet{{PLURAL:$2||s}}.'''
+C' est nén possible del schaper sol sierveu.",
 'readonlywarning' => "'''ASTEME: On-z overe sol båze di dnêyes pol moumint, ey elle a stî metowe e mode seulmint-lére.
-Do côp, vos n' såroz schaper vos candjmints asteure; motoit vos dvrîz copyî et aclaper l' tecse dins on fitchî da vosse pol poleur rimete pus tård.'''",
-'protectedpagewarning' => "'''ASTEME: Cisse pådje chal a stî protedjeye siconte des candjmints, seulmint les uzeus avou èn accès di manaedjeu el polèt candjî.'''",
-'semiprotectedpagewarning' => "'''Note:''' cisse pådje ci a stî protedjeye po k' seulmint les uzeus edjîstrés el polexhe candjî.",
-'templatesused' => 'Modeles eployîs e cisse pådje ci:',
+Do côp, vos n' såroz schaper vos candjmints asteure.'''
+Motoit vos dvrîz copyî et aclaper l' tecse dins on fitchî da vosse pol poleur rimete pus tård.
+
+Li manaedjeu k' a-st eclawé l' båze di dnêyes a dné cist esplicaedje ci: $1",
+'protectedpagewarning' => "'''ASTEME: Cisse pådje chal a stî protedjeye, seulmint les uzeus avou èn accès di manaedjeu el polèt candjî.'''
+Li dierinne intrêye ezès djournås est håynêye chal pa dzo po referince:",
+'semiprotectedpagewarning' => "'''Note:''' cisse pådje ci a stî protedjeye po k' seulmint les uzeus edjîstrés el polexhe candjî.
+Li dierinne intrêye do djournå est håynêye chal pa dzo po referince:",
+'cascadeprotectedwarning' => "'''ASTEME:''' cisse pådje ci a stî protedjeye ça fwait ki seulmint les uzeus avou l' livea d' manaedjeu el polnut candjî, paski l' pådje est eployeye å dvins {{PLURAL:$1|del pådje shuvante, k' est protedjeye|des pådjes shuvantes, ki sont protedjeyes}} avou l' tchuze «e cascåde» en alaedje:",
+'templatesused' => '{{PLURAL:$1|Modele eployî|Modeles eployîs}} e cisse pådje ci:',
+'templatesusedpreview' => "{{PLURAL:$1|Modele eployî|Modeles eployîs}} e ç' prévoeyaedje ci:",
+'templatesusedsection' => '{{PLURAL:$1|Modele eployî|Modeles eployîs}} e cisse seccion ci:',
 'template-protected' => '(protedjî)',
 'template-semiprotected' => '(dimey-protedjî)',
+'hiddencategories' => "Cisse pådje ci est mimbe {{PLURAL:$1|d' ene categoreye catcheye|di $1 categoreyes catcheyes}}:",
 'nocreatetitle' => 'Ahivaedje di pådjes limité',
-'nocreatetext' => "Cisse waibe ci a limité l' possibilité d' ahiver des novelès pådjes. Vos ploz rivni en erî eyet candjî ene pådje k' egzistêye dedja, oudonbén, [[Special:UserLogin|vos elodjî ou ahiver on conte d' uzeu]].",
+'nocreatetext' => "{{SITENAME}} a limité l' possibilité d' ahiver des novelès pådjes.
+Vos ploz rivni en erî eyet candjî ene pådje k' egzistêye dedja, oudonbén, [[Special:UserLogin|vos elodjî ou ahiver on conte d' uzeu]].",
 'nocreate-loggedin' => "Vos n' avoz nén l' droet d' ahiver des novelès pådjes.",
-'recreate-moveddeleted-warn' => "'''Asteme : vous estoz ki rahive ene pådje k' a stî dsfacêye davance.'''
+'permissionserrorstext-withaction' => "Vos n' avoz nén l' droet d' $2, cåze {{PLURAL:$1|del råjhon shuvante|des råjhons shuvantes}}:",
+'recreate-moveddeleted-warn' => "'''Asteme : vous estoz ki rahive ene pådje k' a stî disfacêye davance.'''
 
 Tuzez bén s' el fåt vormint rahiver, tot tapant èn ouy so l' istwere del pådje :",
 'edit-gone-missing' => "Li pàdje n' a sepou esse rapontieye.
@@ -538,6 +712,11 @@ Motoit k' elle a stî tapêye evoye.",
 'edit-no-change' => "Vosse sicrijhaedje n' a nén passé, paski rén n' a stî candjî al modêye di dvant.",
 'edit-already-exists' => "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.
+Sacwants di zels ni seront nén eployîs.",
+'post-expand-template-inclusion-category' => "Pådjes ki l' inclusion d' modeles est foû limite",
+
 # Account creation failure
 'cantcreateaccounttitle' => "Vos n' ploz nén ahiver-st on conte.",
 
@@ -545,55 +724,76 @@ Motoit k' elle a stî tapêye evoye.",
 'viewpagelogs' => 'Vey les djournås po cisse pådje ci',
 'nohistory' => "I n' a pont d' istwere des modêyes po cisse pådje chal.",
 'currentrev' => "Modêye d' asteure",
+'currentrev-asof' => 'Dierinne modêye å $1',
 'revisionasof' => 'Modêye do $1',
+'revision-info' => 'Modêye do $1 pa $2',
 'previousrevision' => '←Modêye di dvant',
 'nextrevision' => 'Modêye shuvante→',
 'currentrevisionlink' => "Modêye d' asteure",
 'cur' => 'ast.',
 'next' => 'shuv.',
-'last' => 'dif.',
+'last' => 'div.',
 'page_first' => 'prumî',
 'page_last' => 'dierin',
 'histlegend' => "Tchoezi les modêyes a comparer: clitchîz so les botons radio des deus modêyes
 ki vos vloz comparer et s' tchôkîz sol tape «enter» ou clitchîz sol
 boton do dzo.<br />
-Ledjinde: (ast.) = diferince avou l' modêye d' asteure,
-(dif.) = diferince avou l' modêye di dvant, M = pitit candjmint d' rén do tot.",
+Ledjinde: '''({{int:cur}})''' = diferince avou l' modêye d' asteure, '''({{int:last}})''' = diferince avou l' modêye di dvant, '''{{int:minoreditletter}}''' = pitit candjmint d' rén do tot.",
+'history-fieldset-title' => "Naivyî l' istwere des candjmints",
+'history-show-deleted' => 'Disfacés seulmint',
 'histfirst' => 'li pus vî',
 'histlast' => 'li dierin',
 'historysize' => '({{PLURAL:$1|1 octet|$1 octets}})',
 'historyempty' => '(vude)',
 
 # Revision feed
+'history-feed-title' => 'Istwere des modêyes',
+'history-feed-description' => 'Istwere des candjmints di cisse pådje ci sol wiki',
 'history-feed-item-nocomment' => '$1 li $2',
+'history-feed-empty' => "Li pådje ki vos vloz drovi n' egzistêye nén.
+Elle a motoit stî  disfacêye ou k' elle a rcandjî d' no.
+Asprouvez do [[Special:Search|ricweri sol wiki]] po trover des pådjes vijhenes.",
 
 # Revision deletion
-'rev-deleted-comment' => '(comintaire oisté)',
+'rev-deleted-comment' => '(rascourti di candjmint oisté)',
 'rev-deleted-user' => "(no d' elodjaedje oisté)",
-'rev-deleted-text-permission' => 'Cisse modêye ci del pådje a stî oistêye foû des årtchives publikes.
-I gn a motoit des racsegnes sol [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} djournå des disfaçaedjes].',
-'rev-deleted-text-view' => "Cisse modêye ci del pådje a stî oistêye foû des årtchives publikes.
-Come manaedjeu so ç' wiki ci, vos avoz l' droet del vey; i gn a motoit des detays sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].",
+'rev-deleted-text-permission' => "Cisse modêye ci del pådje a stî '''disfacêye'''.
+Vos ploz vey les ca et les ma sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].",
+'rev-deleted-text-view' => "Cisse modêye ci del pådje a stî '''disfacêye'''.
+Vos l' poloz co vey; i gn a des detays sol [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} djournå des disfaçaedjes].",
 'rev-delundel' => 'mostrer/catchî',
 'revisiondelete' => 'Disfacer/rapexhî des modêyes',
-'revdelete-selected' => "'''Tchoezeye modêye di [[:$1]]:'''",
-'logdelete-selected' => "'''{{PLURAL:$2|Evenmint tchoezi|Evenmints tchoezis}} ezès djournås po '''$1:''''''",
-'revdelete-text' => "'''Les disfacêyès modêyes vont continouwer d' aparexhe dins l' pådje di l' istwere, mins leu contnou n' serè nén veyåve do publik.'''
+'revdelete-show-file-submit' => 'Oyi',
+'revdelete-selected' => "'''{{PLURAL:$2|Tchoezeye modêye|Tchoezeyès modêyes}} di [[:$1]]:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Evenmint tchoezi|Evenmints tchoezis}} ezès djournås:'''",
+'revdelete-text' => "'''Les disfacés avenmints et modêyes vont continouwer d' aparexhe dins l' pådje di l' istwere, mins leu contnou n' serè nén veyåve do publik.'''
 
-Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l' rapexhî åd triviè di cisse minme eterface ci, a moens k' ene restriccion di pus ni soeye metowe en alaedje pås mwaisses-manaedjeus del waibe.",
-'revdelete-legend' => 'Defini des restriccions sol modêye',
+Les ôtes manaedjeus so {{SITENAME}} pôront todi vey li contnou catchî eyet l' rapexhî åd triviè di cisse minme eterface ci, a moens k' ene restriccion di pus ni soeye metowe en alaedje pås mwaisses-manaedjeus del waibe.",
+'revdelete-legend' => 'Defini des restriccions sol voeyaedje',
 'revdelete-hide-text' => "Catchî l' tecse del modêye",
 'revdelete-hide-comment' => "Catchî l' comintaire di candjmint",
 'revdelete-hide-user' => "Catchî l' no d' uzeu/adresse IP do candjeu",
-'revdelete-hide-restricted' => 'Apliker ces restrictions ossu åzès manaedjeus',
+'revdelete-hide-restricted' => "Oister foû les dnêyes ossu bén po les manaedjeus k' po les ôtes",
+'revdelete-radio-set' => 'Oyi',
+'revdelete-radio-unset' => 'Neni',
 'revdelete-log' => 'Råjhon:',
-'revdelete-submit' => 'Apliker al modêye tchoezeye',
+'revdelete-submit' => 'Apliker {{PLURAL:$1|al modêye tchoezeye|åzès modêyes tchoezeyes}}',
+'revdel-restore' => "candjî l' veyåvisté",
+'revdel-restore-deleted' => 'disfacêyès modêyes',
+'revdel-restore-visible' => 'veyåvès modêyes',
+'deletedhist' => 'Istwere disfacêye',
 
 # History merging
+'mergehistory-success' => '$3 modêye{{PLURAL:$3||s}} di [[:$1]] {{PLURAL:$3|a stî metowe|ont stî metowes}} avou [[:$2]].',
+'mergehistory-fail' => "Nén possibe di mete eshonne les istweres. Verifyîz l' pådje et les parametes di date.",
+'mergehistory-no-source' => "Li pådje sourdant $1 n' egzistêye nén.",
 'mergehistory-reason' => 'Råjhon:',
 
+# Merge log
+'revertmerge' => 'Dispårti',
+
 # Diffs
-'difference' => '(Diferinces inte les modêyes)',
+'history-title' => 'Istwere des candjmints po «$1»',
 'lineno' => 'Roye $1:',
 'compareselectedversions' => 'Comparer les modêyes tchoezeyes',
 'editundo' => 'disfé',
@@ -602,28 +802,57 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
 'searchresults' => 'Rizultats do cweraedje',
 'searchresults-title' => 'Rizultats des rcwerances po « $1 »',
 'searchresulttext' => 'Po pus di racsegnes sol manire di fé des cweraedjes so {{SITENAME}}, loukîz [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Pol cweraedje «[[$1]]»',
+'searchsubtitle' => "Vos avoz cwerou après «'''[[:$1]]'''» ([[Special:Prefixindex/$1|totes les pådjes ki cmincèt avou «$1»]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|totes les pådjes ki loynut viè «$1»]])",
 'searchsubtitleinvalid' => 'Pol cweraedje «$1»',
 'titlematches' => 'Årtikes avou on tite ki corespond',
 'notitlematches' => 'Nol årtike avou on tite ki corespond',
 'textmatches' => 'Årtikes avou do tecse ki corespond',
 'notextmatches' => 'Nol årtike avou do tecse ki corespond',
-'prevn' => '$1 di dvant',
-'nextn' => '{{PLURAL:$1|$1}} shuvants',
+'prevn' => '{{PLURAL:$1|di dvant|$1 di dvant}}',
+'nextn' => '{{PLURAL:$1|shuvant|$1 shuvants}}',
+'prevn-title' => '$1 {{PLURAL:$1|rizultat|rizultats}} di dvant',
+'nextn-title' => '{{PLURAL:$1|rizultat shuvant|$1 rizultats shuvants}}',
+'shown-title' => 'Mostrer $1 rizultat{{PLURAL:$1||s}} par pådje',
 'viewprevnext' => 'Vey ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Tchuzes di cweraedje',
 'searchmenu-exists' => "'''Gn a ddja ene pådje lomêye « [[:$1]] » so ç' wiki ci'''",
+'searchmenu-new' => "'''Ahiver l' pådje \"[[:\$1]]\" so ç' wiki ci!'''",
 'searchhelp-url' => 'Help:Aidance',
-'search-redirect' => '(ridjiblé di $1)',
-'search-interwiki-caption' => 'So les ôtes pordjets Wiki',
+'searchprofile-articles' => 'Pådjes di contnou',
+'searchprofile-project' => "Pådjes d' aidance et do pordjet",
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Tote li waibe',
+'searchprofile-advanced' => 'Sipepieus',
+'searchprofile-articles-tooltip' => 'Cweri dins $1',
+'searchprofile-project-tooltip' => 'Cweri dins $1',
+'searchprofile-images-tooltip' => 'Cweri après des fitchîs multimedia',
+'searchprofile-everything-tooltip' => "Cweri tot avå l' waibe (dins tos les espåces di lomaedje eyet leu pådjes di copene)",
+'searchprofile-advanced-tooltip' => 'Tchoezixhoz les espåces di lomaedje ki vos vloz rwaitî pol cweraedje',
+'search-result-size' => '$1 ($2 mot{{PLURAL:$2||s}})',
+'search-result-category-size' => '$1 mimbe{{PLURAL:$1||s}} ($2 dizo-categoreye{{PLURAL:$2||s}}, $3 fitchî{{PLURAL:$3||s}})',
+'search-result-score' => 'Pertinance: $1%',
+'search-redirect' => '(redjiblé di $1)',
+'search-section' => '(seccion $1)',
+'search-suggest' => 'Sayîz motoit çoula: $1',
+'search-interwiki-caption' => 'So les ôtes pordjets frés',
 'search-interwiki-default' => 'Gn a des sfwaitès sacwès so $1 :',
 'search-interwiki-more' => '(dipus)',
+'searchall' => 'totafwait',
 'showingresults' => "Chal pa dzo {{PLURAL:$1|'''1''' rizultat|'''$1''' rizultats}} a pårti do limero '''$2'''.",
 'showingresultsnum' => "Chal pa dzo {{PLURAL:$3|'''1''' rizultat|'''$3''' rizultats}} a pårti do limero '''$2'''.",
-'nonefound' => "'''Note''': des cweraedjes ki n' dinèt nou rzultat c' est sovint li cweraedje di ptits mots trop corants (come «les», «des») ki n' sont nén indecsés, oudonbén des cweraedjes di pus d' on mot (seulmint les pådjes avou tos les mots dmandés sront håynêyes dins l' rizultat do cweraedje).",
+'showingresultsheader' => "{{PLURAL:$5|Rizultat '''$1'''|Rizultats '''$1 - $2'''}} foû di '''$3'' po '''$4'''",
+'nonefound' => "'''Note''': li prémetowe dujhance c' est d' cweri seulmint e sacwants espåces di lomaedje.
+Vos ploz sayî di mete «all:» pa dvant l' tecse a cweri po cweri dins tot l' contnou do wiki (dj' ô bén, ezès pådjes di copene, les modeles, evnd.), oudobén vos ploz mete li no d' l' espåce di lomaedje come betchete.",
 'search-nonefound' => "N' a rén di çou ki vs cweroz après",
 'powersearch' => 'Cweri',
 'powersearch-legend' => 'Pus spepieus rcweraedjes',
+'powersearch-ns' => 'Cweri ezès espåces di lomaedje:',
 'powersearch-redir' => 'Håyner les rdjiblaedjes',
+'powersearch-field' => 'Cweri',
+'powersearch-togglelabel' => 'Tchoezi:',
+'powersearch-toggleall' => 'Totafwait',
+'powersearch-togglenone' => 'Disclitchî tot',
+'search-external' => 'Difoûtrin cweraedje',
 'searchdisabled' => "Mande escuzes! Li cweraedje å dvins des årtikes a stî dismetou pol moumint, cåze ki l' sierveu est fortcherdjî. Tot ratindant, vos ploz eployî Google po fé les rcweraedjes so {{SITENAME}}, mins çoula pout esse ene miete vî.",
 
 # Quickbar
@@ -633,106 +862,248 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
 'qbsettings-fixedright' => 'Aclawêye a droete',
 'qbsettings-floatingleft' => 'Flotante a hintche',
 'qbsettings-floatingright' => 'Flotante a droete',
+'qbsettings-directionality' => "Aclawêye, sorlon l' sinse di scrijhaedje di vosse lingaedje",
 
 # Preferences page
 'preferences' => 'Preferinces',
 'mypreferences' => 'Mes preferinces',
 'prefs-edits' => 'Nombe di candjmints:',
 'prefsnologin' => "Vos n' estoz nén elodjî",
-'prefsnologintext' => 'I vs fåt esse [[Special:UserLogin|elodjî]] po pleur candjî vos preferinces.',
+'prefsnologintext' => 'I vs fåt esse <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} elodjî]</span> po pleur candjî vos preferinces.',
 'changepassword' => "Candjî l' sicret",
 'prefs-skin' => 'Pea',
 'skin-preview' => 'vey divant',
 'datedefault' => 'Nole preferince',
 'prefs-datetime' => 'Cogne del date',
+'prefs-user-pages' => 'Pådjes des uzeus',
 'prefs-personal' => 'Dinêyes da vosse',
 'prefs-rc' => 'Håynaedje des dierins candjmints',
 'prefs-watchlist' => 'Djivêye des shuvous',
 'prefs-watchlist-days' => "Nombe di djoûs a mostrer dins l' djivêye:",
+'prefs-watchlist-days-max' => 'Macsimom $1 djoû{{PLURAL:$1||s}}',
 'prefs-watchlist-edits' => "Nombe di candjmints a mostrer dins l' djivêye:",
 'prefs-misc' => 'Totes sôres',
+'prefs-resetpass' => "Candjî l' sicret",
+'prefs-changeemail' => "Candjî l' emile",
+'prefs-setemail' => 'Diner ene adresse emile',
+'prefs-email' => "Tchuzes d' emilaedje",
+'prefs-rendering' => 'Rivnance',
 'saveprefs' => 'Schaper les preferinces',
 'resetprefs' => 'Rimete les prémetowès valixhances',
-'prefs-editing' => 'Grandeu del boesse di tecse',
+'restoreprefs' => 'Rimete totes les prémetowès valixhances',
+'prefs-editing' => 'Boesse di tecse',
 'rows' => 'Royes',
 'columns' => 'Colones',
 'searchresultshead' => 'Håynaedje des rzultats di cweraedje',
 'resultsperpage' => 'Nombe di responses a håyner so ene pådje',
 'recentchangesdays' => 'Nombe di djoûs po les dierins candjmints:',
-'recentchangescount' => 'Nombe di tites dins les dierins candjmints',
+'recentchangesdays-max' => 'Macsimom $1 djoû{{PLURAL:$1||s}}',
+'recentchangescount' => 'Prémetou nombe di candjmintstites a håyner:',
 'savedprefs' => 'Vos preferinces ont stî schapêyes.',
-'timezonelegend' => "Coisse d' eureye",
-'localtime' => "Håyner l' eure locåle",
-'timezoneoffset' => "Diferince d' eures¹",
-'servertime' => "L' eure sol sierveu",
+'timezonelegend' => "Coisse d' eureye:",
+'localtime' => "L' eure locåle",
+'timezoneuseserverdefault' => "Epoyî l' prémetowe valixhance ($1)",
+'timezoneuseoffset' => "Ôte (dinez l' diferince d' eures)",
+'timezoneoffset' => "Diferince d' eures¹:",
+'servertime' => "L' eure sol sierveu:",
 'guesstimezone' => "Prinde d' après l' betchteu",
+'timezoneregion-africa' => 'Afrike',
+'timezoneregion-america' => 'Amerike',
+'timezoneregion-antarctica' => 'Antartike',
+'timezoneregion-arctic' => 'Arctike',
+'timezoneregion-asia' => 'Azeye',
+'timezoneregion-atlantic' => 'Oceyan Atlantike',
+'timezoneregion-australia' => 'Ostraleye',
+'timezoneregion-europe' => 'Urope',
+'timezoneregion-indian' => 'Oceyan Indyin',
+'timezoneregion-pacific' => 'Oceyan Pacifike',
 'allowemail' => "Permete di rçure des emiles d' ôtes uzeus",
-'defaultns' => 'Prémetous spåces di nos pol cweraedje:',
+'prefs-searchoptions' => 'Tchuzes di cweraedje',
+'prefs-namespaces' => 'Espåces di lomaedje',
+'defaultns' => 'Oudonbén dins les spåces di nos shuvants:',
 'default' => 'prémetou',
 'prefs-files' => 'Fitchîs',
-'youremail' => 'Vost emile*',
+'prefs-custom-css' => 'CSS a vosse môde',
+'prefs-custom-js' => 'JavaScript a vosse môde',
+'prefs-common-css-js' => 'CSS/JavaScript pårtaedjî po totes les peas:',
+'prefs-reset-intro' => "Vos ploz eployî ç' boton chal po rmete totes vos preferinces åzès prémetowès valixhances del waibe.
+Çoul n' pôrè nén esse disfwait.",
+'prefs-emailconfirm-label' => "Acertinaedje di l' emile:",
+'prefs-textboxsize' => 'Grandeu del boesse di tecse',
+'youremail' => 'Vost emile:',
 'username' => "No d' elodjaedje:",
 'uid' => "Limero d' l' uzeu:",
-'yourrealname' => 'Li vraiy no da vosse*',
+'prefs-memberingroups' => 'Mimbe {{PLURAL:$1|do groupe|des groupes}}:',
+'prefs-registration' => "Date d' edjîstraedje:",
+'yourrealname' => 'Li vraiy no da vosse:',
 'yourlanguage' => "Lingaedje po l' eterface",
-'yourvariant' => 'Variante do lingaedje',
-'yournick' => 'Vosse no metou (po les sinateures)',
-'badsig' => 'Sinateure brute nén valide; verifyîz les etiketes HTML.',
+'yourvariant' => 'Variante di lingaedje pol contnou:',
+'prefs-help-variant' => "Li variante ou ortografeye ki vos avoz ptchî po håyner li contnou des pådjes so ç' wiki ci.",
+'yournick' => 'Novele sinateure:',
+'prefs-help-signature' => "Les comintaires so les pådjes di copene divrént esse sinés avou «<nowiki>~~~~</nowiki>» (dj' ô bén, 4 wachletes), çou ki srè candjî otomaticmint a vosse sinateure eyet li date et l' eure.",
+'badsig' => 'Sinateure brute nén valide.
+Verifyîz les etiketes HTML.',
+'badsiglength' => "Vosse sinateure est pår trop longowe.
+Racourtixhoz l' a moens di $1 {{PLURAL:$1|caractere|caracteres}}.",
+'yourgender' => 'Seke:',
+'gender-unknown' => 'Nén dné',
+'gender-male' => 'Omrin',
+'gender-female' => 'Femrin',
+'prefs-help-gender' => "Seke (opcionel): eployî po-z acoirder l' djinre di sacwants messaedjes di l' eterface.
+Ciste infôrmacion serè publike po tertos.",
 'email' => 'Emile',
-'prefs-help-realname' => '* Li vraiy no da vosse (opcionel): si vos tchoezixhoz del diner i serè-st eployî po les contribouwaedjes da vosse.',
-'prefs-help-email' => "* Emile (opcionel): Permete di rçure des emiles ki ds ôtes uzeus vos polèt evoyî a pårti del pådje d' uzeu da vosse, sins ki voste adresse emile ni soeye håynêye.",
+'prefs-help-realname' => 'Li vraiy no da vosse (opcionel): si vos tchoezixhoz del diner i serè-st eployî po les contribouwaedjes da vosse.',
+'prefs-help-email' => "Emile (opcionel): permete di rçure des emiles ki ds ôtes uzeus vos polèt evoyî a pårti del pådje d' uzeu da vosse, sins ki voste adresse emile ni soeye håynêye.",
+'prefs-help-email-others' => "Vos ploz eto tchoezi k' les ôtes vos emilexhe a pårti d' on loyén sol pådje di copene da vosse. Voste adresse emile n' est nén veyowe cwand des ôtes uzeus vos scrijhèt.",
+'prefs-help-email-required' => 'I fåt dner ene adresse emile.',
+'prefs-info' => "Infôrmåcion d' båze",
+'prefs-i18n' => 'Eternåcionålijhaedje',
 'prefs-signature' => 'Sinateure',
 'prefs-dateformat' => 'Cogne del date',
+'prefs-timeoffset' => "Diferince d' eures",
+'prefs-advancedediting' => 'Sipepieuzès tchuzes',
+'prefs-advancedrc' => 'Sipepieuzès tchuzes',
+'prefs-advancedrendering' => 'Sipepieuzès tchuzes',
+'prefs-advancedsearchoptions' => 'Sipepieuzès tchuzes',
+'prefs-advancedwatchlist' => 'Sipepieuzès tchuzes',
+'prefs-displayrc' => 'Tchuzes di håynaedje',
+'prefs-displaysearchoptions' => 'Tchuzes di håynaedje',
+'prefs-displaywatchlist' => 'Tchuzes di håynaedje',
+'prefs-diffs' => 'Diferinces',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => "L' adresse emile a l' air d' esse valide",
+'email-address-validity-invalid' => 'Dinez ene adresse emile valide',
 
 # User rights
 'userrights' => 'Manaedjî les liveas des uzeus',
-'userrights-lookup-user' => "Manaedjî les groupes d' èn uzeu",
+'userrights-lookup-user' => "Manaedjî les groupes d' uzeus",
 'userrights-user-editname' => "Tapez on no d' uzeu:",
-'editusergroup' => "Candjî les groupes di l' uzeu",
-'editinguser' => "Candjant '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => "Candjî groupes d' uzeus",
-'saveusergroups' => "Schaper des groupes d' uzeus",
-'userrights-groupsmember' => 'Mimbes di:',
+'editusergroup' => "Candjî les groupes d' uzeus",
+'editinguser' => "Candjant les droets d' l' {{GENDER:$1|uzeu|uzeuse}} '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => "Candjî les groupes d' uzeus",
+'saveusergroups' => "Schaper les groupes d' uzeus",
+'userrights-groupsmember' => 'Mimbe di:',
+'userrights-groupsmember-auto' => 'Mimbe implicite di:',
+'userrights-groups-help' => "Vos ploz candjî les groupes ki {{GENDER:\$1|cist uzeu|ciste uzeuse}} apårtént:
+* Ene boesse clitcheye c' est k' {{GENDER:\$|il|elle}} est mimbe do groupe.
+* Ene boesse disclitcheye c' est k' {{GENDER:\$|i|ele}} n' end est nén mimbe.
+* Ene sitoele (*) mostere k' on n' pout nén rsaetchî l' groupe on côp k' il a stî radjouté, ou årvierdimint.",
 'userrights-reason' => 'Råjhon:',
+'userrights-no-interwiki' => "Vos n' avoz nén les permissions po candjî les droets des uzeus so ds ôtes wikis.",
+'userrights-nodatabase' => "Li båze di dnêyes «$1» n' egzistêye nén ou n' est nén locåle.",
+'userrights-nologin' => 'Vos vs divoz [[Special:UserLogin|elodjî]] avou on conte manaedjeu por vos pleur candjî les droets des uzeus.',
+'userrights-notallowed' => "Li conte da vosse n' pout nén radjouter ou rsaetchî des droets des uzeus.",
+'userrights-changeable-col' => 'Groupes ki vos ploz candjî',
+'userrights-unchangeable-col' => "Groupes ki vos n' poloz nén candjî",
 
 # Groups
 'group' => 'Groupe:',
+'group-user' => 'Uzeus',
+'group-autoconfirmed' => 'Uzeus edjîstrés',
 'group-bot' => 'Robots',
 'group-sysop' => 'Manaedjeus',
 'group-bureaucrat' => 'Mwaisse-manaedjeus',
+'group-suppress' => 'Supervizeus',
 'group-all' => '(tertos)',
 
-'group-bot-member' => 'robot',
-'group-sysop-member' => 'manaedjeu',
-'group-bureaucrat-member' => 'mwaisse-manaedjeu',
+'group-user-member' => '{{GENDER:$1|uzeu|uzeuse}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|uzeu edjîstré|uzeuse edjîstrêye}}',
+'group-bot-member' => '{{GENDER:$1|robot|robote}}',
+'group-sysop-member' => '{{GENDER:$1|manaedjeu|manaedjresse}}',
+'group-bureaucrat-member' => '{{GENDER:$1|mwaisse-manaedjeu|mwaisse-manaedjresse}}',
+'group-suppress-member' => '{{GENDER:$1|supervizeu|supervizeuse}}',
 
+'grouppage-user' => '{{ns:project}}:Uzeus',
+'grouppage-autoconfirmed' => '{{ns:project}}:Uzeus edjîstrés',
 'grouppage-bot' => '{{ns:project}}:Robots',
 'grouppage-sysop' => '{{ns:project}}:Manaedjeus',
 'grouppage-bureaucrat' => '{{ns:project}}:Mwaisse-manaedjeus',
+'grouppage-suppress' => '{{ns:project}}:Supervizeus',
 
 # Rights
 'right-read' => 'Lére les pådjes',
+'right-edit' => 'Candjî les pådjes',
+'right-createpage' => "Ahiver des pådjes (ki n' sont nén des pådjes di copene)",
+'right-createtalk' => 'Ahiver des pådjes di copinaedje',
+'right-createaccount' => "Ahiver des noveas contes d' uzeu",
+'right-minoredit' => 'Marker les candjmints come mineurs',
+'right-move' => 'Displaecî des pådjes',
+'right-move-subpages' => 'Displaecî des pådjes avou leus dzo-pådjes',
+'right-move-rootuserpages' => 'Displaecî les pådjes raecene des uzeus',
+'right-movefile' => 'Displaecî des fitchîs',
+'right-suppressredirect' => 'Èn nén fé di pådje di redjiblaedje dispoy li vî no cwand on displaece ene pådje',
+'right-upload' => 'Eberweter des fitchîs',
+'right-reupload' => "Sipotchî des fitchîs k' egzitèt ddja",
+'right-reupload-own' => 'Sipotchî les itchîs eberwetés pa vos-minme',
+'right-reupload-shared' => "Sipotchî locålmint des fitchî ki s' trovèt sol depot pårtaedjî",
+'right-upload_by_url' => "Eberweter des fitchîs a pårti d' hårdêyes",
+'right-purge' => "Vudî l' muchete des pådjes sins acertinaedje",
+'right-autoconfirmed' => 'Candjî les pådjes dimey-protedjeyes',
+'right-bot' => 'Esse traitî come on programe otomatike',
+'right-nominornewtalk' => "Èn nén dire k' i gn a des noveas messaedjes cwand les candjmints del pådje di copene d' èn uzeu sont mineurs",
+'right-writeapi' => "Eployî l' API di scrijhaedje sol wiki",
+'right-delete' => 'Disfacer des pådjes',
+'right-bigdelete' => 'Disfacer des pådjes avou ene longowe istwere',
+'right-deleterevision' => "Disfacer et rapexhî des modêyes d' ene pådje",
+'right-deletedhistory' => "Vey les disfacêyès intrêyes di l' istwere, sins leu tecse",
+'right-deletedtext' => 'Vey les tecses disfacés eyet les candjmints etur disfacêyès modêyes',
+'right-browsearchive' => 'Loukî après les disfacêyès pådjes',
+'right-undelete' => "Rapexhî ene pådje k' a stî disfacêye",
+'right-suppressrevision' => 'Verifyî et rapexhî les modêyes catcheyes åzès manaedjeus',
+'right-suppressionlog' => 'Vey les djournås privés',
+'right-block' => "Espaitchî d' ôtes uzeus di scrire",
+'right-blockemail' => "Espaitchî èn uzeu d' evoyî des emiles",
+'right-hideuser' => "Bloker on no d' uzeu, tot catchant s' no ås ôtes",
+'right-ipblock-exempt' => "Passer houte des blocaedjes pa adresse IP, pa fortchete d' adresses ou des blocaedjes otomatikes",
+'right-proxyunbannable' => 'Passer houte des blocaedjes otomatikes des procsis',
+'right-unblockself' => 'Si disbloker lu-minme',
+'right-protect' => "Candjî les liveas d' protedjaedje eyet candjî les pådjes protedjeyes",
 
 # User rights log
 'rightslog' => 'Djournå des droets des uzeus',
 'rightslogtext' => "Çouchal, c' est on djournå des candjmints des droets des uzeus.",
-'rightslogentry' => "l' uzeu «$1» a stî candjî do groupe «$2» viè «$3»",
+'rightslogentry' => "a candjî l' uzeu «$1» do groupe «$2» viè «$3»",
+'rightslogentry-autopromote' => 'a stî otomaticmint candjî di «$2» a «$3»',
 'rightsnone' => '(nouk)',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'lére cisse pådje ci',
+'action-edit' => "candjî l' pådje",
 'action-createpage' => 'ahiver des pådjes',
 'action-createtalk' => 'ahiver des pådjes di copinaedje',
 'action-createaccount' => "ahiver ci conte d' uzeu ci",
-'action-delete' => 'Disfacer cisse pådje ci',
-'action-browsearchive' => 'Loukî après les disfacêyès pådjes',
-'action-block' => 'Espaitchî cist(e) uzeu(se) ci di scrire',
+'action-minoredit' => "marker ç' candjmint la come mineur",
+'action-move' => 'displaecî cisse pådje ci',
+'action-move-subpages' => "displaecî l' pådje et ses dzo-pådjes",
+'action-move-rootuserpages' => "displaecî l' pådje raecene d' èn uzeu",
+'action-movefile' => "displaecî ç' fitchî ci",
+'action-upload' => "eberweter ç' fitchî ci",
+'action-reupload' => 'sipotchî ci fitchî ci',
+'action-reupload-shared' => "sipotchî l' pårtaedjî fitchî avou ci-chal",
+'action-upload_by_url' => "eberweter l' fitchî a pårti d' ene hårdêye",
+'action-writeapi' => "eployî l' API di scrijhaedje",
+'action-delete' => 'disfacer cisse pådje ci',
+'action-deleterevision' => 'disfacer cisse modêye ci',
+'action-deletedhistory' => "vey les disfacêyès intrêyes di l' istwere",
+'action-browsearchive' => 'loukî après les disfacêyès pådjes',
+'action-undelete' => "rapexhî l' pådje",
+'action-suppressrevision' => "verifyî et rapexhî l' modêye catcheye",
+'action-suppressionlog' => 'vey ci djournå privé ci',
+'action-block' => 'espaitchî cist(e) uzeu(se) ci di scrire',
+'action-protect' => "candjî les liveas d' protedjaedje del pådje",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|candjmint|candjmints}}',
 'recentchanges' => 'Dierins candjmints',
-'recentchangestext' => "Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}.",
-'rcnote' => 'Chal pa dzo les <strong>$1</strong> dierins candjmints des dierins <strong>$2</strong> djoûs, å $3.',
-'rcnotefrom' => "Chal pa dzo les candjmints dispoy li <b>$2</b> (disk' a <b>$1</b> di mostrés).",
+'recentchanges-legend' => 'Tchuzes po les dierins candjmints',
+'recentchanges-summary' => "Shuvoz chal les dierins candjmints k' i gn a yeu dsu {{SITENAME}}.",
+'recentchanges-label-newpage' => "Ci candjmint la est èn ahivaedje d' ene nouve pådje",
+'recentchanges-label-minor' => "Ci n' est k' on ptit candjmint",
+'recentchanges-label-bot' => 'Ci candjmint la a stî fwait pa on robot',
+'recentchanges-label-unpatrolled' => "Ci candjmint la n' a nén co stî patrouyî",
+'rcnote' => "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|do dierin djoû|des '''$2''' dierins djoûs}}, disk' å $4 a $5.",
+'rcnotefrom' => "Chal pa dzo les candjmints dispoy li '''$2''' (disk' a '''$1''' di mostrés).",
 'rclistfrom' => "Mostrer les candjmints k' i gn a yeu a pårti do $1",
 'rcshowhideminor' => '$1 candjmints mineurs',
 'rcshowhidebots' => '$1 robots',
@@ -743,17 +1114,28 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
 'rclinks' => 'Mostrer les $1 dierins candjmints des dierins $2 djoûs.<br />$3',
 'diff' => 'dif.',
 'hist' => 'ist.',
-'hide' => 'Muchyî',
-'show' => 'håyner',
+'hide' => 'catch.',
+'show' => 'håy.',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[shuvou pa $1 {{PLURAL:$1|uzeu|uzeus}}]',
 'rc_categories' => 'Limiter åzès categoreyes (separer avou des «|»)',
 'rc_categories_any' => 'Totes',
+'rc-change-size-new' => "$1 {{PLURAL:$1|octet|octets}} après l' candjmint",
 'newsectionsummary' => '/* $1 */ novele seccion',
+'rc-enhanced-expand' => 'Mostrer les detays (i fåt JavaScript)',
+'rc-enhanced-hide' => 'Catchî les detays',
 
 # Recent changes linked
 'recentchangeslinked' => 'Candjmints aloyîs',
 'recentchangeslinked-feed' => 'Candjmints aloyîs',
 'recentchangeslinked-toolbox' => 'Candjmints aloyîs',
+'recentchangeslinked-title' => 'Candjmints aloyîs a «$1»',
+'recentchangeslinked-summary' => "Çouchal c' est ene djivêye des candjmints k' ont stî fwaits dierinnmint a des pådjes aloyeyes a pårti d' ene pådje dinêye (ou mimbes d' ene categoreye dinêye).
+Les pådjes ki [[Special:Watchlist|vos shuvoz]] sont-st e '''cråssès letes'''.",
+'recentchangeslinked-page' => 'No del pådje:',
+'recentchangeslinked-to' => "Mostere les candjmints des pådjes avou on loyén viè l' pådje dinêye purade k' å rviè",
 
 # Upload
 'upload' => 'Eberweter on fitchî',
@@ -763,18 +1145,18 @@ Les ôtes manaedjeus so ç' wiki ci pôront todi vey li contnou catchî eyet l'
 'uploadnologintext' => 'I vs fåt esse [[Special:UserLogin|elodjî]] por vos pleur eberweter des fitchîs.',
 'upload_directory_read_only' => "Li sierveu waibe èn pout nén scrire sol ridant d' eberwetaedje ($1).",
 'uploaderror' => "Aroke d' eberwetaedje",
-'uploadtext' => "Eployîz les boesses d' intrêye chal pa dzo po-z eberweter des noveas fitchîs d' imådjes po vos årtikes. Sol plupårt des betchteus, vos voeroz on boton «Foyter...» (ou «Browse...») ki vs permetrè di foyter dins les ridants del deure plake da vosse po tchoezi l' fitchî, çou ki rimplirè otomaticmint li tchamp do no do fitchî k' est a costé.
-
-Po håyner ou cweri des imådjes k' ont ddja stî rçuvowes, alez sol [[Special:FileList|djivêye des imådjes dedja eberwetêyes]]. Les eberwetaedjes et disfaçaedjes sont metous èn on [[Special:Log/upload|djournå des eberwetaedjes]].
-
-Po håyner l' imådje dins èn årtike, eployîz on loyén del foûme
-* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.jpg]]</nowiki>'''
-* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.png|thumb|tecse a mete padzo]]</nowiki>'''
-ou co po les sons
-* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitchî.ogg]]</nowiki>'''",
+'uploadtext' => "Eployîz les boesses d' intrêye chal pa dzo po-z eberweter des fitchîs.
+Po håyner ou cweri des fitchîs k' ont ddja stî rçuvous, alez sol [[Special:FileList|djivêye des fitchîs ddja eberwetés]].
+Les (r)eberwetaedjes sont eto metos sol [[Special:Log/upload|djournå des eberwetaedjes]], les disfaçaedjes sol [[Special:Log/delete|ci des disfaçaedjes]].
+
+Po mete on fitchî dins ene pådje, eployîz on loyén del fôme:
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.jpg]]</nowiki></tt>''' po-z eployî l' modêye e grandeu oridjinnåle do fitchî
+* '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fitchî.png|200px|thumb|left|tecse di rawete]]</nowiki></tt>''' po håyner so ene lårdjeur di 200 picsels dins ene boesse (''thumb'') sol hintche (''left''; metoz ''right'' pol mete sol droete) avou «tecse di rawete» come discrijhaedje
+* '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fitchî.ogg]]</nowiki></tt>''' po fé on loyén viè l' fitchî, sins l' håyner",
 'uploadlog' => 'djournå des eberwetaedjes',
 'uploadlogpage' => 'Djournå des eberwetaedjes',
-'uploadlogpagetext' => 'Chal pa dzo li djivêye des dierins eberwetaedjes.',
+'uploadlogpagetext' => 'Chal pa dzo li djivêye des dierins eberwetaedjes.
+Loukîz al [[Special:NewFiles|galreye des noveas fitchîs]] po ene vuwe pus vizuwele.',
 'filename' => 'No do fitchî',
 'filedesc' => 'Discrijhaedje',
 'fileuploadsummary' => 'Discrijhaedje:',
@@ -789,13 +1171,17 @@ ou co po les sons
 'emptyfile' => "I shonnreut kel fitchî k' vos eberwetez soeye vude. Çoula pout esse cåze d' ene aroke di tapaedje dins l' no do fitchî. Acertinez si vos vloz evoyî po do bon ç' fitchî ci, s' i vs plait.",
 'fileexists' => "On fitchî avou ç' no la egzistêye dedja, loukîz s' i vs plait a '''<tt>[[:$1]]</tt>''' po vs acertiner ki vos vloz bén replaecî l' fitchî avou l' ci ki vos eberwetez asteure, oubén si vos l' voloz eberweter dizo èn ôte no.
 [[$1|thumb]]",
-'fileexists-forbidden' => "I gn a ddja on fitchî avou ç' no la; rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no. [[File:$1|thumb|center|$1]]",
-'fileexists-shared-forbidden' => "I gn a ddja on fitchî avou ç' no la e ridant des fitchîs pårtaedjîs; rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no. [[File:$1|thumb|center|$1]]",
+'fileexists-forbidden' => "I gn a ddja on fitchî avou ç' no la, et n' pout nén esse sipotchî.
+Si vos l' voloz tot l' minme eberweter, rivnoz en erî et s' reberwetez l' fitchî dizo èn ôte no.
+[[File:$1|thumb|center|$1]]",
+'fileexists-shared-forbidden' => "I gn a ddja on fitchî avou ç' no la e ridant des fitchîs pårtaedjîs.
+Rivnoz s' i vs plait en erî et s' reberwetez l' fitchî dizo èn ôte no si vos vloz.
+[[File:$1|thumb|center|$1]]",
 'uploadwarning' => "Adviertixhmint so l' eberwetaedje",
 'savefile' => "Schaper l' fitchî",
 'uploadedimage' => 'eberwetaedje di «[[$1]]»',
 'uploaddisabled' => 'Eberwetaedje di fitchîs dismetou',
-'uploaddisabledtext' => "Mande escuzes, mins l' eberwetaedje di fitchîs a stî dismetou pol moumint.",
+'uploaddisabledtext' => "L' eberwetaedje di fitchîs a stî dismetou.",
 'uploadscripted' => 'Ci fitchî ci a-st å dvins do côde HTML ou on scripe ki pôreut esse må comprin pa on betchteu waibe.',
 'uploadvirus' => 'Li fitchî a-st on virusse! Detays: $1',
 'sourcefilename' => "No d' fitchî so vosse copiutrece:",
@@ -805,7 +1191,7 @@ ou co po les sons
 
 'upload-file-error' => 'Divintrinne aroke',
 
-'license' => "Licince di l' imådje",
+'license' => 'Licince:',
 'nolicense' => 'Nole licince tchoezeye',
 'upload_source_file' => ' (on fitchî sol copiutrece da vosse)',
 
@@ -813,39 +1199,55 @@ ou co po les sons
 'listfiles_search_for' => "Cweri l' no d' imådje:",
 'imgfile' => 'fitchî',
 'listfiles' => 'Djivêye des imådjes',
+'listfiles_thumb' => 'Imådjete',
+'listfiles_date' => 'Date',
 'listfiles_name' => 'No',
 'listfiles_user' => 'Uzeu',
 'listfiles_size' => 'Grandeu',
 'listfiles_description' => 'Discrijhaedje',
+'listfiles_count' => 'Modêyes',
 
 # File description page
-'file-anchor-link' => 'Imådje',
+'file-anchor-link' => 'Fitchî',
 'filehist' => 'Istwere do fitchî',
 'filehist-help' => "Clitchîz so ene date ey ene eure po vey kimint ki l' fitchî esteut adon.",
 'filehist-deleteall' => 'disfacer ttafwait',
-'filehist-deleteone' => 'disfacer çouci',
+'filehist-deleteone' => 'disfacer',
+'filehist-revert' => 'disfé',
 'filehist-current' => 'asteure',
 'filehist-datetime' => 'Date/Eure',
+'filehist-thumb' => 'Imådjete',
+'filehist-thumbtext' => 'Imådjete pol modêye do $1',
+'filehist-nothumb' => 'Nole imådjete',
 'filehist-user' => 'Uzeu',
 'filehist-dimensions' => 'Grandeur',
 'filehist-filesize' => 'Grandeur do fitchî',
 'filehist-comment' => 'Comintaire',
-'imagelinks' => 'Loyéns viè ciste imådje cial',
-'linkstoimage' => '{{PLURAL:$1|Li pådje shuvante|Les pådjes shuvantes}} eployèt ciste imådje chal:',
+'filehist-missing' => 'Fitchî mancant',
+'imagelinks' => 'Eployaedjes do fitchî',
+'linkstoimage' => '{{PLURAL:$1|Li pådje shuvante eploye|Les $1 pådjes shuvantes eployèt}} ciste imådje chal:',
 'nolinkstoimage' => "I n' a nole pådje k' eploye ciste imådje chal.",
-'sharedupload' => "Ci fitchî ci est so on ridant pårtaedjî ey i s' pout k' i soeye eployî pa ds ôtes pordjets.",
-'sharedupload-desc-there' => 'Ci fitchî ci provént di $1; si pout i esse reployî dins des ôtes pordjets "Wiki". Loukîz [$2 si pådje di discrijhaedje] po-z esse mî racsegnî.',
-'sharedupload-desc-here' => 'Ci fitchî ci provént di $1; si pout i esse eployî divins des ôtes pordjets Wiki. Li discrijhaedje di [$2 si pådje di discrijhaedje] låvå est håynêye cial ådzo.',
+'sharedupload' => "Ci fitchî ci vént d' $1 ey i s' pout k' i soeye eployî pa ds ôtes pordjets.",
+'sharedupload-desc-there' => "Ci fitchî ci provént d' $1; si pout i esse reployî dins des ôtes pordjets. Loukîz [$2 si pådje di discrijhaedje] po-z esse mî racsegnî.",
+'sharedupload-desc-here' => "Ci fitchî ci provént d' $1; si pout i esse eployî divins des ôtes pordjets Wiki. Li discrijhaedje di [$2 si pådje di discrijhaedje] låvå est håynêye cial ådzo.",
 'uploadnewversion-linktext' => 'Eberweter ene nouve modêye di ci fitchî ci',
+'shared-repo-from' => "vént d' $1",
+'shared-repo' => 'on depot pårtaedjî',
 
 # File reversion
+'filerevert' => 'Rimete come divant $1',
 'filerevert-comment' => 'Råjhon:',
+'filerevert-submit' => 'Disfé',
 
 # File deletion
 'filedelete' => 'Disfacer $1',
 'filedelete-legend' => 'Disfacer fitchî',
 'filedelete-comment' => 'Råjhon:',
 'filedelete-submit' => 'Disfacer',
+'filedelete-otherreason' => 'Ene råjhon diferinne ou di pus:',
+'filedelete-reason-dropdown' => '*Råjhons po disfacer (å pus sovint)
+** Nén respet des abondroets
+** Fitchî e dobe',
 
 # MIME search
 'mimesearch' => 'Cweraedje MIME',
@@ -860,7 +1262,8 @@ ou co po les sons
 
 # Unused templates
 'unusedtemplates' => 'Modeles nén eployîs',
-'unusedtemplatestext' => "Cisse pådje ci mostere totes les pådjes di modele (espåce di lomaedje «{{ns:template}}») ki n' sont nén eployîs dins ene ôte pådje. Rimimbrez vs di verifyî s' i n' a nén des ôtes loyéns divant delzès disfacer.",
+'unusedtemplatestext' => "Cisse pådje ci mostere totes les pådjes di modele (espåce di lomaedje «{{ns:template}}») ki n' sont nén eployîs dins ene ôte pådje.
+Rimimbrez vs di verifyî s' i n' a nén des ôtes loyéns divant delzès disfacer.",
 'unusedtemplateswlh' => 'ôtes loyéns',
 
 # Random page
@@ -872,20 +1275,36 @@ ou co po les sons
 # Statistics
 'statistics' => 'Sitatistikes',
 'statistics-header-users' => 'Sitatistikes des uzeus',
+'statistics-articles' => 'Pådjes di contnou',
 'statistics-pages-desc' => 'Totes les pådjes do "Wiki", minme les copinaedjes, les rdjiblaedjes, evnd.',
 'statistics-mostpopular' => 'Pådjes les pus veyowes',
 
-'disambiguations' => "Pådjes d' omonimeye",
-'disambiguationspage' => 'Template:Omonimeye',
+'disambiguations' => "Pådjes avou des loyéns viè des pådjes d' omonimeye",
+'disambiguationspage' => 'Template:omonimeye',
+'disambiguations-text' => "Ces pådjes ci loynut eviè ene '''pådje d' omonimeye'''.
+Ele divrént purade raloyî direk å mwaisse sudjet.<br />
+Ene pådje est waiteye come pådje d' omonimeye s' ele eploye on modele k' est loyî a [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Dobes redjiblaedjes',
-'doubleredirectstext' => "Tchaeke roye a-st on loyén viè l' prumî eyet l' deujhinme redjiblaedje, avou on mostraedje del prumire roye do tecse do deujhinme redjiblaedje, çou ki å pus sovint dene li «vraiy» årtike såme, ki l' prumî redjiblaedje divreut evoyî viè lu.",
+'doubleredirectstext' => "Cisse pådje ci mostere les dobes redjiblaedjes (pådjes ki redjiblèt viè ene ôte pådje di redjiblaedje).
+Tchaeke roye a-st on loyén viè l' prumî eyet l' deujhinme redjiblaedje, avou on mostraedje del såme do deujhinme redjiblaedje, çou ki å pus sovint dene li «vraiy» årtike såme, ki l' prumî redjiblaedje divreut evoyî viè lu.
+Lis intrêyes <del>bårêyes</del> otn ddja stî coridjeyes.",
+'double-redirect-fixed-move' => "[[$1]] a stî displaecî.
+Asteure c' est on redjiblaedje viè [[$2]].",
+'double-redirect-fixer' => 'Coridjaedje des dobes redjiblaedjes',
 
 'brokenredirects' => 'Pierdous redjiblaedjes',
-'brokenredirectstext' => "Les redjiblaedjes shuvants evoyèt so ene pådje ki n' egzistêye nén.",
+'brokenredirectstext' => "Les redjiblaedjes shuvants evoyèt so ene pådje ki n' egzistêye nén:",
 'brokenredirects-edit' => 'candjî',
 'brokenredirects-delete' => 'disfacer',
 
+'withoutinterwiki' => 'Pådjes sins loyéns eterwiki',
+'withoutinterwiki-summary' => "Les pådjes shuvantes n' ont nén des loyéns viè ds ôtes lingaedjes.",
+'withoutinterwiki-legend' => 'Betchete',
+'withoutinterwiki-submit' => 'Vey',
+
+'fewestrevisions' => "Årtikes k' on n' î a waire bodjî",
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|octet|octets}}',
 'ncategories' => '$1 {{PLURAL:$1|categoreye|categoreyes}}',
@@ -893,17 +1312,21 @@ ou co po les sons
 'nmembers' => '$1 {{PLURAL:$1|mimbe|mimbes}}',
 'nrevisions' => '$1 {{PLURAL:$1|modêye|modêyes}}',
 'nviews' => 'léjhowe $1 {{PLURAL:$1|côp|côps}}',
+'nimagelinks' => 'Eployî so $1 pådje{{PLURAL:$1||s}}',
+'ntransclusions' => 'eployî so $1 pådje{{PLURAL:$1||s}}',
 'specialpage-empty' => 'Cisse pådje cial est vude.',
 'lonelypages' => 'Pådjes ôrfulinnes',
 'uncategorizedpages' => 'Pådjes sins nole categoreye',
 'uncategorizedcategories' => 'Categoreyes nén categorijheyes',
-'uncategorizedimages' => 'Imådjes nén categorijheyes',
+'uncategorizedimages' => 'Fitchîs nén categorijhîs',
 'uncategorizedtemplates' => 'Modele nén categorijhî',
 'unusedcategories' => 'Categoreyes nén eployeyes',
 'unusedimages' => 'Imådjes nén eployeyes',
 'popularpages' => 'Pådjes les pus léjhowes',
 'wantedcategories' => 'Categoreyes les pus rcwerowes',
 'wantedpages' => 'Pådjes les pus rcwerowes',
+'wantedfiles' => 'Fitchîs les pus rcwerous',
+'wantedtemplates' => 'Modeles ricwerous',
 'mostlinked' => 'Pådjes les pus loyeyes',
 'mostlinkedcategories' => 'Categoreyes les pus loyeyes',
 'mostlinkedtemplates' => 'Modeles les pus eployîs',
@@ -914,33 +1337,50 @@ ou co po les sons
 'shortpages' => 'Coûtès pådjes',
 'longpages' => 'Longowès pådjes',
 'deadendpages' => 'Pådjes sins nou loyén wiki',
+'deadendpagestext' => "Les pådjes shuvantes n' ont nou loyén viè ds ôtès pådjes di {{SITENAME}}.",
 'protectedpages' => 'Pådjes protedjeyes',
+'protectedpages-indef' => "Seulmint les protedjaedje disk' a todi",
+'protectedpages-cascade' => 'Seulmint les protedjaedjes e cascåde',
+'protectedpagestext' => "Les pådjes shuvantes sont protedjeyes siconte li displaeçaedje ou l' candjmint do tecse",
+'protectedpagesempty' => 'I gn a pol moumint nole pådje sifwaitmint protedjeye.',
+'protectedtitles' => 'Tites protedjîs',
+'protectedtitlestext' => "Les tites shuvants sont protedjîs, ça fwait k' on n' pout nén ahiver ene pådje lomêye inla.",
+'protectedtitlesempty' => 'I gn a pol moumint nou tite sifwaitmint protedjî.',
 'listusers' => 'Djivêye des uzeus',
+'usereditcount' => '$1 candjmint{{PLURAL:$1||s}}',
+'usercreated' => '{{GENDER:$3|Edjîstré|Edjîstrêye}} li $1 a $2',
 'newpages' => 'Novelès pådjes',
+'newpages-username' => "No d' elodjaedje:",
 'ancientpages' => 'Viyès pådjes',
 'move' => 'Displaecî',
 'movethispage' => 'Displaecî cisse pådje',
-'unusedimagestext' => "Notez tot l' minme ki d' ôtès waibes polèt aveur des loyéns viè ces imådjes la gråcès a ene direke hårdêye. Do côp, ces imådjes aparexhèt chal, mågré k' ele soeyexhe eployeyes.",
+'unusedimagestext' => "Les fitchîs shuvants egzistèt mins n' sont håynés dins nole pādje.
+Notez tot l' minme ki d' ôtès waibes polèt aveur des loyéns viè ces imådjes la gråcès a ene direke hårdêye; do côp, ces imådjes aparexhèt chal, mågré k' ele soeyexhe eployeyes.",
 'unusedcategoriestext' => "Les pådjes di categoreye shuvantes egzistént, mins i n' a nol årtike ni categoreye å dvins.",
-'pager-newer-n' => '{{PLURAL:$1|pus novea 1|pus noveas $1}}',
-'pager-older-n' => '{{PLURAL:$1|pus vî 1|pus vîs $1}}',
+'pager-newer-n' => '{{PLURAL:$1|$1 pus novea|$1 pus noveas}}',
+'pager-older-n' => '{{PLURAL:$1|$1 pus vî|$1 pus vîs}}',
 
 # Book sources
 'booksources' => 'Sourdants po les lives',
+'booksources-search-legend' => 'Cweri des sourdants po des lives',
+'booksources-go' => 'I va',
 
 # Special:Log
-'specialloguserlabel' => 'Uzeu:',
-'speciallogtitlelabel' => 'Tite:',
+'specialloguserlabel' => 'Fwait pa:',
+'speciallogtitlelabel' => 'Såme (tite ou uzeu):',
 'log' => 'Djournås',
-'alllogstext' => "Håynaedje etercroejhlé des djournås d' eberwetaedje, disfaçaedje, protedjaedje, blocaedje eyet manaedjeus.
-Vos ploz limiter l' håynaedje tot tchoezixhant ene sôre di djournå, on no d' uzeu, ou l' tite d' ene pådje.",
+'all-logs-page' => 'Tos les djournås publiks',
+'alllogstext' => "Håynaedje etercroejhlé di tos les djournås disponibes so {{SITENAME}}.<br />
+Vos ploz defini l' håynaedje tot tchoezixhant ene sôre di djournå, on no d' uzeu, ou l' tite d' ene pådje (po ces deus dierins l' sitinme fwait l' diferince inte les grandes et les ptitès letes).",
 'logempty' => "Rén n' corespond dins l' djournå.",
+'log-title-wildcard' => "Cweri emey les tites ki cmincèt avou ç' tecse la",
 
 # Special:AllPages
 'allpages' => 'Totes les pådjes',
 'alphaindexline' => 'di $1 a $2',
 'nextpage' => 'Pådje shuvante ($1)',
 'allpagesfrom' => 'Håyner les pådjes a pårti di:',
+'allpagesto' => "Håyner les pådjes disk' a:",
 'allarticles' => 'Tos les årtikes',
 'allinnamespace' => 'Totes les pådjes (espåce di lomaedje $1)',
 'allnotinnamespace' => "Totes les pådjes (foû d' l' espåce di lomaedje $1)",
@@ -952,41 +1392,69 @@ Vos ploz limiter l' håynaedje tot tchoezixhant ene sôre di djournå, on no d'
 
 # Special:Categories
 'categories' => 'Categoreyes',
-'categoriespagetext' => 'I gn a les categoreyes shuvantes sol wiki.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => '{{PLURAL:$1|Li categoreye shuvante est eployeye|Les categoreyes shuvantes sont-st eployeyes}} pa des pådjes ou des fitchîs.
+[[Special:UnusedCategories|Les categoreyes nén eployeyes]] èn sont nén håynêyes chal.
+Loukîz eto [[Special:WantedCategories|les categoreyes dimandêyes]].',
+'categoriesfrom' => 'Håyner les categoreyes a pårti di:',
+'special-categories-sort-count' => 'relére pa nombe di cayets',
+'special-categories-sort-abc' => 'relére alfabeticmint',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Contribouwaedjes disfacés',
+'deletedcontributions-title' => 'Contribouwaedjes disfacés',
+'sp-deletedcontributions-contribs' => 'contribouwaedjes',
+
+# Special:LinkSearch
+'linksearch' => 'Cweri des dfoûtrinnès hårdêyes',
+'linksearch-pat' => 'Patron pol cweraedje:',
+'linksearch-ns' => 'Espåce di lomaedje:',
+'linksearch-ok' => 'Cweri',
+'linksearch-text' => 'Des caracteres «djokers» polèt esse eployîs, metans «*.wikipedia.org».
+Mins i fåt pol moens on dominne di prumî livea, metans «*.org»<br />
+Protocoles ricnoxhous: <tt>$1</tt> (nelzès metoz nén dins vosse tchinne di cweraedje).',
+'linksearch-line' => "$1 est loyî a pårti d' $2",
+'linksearch-error' => "Les caracteres djokers èn polèt esse eployîs k' a l' atake d' on no d' dominne ou d' lodjoe.",
+
+# Special:ListUsers
+'listusersfrom' => 'Håyner les uzeus a pårti di:',
+'listusers-submit' => 'Vey',
+'listusers-noresult' => 'Nol uzeu di trové.',
+'listusers-blocked' => '({{GENDER:$1|bloké|blokêye}})',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Djournå des noveas uzeus',
 'newuserlogpagetext' => "Chal pa dzo c' est ene djivêye des uzeus novelmint eredjîstrés.",
 
+# Special:ListGroupRights
+'listgrouprights-members' => '(djivêye des mimbes)',
+
 # E-mail user
 'mailnologin' => "Nole adresse d' evoyeu",
 'mailnologintext' => "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].",
 'emailuser' => "Emiler a l' uzeu",
 'emailpage' => 'Emilaedje a èn uzeu',
-'emailpagetext' => "Si cist uzeu chal a dné ene adresse emile valide dins
-ses preferinces, vos lyi ploz evoyî èn emile a pårti di cisse pådje chal.
-L' adresse emile k' i gn a dins vos preferinces serè-st eployeye
+'emailpagetext' => "Vos ploz eployî l' formulrece chal pa dzo po-z evoyî èn emile a l' uzeu.
+L' adresse emile k' i gn a dins [[Special:Preferences|vos preferinces]] serè-st eployeye
 come adresse di l' evoyeu (adresse «From:» di l' emile),
 po ki l' riçuveu poye risponde.",
 'usermailererror' => "Åk n' a nén stî tot voyant l' emile:",
-'defemailsubject' => 'Emile da {{SITENAME}}',
+'defemailsubject' => "Emile da l' uzeu «$1» so {{SITENAME}}",
 'noemailtitle' => "Pont d' adresse emile",
-'noemailtext' => "Cist uzeu chal n' a nén dné d' adresse emile
-valide, ou n' vout nén rçure des emiles des ôtes uzeus.
-Do côp, c' est nén possibe di lyi evoyî èn emile.",
-'emailfrom' => 'Di',
+'noemailtext' => "Cist uzeu chal n' a nén dné d' adresse emile valide.",
+'emailfrom' => 'Di:',
 'emailto' => 'Po:',
-'emailsubject' => 'Sudjet',
-'emailmessage' => 'Messaedje',
+'emailsubject' => 'Sudjet:',
+'emailmessage' => 'Messaedje:',
 'emailsend' => 'Evoyî',
+'emailccme' => "M' emiler ene copeye do messaedje",
+'emailccsubject' => 'Copeyee di vosse messaedje a $1: $2',
 'emailsent' => 'Emile evoyî',
 'emailsenttext' => 'Vost emilaedje a stî evoyî comifåt.',
 
 # Watchlist
 'watchlist' => 'Pådjes shuvowes',
 'mywatchlist' => 'Pådjes shuvowes',
+'watchlistfor2' => 'Pa $1 ($2)',
 'nowatchlist' => 'Vosse djivêye des pådjes a shuve est vude.',
 'watchlistanontext' => 'I vs fåt $1 po vey ou candjî les cayets di vosse djivêye des shuvous.',
 'watchnologin' => "Vos n' estoz nén elodjî",
@@ -1004,15 +1472,16 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'unwatchthispage' => 'Èn pus shuve li pådje',
 'notanarticle' => 'Nén èn årtike',
 'watchnochange' => "Nole des pådjes di vosse djivêye di pådjes a shuve n' a stî candjeye dins l' termene di tins dmandêye.",
-'watchlist-details' => '{{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).',
+'watchlist-details' => 'Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).',
 'wlheader-enotif' => '* Li notifiaedje pa emile est en alaedje.',
 'wlheader-showupdated' => "* Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e '''cråssès letes'''",
 'watchmethod-recent' => "Cwerant après les pådjes k' ont stî candjeyes dierinnmint ki sont eto des pådjes shuvowes",
 'watchmethod-list' => "Cwerant après les pådjes shuvowes k' ont stî candjeyes dierinnmint",
 'watchlistcontains' => 'I gn a {{PLURAL:$1|$1 pådje|$1 pådjes}} e vosse djivêye des pådjes a shuve.',
 'iteminvalidname' => "Åk n' a nén stî avou «$1», li no n' est nén valide...",
-'wlnote' => 'Chal pa dzo les $1 dierins candjmints des <b>$2</b> dierinnès eures.',
-'wlshowlast' => 'Mostrer les dierin(nè)s $1 eures, $2 djoûs $3',
+'wlnote' => "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.",
+'wlshowlast' => 'Mostrer les dierin(nè)s $1 eures, $2 djoûs ou $3',
+'watchlist-options' => 'Tchuzes del djivêye des shuvous',
 
 'enotif_mailer' => 'Notifiaedje pa emile di {{SITENAME}}',
 'enotif_reset' => 'Mårker totes les pådjes come vizitêyes',
@@ -1023,7 +1492,8 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 'enotif_lastvisited' => 'Loukîz $1 po tos les candjmints dispoy vosse dierinne vizite.',
 'enotif_body' => 'Binamé $WATCHINGUSERNAME,
 
-Li pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED li $PAGEEDITDATE pa $PAGEEDITOR, loukîz $PAGETITLE_URL pol modêye do moumint.
+Li pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED li $PAGEEDITDATE pa $PAGEEDITOR,
+loukîz $PAGETITLE_URL pol modêye do moumint.
 
 $NEWPAGE
 
@@ -1033,17 +1503,24 @@ Contak do candjeu:
 emile: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-I n\' årè nén d\' ôtes notifiaedjes po ds ôtes candjmints di ç\' minme pådje ci tant k\' vos n\' l\' åroz nén vizitêye. Vos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.
+I n\' årè nén d\' ôtes notifiaedjes po ds ôtes candjmints di ç\' minme pådje ci tant k\' vos n\' l\' åroz nén vizitêye.
+Vos ploz eto rimete a noû les drapeas di notifiaedje po totes les pådjes di vosse djivêye des pådjes a shuve.
 
 
-         Vosse binamé sistinme di notifiaedje so {{SITENAME}}
+Vosse binamé sistinme di notifiaedje so {{SITENAME}}
 
 --
+Po candjî l\' apontiaedje di vos notifiaedjes pa emile, loukîz
+{{canonicalurl:{{#special:Preferences}}}}
+
 Po candjî l\' apontiaedje di vosse djivêye a shuve, loukîz
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
+Po rsaetchî l\' pådje di vosse djivêye a shuve, alez so
+$UNWATCHURL
+
 Po pus d\' aidance:
-{{canonicalurl:{{ns:help}}:Aidance}}',
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
 'deletepage' => "Disfacer l' pådje",
@@ -1052,13 +1529,15 @@ Po pus d\' aidance:
 'excontentauthor' => "li contnou esteut: «$1» (eyet l' seu contribouweu esteut «$2»)",
 'exbeforeblank' => "li contnou dvant l' disfaçaedje esteut: «$1»",
 'exblank' => 'li pådje esteut vude',
-'historywarning' => 'Asteme: Li pådje ki vos alez disfacer a-st ene istwere:',
-'confirmdeletetext' => "Vos alez disfacer po tofer del båze di dnêyes ene
-pådje ou ene imådje, avou tote si istwere.
+'delete-confirm' => 'Disfacer «$1»',
+'delete-legend' => 'Disfacer',
+'historywarning' => "'''Asteme:''' Li pådje ki vos alez disfacer a-st ene istwere avou a pô près $1 modêye{{PLURAL:$1||s}}:",
+'confirmdeletetext' => "Vos alez disfacer ene pådje avou tote si istwere.
 Acertinez s' i vs plait ki c' est bén çoula ki vos vloz fé,
 ki vos comprindoz les consecwinces, et ki vos fjhoz çoula
 tot [[{{MediaWiki:Policy-url}}|shuvant les rîles]].",
 'actioncomplete' => 'Fwait',
+'actionfailed' => "L' accion a fwait berwete",
 'deletedtext' => 'Li pådje «$1» a stî disfacêye. Loukîz li $2 po ene
 djivêye des dierins disfaçaedjes.',
 'dellogpage' => 'Djournå des disfaçaedjes',
@@ -1066,54 +1545,98 @@ djivêye des dierins disfaçaedjes.',
 'deletionlog' => 'djournå des disfaçaedjes',
 'reverted' => 'Rimetou ene modêye di dvant',
 'deletecomment' => 'Råjhon:',
+'deleteotherreason' => 'Ene råjhon diferinne ou di pus:',
+'deletereasonotherlist' => 'Ôte råjhon',
+'deletereason-dropdown' => "* Råjhons les pus corantes po disfacer
+** Dimande di l' oteur
+** Violåcion d' abondroets
+** Vandalisse",
+'delete-edit-reasonlist' => 'Candjî les råjhons do disfaçaedje',
+'delete-toobig' => "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.
+Li disfaçaedje des sfwaitès pådjes a stî dismetou po-z espaitchî k' i gn åye des problinmes so {{SITENAME}}.",
+'delete-warning-toobig' => "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.
+Si disfaçaedje pôreut fé des problinmes avou l' rotaedje del båze di dnêyes so {{SITENAME}}; 
+nel fijhoz k' avou asteme.",
 
 # Rollback
+'rollbacklink' => 'netyî',
 'cantrollback' => "Dji n' sai disfé les candjmints; li dierin contribouweu est li seu oteur po cist årtike ci.",
 'alreadyrolled' => "Dji n' sai disfé li dierin candjmint di [[$1]] fwait pa [[User:$2|$2]] ([[User talk:$2|Copene]]);
 ene sakî d' ôte a ddja candjî l' årtike ou ddja rmetou l' modêye di dvant.
 
 Li dierin candjmint a stî fwait pa [[User:$3|$3]] ([[User talk:$3|Copene]]).",
-'editcomment' => "Li comintaire do candjmint esteut: «''$1''».",
-'revertpage' => 'Disfwait li candjmint da [[Special:Contributions/$2|$2]] ([[User talk:$2|copene]]); li dierin candjmint est asteure da [[User:$1|$1]]',
+'editcomment' => "Li rascourti do candjmint esteut: «''$1''».",
+'revertpage' => 'Disfwait les candjmints da [[Special:Contributions/$2|$2]] ([[User talk:$2|copene]]); li dierin candjmint est asteure da [[User:$1|$1]]',
 
 # Protect
 'protectlogpage' => 'Djournå des protedjaedjes',
-'protectlogtext' => "Chal pa dzo c' est ene djivêye des protedjaedjes et disprotedjaedjes des pådjes.",
+'protectlogtext' => "Chal pa dzo c' est ene djivêye des protedjaedjes et disprotedjaedjes des pådjes.
+Loukîz al [[Special:ProtectedPages|djivêye des pådjes protedjeyes]] po vey les protedjaedjes ki sont en alaedje pol moumint.",
 'protectedarticle' => '«[[$1]]» protedjî',
-'unprotectedarticle' => '«[[$1]]» disprotedjî',
+'modifiedarticleprotection' => "a candjî l' livea d' protedjaedje di «[[$1]]»",
+'unprotectedarticle' => 'a disprotedjî «[[$1]]»',
+'movedarticleprotection' => 'a displaecî les parametes di protedjaedje di «[[$1]]» eviè «[[$2]]»',
 'protect-title' => 'Protedjant «$1»',
+'protect-title-notallowed' => "Livea d' protedjaedje di «$1»",
 'prot_1movedto2' => '[[$1]] displaecî viè [[$2]]',
+'protect-badnamespace-title' => 'Espåce di lomaedjé nén protedjåve',
+'protect-badnamespace-text' => "Les pådjes e cist espåce di lomaedje ci n' polèt nén esse protedjeyes.",
 'protect-legend' => "Acertinez l' protedjaedje",
 'protectcomment' => 'Råjhon:',
+'protectexpiry' => 'Termene:',
+'protect-unchain-permissions' => "Disclawer d' ôtès tchuzes di protedjaedje",
 'protect-text' => "Vos ploz droci vey eyet candjî l' livea d' protedjaedje pol pådje '''$1'''.",
-'protect-default' => '(prémetou)',
-'protect-level-autoconfirmed' => 'Bloker les uzeus nén eredjîstrés',
+'protect-default' => 'Permete a tos les uzeus',
+'protect-level-autoconfirmed' => 'Bloker les noveas uzeus et les cis nén edjîstrés',
 'protect-level-sysop' => 'Seulmint les manaedjeus',
-'protect-expiry-options' => '2 eures:2 hours,1 djoû:1 day,1 samwinne:1 week,2 samwinnes:2 weeks,1 moes:1 month,3 moes:3 months,6 moes:6 months,1 anêye:1 year,po todi:infinite',
+'protect-summary-cascade' => 'e cascåde',
+'protect-expiring' => 'finixh li $1 (UTC)',
+'protect-expiring-local' => 'finixh li $1',
+'protect-expiry-indefinite' => 'po todi',
+'protect-cascade' => 'Protedjî eto les modeles eployîs so cisse pådje ci (protedjaedje e cascåde)',
+'protect-othertime' => 'Date di fén:',
+'protect-othertime-op' => 'ôte (a vos del diner)',
+'protect-existing-expiry' => 'Li protedjaedje finixh li $2 a $3',
+'protect-otherreason' => 'Ene råjhon diferinne ou di pus:',
+'protect-otherreason-op' => 'Ôte råjhon',
+'protect-expiry-options' => '1 eure:1 hour,1 djoû:1 day,1 samwinne:1 week,2 samwinnes:2 weeks,1 moes:1 month,3 moes:3 months,6 moes:6 months,1 anêye:1 year,po todi:infinite',
+'restriction-type' => 'Permission po:',
+'restriction-level' => "Livea d' protedjaedje:",
+'minimum-size' => 'Grandeu minimom',
+'maximum-size' => 'Grandeu macsimom:',
 'pagesize' => '(octets)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'Candjî',
-'restriction-move' => 'Displaecî',
+'restriction-edit' => 'candjî',
+'restriction-move' => 'displaecî',
+'restriction-create' => 'ahiver',
+'restriction-upload' => 'eberweter',
+
+# Restriction levels
+'restriction-level-sysop' => 'protedjaedje complet',
+'restriction-level-autoconfirmed' => 'dimey-protedjaedje',
+'restriction-level-all' => 'tos les liveas',
 
 # Undelete
 'undelete' => 'Rapexhî des disfacêyès pådjes',
 'undeletepage' => 'Vey et rapexhî des disfacêyès pådjes',
 'viewdeletedpage' => 'Vey les disfacêyès pådjes',
-'undeletepagetext' => 'Les pådjes shuvantes ont stî disfacêyes mins ele sont co ezès årtchives, do côp ele polèt esse rapexheyes.',
-'undeleteextrahelp' => "Po rapexhî l' pådje etire, leyîz vudes totes les boesses a clitchî eyet clitchîz sol boton «'''Rapexhî'''». Po rapexhî seulmint des modêyes k' i gn a, tchoezixhoz les cenes ki vos vloz avou les boesses a clitchî, eyet poy clitchîz sol boton «'''Rapexhî'''». Si vos clitchîz sol boton «'''Netyî'''», çoula neteyrè l' tchamp d' comintaire eyet totes les boesses a clitchî.",
-'undeleterevisions' => '$1 modêyes ezès årtchives',
-'undeletehistory' => "Si vos rapexhîz l' pådje, l' istwere del pådje
-serè rapexheye eto, avou totes les modêyes co ezès årtchives.
-Si ene novele pådje avou l' minme no a stî askepieye dispoy li disfaçaedje
-di cisse chal, les rapexheyès modêyes seront metowes e l' istwere mins
-c' est l' modêye do moumint, et nén l' cisse rapexheye, ki
-srè håynêye.",
+'undeletepagetext' => '{{PLURAL:$1|Li pådje shuvante a stî disfacêye mins elle est co ezès årtchives, do côp ele pout esse rapexheye|Les pådjes shuvantes ont stî disfacêyes mins ele sont co ezès årtchives, do côp ele polèt esse rapexheyes}}.
+Les årtchives polèt esse rnetieyes di tinzintins.',
+'undelete-fieldset-title' => 'Rapexhî les modêyes',
+'undeleteextrahelp' => "Po rapexhî l' istwere etire del pådje, leyîz vudes totes les boesses a clitchî eyet clitchîz sol boton «'''{{int:undeletebtn}}'''».
+Po rapexhî seulmint des modêyes k' i gn a, tchoezixhoz les cenes ki vos vloz avou les boesses a clitchî, eyet poy clitchîz sol boton «'''{{int:undeletebtn}}'''».",
+'undeleterevisions' => '$1 modêye{{PLURAL:$1||s}} ezès årtchives',
+'undeletehistory' => "Si vos rapexhîz l' pådje, tote l' istwere del pådje serè rapexheye eto.
+Si ene novele pådje avou l' minme no a stî askepieye dispoy li disfaçaedje di cisse-chal,
+les rapexheyès modêyes seront metowes e l' istwere del nouve pådje, come viyès modêyes di cisse-lale.",
 'undeletehistorynoadmin' => "Cist årtike a stî disfacé. Li råjhon do
 disfaçaedje est dnêye chal pa dzo, avou les detays des uzeus k' ont
 candjî l' pådje divant do disfaçaedje. Li tecse di ces modêyes disfacêyes
 ni pout esse veyou ki des manaedjeus.",
-'undeletebtn' => 'Rapexhî!',
+'undeletebtn' => 'Rapexhî',
+'undeletelink' => 'vey/rapexhî',
+'undeleteviewlink' => 'vey',
 'undeletereset' => 'Netyî',
 'undeletecomment' => 'Råjhon:',
 'undeletedrevisions' => '{{PLURAL:$1|1 modêye|$1 modêyes}} di rapexheyes',
@@ -1125,7 +1648,7 @@ ni pout esse veyou ki des manaedjeus.",
 Loukîz l' [[Special:Log/delete|djournå des disfaçaedjes]] po ene djivêye des dierins disfaçaedjes eyet rapexhaedjes.",
 'undelete-search-submit' => 'Cweri',
 'undelete-filename-mismatch' => 'Nén possibe di rapexhî li fitchî do $1 : on nel ritrove nén.',
-'undelete-bad-store-key' => "Nén possibe d' aler rapexhî li fitchî daté do $1 : i n' esteut nén la divant li disfaçaedje.",
+'undelete-bad-store-key' => "Nén possibe d' aler rapexhî li fitchî daté do $1: i n' esteut nén la divant li disfaçaedje.",
 'undelete-missing-filearchive' => "Nén possibe d' aler rapexhî li fitchî avou l’ ID $1 pask' i n' est nén dins l' båze di dnêyes. Motoit k' il a ddja stî rapexhî dvant.",
 
 # Namespace form on various pages
@@ -1135,28 +1658,50 @@ Loukîz l' [[Special:Log/delete|djournå des disfaçaedjes]] po ene djivêye des
 
 # Contributions
 'contributions' => "Ovraedjes di l' uzeu",
+'contributions-title' => "Djivêye des ovraedjes di l' {{GENDER:$1|uzeu|uzeuse}} $1",
 'mycontris' => 'Mi ovraedje',
 'contribsub2' => "Po l' uzeu $1 ($2)",
 'nocontribs' => "Nou candjmint di trové ki corespondreut a ç' critere la.",
+'uctop' => '(dierinne)',
 'month' => "dispu l' moes (et pus timpe)",
-
-'sp-contributions-talk' => 'Copiner',
-'sp-contributions-userrights' => 'Manaedjî les liveas des uzeus',
+'year' => "Dispu l' anêye (et pus timpe):",
+
+'sp-contributions-newbies' => 'Mostrer seulmint les contribouwaedjes des noveas contes',
+'sp-contributions-newbies-sub' => 'Emey les noveas uzeus',
+'sp-contributions-newbies-title' => 'Contribouwaedjes des noveas uzeus',
+'sp-contributions-blocklog' => 'djournå des blocaedjes',
+'sp-contributions-deleted' => 'contribouwaedjes disfacés',
+'sp-contributions-uploads' => 'eberwetaedjes',
+'sp-contributions-logs' => 'djournås',
+'sp-contributions-talk' => 'copiner',
+'sp-contributions-userrights' => 'droets',
+'sp-contributions-blocked-notice' => '{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}} pol moumint.
+Li dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:',
+'sp-contributions-blocked-notice-anon' => 'Ciste adresse IP est blokêye pol moumint.
+Li dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:',
+'sp-contributions-search' => 'Cweri les contribouwaedjes',
+'sp-contributions-username' => "Adresse IP ou no d' uzeu:",
 'sp-contributions-submit' => 'Cweri',
 
 # What links here
 'whatlinkshere' => 'Pådjes ki loynut chal',
-'whatlinkshere-title' => 'Pådjes ki loynut aviè « $1 »',
-'linkshere' => 'Les pådjes ki shuvèt ont des loyéns viè cisse ci:',
-'nolinkshere' => 'Nole pådje avou des loyéns viè cisse ci.',
+'whatlinkshere-title' => 'Pådjes ki loynut aviè «$1»',
+'whatlinkshere-page' => 'Pådje:',
+'linkshere' => "Les pådjes ki shuvèt ont des loyéns viè '''[[:$1]]''':",
+'nolinkshere' => "Nole pådje avou des loyéns viè '''[[:$1]]'''.",
 'isredirect' => 'pådje di redjiblaedje',
+'isimage' => "loyén viè l' fitchî",
+'whatlinkshere-prev' => '{{PLURAL:$1|di dvant|$1 di dvant}}',
+'whatlinkshere-next' => '{{PLURAL:$1|shuvant|$1 shuvants}}',
 'whatlinkshere-links' => '← loyaedjes',
-'whatlinkshere-hideredirs' => '$1 ridjiblaedjes',
-'whatlinkshere-hidelinks' => '$1 loyaedjes',
+'whatlinkshere-hideredirs' => '$1 les rdjiblaedjes',
+'whatlinkshere-hidetrans' => '$1 les inclusions',
+'whatlinkshere-hidelinks' => '$1 les loyaedjes',
 'whatlinkshere-hideimages' => "$1 fitchîs k' eploynut cist imådje ci",
-'whatlinkshere-filters' => 'Passettes',
+'whatlinkshere-filters' => 'Passetes',
 
 # Block/unblock
+'autoblockid' => 'Blocaedje otomatike #$1',
 'blockip' => 'Bloker èn uzeu',
 'blockiptext' => "Rimplixhoz les tchamps chal pa dzo po bloker
 l' accès e scrijhaedje d' èn uzeu dné ou a pårt d' ene
@@ -1174,24 +1719,41 @@ stî vandalijheyes).",
 'ipbotheroption' => 'ôte',
 'badipaddress' => "Nol uzeu avou ç' no la, ou adresse IP nén valide",
 'blockipsuccesssub' => 'Li blocaedje a stî comifåt',
-'blockipsuccesstext' => '«[[Special:Contributions/$1|$1]]» a stî bloké.<br />Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po candjî on blocaedje.',
+'blockipsuccesstext' => '«[[Special:Contributions/$1|$1]]» a stî {{GENDER:$1|bloké|blokêye}}.<br />
+Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po verifyî les blocaedjes.',
 'unblockip' => 'Disbloker èn uzeu',
 'unblockiptext' => "Rimplixhoz les tchamps chal pa dzo po ridner accès e scrijhaedje a èn uzeu ou adresse IP k' estént blokés.",
-'ipusubmit' => 'Disbloker ciste adresse ci',
+'ipusubmit' => "Rissaetchî l' blocaedje",
 'unblocked' => '«[[User:$1|$1]]» a stî disbloké',
-'ipblocklist' => "Djivêye d' adresses IP et di nos d' uzeus ki sont blokés",
+'unblocked-range' => '$1 a stî disbloké',
+'unblocked-id' => 'Li blocaedje $1 a stî rsaetchî',
+'blocklist' => 'Uzeus blokés',
+'ipblocklist' => 'Uzeus blokés',
+'ipblocklist-legend' => 'Cweri après èn uzeu bloké',
+'blocklist-userblocks' => 'Catchî les blocaedjes des contes',
+'blocklist-tempblocks' => 'Catchî les blocaedjes timporaires',
+'blocklist-addressblocks' => "Catchî les blocaedjes d' ene seule adresse IP",
+'blocklist-rangeblocks' => 'Catchî les blocaedjes di fortchetes',
+'blocklist-timestamp' => 'Date et eure',
+'blocklist-target' => 'Såme',
 'blocklist-reason' => 'Råjhon',
 'ipblocklist-submit' => 'Cweri',
+'ipblocklist-localblock' => 'Blocaedje locå',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Ôte blocaedje|Ôtes blocaedjes}}',
 'infiniteblock' => 'po todi',
-'expiringblock' => "disk' å $1 $2",
+'expiringblock' => "disk' å $1 $2",
 'blocklink' => 'bloker',
 'unblocklink' => 'disbloker',
+'change-blocklink' => "candjî l' blocaedje",
 'contribslink' => 'contribouwaedjes',
+'emaillink' => 'evoyî èn emile',
 'autoblocker' => "Bloké otomaticmint paski vos eployîz li minme adresse IP ki «[[User:$1|$1]]». Råjhon do blocaedje «'''$2'''».",
 'blocklogpage' => 'Djournå des blocaedjes',
-'blocklogentry' => '«[[$1]]» a stî bloké po ene termene di $2',
-'blocklogtext' => "Çouchal, c' est on djournå des blocaedjes eyet disblocaedjes d' uzeus. Les adresses IP blokêyes otomaticmint èn sont nén håynêyes. Loukîz li [[Special:BlockList|djivêye des adresses IP blokêyes]] po vey les blocaedjes d' adresses IP do moumint.",
-'unblocklogentry' => '«$1» a stî disbloké',
+'blocklogentry' => 'a bloké «[[$1]]» po ene termene di $2 $3',
+'blocklogtext' => "Çouchal, c' est on djournå des blocaedjes eyet disblocaedjes d' uzeus.
+Les adresses IP blokêyes otomaticmint èn sont nén håynêyes.
+Loukîz li [[Special:BlockList|djivêye des blocaedjes]] po vey les blocaedjes èn alaedje pol moumint.",
+'unblocklogentry' => 'a disbloké «$1»',
 'range_block_disabled' => "Li possibilité po les manaedjeus di bloker des fortchetes d' adresses IP a stî dismetowe.",
 'ipb_expiry_invalid' => 'Tins di blocaedje nén valide.',
 'ip_range_invalid' => "Fortchete d' adresses IP nén valide.",
@@ -1201,16 +1763,24 @@ stî vandalijheyes).",
 'sorbsreason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL.",
 'sorbs_create_account_reason' => "Voste adresse IP si trove dins l' djivêye des procsis å lådje di DNSBL. Vos n' poloz nén ahiver on conte d' uzeu.",
 
+# Developer tools
+'lockdb' => 'Aclawaedje del båze di dnêyes',
+'lockdbsuccesssub' => "L' aclawaedje del båze di dnêyes a stî comifåt",
+'lockdbsuccesstext' => 'Li båze di dnêyes a stî aclawêye.<br />
+Ni rovyîz nén del [[Special:UnlockDB|disserer]] cwand vos åroz tot fwait avou voste etertinaedje.',
+'lockedbyandtime' => '(pa $1 li $2 a $3)',
+
 # Move page
 'move-page' => 'Rilomer $1',
 'move-page-legend' => "Displaecî l' pådje",
-'movepagetext' => "Chal vos ploz candjî l' no d' ene pådje, dj' ô bén displaecî l' pådje, eyet si istwere, viè l' novea no.
+'movepagetext' => "Chal vos ploz candjî l' no d' ene pådje, dj' ô bén displaecî l' pådje, eyet si istwere, eviè l' novea no.
 Li vî tite divénrè-st ene pådje di redjiblaedje viè l' novele.
-Les loyéns viè l' viye pådje èn seront nén candjîs; acertinez vs di verifyî s' i n' a nén des dobes ou crons redjiblaedjes.
+Vos ploz mete otomaticmint a djoû les redjiblaedje k' evoyént sol vî tite.
+Si vos nel vloz nén fé, acertinez vs di verifyî s' i n' a nén des [[Special:DoubleRedirects|dobes]] ou [[Special:BrokenRedirects|crons redjiblaedjes]].
 Vos estoz responsåve di fé çou k' i fåt po k' les loyéns continouwexhe di moenner la k' i fåt.
 
 Notez k' el pådje èn serè '''nén''' displaeceye s' i gn a ddja ene pådje avou l' novea tite, a moens k' ele soeye vude, ou ene pådje di redjiblaedje, et k' ele n' åye nole istwere.
-Çoula vout dire ki vos ploz ri-displaecî ene pådje viè l' no k' ele aveut djusse divant, et insi disfé vosse prumî displaeçaedje, å cas ou vos vs rindrîz conte ki vos avoz fwait ene flotche;
+Çoula vout dire ki vos ploz ridisplaecî ene pådje viè l' no k' ele aveut djusse divant, et insi disfé vosse prumî displaeçaedje, å cas ou vos vs rindrîz conte ki vos avoz fwait ene flotche;
 ey eto ki vos n' poloz nén spotchî par accidint ene pådje k' egzistêye dedja.
 
 '''ASTEME!'''
@@ -1237,7 +1807,7 @@ Tchoezixhoz è èn ôte s' i vs plait.",
 'talkexists' => "'''Li pådje leye minme a stî displaeceye comifåt, mins nén li pådje di copene, ca i gn aveut ddja ene pådje di copene k' egzistéve al novele plaece. I vs fårè copyî l' tecse del pådje di copene al mwin.'''",
 'movedto' => 'displaecî viè',
 'movetalk' => 'Displaecî li pådje di copene avou, si ça astchait.',
-'movelogpage' => 'Djournå des displaçaedjes',
+'movelogpage' => 'Djournå des displaeçaedjes',
 'movelogpagetext' => "Chal pa dzo c' est ene djivêye des pådjes k' on stî displaceyes.",
 'movereason' => 'Råjhon:',
 'revertmove' => 'disfé',
@@ -1246,9 +1816,9 @@ Tchoezixhoz è èn ôte s' i vs plait.",
 
 L' årtike såme «[[:$1]]» egzistêye dedja. El voloz vs disfacer po vs permete di displaecî l' ôte?",
 'delete_and_move_confirm' => "Oyi, disfacer l' pådje",
-'delete_and_move_reason' => 'Disfacé po permete on displaeçaedje',
+'delete_and_move_reason' => 'Disfacé po permete li displaeçaedje di «[[$1]]»',
 'selfmove' => 'Les tites sourdant et såme sont les minmes; ene pådje ni pout nén esse displaeceye so leye minme.',
-'fix-double-redirects' => "Rapontyî les rdjiblaedjes ki loynut aviè l' mwaisse tite",
+'fix-double-redirects' => "Rapontyî eto les rdjiblaedjes ki loynut aviè l' mwaisse tite",
 
 # Export
 'export' => 'Ricopyî des pådjes foû',
@@ -1268,8 +1838,18 @@ Dins ç' dierin cas, vos ploz eto eployî ene hårdêye, eg: [[{{#Special:Export
 'allmessagesname' => 'No del variåve',
 'allmessagesdefault' => 'Tecse prémetou',
 'allmessagescurrent' => 'Tecse pol moumint',
-'allmessagestext' => "Çouchal est ene djivêye di tos les messaedjes k' i gn a dins l' espåce di lomaedje ''MediaWiki:''",
+'allmessagestext' => "Çouchal est ene djivêye des messaedjes sistinme k' i gn a dins l' espåce di lomaedje ''MediaWiki:''.
+Loukîz les pådjes sol [//www.mediawiki.org/wiki/Localisation Locålijhaedje di MediaWiki] et 
+[//translatewiki.net/ translatewiki.net] si vos vloz pårticiper avou l' ratournaeje djenerike di MediaWiki.",
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:AllMessages''' n' est nén sopoirté paski '''\$wgUseDatabaseMessages''' est dismetou.",
+'allmessages-filter-legend' => 'Passete',
+'allmessages-filter' => "Sorlon l' estat d' candjaedje:",
+'allmessages-filter-unmodified' => 'Nén candjîs',
+'allmessages-filter-all' => 'Totafwait',
+'allmessages-filter-modified' => 'Candjîs',
+'allmessages-prefix' => "Sorlon l' betchete:",
+'allmessages-language' => 'Lingaedje:',
+'allmessages-filter-submit' => 'Apliker',
 
 # Thumbnails
 'thumbnail-more' => 'Ragrandi',
@@ -1285,16 +1865,26 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
 'import-interwiki-history' => "Ristitchî avou l' istwere di totes les modêyes",
 'import-interwiki-submit' => 'Ristitchî',
 'import-comment' => 'Comintaire:',
-'importtext' => "S' vs plait ricopyîz l' fitchî foû do sourdant wiki avou l' usteye di rcopiaedje foû (Special:Export), el schaper so voste éndjole, et poy l' eberweter droci.",
+'importtext' => "S' i vs plait ricopyîz l' fitchî foû do sourdant wiki avou l' [[Special:Export|usteye di rcopiaedje foû]].
+Et s' el schaper so voste éndjole, et poy li ristitchî droci.",
 'importstart' => "Dj' enonde li ristitchaedje...",
 'import-revision-count' => '{{PLURAL:$1|1 modêye|$1 modêyes}}',
 'importnopages' => 'Nole pådje a ristitchî.',
-'importfailed' => 'Li ristitchaedje a fwait berwete: $1',
+'importfailed' => 'Li ristitchaedje a fwait berwete: <nowiki>$1</nowiki>',
 'importunknownsource' => 'Sourdant nén cnoxhou pol ristitchaedje',
 'importcantopen' => "Dji n' sai drovi l' fitchî a ristitchî",
 'importbadinterwiki' => 'Cron loyén eterwiki',
 'importnotext' => "Vude ou pont d' tecse",
 'importsuccess' => 'Li ristitchaedje a stî comifåt!',
+'xml-error-string' => '$1 al roye $2, colone $3 (octet $4): $5',
+
+# Import log
+'importlogpage' => 'Djournå des ristitchaedjes',
+'importlogpagetext' => "Ristitchaedjes (import) administratifs di pådjes avou leus istorikes di candjmints, a pårti d' ôtes wikis.",
+'import-logentry-upload' => 'a ristitchî [[$1]] avou èn eberwetaedje di fitchî',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|modêye|modêyes}}',
+'import-logentry-interwiki' => "a ristitchî $1 foû d' èn ôte wiki",
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|modêye|modêyes}} foû di $2',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "Pådje d' uzeu da minne",
@@ -1309,18 +1899,23 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
 'tooltip-pt-logout' => 'Vos dislodjî',
 'tooltip-ca-talk' => 'Copene åd fwait do contnou del pådje',
 'tooltip-ca-edit' => "Vos ploz candjî cisse pådje ci. S' i vs plait, eployîz l' boton «Vey divant» po vs acertiner k' tot est comifåt dvant d' schaper vos candjmints.",
-'tooltip-ca-addsection' => 'Radjouter on comintaire a cisse copene ci.',
-'tooltip-ca-viewsource' => "Cisse pådje ci est protedjeye. Vos ploz seulmint vey li côde sourdant, mins nén l' candjî.",
+'tooltip-ca-addsection' => 'Radjouter ene novele seccion',
+'tooltip-ca-viewsource' => "Cisse pådje ci est protedjeye.
+Vos ploz seulmint vey li côde sourdant, mins nén l' candjî.",
 'tooltip-ca-history' => 'Viyès modêyes del pådje.',
 'tooltip-ca-protect' => 'Protedjî cisse pådje ci',
+'tooltip-ca-unprotect' => "Candjî l' protedjaedje del pådje",
 'tooltip-ca-delete' => 'Disfacer ci pådje ci',
 'tooltip-ca-undelete' => "Rapexhî les candjmitns fwaits al pådje divant k' ele soeyexhe disfacêye",
 'tooltip-ca-move' => 'Displaecî cisse pådje ci',
 'tooltip-ca-watch' => 'Radjouter cisse pådje ci al djivêye di vos årtikes shuvous',
 'tooltip-ca-unwatch' => 'Bodjî cisse pådje ci di vosse djivêye des årtikes shuvous',
 'tooltip-search' => 'Cweri so ci wiki chal',
+'tooltip-search-go' => 'Potchî so ene pådje avou egzactumint ci no ci, si ele egzistêye.',
+'tooltip-search-fulltext' => "Cweri les pådjes avou ç' tecse ci",
 'tooltip-p-logo' => 'Mwaisse pådje',
 'tooltip-n-mainpage' => 'Vizitez li Mwaisse pådje',
+'tooltip-n-mainpage-description' => 'Vizitez li Mwaisse pådje',
 'tooltip-n-portal' => "Åd fwait do pordjet, çou k' vos ploz fé, wice trover des sacwès",
 'tooltip-n-currentevents' => "Des infôrmåcions so des evenmints d' actouwålité",
 'tooltip-n-recentchanges' => "Li djivêye des dierins candjmints k' i gn a-st avou sol wiki.",
@@ -1334,23 +1929,29 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
 'tooltip-t-emailuser' => 'Evoyî èn emile a cist uzeu ci',
 'tooltip-t-upload' => 'Eberweter sol sierveu des imådjes ou fitchîs media',
 'tooltip-t-specialpages' => 'Djivêye di totes les pådjes sipeciåles',
+'tooltip-t-print' => 'Modêye sicrirece-amiståve del pådje',
+'tooltip-t-permalink' => 'Permanante hårdêye viè cisse modêye chal del pådje',
 'tooltip-ca-nstab-main' => 'Vey li pådje di contnou',
 'tooltip-ca-nstab-user' => "Vey li pådje di l' uzeu",
 'tooltip-ca-nstab-media' => 'Vey li pådje di media',
-'tooltip-ca-nstab-special' => "Çouchal, c' est ene pådje sipeciåle, vos n' poloz nén candjî l' pådje leyminme.",
+'tooltip-ca-nstab-special' => "Çouchal, c' est ene pådje sipeciåle, vos n' poloz nén candjî l' pådje leye-minme.",
 'tooltip-ca-nstab-project' => 'Vey li pådje di pordjet',
-'tooltip-ca-nstab-image' => "Vey li pådje d' imådje",
+'tooltip-ca-nstab-image' => 'Vey li pådje do fitchî',
 'tooltip-ca-nstab-mediawiki' => 'Vey li messaedje ratournåve do sistinme',
 'tooltip-ca-nstab-template' => 'Vey li modele',
 'tooltip-ca-nstab-help' => "Vey li pådje d' aidance",
 'tooltip-ca-nstab-category' => 'Vey li pådje di categoreye',
-'tooltip-minoredit' => "Mete çouci come on ptit candjmint d' rén do tot [alt-i]",
+'tooltip-minoredit' => "Mete çouci come on ptit candjmint d' rén do tot",
 'tooltip-save' => 'Schaper vos candjmints [alt-s]',
 'tooltip-preview' => "Prévey vos candjmints, fijhoz l' divant d' schaper s' i vs plait! [alt-p]",
 'tooltip-diff' => 'Mostrer les candjmints ki vos avoz fwait e tecse. [alt-v]',
 'tooltip-compareselectedversions' => 'Mostrer les diferinces etur les deus modêyes tchoezeyes di cisse pådje ci. [alt-v]',
 'tooltip-watch' => 'Radjouter cisse pådje ci a vosse djivêye des shuvous [alt-w]',
 'tooltip-recreate' => "Rifé cisse pådje ci mågré k' ele åye sitî disfacêye",
+'tooltip-rollback' => "Li loyén «{{int:rollbacklink}}» permete di disfé d' on seu clitch tos les candjmints(s) fwaits sol pådje på dierin uzeu.",
+'tooltip-undo' => "Li loyén «{{int:editundo}}» permete di disfé li candjmint et drouve li boesse di candjmint e môde prévoeyaedje.
+Dj' ô bén, ça permete di disfé l' candjmint et d' mete on messaedje dins l' boesse di rascourti.",
+'tooltip-summary' => 'Dinez on ptit rascourti',
 
 # Stylesheets
 'common.css' => '/* li côde CSS metou chal serè eployî pa totes les peas et tos les uzeus */',
@@ -1361,27 +1962,55 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Uzeu anonime|Uzeus anonimes}} di {{SITENAME}}',
-'siteuser' => "Uzeu d' {{SITENAME}} «$1»",
+'siteuser' => "$1, {{GENDER:$2|uzeu d'|uzeuse di}} {{SITENAME}}",
+'anonuser' => '$1, uzeu anonime di {{SITENAME}}',
 'lastmodifiedatby' => 'Cisse pådje a stî candjeye pol dierin côp li $2, $1 pa $3.',
 'othercontribs' => "Båzé so l' ovraedje da $1.",
-'others' => 'des ôtes',
-'siteusers' => "{{PLURAL:$2|uzeu|uzeus}} d' {{SITENAME}} «$1»",
+'others' => 'co ds ôtes',
+'siteusers' => "$1, {{PLURAL:$2|uzeu|uzeus}} d' {{SITENAME}}",
+'anonusers' => '$1, {{PLURAL:$2|uzeu anonime|uzeus anonimes}} di {{SITENAME}}',
 'creditspage' => 'Pådje di credits',
 'nocredits' => "I n' a pont d' infôrmåcion di credits po cisse pådje ci.",
 
+# Info page
+'pageinfo-title' => 'Infôrmåcion po «$1»',
+'pageinfo-header-watchlist' => 'Djivêye des shuvous',
+'pageinfo-header-views' => 'Vuwes',
+'pageinfo-subjectpage' => 'Pådje',
+'pageinfo-talkpage' => 'Pådje di copene',
+'pageinfo-watchers' => 'Nombe di shuveus',
+'pageinfo-edits' => 'Nombe di candjmints',
+'pageinfo-authors' => "Nombe d' oteurs diferins",
+'pageinfo-views' => 'Nombe di lijhaedjes',
+
+# Patrolling
+'markaspatrolleddiff' => 'Marké come patrouyî',
+'markaspatrolledtext' => 'Marker cisse pådje ci come dedja patrouyeye',
+
+# Patrol log
+'patrol-log-page' => 'Djournå des patrouyaedjes',
+'patrol-log-header' => "Çouchal c' est on djournå des modêyes k' ont stî patrouyeyes.",
+
 # Image deletion
 'deletedrevision' => 'Viye modêye $1 disfacêye',
+'filedelete-missing' => "Li fitchî «$1» n' pout nén esse disfacé, la k' i n' egzistêye nén.",
+'filedelete-old-unregistered' => "Li modêye do fitchî dnêye «$1» ni s' trove nén el båze di dnêyes.",
+'filedelete-current-unregistered' => "Li fitchî dné «$1» ni s' trove nén el båze di dnêyes.",
 
 # Browsing diffs
 'previousdiff' => '← Diferinces des candjmints di dvant',
 'nextdiff' => 'Diferinces des candjmints shuvants →',
 
 # Media information
-'mediawarning' => "'''Asteme''': Ci fitchî chal pôreut esse evirussé, si vos l' enondez vos pôrîz infecter l' sistinme da vosse.",
-'imagemaxsize' => "Limite pol håynaedje ezès pådjes d' imådje:",
+'mediawarning' => "'''Asteme''': Ci fitchî chal pôreut esse evirussé.
+Si vos l' enondez vos pôrîz infecter l' sistinme da vosse.",
+'imagemaxsize' => "Limite pol grandeu des imådjes:<br />''(ezès pådjes d'i discrijhaedje di fitchîs)''",
 'thumbsize' => 'Grandeu po les imådjetes (thumb):',
+'widthheightpage' => '$1 × $2, $3 pådje{{PLURAL:$3||s}}',
 'file-info-size' => '$1 × $2 picsels, groxheur do fitchî: $3, del sôre "MIME": $4',
-'show-big-image' => 'Pus grande imådje',
+'file-nohires' => "I n' a nén di pus grande finté.",
+'svg-long-desc' => 'Fitchî SVG, finté di $1 × $2 picsels, grandeu: $3',
+'show-big-image' => "Imådje a si grandeur d' oridjinne",
 
 # Special:NewFiles
 'newimages' => 'Galreye des nouvès imådjes',
@@ -1392,12 +2021,27 @@ Totes les accions di rcopiaedje eterwiki sont metowes e [[Special:Log/import|djo
 'bydate' => 'pazès dates',
 'sp-newimages-showfrom' => 'Mostrer les nouvès imådjes a pårti do $2, $1',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '$1 segonde{{PLURAL:$1||s}}',
+'minutes' => '$1 munute{{PLURAL:$1||s}}',
+'hours' => '$1 eures{{PLURAL:$1||s}}',
+'days' => '$1 djoû{{PLURAL:$1||s}}',
+'ago' => 'i gn a $1',
+
+# Bad image list
+'bad_image_list' => "Li fôrmat est l' shuvant:
+
+Seulmint les intrêyes di djivêye (dj' ô bén, les royes ki cmincèt avou ene sitoele «*») sont acontêyes.
+Li prumî loén d' ene roye doet esse on loyén viè on fitchî k' on vout bloker si eployaedje.
+Les ôtes loyéns dnés sol minme roye sont veyous come des foû-rîle, dj' ô bén les pådjes wice ki l' fitchî pout esse eployî",
+
 # Metadata
 'metadata' => 'Meta-dnêyes',
-'metadata-help' => "Ci fitchî chal a des infôrmåcions di rawete, motoit bén radjoutêyes pa l' aparey foto limerike ou l' sicanrece eployeye po fé l' imådje. Si l' imådje a stî candjeye dispoy adon, i s' pout ki sacwants detays ni corespondexhe pus totafwait.",
+'metadata-help' => "Ci fitchî chal a des infôrmåcions di rawete, motoit bén radjoutêyes pa l' aparey foto limerike ou l' sicanrece eployeye po fé l' imådje.
+Si l' imådje a stî candjeye dispoy adon, i s' pout ki sacwants detays ni corespondexhe pus totafwait.",
 'metadata-expand' => 'Mostrer les stindous detays',
 'metadata-collapse' => 'Catchî les stindous detays',
-'metadata-fields' => "Les tchamps di meta-dnêyes EXIF metous chal vont esse
+'metadata-fields' => "Les tchamps di meta-dnêyes des imådjes metous chal vont esse
 håynés ezès pådjes d' imådje cwand l' tåvlea di meta-dnêyes
 est raptiti. Les ôtes seront catchîs.
 * make
@@ -1455,6 +2099,8 @@ est raptiti. Les ôtes seront catchîs.
 'exif-gpsareainformation' => 'No del redjon GPS',
 'exif-gpsdatestamp' => 'Date do GPS',
 'exif-gpsdifferential' => 'Coridjaedje diferenciel do GPS',
+'exif-iimcategory' => 'Categoreye',
+'exif-iimsupplementalcategory' => 'Categoreyes di rawete',
 
 'exif-orientation-1' => 'Normå',
 'exif-orientation-3' => 'Tourné di 180°',
@@ -1522,7 +2168,7 @@ est raptiti. Les ôtes seront catchîs.
 
 # External editor support
 'edit-externally' => "Candjî ç' fitchî ci avou on dfoûtrin programe",
-'edit-externally-help' => "Loukîz les [//www.mediawiki.org/wiki/Manual:External_editors instruccions d' apontiaedje] po pus di racsegnes.",
+'edit-externally-help' => "(Loukîz les [//www.mediawiki.org/wiki/Manual:External_editors instruccions d' apontiaedje] po pus di racsegnes)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'totafwait',
@@ -1539,7 +2185,10 @@ tcherdjîz l' hårdêye dins l' betchteu waibe da vosse, eyet
 acertinez ki l' adresse emile est djusse tot dnant l' côde.",
 'confirmemail_send' => "Emiler on côde d' acertinaedje",
 'confirmemail_sent' => "L' emile d' acertinaedje a stî evoyî.",
-'confirmemail_sendfailed' => "Dji n' a savou evoyî l' emile d' acertinaedje. Verifyîz ki l' adresse est bén djusse.",
+'confirmemail_sendfailed' => "{{SITENAME}} n' a nén savou vs evoyî l' emile d' acertinaedje.
+Verifyîz ki l' adresse est bén djusse.
+
+Li programe d' emilaedje a rtourné: $1",
 'confirmemail_invalid' => "Côde d' acertinaedje nén valide. Motoit k' il esteut trop vî.",
 'confirmemail_needlogin' => 'I vs fåt $1 po pleur acertiner voste adresse emile.',
 'confirmemail_success' => 'Voste adresse emile a stî acertinêye. Vos vs poloz asteure elodjî eyet profiter do wiki.',
@@ -1555,15 +2204,18 @@ alez drovî avou vosse betchteu waibe li hårdêye ki shût:
 
 $3
 
-Si c' est *nén* vos k' a-st ahivé l' conte, adon èn shuvoz
-nén l' hårdêye. Ci côde d' acertinaedje ci va-st espirer
-po l' $4.",
+Si c' est *nén* vos k' a-st ahivé l' conte, adon shuvoz
+l' hårdêye shuvante po fé rnoncî l' acertinaedje d' emile:
+
+$5
+
+Ci côde d' acertinaedje ci va-st espirer po l' $4.",
 
 # Scary transclusion
 'scarytranscludetoolong' => '[Li hårdêye est pår trop longue]',
 
 # Delete conflict
-'deletedwhileediting' => 'Asteme: Cisse pådje ci a stî disfacêye sol tins ki vos scrijhîz!',
+'deletedwhileediting' => "'''Asteme''': Cisse pådje ci a stî disfacêye sol tins ki vos scrijhîz!",
 'confirmrecreate' => "L' uzeu [[User:$1|$1]] ([[User talk:$1|copene]]) a disfacé cisse pådje ci après ki vos avoz cmincî a scrire, li råjhon k' il a dné c' est:
 : ''$2''.
 Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
@@ -1578,15 +2230,22 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'imgmultipagenext' => 'pådje shuvante →',
 
 # Table pager
+'ascending_abbrev' => 'crexh.',
+'descending_abbrev' => 'discr.',
 'table_pager_next' => 'Pådje shuvante',
 'table_pager_prev' => 'Pådje di dvant',
 'table_pager_first' => 'Prumire pådje',
 'table_pager_last' => 'Dierinne pådje',
+'table_pager_limit' => 'Håyner $1 cayets el pådje',
+'table_pager_limit_label' => 'Cayets par pådje:',
+'table_pager_limit_submit' => 'I va',
+'table_pager_empty' => 'Nou rzultat',
 
 # Auto-summaries
-'autosumm-replace' => 'Li contnou a stî replaecé pa « $1 »',
+'autosumm-blank' => 'Pådje vudeye',
+'autosumm-replace' => 'Li contnou a stî replaecî pa « $1 »',
 'autoredircomment' => 'Redjiblaedje viè [[$1]]',
-'autosumm-new' => 'Novele pådje: $1',
+'autosumm-new' => 'Pådje ahivêye avou «$1»',
 
 # Size units
 'size-bytes' => '$1 o',
@@ -1594,11 +2253,34 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'size-megabytes' => '$1 Mo',
 'size-gigabytes' => '$1 Go',
 
+# Live preview
+'livepreview-loading' => 'Tcherdjant...',
+
 # Watchlist editor
 'watchlistedit-raw-titles' => 'Tites:',
 
+# Watchlist editing tools
+'watchlisttools-edit' => "Vey et candjî l' djivêye des shuvous",
+
 # Special:Version
 'version' => 'Modêye des programes',
+'version-extensions' => "Rawetes d' astalêyes",
+'version-specialpages' => 'Pådjes sipeciåles',
+'version-variables' => 'Variåves',
+'version-antispam' => 'Siconte do spam',
+'version-skins' => 'Peas',
+'version-other' => 'Ôtes',
+'version-license' => 'Licince',
+'version-software' => 'Programes astalés',
+'version-software-product' => 'Prodût',
+'version-software-version' => 'Modêye',
+
+# Special:FilePath
+'filepath-page' => 'Fitchî:',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Cweraedje après les dobes fitchîs',
+'fileduplicatesearch-submit' => 'Cweri',
 
 # Special:SpecialPages
 'specialpages' => 'Pådjes sipeciåles',
@@ -1606,9 +2288,65 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'specialpages-group-other' => 'Ôtès pådjes especiåles',
 'specialpages-group-login' => "S' elodjî / si rashire",
 'specialpages-group-changes' => 'Dierins candjmints et djournås',
+'specialpages-group-media' => 'Rapoirts et eberwetaedjes multimedia',
 'specialpages-group-users' => 'Uzeus et abondroets',
 'specialpages-group-highuse' => 'Eployaedje timpesse des pådjes',
+'specialpages-group-pages' => 'Djivêyes di pådjes',
+'specialpages-group-pagetools' => 'Usteyes po les pådjes',
+'specialpages-group-wiki' => 'Usteyes et dnêyes do wiki',
 'specialpages-group-redirects' => 'Ridjiblaedjes di pådjes sipeciåles',
+'specialpages-group-spam' => 'Usteyes siconte do spam',
+
+# Special:BlankPage
+'blankpage' => 'Vude pådje',
+'intentionallyblankpage' => 'Cisse pådje ci est vude en esprès.',
+
+# Special:Tags
+'tag-filter' => 'Passete po ls [[Special:Tags|etiketes]]:',
+'tag-filter-submit' => 'Passete',
+'tags-edit' => 'candjî',
+'tags-hitcount' => '$1 candjmint{{PLURAL:$1||s}}',
+
+# Special:ComparePages
+'comparepages' => 'Comparer des pådjes',
+'compare-selector' => 'Comparer des modêyes di pådjes',
+'compare-page1' => 'Pådje 1',
+'compare-page2' => 'Pådje 2',
+'compare-rev1' => 'Modêye 1',
+'compare-rev2' => 'Modêye 2',
+'compare-submit' => 'Comparer',
+
+# New logging system
+'logentry-delete-delete' => "$1 a disfacé l' pådje $3",
+'logentry-delete-restore' => "$1 a rapexhî l' pådje $3",
+'logentry-delete-event' => "$1 a candjî l' veyåvisté d' {{PLURAL:$5| èn evenmint|$5 evenmints}} do djournå åd fwait di $3: $4",
+'logentry-delete-revision' => "$1 a candjî l' veyåvisté d' {{PLURAL:$5| on candjmint|$5 candjmints}} åd fwait di $3: $4",
+'logentry-delete-event-legacy' => "$1 a candjî l' veyåvisté d' evenmints do djournå åd fwait di $3",
+'logentry-delete-revision-legacy' => "$1 a candjî l' veyåvisté des candjmints so $3",
+'logentry-suppress-delete' => "$1 a disfacé l' pådje $3",
+'logentry-suppress-event' => "$1 a catcheymint candjî l' veyåvisté d' {{PLURAL:$5| èn evenmint|$5 evenmints}} do djournå åd fwait di $3: $4",
+'logentry-suppress-revision' => "$1 a catcheymint candjî l' veyåvisté d' {{PLURAL:$5| on candjmint|$5 candjmints}} åd fwait di $3: $4",
+'logentry-suppress-event-legacy' => "$1 a catcheymint candjî l' veyåvisté d' evenmints do djournå åd fwait di $3",
+'logentry-suppress-revision-legacy' => "$1 a catcheymint candjî l' veyåvisté des candjmints so $3",
+'revdelete-content-hid' => 'contnou catchî',
+'revdelete-summary-hid' => 'rascourti catchî',
+'revdelete-uname-hid' => "no d' uzeu catchî",
+'revdelete-content-unhid' => 'contnou discatchî',
+'revdelete-summary-unhid' => 'rascourti discatchî',
+'revdelete-uname-unhid' => "no d' uzeu discatchî",
+'revdelete-restricted' => 'restriccions aplikêyes ås manaedjeus',
+'revdelete-unrestricted' => 'restriccions ås manaedjeus rsaetcheyes',
+'logentry-move-move' => "$1 a displaecî l' pådje $3 viè $4",
+'logentry-move-move-noredirect' => "$1 a displaecî l' pådje $3 viè $4 sins leyî d' redjiblaedje",
+'logentry-move-move_redir' => "$1 a displaecî l' pådje $3 viè $4 pa dzeu d' on redjiblaedje",
+'logentry-move-move_redir-noredirect' => "$1 a displaecî l' pådje $3 viè $4 pa dzeu d' on redjiblaedje et sins leyî d' redjblaedje",
+'logentry-patrol-patrol' => "$1 a marké come patrouyî l' candjmint $4 del pådje $3",
+'logentry-patrol-patrol-auto' => "$1 a marké otomaticmint come patrouyî l' candjmint $4 del pådje $3",
+'logentry-newusers-newusers' => "$1 a-st ahivé on conte d' uzeu",
+'logentry-newusers-create' => "$1 a-st ahivé on conte d' uzeu",
+'logentry-newusers-create2' => "$1 a-st ahivé on conte d' uzeu $3",
+'logentry-newusers-autocreate' => 'li conte $1 a stî ahivé otomaticmint',
+'newuserlog-byemail' => "emilaedje d' on scret",
 
 # Feedback
 'feedback-subject' => 'Sudjet',
@@ -1617,6 +2355,7 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'feedback-submit' => "Evoyî l' vosse",
 'feedback-adding' => 'Vosse messaedje a stî håyné sol pådje...',
 'feedback-error2' => "Aroke : Li candjaedje n' a nén stî",
+'feedback-close' => 'Fwait',
 
 # API errors
 'api-error-badaccess-groups' => "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
@@ -1626,11 +2365,13 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'api-error-duplicate-archive-popup-title' => "Ricopyî {{PLURAL:$1|l' fitchî|les fitchîs}} k' {{PLURAL:$1|a stî rsaetchî|k' ont stî rsaetchîs}}",
 'api-error-duplicate-popup-title' => '{{PLURAL:$1|fitchî|fitchîs}} a dobe',
 'api-error-empty-file' => 'Vosse fitchî est vude.',
+'api-error-emptypage' => "C' est nén permetou d' ahiver ene novele pådje et l' leyî vude.",
 'api-error-fetchfileerror' => 'Aroke divintrinne : ene sacwè a fwait berwete cwand on-z a volou rawè vosse fitchî',
 'api-error-file-too-large' => 'Vosse fitchî est trop pezant',
 'api-error-filename-tooshort' => 'Li no do fitchî est trop court',
 'api-error-filetype-banned' => "On n' pout nén eberweter des sfwaits fitchîs",
 'api-error-filetype-missing' => 'I manke li cawete do fitchî',
+'api-error-hookaborted' => 'Li candjmint ki vos vlîz fé a stî espaitchî pa on module di rawete.',
 'api-error-http' => 'Aroke divintrinne : nou raloyaedje å sierveu',
 'api-error-illegal-filename' => "On n' pout nén prinde ci no la pol fitchî",
 'api-error-internal-error' => "Aroke divintrinne : gn a ene sacwè k' a må stî tins d' l' eredjistrumint d' vost eberwetêye",
@@ -1646,9 +2387,22 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'api-error-stashfailed' => 'Aroke divintrinne : li sierveu a pierdou les dnêyes provizweres',
 'api-error-timeout' => "Li sierveu n' a nén respondou dins les tins",
 'api-error-unclassified' => 'Aroke nén cnoxhowe',
-'api-error-unknown-code' => 'Aroke nén cnoxhowe : « $1 »',
+'api-error-unknown-code' => 'Aroke nén cnoxhowe: «$1».',
 'api-error-unknown-error' => "Aroke divintrinne : gn a ene sacwè ki n' a nén stî tins d' l' eberwetaedje",
+'api-error-unknown-warning' => 'Adviertixhmint nén cnoxhou: «$1».',
+'api-error-unknownerror' => 'Aroke nén cnoxhowe: «$1».',
 'api-error-uploaddisabled' => "L' eberwetaedje ni va nén so ç' wiki cial",
 'api-error-verification-error' => "Ci fitchî la est cron, oudon-bén si cawete n' est nén boune",
 
+# Durations
+'duration-seconds' => '$1 segonde{{PLURAL:$1||s}}',
+'duration-minutes' => '$1 munute{{PLURAL:$1||s}}',
+'duration-hours' => '$1 eure{{PLURAL:$1||s}}',
+'duration-days' => '$1 djoû{{PLURAL:$1||s}}',
+'duration-weeks' => '$1 samwinne{{PLURAL:$1||s}}',
+'duration-years' => '$1 anêye{{PLURAL:$1||s}}',
+'duration-decades' => "$1 dijhinne{{PLURAL:$1||s}} d' anêyes",
+'duration-centuries' => '$1 sieke{{PLURAL:$1||s}}',
+'duration-millennia' => '$1 meynaire{{PLURAL:$1||s}}',
+
 );
index bc1f439..ba70453 100644 (file)
@@ -21,10 +21,10 @@ $namespaceNames = array(
        NS_USER             => 'Gumaramit',
        NS_USER_TALK        => 'Hiruhimangaw_hiton_gumaramit',
        NS_PROJECT_TALK     => 'Hiruhimangraw_hiton_$1',
-       NS_FILE             => 'Fayl',
-       NS_FILE_TALK        => 'Hiruhimangraw_hiton_fayl',
-       NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'Hiruhimangraw_hiton_MediaWiki',
+       NS_FILE             => 'Paypay',
+       NS_FILE_TALK        => 'Hiruhimangraw_hiton_paypay',
+       NS_MEDIAWIKI        => 'MedyaWiki',
+       NS_MEDIAWIKI_TALK   => 'Hiruhimangraw_hiton_MedyaWiki',
        NS_TEMPLATE         => 'Batakan',
        NS_TEMPLATE_TALK    => 'Hiruhimangraw_hiton_batakan',
        NS_HELP             => 'Bulig',
@@ -33,6 +33,12 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Hiruhimangraw_hiton_kaarangay',
 );
 
+$namespaceAliases = array(
+       'Fayl'                          => NS_FILE,
+       'Hiruhimangraw_hiton_fayl'      => NS_FILE_TALK,
+       'Hiruhimangraw_hiton_MediaWiki' => NS_MEDIAWIKI_TALK,
+);
+
 $specialPageAliases = array(
        'Allpages'                  => array( 'NgatananngaPakli' ),
        'Categories'                => array( 'Mga_kaarangay' ),
@@ -64,7 +70,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Tago-a in mga gin-patrol o binantayan nga mga pagliwat ha mga dipala naiha nga mga kabag-ohan',
 'tog-newpageshidepatrolled' => 'Tago-a an mga gin-patrol o binantayan nga mga pakli tikang han talaan hin bag-o nga pakli',
 'tog-extendwatchlist' => 'Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi',
-'tog-usenewrc' => 'Gamit hin mga gin-enhans o gindugngan nga gibag-ohi nga mga kabag-ohan (nakinahanglan hin JavaScript)',
+'tog-usenewrc' => 'Gamitin mga gin-enhans o gindugngan nga gibag-ohi nga mga kabag-ohan (nakinahanglan hin JavaScript)',
 'tog-numberheadings' => 'Auto-nga-ihap nga mga pagngaran',
 'tog-showtoolbar' => 'Igpakita an edit toolbar (nakinahanglan hin JavaScript)',
 'tog-editondblclick' => 'Igliwat in mga pakli ha doble nga klik (nakinahanglan hin JavaScript)',
@@ -536,14 +542,18 @@ Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bi
 'accmailtitle' => 'Ginpadara na an tigaman-pagsulod.',
 'newarticle' => '(Bag-o)',
 'newarticletext' => "Ginsunod mo an pakli nga waray pa kahihimo.  Para ighimo an pakli, tikanga pagmakinilya ha kahon nga aada ha ubos (kitaa an [[{{MediaWiki:Helppage}}|nabulig nga pakli]] para han kadugangan nga pananabutan).  Kun sayop an imo pagkanhi, igpidlit an imo kanan panngaykay (''browser'') '''balik''' (''back'') nga piridlitan.",
+'noarticletext' => 'Waray yana nahasurat hini nga pakli.
+Puyde hi ikaw [[Special:Search/{{PAGENAME}}|magbiling para han ngaran hini nga pakli]] ha iba nga mga pakli,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} binga an mga nanginginlabot nga mga log],
+o [{{fullurl:{{FULLPAGENAME}}|action=edit}} igliwat ini nga pakli]</span>.',
 'noarticletext-nopermission' => 'Ha yana waray surat ini nga pakli.
 Puydi nimo [[Special:Search/{{PAGENAME}}|pamilngon ini nga titulo han pakli]] ha iba nga mga pakli,
 o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pamilngon ha mga kasumpay nga talaan]</span>.',
 'userpage-userdoesnotexist-view' => "An akawnt han gumaramit ni ''$1'' in diri nakarehistro.",
 'updated' => '(Ginbag-ohan)',
 'note' => "'''Pahibaro:'''",
-'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas la ini.'''
-An imo mga ginbag-o in waray pa katipig!",
+'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
+¡Waray pa katipig an imo mga ginbag-o!",
 'editing' => 'Ginliliwat an $1',
 'editingsection' => 'Ginliliwat an $1 (bahin)',
 'editingcomment' => 'Ginliliwat an $1 (bag-o nga bahin)',
@@ -644,7 +654,6 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 
 # Diffs
 'history-title' => "Kaagi han pagbag-o han ''$1''",
-'difference' => '(Kaibhan han kabutngaan han mga pagliwat)',
 'lineno' => 'Bagis $1:',
 'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
 'editundo' => 'Igpawara an ginbuhat',
@@ -799,7 +808,7 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'nchanges' => '$1 {{PLURAL:$1|pagbag-o|mga pagbabag-o}}',
 'recentchanges' => 'Mga kabag-ohan',
 'recentchanges-legend' => 'Mga pirilion han mga lab-as nga pagbag-o',
-'recentchangestext' => 'Nasubay han pinakalab-as nga pagbag-o ha wiki dinhi nga pakli.',
+'recentchanges-summary' => 'Nasubay han pinakalab-as nga pagbag-o ha wiki dinhi nga pakli.',
 'recentchanges-feed-description' => 'Panultol han pinakalab-as nga pagbabag-o ha wiki dinhi nga panubong.',
 'recentchanges-label-newpage' => 'Ini nga pagliwat hin naghimo hin bag-o nga pakli',
 'recentchanges-label-minor' => 'Gutiay ini nga pagliwat',
@@ -874,7 +883,7 @@ Mga detalye: $1',
 'nolicense' => 'Waray napili',
 
 # Special:ListFiles
-'imgfile' => 'fayl',
+'imgfile' => 'paypay',
 'listfiles' => 'Listahan han fayl',
 'listfiles_date' => 'Pitsa',
 'listfiles_name' => 'Ngaran',
@@ -883,8 +892,8 @@ Mga detalye: $1',
 'listfiles_count' => 'Mga bersyon',
 
 # File description page
-'file-anchor-link' => 'Fayl',
-'filehist' => 'Kaagi han fayl',
+'file-anchor-link' => 'Paypay',
+'filehist' => 'Kaagi han paypay',
 'filehist-help' => 'Pidlita an adlaw/oras para makit-an an fayl nga naggawas hito nga oras.',
 'filehist-deleteall' => 'Paraa ngatanan',
 'filehist-deleteone' => 'paraa',
@@ -939,7 +948,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'statistics-articles' => 'Unod nga mga pakli',
 'statistics-pages' => 'Mga pakli',
 'statistics-pages-desc' => 'Ngatanan nga mga pakli ha sulod hini nga wiki, lakip an hiruhimangraw nga mga pakli, mga redirect, ngan iba pa',
-'statistics-files' => 'Ginkarga nga mga file',
+'statistics-files' => 'Ginkarga nga mga paypay',
 'statistics-edits' => 'Mga pagliwat hit pakli tikang gintukod hini nga {{SITENAME}}',
 'statistics-edits-average' => 'Average nga mga pagliwat kada pakli',
 'statistics-views-total' => 'Ngatanan nga mga panginano',
@@ -1283,7 +1292,7 @@ Makikit-an nimo an ginkuhaaan',
 'tooltip-feed-atom' => 'Atom nga pangarga para hini nga pakli',
 'tooltip-t-contributions' => 'Kitaa an talaan hin mga amot hini nga nágámit',
 'tooltip-t-emailuser' => 'Padad-i hin e-mail ini nga nágámit',
-'tooltip-t-upload' => 'Pagkarga hin mga fayl',
+'tooltip-t-upload' => 'Pagkarga hin mga paypay',
 'tooltip-t-specialpages' => 'Talaan hin mga pinaurog nga pakli',
 'tooltip-t-print' => 'Maipapatik nga bersyon hini nga pakli',
 'tooltip-t-permalink' => 'Sumpay nga unob ha hini nga pagliwat han pakli',
@@ -1344,6 +1353,8 @@ An bisan ano nga masunod nga mga sumpay ha kapareho nga bagis in igtratrato nga
 
 # Metadata
 'metadata' => 'Metadata',
+'metadata-help' => 'Iní nga paypay mayda dugang nga pagpasabot, nga bangin gindugáng tikang han digital nga camera o iskaner nga gin-gamit paghimo o pag-digitar hini.
+Kon an paypay ginliwat tikang han orihinal nga kamutangan, mayda mga detalye nga bangin diri magpakita han ginliwat nga paypay',
 'metadata-fields' => 'An mga rumbay han hulagway han metadato nga nakatala dinhi nga mensahe in iglalakip ha padayag hin hulagway nga pakli kun an taramdan metadato in nakalukot.
 An iba in daan nakatago.
 * make
@@ -1500,6 +1511,16 @@ An iba in daan nakatago.
 'blankpage' => 'Blanko nga pakli',
 'intentionallyblankpage' => 'Ini nga pakli gintuyo pagpabilin nga blanko.',
 
+# External image whitelist
+'external_image_whitelist' => '#Pabay-i ini nga linea nga sugad gud la <pre>
+#Igbutang in mga regular nga expresyon nga mga fragment (iton bahin nga ada ha butnga han //) ha ubos
+#Ini igpapadis han mga URL han mga ha gawas (gin-hotlink) nga mga hulagway
+#An mga nasakto igpapakita nga mga hulagway, kon diri, sumpay la ngadto han hulagway an igpapakita
+#Mga linea nga natikang hin  # ginta-tratar nga mga komento
+# Case-insensitive ini
+
+#Igbutang an mga regex nga fragment ha igbaw hini nga linea. Pabay-i ini nga linea nga sugad gud la</pre>',
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] panara:',
 'tag-filter-submit' => 'Panara',
index 81e4f16..13c5a11 100644 (file)
@@ -861,7 +861,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 
 # Diffs
 'history-title' => 'Jaar-jaaru sumbi « $1 »',
-'difference' => '(Wuute gi ci sumb yi)',
 'lineno' => 'Rëdd $1 :',
 'compareselectedversions' => 'Méngale sumb yi nga fal',
 'editundo' => 'neenal',
@@ -1176,7 +1175,7 @@ Jéemala bindaale ''all'' ngir seet ci biir ëmbit gépp (boolewaale ci xëti wa
 'nchanges' => '$1 {{PLURAL:$1|coppite|ciy coppite}}',
 'recentchanges' => 'Coppite yu mujj',
 'recentchanges-legend' => 'tànneefi coppite yu mujj',
-'recentchangestext' => 'Toppal ci wii xët coppite yu mujj ci {{SITENAME}}.',
+'recentchanges-summary' => 'Toppal ci wii xët coppite yu mujj ci {{SITENAME}}.',
 'recentchanges-feed-description' => 'Toppal coppite yu mujj yu bii wiki.',
 'recentchanges-label-newpage' => 'Coppite gi sos na xët wu bees',
 'recentchanges-label-minor' => 'Coppite gu néewal la',
index 364b863..a9d7dd5 100644 (file)
@@ -837,7 +837,6 @@ $1",
 
 # Diffs
 'history-title' => '“$1”个修订历史',
-'difference' => '(修订版本间差异)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比较选中个版本',
 'showhideselectedversions' => '显示/囥脱选定修订版本',
@@ -1014,7 +1013,7 @@ $1",
 'nchanges' => '$1趟更改',
 'recentchanges' => '近段辰光个改动',
 'recentchanges-legend' => '近段辰光个改动选项',
-'recentchangestext' => '登该个页面浪跟踪最近对维基百科个改动。',
+'recentchanges-summary' => '登该个页面浪跟踪最近对维基百科个改动。',
 'recentchanges-feed-description' => '跟踪此订阅垃拉 wiki 高头个最近更改。',
 'rcnote' => "下底是垃拉$4 $5,最近'''$2'''日天里向个'''$1'''趟最近更改记录:",
 'rclistfrom' => '显示 $1 以来个新改动',
index 5d9d61d..2aea831 100644 (file)
@@ -566,7 +566,6 @@ $1',
 
 # Diffs
 'history-title' => '$1 — сольлһна тууҗ',
-'difference' => '(Йилһән)',
 'lineno' => '$1 мөр:',
 'compareselectedversions' => 'Суңһсн янзс әдлцүлх',
 'editundo' => 'уга кех',
@@ -726,7 +725,7 @@ $1',
 'nchanges' => '$1 {{PLURAL:$1|сольлһн|сольлһн}}',
 'recentchanges' => 'Шидрә сольлһн',
 'recentchanges-legend' => 'Шидрә сольлһна көгүд',
-'recentchangestext' => 'Эн цагин дараһар бичсн шидрә сольлһн',
+'recentchanges-summary' => 'Эн цагин дараһар бичсн шидрә сольлһн',
 'recentchanges-feed-description' => 'Эн зәңгллһд шидрә хүврһд шинҗлх.',
 'recentchanges-label-newpage' => 'Тер үүләр шин халх бүтәв',
 'recentchanges-label-minor' => 'Эн баһ чинртә сольлһн',
index 474fa8d..d487e43 100644 (file)
@@ -322,8 +322,8 @@ $messages = array(
 თქვა შეილებუნა [[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>."',
+'noarticletext-nopermission' => 'ათე ხასჷლას ასე ტექსტი ვა რე. თქვა შეილებუნა [[Special:Search/{{PAGENAME}}|დოგორათ თე ხასჷლაშ დუდჯოხო]] შხვა ხასჷლეფს,
+ვარდა <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} დოგორათ გინორცხილ ჟურნალეფი]</span>.',
 'previewnote' => "'''რშუდანი თენა რე ხვალე გიწოთოლორაფა'''
 თქვანი თირაფეფი დიო ვარე ჩუალირი!",
 'editing' => 'რედაქტირაფა $1',
@@ -391,7 +391,6 @@ $messages = array(
 
 # Diffs
 'history-title' => '"$1"–იშ თირაფეფიშ ისტორია',
-'difference' => '(ვერსიეფშკას შხვაოფეფ)',
 'lineno' => 'ღოზი $1:',
 'compareselectedversions' => 'გიშაგორილ ვერსიეფიშ მეზიმაფა',
 'editundo' => 'გოუქვაფა',
@@ -472,7 +471,7 @@ $messages = array(
 'nchanges' => '$1 {{PLURAL:$1|თირაფა|თირაფეფ}}',
 'recentchanges' => 'ასეიანი თირაფეფი',
 'recentchanges-legend' => 'ასერდენ თირაფეფიშ ოფციეფ',
-'recentchangestext' => 'თე ხასჷლას ქაძირი ვიკიშა მიშაღალირ არძოშ უახალაშ თირაფეფი.',
+'recentchanges-summary' => 'თე ხასჷლას ქაძირი ვიკიშა მიშაღალირ არძოშ უახალაშ თირაფეფი.',
 'recentchanges-feed-description' => "ვიკიშ უახალაშ თირაფეფიშა თოლყ'უჯიშ მეყ'უნაფა თე არხის",
 'recentchanges-label-newpage' => 'ათე რედაქტირაფას მაჸუნ ახალ ხასჷლაშ დორსხუაფაქ.',
 'recentchanges-label-minor' => 'თენა რე ციქა რედაქტირაფა',
index f3a7e35..2d51ec6 100644 (file)
@@ -67,10 +67,12 @@ $specialPageAliases = array(
        'BrokenRedirects'           => array( 'צעבראכענע_ווייטערפירונגען' ),
        'Categories'                => array( 'קאטעגאריעס' ),
        'ChangePassword'            => array( 'ענדערן_פאסווארט' ),
+       'ComparePages'              => array( 'פארגלייהן_בלעטער' ),
        'Confirmemail'              => array( 'באשטעטיגן_ע-פאסט' ),
        'Contributions'             => array( 'בײַשטײַערונגען' ),
        'CreateAccount'             => array( 'שאפֿן_קאנטע' ),
        'Deadendpages'              => array( 'בלעטער_אן_פארבינדונגען' ),
+       'DeletedContributions'      => array( 'אויסגעמעקעטע_בײַשטײַערונגען' ),
        'Disambiguations'           => array( 'באדייטן' ),
        'DoubleRedirects'           => array( 'פארטאפלטע_ווייטערפירונגען' ),
        'Emailuser'                 => array( 'שיקן_אן_ע-פאסט_צום_באניצער' ),
@@ -83,6 +85,7 @@ $specialPageAliases = array(
        'Listfiles'                 => array( 'בילדער' ),
        'Listredirects'             => array( 'ווייטערפירונגען' ),
        'Listusers'                 => array( 'ליסטע_פון_באניצערס' ),
+       'Lockdb'                    => array( 'פארשליסן_דאטנבאזע' ),
        'Log'                       => array( 'לאגביכער' ),
        'Lonelypages'               => array( 'פאר\'יתומ\'טע_בלעטער' ),
        'Longpages'                 => array( 'לאנגע_בלעטער' ),
@@ -114,6 +117,7 @@ $specialPageAliases = array(
        'Specialpages'              => array( 'באזונדערע_בלעטער' ),
        'Statistics'                => array( 'סטאטיסטיק' ),
        'Tags'                      => array( 'טאגן' ),
+       'Unblock'                   => array( 'אויפבלאקירן' ),
        'Uncategorizedcategories'   => array( 'קאטעגאריעס_אן_קאטעגאריעס' ),
        'Uncategorizedimages'       => array( 'בילדער_אן_קאטעגאריעס' ),
        'Uncategorizedpages'        => array( 'בלעטער_אן_קאטעגאריעס' ),
@@ -169,6 +173,7 @@ $magicWords = array(
        'raw'                     => array( '0', 'רוי:', 'ללא עיבוד:', 'RAW:' ),
        'displaytitle'            => array( '1', 'ווייזן_קעפל', 'כותרת תצוגה', 'DISPLAYTITLE' ),
        'language'                => array( '0', '#שפראך:', '#שפה:', '#LANGUAGE:' ),
+       'special'                 => array( '0', 'באזונדער', 'מיוחד', 'special' ),
        'defaultsort'             => array( '1', 'גרונטסארטיר:', 'מיון רגיל:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'hiddencat'               => array( '1', '__באהאלטענע_קאטעגאריע__', '__באהאלטענע_קאט__', '__קטגוריה_מוסתרת__', '__HIDDENCAT__' ),
        'pagesize'                => array( '1', 'בלאטגרייס', 'גודל דף', 'PAGESIZE' ),
@@ -306,6 +311,7 @@ $messages = array(
 'index-category' => 'אינדעקסירטע בלעטער',
 'noindex-category' => 'אומאינדעקסירטע בלעטער',
 'broken-file-category' => 'בלעטער מיט צעבראכענע טעקע לינקען',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'about' => 'וועגן',
 'article' => 'אינהאלט בלאט',
@@ -568,6 +574,10 @@ $2',
 'ns-specialprotected' => 'מען קען נישט רעדאגירן ספעציעלע בלעטער.',
 'titleprotected' => 'דער טיטל איז געשיצט פון ווערן געשאפֿן דורך  [[User:$1|$1]].
 די אורזאך איז  \'\'$2".',
+'filereadonlyerror' => 'נישט מעגלעך צו ענדערן די טעקע "$1" ווייל די טעקע רעפאזיטאריום  "$2" איז אין נאר־ליינען מצב.
+דער סיסאפ וואס האט זי פארשפארט האט געגעבן דעם הסבר:  "$3"',
+'invalidtitle-knownnamespace' => 'אומגילטירער טיטל מיט נאמענטייל "$2" און טעקסט "$3"',
+'invalidtitle-unknownnamespace' => 'אומגילטיקער טיטל מיט אומבאוואוסטן נאמענטייל נומער $1 און טעקסט "$2"',
 
 # Virus scanner
 'virus-badscanner' => "שלעכטע קאנפֿיגוראציע: אומבאוואוסטער ווירוס איבערקוקער: ''$1''",
@@ -596,10 +606,10 @@ $2',
 'userlogout' => 'אַרױסלאָגירן',
 'notloggedin' => 'נישט איינגעשריבן',
 'nologin' => "איר האט נישט קיין קאנטע? '''$1'''.",
-'nologinlink' => '×\91×\90ש×\90פֿ×\98 ×\90 קאנטע',
-'createaccount' => '×\91×\90ש×\90פֿ×\98 ×\90 × ×\99×\99ע קאנטע',
-'gotaccount' => "האסט שוין א קאנטע? '''$1'''.",
-'gotaccountlink' => 'אריינלאגירן',
+'nologinlink' => 'ש×\90ַפֿ×\9f ×\90Ö· קאנטע',
+'createaccount' => 'ש×\90ַפֿ×\9f ×\90Ö· × ×²Ö·ע קאנטע',
+'gotaccount' => "האסטו שוין א קאנטע? '''$1'''.",
+'gotaccountlink' => 'אַרײַנלאגירן',
 'userlogin-resetlink' => 'פארגעסן אײַערע אַרײַנלאָגירן פרטים?',
 'createaccountmail' => 'דורך ע-פאסט',
 'createaccountreason' => 'אורזאַך:',
@@ -622,7 +632,7 @@ $2',
 'loginsuccess' => "'''איר זענט אַצינד אַרײַנלאָגירט אין {{SITENAME}} ווי \"\$1\".'''",
 'nosuchuser' => 'נישטא קיין באניצער מיטן נאמען  "$1".
 
-ק×\95ק×\98 ×\90×\99×\91ער ×\90×\99×\99ער ×\90×\95×\99ס×\9c×\99×\99×\92, ×\90×\93ער [[Special:UserLogin/signup|×\91×\90ש×\90פֿ×\98 ×\90 × ×\99×\99ע קאנטע]].',
+ק×\95ק×\98 ×\90×\99×\91ער ×\90ײַער ×\90×\95×\99ס×\9c×\99×\99×\92, ×\90×\93ער [[Special:UserLogin/signup|ש×\90ַפֿ×\98 ×\90 × ×²Ö·ע קאנטע]].',
 'nosuchusershort' => 'נישטאָ קיין באַניצער מיטן נאָמען "$1". 
 ביטע באַשטעטיקט דעם אויסלייג.',
 'nouserspecified' => 'איר ברויכט ספעציפֿיצירן א באַניצער-נאָמען.',
@@ -661,6 +671,7 @@ $2',
 'invalidemailaddress' => 'דער ע-פאסט אדרעס קען נישט אקצעפטירט ווערן ווייל ער שיינט צו האבן אן אומגילטיגן פֿארמאט.
 ביטע אריינלייגן א גוט-פארמאטירטן אדרעס אדער ליידיגט אויס דאס פֿעלד.',
 'cannotchangeemail' => "מ'קען נישט ענדערן קאנטע ע־פאסט אדרעסן אין דער וויקי.",
+'emaildisabled' => 'דאס וועבזייטל קען נישט שיקן ע־בריוון.',
 'accountcreated' => 'די קאָנטע איז באַשאַפֿן',
 'accountcreatedtext' => 'די באניצער קאנטע פאר $1 איז באַשאַפֿן געווארן.',
 'createaccount-title' => 'קאנטע באשאפֿן אין {{SITENAME}}',
@@ -828,7 +839,7 @@ $2
 'newarticletext' => "איר זענט געקומען צו אַ בלאַט וואָס עקזיסטירט נאָך נישט!
 כדי שאַפֿן דעם בלאַט, קלאַפט אַרײַן טעקסט אין דעם קעסטל אונטן (זעט דעם [[{{MediaWiki:Helppage}}|הילף בלאַט]] פֿאַר מער אינפֿארמאַציע).
 אויב איר זענט אַהערגעקומען בטעות, דרוקט דאָס '''Back''' קנעפל אין אײַער בלעטערער.",
-'anontalkpagetext' => "----'''דאס איז א רעדן בלאט פון א אן אנאנימען באַניצער וואס האט נאך נישט באַשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. דערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[Special:UserLogin/signup|באַשאַפֿט א קאנטע]] אדער [[Special:UserLogin|טוט זיך אריינלאגירן]] כדי צו פארמיידן דאס אין די עתיד זיך פארמישן מיט אנדערע אנאנימע באַניצערס.'''",
+'anontalkpagetext' => "----'''דאָס איז א רעדן בלאַט פון א אַן אַנאנימען באַניצער וואָס האט נאך נישט געשאַפֿן קיין קאנטע, אדער באניצט זיך נישט דערמיט. דערוועגן, מוזן מיר זיך באניצן מיט זיין IP אדרעס כדי אים צו אידענטיפיצירן. עס קען זיין אז עטלעכע אנדערע ניצן אויך דעם  IP אדרעס. אויב זענט איר אן אנאנימער באַניצער וואס שפירט אז איר האט באקומען מעלדונגען וואס זענען נישט שייך צו אייך, ביטע [[Special:UserLogin/signup|שאַפֿט א קאנטע]] אדער [[Special:UserLogin|טוט זיך אריינלאגירן]] כדי צו פארמיידן דאס אין די עתיד זיך פארמישן מיט אנדערע אַנאנימע באַניצערס.'''",
 'noarticletext' => 'דערווייל איז נישט פאַרהאן קיין שום טעקסט אין דעם בלאט.
 איר קענט [[Special:Search/{{PAGENAME}}|זוכן דעם בלאט טיטל]] אין אנדערע בלעטער,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} זוכן די רעלעוואנטע לאגביכער],
@@ -864,7 +875,9 @@ $2
 'userinvalidcssjstitle' => "'''ווארענונג:''' סאיז נישטא קיין סקין \"\$1\". גדענקט אז קאסטעם .css און .js בלעטער נוצען לאוער קעיס טיטול, e.g. {{ns:user}}:Foo/vector.css ווי אנדערשט צו {{ns:user}}:Foo/Vector.css.",
 'updated' => '(דערהיינטיגט)',
 'note' => "'''באמערקונג:'''",
-'previewnote' => "'''דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג, דער אַרטיקל איז דערווייל נאָך נישט געהיט!'''",
+'previewnote' => "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''
+אייערע ענדערונגען זענען נאָך נישט געהיט!",
+'continue-editing' => 'רעדאקטירן ווײַטער',
 'previewconflict' => 'די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.',
 'session_fail_preview' => "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
 'session_fail_preview_html' => "''''''אַנטשולדיקט! מיר קענען נישט פּראָצעסירן אײַער ענדערונג צוליב א פֿאַרלוסט פֿון סעסיע דאַטע.''''''
@@ -875,7 +888,9 @@ $2
 'token_suffix_mismatch' => "'''אייער רעדאקטירונג איז געווארן אפגעווארפן ווייל אייער בראוזער האט אפגעווארפן די נקודות ביים רעדאקטירן.'''
 די ענדערונג איז געווארן אפגעווארפן כדי נישט צו אנמאכן א חורבן אין די טעקסט פונעם בלאט.
 דאס געשענט מייסטענס ווען איר נוצט אן אנאניאמער פראקסי סערווער.",
+'edit_form_incomplete' => "'''טייל פון דער רעדאקטירונג פֿארעם זענען נישט אנגעקומען צום סארווער; קאנטראלירט אז אייערע רעדאקטירונגען זענען פולשטענדיק און פרובירט נאכאמאל.'''",
 'editing' => 'ענדערן $1',
+'creating' => 'שאפֿן $1',
 'editingsection' => 'ענדערט $1 (אפטיילונג)',
 'editingcomment' => 'רעדאַקטירן $1 (נײַע אפטיילונג)',
 'editconflict' => 'ענדערן קאנפליקט: $1',
@@ -918,13 +933,13 @@ $2
 'hiddencategories' => 'דער דאזיגער בלאט געהערט צו {{PLURAL:$1|איין באהאלטענער קאטעגאריע|$1 באהאלטענע קאטעגאריעס}}:',
 'edittools' => '<!-- טעקסט דא וועט געוויזן ווערן אונטער ענדערן און ארויפלאדירן פארעמס. -->',
 'nocreatetitle' => 'בלאט באשאפן באגרעניצט',
-'nocreatetext' => '×\93×\99 ×¡×\99×\99×\98 ×\94×\90×\98 ×\91×\90×\92רענ×\99צ×\98 ×\93×\99 ×\9e×¢×\92×\9c×\99×\9bק×\99×\99×\98 ×¦×\95 ×\91×\90ש×\90פ×\9f × ×\99×\99×¢ ×\91×\9c×¢×\98ער.
\90×\99ר ×§×¢× ×\98 ×¦×\95ר×\99ק×\92×\99×\99×\9f ×\90×\95×\9f ×¢× ×\93ער×\9f ×\93×\99 ×¢×§×\96×\99ס×\98×\99רנ×\93×¢ ×\91×\9c×\90×\98, ×\90×\93ער [[Special:UserLogin|×\9c×\90×\92×\99ר×\98 ×\96×\99×\9a ×\90ר×\99×\99×\9f ×\90×\95×\9f ×\91×\90שאפט א קאנטע]].',
+'nocreatetext' => 'די סייט האט באגרעניצט די מעגליכקייט צו שאפן נייע בלעטער.
\90×\99ר ×§×¢× ×\98 ×¦×\95ר×\99ק×\92×\99×\99×\9f ×\90×\95×\9f ×¢× ×\93ער×\9f ×\93×¢×\9d ×¢×§×\96×\99ס×\98×\99רנ×\93×\9f ×\91×\9c×\90×\98, ×\90×\93ער [[Special:UserLogin|×\9c×\90×\92×\99ר×\98 ×\96×\99×\9a ×\90ר×\99×\99×\9f ×\90×\93ער שאפט א קאנטע]].',
 'nocreate-loggedin' => 'איר זענט נישט ערלויבט צו שאַפֿן נײַע בלעטער.',
 'sectioneditnotsupported-title' => 'רעדאקטירן אפטיילונגען נישט געשטיצט.',
 'sectioneditnotsupported-text' => 'רעדאַקטירן אָפטיילונגען נישט געשטיצט אויף דעם בלאַט',
-'permissionserrors' => 'ער×\9c×\95×\99×\91×¢× ×\99ש×\9f ×¤×¢×\99×\9cערס',
-'permissionserrorstext' => 'איר זענט נישט ערלויבט צו טון דאס, פֿאַר  {{PLURAL:$1|דער פֿאלגנדער סיבה|די פֿאלגנדע סיבות}}:',
+'permissionserrors' => 'ערלויבענישן פעלערס',
+'permissionserrorstext' => 'איר זענט נישט ערלויבט צו טון דאס, פֿאַר {{PLURAL:$1|דער פֿאלגנדער סיבה|די פֿאלגנדע סיבות}}:',
 'permissionserrorstext-withaction' => 'איר זענט נישט ערלויבט צו $2, וועגן {{PLURAL:$1|דער פֿאלגנדער סיבה| די פֿאלגנדע סיבות}}:',
 'recreate-moveddeleted-warn' => "'''ווארענונג: איר שאפט א נייעם בלאט וואס איז שוין איינמאל  געווארן אויסגעמעקט.'''
 
@@ -941,6 +956,7 @@ $2
 'edit-no-change' => "מ'האט איגנארירט אײַער רעדאַקטירונג, ווײַל קיין שום ענדערונג איז נישט געמאַכט צום טעקסט.",
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
 ער עקזיסטירט שוין.',
+'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.
@@ -958,7 +974,7 @@ $2
 
 # "Undo" feature
 'undo-success' => 'די ענדערונג קען ווערן מבוטל. ביטע נאכקוקן די פארגלייך פון אונטן צו זיין זיכער אז דאס איז וואס איר ווילט טאן, און דערנאך היט-אפ די ענדערונגן פון אונטן צו ענדיגן דאס בטל מאכן די ענדערונג.',
-'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 ×§×¢×\9f × ×\99ש×\98 ×\95×\95ער×\9f ×\90×\95×\9e\92×¢×\98×\90×\9f ×¦×\95×\9c×\99×\91 ×§×\90נפ×\9c×\99ק×\98×\99× ×\92 ×\90×\99× ×\98ער×\9e×\99×\93×\99×¢×\98 ×¢× ×\93ער×\95× ×\92ן.',
+'undo-failure' => '×\93×\99 ×¢× ×\93ער×\95× ×\92 ×§×¢×\9f × ×\99ש×\98 ×\9e×\91×\95×\98×\9c ×\95×\95ער×\9f ×¦×\95×\9c×\99×\91 ×¡×ª×\99ר×\95ת ×\9e×\99×\98 ×¦×\95×\95×\99שנצ×\99×\99×\98×\9c×¢×\9b×¢ ×¢× ×\93ער×\95× ×\92×¢ן.',
 'undo-norev' => "ס'איז נישט מעגלעך צוריקקערן די רעדאַקטירונג ווײַל זי עקסיסטירט נישט אדער איז אויסגעמעקט.",
 'undo-summary' => 'זיי מבטל רי-ווערסיע $1 פון [[Special:Contributions/$2|$2]] ([[User talk:$2|רעדן]])',
 
@@ -1046,6 +1062,8 @@ $2
 'revdelete-show-file-submit' => 'יא',
 'revdelete-selected' => "'''{{PLURAL:$2|אויסדערוויילטע ווערסיע| אויסדערוויילטע ווערסיעס}} פון [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1| אויסדערוויילטע לאג אקציע|אויסדערוויילטע לאג אקציעס}}:'''",
+'revdelete-text' => "'''אויסגעמעקטע רעוויזיעס און געשעענישן וועלן בלייבן אין דער בלאט היסטאריע און די לאגביכער, אבער טיילן פון זייער אינהאלט וועט ווערן אומגרייכלעך צום קהל. '''
+אנדערע סיסאפן אויף {{SITENAME}} וועלן נאך האבן צוטריט צום באהאלטענעם אינהאלט און קענען אים צוריקשטעלן דורך דעם זעלבן אייבערפלאך,  אחוץ ווען מען שטעלט נאך באגרענעצונגען.",
 'revdelete-suppress-text' => "באהאלטן זאל בלויז גענוצט ווערן '''נאר''' אין די פאלגענדע פעלער:
 * אויפדעקונג פון פריוואטקייט אינפארמאציע
 * ''היים אדרעסן, טעלעפאן נומערן, אדער סאשעל סעקיורעטי, א.א.וו.:'''",
@@ -1127,7 +1145,8 @@ $1",
 
 # Diffs
 'history-title' => 'רעוויזיע היסטאריע פֿון $1',
-'difference' => '(אונטערשייד צווישן ווערסיעס)',
+'difference-title' => 'אונטערשייד צווישן ווערסיעס פון "$1"',
+'difference-title-multipage' => 'אונטערשייד צווישן בלעטער "$1" און "$2"',
 'difference-multipage' => '(אונטערשייד צווישן בלעטער)',
 'lineno' => 'שורה $1:',
 'compareselectedversions' => 'פארגלייך סעלעקטירטע ווערסיעס',
@@ -1225,6 +1244,7 @@ $1",
 'prefs-beta' => 'בעטאַ אייגנשאַפֿטן',
 'prefs-datetime' => 'דאטום און צייט',
 'prefs-labs' => 'לאַבאראַטאריע מעגלעכקייטן',
+'prefs-user-pages' => 'באניצער בלעטער',
 'prefs-personal' => 'באַנוצער פראָפֿיל',
 'prefs-rc' => 'לעצטע ענדערונגען',
 'prefs-watchlist' => 'אויפפאסונג ליסטע',
@@ -1390,8 +1410,10 @@ $1",
 'right-reupload' => 'איבערשרײַבן עקסיסטירנדע טעקע',
 'right-reupload-own' => "איבערשרײַבן עקזיסטירנדע טעקעס וואָס מ'האט אַליין אַרויפֿגעלאָדן",
 'right-upload_by_url' => 'ארויפֿלאָדן טעקעס פֿון אַ URL',
+'right-purge' => 'ליידיקן דעם זייטל־זאפאס פאר א בלאט אן באשטעטיקונג',
 'right-autoconfirmed' => 'רעדאקטירן האלב-געשיצטע בלעטער',
 'right-bot' => 'באַהאַנדלונג ווי אַן אויטאמאַטישער פראצעס',
+'right-nominornewtalk' => 'מינערדיקע רעדאקטירונגען צו שמועס בלעטער זאלן נישט שאפן די "נייע מודעות" מעלדונג',
 'right-writeapi' => 'ניצן דעם שרײַבן API',
 'right-delete' => 'מעקן בלעטער',
 'right-bigdelete' => 'אויסמעקן בלעטער מיט לאַנגע היסטאריעס',
@@ -1425,6 +1447,7 @@ $1",
 'right-userrights' => 'רעדאַקטירן אלע באַניצער רעכטן',
 'right-userrights-interwiki' => 'רעדאַקטירן באַניצער רעכטן פֿון באַניצער אויף אנדערע וויקיס',
 'right-siteadmin' => 'פארשליס און שליס-אויף די דאטעבאזע',
+'right-override-export-depth' => 'עקספארטירן בלעטער כולל געלינקטע בלעטער ביז א טיף פון 5',
 'right-sendemail' => 'שיקן ע-פאסט צו אנדערע באניצער',
 'right-passwordreset' => 'באַקוקן פאַסווארט צוריקשטעלן ע־בריוו',
 
@@ -1441,13 +1464,14 @@ $1",
 'action-createpage' => 'שאַפֿן בלעטער',
 'action-createtalk' => 'שאַפֿן שמועס בלעטער',
 'action-createaccount' => 'שאַפֿן די באַניצער קאנטע',
-'action-minoredit' => 'באַצייכנען די רעדאַקטירונג ווי מינערדיק',
+'action-minoredit' => '×\91×\90ַצ×\99×\99×\9b×¢× ×¢×\9f ×\93×\99 ×¨×¢×\93×\90ַק×\98×\99ר×\95× ×\92 ×\95×\95×\99 ×\9e×\99נער×\93×\99ק',
 'action-move' => 'באַוועגן דעם בלאַט',
 'action-move-subpages' => 'באַוועגן דעם בלאַט מיט זײַנע אונטערבלעטער',
 'action-move-rootuserpages' => 'באַוועגן באַניצער הויפטבלעטער',
 'action-movefile' => 'באַוועגן די טעקע',
 'action-upload' => 'אַרויפֿלאָדן די טעקע',
 'action-reupload' => 'איבערשרײַבן די עקזיסטירנדע טעקע',
+'action-reupload-shared' => 'אריבערשרייבן די טעקע אין א געמיינזאמער רעפאזיטאריע',
 'action-upload_by_url' => 'ארויפֿלאָדן די טעקע פֿון א URL',
 'action-writeapi' => 'ניצן דעם שרײַבן API',
 'action-delete' => 'אויסמעקן דעם בלאַט',
@@ -1459,6 +1483,7 @@ $1",
 'action-suppressionlog' => 'באקוקן דעם פריוואטן לאג',
 'action-block' => 'בלאקירן דעם באַניצער פֿון רעדאַקטירן',
 'action-protect' => 'ענדערן שיצונג ניוואען פֿאַר דעם בלאַט',
+'action-rollback' => 'גיך צוריקדרייען די רעדאַקטירונגען פונעם לעצטן באַניצער וואס האט רעדאַקטירט א געוויסן בלאַט',
 'action-import' => 'אימפארטירן דעם בלאַט פֿון אַן אַנדער וויקי',
 'action-importupload' => 'אימפארטירן דעם בלאַט דורך ארויפֿלאָדן אַ טעקע',
 'action-patrol' => "אנצייכענען אנדערס' רעדאקטירונגן אלס נאכגעקוקט",
@@ -1474,7 +1499,7 @@ $1",
 'nchanges' => '{{PLURAL:$1|ענדערונג|$1 ענדערונגען}}',
 'recentchanges' => 'לעצטע ענדערונגען',
 'recentchanges-legend' => 'ברירות פאר לעצטע ענדערונגען',
-'recentchangestext' => 'גיי נאך די לעצטע ענדערונגען צו דער וויקי אויף דעם בלאט.',
+'recentchanges-summary' => 'גיי נאך די לעצטע ענדערונגען צו דער וויקי אויף דעם בלאט.',
 'recentchanges-feed-description' => 'גייט נאך די לעצטע ענדערונגען צו דער וויקי אין דעם בלאט.',
 'recentchanges-label-newpage' => 'די רעדאַקטירונג האט באשאפֿן א נײַעם בלאַט',
 'recentchanges-label-minor' => 'דאָס איז אַ מינערדיקע רעדאַקטירונג',
@@ -1524,8 +1549,12 @@ $1",
 'upload-tryagain' => 'פֿאָרלייגן מאדיפֿיצירטע טעקע באַשרײַבונג',
 'uploadnologin' => 'נישט אַרײַנלאגירט',
 'uploadnologintext' => 'איר מוזט זײַן [[Special:UserLogin| אַרײַנלאָָגירט]] כדי ארויפֿצולאָדן טעקעס',
+'upload_directory_missing' => 'די ארויפלאד דירעקטאריע ($1) פעלט און דער וועבסערווירער קען זי נישט שאפן.',
 'upload_directory_read_only' => 'דער וועבסארווער קען נישט שרייבן צום ארויפלאדן ארכיוו "$1".',
 'uploaderror' => 'אַרויפֿלאָדן פֿעלער',
+'upload-recreate-warning' => "'''ווארענונג: א טעקע מיט דעם נאמען איז געווארן אויסגעמעקט אדער באוועגט.'''
+
+דאס אויסמעקן־ און באוועגן־לאגבוך פאר דעם בלאט זענען געוויזן דא:",
 'uploadtext' => "באניצט דעם פֿארעם אַרויפֿצולאָדן טעקעס.
 כדי צו זען אדער זוכן טעקעס וואס זענען שוין אַרויפֿגעלאָדן ווענדט זיך צו דער [[Special:FileList|ליסטע פֿון אַרויפֿגעלאָדענע טעקעס]]; (ווידער)אַרויפֿלאָדונגען ווערן אויך לאגירט אינעם  [[Special:Log/upload| אַרויפֿלאָדן לאג-בוך]], אויסמעקונגען אינעם [[Special:Log/delete|אויסמעקן לאג-בוך]].
 
@@ -1554,6 +1583,10 @@ $1",
 ביטע גיט דער טעקע א נײַעם נאמען און פּרובירט ארויפֿלאָדן נאכאַמאָל.',
 'filename-toolong' => 'טעקע נעמען קען נישט זײַן לענגער ווי 240 בייטן.',
 'badfilename' => 'טעקע נאמען איז געטוישט צו "$1".',
+'filetype-mime-mismatch' => 'טעקע סופֿיקס ".$1" שטימט נישט מיטן MIME טיפ פון דער טעקע($2).',
+'filetype-badmime' => 'טעקעס מיטן  MIME טיפ "$1" טאר מען נישט ארויפלאדן.',
+'filetype-unwanted-type' => "'''\".\$1\"''' איז אן אומרעקאמענדירטער טעקע־טיפ. {{PLURAL:\$3|רעקאמענדירטער טעקע־טיפ איז|רעקאמענדירטע טעקע־טיפן זענען}} \$2.",
+'filetype-banned-type' => '\'\'\'".$1"\'\'\' {{PLURAL:$4|איז נישט קיין דערלויבטער טעקע־טיפ |זענען נישט קיין דערלויבטע טעקע־טיפן}}. {{PLURAL:$3|דערלויבטער טעקע־טיפ איז|דערלויבטע טעקע־טיפן זענען}} $2.',
 'filetype-missing' => 'די טעקע האט נישט קיין פארברייטערונג (למשל ".jpg").',
 'empty-file' => 'די טעקע וואָס איר האט אײַנגעגעבן איז ליידיג.',
 'file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
@@ -1589,6 +1622,7 @@ $1",
 'uploadedimage' => 'אַרױפֿגעלאָדן "[[$1]]"',
 'overwroteimage' => 'אַרויפֿגעלאָדן א נײַע ווערסיע פון "[[$1]]"',
 'uploaddisabled' => 'אַרויפֿלאָדן טעקעס מבוטל',
+'copyuploaddisabled' => 'ארויפלאדן דורך URL אומאקטיווירט',
 'uploadfromurl-queued' => 'אייער ארויפלאד איז אין דער רייע.',
 'uploaddisabledtext' => 'אַרויפֿלאָדן טעקעס נישט דערמעגלעכט אצינד.',
 'uploadscripted' => 'די טעקע האט א סקריפט אדער HTML קאד וואס קען ווערן פֿאלש אויסגעטייטשט דורך א בלעטערער',
@@ -1620,6 +1654,7 @@ $1",
 'upload-http-error' => 'א HTTP גרײַז האט פאַסירט: $1',
 
 # File backend
+'backend-fail-stream' => 'קען נישט מאכן שטראמען טעקע $1.',
 'backend-fail-notexists' => 'נישט פֿאראן די טעקע $1.',
 'backend-fail-invalidpath' => '$1 איז נישט קיין גילטיקער שפייכלערן שטעג.',
 'backend-fail-delete' => 'קען נישט אויסמעקן טעקע $1.',
@@ -1631,13 +1666,18 @@ $1",
 'backend-fail-writetemp' => 'קען נישט שרײַבן צו צייַטווייַליקער טעקע.',
 'backend-fail-closetemp' => 'קען נישט שליסן צייַטווייַליקע טעקע.',
 'backend-fail-read' => 'קען נישט ליינען טעקע "$1".',
-'backend-fail-create' => 'קע×\9f × ×\99ש×\98 ×©×\90פֿן טעקע "$1".',
+'backend-fail-create' => 'קע×\9f × ×\99ש×\98 ×©×¨×\99×\99×\91ן טעקע "$1".',
 
 # Lock manager
 'lockmanager-notlocked' => 'מ\'קען נישט אויפֿשליסן "$1"; ער איז נישט פֿארשלאסן.',
 
+# ZipDirectoryReader
+'zip-wrong-format' => 'ספעציפירטע טעקע איז נישט קיין ZIP טעקע.',
+
 # Special:UploadStash
 'uploadstash' => 'אַרויפֿלאָד רעזערוו',
+'uploadstash-clear' => 'אויסמעקן טעקעס פון זאפאס',
+'uploadstash-nofiles' => 'איר האט נישט קיין טעקעס אין זאפאס.',
 'uploadstash-refresh' => 'דערפֿרישן די רשימה פון טעקעס',
 
 # img_auth script messages
@@ -1652,6 +1692,8 @@ $1",
 
 # HTTP errors
 'http-invalid-url' => 'אומגילטיג URL: $1',
+'http-invalid-scheme' => 'URL אדרעסן מיט דער "$1" סכעמע ווערן נישט געשטיצט.',
+'http-request-error' => 'HTTP בקשה דורכגעפאלן צוליב אומבאוואוסטער פעלער.',
 'http-read-error' => 'HTTP לייענען גרײַז.',
 'http-timed-out' => 'HTTP בקשה אויסגעגאַנגען.',
 'http-curl-error' => 'גרײַז בײַם ברענגען URL: $1',
@@ -1845,6 +1887,7 @@ $1",
 'mostimages' => 'מערסט פֿארבונדענע טעקעס',
 'mostrevisions' => 'אַרטיקלען מיט די מערסטע באַאַרבעטונגען',
 'prefixindex' => 'פּרעפֿיקס אינדעקס',
+'prefixindex-namespace' => 'אלע בלעטער מיט פרעפֿיקס ($1 נאמענטייל)',
 'shortpages' => 'קורצע בלעטער',
 'longpages' => 'לאנגע בלעטער',
 'deadendpages' => 'בלינדע בלעטער',
@@ -1912,6 +1955,11 @@ $1",
 'allpagesprefix' => 'בלעטער וואס זייער נאמען הייבט זיך אן מיט…:',
 'allpagesbadtitle' => 'דער אײַנגעגעבענער נאָמען איז אומגילטיק: לײדיק, אַנטהאַלט אינטערװיקי. עס איז מעגליך אז ער אנטהאלט אותיות וואס מען קען נישט ניצן אין קעפלעך.',
 'allpages-bad-ns' => '{{SITENAME}} האט נישט קיין נאָמענטייל "$1".',
+'allpages-hide-redirects' => 'פֿארהיילן ווייטערפֿירונגען',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'איר באקוקט א ווערסיע פון דעם בלאט פונעם זאפאס, וואס קען אבער זיין  פֿארעלטערט ביז $1.',
+'cachedspecial-refresh-now' => 'באקוקן די לעצטע.',
 
 # Special:Categories
 'categories' => 'קאַטעגאָריעס',
@@ -2006,6 +2054,7 @@ $1",
 # User Messenger
 'usermessage-summary' => 'איבערלאזן סיסטעם אָנזאָג',
 'usermessage-editor' => 'סיסטעם שליח',
+'usermessage-template' => 'MediaWiki:באניצער־מעלדונג',
 
 # Watchlist
 'watchlist' => 'מיין אויפפַּאסונג ליסטע',
@@ -2046,12 +2095,12 @@ $1",
 'watcherrortext' => 'א גרײַז האט פאסירט ביים ענדערן אײַערע אויפֿפאסן ליסטע אײַנשטעלונגען פֿאר "$1".',
 
 'enotif_mailer' => 'נאטיפאקאציע שיקער {{SITENAME}}',
-'enotif_reset' => 'באַצייכן אלע בלעטער שוין געזען',
+'enotif_reset' => '×\91×\90ַצ×\99×\99×\9b×¢× ×¢×\9f ×\90×\9c×¢ ×\91×\9c×¢×\98ער ×©×\95×\99×\9f ×\92×¢×\96×¢×\9f',
 'enotif_newpagetext' => 'דאס איז א נייער בלאט.',
-'enotif_impersonal_salutation' => 'באנוצער {{SITENAME}}',
+'enotif_impersonal_salutation' => '{{SITENAME}} באַניצער',
 'changed' => 'געטוישט',
-'created' => '×\91×\90ש×\90פן',
-'enotif_subject' => 'דער בלאט $PAGETITLE אין {{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED דורך $PAGEEDITOR',
+'created' => '×\92עש×\90ַפֿן',
+'enotif_subject' => 'דער בלאט $PAGETITLE אין {{SITENAME}} $CHANGEDORCREATED דורך $PAGEEDITOR',
 'enotif_lastvisited' => 'זעט $1 פֿאַר אלע ענדערונגען זינט אײַער לעצטן וויזיט.',
 'enotif_lastdiff' => 'זעט $1 פאר דער ענדערונג.',
 'enotif_anon_editor' => 'אַנאנימער באַניצער $1',
@@ -2086,7 +2135,7 @@ $UNWATCHURL
 'deletepage' => 'מעק אויס בלאט',
 'confirm' => 'באַשטעטיגן',
 'excontent' => 'אינהאלט געווען: "$1"',
-'excontentauthor' => "×\90×\99× ×\94×\90×\9c×\98 ×\92×¢×\95×\95×¢×\9f: '$1' (×\90×\95×\9f ×\93ער ×\90×\99×\99נצ×\99×\92ס×\98ער ×\91×\90ר×\91×\99×\99טער איז געווען '[[Special:Contributions/$2|$2]]')",
+'excontentauthor' => "×\90×\99× ×\94×\90×\9c×\98 ×\92×¢×\95×\95×¢×\9f: '$1' (×\90×\95×\9f ×\93ער ×\90×\99×\99נצ×\99×\92ס×\98ער ×\91×\90×\90ר×\91×¢טער איז געווען '[[Special:Contributions/$2|$2]]')",
 'exbeforeblank' => 'אינהאַלט בעפֿאַרן אויסליידיגן איז געווען: "$1"',
 'exblank' => 'בלאט איז געווען ליידיג',
 'delete-confirm' => 'אויסמעקן $1',
@@ -2142,6 +2191,7 @@ $UNWATCHURL
 'unprotectedarticle' => 'אראפגענומען שוץ פון "[[$1]] "',
 'movedarticleprotection' => 'באוועגט די שיץ באשטימונגען פֿון "[[$2]]" אויף "[[$1]]"',
 'protect-title' => 'ענדערן שיץ ניווא פֿאַר "$1"',
+'protect-title-notallowed' => 'באקוקן שיץ־ניווא פון "$1"',
 'prot_1movedto2' => '[[$1]] אריבערגעפירט צו [[$2]]',
 'protect-badnamespace-title' => 'אומשיצבארער נאמענטייל',
 'protect-badnamespace-text' => 'בלעטער אין דעם נאמענטייל קען מען נישט שיצן.',
@@ -2242,6 +2292,7 @@ $UNWATCHURL
 $1',
 'undelete-show-file-confirm' => 'צי זענט איר זעכער איר ווילט באַקוקן די אויסגעמעקטע רעוויזיע פון דער טעקע "<nowiki>$1</nowiki>" פון $2 בשעה $3?',
 'undelete-show-file-submit' => 'יא',
+'undelete-revisionrow' => '$1 $2 $3 $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'נאמענטייל:',
@@ -2345,14 +2396,17 @@ $1',
 'blockipsuccesstext' => 'באַניצער [[Special:Contributions/$1|$1]] <br />איז פֿאַרשפאַרט.
 זעט די [[Special:BlockList|ליסטע פון בלאקירטע באַניצער]] כדי צו זען די בלאקירונגען.',
 'ipb-blockingself' => 'איר האַלט בײַ בלאקירן זיך אַליין! איר ווילט דאָס טאַקע טון?',
+'ipb-confirmhideuser' => 'איר האלט ביי בלאקירן א באניצער וואס האט "באהאלטן באניצער" סטאטוס. דאס וועט פארשטעקן דעם באניצערס נאמען אין אלע ליסטעס און לאגביכער. צי זענט איר זיכער אז איר ווילט דאס טאקע טון?',
 'ipb-edit-dropdown' => 'רעדאקטיר בלאקירונג סיבות',
 'ipb-unblock-addr' => 'אויפֿבלאקירן $1',
 'ipb-unblock' => 'אויפֿבלאקירן א באַניצער נאמען אדער IP אדרעס',
 'ipb-blocklist' => 'זעט עקזיסטירנדע בלאקירונגען',
 'ipb-blocklist-contribs' => 'בײַשטײַערונגען פֿון $1',
 'unblockip' => 'אויפֿבלאקירן באניצער',
+'unblockiptext' => 'מיט דעם פארמולאר קענט איר צוריקשטעלן שרייבן ערלויבניש צו אן IP אדרעס אדער באניצער נאמען וואס איז געווען בלאקירט.',
 'ipusubmit' => 'אוועקנעמען דעם בלאק',
 'unblocked' => '[[User:$1|$1]] איז געווארן באַפֿרייט פון זײַן בלאק',
+'unblocked-range' => '$1 איז באפרייט פון בלאקירן',
 'unblocked-id' => 'בלאק $1 איז געווארן אַראָפגענומען.',
 'blocklist' => 'בלאקירטע באַניצער',
 'ipblocklist' => 'בלאקירטע באַניצער',
@@ -2391,8 +2445,9 @@ $1',
 דער פֿאַרשטיקונג לאג איז צוגעשטעלט אונטן:',
 'blocklogentry' => 'בלאקירט "[[$1]]" אויף אַ תקופה פון $2 $3',
 'reblock-logentry' => 'גענדערט די בלאקירונג דעפיניציעס פון [[$1]] מיטן צייט אפלויף פון $2 $3',
-'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצערס. איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
-זעט די איצטיגע [[Special:BlockList|ליסטע פון בלאקירטע באניצערס]].',
+'blocklogtext' => 'דאס איז א לאג בוך פון אלע בלאקירונגען און באפרייונגען פֿון באניצער. 
+איי פי אדרעסן וואס זענען בלאקירט אויטאמאטיש ווערן נישט אויסגערעכענט דא.
+זעט די איצטיקע [[Special:BlockList|ליסטע פון בלאקירטע באניצער]].',
 'unblocklogentry' => 'אומבלאקירט $1',
 'block-log-flags-anononly' => 'בלויז אַנאנימע באַניצער',
 'block-log-flags-nocreate' => 'קאָנטע שאַפֿן איז פֿאַרשפּאַרט',
@@ -2420,6 +2475,7 @@ $1',
 'proxyblocker-disabled' => 'די  פֿונקציע איז אומאַקטיווירט.',
 'proxyblockreason' => 'אייער איי.פי. אדרעס איז געווארן געבלאקט צוליב דעם ווייל דאס איז א אפענער פראקסי. ביטע פארבינדט זיך מיט אייער אינטערנעט סערוויס פראוויידער אדער טעקס סאפארט צו אינפארמירן זיי איבער דעם ערענסטן זיכערהייט פראבלעם.',
 'proxyblocksuccess' => 'געטאן.',
+'cant-block-while-blocked' => 'איר קען נישט בלאקירן קיין אנדערע באניצער ווען איר זענט אליין בלאקירט.',
 'ipbnounblockself' => 'איר זענט נישט ערלויבט זיך אליין אויסבלאקירן',
 
 # Developer tools
@@ -2431,6 +2487,7 @@ $1',
 'unlockbtn' => 'אויפֿשליסן די דאַטנבאַזע',
 'locknoconfirm' => 'איר האט נישט אָנגעצייכנט דאָס באַשטעטיקונג קעסטל.',
 'lockdbsuccesssub' => 'דאַטנבאַזע פֿאַרשפאַרט מיט הצלחה',
+'unlockdbsuccesssub' => 'דאטנבאזע שלאס אראפגענומען',
 'unlockdbsuccesstext' => 'די דאַטנבאַזע איז געווארן אויפֿגעשלאסן',
 'databasenotlocked' => 'די דאַטנבאַזע איז נישט פֿאַרשלאסן.',
 'lockedbyandtime' => '(דורך $1 אום $2 בײַ $3)',
@@ -2469,6 +2526,7 @@ $1',
 
 אין די פֿעלער, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
 'movearticle' => 'באוועג בלאט:',
+'moveuserpage-warning' => "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
 'movenologin' => 'איר זענט נישט אַריינלאָגירט',
 'movenologintext' => 'איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.',
 'movenotallowed' => 'איר זענט נישט דערלויבט צו באוועגן בלעטער.',
@@ -2572,6 +2630,7 @@ $1',
 'thumbnail_invalid_params' => 'אומגילטיגע קליינבילד פאראמעטערס',
 'thumbnail_dest_directory' => "מ'קען נישט שאפֿן דעם ציל קארטאטעק",
 'thumbnail_image-type' => 'בילד טיפ נישט געשטיצט',
+'thumbnail_gd-library' => 'אומפולשטענדיקע קאנפיגוראציע פאר דער GD-ביבליאטעק: פונקציע $1 פעלט',
 'thumbnail_image-missing' => 'טעקע פֿעלט אייגנטלעך: $1',
 
 # Special:Import
@@ -2598,7 +2657,7 @@ $1',
 'importbadinterwiki' => 'שלעכטע אינטערוויקי לינק',
 'importnotext' => 'ליידיג אדער נישט קיין טעקסט',
 'importsuccess' => '!אימפארט אדורכגעפירט מיט דערפאלג!',
-'importhistoryconflict' => 'ק×\90נפ×\9c×\99ק×\98×\99× ×\92 ×\94×\99ס×\98×\90ר×\99×¢ ×¨×¢×\95×\95×\99×\96×\99×¢ ×¢×§×\96עס×\98×\99ר×\98 (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×©×\95×\99×\9f ×¤×\95ן פריער)',
+'importhistoryconflict' => 'פ×\90ר×\90×\9f ×\90 ×§×\90נפ×\9c×\99ק×\98 ×\9e×\99×\98 ×\93ער ×¢×§×\96×\99ס×\98×\99רנ×\93×¢ ×\94×\99ס×\98×\90ר×\99×¢ ×¨×¢×\95×\95×\99×\96×\99×¢ (×\9e×¢×\92×\9c×\99×\9a ×\90×\96 ×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92×¢×\95×\95×\90ר×\9f ×\90×\99×\9eפ×\90ר×\98×\99ר×\98 ×©×\95×\99ן פריער)',
 'importnosources' => 'קיין מקורות פֿאַר צווישן־וויקי אימפארט, און דירעקט היסטאריע אַרויפֿלאָדן איז נישט דערמעגלעכט אַצינד.',
 'importnofile' => 'קיין אימפארט טעקע איז נישט ארויפֿגעלאדן.',
 'importuploaderrorsize' => 'אַרויפֿלאָדן פֿון אימפארט טעקע דורכגעפֿאלן.
@@ -2615,15 +2674,28 @@ $1',
 'import-token-mismatch' => 'אָנווער פון סעסיע דאַטן. 
  ביטע פרובירט נאכאמאל.',
 '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
-'importlogpage' => 'אימפארט לאג',
+'importlogpage' => 'אימפארט לאגבוך',
 'importlogpagetext' => 'אַדמיניסטראַטיווער אימפארט פון בלעטער מיט רעדאַגירן היסטאריע פֿון ​​אַנדערע וויקיס.',
 'import-logentry-upload' => 'האט אימפארטירט [[$1]] דורך טעקע אַרויפֿלאָדן',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}}',
 'import-logentry-interwiki' => 'אריבערגעוויקיט $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|רעוויזיע|רעוויזיעס}} פֿון $2',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript טעסט',
+'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
+'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
+'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
+'javascripttest-qunit-intro' => 'זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.',
+'javascripttest-qunit-heading' => 'מעדיעוויקי JavaScript QUnit קאנטראל־פראגראם',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'אייער באניצער בלאט',
 'tooltip-pt-anonuserpage' => 'באַניצער בלאַט פון דעם IP אַדרעס',
@@ -2678,12 +2750,14 @@ $1',
 'tooltip-ca-nstab-template' => 'זעט דעם מוסטער',
 'tooltip-ca-nstab-help' => 'זעט דעם הילף בלאַט',
 'tooltip-ca-nstab-category' => 'באקוקט דעם קאטעגאריע בלאט',
-'tooltip-minoredit' => 'באצייכן דאס אלס מינערדיגע ענדערונג',
-'tooltip-save' => '×\94×\99×\98 ×\90×\95×\99×£ אייערע ענדערונגען',
+'tooltip-minoredit' => '×\91×\90צ×\99×\99×\9b×¢× ×¢×\9f ×\93×\90ס ×\90×\9cס ×\9e×\99נער×\93×\99×\92×¢ ×¢× ×\93ער×\95× ×\92',
+'tooltip-save' => '×\90×\95×\99פֿ×\94×\99×\98×\9f אייערע ענדערונגען',
 'tooltip-preview' => 'פֿארויסדיגע ווײַזונג, זײַט אזוי גוט באניצט די געלעגנהייט פֿארן אויפֿהיטן!',
 'tooltip-diff' => 'ווײַזן אייערע ענדערונגען צום טעקסט',
 'tooltip-compareselectedversions' => 'פארגלײַכם די צוויי ווערסיעס פון דעם בלאט',
 'tooltip-watch' => 'לייגט צו דעם בלאט צו אייער אויפֿפאסונג ליסטע',
+'tooltip-watchlistedit-normal-submit' => 'אַראָפנעמען בלעטער',
+'tooltip-watchlistedit-raw-submit' => 'דערהיינטיגן אויפפאסונג ליסטע',
 'tooltip-recreate' => 'ווידערשאַפֿן דעם בלאַט כאטש ער איז אַמאל אויסגעמעקט',
 'tooltip-upload' => 'הייב אן אויפלאדן',
 'tooltip-rollback' => '"צוריקדרייען" דרײט צוריק רעדאַקטירונג(ען) צו דעם בלאַט פֿונעם לעצטן בײַשטײַערער מיט אײן קװעטש',
@@ -2693,8 +2767,15 @@ $1',
 
 # Stylesheets
 'common.css' => '/* CSS געשריבן דא וועט אפילירן און באיינפלוסן אלע סקינס */',
-'monobook.css' => '/* סטייל דא געלייגט וועט באיינפלוסן די בעקגראונד Monobook בלויז */',
-'vector.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן Vector סקין */',
+'standard.css' => '/* CSS געשטעלט דא ווירקט אויפן סטאנדארט סקין */',
+'nostalgia.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן נאסטאלגיע סקין */',
+'cologneblue.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן קעלנישן־בלוי סקין */',
+'monobook.css' => '/* סטייל דא געלייגט וועט באאיינפלוסן דעם Monobook סקין */',
+'myskin.css' => '/* CSS געשטעלט דא ווירקט אויפן MySkin סקין */',
+'chick.css' => '/* CSS געשטעלט דא ווירקט אויפן טשיק סקין */',
+'simple.css' => '/* CSS געשטעלט דא ווירקט אויפן איינפאך סקין */',
+'modern.css' => '/* CSS געשטעלט דא ווירקט אויפן מאדערנעם סקין */',
+'vector.css' => '/* CSS געשטעלט דא ווירקט נאר אויפן וועקטאר סקין */',
 
 # Scripts
 'common.js' => '/* אלע סקריפטן פון JavaScript דא געשריבן וועט לויפן פאר אלע באנוצער ווען זיי וועלן לאדירן דעם בלאט */',
@@ -2712,6 +2793,7 @@ $1',
 'siteusers' => '{{PLURAL:$2|באַניצער| באַניצערס}} {{SITENAME}} $1',
 'anonusers' => '{{SITENAME}} {{PLURAL:$2| אַנאנימער באַניצער|אַנאנימע באַניצער}} $1',
 'creditspage' => 'בלאט קרעדיטס',
+'nocredits' => 'נישט פאראן קיין אינפארמאציע פאר דעם בלאט.',
 
 # Spam protection
 'spamprotectiontitle' => 'ספעם באשיצונג פילטער',
@@ -2731,11 +2813,22 @@ $1',
 'pageinfo-views' => 'צאַל קוקן',
 'pageinfo-viewsperedit' => 'צאל קוקן צו א רעדאַקטירונג',
 
+# Skin names
+'skinname-standard' => 'קלאסיש',
+'skinname-nostalgia' => 'נאסטאלגיע',
+'skinname-cologneblue' => 'קעלניש בלוי',
+'skinname-monobook' => 'מאנאבוק',
+'skinname-myskin' => 'מיין סקין',
+'skinname-chick' => 'טשיק',
+'skinname-simple' => 'איינפֿאַך',
+'skinname-modern' => 'מאדערן',
+'skinname-vector' => 'וועקטאר',
+
 # Patrolling
-'markaspatrolleddiff' => 'באצייכנען אלס פאטראלירט',
-'markaspatrolledtext' => 'באצייכנען בלאט אלס פאטראלירט',
+'markaspatrolleddiff' => '×\91×\90צ×\99×\99×\9b×¢× ×¢×\9f ×\90×\9cס ×¤×\90×\98ר×\90×\9c×\99ר×\98',
+'markaspatrolledtext' => '×\91×\90צ×\99×\99×\9b×¢× ×¢×\9f ×\91×\9c×\90×\98 ×\90×\9cס ×¤×\90×\98ר×\90×\9c×\99ר×\98',
 'markedaspatrolled' => 'באצייכנט אלס פאטראלירט',
-'markedaspatrolledtext' => '×\93×\99 ×\90×\95×\99ס×\92עק×\9c×\99×\91×¢× ×¢ ×¢× ×\93ער×\95× ×\92 ×¤Ö¿×\95×\9f [[:$1]] ×\90×\99×\96 ×\92עצ×\99×\99×\9b× ×\98 ×\92×¢×\95×\95×\90ר×\9f ×\90לס פאַטארלירט.',
+'markedaspatrolledtext' => '×\93×\99 ×\90×\95×\99ס×\92עק×\9c×\99×\91×¢× ×¢ ×¢× ×\93ער×\95× ×\92 ×¤Ö¿×\95×\9f [[:$1]] ×\90×\99×\96 ×\91×\90ַצ×\99×\99×\9b× ×\98 ×\92×¢×\95×\95×\90ר×\9f ×\90Ö·לס פאַטארלירט.',
 'rcpatroldisabled' => 'פאַטראלירן ענדערונגען איז  מבוטל געווארן',
 'rcpatroldisabledtext' => 'די לעצטע ענדערונגען פאַטראלירן אייגנקייט איז אצינד בטל.',
 'markedaspatrollederror' => 'נישט מעגלעך צו צייכענען אלס פאַטראלירט',
@@ -2763,12 +2856,17 @@ $1',
 'nextdiff' => 'קומענדיקע ווערסיע ←',
 
 # Media information
+'thumbsize' => 'קליינבילד גרייס:',
+'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, {{PLURAL:$3|איין בלאט|$3 בלעטער}}',
 'file-info' => 'טעקע גרייס: $1, MIME טיפ: $2',
 'file-info-size' => '$1 × $2 פיקסעל, טעקע גרייס: $3, טיפ MIME: $4',
-'file-nohires' => 'נישטא מיט א העכערע רעזאלוציע.',
+'file-info-size-pages' => '$1 × $2 פיקסעלן, טעקע גרייס: $3, MIME טיפ: $4,  $5 {{PLURAL:$5|בלאט|בלעטער}}',
+'file-nohires' => 'נישטא מיט א העכערער רעזאלוציע.',
 'svg-long-desc' => 'טעקע SVG, נאמינעל: $1 × $2 פיקסעלן, טעקע גרייס: $3',
 'show-big-image' => 'בילד מיט דער גרעסטער רעזאלוציע',
+'show-big-image-preview' => 'גרייס פון דעם פארויסקוק: $1.',
+'show-big-image-other' => '{{PLURAL:$2|אנדער רעזאלוציע|אנדערע רעזאלוציעס}}: $1.',
 'show-big-image-size' => '$1 × $2 פיקצעלן',
 'file-info-gif-looped' => 'אין א פעטליע',
 'file-info-gif-frames' => '$1 {{PLURAL:$1| ראַם | ראָמען}}',
@@ -2789,6 +2887,9 @@ $1',
 'sp-newimages-showfrom' => 'באַװײַזן נײַע טעקעס פון $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'video-dims' => '$1, $2 × $3',
+'seconds-abbrev' => '$1ס',
+'minutes-abbrev' => '$1מ',
 'seconds' => '{{PLURAL:$1|$1 סעקונדע|$1 סעקונדעס}}',
 'minutes' => '{{PLURAL:$1|$1 מינוט|$1 מינוט}}',
 'hours' => '{{PLURAL:$1|$1 שעה|$1 שעה}}',
@@ -2874,24 +2975,34 @@ $1',
 'exif-focallength-format' => '$1 מ"מ',
 'exif-subjectarea' => 'סוביעקט געגנט',
 'exif-flashenergy' => 'פלעש ענערגיע',
-'exif-focalplanexresolution' => 'פאקאל פלעין עקס רעזאלוציע',
-'exif-focalplaneresolutionunit' => 'פאקאל פלעין רעזאלוציע מאס',
-'exif-exposureindex' => 'עקספאוזשער אינדעקס',
+'exif-focalplanexresolution' => 'פאקוס־שטח האריזאנטאל',
+'exif-focalplaneyresolution' => 'פאקוס־שטח ווערטיקאל',
+'exif-focalplaneresolutionunit' => 'פאקוס־שטח רעזאלוציע איינהייט',
+'exif-subjectlocation' => 'סוביעקט ארט',
+'exif-exposureindex' => 'באַלײַכטן אינדעקס',
+'exif-sensingmethod' => 'דערשפירן מעטאד',
 'exif-filesource' => 'מקור פֿון דער טעקע',
 'exif-scenetype' => 'סצענע טיפ',
 'exif-customrendered' => 'קאסטעם בילד פראצעסירונג',
 'exif-exposuremode' => 'באַלײַכטן מצב',
-'exif-digitalzoomratio' => 'דיזשיטאלער זום ראשיאו',
+'exif-whitebalance' => 'ווײַס באַלאַנס',
+'exif-digitalzoomratio' => 'דיגיטאלער זום פארהעלטעניש',
 'exif-focallengthin35mmfilm' => 'פאקאל לענג אין 35 מ"מ פילם',
+'exif-scenecapturetype' => 'סצענע אויפנעם טיפ',
 'exif-gaincontrol' => 'סצענע קאנטראל',
 'exif-contrast' => 'קאנטראסט',
 'exif-devicesettingdescription' => 'זאך סעטינגס אראפמאלונג',
-'exif-gpslatitude' => 'לאטיטוד',
+'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
+'exif-gpslatitude' => 'גארטל־ליניע',
 'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
 'exif-gpslongitude' => 'געאגראַפֿישע לענג',
 'exif-gpsaltituderef' => 'אלטיטוט רעפערענץ',
-'exif-gpsaltitude' => 'אלטיטוט',
+'exif-gpsaltitude' => 'הייך',
+'exif-gpstimestamp' => 'GPS צייט (אטאם־זייגער)',
+'exif-gpssatellites' => 'סאטעליטן געניצט פאר מעסטן',
 'exif-gpsdop' => 'מאס פוקנטליכקייט',
+'exif-gpsspeedref' => 'גיך איינהייט',
+'exif-gpsspeed' => 'גיך פון GPS־אויפֿנעמער',
 'exif-gpsimgdirectionref' => 'רעפערענץ פאר ריכטונג פון בילד',
 'exif-gpsimgdirection' => 'ריכטונג פון בילד',
 'exif-gpsdestlatituderef' => 'רעפֿערענץ פֿאַר ברייט־ליניע פון ציל',
@@ -2902,14 +3013,21 @@ $1',
 'exif-gpsdestbearing' => 'ריכטונג פֿון ציל',
 'exif-gpsdestdistanceref' => 'רעפֿערענץ פֿאַר ווײַטקייט פֿון ציל',
 'exif-gpsdestdistance' => 'ווײַטקייט צום ציל',
+'exif-gpsprocessingmethod' => 'נאמען פון GPS פראצעסירן מעטאד',
 'exif-gpsareainformation' => 'נאמען פון GPS געגענט',
-'exif-gpsdatestamp' => 'דאטום GPS',
-'exif-gpsdifferential' => 'דיפראנציאלע קאקרעקציע GPS',
+'exif-gpsdatestamp' => 'GPS דאטע',
+'exif-gpsdifferential' => 'GPS דיפראנציאלע קאקרעקציע',
+'exif-jpegfilecomment' => 'JPEG טעקע הערה',
+'exif-keywords' => 'שליסלווערטער',
+'exif-worldregioncreated' => "וועלטראיאן וואו מ'האט גענומען דאס בילד",
+'exif-countrycreated' => "לאנד וואו מ'האט געמאכט דאס בילד",
 'exif-provinceorstatecreated' => "פראווינץ אדער שטאַט וואו מ'האט גענומען דאס בילד",
-'exif-citycreated' => "שטאַט וואו מ'האט געמאכט דאס בילד",
+'exif-citycreated' => "שטאָט וואו מ'האט געמאכט דאס בילד",
+'exif-worldregiondest' => 'וועלטראיאן געוויזן',
 'exif-countrydest' => 'לאנד געוויזן',
 'exif-countrycodedest' => 'קאד פאר לאנד געוויזן',
-'exif-citydest' => 'געוויזענע שטאט',
+'exif-provinceorstatedest' => 'פראווינץ אדער שטאַט געוויזן',
+'exif-citydest' => 'געוויזענע שטָאט',
 'exif-objectname' => 'קורצער טיטל',
 'exif-source' => 'מקור',
 'exif-editstatus' => 'רעדאקציאנעלער סטאטוס פון בילד',
@@ -2920,18 +3038,27 @@ $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' => 'ניץ באַדינגונג',
 'exif-licenseurl' => 'URL פֿאר קאפירעכט ליצענץ',
 'exif-morepermissionsurl' => 'אלטערנאטיווע ליצענצירן אינפארמאציע',
 'exif-pngfilecomment' => 'PNG טעקע הערה',
+'exif-contentwarning' => 'אינהאלט ווארענונג',
 'exif-giffilecomment' => 'GIF טעקע הערה',
+'exif-intellectualgenre' => 'ארט  איינהייט',
 'exif-subjectnewscode' => 'טעמע קאד',
 
 # EXIF attributes
@@ -3001,7 +3128,7 @@ $1',
 
 'exif-contrast-0' => 'נארמאל',
 'exif-contrast-1' => 'ווייך',
-'exif-contrast-2' => 'הארט',
+'exif-contrast-2' => 'האַרט',
 
 'exif-saturation-0' => 'נארמאַל',
 
@@ -3019,6 +3146,10 @@ $1',
 'exif-gpslongitude-e' => 'מזרח לענג',
 'exif-gpslongitude-w' => 'מערב לענג',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|ngמעטער|מעטער}} איבערן ים־שפיגלl',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|מעטער|מעטער}} אונטערן ים־שפיגל',
+
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'ק"מ אין א שעה',
 'exif-gpsspeed-m' => 'מייל פער שעה',
@@ -3164,6 +3295,12 @@ $5
 'confirm_purge_button' => 'אויספֿירן',
 'confirm-purge-top' => 'אויסקלארן די קאשעי פון דעם בלאט?',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'יאָ',
+'confirm-watch-top' => 'צולייגן דעם בלאט צו אייער אויפֿפאסונג ליסטע?',
+'confirm-unwatch-button' => 'יאָ',
+'confirm-unwatch-top' => 'אראפנעמען דעם בלאט פון אייער אויפפאסונג ליסטע?',
+
 # Multipage image navigation
 'imgmultipageprev' => '→ פֿריערדיגער בלאַט',
 'imgmultipagenext' => 'צום קומענדיגן בלאט ←',
@@ -3198,6 +3335,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' => 'טיטלען:',
@@ -3225,8 +3363,27 @@ $5
 'iranian-calendar-m11' => 'באַהמאַן',
 'iranian-calendar-m12' => 'עספֿאַנד',
 
+# Hijri month names
+'hijri-calendar-m9' => 'ראמאדאן',
+'hijri-calendar-m10' => 'שאוואל',
+'hijri-calendar-m11' => 'דהו אל־קאדא',
+'hijri-calendar-m12' => 'דהו אל־הידזשא',
+
 # Hebrew month names
+'hebrew-calendar-m1' => 'תשרי',
+'hebrew-calendar-m2' => 'חשוון',
+'hebrew-calendar-m3' => 'כסלו',
+'hebrew-calendar-m4' => 'טבת',
+'hebrew-calendar-m5' => 'שבט',
+'hebrew-calendar-m6' => 'אדר',
+'hebrew-calendar-m6a' => "אדר א'",
+'hebrew-calendar-m6b' => "אדר ב'",
+'hebrew-calendar-m7' => 'ניסן',
+'hebrew-calendar-m8' => 'אייר',
 'hebrew-calendar-m9' => 'סיון',
+'hebrew-calendar-m10' => 'תמוז',
+'hebrew-calendar-m11' => 'אב',
+'hebrew-calendar-m12' => 'אלול',
 'hebrew-calendar-m1-gen' => 'תשרי',
 'hebrew-calendar-m2-gen' => 'חשוון',
 'hebrew-calendar-m3-gen' => 'כסלו',
@@ -3249,6 +3406,7 @@ $5
 'version' => 'ווערסיע',
 'version-specialpages' => 'ספעציעלע בלעטער',
 'version-variables' => 'וואַריאַבלען',
+'version-skins' => 'באניצער־אייבערפלאכן',
 'version-other' => 'אנדער',
 'version-version' => '(ווערסיע $1)',
 'version-license' => 'ליצענץ',
@@ -3256,6 +3414,7 @@ $5
 'version-software' => 'אינסטאַלירט ווייכוואַרג',
 'version-software-product' => 'פראדוקט',
 'version-software-version' => 'ווערסיע',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'טעקע שטעג',
@@ -3434,4 +3593,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 5caf171..9fe1f99 100644 (file)
@@ -214,7 +214,7 @@ $messages = array(
 'vector-view-create' => "Ṣ'èdá",
 'vector-view-edit' => 'Àtúnṣe',
 'vector-view-history' => 'Wo ìtàn',
-'vector-view-view' => 'kà',
+'vector-view-view' => 'Àwòkà',
 'vector-view-viewsource' => 'Wo àmìọ̀rọ̀',
 'actions' => 'Àwọn ìgbéṣe',
 'namespaces' => 'Àwọn orúkọàyè',
@@ -271,7 +271,7 @@ $messages = array(
 'redirectpagesub' => 'Ojúewé àtúnjúwe',
 'lastmodifiedat' => 'Àtunṣe ojúewé yi gbẹ̀yìn wáyé ni ago $2, ọjọ́ọdún $1.',
 'viewcount' => 'A ti wo ojúewé yi ni {{PLURAL:$1|ẹ̀kan péré|iye ìgbà $1}}.',
-'protectedpage' => 'Ojúewé ajẹ́dídáàbòbò',
+'protectedpage' => 'Ojúewé oníàbò',
 'jumpto' => 'Lọ sí:',
 'jumptonavigation' => 'atọ́ka',
 'jumptosearch' => 'àwárí',
@@ -438,7 +438,7 @@ Fún ìyédèpadà, ẹ jọ̀wọ́ ẹ lo [//translatewiki.net/wiki/Main_Page?
 'customcssprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé CSS yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
 'customjsprotected' => 'Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe ojúewé JavaScript yìí nítorípé ó ní àwọn ìtòjọ oníṣe ẹlòmíràn.',
 'ns-specialprotected' => 'Àtúnṣe kò ṣe é ṣe sí àwọn ojúewé pàtàkì.',
-'titleprotected' => "[[User:$1|$1]] ti dínà sí dídá Ã ká»\8dlé yìí. Ã\80làyé rẹÌ\80 ni pí ''$2''.",
+'titleprotected' => "[[User:$1|$1]] ti dínà sí dídá Ã ká»\8dlé yìí. Ã\8cdí rẹÌ\80 ni pé ''$2''.",
 
 # Virus scanner
 'virus-badscanner' => "Ìtorapọ̀ búburú: awáìpasẹ̀ èràn aláìmọ̀n : ''$1''",
@@ -466,8 +466,8 @@ A ti ṣ'èdá àpamọ́ yín.
 'loginprompt' => 'Ẹ gbọ́dọ̀ jọ̀wọ́ cookies láti wọlé sí {{SITENAME}}.',
 'userlogin' => 'Ìwọlé / ìforúkọ sílẹ̀',
 'userloginnocreate' => 'Ìwọlé',
-'logout' => 'Ìbọ́sóde',
-'userlogout' => 'Ìbọ́sóde',
+'logout' => 'Ìde',
+'userlogout' => 'Ìde',
 'notloggedin' => "Ẹ kò tí w'ọlé",
 'nologin' => "Ṣé ẹ fẹ́ wọlé? '''$1'''.",
 'nologinlink' => 'Ìforúkọsílẹ̀',
@@ -737,6 +737,7 @@ Tó bá jẹ́ pé oníṣe aláìlórúkọ ni yín, tí ẹ sì ri pé wọ́n
 'note' => "'''Àkíyèsí:'''",
 'previewnote' => "'''Ẹ rántí pé àyẹ̀wò lásán nì yí.'''
 Àwọn àtúnṣe yín kò tíì jẹ́ kìkópamọ́!",
+'continue-editing' => 'Ìtẹ̀síwájú àtúnṣe',
 'previewconflict' => 'Àkọ́wò yìí jẹ́ bí ìkọ̀rọ̀ inú àlà ìtúnṣe ìkọ̀rọ̀ òkè yíò ṣe hàn tí ẹ bá yàn láti ṣàmúpamọ́.',
 'session_fail_preview' => "'''Àforíjìn! A kò le gbésẹ̀ àtúnṣe yín nítorí ìpòfo data ìsinsìyí.
 Ẹ jọ̀wọ́ ẹ gbìyànjú lẹ́ẹ̀kan si.
@@ -752,6 +753,7 @@ Tí kò bá ṣiṣẹ́ síbẹ̀, ẹ gbìyànjú láti [[Special:UserLogout|j
 Èyí únsábà ṣẹlẹ̀ nígbàtí ẹ bá únlo ẹ̀rọ-ìwọ̀fà ẹlòmíràn aláìlórúkọ torí Internet tí kò dára.",
 'edit_form_incomplete' => "'''Àwọn apá kan fọ́ọ̀mù àtúnṣe kò dé ọ̀dọ̀ ẹ̀rọ-ìwọ̀fà; ẹ wo àtúnṣe yín pẹ́ o wà bí ẹ ṣe ṣé kí ẹ tó tún gbìyànjú lẹ́ẹ̀kan síi.'''",
 'editing' => 'Àtúnṣe sí $1',
+'creating' => 'Ìdá $1',
 'editingsection' => 'Àtúnṣe sí $1 (abala)',
 'editingcomment' => 'Àtúnṣe sí $1 (abala tuntun)',
 'editconflict' => 'Ìtakora àtúnṣe: $1',
@@ -975,7 +977,7 @@ Kò ṣe é bòmọ́lẹ̀.',
 # Suppression log
 'suppressionlog' => 'Àkọọ́lẹ̀ ìfisílẹ̀',
 'suppressionlogtext' => 'Nísàlẹ̀ ni àtòjọ àwọn ìparẹ́ àti ìdínà tó ní àwọn àkóónú àbòmọ́lẹ̀ sí àwọn olùmójútó.
-Ẹ wo [[Special:BlockList|àtòjọ ìdínà IP]] fún àtòjọ àwọn ìdénà àti ìdínà ìgbàyí.',
+Ẹ wo [[Special:BlockList|àtòjọ ìdínà]] fún àtòjọ àwọn ìdénà àti ìdínà ìgbàyí.',
 
 # History merging
 'mergehistory' => 'Ìdàpọ̀ àwọn ìtàn ojúewé',
@@ -1009,7 +1011,8 @@ Kò ṣe é bòmọ́lẹ̀.',
 
 # Diffs
 'history-title' => 'Ìtàn àtúnyẹ̀wò fún "$1"',
-'difference' => '(Ìyàtọ̀ láàrin àwọn àtúnyẹ́wò)',
+'difference-title' => 'Ìyàtọ̀ láàrin àwọn àtúnyẹ̀wò "$1"',
+'difference-title-multipage' => 'Ìyàtọ̀ láàrin àwọn ojúewé "$1" àti "$2"',
 'difference-multipage' => '(Ìyàtọ̀ láàrin àwọn ojúewé)',
 'lineno' => 'Ìlà $1:',
 'compareselectedversions' => 'Ìfiwéra àwọn àtúnṣe ìṣàyàn',
@@ -1106,6 +1109,7 @@ Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 'prefs-beta' => 'Àwọn ìní Beta',
 'prefs-datetime' => 'Ọjọ́ọdún àti àkókò',
 'prefs-labs' => 'Àwọn ìní ibiàdánwò',
+'prefs-user-pages' => 'Àwọn ojúewé oníṣe',
 'prefs-personal' => 'Ọ̀rọ̀ nípa oníṣe',
 'prefs-rc' => 'Àwọn àtúnṣe tuntun',
 'prefs-watchlist' => 'Ìmójútó',
@@ -1268,7 +1272,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'right-movefile' => 'Yípò fáìlì',
 'right-suppressredirect' => 'Mọ́ dàá àwọn àtúnjúwe lati ojúewé orísun nígbà tí ojúewé bá únyípòdà',
 'right-upload' => 'Ìrùsókè àwọn faili',
-'right-reupload' => 'Kọléṣórí fáìlì tó wà yìí',
+'right-reupload' => 'Ìkọṣórí àwọn fáìlì',
 'right-reupload-own' => 'Ìkọsórí àwọn fáìlì tó wà tí wọn jẹ́ rírùsókè lọ́wọ́ araẹni',
 'right-reupload-shared' => 'Ìrékọjá àwọn fáìlì nínú ibi-àkójọ amóhùnmáwòrán àjọpín lábẹ́lé',
 'right-upload_by_url' => 'Ìrùsókè àwọn faili láti URL kan',
@@ -1334,7 +1338,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'action-move-subpages' => 'yípò ojúewé yìí àti àwọn ọmọ ojúewé rẹ̀',
 'action-move-rootuserpages' => 'yípòdà gbọ̀ngàn àwọn ojúewé oníṣe',
 'action-movefile' => 'yípò fáìlì yìí',
-'action-upload' => 'rùsókè fáìlì yìí',
+'action-upload' => 'ìrùsókè fáìlì yìí',
 'action-reupload' => 'kọléṣórí fáìlì tó wà yìí',
 'action-reupload-shared' => 'ṣe ìrékọjá fáìlì yìí nínú ibi-àkójọ àjọpín',
 'action-upload_by_url' => 'rùsókè fáìlí yìí láti URL',
@@ -1364,7 +1368,7 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'nchanges' => '{{PLURAL:$1|àtúnṣe|àwọn àtúnṣe}} $1',
 'recentchanges' => 'Àwọn àtúnṣe tuntun',
 'recentchanges-legend' => 'Àwọn àṣàyàn fún àtúnṣe tuntun',
-'recentchangestext' => 'Ẹ tẹ̀ lé àwọn àtúnṣe tuntun sí wiki lórí ojúewé yìí.',
+'recentchanges-summary' => 'Ẹ tẹ̀ lé àwọn àtúnṣe tuntun sí wiki lórí ojúewé yìí.',
 'recentchanges-feed-description' => 'Ẹ tẹ̀ lé àwọn àtúnṣe àìpẹ́ ọjọ́ sí wiki nínú àkótán feed yìí.',
 'recentchanges-label-newpage' => 'Àtúnṣe yìí dá ojúewé tuntun',
 'recentchanges-label-minor' => 'Àtùnṣe kékeré nìyí',
@@ -1390,9 +1394,11 @@ Tí ẹ bá fisílẹ̀ a ó lòó láti tóka iṣẹ́ yín fún yín.',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|Oníṣe $1|Àwọn oníṣe $1}} ún ṣe ìmójútó]',
 'rc_categories' => 'Òpin sí àwọn ẹ̀ka (pínsọ́tọ̀ pẹ̀lú "|")',
 'rc_categories_any' => 'Èyíkéyìí',
+'rc-change-size-new' => '$1 {{PLURAL:$1|byte|bytes}} lẹ́yìn àtúnṣe',
 'newsectionsummary' => '/* $1 */ abala tuntun',
 'rc-enhanced-expand' => 'Ìfihàn ẹ̀kúnrẹ́rẹ́ (JavaScript pọndandan)',
 'rc-enhanced-hide' => 'Ìfipamọ́ ẹ̀kúnrẹ́rẹ́',
+'rc-old-title' => 'dídá tẹ́lẹ̀tẹ́lẹ̀ bíi "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Àtúnṣe tó báramu',
@@ -1456,7 +1462,7 @@ Láti fí fáìlì pọ̀mọ́ sínú ojúewé kan, ẹ lo àjápọ̀ bíi ìk
 'filetype-missing' => 'Fáìlì yìí kò ní ìfàgùn (fún àpẹrẹ ".jpg").',
 'empty-file' => 'Fáílì tí ẹ fúnsílẹ̀ jẹ́ òfo nínú.',
 'file-too-large' => 'Fáílì tí ẹ fúnsílẹ̀ jẹ́ títóbijù',
-'filename-tooshort' => 'Orúkọ fáílì jẹ́ kíkéréjú.',
+'filename-tooshort' => 'Orúkọ fáílì kéréjú bó ṣe yẹ lọ.',
 'filetype-banned' => 'Irú fáílì yìí ti jẹ́ dídí lọ́nà.',
 'verification-error' => 'Fáìlì yìí kò kọjá ìfidájú fáìlì.',
 'illegal-filename' => 'Orúkọ fáílì yìí kò jẹ́ gbígbàláàyè.',
@@ -1563,7 +1569,7 @@ Tí ìṣòro náà ò bá jáwọ́, ẹ bẹ [[Special:ListUsers/sysop|olùmó
 'backend-fail-writetemp' => 'Kò le kọ sínú fáìlì onígbàdíẹ̀.',
 'backend-fail-closetemp' => 'Kò le de fáìlì onígbàdíẹ̀.',
 'backend-fail-read' => 'Kò le ka fáìlì "$1".',
-'backend-fail-create' => 'Kò le dá fáìlì "$1".',
+'backend-fail-create' => 'Kò le kọ fáìlì $1.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kò le sí àgádágodo "$1" sílẹ̀; kò jẹ́ dídè.',
@@ -2299,7 +2305,7 @@ $1',
 'badipaddress' => 'Àdírẹ́ẹ̀sì IP tíkòtọ́',
 'blockipsuccesssub' => 'Ìdínà yọrí sí rere',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ti jẹ́ dídílọ́nà.<br />
-Ẹ wo [[Special:BlockList|IP àkójọ ìdínà]] láti ṣàtúnyẹ̀wò àwọn ìdínà.',
+Ẹ wo [[Special:BlockList|àtòjọ ìdínà]] láti ṣàtúnyẹ̀wò àwọn ìdínà.',
 'ipb-blockingself' => 'Ẹ ti fẹ́ dínà ara yín! Ṣé èyí dáa yín lójú?',
 'ipb-edit-dropdown' => 'Àtúnṣe àwọn ìdí ìdínà',
 'ipb-unblock-addr' => 'Ìmúkúrò ìdínà $1',
@@ -2464,6 +2470,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ọ̀',
@@ -2528,6 +2535,9 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 'import-logentry-interwiki' => 'mú $1 wá láti inú wiki míràn',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|Àtúnyẹ̀wò|Àwọn àtúnyẹ̀wò}} $1 láti $2',
 
+# JavaScriptTest
+'javascripttest' => 'Ìdánwò JavaScript',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ojúewé oníṣe yín',
 'tooltip-pt-mytalk' => 'Ojúewé ọ̀rọ̀ yín',
@@ -2536,7 +2546,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 'tooltip-pt-mycontris' => 'Àkójọ àwọn àfikún yín',
 'tooltip-pt-login' => 'A gbà yín níyànjú kí ẹwọlé, bótilẹ̀jẹ́pẹ́ kò pọndandan.',
 'tooltip-pt-anonlogin' => 'A gbàyín níyànjú láti wọlé, bótilẹ̀jẹ́pé kò ṣe dandan.',
-'tooltip-pt-logout' => 'Ìbọ́sódé',
+'tooltip-pt-logout' => 'Ìjáde',
 'tooltip-ca-talk' => 'Ìfọ̀rọ̀wérọ̀ nípa ohun inú ojúewé yìí',
 'tooltip-ca-edit' => 'Ẹ le ṣe àtúnṣe sí ojúewé yìí.
 Ẹ jọ̀wọ́ ẹ lo bọtini àyẹ̀wò kí ẹ tó fipamọ́.',
@@ -2607,6 +2617,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 'spamprotectiontitle' => 'Ajọ̀ àbò spam',
 
 # Info page
+'pageinfo-title' => 'Àròyé fún "$1"',
 'pageinfo-header-edits' => 'Àwọn àtúnṣe',
 'pageinfo-header-watchlist' => 'Ìmójútó',
 'pageinfo-header-views' => 'Àwọn ìwò',
@@ -2637,6 +2648,7 @@ kò le yípò ojúewé padà sí ara rẹ̀.',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|ojúewé|àwọn ojúewé}}',
 'file-info' => 'ìtóbi faili: $1, irú MIME: $2',
 'file-info-size' => '$1 × $2 pixel, ìtóbi faili: $3, irú MIME: $4',
+'file-info-size-pages' => '$1 × $2 pixel, ìtóbi faili: $3, irú MIME: $4, {{PLURAL:$5|ojúewé|ojúewé}} $5',
 'file-nohires' => 'Kò sí ìgbéhàn gíga jù báun lọ.',
 'svg-long-desc' => 'faili SVG, pẹ̀lú $1 × $2 pixels, ìtòbi faili: $3',
 'show-big-image' => 'Pẹ̀lú ìgbéhàn gíga',
@@ -2756,10 +2768,22 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 
 'exif-subjectdistancerange-0' => 'Aláìmọ̀',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ló fiwà lókè omi-òkun',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|meter|meters}} ló fiwà lábẹ́ omi-òkun',
+
 'exif-gpsmeasuremode-2' => 'Ìwọ̀n ẹlẹ́gbẹ̀ẹ́ 2',
 'exif-gpsmeasuremode-3' => 'Ìwọ̀n ẹlẹ́gbẹ̀ẹ́ 3',
 
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Kilometers láàrin wákàtí kan',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Kilometers',
+
 'exif-dc-date' => 'Ọjọ́ọdún',
+'exif-dc-publisher' => 'Olùtẹ̀jáde',
+'exif-dc-type' => 'Irú amóhùnmáwòrán',
 
 'exif-iimcategory-ace' => 'Ìṣẹ́ọnà, àṣà àti fàájì',
 'exif-iimcategory-edu' => 'Ẹ̀kọ́',
@@ -2768,6 +2792,8 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'exif-iimcategory-lab' => 'Ìsẹ́',
 'exif-iimcategory-pol' => 'Ìṣèlú',
 'exif-iimcategory-rel' => 'Ẹ̀sìn àti ìgbàgbọ́',
+'exif-iimcategory-sci' => 'Sáyẹ̀nsì àti ọ̀rọ̀iṣẹ́ọnà',
+'exif-iimcategory-spo' => 'Àwọn eréìdárayá',
 'exif-iimcategory-wea' => 'Ojúọjọ́',
 
 'exif-urgency-low' => 'Kúkúrú ($1)',
@@ -2862,6 +2888,7 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'version-poweredby-credits' => "Agbára ìṣiṣẹ́ wiki yìí wá látọwọ́ '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'àwọn mìíràn',
 'version-software-version' => 'Àtẹ̀jáde',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Ipaṣẹ̀ fáìlì',
@@ -2959,4 +2986,17 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'feedback-error3' => 'Àsìṣe: Kò sí ìdáhùn látọ̀dọ̀ API',
 'feedback-close' => 'Ṣetán',
 
+# API errors
+'api-error-filename-tooshort' => 'Orúkọ fáílì kéréjú bó ṣe yẹ lọ.',
+'api-error-unknown-code' => 'Àsìṣe aláìlójúùtú: "$1".',
+'api-error-unknownerror' => 'Àsìṣe aláìlójúùtú: "$1".',
+
+# Durations
+'duration-seconds' => '{{PLURAL:$1|ìṣẹ́júkejì|ìṣẹ́júkejì}} $1',
+'duration-minutes' => '{{PLURAL:$1|ìṣẹ́jú|ìṣẹ́jú}} $1',
+'duration-hours' => '{{PLURAL:$1|wákàtí|wákàtí}} $1',
+'duration-days' => '{{PLURAL:$1|ọjọ́|ọjọ́}} $1',
+'duration-weeks' => '{{PLURAL:$1|ọ̀sẹ̀|ọ̀sẹ̀}} $1',
+'duration-years' => '{{PLURAL:$1|ọdún|ọdún}} $1',
+
 );
index 77efaac..ea1a0a6 100644 (file)
@@ -11,6 +11,7 @@
  * @author Kaganer
  * @author KaiesTse
  * @author Mark85296341
+ * @author Simon Shek
  * @author Waihorace
  * @author William915
  * @author Wong128hk
@@ -638,6 +639,7 @@ $1',
 'createaccount' => '開戶口',
 'gotaccount' => '已經有戶口? $1。',
 'gotaccountlink' => '登入',
+'userlogin-resetlink' => '唔記得簽到資料?',
 'createaccountmail' => '用電郵',
 'createaccountreason' => '原因:',
 'badretype' => '你入嘅密碼唔一致。',
@@ -1097,7 +1099,6 @@ $1",
 
 # Diffs
 'history-title' => '"$1"嘅修訂歷史',
-'difference' => '(修訂之間嘅差異)',
 'difference-multipage' => '(版之間嘅差異)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比較被選嘅修訂',
@@ -1445,7 +1446,7 @@ $1",
 'nchanges' => '$1次更改',
 'recentchanges' => '最近更改',
 'recentchanges-legend' => '最近更改選項',
-'recentchangestext' => '追蹤對哩一個 wiki 嘅最後更改。',
+'recentchanges-summary' => '追蹤對哩一個 wiki 嘅最後更改。',
 'recentchanges-feed-description' => '追蹤對哩一個 wiki 度呢個集合嘅最後更改。',
 'recentchanges-label-newpage' => '呢次編輯開咗一個新版',
 'recentchanges-label-minor' => '呢個係一個細編輯',
@@ -1698,7 +1699,7 @@ $1',
 'filehist-filesize' => '檔案大細',
 'filehist-comment' => '註解',
 'filehist-missing' => '檔案遺失',
-'imagelinks' => '檔案連結',
+'imagelinks' => '檔案用途',
 'linkstoimage' => '以下嘅$1個頁面連結到呢個檔案:',
 'linkstoimage-more' => '多過$1版連過去呢個檔案。
 下面嘅表只係列示咗連去呢個檔案嘅最頭$1版。
index 2be7b19..a326277 100644 (file)
@@ -792,7 +792,6 @@ Zurg da je bie deêze wiezigieng de heschiedenisdeurloôpendeid van de pagina be
 
 # Diffs
 'history-title' => 'Heschiedenisse van "$1"',
-'difference' => '(Verschil tussen bewerkiengen)',
 'lineno' => 'Rehel $1:',
 'compareselectedversions' => 'Anevienkte versies verhelieken',
 'editundo' => 'onedaene maeken',
@@ -961,7 +960,7 @@ Een nie anekruusd vienkvakje beteêken da de gebruker hin lid is van de hroep.",
 'nchanges' => '$1 {{PLURAL:$1|bewerkieng|bewerkiengen}}',
 'recentchanges' => 'Juust angepast',
 'recentchanges-legend' => 'Opties vò juust angepast',
-'recentchangestext' => 'Bekiek wat-a juust veranderd is op deêze wiki.',
+'recentchanges-summary' => 'Bekiek wat-a juust veranderd is op deêze wiki.',
 'recentchanges-feed-description' => 'Bekiek wat-a juust veranderd is op deêze wiki.',
 'recentchanges-label-newpage' => "Mei deêze bewarkienge is 'n nuwe pagina angemaekt",
 'recentchanges-label-minor' => 'Dit is een kleine wieziging',
index 3572e30..6e6ad18 100644 (file)
@@ -173,21 +173,8 @@ $specialPageAliases = array(
 );
 
 $messages = array(
-# User preference toggles
-'tog-norollbackdiff' => '進行回退後略過差異比較',
-
-'newpage' => '最新页面',
-
-# Edit pages
-'editing' => '正在编辑 $1',
-
-# Miscellaneous special pages
-'newpages' => '最新页面',
-
 /*
 Short names for language variants used for language conversion links.
-To disable showing a particular link, set it to 'disable', e.g.
-'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
 'variantname-zh-hans' => '简体',
index 99b6f0e..ab741e2 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (‪中文(简体)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -15,6 +15,7 @@
  * @author Chenxiaoqino
  * @author Chenzw
  * @author Chinalace
+ * @author Dimension
  * @author Dingyuang
  * @author Fantasticfears
  * @author Fengchao
@@ -42,6 +43,8 @@
  * @author PhiLiP
  * @author Shinjiman
  * @author Shizhao
+ * @author Simon Shek
+ * @author Supaiku
  * @author Tommyang
  * @author Waihorace
  * @author Wilsonmess
@@ -50,6 +53,7 @@
  * @author Wrightbus
  * @author Xiaomingyan
  * @author Yfdyh000
+ * @author 燃玉
  * @author 阿pp
  */
 
@@ -109,6 +113,7 @@ $specialPageAliases = array(
        'Allmessages'               => array( '所有信息' ),
        'Allpages'                  => array( '所有页面' ),
        'Ancientpages'              => array( '最早页面' ),
+       'Badtitle'                  => array( '无效标题' ),
        'Blankpage'                 => array( '空白页面' ),
        'Block'                     => array( '封禁用户' ),
        'Blockme'                   => array( '自我封禁' ),
@@ -133,6 +138,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( '文件路径' ),
        'Import'                    => array( '导入页面' ),
        'Invalidateemail'           => array( '无效电邮地址' ),
+       'JavaScriptTest'            => array( 'JavaScript测试' ),
        'BlockList'                 => array( '封禁列表' ),
        'LinkSearch'                => array( '搜索网页链接' ),
        'Listadmins'                => array( '管理员列表' ),
@@ -157,7 +163,7 @@ $specialPageAliases = array(
        'Mycontributions'           => array( '我的贡献' ),
        'Mypage'                    => array( '我的用户页' ),
        'Mytalk'                    => array( '我的讨论页' ),
-       'Myuploads'                 => array( '我上传的文件', '我的上传' ),
+       'Myuploads'                 => array( '我上传的文件' ),
        'Newimages'                 => array( '新建文件' ),
        'Newpages'                  => array( '新建页面' ),
        'PasswordReset'             => array( '重设密码' ),
@@ -171,7 +177,7 @@ $specialPageAliases = array(
        'Randomredirect'            => array( '随机重定向页' ),
        'Recentchanges'             => array( '最近更改' ),
        'Recentchangeslinked'       => array( '链出更改' ),
-       'Revisiondelete'            => array( '删除或恢复版本' ),
+       'Revisiondelete'            => array( '删除或恢复修订' ),
        'RevisionMove'              => array( '修订版本移动' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短页面' ),
@@ -201,7 +207,7 @@ $specialPageAliases = array(
        'Wantedtemplates'           => array( '需要的模板' ),
        'Watchlist'                 => array( '监视列表' ),
        'Whatlinkshere'             => array( '链入页面' ),
-       'Withoutinterwiki'          => array( '无跨Wiki链接的页面', '无跨维基链接页面' ),
+       'Withoutinterwiki'          => array( '无跨维基链接页面' ),
 );
 
 $magicWords = array(
@@ -218,6 +224,7 @@ $magicWords = array(
        'currentday'              => array( '1', '今天', 'CURRENTDAY' ),
        'currentday2'             => array( '1', '今天2', 'CURRENTDAY2' ),
        'currentyear'             => array( '1', '今年', 'CURRENTYEAR' ),
+       'currenttime'             => array( '1', '此时', '当前时间', 'CURRENTTIME' ),
        'numberofpages'           => array( '1', '页数', 'NUMBEROFPAGES' ),
        'numberofarticles'        => array( '1', '条目数', 'NUMBEROFARTICLES' ),
        'numberoffiles'           => array( '1', '文件数', 'NUMBEROFFILES' ),
@@ -226,6 +233,11 @@ $magicWords = array(
        'numberofedits'           => array( '1', '编辑数', 'NUMBEROFEDITS' ),
        'numberofviews'           => array( '1', '访问数', 'NUMBEROFVIEWS' ),
        'pagename'                => array( '1', '页名', 'PAGENAME' ),
+       'fullpagename'            => array( '1', '全页名', 'FULLPAGENAME' ),
+       'newsectionlink'          => array( '1', '_新段落链接_', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'        => array( '1', '_无新段落链接_', '__NONEWSECTIONLINK__' ),
+       'language'                => array( '0', '#语言:', '#LANGUAGE:' ),
+       'pagesize'                => array( '1', '页面大小', 'PAGESIZE' ),
 );
 
 $linkTrail = '/^()(.*)$/sD';
@@ -455,7 +467,7 @@ $messages = array(
 'protectthispage' => '保护本页',
 'unprotect' => '更改保护',
 'unprotectthispage' => '更改本页面的保护',
-'newpage' => 'æ\9c\80æ\96°é¡µé\9d¢',
+'newpage' => '新页面',
 'talkpage' => '讨论本页',
 'talkpagelinktext' => '讨论',
 'specialpage' => '特殊页面',
@@ -523,7 +535,7 @@ $1',
 'youhavenewmessages' => '你有$1($2)。',
 'newmessageslink' => '新信息',
 'newmessagesdifflink' => '最后更改',
-'youhavenewmessagesmulti' => '您在$1有一条新信息',
+'youhavenewmessagesmulti' => '你在$1有新信息',
 'editsection' => '编辑',
 'editold' => '编辑',
 'viewsourceold' => '查看源代码',
@@ -545,7 +557,7 @@ $1',
 'site-atom-feed' => '$1的Atom',
 'page-rss-feed' => '“$1”的RSS订阅',
 'page-atom-feed' => '“$1”的Atom订阅',
-'red-link-title' => '$1(尚未撰写)',
+'red-link-title' => '$1(页面不存在)',
 'sort-descending' => '降序',
 'sort-ascending' => '升序',
 
@@ -620,7 +632,7 @@ $1',
 'viewsource' => '查看源代码',
 'viewsource-title' => '查看$1的源代码',
 'actionthrottled' => '操作被限制',
-'actionthrottledtext' => '基于反垃圾链接的考量,您被限制在短时间内多次重复该操作,但您已超过此上限。请在数分钟后再尝试。',
+'actionthrottledtext' => '基于反垃圾的考量,您被限制在短时间内多次重复该操作,但您已超过此上限。请在数分钟后再尝试。',
 'protectedpagetext' => '该页面已被保护以防止编辑。',
 'viewsourcetext' => '您可以查看并复制此页面的源代码:',
 'viewyourtext' => "您可以查看并复制'''您对此页面作出编辑后'''的源代码:",
@@ -634,9 +646,11 @@ $2',
 'customjsprotected' => '您没有权限编辑此JavaScript页面,因为它包含另一位用户的个人设置。',
 'ns-specialprotected' => '您不能编辑特殊页面。',
 'titleprotected' => '此标题已被[[User:$1|$1]]保护以防止创建。理由是“$2”。',
-'filereadonlyerror' => '无法修改文件“$1”,因为文件库“$2”处于只读模式。
+'filereadonlyerror' => '无法修改文件“$1”,因为文件库“$2”处于只读模式。 
 
-给出的理由是“$3”。',
+管理员对锁定它给出的解释是:“$3”。',
+'invalidtitle-knownnamespace' => '使用名字空间“$2”和文本“$3”的无效标题',
+'invalidtitle-unknownnamespace' => '使用未知名字空间编号$1和文本“$2”的无效标题',
 
 # Virus scanner
 'virus-badscanner' => "错误的配置:未知的病毒扫描程序:''$1''",
@@ -648,7 +662,7 @@ $2',
 
 您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份[[Special:UserLogin|登录]]。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
 'welcomecreation' => '== 欢迎,$1! ==
-您的账户已经建立。别忘了设置您的[[Special:Preferences|{{SITENAME}}个人参数]]。',
+你的账户已创建。请别忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '再次输入密码:',
@@ -664,7 +678,7 @@ $2',
 'logout' => '退出',
 'userlogout' => '退出',
 'notloggedin' => '未登录',
-'nologin' => '你还没有账户吗?$1。',
+'nologin' => '没有账户?$1。',
 'nologinlink' => '创建账户',
 'createaccount' => '创建账户',
 'gotaccount' => '已经拥有账户?请$1。',
@@ -684,7 +698,7 @@ $2',
 'loginsuccesstitle' => '登录成功',
 'loginsuccess' => "'''“$1”,欢迎登录{{SITENAME}}。'''",
 'nosuchuser' => '找不到用户“$1”。用户名是大小写敏感且区分繁简体的。请检查您的拼写,或者[[Special:UserLogin/signup|建立一个新账户]]。',
-'nosuchusershort' => '没有一个名为“$1”的用户。请检查您输入的文字是否有错误。',
+'nosuchusershort' => '没有名为“$1”的用户。请检查您输入的文字是否有错误。',
 'nouserspecified' => '你需要指定一个用户名。',
 'login-userblocked' => '该用户已被封禁,禁止登录。',
 'wrongpassword' => '您输入的密码错误,请再试一次。',
@@ -798,7 +812,7 @@ $2
 'italic_tip' => '斜体文字',
 'link_sample' => '链接文字',
 'link_tip' => '内部链接',
-'extlink_sample' => 'http://www.example.com é\93¾æ\8e¥æ \87é¢\98',
+'extlink_sample' => 'http://www.example.com é\93¾æ\8e¥æ\96\87å­\97',
 'extlink_tip' => '外部链接(加前缀 http://)',
 'headline_sample' => '大标题文字',
 'headline_tip' => '2级标题文字',
@@ -807,7 +821,7 @@ $2
 'image_tip' => '插入文件',
 'media_tip' => '文件链接',
 'sig_tip' => '带时间戳的签名',
-'hr_tip' => '水平线 (小心使用)',
+'hr_tip' => '水平线(请小心使用)',
 
 # Edit pages
 'summary' => '摘要:',
@@ -822,7 +836,7 @@ $2
 'anoneditwarning' => "'''警告:'''您没有登录。
 您的IP地址将记录在此页的编辑历史中。",
 'anonpreviewwarning' => "''您没有登录。保存页面将会把您的IP地址记录在此页的编辑历史中。''",
-'missingsummary' => "'''提示:''' 您没有提供一个编辑摘要。如果您再次单击“{{int:savearticle}}”,您的编辑将不带编辑摘要保存。",
+'missingsummary' => "'''提示:'''你没有提供编辑摘要。如果你再次点击“{{int:savearticle}}”,你的编辑将不带编辑摘要保存。",
 'missingcommenttext' => '请在下面输入评论。',
 'missingcommentheader' => "'''提示:''' 您没有为此评论提供一个标题。如果您再次单击“{{int:savearticle}}”,您的编辑将不带标题保存。",
 'summary-preview' => '摘要预览:',
@@ -859,21 +873,22 @@ $2
 'accmailtext' => "'$1'的密码已经被发送到$2。",
 'newarticle' => '(新页面)',
 'newarticletext' => '您进入了一个尚未创建的页面。
-要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助]])。
-如果您是不小心来到此页面,直接点击您浏览器中的“返回”按钮返回。',
+要创建该页面,请在下面的编辑框中输入内容(详情参见[[{{MediaWiki:Helppage}}|帮助]])。
+如果您误入此页,请点击浏览器中的“返回”按钮。',
 'anontalkpagetext' => "---- ''这是一个还未建立账户的匿名用户的讨论页, 因此我们只能用IP地址来与他或她联络。该IP地址可能由几名用户共享。如果您是一名匿名用户并认为此页上的评语与您无关,请[[Special:UserLogin/signup|创建新账户]]或[[Special:UserLogin|登录]]以避免在未来与其他匿名用户混淆。''",
 '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' => '用户账户“<nowiki>$1</nowiki>”未曾创建。请在创建/编辑这个页面前先检查一下。',
+'userpage-userdoesnotexist' => '用户账户"$1"未注册。
+请在创建/编辑该页之前进行核对。',
 'userpage-userdoesnotexist-view' => '用户账户“$1”未曾创建。',
 'blocked-notice-logextract' => '这位用户目前已被封禁。以下提供最近的封禁日志以供参考:',
-'clearyourcache' => "'''注意:在保存以后,您必须绕过浏览器缓存才能看到所作出的改变。'''
-* '''火狐(Firefox)/Safari''':按住“Shift”键再点击“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上为“⌘-R”)
-* '''谷歌浏览器(Google Chrome)''':按下“Ctrl-Shift-R”(Mac上为“⌘-Shift-R”)
-* '''Internet Explorer''':按住“Ctrl”键再点击“刷新”,或按下“Ctrl-F5”
-* '''Konqueror''':点击“刷新”或按下“F5”
-* '''Opera''':在“工具→首选项”中清除缓存",
+'clearyourcache' => "'''注意:'''保存之后,你必须清除浏览器缓存才能看到做出的更改。
+* '''火狐(Firefox)/Safari:'''按住“Shift”,同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)
+* '''谷歌浏览器(Google Chrome):'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)
+* '''Internet Explorer:'''按住“Ctrl”,同时单击“刷新”,或按“Ctrl-F5”
+* '''Konqueror:'''点击“刷新”或按“F5”
+* '''Opera:'''在“工具→首选项”中清除缓存",
 'usercssyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
 'userjsyoucanpreview' => "'''提示:''' 在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
 'usercsspreview' => "'''记住您只是在预览您的个人 CSS。'''
@@ -887,7 +902,8 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在皮肤\"\$1\"。注意自定义的 .css 和 .js 页要使用小写标题,例如,{{ns:user}}:Foo/vector.css 不同于 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
-'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存![[#editform|→ 继续编辑]]",
+'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
+'continue-editing' => '继续编辑',
 'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它将在你选择保存后出现。',
 'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理你的编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|退出]]后重新登录。",
 'session_fail_preview_html' => "'''抱歉!我们不能处理你在进程数据丢失时的编辑。'''
@@ -895,8 +911,9 @@ $2
 ''由于{{SITENAME}}允许使用原始的 HTML,为了防范 JavaScript 攻击,预览已被隐藏。''
 
 '''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请[[Special:UserLogout|退出]]并重新登录。",
-'token_suffix_mismatch' => "'''由于您用户端中的编辑令牌毁损了一些标点符号字元,为防止编辑的文字损坏,您的编辑已经被拒绝。'''
-这种情况通常出现于使用含有很多臭虫、以网络为主的匿名代理服务的时候。",
+'token_suffix_mismatch' => "'''由于您用户端中的编辑令牌毁损了一些标点符号字元,您的编辑已经被拒绝。'''
+此次编辑被拒绝以防止页面文本损坏。
+这种情况通常在您使用含有故障的网页式匿名代理服务的时候出现。",
 'edit_form_incomplete' => "'''编辑表单的某些部分没有到达服务器 ;请检查您的编辑内容是否完整并再试一次。'''",
 'editing' => '编辑“$1”',
 'creating' => '创建 $1',
@@ -908,7 +925,7 @@ $2
 你所做的修改显示在下面的文字框中。
 你应当将你所做的修改加入现有的内容中。
 '''只有'''在上面文字框中的内容会在你点击“{{int:savearticle}}”后被保存。",
-'yourtext' => '的文字',
+'yourtext' => '的文字',
 'storedversion' => '已保存的版本',
 'nonunicodebrowser' => "'''警告:您的浏览器不兼容Unicode编码。'''这里有一个工作区将使您能安全地编辑页面:非ASCII字符将以十六进制编码方式出现在编辑框中。",
 'editingold' => "'''警告:你正在编辑的是本页的旧版本。'''
@@ -929,8 +946,8 @@ $2
 
 锁定数据库的管理员有如下解释:$1",
 'protectedpagewarning' => "'''警告:本页面已被保护,只有拥有管理员权限的用户可以编辑。'''下面提供最后的日志条目以供参考:",
-'semiprotectedpagewarning' => "'''注意:''' 本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
-'cascadeprotectedwarning' => "'''è­¦å\91\8aï¼\9a'''æ\9c¬é¡µé\9d¢å·²è¢«ä¿\9dæ\8a¤ï¼\8cå\8fªæ\9c\89æ\8b¥æ\9c\89管ç\90\86å\91\98æ\9d\83é\99\90ç\9a\84ç\94¨æ\88·å\8f¯ä»¥ç¼\96è¾\91ï¼\8cå\9b ä¸ºå\85¶å\8c\85å\90«äº\8eä¸\8bå\88\97受连锁保护的{{PLURAL:$1|页面}}:",
+'semiprotectedpagewarning' => "'''注意:'''本页面已被保护,只有注册用户可以编辑。下面提供最后的日志条目以供参考:",
+'cascadeprotectedwarning' => "'''è­¦å\91\8aï¼\9a'''æ\9c¬é¡µé\9d¢å·²è¢«ä¿\9dæ\8a¤ï¼\8cå\8fªæ\9c\89æ\8b¥æ\9c\89管ç\90\86å\91\98æ\9d\83é\99\90ç\9a\84ç\94¨æ\88·å\8f¯ä»¥ç¼\96è¾\91ï¼\8cå\9b ä¸ºå\85¶å\8c\85å\90«äº\8e以ä¸\8b受连锁保护的{{PLURAL:$1|页面}}:",
 'titleprotectedwarning' => "'''警告:本页面已被保护,创建本页面需要[[Special:ListGroupRights|特定权限]]。'''下面提供最后的日志条目以供参考:",
 'templatesused' => '该页面使用的{{PLURAL:$1|模板}}:',
 'templatesusedpreview' => '本预览使用的{{PLURAL:$1|模板}}:',
@@ -938,21 +955,21 @@ $2
 'template-protected' => '(保护)',
 'template-semiprotected' => '(半保护)',
 'hiddencategories' => '本页面属于$1个隐藏分类:',
-'edittools' => '<!-- 这里的文字将显示在编辑和上传表单下方。 -->',
+'edittools' => '<!-- 这里的文字将显示在编辑和上传表格下面。 -->',
 'nocreatetitle' => '创建页面受限',
 'nocreatetext' => '{{SITENAME}}限制了创建新页面的功能。你可以返回并编辑已有的页面,或者[[Special:UserLogin|登录或创建新账户]]。',
 'nocreate-loggedin' => '你没有权限创建新页面。',
 'sectioneditnotsupported-title' => '段落编辑不支持',
 'sectioneditnotsupported-text' => '本页面不支持段落编辑。',
 'permissionserrors' => '权限错误',
-'permissionserrorstext' => '根据下列{{PLURAL:$1|原因}},你没有权限进行本操作:',
+'permissionserrorstext' => '因为以下{{PLURAL:$1|原因}},你没有权限进行该操作:',
 'permissionserrorstext-withaction' => '因为以下{{PLURAL:$1|原因}},你没有权限$2:',
 'recreate-moveddeleted-warn' => "'''警告:你正在重新创建曾经被删除的页面。'''
 
 你应该考虑继续编辑本页是否合适。这里提供本页的删除和移动记录以供参考:",
 'moveddeleted-notice' => '本页面已被删除。下面提供本页的删除和移动日志以供参考。',
 'log-fulllog' => '查看完整日志',
-'edit-hook-aborted' => '编辑被取消。
+'edit-hook-aborted' => '编辑被hook指令取消。
 无解释。',
 'edit-gone-missing' => '不能更新页面。
 它可能刚刚被删除。',
@@ -976,6 +993,12 @@ $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' => '页面超过了扩展深度',
+'parser-unstrip-loop-warning' => '检测到回圈',
+'parser-unstrip-recursion-limit' => '递归超过限制 ($1)',
 
 # "Undo" feature
 'undo-success' => '此编辑可以被撤销。请检查以下比较以核实这正是您想做的,然后保存以下更改完成撤销编辑。',
@@ -1021,14 +1044,14 @@ $3的理由是''$2''",
 尝试[[Special:Search|搜索本站]]获得相关的新建页面。',
 
 # Revision deletion
-'rev-deleted-comment' => '(编辑摘要删除)',
-'rev-deleted-user' => '(用户名删除)',
-'rev-deleted-event' => '(日志条目删除)',
-'rev-deleted-user-contribs' => '[用户名或IP地址已移除 - 从贡献中隐藏编辑]',
+'rev-deleted-comment' => '(编辑摘要删除)',
+'rev-deleted-user' => '(用户名删除)',
+'rev-deleted-event' => '(日志条目删除)',
+'rev-deleted-user-contribs' => '[用户名或IP地址被删除 - 编辑在贡献中隐藏]',
 'rev-deleted-text-permission' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]。",
 'rev-deleted-text-unhide' => "本页面版本已被'''删除'''。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果你想继续操作,你仍然可以[$1 查看本版本]。",
 'rev-suppressed-text-unhide' => "该页面修订已经被'''监督隐藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。如果您想继续的话,您可以仍然[$1 去查看这次修订]。",
-'rev-deleted-text-view' => "该页面修订已经被'''删除'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到详细的信息。",
+'rev-deleted-text-view' => "本页面版本已被'''删除'''。你可以查看它,详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
 'rev-suppressed-text-view' => "该页面修订已经被'''监督隐藏'''。您可以查看它。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中可以找到详细的信息。",
 'rev-deleted-no-diff' => "因为其中一次修订已被'''删除''',您不可以查看这个差异。
 在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]中可以找到更多的信息。",
@@ -1066,7 +1089,7 @@ $3的理由是''$2''",
 'revdelete-hide-comment' => '隐藏编辑摘要',
 'revdelete-hide-user' => '隐藏编辑者的用户名/IP地址',
 'revdelete-hide-restricted' => '同时阻止管理员与其他用户查看数据',
-'revdelete-radio-same' => '(勿更改)',
+'revdelete-radio-same' => '(不要更改)',
 'revdelete-radio-set' => '是',
 'revdelete-radio-unset' => '否',
 'revdelete-suppress' => '同时阻止管理员与其他用户查看数据',
@@ -1101,7 +1124,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => '监督日志',
-'suppressionlogtext' => '该列表列出对管理员隐藏的删除与封禁。另参见[[Special:BlockList|IP封锁名单]]以查询当前的封禁列表。',
+'suppressionlogtext' => '该列表列出了管理员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。',
 
 # History merging
 'mergehistory' => '合并页面历史',
@@ -1134,7 +1157,8 @@ $1",
 
 # Diffs
 'history-title' => '“$1”的版本历史',
-'difference' => '(版本间的差异)',
+'difference-title' => '“$1”的版本间的差异',
+'difference-title-multipage' => '页面“$1”与“$2”之间的差异',
 'difference-multipage' => '(页面间的差异)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '对比选择的版本',
@@ -1156,8 +1180,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' => '搜索选项',
@@ -1181,7 +1205,7 @@ $1",
 'search-redirect' => '(重定向自“$1”)',
 'search-section' => '(“$1”段落)',
 'search-suggest' => '您是不是要找:$1',
-'search-interwiki-caption' => 'å§\90妹项目',
+'search-interwiki-caption' => 'å§\8a妹项目',
 'search-interwiki-default' => '$1项结果:',
 'search-interwiki-more' => '(更多)',
 'search-mwsuggest-enabled' => '有建议',
@@ -1193,7 +1217,7 @@ $1",
 'searchall' => '所有',
 'showingresults' => "下面显示从第'''$2'''条结果开始的'''$1'''条结果。",
 'showingresultsnum' => "下面显示从第'''$2'''条结果开始的'''$3'''条结果。",
-'showingresultsheader' => "对'''$4'''ç\9a\84{{PLURAL:$5|第'''$1'''è\87³ç¬¬'''$3'''项ç»\93æ\9e\9c|第'''$1'''è\87³ç¬¬'''$2'''项ç»\93æ\9e\9cï¼\8cå\85±'''$3'''项结果}}",
+'showingresultsheader' => "å\85³äº\8e'''$4'''ç\9a\84{{PLURAL:$5|第'''$1'''æ\9d¡è\87³ç¬¬'''$3'''æ\9d¡ç»\93æ\9e\9c|第'''$1'''æ\9d¡è\87³ç¬¬'''$2'''æ\9d¡ç»\93æ\9e\9cï¼\8cå\85±'''$3'''æ\9d¡结果}}",
 'nonefound' => "'''注意''':只有部分名字空间的页面会被默认搜索。尝试在您的搜索语句前添加“all:”前缀,这样可以搜索全部页面(包括讨论页、模板等),或者亦可使用所需名字空间作为前缀。",
 'search-nonefound' => '找不到和查询相匹配的结果。',
 'powersearch' => '高级搜索',
@@ -1229,11 +1253,12 @@ $1",
 'prefs-beta' => '测试版特色',
 'prefs-datetime' => '日期和时间',
 'prefs-labs' => '实验室特色',
+'prefs-user-pages' => '用户页面',
 'prefs-personal' => '用户资料',
 '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' => '监视列表权标:',
@@ -1241,7 +1266,7 @@ $1",
 'prefs-resetpass' => '更改密码',
 'prefs-changeemail' => '更改电子邮件地址',
 'prefs-setemail' => '设置电子邮件地址',
-'prefs-email' => '电子邮件选项',
+'prefs-email' => '电子邮件',
 'prefs-rendering' => '显示',
 'saveprefs' => '保存',
 'resetprefs' => '清除未保存的更改',
@@ -1252,14 +1277,14 @@ $1",
 'columns' => '列:',
 'searchresultshead' => '搜索',
 'resultsperpage' => '每页显示链接数:',
-'stub-threshold' => '<a href="#" class="stub">ç\9f­é¡µé\9d¢é\93¾æ\8e¥</a>æ ¼å¼\8fé\97¨æ§\9b值(字节):',
+'stub-threshold' => '<a href="#" class="stub">ç\9f­é¡µé\9d¢é\93¾æ\8e¥</a>æ ¼å¼\8fé\98\88值(字节):',
 'stub-threshold-disabled' => '已停用',
-'recentchangesdays' => '最近更改中的显示日数:',
-'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
+'recentchangesdays' => '最近更改中显示的天数:',
+'recentchangesdays-max' => '最多$1',
 'recentchangescount' => '默认显示的编辑数:',
-'prefs-help-recentchangescount' => 'è¿\99个å\8c\85æ\8b¬æ\9c\80è¿\91æ\9b´æ\94¹ã\80\81页é\9d¢å\8e\86å\8f²ä»¥å\8f\8a日志。',
+'prefs-help-recentchangescount' => '该项å\8c\85å\90«æ\9c\80è¿\91æ\9b´æ\94¹ã\80\81页é\9d¢å\8e\86å\8f²å\92\8c日志。',
 'prefs-help-watchlist-token' => '此栏填写的密钥可以生成您监视列表的RSS源。任何知晓本栏密钥的人都能阅读您的监视列表,因此请使用安全的数值。这里已提供了一个随机生成的数值供您选择:$1',
-'savedprefs' => '您的个人参数设置已经保存。',
+'savedprefs' => '你的系统设置已经保存。',
 'timezonelegend' => '时区:',
 'localtime' => '当地时间:',
 'timezoneuseserverdefault' => '使用wiki默认值($1)',
@@ -1286,7 +1311,7 @@ $1",
 'prefs-custom-css' => '自定义CSS',
 'prefs-custom-js' => '自定义JavaScript',
 'prefs-common-css-js' => '所有皮肤共用的CSS/JavaScript:',
-'prefs-reset-intro' => '您可以利用这个页面去重设您的参数设置到网站默认值。这个动作无法复原。',
+'prefs-reset-intro' => '你可以使用本页面重置你的系统设置为网站默认值。该操作不能撤销。',
 'prefs-emailconfirm-label' => '电子邮件确认:',
 'prefs-textboxsize' => '编辑框大小',
 'youremail' => '电子邮件:',
@@ -1299,22 +1324,20 @@ $1",
 'yourvariant' => '内容语言变种:',
 'prefs-help-variant' => '您希望用于显示本站内容的语种或拼写语系。',
 'yournick' => '新签名:',
-'prefs-help-signature' => '在讨论页上的发言应该使用“<nowiki>~~~~</nowiki>”签名,它会被自动转换成你的签名并附带时间戳。',
+'prefs-help-signature' => '讨论页面上的评论应该使用“<nowiki>~~~~</nowiki>”签名,它会自动转换为你的签名及时间戳。',
 'badsig' => '错误的原始签名。请检查HTML标签。',
-'badsiglength' => '签名过长。
-它的长度不可超过$1个字符。',
+'badsiglength' => '签名过长。请不超过$1个字符。',
 'yourgender' => '性别:',
 'gender-unknown' => '不指明',
 'gender-male' => '男',
 'gender-female' => '女',
-'prefs-help-gender' => '可选:用以软件中的性别指定。此项资料将会被公开。',
-'email' => '电子邮箱',
-'prefs-help-realname' => '真实姓名为选填项。
-如果提供,可用于贡献署名。',
+'prefs-help-gender' => '选填项目。使软件使用正确的性别称呼。该信息将会公开。',
+'email' => '电子邮件',
+'prefs-help-realname' => '真实姓名是选填项目。如果你选择提供它,它将会用于贡献署名。',
 'prefs-help-email' => '电子邮件地址是选填项目。但是在你忘记密码需要重置密码时需要电子邮件地址。',
 'prefs-help-email-others' => '你亦可以选择让其他用户通过你的用户页或讨论页上的链接用电子邮件联系你。其他用户联系你时你的电子邮件地址不会显示。',
-'prefs-help-email-required' => '需要电子邮件地址。',
-'prefs-info' => '基本资料',
+'prefs-help-email-required' => '电子邮件地址是必填项目。',
+'prefs-info' => '基本信息',
 'prefs-i18n' => '界面语言',
 'prefs-signature' => '签名',
 'prefs-dateformat' => '日期格式',
@@ -1331,7 +1354,7 @@ $1",
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => '电子邮件地址有效',
-'email-address-validity-invalid' => '请提供一个有效的电子邮件地址',
+'email-address-validity-invalid' => '请输入有效的电子邮件地址',
 
 # User rights
 'userrights' => '用户权限管理',
@@ -1343,10 +1366,10 @@ $1",
 'saveusergroups' => '保存用户组',
 'userrights-groupsmember' => '用户组:',
 'userrights-groupsmember-auto' => '自动用户组:',
-'userrights-groups-help' => '可以更改该用户的用户组:
-* é\92©é\80\89的选项框表示该用户属于该用户组。
-* æ\9cªé\92©é\80\89的选项框表示该用户不属于该用户组。
-* æ \87æ\98\9få\8f·ï¼\88*ï¼\89ç\9a\84项ç\9b®è¡¨ç¤ºä½ ä¸\80æ\97¦æ·»å\8a è¯¥ç\94¨æ\88·ç»\84å\90\8eä¸\8dè\83½å\88 é\99¤。',
+'userrights-groups-help' => '可以更改该用户的用户组:
+* é\80\89中的选项框表示该用户属于该用户组。
+* æ\9cªé\80\89中的选项框表示该用户不属于该用户组。
+* æ\98\9få\8f·ï¼\88*ï¼\89表示ä¸\80æ\97¦æ·»å\8a è¯¥ç\94¨æ\88·ç»\84å\90\8eä¸\8dè\83½å\88 é\99¤ï¼\8cå\8f\8dä¹\8b亦ç\84。',
 'userrights-reason' => '原因:',
 'userrights-no-interwiki' => '您并没有权限去编辑在其它wiki上的用户权限。',
 'userrights-nodatabase' => '数据库$1不存在或并非为本地的。',
@@ -1390,60 +1413,60 @@ $1",
 'right-move-subpages' => '移动页面及其子页面',
 'right-move-rootuserpages' => '移动根用户页面',
 'right-movefile' => '移动文件',
-'right-suppressredirect' => '移å\8a¨é¡µé\9d¢æ\97¶ä¸\8då\9c¨æº\90页é\9d¢å\88\9b建重定向',
+'right-suppressredirect' => '移å\8a¨é¡µé\9d¢æ\97¶ä¸\8då\88\9b建æ\9d¥è\87ªæ\9d¥æº\90页é\9d¢ç\9a\84重定向',
 'right-upload' => '上传文件',
-'right-reupload' => '覆盖已有文件',
-'right-reupload-own' => '覆盖由同一位上传的文件',
-'right-reupload-shared' => '于本地无视共用媒体文件库上的文件',
-'right-upload_by_url' => '由一个URL上传文件',
-'right-purge' => '不需要确认之下清除网站快取',
+'right-reupload' => '覆盖现存文件',
+'right-reupload-own' => '覆盖自己上传的文件',
+'right-reupload-shared' => '本地覆盖共享文件库的文件',
+'right-upload_by_url' => 'URL上传文件',
+'right-purge' => '无确认清除页面缓存',
 'right-autoconfirmed' => '编辑半保护页面',
-'right-bot' => 'è§\86为ä¸\80个è\87ªå\8a¨ç¨\8båº\8f',
-'right-nominornewtalk' => '小编辑不引发新信息提示',
-'right-apihighlimits' => '在API查询中使用更高的上限',
-'right-writeapi' => '使用编写的API',
+'right-bot' => '被è§\86为è\87ªå\8a¨è¿\87ç¨\8b',
+'right-nominornewtalk' => '不使小编辑在讨论页面引发新信息提示',
+'right-apihighlimits' => '在API问题中使用更高的限制',
+'right-writeapi' => '使用书写API',
 'right-delete' => '删除页面',
-'right-bigdelete' => '删除大量历史之页面',
-'right-deleterevision' => 'å\88 é\99¤å\8f\8aå\90\8cå\8f\8då\88 é\99¤é¡µé\9d¢ä¸­ç\9a\84æ\8c\87å®\9a修订',
-'right-deletedhistory' => '查看已删除的历史项目,不含关联的文本',
-'right-deletedtext' => '查看已删除修订中之已删除的字以及更改',
-'right-browsearchive' => '搜索已删除之页面',
+'right-bigdelete' => '删除有大型历史的页面',
+'right-deleterevision' => 'å\88 é\99¤å\92\8cæ\81¢å¤\8d页é\9d¢ç\9a\84ç\89¹å®\9aç\89\88æ\9c¬',
+'right-deletedhistory' => '查看被删除的历史条目,无其相关文字',
+'right-deletedtext' => '查看被删除的版本间的被删除的文字和更改',
+'right-browsearchive' => '搜索被删除的页面',
 'right-undelete' => '恢复页面',
-'right-suppressrevision' => '查看和恢复由管理员隐藏的修订',
-'right-suppressionlog' => '查看私人的日志',
-'right-block' => '封锁其他用户防止编辑',
-'right-blockemail' => '封锁用户不可发电邮',
-'right-hideuser' => '封锁用户名,对公众隐藏',
-'right-ipblock-exempt' => 'ç»\95è¿\87IPå°\81é\94\81ã\80\81è\87ªå\8a¨å°\81é\94\81以å\8f\8aè\8c\83å\9b´å°\81é\94\81',
-'right-proxyunbannable' => 'ç»\95è¿\87Proxyç\9a\84è\87ªå\8a¨å°\81é\94\81',
-'right-unblockself' => '自æ\88\91解é\99¤å°\81é\94\81',
-'right-protect' => 'æ\9b´æ\94¹ä¿\9dæ\8a¤ç­\89级以å\8f\8aç¼\96è¾\91保护页面',
+'right-suppressrevision' => '审查和恢复管理员隐藏的版本',
+'right-suppressionlog' => '查看非公开日志',
+'right-block' => '阻止其他用户编辑',
+'right-blockemail' => '阻止用户电邮联系',
+'right-hideuser' => '封禁并隐藏用户名',
+'right-ipblock-exempt' => 'é\81¿å¼\80IPå°\81ç¦\81ã\80\81è\87ªå\8a¨å°\81ç¦\81å\92\8cIP段å°\81ç¦\81',
+'right-proxyunbannable' => 'é\81¿å¼\80代ç\90\86æ\9c\8då\8a¡å\99¨ç\9a\84è\87ªå\8a¨å°\81ç¦\81',
+'right-unblockself' => '自己解å°\81',
+'right-protect' => 'æ\9b´æ\94¹ä¿\9dæ\8a¤çº§å\88«å\92\8cç¼\96è¾\91å\8f\97保护页面',
 'right-editprotected' => '编辑保护页面(无连锁保护)',
 'right-editinterface' => '编辑用户界面',
 'right-editusercssjs' => '编辑其他用户的CSS和JavaScript文件',
 'right-editusercss' => '编辑其他用户的CSS文件',
 'right-edituserjs' => '编辑其他用户的JavaScript文件',
-'right-rollback' => '快速回退最后对特定页面作出的编辑的用户的所有编辑',
-'right-markbotedits' => '标示复原编辑作机械人编辑',
-'right-noratelimit' => '没有使用频率限制',
-'right-import' => '由其它wiki中导入页面',
-'right-importupload' => '由文件上传中导入页面',
-'right-patrol' => '标他人的编辑为已巡查',
-'right-autopatrol' => '将自己的编辑自动标示为已巡查的',
-'right-patrolmarks' => '查看最近巡查标记更改',
-'right-unwatchedpages' => '查看未监视页面列表',
+'right-rollback' => '快速回退最后编辑特定页面的用户的编辑',
+'right-markbotedits' => '标记回退编辑为机器人编辑',
+'right-noratelimit' => '不受速率限制影响',
+'right-import' => '从其他wiki导入页面',
+'right-importupload' => '从文件上传导入页面',
+'right-patrol' => '标他人的编辑为已巡查',
+'right-autopatrol' => '使自己的编辑自动标记为已巡查',
+'right-patrolmarks' => '查看最近更改的巡查标记',
+'right-unwatchedpages' => '查看未受监视页面的列表',
 'right-mergehistory' => '合并页面历史',
 'right-userrights' => '编辑所有用户的权限',
-'right-userrights-interwiki' => 'ç¼\96è¾\91å\9c¨å\85¶å®\83wikiä¸\8a的用户权限',
-'right-siteadmin' => 'é\94\81å®\9aå\92\8c解é\99¤é\94\81å®\9a数据库',
-'right-override-export-depth' => '导出含有五层深度链接页面之页面',
-'right-sendemail' => '发电子邮件给其他用户',
-'right-passwordreset' => '查看重置密码邮件',
+'right-userrights-interwiki' => 'ç¼\96è¾\91å\85¶å®\83wikiç\9a\84ç\94¨æ\88·的用户权限',
+'right-siteadmin' => 'é\94\81å®\9aå\92\8c解é\94\81数据库',
+'right-override-export-depth' => '导出含有链接页面深度为5的页面',
+'right-sendemail' => '电邮联系其他用户',
+'right-passwordreset' => '查看密码重置电子邮件',
 
 # User rights log
 'rightslog' => '用户权限日志',
 'rightslogtext' => '这是用户权限更改的日志。',
-'rightslogentry' => '更改$1的用户组自$2至$3',
+'rightslogentry' => '将$1的用户组由$2更改为$3',
 'rightslogentry-autopromote' => '被自动提升自$2至$3',
 'rightsnone' => '(无)',
 
@@ -1457,43 +1480,43 @@ $1",
 'action-move' => '移动本页',
 'action-move-subpages' => '移动本页及其子页面',
 'action-move-rootuserpages' => '移动根用户页面',
-'action-movefile' => '移动文件',
-'action-upload' => '上传文件',
-'action-reupload' => '覆盖这个现有的文件',
-'action-reupload-shared' => 'è¦\86ç\9b\96å\9c¨å\85±ç\94¨æ\96\87件åº\93ä¸\8aç\9a\84文件',
-'action-upload_by_url' => '由一个URL中上传文件',
+'action-movefile' => '移动文件',
+'action-upload' => '上传文件',
+'action-reupload' => '覆盖文件',
+'action-reupload-shared' => 'è¦\86ç\9b\96å\85±äº«æ\96\87件åº\93ç\9a\84æ\9c¬文件',
+'action-upload_by_url' => '从URL上传本文件',
 'action-writeapi' => '使用书写API',
-'action-delete' => '删除这个页面',
-'action-deleterevision' => '删除这次修订',
-'action-deletedhistory' => '查看这个页面的删除历史',
-'action-browsearchive' => '搜索删除的页面',
-'action-undelete' => '反删除这个页面',
-'action-suppressrevision' => '翻查和恢复这次隐藏修订',
-'action-suppressionlog' => '查看这个私有日志',
-'action-block' => '封锁这位用户的编辑',
-'action-protect' => '更改这个页面的保护等级',
-'action-rollback' => '快速回退最后对特定页面作出的编辑的用户的所有编辑',
-'action-import' => '由另一个wiki导入这个页面',
-'action-importupload' => '由一个文件上传中导入这个页面',
-'action-patrol' => '标示其它的编辑为已巡查的',
-'action-autopatrol' => '将您的编辑标示为已巡查的',
-'action-unwatchedpages' => '查看未监视页面列表',
-'action-mergehistory' => '合并这个页面的历史',
-'action-userrights' => '编辑所有的权限',
-'action-userrights-interwiki' => 'ç¼\96è¾\91å\9c¨å\85¶å®\83wikiä¸\8aç\94¨æ\88·ç\9a\84权限',
-'action-siteadmin' => '锁定和解除锁定数据库',
-'action-sendemail' => '发送电邮',
+'action-delete' => '删除本页',
+'action-deleterevision' => '删除本版本',
+'action-deletedhistory' => '查看本页面被删除的历史',
+'action-browsearchive' => '搜索删除的页面',
+'action-undelete' => '恢复本页',
+'action-suppressrevision' => '审查和恢复本隐藏版本',
+'action-suppressionlog' => '查看本非公开日志',
+'action-block' => '阻止该用户编辑',
+'action-protect' => '更改本页面的保护级别',
+'action-rollback' => '快速回退最后编辑特定页面的用户的编辑',
+'action-import' => '从其他wiki导入本页面',
+'action-importupload' => '从文件上传导入本页面',
+'action-patrol' => '标记他人的编辑为已巡查',
+'action-autopatrol' => '使你的编辑标记为已巡查',
+'action-unwatchedpages' => '查看未受监视页面的列表',
+'action-mergehistory' => '合并页面的历史',
+'action-userrights' => 'ç¼\96è¾\91æ\89\80æ\9c\89ç\94¨æ\88·ç\9a\84æ\9d\83é\99\90',
+'action-userrights-interwiki' => 'ç¼\96è¾\91å\85¶å®\83wikiç\9a\84ç\94¨æ\88·ç\9a\84ç\94¨æ\88·权限',
+'action-siteadmin' => '锁定或解锁数据库',
+'action-sendemail' => '电邮联系其他用户',
 
 # Recent changes
 'nchanges' => '$1次更改',
 'recentchanges' => '最近更改',
 'recentchanges-legend' => '最近更改选项',
-'recentchangestext' => '本页面跟踪本wiki的最近更改。',
+'recentchanges-summary' => '跟踪这个wiki上的最新更改。',
 'recentchanges-feed-description' => '跟踪订阅本wiki的最近更改。',
 'recentchanges-label-newpage' => '这次编辑建立了一个新页面',
 'recentchanges-label-minor' => '这是一个小编辑',
 'recentchanges-label-bot' => '这次编辑是由机器人进行',
-'recentchanges-label-unpatrolled' => 'è¿\99次ç¼\96è¾\91å°\9aæ\9cªå·¡æ\9f¥è¿\87',
+'recentchanges-label-unpatrolled' => '该ç¼\96è¾\91å°\9aæ\9cªå·¡æ\9f¥',
 'rcnote' => "下面是最后'''$2'''天的最后'''$1'''个更改,截至$4 $5。",
 'rcnotefrom' => "下面是自'''$2'''起的更改(最多显示'''$1'''个)。",
 'rclistfrom' => '显示自$1起的新更改',
@@ -1544,10 +1567,9 @@ $1",
 'upload-recreate-warning' => "'''警告:一个相同名字的文件曾经被删除或者移动至别处。'''
 
 这个页面的删除和移动日志在这里提供以便参考:",
-'uploadtext' => "使用下面的表单来上传文件。
-要查看或搜索以前上传的文件,可以进入[[Special:FileList|文件上传列表]],(重新)上传也将在[[Special:Log/upload|上传日志]]中记录,而删除将在[[Special:Log/delete|删除日志]]中记录。
+'uploadtext' => "请使用下面的表格上传文件。要查看或搜索以前上传的文件,可以进入[[Special:FileList|文件上传列表]],(重新)上传也将在[[Special:Log/upload|上传日志]]中记录,而删除将在[[Special:Log/delete|删除日志]]中记录。
 
-要在页面中加入文件,使用以下其中一种形式的链接:
+要在页面中加入文件,请使用一种以下形式的链接:
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></tt>'''使用文件的完整版本
 * '''<tt><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|替换文字]]</nowiki></tt>'''使用放置于左侧的一个框内的200像素宽的图片,同时使用“替换文字”作为描述
 * '''<tt><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></tt>'''直接链接到文件而不显示文件",
@@ -1556,8 +1578,7 @@ $1",
 'upload-prohibited' => '禁止的文件类型:$1。',
 'uploadlog' => '上传日志',
 'uploadlogpage' => '上传日志',
-'uploadlogpagetext' => '以下是一个最近上传文件的列表。
-查看[[Special:NewFiles|新文件画廊]]去看更富图像的总览。',
+'uploadlogpagetext' => '下面是最近的文件上传的列表。图像概览请见[[Special:NewFiles|新文件库]]。',
 'filename' => '文件名',
 'filedesc' => '文件说明',
 'fileuploadsummary' => '摘要:',
@@ -1565,7 +1586,7 @@ $1",
 'filestatus' => '著作权状况:',
 'filesource' => '来源:',
 'uploadedfiles' => '已上传文件',
-'ignorewarning' => '忽略警告并保存文件',
+'ignorewarning' => '忽视警告并继续保存文件',
 'ignorewarnings' => '忽略所有警告',
 'minlength1' => '文件名至少要有一个字符。',
 'illegalfilename' => '文件名“$1”包含在页面标题中不允许使用的字符。请重命名该文件,然后重新上传。',
@@ -1656,7 +1677,7 @@ $1',
 'upload-too-many-redirects' => '在网址中有太多重新定向',
 'upload-unknown-size' => '未知大小',
 'upload-http-error' => '发生HTTP错误:$1',
-'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8bè½½æ\96\87件。',
+'upload-copy-upload-invalid-domain' => 'ä¸\8dè\83½ä»\8e该å\9f\9få\90\8dä¸\8aè½½æ\96\87件å\89¯æ\9c¬。',
 
 # File backend
 'backend-fail-stream' => '无法流传送文件$1。',
@@ -1674,14 +1695,15 @@ $1',
 'backend-fail-writetemp' => '无法写临时文件。',
 'backend-fail-closetemp' => '无法创建临时文件。',
 'backend-fail-read' => '找不到文件“$1”。',
-'backend-fail-create' => 'æ\89¾ä¸\8då\88°æ\96\87件â\80\9c$1â\80\9d。',
-'backend-fail-maxsize' => 'æ\97 æ³\95å\88\9b建文件 $1,因为它大于$2字节。',
+'backend-fail-create' => 'æ\97 æ³\95å\86\99å\85¥æ\96\87件 $1 。',
+'backend-fail-maxsize' => 'æ\97 æ³\95å\86\99å\85¥文件 $1,因为它大于$2字节。',
 'backend-fail-readonly' => '“$1”存储后端目前在只读模式,因为:“$2”',
 'backend-fail-synced' => '文件"$1"在内部存储后端之中处于不一致状态',
 'backend-fail-connect' => '无法连接到存储后端“$1。',
 'backend-fail-internal' => '存储后端“$1”发生了一个未知错误。',
 'backend-fail-contenttype' => '无法判断文件的内容类型来储存于“$1”。',
 'backend-fail-batchsize' => '存储后端被给予了一批$1个文件{{PLURAL:$1|操作|操作}};限值为$2个{{PLURAL:$2|操作|操作}}。',
+'backend-fail-usable' => '权限不足或缺少目录/贮存器,无法写入文件$1。',
 
 # File journal errors
 'filejournal-fail-dbconnect' => '无法连接到后端存储的日志数据库“$1”。',
@@ -1756,8 +1778,7 @@ $1',
 'upload_source_file' => '(您计算机上的一个文件)',
 
 # Special:ListFiles
-'listfiles-summary' => '该特殊页面显示所有上传的文件。
-当用户过滤图片时,只有当该文件的最新版本由该用户上传时才会显示。',
+'listfiles-summary' => '本特殊页面显示所有上传的文件。当按用户过滤时,只显示输入的用户最后上传的文件版本。',
 'listfiles_search_for' => '按媒体名称搜索:',
 'imgfile' => '文件',
 'listfiles' => '文件列表',
@@ -1784,7 +1805,7 @@ $1',
 'filehist-user' => '用户',
 'filehist-dimensions' => '大小',
 'filehist-filesize' => '文件大小',
-'filehist-comment' => '注解',
+'filehist-comment' => '评论',
 'filehist-missing' => '文件遗失',
 'imagelinks' => '文件用途',
 'linkstoimage' => '以下的$1个页面链接到本文件:',
@@ -1800,6 +1821,9 @@ $1',
 请参阅在[$2 文件描述页面]以了解其相关信息。',
 'sharedupload-desc-here' => '该文件来自于$1,它可能在其它计划项目中被应用。
 它在[$2 文件描述页面]那边上的描述于下面显示。',
+'sharedupload-desc-edit' => '该文件来自$1,它可能在其它计划项目中被使用。
+或许您可以在其[$2 文件描述页面]上编辑说明。',
+'sharedupload-desc-create' => '此文件是从 $1 和可能由其他维基项目使用。 !N !也许您想在其[ $2 文件描述页面]编辑说明。',
 'filepage-nofile' => '不存在此名称的文件。',
 'filepage-nofile-link' => '不存在此名称的文件,但您可以[$1 上传它]。',
 'uploadnewversion-linktext' => '上传该文件的新版本',
@@ -1839,7 +1863,7 @@ $1',
 'filedelete-maintenance-title' => '无法删除文件',
 
 # MIME search
-'mimesearch' => 'MIME 搜索',
+'mimesearch' => 'MIME搜索',
 'mimesearch-summary' => '本页面启用文件MIME类型过滤器。输入:内容类型/子类型,如 <tt>image/jpeg</tt>。',
 'mimetype' => 'MIME 类型:',
 'download' => '下载',
@@ -1884,7 +1908,7 @@ $1',
 'statistics-users-active-desc' => '在前$1天中操作过的用户',
 'statistics-mostpopular' => '浏览最多的页面',
 
-'disambiguations' => '链接消歧义页的页面',
+'disambiguations' => '链接消歧义页的页面',
 'disambiguationspage' => 'Template:消歧义',
 'disambiguations-text' => "以下的页面都有到'''消歧义页'''的链接,但它们应该链接到适当的页面。<br />一个页面如果使用了[[MediaWiki:Disambiguationspage]]内的模板,则会被视为消歧义页。",
 
@@ -1925,7 +1949,7 @@ $1',
 'unusedcategories' => '未使用分类',
 'unusedimages' => '未使用图像',
 'popularpages' => '热点页面',
-'wantedcategories' => '待撰分类',
+'wantedcategories' => '需要的分类',
 'wantedpages' => '待撰页面',
 'wantedpages-badtitle' => '在结果组上的无效标题:$1',
 'wantedfiles' => '需要的文件',
@@ -1991,6 +2015,7 @@ $1',
 您可以选择日志类型,用户名(区分大小写)或者相关页面(区分大小写)来缩小查询范围。',
 'logempty' => '在日志中不存在匹配项。',
 'log-title-wildcard' => '搜索以这个文字开始的标题',
+'showhideselectedlogentries' => '显示/隐藏所选日志项',
 
 # Special:AllPages
 'allpages' => '所有页面',
@@ -2010,6 +2035,11 @@ $1',
 '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|分类}}中包含了页面或媒体。
@@ -2057,8 +2087,8 @@ $1',
 'listgrouprights' => '用户组权限',
 'listgrouprights-summary' => '以下面是一个在这个wiki中定义出来的用户权限列表,以及它们的访问权。
 更多有关个别权限的细节可以在[[{{MediaWiki:Listgrouprights-helppage}}|这里]]找到。',
-'listgrouprights-key' => '* <span class="listgrouprights-granted">授予的权限</span>
-* <span class="listgrouprights-revoked">已撤除的权限</span>',
+'listgrouprights-key' => '* <span class="listgrouprights-granted">授予的权限</span>
+* <span class="listgrouprights-revoked">被取消的权限</span>',
 'listgrouprights-group' => '用户组',
 'listgrouprights-rights' => '权限',
 'listgrouprights-helppage' => 'Help:用户组权限',
@@ -2078,9 +2108,9 @@ $1',
 'emailuser' => '电邮联系',
 'emailpage' => '电邮联系',
 'emailpagetext' => '您可以用下面的表格去寄一封电邮给这位用户。
-您在[[Special:Preferences|您参数设置]]中所输入的电子邮箱地址将出现在邮件"发件人"一栏中,这样该用户就可以回复您。',
+您在[[Special:Preferences|您的参数设置]]中所输入的电子邮箱地址将出现在邮件“发件人”一栏中,这样该用户就可以回复您。',
 'usermailererror' => 'Mail 对象返回错误:',
-'defemailsubject' => "{{SITENAME}} 来自用户''$1''的电子邮件",
+'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
 'usermaildisabled' => '用户电邮已停用',
 'usermaildisabledtext' => '您不可以发送电邮到这个wiki上的其他用户',
 'noemailtitle' => '无电子邮件地址',
@@ -2193,7 +2223,7 @@ $UNWATCHURL
 请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。',
 'actioncomplete' => '操作完成',
 'actionfailed' => '操作失败',
-'deletedtext' => '"$1"已经被删除。最近删除的记录请参见$2。',
+'deletedtext' => '“$1”已经被删除。最近删除的记录请参见$2。',
 'dellogpage' => '删除日志',
 'dellogpagetext' => '以下是最近的删除的列表。',
 'deletionlog' => '删除记录',
@@ -2205,7 +2235,7 @@ $UNWATCHURL
 ** 作者申请
 ** 侵犯著作权
 ** 破坏行为',
-'delete-edit-reasonlist' => '编辑删除理由',
+'delete-edit-reasonlist' => '编辑删除原因',
 'delete-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除此类页面的动作已经被限制,以防止在{{SITENAME}}上的意外扰乱。',
 'delete-warning-toobig' => '这个页面有一个十分大量的编辑历史,超过$1次修订。删除它可能会扰乱{{SITENAME}}的数据库操作;在继续此动作前请小心。',
 
@@ -2272,7 +2302,7 @@ $UNWATCHURL
 ** 过多垃圾信息
 ** 负面的编辑战
 ** 高流量页面',
-'protect-edit-reasonlist' => '编辑保护理由',
+'protect-edit-reasonlist' => '编辑保护原因',
 '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',
 'restriction-type' => '权限:',
 'restriction-level' => '限制级别:',
@@ -2292,7 +2322,7 @@ $UNWATCHURL
 'restriction-level-all' => '任何级别',
 
 # Undelete
-'undelete' => '查看删除页面',
+'undelete' => '查看删除页面',
 'undeletepage' => '浏览及恢复被删页面',
 'undeletepagetitle' => "'''以下包含[[:$1]]的已删除之修订版本'''。",
 'viewdeletedpage' => '查看被删页面',
@@ -2353,13 +2383,13 @@ $1',
 'contribsub2' => '$1的贡献($2)',
 'nocontribs' => '没有找到符合特征的更改。',
 'uctop' => '(最后更改)',
-'month' => '自月份(及之前内容):',
-'year' => '自年份(及之前内容):',
+'month' => '截止月份:',
+'year' => '截止年份:',
 
 'sp-contributions-newbies' => '只显示新账户的贡献',
 'sp-contributions-newbies-sub' => '新手',
 'sp-contributions-newbies-title' => '新手的用户贡献',
-'sp-contributions-blocklog' => '封禁记录',
+'sp-contributions-blocklog' => '封禁日志',
 'sp-contributions-deleted' => '已删除的用户贡献',
 'sp-contributions-uploads' => '上传',
 'sp-contributions-logs' => '日志',
@@ -2378,7 +2408,7 @@ $1',
 'whatlinkshere' => '链入页面',
 'whatlinkshere-title' => '链接至“$1”的页面',
 'whatlinkshere-page' => '页面:',
-'linkshere' => "ä¸\8bå\88\97页面链接至'''[[:$1]]''':",
+'linkshere' => "以ä¸\8b页面链接至'''[[:$1]]''':",
 'nolinkshere' => "没有页面链接至'''[[:$1]]'''。",
 'nolinkshere-ns' => "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
 'isredirect' => '重定向页',
@@ -2415,7 +2445,7 @@ $1',
 ** 恐吓行为/骚扰
 ** 滥用多个账户
 ** 不能接受的用户名',
-'ipb-hardblock' => 'é\98²æ­¢å·²ç\99»å½\95ç\9a\84ç\94¨æ\88·ä»\8e该 IP 地址编辑',
+'ipb-hardblock' => 'é\98»æ­¢ç\99»å½\95ç\94¨æ\88·ä½¿ç\94¨è¯¥IP地址编辑',
 'ipbcreateaccount' => '阻止创建新账号',
 'ipbemailban' => '阻止用户发送电邮',
 'ipbenableautoblock' => '自动封禁该用户最后使用的IP地址,以及他们随后试图用于编辑的所有IP地址',
@@ -2425,8 +2455,8 @@ $1',
 'ipbotheroption' => '其他',
 'ipbotherreason' => '其他/附加原因:',
 'ipbhidename' => '在编辑及列表中隐藏用户名',
-'ipbwatchuser' => 'ç\9b\91è§\86è¿\99ä½\8dç\94¨æ\88·ç\9a\84ç\94¨æ\88·é¡µé\9d¢ä»¥å\8f\8aå\85¶å¯¹è¯\9d页面',
-'ipb-disableusertalk' => '禁止被封禁用户编辑自己的对话页',
+'ipbwatchuser' => 'ç\9b\91è§\86该ç\94¨æ\88·ç\9a\84ç\94¨æ\88·é¡µé\9d¢å\92\8c讨论页面',
+'ipb-disableusertalk' => '阻止用户在封禁期间编辑自己的讨论页面',
 'ipb-change-block' => '使用这些设置重新封禁用户',
 'ipb-confirm' => '确认封禁',
 'badipaddress' => '无效IP地址',
@@ -2435,7 +2465,7 @@ $1',
 参见[[Special:BlockList|封禁列表]]以复核封禁。',
 'ipb-blockingself' => '您将要封禁自己!确实要这样做吗?',
 'ipb-confirmhideuser' => '您即将在封禁用户的同时启用“隐藏账户”功能。这将从所有列表和日志记录中隐藏这个用户名。您确认这样做吗?',
-'ipb-edit-dropdown' => '编辑封禁理由',
+'ipb-edit-dropdown' => '编辑封禁原因',
 'ipb-unblock-addr' => '解封$1',
 'ipb-unblock' => '解封用户名或IP地址',
 'ipb-blocklist' => '查看现有封禁',
@@ -2448,7 +2478,7 @@ $1',
 'unblocked-id' => '封禁$1已被解除',
 'blocklist' => '被封禁用户',
 'ipblocklist' => '被封禁用户',
-'ipblocklist-legend' => '查找封禁用户',
+'ipblocklist-legend' => '查找封禁用户',
 'blocklist-userblocks' => '隐藏帐户封禁',
 'blocklist-tempblocks' => '隐藏临时封禁',
 'blocklist-addressblocks' => '隐藏单个IP封禁',
@@ -2479,7 +2509,7 @@ $1',
 'autoblocker' => '由于您与“[[User:$1|$1]]”共享一个IP地址而被自动封禁。
 $1被封禁的理由是:“$2”',
 'blocklogpage' => '封禁日志',
-'blocklog-showlog' => '此用户曾被封禁。以下列出封禁日志以供参考:',
+'blocklog-showlog' => '该用户曾被封禁。下面提供封禁日志以供参考:',
 'blocklog-showsuppresslog' => '此用户曾被封禁并隐藏。以下列出隐藏日志以供参考:',
 'blocklogentry' => '封禁[[$1]],终止时间为$2$3',
 'reblock-logentry' => '更改[[$1]]的封禁终止时间 $2 $3',
@@ -2571,16 +2601,16 @@ $1被封禁的理由是:“$2”',
 
 在这些情况下,您在必要时必须手工移动或合并页面。",
 'movearticle' => '移动页面:',
-'moveuserpage-warning' => "'''警告:'''您将会移动一个用户页面。请留意该页面在移动后该用户的名字是''不会''变更的。",
+'moveuserpage-warning' => "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
 'movenologin' => '未登录',
 'movenologintext' => '您必须是一名登记用户并且[[Special:UserLogin|登录]]
 后才可移动一个页面。',
-'movenotallowed' => '您并没有权限去移动页面。',
-'movenotallowedfile' => '您并没有权限去移动文件。',
-'cant-move-user-page' => '您并没有许可权去移动用户页面(它的子页面除外)。',
-'cant-move-to-user-page' => '您并没有许可权去移动到用户页面(它的子页面除外)。',
+'movenotallowed' => '你没有权限移动页面。',
+'movenotallowedfile' => '你没有权限移动文件。',
+'cant-move-user-page' => '你没有权限移动用户页面(子页面除外)。',
+'cant-move-to-user-page' => '你没有权限移动页面至用户页面(用户子页面除外)。',
 'newtitle' => '新标题:',
-'move-watch' => '监视来源以及目标页',
+'move-watch' => '监视来源页面和目标页面',
 'movepagebtn' => '移动页面',
 'pagemovedsub' => '移动成功',
 'movepage-moved' => "'''“$1”已移动到“$2”'''",
@@ -2598,8 +2628,8 @@ $1被封禁的理由是:“$2”',
 'movepage-page-unmoved' => '页面$1无法移动到$2。',
 'movepage-max-pages' => '所移动$1个页面的数量已达最大限额,无法同时自动移动更多页面。',
 'movelogpage' => '移动日志',
-'movelogpagetext' => '以ä¸\8bæ\98¯æ\89\80æ\9c\89移å\8a¨ç\9a\84页é\9d¢å\88\97表ï¼\9a',
-'movesubpage' => '{{PLURAL:$1|子页面|子页面}}',
+'movelogpagetext' => 'ä¸\8bé\9d¢æ\98¯æ\89\80æ\9c\89页é\9d¢ç§»å\8a¨ç\9a\84å\88\97表ã\80\82',
+'movesubpage' => '{{PLURAL:$1|子页面}}',
 'movesubpagetext' => '这个页面有$1个子页面,列示如下。',
 'movenosubpage' => '这个页面没有子页面。',
 'movereason' => '原因:',
@@ -2622,10 +2652,8 @@ $1被封禁的理由是:“$2”',
 'imageinvalidfilename' => '目标文件名称无效',
 'fix-double-redirects' => '更新所有指向原始标题的重定向',
 'move-leave-redirect' => '保留重定向',
-'protectedpagemovewarning' => "'''警告:'''这个页面已经被保护,只有拥有管理员权限的用户才可以移动它。
-最近的日志在下面提供以便参考:",
-'semiprotectedpagemovewarning' => "'''注意:'''这个页面已经被保护,只有已经注册的用户才可以移动它。
-最近的日志在下面提供以便参考:",
+'protectedpagemovewarning' => "'''警告:'''本页面已被保护,只有拥有管理员权限的用户可以移动。下面提供最后的日志条目以供参考:",
+'semiprotectedpagemovewarning' => "'''注意:'''本页面已被保护,只有注册用户可以移动。下面提供最后的日志条目以供参考:",
 'move-over-sharedrepo' => '== 文件已存在 ==
 [[:$1]]已于共享资源存在,将文件移动到此标题会覆盖共享资源中的文件。',
 'file-exists-sharedrepo' => '同名文件已于共享资源存在。
@@ -2646,9 +2674,9 @@ $1被封禁的理由是:“$2”',
 '''注意:'''由于性能原因,从此表单导出页面的全部历史已被禁用。",
 'exportlistauthors' => '为每个页面包含贡献者的完整列表',
 'export-submit' => '导出',
-'export-addcattext' => '由分类中添加页面:',
+'export-addcattext' => '从分类添加页面:',
 'export-addcat' => '添加',
-'export-addnstext' => '由名字空间中添加页面:',
+'export-addnstext' => '从名字空间添加页面:',
 'export-addns' => '添加',
 'export-download' => '另存为文件',
 'export-templates' => '包含模板',
@@ -2657,7 +2685,7 @@ $1被封禁的理由是:“$2”',
 # Namespace 8 related
 'allmessages' => '系统信息',
 'allmessagesname' => '名称',
-'allmessagesdefault' => '默认消息文本',
+'allmessagesdefault' => '默认信息文字',
 'allmessagescurrent' => '当前消息文本',
 'allmessagestext' => '此处列出了MediaWiki名字空间下的所有有效系统消息。
 如果想为MediaWiki的本地化贡献翻译,请访问[//www.mediawiki.org/wiki/Localisation MediaWiki本地化]和[//translatewiki.net translatewiki.net]。',
@@ -2730,7 +2758,7 @@ $1被封禁的理由是:“$2”',
 # Import log
 'importlogpage' => '导入日志',
 'importlogpagetext' => '由管理员从其他wiki导入的带有编辑历史的页面。',
-'import-logentry-upload' => '通过文件上传导入的[[$1]]',
+'import-logentry-upload' => '以文件上传导入[[$1]]',
 'import-logentry-upload-detail' => '$1个版本',
 'import-logentry-interwiki' => '跨站导入 $1',
 'import-logentry-interwiki-detail' => '来自$2的$1个修订',
@@ -2828,6 +2856,11 @@ $1被封禁的理由是:“$2”',
 'vector.css' => '/* 此处的 CSS 将影响使用 Vector 皮肤的用户 */',
 'print.css' => '/* 此处的 CSS 将影响打印输出 */',
 'handheld.css' => '/* 此处的 CSS 将影响在 $wgHandheldStyle 设置手提装置面板 */',
+'noscript.css' => '/* 此处的 CSS 将影响没有启用 JavaScript 的用户 */',
+'group-autoconfirmed.css' => '/* 此处的 CSS 将只会影响自动确认用户 */',
+'group-bot.css' => '/* 此处的 CSS 将只会影响机器人 */',
+'group-sysop.css' => '/* 此处的 CSS 将只会影响管理员 */',
+'group-bureaucrat.css' => '/* 此处的 CSS 将只会影响行政员 */',
 
 # Scripts
 'common.js' => '/* 此处的JavaScript将加载于所有用户每一个页面。 */',
@@ -2864,6 +2897,7 @@ $1被封禁的理由是:“$2”',
 'spambot_username' => 'MediaWiki垃圾链接清理器',
 'spam_reverting' => '恢复到不包含链接的最近修订版本$1',
 'spam_blanking' => '消隐所有包含链接至$1的修订',
+'spam_deleting' => '正在删除所有包含至$1的版本',
 
 # Info page
 'pageinfo-title' => '"$1" 的信息',
@@ -2973,11 +3007,14 @@ Variants for Chinese language
 'variantname-zh-cn' => '大陆简体',
 'variantname-zh-tw' => '台湾正体',
 'variantname-zh-hk' => '香港繁体',
+'variantname-zh-mo' => '澳门繁体',
 'variantname-zh-sg' => '新加坡简体',
+'variantname-zh-my' => '马来西亚简体',
 'variantname-zh' => '不转换',
 
 # Variants for Gan language
-'variantname-gan-hans' => '',
+'variantname-gan-hans' => '‪中文(简体)',
+'variantname-gan-hant' => '‪中文(繁体)',
 
 # Variants for Kazakh language
 'variantname-kk-cyrl' => '',
@@ -3033,7 +3070,7 @@ Variants for Chinese language
 'exif-model' => '相机型号',
 'exif-software' => '使用软件',
 'exif-artist' => '作者',
-'exif-copyright' => '著作权所有',
+'exif-copyright' => '著作权所有',
 'exif-exifversion' => 'Exif版本',
 'exif-flashpixversion' => '支持的Flashpix版本',
 'exif-colorspace' => '色彩空间',
@@ -3193,7 +3230,7 @@ Variants for Chinese language
 'exif-copyrighted-true' => '版权',
 'exif-copyrighted-false' => '公共领域',
 
-'exif-unknowndate' => '未知日期',
+'exif-unknowndate' => '未知日期',
 
 'exif-orientation-1' => '标准',
 'exif-orientation-2' => '水平翻转',
@@ -3491,6 +3528,7 @@ $5
 
 # Separators for various lists, etc.
 'comma-separator' => '、',
+'colon-separator' => ':',
 'word-separator' => '',
 'parentheses' => '($1)',
 
@@ -3505,8 +3543,8 @@ $5
 'descending_abbrev' => '降',
 'table_pager_next' => '下一页',
 'table_pager_prev' => '上一页',
-'table_pager_first' => '第一页',
-'table_pager_last' => 'æ\9c\80å\90\8eä¸\80页',
+'table_pager_first' => '页',
+'table_pager_last' => 'æ\9c«页',
 'table_pager_limit' => '每页显示$1项',
 'table_pager_limit_label' => '每页项目数:',
 'table_pager_limit_submit' => '提交',
@@ -3551,7 +3589,7 @@ $5
 'watchlistedit-raw-removed' => '$1个标题被删除:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'æ\9f¥ç\9c\8bç\9b¸å\85³更改',
+'watchlisttools-view' => 'æ\9f¥ç\9c\8bç\9b\91è§\86更改',
 'watchlisttools-edit' => '查看并编辑监视列表',
 'watchlisttools-raw' => '编辑原始监视列表',
 
@@ -3568,10 +3606,10 @@ $5
 'version-specialpages' => '特殊页面',
 'version-parserhooks' => '解析器钩',
 'version-variables' => '变量',
-'version-antispam' => 'å\9e\83å\9c¾é\98²止',
+'version-antispam' => 'å\9e\83å\9c¾é\98»止',
 'version-skins' => '皮肤',
 'version-other' => '其他',
-'version-mediahandlers' => '媒体处理器',
+'version-mediahandlers' => '媒体文件处理器',
 'version-hooks' => '钩',
 'version-extension-functions' => '扩展函数',
 'version-parser-extensiontags' => '解析器扩展标签',
@@ -3590,6 +3628,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' => '文件路径',
@@ -3611,9 +3652,8 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 # Special:SpecialPages
 'specialpages' => '特殊页面',
 'specialpages-note' => '----
-* 常规特殊页面。
-* <span class="mw-specialpagerestricted">受限特殊页面。</span>
-* <span class="mw-specialpagecached">已缓存特殊页面(可能已过时)。</span>',
+*普通特殊页面。
+*<span class="mw-specialpagerestricted">非公开特殊页面。</span>',
 'specialpages-group-maintenance' => '维护报告',
 'specialpages-group-other' => '其它特殊页面',
 'specialpages-group-login' => '登录/注册',
@@ -3769,7 +3809,7 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-overwrite' => '不允许覆盖现有文件。',
 'api-error-stashfailed' => '内部错误:服务器保存临时文件失败。',
 'api-error-timeout' => '服务器没有在预期内响应。',
-'api-error-unclassified' => 'å\8f\91ç\94\9fæ\9cªç\9f¥é\94\99误',
+'api-error-unclassified' => 'å\87ºç\8e°æ\9cªç\9f¥é\94\99误ã\80\82',
 'api-error-unknown-code' => '未知错误:$1',
 'api-error-unknown-error' => '内部错误:尝试上传文件时出错。',
 'api-error-unknown-warning' => '未知的警告:$1',
@@ -3777,4 +3817,15 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-uploaddisabled' => '这个维基不接受上传。',
 'api-error-verification-error' => '此文件可能已损坏,或有错误的扩展名。',
 
+# Durations
+'duration-seconds' => '$1秒',
+'duration-minutes' => '$1分',
+'duration-hours' => '$1小时',
+'duration-days' => '$1天',
+'duration-weeks' => '$1周',
+'duration-years' => '$1年',
+'duration-decades' => '$10年',
+'duration-centuries' => '$1个世纪',
+'duration-millennia' => '$1千年',
+
 );
index 5c80296..0533c41 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (‪中文(繁體)‬)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -21,6 +21,7 @@
  * @author Hzy980512
  * @author Jidanni
  * @author Jimmy xu wrk
+ * @author Justincheng12345
  * @author Kaganer
  * @author KaiesTse
  * @author Kuailong
@@ -33,6 +34,7 @@
  * @author Philip
  * @author Shinjiman
  * @author Shizhao
+ * @author Simon Shek
  * @author Skjackey tse
  * @author Waihorace
  * @author Wmr89502270
@@ -214,7 +216,7 @@ $messages = array(
 'tog-hidepatrolled' => '於最近更改中隱藏巡查過的編輯',
 'tog-newpageshidepatrolled' => '於新頁面清單中隱藏巡查過的頁面',
 'tog-extendwatchlist' => '展開監視清單以顯示所有更改,不只是最近的',
-'tog-usenewrc' => '使用增強最近更改 (需要JavaScript)',
+'tog-usenewrc' => '在最近更改和監視列表中整合同一頁的修改 (需要JavaScript)',
 'tog-numberheadings' => '標題自動編號',
 'tog-showtoolbar' => '顯示編輯工具欄 (需要JavaScript)',
 'tog-editondblclick' => '雙擊編輯頁面 (需要JavaScript)',
@@ -494,7 +496,7 @@ $1',
 'site-atom-feed' => '$1的Atom訂閱',
 'page-rss-feed' => '「$1」的RSS訂閱',
 'page-atom-feed' => '「$1」的Atom訂閱',
-'red-link-title' => '$1 (頁面未存在)',
+'red-link-title' => '$1(頁面未存在)',
 'sort-descending' => '倒序排列',
 'sort-ascending' => '升序排序',
 
@@ -590,6 +592,12 @@ $2',
 'customjsprotected' => '你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。',
 'ns-specialprotected' => '特殊頁面是不可以編輯的。',
 'titleprotected' => "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
+'filereadonlyerror' => '無法修改文件" $1 "因為文件庫" $2 "處於唯讀模式。 !
+管理員鎖定它的解釋是:" $3 "。',
+'invalidtitle-knownnamespace' => '使用名字空間“$2”和文本“$3”的無效標題',
+'invalidtitle-unknownnamespace' => '使用未知名字空間編號$1和文本“$2”的無效標題',
+'exception-nologin' => '未登入',
+'exception-nologin-text' => '你需要登錄此wiki查閲此頁或進行操作。',
 
 # Virus scanner
 'virus-badscanner' => "損壞設定: 未知的病毒掃瞄器: ''$1''",
@@ -674,6 +682,7 @@ $2',
 'emailconfirmlink' => '確認您的郵箱地址',
 'invalidemailaddress' => '郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。',
 'cannotchangeemail' => '本wiki不允許對賬戶的電郵地址進行更改。',
+'emaildisabled' => '此網站不能發送電子郵件。',
 'accountcreated' => '已建立賬戶',
 'accountcreatedtext' => '$1的賬戶已經被建立。',
 'createaccount-title' => '在{{SITENAME}}中建立新賬戶',
@@ -792,18 +801,15 @@ $2
 'summary-preview' => '摘要預覽:',
 'subject-preview' => '主題/標題預覽:',
 'blockedtitle' => '用戶被查封',
-'blockedtext' => "{{GENDER:|你|妳|你}}的用戶名或IP地址已經被$1查封。
+'blockedtext' => "'''您的用戶名或IP地址已被封禁。'''
 
-這次查封是由$1所封的。當中的原因是''$2''。
+此次封禁操作由$1完成,封禁原因爲''$2''。
 
-* 這次查封開始的時間是:$8
-* 這次查封到期的時間是:$6
-* 對於被查封者:$7
-
-{{GENDER:|你|妳|你}}可以聯絡$1或者其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論這次查封。
-除非{{GENDER:|你|妳|你}}已經在{{GENDER:|你|妳|你}}的[[Special:Preferences|賬號參數設置]]中設定了一個有效的電子郵件地址,否則{{GENDER:|你|妳|你}}是不能使用「電郵這位用戶」的功能。當設定了一個有效的電子郵件地址後,這個功能是不會封鎖的。
+* 起始時間:$8
+* 終止時間:$6
+* 擬封禁對象:$7
 
-{{GENDER:|你|妳|你}}目前的IP地址是$3,而該查封ID是 #$5。 請在{{GENDER:|你|妳|你}}的查詢中註明以上所有的資料。",
+您可以聯繫$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]]討論此次封禁。若您已在[[Special:Preferences|帳號設置]]中配置了一個有效的電子郵件地址,且未被封禁電子郵件功能,則您可通過“發送電子郵件給這位用戶”功能來聯絡相關管理員。您當前的IP地址是$3,此次封禁的ID爲#$5。請在您的查詢中註明上述所有信息。",
 'autoblockedtext' => "{{GENDER:|你|妳|你}}的IP地址已經被自動查封,由於先前的另一位用戶被$1所查封。
 而查封的原因是:
 
@@ -864,6 +870,7 @@ $2
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
+'continue-editing' => '繼續編輯',
 'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
 'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
 請再試一次。
@@ -877,6 +884,7 @@ $2
 這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
 'edit_form_incomplete' => '編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。',
 'editing' => '編輯“$1”',
+'creating' => '創建$1',
 'editingsection' => '編輯“$1”(段落)',
 'editingcomment' => '編輯“$1”(新段落)',
 'editconflict' => '編輯衝突:$1',
@@ -942,6 +950,7 @@ $2
 'edit-no-change' => '您的編輯已經略過,因為文字無任何改動。',
 'edit-already-exists' => '不可以建立一個新頁面。
 它已經存在。',
+'defaultmessagetext' => '預設訊息文字',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 這個頁面有太多耗費的語法功能呼叫。
@@ -957,6 +966,12 @@ $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' => '頁面超出擴展深度',
+'parser-unstrip-loop-warning' => '檢測到迴圈',
+'parser-unstrip-recursion-limit' => '遞歸超過限制 ($1)',
 
 # "Undo" feature
 'undo-success' => '該編輯可以被撤銷。請檢查以下對比以核實這正是您想做的,然後儲存以下更改以完成撤銷編輯。',
@@ -1048,7 +1063,7 @@ $2
 'revdelete-hide-comment' => '隱藏編輯摘要',
 'revdelete-hide-user' => '隱藏編輯者的用戶名/IP地址',
 'revdelete-hide-restricted' => '同時廢止由操作員以及其他用戶的資料',
-'revdelete-radio-same' => '(勿更改)',
+'revdelete-radio-same' => '(不要更改)',
 'revdelete-radio-set' => '是',
 'revdelete-radio-unset' => '否',
 'revdelete-suppress' => '同時廢止由操作員以及其他用戶的資料',
@@ -1083,7 +1098,7 @@ $1",
 
 # Suppression log
 'suppressionlog' => '監督日誌',
-'suppressionlogtext' => '該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|IP封鎖名單]]以查詢當前的封禁列表。',
+'suppressionlogtext' => '該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|封鎖名單]]以查詢當前的封禁列表。',
 
 # History merging
 'mergehistory' => '合併頁面歷史',
@@ -1115,8 +1130,9 @@ $1",
 'mergelogpagetext' => '以下是一個最近由一個頁面的修訂歷史合併到另一個頁面的列表。',
 
 # Diffs
-'history-title' => '「$1」的修訂歷史',
-'difference' => '(修訂版本間的差異)',
+'history-title' => '$1:修訂歷史',
+'difference-title' => '$1:修訂版本之間的差異',
+'difference-title-multipage' => '"$1"和"$2": 頁面之間的差異',
 'difference-multipage' => '(頁面間的差異)',
 'lineno' => '第$1行:',
 'compareselectedversions' => '比較選定的修訂版本',
@@ -1211,6 +1227,7 @@ $1",
 'prefs-beta' => 'Beta 特性',
 'prefs-datetime' => '日期和時間',
 'prefs-labs' => '實驗中的功能',
+'prefs-user-pages' => '用戶頁面',
 'prefs-personal' => '用戶資料',
 'prefs-rc' => '最近更改',
 'prefs-watchlist' => '監視列表',
@@ -1472,7 +1489,7 @@ $1",
 'nchanges' => '$1次更改',
 'recentchanges' => '近期變動',
 'recentchanges-legend' => '最近更改選項',
-'recentchangestext' => '跟蹤這個wiki上的最新更改。',
+'recentchanges-summary' => '跟蹤這個wiki上的最新更改。',
 'recentchanges-feed-description' => '追蹤此訂閱在 wiki 上的最近更改。',
 'recentchanges-label-newpage' => '這次編輯建立了一個新頁面',
 'recentchanges-label-minor' => '這是一個小編輯',
@@ -1502,6 +1519,7 @@ $1",
 'newsectionsummary' => '/* $1 */ 新段落',
 'rc-enhanced-expand' => '顯示細節 (需要 JavaScript)',
 'rc-enhanced-hide' => '隱藏細節',
+'rc-old-title' => '最初創建為"$1"',
 
 # Recent changes linked
 'recentchangeslinked' => '相關更改',
@@ -1638,6 +1656,7 @@ $1',
 'upload-too-many-redirects' => '在網址中有太多重新定向',
 'upload-unknown-size' => '未知的大小',
 'upload-http-error' => '已發生一個HTTP錯誤:$1',
+'upload-copy-upload-invalid-domain' => '不能從該域名上載檔𣗈副本。',
 
 # File backend
 'backend-fail-stream' => '無法流傳送文件$1。',
@@ -1655,13 +1674,19 @@ $1',
 'backend-fail-writetemp' => '無法寫臨時文件。',
 'backend-fail-closetemp' => '無法創建臨時文件。',
 'backend-fail-read' => '找不到文件“$1”。',
-'backend-fail-create' => '找不到「$1」檔案。',
+'backend-fail-create' => '無法寫入檔案  $1。',
+'backend-fail-maxsize' => '無法寫入檔𣗈$1​​,因為它大於$2字節。',
 'backend-fail-readonly' => '「$1」儲存後端目前是唯讀模式,因為:「$2」',
-'backend-fail-synced' => '文件"$1"在內部後端是不一致的區域。',
-'backend-fail-connect' => '無法連結至檔案後方“$1”。',
-'backend-fail-internal' => '檔案後方“$1”發生了一個未知錯誤。',
+'backend-fail-synced' => 'æ\96\87件"$1"å\9c¨å\85§é\83¨å­\98å\84²å¾\8c端æ\98¯ä¸\8dä¸\80è\87´ç\9a\84å\8d\80å\9f\9fã\80\82',
+'backend-fail-connect' => '無法連結至存儲後方“$1”。',
+'backend-fail-internal' => '存儲後方“$1”發生了一個未知錯誤。',
 'backend-fail-contenttype' => '無法確定檔案的內容類型以存儲於“$1”。',
-'backend-fail-batchsize' => '鑒於一批後端 $1 檔 {{PLURAL:$1| operation|operations}} ;限制是 $2   {{PLURAL:$2| operation|operations}}。',
+'backend-fail-batchsize' => '存儲後端被給予了$1次檔𣗈 {{PLURAL:$1|操作|操作}} ;限制是$2次{{PLURAL:$2|操作|操作}}。',
+'backend-fail-usable' => '由於沒有足夠的權限或缺少路徑/容器,所以無法寫入檔𣗈 $1 。',
+
+# File journal errors
+'filejournal-fail-dbconnect' => '無法連接到後端存儲的日誌資料庫" $1 "。',
+'filejournal-fail-dbquery' => '無法更新後端存儲的日誌資料庫" $1 "。',
 
 # Lock manager
 'lockmanager-notlocked' => '無法解鎖「$1」;它沒有被鎖定。',
@@ -1694,7 +1719,10 @@ $1',
 
 # img_auth script messages
 'img-auth-accessdenied' => '拒絕存取',
-'img-auth-nopathinfo' => 'PATH_INFO缺失。您的服務器尚未設置傳送該信息。它可能是基於CGI的,因而不支持img_auth。[https://www.mediawiki.org/wiki/Manual:Image_Authorization 參見圖片認證。]',
+'img-auth-nopathinfo' => 'PATH_INFO缺失。
+您的服務器尚未設置傳送該信息。
+它可能是基於CGI的,因而不支持img_auth。
+請參見 https://www.mediawiki.org/wiki/Manual:Image_Authorization',
 'img-auth-notindir' => '所請求的路徑不在已經設定的上載目錄。',
 'img-auth-badtitle' => '不能夠由"$1"建立一個有效標題。',
 'img-auth-nologinnWL' => '您而家並未登入,"$1"不在白名單上。',
@@ -1776,6 +1804,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' => '上傳該檔案的新版本',
@@ -1973,6 +2005,7 @@ Template:消除歧義',
 'alllogstext' => '綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。',
 'logempty' => '在日誌中不存在匹配項。',
 'log-title-wildcard' => '搜尋以這個文字開始的標題',
+'showhideselectedlogentries' => '顯示/隱藏所選的日誌項目',
 
 # Special:AllPages
 'allpages' => '所有頁面',
@@ -1990,6 +2023,12 @@ Template:消除歧義',
 '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' => '頁面分類',
@@ -2061,9 +2100,9 @@ Template:消除歧義',
 'emailuser' => 'E-mail該用戶',
 'emailpage' => 'E-mail用戶',
 'emailpagetext' => '您可以用下面的表格去寄一封電郵給這位用戶。
-您在[[Special:Preferences|您參數設置]]中所輸入的e-mail地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。',
+您在[[Special:Preferences|您的參數設置]]中所輸入的電子郵件地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。',
 'usermailererror' => '目標郵件地址返回錯誤:',
-'defemailsubject' => '{{SITENAME}}用戶 $1 發送電子郵件',
+'defemailsubject' => '{{SITENAME}}來自用戶“$1”的電子郵件',
 'usermaildisabled' => '用戶電郵已停用',
 'usermaildisabledtext' => '您不可以發送電郵到這個wiki上的其他用戶',
 'noemailtitle' => '無e-mail地址',
@@ -2426,8 +2465,8 @@ $1',
 'ipb-confirm' => '確認封禁',
 'badipaddress' => '無效IP地址',
 'blockipsuccesssub' => '查封成功',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。
-<br />參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]]已經被查封。<br />
+參看[[Special:BlockList|被封IP地址列表]]以覆審查封。',
 'ipb-blockingself' => '你要封禁自己!確認要這樣做嗎?',
 'ipb-confirmhideuser' => '你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?',
 'ipb-edit-dropdown' => '編輯查封原因',
@@ -2739,7 +2778,7 @@ $1被封禁的理由是“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript測試',
-'javascripttest-disabled' => 'æ­¤å\8a\9fè\83½å·²ç¦\81用。',
+'javascripttest-disabled' => 'æ­¤å\8a\9fè\83½å\9c¨æ­¤Wikiä¸\8aæ\9cªè¢«ä½¿用。',
 'javascripttest-title' => '運行$1測試。',
 'javascripttest-pagetext-noframework' => '這個頁面預留了作JavaScript測試。',
 'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
@@ -2830,6 +2869,11 @@ $1被封禁的理由是“$2”',
 'vector.css' => '/* 此處的 CSS 將影響使用 Vector 面板的用戶 */',
 'print.css' => '/* 此處的 CSS 將影響打印輸出 */',
 'handheld.css' => '/* 此處的 CSS 將影響在 $wgHandheldStyle 設定手提裝置面板 */',
+'noscript.css' => '/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */',
+'group-autoconfirmed.css' => '/* 此處的 CSS 將只會影響自動確認用戶 */',
+'group-bot.css' => '/* 此處的 CSS 將只會影響機器人 */',
+'group-sysop.css' => '/* 此處的 CSS 將只會影響管理員 */',
+'group-bureaucrat.css' => '/* 此處的 CSS 將只會影響行政員 */',
 
 # Scripts
 'common.js' => '/* 此處的JavaScript將載入於所有用戶每一個頁面。 */',
@@ -2866,6 +2910,7 @@ $1被封禁的理由是“$2”',
 'spambot_username' => 'MediaWiki 廣告清除',
 'spam_reverting' => '恢復到不包含連結至$1的最近修訂版本',
 'spam_blanking' => '所有包含連結至$1的修訂,清空',
+'spam_deleting' => '所有包含連結至$1的修訂,刪除中',
 
 # Info page
 'pageinfo-title' => '" $1 "的信息',
@@ -2971,14 +3016,20 @@ To disable showing a particular link, set it to 'disable', e.g.
 'variantname-zh-sg' => 'disable',
 Variants for Chinese language
 */
-'variantname-zh-hans' => '簡體',
-'variantname-zh-hant' => '繁體',
+'variantname-zh-hans' => '‪中文(简体)',
+'variantname-zh-hant' => '‪中文(繁體)',
 'variantname-zh-cn' => '大陸簡體',
 'variantname-zh-tw' => '台灣正體',
 'variantname-zh-hk' => '香港繁體',
+'variantname-zh-mo' => '澳門繁體',
 'variantname-zh-sg' => '新加坡簡體',
+'variantname-zh-my' => '马来西亚简体',
 'variantname-zh' => '不轉換',
 
+# Variants for Gan language
+'variantname-gan-hans' => '‪中文(简体)',
+'variantname-gan-hant' => '‪中文(繁體)',
+
 # Metadata
 'metadata' => '元數據',
 'metadata-help' => '此檔案中包含有擴展的訊息。這些訊息可能是由數位相機或掃描儀在創建或數字化過程中所添加的。
@@ -3488,6 +3539,7 @@ $5
 
 # Separators for various lists, etc.
 'comma-separator' => '、',
+'colon-separator' => ':',
 'word-separator' => '',
 'parentheses' => '($1)',
 
@@ -3587,6 +3639,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' => '檔案路徑',
@@ -3774,4 +3829,17 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'api-error-uploaddisabled' => '本wiki的上傳檔案功能已停用。',
 'api-error-verification-error' => '本檔案可能已損壞,或副檔名錯誤。',
 
+# Durations
+'duration-seconds' => '$1秒',
+'duration-minutes' => '$1分',
+'duration-hours' => '$1小時',
+'duration-days' => '$1天',
+'duration-weeks' => '$1週',
+'duration-years' => '$1年',
+'duration-decades' => '$1十年',
+'duration-centuries' => '$1世紀',
+'duration-millennia' => '$1千年',
+
+# Unknown messages
+'lockmanager-fail-svr-acquire' => '無法取得伺服器$1上的鎖。',
 );
index 6e82971..4c72080 100644 (file)
--- a/load.php
+++ b/load.php
  * @file
  * @author Roan Kattouw
  * @author Trevor Parscal
- *
  */
 
 // 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 529e7f7..728530f 100644 (file)
--- a/load.php5
+++ b/load.php5
@@ -1 +1,24 @@
-<?php require './load.php';
\ No newline at end of file
+<?php
+/**
+ * Version of load.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './load.php';
index 5d76cdf..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' );
 }
@@ -320,11 +320,7 @@ abstract class Maintenance {
                }
                if ( $channel === null ) {
                        $this->cleanupChanneled();
-                       if( php_sapi_name() == 'cli' ) {
-                               fwrite( STDOUT, $out );
-                       } else {
-                               print( $out );
-                       }
+                       print( $out );
                } else {
                        $out = preg_replace( '/\n\z/', '', $out );
                        $this->outputChanneled( $out, $channel );
@@ -358,11 +354,7 @@ abstract class Maintenance {
         */
        public function cleanupChanneled() {
                if ( !$this->atLineStart ) {
-                       if( php_sapi_name() == 'cli' ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                        $this->atLineStart = true;
                }
        }
@@ -381,31 +373,17 @@ abstract class Maintenance {
                        return;
                }
 
-               $cli = php_sapi_name() == 'cli';
-
                // End the current line if necessary
                if ( !$this->atLineStart && $channel !== $this->lastChannel ) {
-                       if( $cli ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                }
 
-               if( $cli ) {
-                       fwrite( STDOUT, $msg );
-               } else {
-                       print $msg;
-               }
+               print $msg;
 
                $this->atLineStart = false;
                if ( $channel === null ) {
                        // For unchanneled messages, output trailing newline immediately
-                       if( $cli ) {
-                               fwrite( STDOUT, "\n" );
-                       } else {
-                               print "\n";
-                       }
+                       print "\n";
                        $this->atLineStart = true;
                }
                $this->lastChannel = $channel;
index 114297c..6c07858 100644 (file)
@@ -16,7 +16,7 @@ CREATE TABLE /*_*/filejournal (
   fj_new_sha1 varbinary(32) NOT NULL default '',
   -- Timestamp of the batch operation
   fj_timestamp varbinary(14) NOT NULL default ''
-);
+) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/fj_batch_id ON /*_*/filejournal (fj_batch_uuid);
 CREATE INDEX /*i*/fj_timestamp ON /*_*/filejournal (fj_timestamp);
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 6e09671..78cae8c 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * quick hackjob to fix damages imports on wikisource
- * page records have page_latest wrong
+ * Corrects wrong values in the `page_latest` field in the database.
  *
  * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * http://www.mediawiki.org/
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to correct wrong values in the `page_latest` field
+ * in the database.
+ *
+ * @ingroup Maintenance
+ */
 class AttachLatest extends Maintenance {
 
        public function __construct() {
index 6752166..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;
                                        }
@@ -444,6 +446,13 @@ class TextPassDumper extends BackupDumper {
                                        } else {
                                                $text = $this->getTextDb( $id );
                                        }
+
+                                       // No more checks for texts from DB for now.
+                                       // If we received something that is not false,
+                                       // We treat it as good text, regardless of whether it actually is or is not
+                                       if ( $text !== false ) {
+                                               return $text;
+                                       }
                                }
 
                                if ( $text === false ) {
@@ -480,20 +489,22 @@ class TextPassDumper extends BackupDumper {
                        // Something went wrong; we did not a text that was plausible :(
                        $failures++;
 
-
-                       // After backing off for some time, we try to reboot the whole process as
-                       // much as possible to not carry over failures from one part to the other
-                       // parts
-                       sleep( $this->failureTimeout );
-                       try {
-                               $this->rotateDb();
-                               if ( $this->spawn ) {
-                                       $this->closeSpawn();
-                                       $this->openSpawn();
+                       // A failure in a prefetch hit does not warrant resetting db connection etc.
+                       if ( ! $tryIsPrefetch ) {
+                               // After backing off for some time, we try to reboot the whole process as
+                               // much as possible to not carry over failures from one part to the other
+                               // parts
+                               sleep( $this->failureTimeout );
+                               try {
+                                       $this->rotateDb();
+                                       if ( $this->spawn ) {
+                                               $this->closeSpawn();
+                                               $this->openSpawn();
+                                       }
+                               } catch ( Exception $e ) {
+                                       $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
+                                               " Trying to continue anyways" );
                                }
-                       } catch ( Exception $e ) {
-                               $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
-                                       " Trying to continue anyways" );
                        }
                }
 
diff --git a/maintenance/benchmarks/bench_utf8_title_check.php b/maintenance/benchmarks/bench_utf8_title_check.php
new file mode 100644 (file)
index 0000000..2e4b902
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**\r
+ * @file\r
+ * @ingroup Benchmark\r
+ */\r
+\r
+require_once( dirname( __FILE__ ) . '/Benchmarker.php' );\r
+
+/**
+ * This little benchmark executes the regexp used in Language->checkTitleEncoding() and compares its execution time
+ * against that of mb_check_encoding, if available.
+ */\r
+class bench_utf8_title_check extends Benchmarker {
+
+       private $canRun;
+
+       private $data;
+
+       public function __construct() {\r
+               parent::__construct();
+
+               $this->data = array (
+                       "",
+                       "United States of America", // 7bit ASCII
+                       "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e",
+                       "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn",
+                       // This comes from bug 36839
+                       "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
+                       . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
+                       . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
+                       . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
+                       . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
+                       . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
+                       . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
+                       . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
+                       . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
+                       . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
+                       . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
+                       . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
+                       . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
+                       . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
+               );
+
+               $this->canRun = function_exists ( 'mb_check_encoding' );
+
+               if ( $this->canRun ) {\r
+                       $this->mDescription = "Benchmark for using a regexp vs. mb_check_encoding to check for UTF-8 encoding.";
+                       mb_internal_encoding( 'UTF-8' );
+               } else {
+                       $this->mDescription = "CANNOT RUN benchmark using mb_check_encoding: function not available.";
+               }\r
+       }\r
+\r
+       public function execute() {
+               if ( !$this->canRun ) {
+                       return;
+               }
+               $benchmarks = array();
+               foreach ($this->data as $val) {
+                       $benchmarks[] = array(
+                               'function' => array( $this, 'use_regexp' ),
+                               'args' => array( rawurldecode ( $val ) )
+                       );
+                       $benchmarks[] = array(
+                               'function' => array( $this, 'use_regexp_non_capturing' ),
+                               'args' => array( rawurldecode ( $val ) )
+                       );
+                       $benchmarks[] = array(
+                               'function' => array( $this, 'use_regexp_once_only' ),
+                               'args' => array( rawurldecode ( $val ) )
+                       );
+                       $benchmarks[] = array(\r
+                               'function' => array( $this, 'use_mb_check_encoding' ),\r
+                               'args' => array( rawurldecode ( $val ) )\r
+                       );
+               }\r
+               $this->bench( $benchmarks );
+               print $this->getFormattedResults();\r
+       }\r
+
+       private $isutf8;
+\r
+       function use_regexp( $s ) {
+               $this->isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );\r
+       }\r
+\r
+       function use_regexp_non_capturing( $s ) {
+               // Same as above with a non-capturing subgroup.
+               $this->isutf8 = preg_match( '/^(?:[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+       }
+
+       function use_regexp_once_only( $s ) {
+               // Same as above with a once-only subgroup.
+               $this->isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+       }
+
+       function use_mb_check_encoding( $s ) {\r
+               $this->isutf8 = mb_check_encoding( $s, 'UTF-8' );\r
+       }\r
+\r
+}\r
+\r
+$maintClass = 'bench_utf8_title_check';\r
+require_once( RUN_MAINTENANCE_IF_MAIN );\r
index cfcac40..e4063f9 100644 (file)
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to change the password of a given user.
+ *
+ * @ingroup Maintenance
+ */
 class ChangePassword extends Maintenance {
        public function __construct() {
                parent::__construct();
index d199b6f..ea6c09f 100644 (file)
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to check classes definitions in the autoloader.
+ *
+ * @ingroup Maintenance
+ */
 class CheckAutoLoader extends Maintenance {
        public function __construct() {
                parent::__construct();
index bac2ff6..f8b8955 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * CheckBadRedirects - See if pages marked as being redirects
- * really are.
+ * Check that pages marked as being redirects really are.
  *
  * 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
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to check that pages marked as being redirects really are.
+ *
+ * @ingroup Maintenance
+ */
 class CheckBadRedirects extends Maintenance {
        public function __construct() {
                parent::__construct();
index 484217d..d7463ec 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Check images to see if they exist, are readable, etc etc
+ * Check images to see if they exist, are readable, etc.
  *
  * 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
  */
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to check images to see if they exist, are readable, etc.
+ *
+ * @ingroup Maintenance
+ */
 class CheckImages extends Maintenance {
 
        public function __construct() {
index 6137a95..3019b84 100644 (file)
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to check syntax of all PHP files in MediaWiki.
+ *
+ * @ingroup Maintenance
+ */
 class CheckSyntax extends Maintenance {
 
        // List of files we're going to check
index 9b98721..6a9294a 100644 (file)
@@ -1,8 +1,6 @@
 <?php
 /**
- * This script verifies that database usernames are actually valid.
- * An existing usernames can become invalid if User::isValidUserName()
- * is altered or if we change the $wgMaxNameChars
+ * Check that database usernames are actually valid.
  *
  * 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
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to check that database usernames are actually valid.
+ *
+ * An existing usernames can become invalid if User::isValidUserName()
+ * is altered or if we change the $wgMaxNameChars
+ *
+ * @ingroup Maintenance
+ */
 class CheckUsernames extends Maintenance {
 
        public function __construct() {
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 8a760cd..f104899 100644 (file)
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
 class CleanupSpam extends Maintenance {
+
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Cleanup all spam from a given hostname";
                $this->addOption( 'all', 'Check all wikis in $wgLocalDatabases' );
-               $this->addArg( 'hostname', 'Hostname that was spamming' );
+               $this->addOption( 'delete', 'Delete pages containing only spam instead of blanking them' );
+               $this->addArg( 'hostname', 'Hostname that was spamming, single * wildcard in the beginning allowed' );
        }
 
        public function execute() {
@@ -108,15 +110,19 @@ class CleanupSpam extends Maintenance {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->begin( __METHOD__ );
                        $page = WikiPage::factory( $title );
-                       if ( !$rev ) {
-                               // Didn't find a non-spammy revision, blank the page
-                               $this->output( "blanking\n" );
-                               $page->doEdit( '', wfMsgForContent( 'spam_blanking', $domain ) );
-                       } else {
+                       if ( $rev ) {
                                // Revert to this revision
                                $this->output( "reverting\n" );
                                $page->doEdit( $rev->getText(), wfMsgForContent( 'spam_reverting', $domain ),
                                        EDIT_UPDATE, $rev->getId() );
+                       } elseif ( $this->hasOption( 'delete' ) ) {
+                               // Didn't find a non-spammy revision, blank the page
+                               $this->output( "deleting\n" );
+                               $page->doDeleteArticle( wfMsgForContent( 'spam_deleting', $domain ) );
+                       } else {
+                               // Didn't find a non-spammy revision, blank the page
+                               $this->output( "blanking\n" );
+                               $page->doEdit( '', wfMsgForContent( 'spam_blanking', $domain ) );
                        }
                        $dbw->commit( __METHOD__ );
                }
index 5f57ffd..c8d8924 100644 (file)
@@ -68,15 +68,21 @@ class UploadStashCleanup extends Maintenance {
                // out-of-date someday
                $stash = new UploadStash( $repo );
 
+               $i = 0;
                foreach( $keys as $key ) {
+                       $i++;
                        try {
                                $stash->getFile( $key, true );
                                $stash->removeFileNoAuth( $key );
                        } catch ( UploadStashBadPathException $ex ) {
                                $this->output( "Failed removing stashed upload with key: $key\n"  );
                        }
+                       if ( $i % 100 == 0 ) {
+                               $this->output( "$i\n" );
+                       }
                }
-       }
+               $this->output( "$i done\n" );
+       }
 }
 
 $maintClass = "UploadStashCleanup";
index 85ef5c8..275d8fa 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 /**
- * Convert from the old links schema (string->ID) to the new schema (ID->ID)
- * The wiki should be put into read-only mode while this script executes
+ * Convert from the old links schema (string->ID) to the new schema (ID->ID).
  *
  * 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
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to convert from the old links schema (string->ID)
+ * to the new schema (ID->ID).
+ *
+ * The wiki should be put into read-only mode while this script executes.
+ *
+ * @ingroup Maintenance
+ */
 class ConvertLinks extends Maintenance {
        private $logPerformance;
 
        public function __construct() {
                parent::__construct();
-               $this->mDescription = "Convert from the old links schema (string->ID) to the new schema (ID->ID)
+               $this->mDescription = "Convert from the old links schema (string->ID) to the new schema (ID->ID).
 The wiki should be put into read-only mode while this script executes";
 
                $this->addArg( 'logperformance', "Log performance to perfLogFilename.", false );
index da6ff9b..e666b65 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Do each user sequentially, since accounts can't be deleted
+ * Convert user options to the new `user_properties` 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
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to convert user options to the new `user_properties` table.
+ *
+ * Do each user sequentially, since accounts can't be deleted
+ *
+ * @ingroup Maintenance
+ */
 class ConvertUserOptions extends Maintenance {
 
        private $mConversionCount = 0;
diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
new file mode 100644 (file)
index 0000000..530b5ca
--- /dev/null
@@ -0,0 +1,145 @@
+<?php
+/**
+ * Copy all files in some containers of one backend to another.
+ *
+ * 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 Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+/**
+ * Copy all files in one container of one backend to another.
+ *
+ * This can also be used to re-shard the files for one backend using the
+ * config of second backend. The second backend should have the same config
+ * as the first, except for it having a different name and different sharding
+ * configuration. The backend should be made read-only while this runs.
+ * After this script finishes, the old files in the containers can be deleted.
+ *
+ * @ingroup Maintenance
+ */
+class CopyFileBackend extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Copy files in one backend to another.";
+               $this->addOption( 'src', 'Backend containing the source files', true, true );
+               $this->addOption( 'dst', 'Backend where files should be copied to', true, true );
+               $this->addOption( 'containers', 'Pipe separated list of containers', true, true );
+               $this->addOption( 'subdir', 'Only do items in this child directory', false, true );
+               $this->setBatchSize( 50 );
+       }
+
+       public function execute() {
+               $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
+               $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+               $containers = explode( '|', $this->getOption( 'containers' ) );
+               $subDir = $this->getOption( rtrim( 'subdir', '/' ), '' );
+
+               $count = 0;
+               foreach ( $containers as $container ) {
+                       if ( $subDir != '' ) {
+                               $backendRel = "$container/$subDir";
+                               $this->output( "Doing container '$container', directory '$subDir'...\n" );
+                       } else {
+                               $backendRel = $container;
+                               $this->output( "Doing container '$container'...\n" );
+                       }
+
+                       $dir = $src->getRootStoragePath() . "/$backendRel";
+                       $srcPathsRel = $src->getFileList( array( 'dir' => $dir ) );
+                       if ( $srcPathsRel === null ) {
+                               $this->error( "Could not list files in $container.", 1 ); // die
+                       }
+
+                       $batchPaths = array();
+                       foreach ( $srcPathsRel as $srcPathRel ) {
+                               $batchPaths[$srcPathRel] = 1; // remove duplicates
+                               if ( count( $batchPaths ) >= $this->mBatchSize ) {
+                                       $this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
+                                       $batchPaths = array(); // done
+                               }
+                               ++$count;
+                       }
+                       if ( count( $batchPaths ) ) { // left-overs
+                               $this->copyFileBatch( array_keys( $batchPaths ), $backendRel, $src, $dst );
+                               $batchPaths = array(); // done
+                       }
+
+                       if ( $subDir != '' ) {
+                               $this->output( "Finished container '$container', directory '$subDir'.\n" );
+                       } else {
+                               $this->output( "Finished container '$container'.\n" );
+                       }
+               }
+
+               $this->output( "Done [$count file(s)].\n" );
+       }
+
+       protected function copyFileBatch(
+               array $srcPathsRel, $backendRel, FileBackend $src, FileBackend $dst
+       ) {
+               $ops = array();
+               $fsFiles = array();
+               foreach ( $srcPathsRel as $srcPathRel ) {
+                       $srcPath = $src->getRootStoragePath() . "/$backendRel/$srcPathRel";
+                       $dstPath = $dst->getRootStoragePath() . "/$backendRel/$srcPathRel";
+                       if ( $this->filesAreSame( $src, $dst, $srcPath, $dstPath ) ) {
+                               $this->output( "Already have $srcPathRel.\n" );
+                               continue; // assume already copied...
+                       }
+                       // Note: getLocalReference() is fast for FS backends
+                       $fsFile = $src->getLocalReference( array( 'src' => $srcPath, 'latest' => 1 ) );
+                       if ( !$fsFile ) {
+                               $this->error( "Could not get local copy of $srcPath.", 1 ); // die
+                       }
+                       $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
+                       // Note: prepare() is usually fast for key/value backends
+                       $status = $dst->prepare( array( 'dir' => dirname( $dstPath ) ) );
+                       if ( !$status->isOK() ) {
+                               $this->error( print_r( $status->getErrorsArray(), true ) );
+                               $this->error( "Could not copy $srcPath to $dstPath.", 1 ); // die
+                       }
+                       $ops[] = array( 'op' => 'store',
+                               'src' => $fsFile->getPath(), 'dst' => $dstPath, 'overwrite' => 1 );
+               }
+
+               $status = $dst->doOperations( $ops, array( 'nonJournaled' => 1 ) );
+               if ( !$status->isOK() ) {
+                       $this->error( print_r( $status->getErrorsArray(), true ) );
+                       $this->error( "Could not copy file batch.", 1 ); // die
+               } else {
+                       $this->output( "Copied these file(s):\n" . implode( "\n", $srcPathsRel ) . "\n\n" );
+               }
+       }
+
+       protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
+               return (
+                       ( $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->fileExists( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
+                       ) && ( $src->getFileSize( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSize( array( 'src' => $dPath, 'latest' => 1 ) ) // short-circuit
+                       ) && ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
+                               === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) )
+                       )
+               );
+       }
+}
+
+$maintClass = 'CopyFileBackend';
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 0d7de9a..3f328f9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Maintenance script to create an account and grant it administrator rights
+ * Creates an account and grant it administrator rights.
  *
  * 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
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 
+/**
+ * Maintenance script to create an account and grant it administrator rights.
+ *
+ * @ingroup Maintenance
+ */
 class CreateAndPromote extends Maintenance {
 
        public function __construct() {
@@ -76,4 +81,4 @@ class CreateAndPromote extends Maintenance {
 }
 
 $maintClass = "CreateAndPromote";
-require_once( RUN_MAINTENANCE_IF_MAIN );
\ No newline at end of file
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 2eacb73..728997d 100644 (file)
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  */
 
+/**
+ * Core functions for deleteArchivedFiles.php
+ *
+ * @ingroup Maintenance
+ */
 class DeleteArchivedFilesImplementation {
        static public function doDelete( $output, $force ) {
                # Data should come off the master, wrapped in a transaction
@@ -62,4 +68,4 @@ class DeleteArchivedFilesImplementation {
                $dbw->commit( __METHOD__ );
                $output->handleOutput( "Done! [$count file(s)]\n" );
        }
-}
\ No newline at end of file
+}
index 6067c80..8709ee8 100644 (file)
@@ -1,8 +1,9 @@
 <?php
-
 /**
  * Delete archived (non-current) files from the database
  *
+ * Based on deleteOldRevisions.php by Rob Church.
+ *
  * 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Aaron Schulz
- * Based on deleteOldRevisions.php by Rob Church
  */
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 require_once( dirname( __FILE__ ) . '/deleteArchivedFiles.inc' );
 
+/**
+ * Maintenance script to delete archived (non-current) files from the database.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteArchivedFiles extends Maintenance {
        public function __construct() {
                parent::__construct();
index 0faa0ab..353661a 100644 (file)
@@ -1,8 +1,9 @@
 <?php
-
 /**
  * Delete archived (deleted from public) revisions from the database
  *
+ * Shamelessly stolen from deleteOldRevisions.php by Rob Church :)
+ *
  * 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
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  * http://www.gnu.org/copyleft/gpl.html
  *
+ * @file
  * @ingroup Maintenance
  * @author Aaron Schulz
- * Shamelessly stolen from deleteOldRevisions.php by Rob Church :)
  */
 
 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
 require_once( dirname( __FILE__ ) . '/deleteArchivedRevisions.inc' );
 
+/**
+ * Maintenance script to delete archived (deleted from public) revisions
+ * from the database.
+ *
+ * @ingroup Maintenance
+ */
 class DeleteArchivedRevisions extends Maintenance {
        public function __construct() {
                parent::__construct();
index 6b29c5f..2bb2a0f 100644 (file)
@@ -93,6 +93,11 @@ if ( $maintenance->getDbType() === Maintenance::DB_ADMIN &&
 {
        require( MWInit::interpretedPath( 'AdminSettings.php' ) );
 }
+
+if ( $maintenance->getDbType() === Maintenance::DB_NONE ) {
+       if ( $wgLocalisationCacheConf['storeClass'] === false && ( $wgLocalisationCacheConf['store'] == 'db' || ( $wgLocalisationCacheConf['store'] == 'detect' && !$wgCacheDirectory ) ) )
+               $wgLocalisationCacheConf['storeClass'] = 'LCStore_Null';
+}
 $maintenance->finalSetup();
 // Some last includes
 require_once( MWInit::compiledPath( 'includes/Setup.php' ) );
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 );
diff --git a/maintenance/fileOpPerfTest.php b/maintenance/fileOpPerfTest.php
new file mode 100644 (file)
index 0000000..b16bd95
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+/**
+ * Maintenance script to test fileop performance
+ *
+ * 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 Maintenance
+ */
+
+$initialTime = microtime( true );
+$wgProfiler = array( 'class' => 'ProfilerSimpleText' );
+error_reporting( E_ALL );
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class TestFileOpPerformance extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Test fileop performance";
+               $this->addOption( 'b1', 'Backend 1', true, true );
+               $this->addOption( 'b2', 'Backend 2', false, true );
+               $this->addOption( 'srcdir', 'File source directory', true, true );
+               $this->addOption( 'maxfiles', 'Max files', false, true );
+       }
+
+       public function execute() {
+               $backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
+               $this->doPerfTest( $backend );
+
+               if ( $this->getOption( 'b2' ) ) {
+                       $backend = FileBackendGroup::singleton()->get( $this->getOption( 'b2' ) );
+                       $this->doPerfTest( $backend );
+               }
+
+               $profiler = Profiler::instance();
+               $profiler->setTemplated( true );
+               $profiler->logData(); // prints
+       }
+
+       protected function doPerfTest( FileBackend $backend ) {
+               $ops1 = array();
+               $ops2 = array();
+               $ops3 = array();
+               $ops4 = array();
+               $ops5 = array();
+
+               $baseDir = 'mwstore://' . $backend->getName() . '/testing-cont1';
+               $backend->prepare( array( 'dir' => $baseDir ) );
+
+               $dirname = $this->getOption( 'srcdir' );
+               $dir = opendir( $dirname );
+               if ( !$dir ) {
+                       return;
+               }
+
+               while ( $dir && ( $file = readdir( $dir ) ) !== false ) {
+                       if ( $file[0] != '.' ) {
+                               $this->output( "Using '$dirname/$file' in operations.\n" );
+                               $dst = $baseDir . '/' . wfBaseName( $file );
+                               $ops1[] = array( 'op' => 'store', 'src' => "$dirname/$file", 'dst' => $dst, 'overwrite' => 1);
+                               $ops2[] = array( 'op' => 'copy', 'src' => "$dst", 'dst' => "$dst-1", 'overwrite' => 1);
+                               $ops3[] = array( 'op' => 'move', 'src' => $dst, 'dst' => "$dst-2", 'overwrite' => 1);
+                               $ops4[] = array( 'op' => 'delete', 'src' => "$dst-1", 'overwrite' => 1 );
+                               $ops5[] = array( 'op' => 'delete', 'src' => "$dst-2", 'overwrite' => 1 );
+                       }
+                       if ( count( $ops1 ) >= $this->getOption( 'maxfiles', 20 ) ) {
+                               break; // enough
+                       }
+               }
+               closedir( $dir );
+               $this->output( "\n" );
+
+               $start = microtime( true );
+               $status = $backend->doOperations( $ops1, array( 'force' => 1 ) );
+               $e = ( microtime( true ) - $start ) * 1000;
+               if ( $status->getErrorsArray() ) {
+                       print_r( $status->getErrorsArray() );
+                       exit(0);
+               }
+               $this->output( $backend->getName() . ": Stored " . count( $ops1 ) . " files in $e ms.\n" );
+
+               $start = microtime( true );
+               $backend->doOperations( $ops2, array( 'force' => 1 ) );
+               $e = ( microtime( true ) - $start ) * 1000;
+               if ( $status->getErrorsArray() ) {
+                       print_r( $status->getErrorsArray() );
+                       exit(0);
+               }
+               $this->output( $backend->getName() . ": Copied " . count( $ops2 ) . " files in $e ms.\n" );
+
+               $start = microtime( true );
+               $backend->doOperations( $ops3, array( 'force' => 1 ) );
+               $e = ( microtime( true ) - $start ) * 1000;
+               if ( $status->getErrorsArray() ) {
+                       print_r( $status->getErrorsArray() );
+                       exit(0);
+               }
+               $this->output( $backend->getName() . ": Moved " . count( $ops3 ) . " files in $e ms.\n" );
+
+               $start = microtime( true );
+               $backend->doOperations( $ops4, array( 'force' => 1 ) );
+               $e = ( microtime( true ) - $start ) * 1000;
+               if ( $status->getErrorsArray() ) {
+                       print_r( $status->getErrorsArray() );
+                       exit(0);
+               }
+               $this->output( $backend->getName() . ": Deleted " . count( $ops4 ) . " files in $e ms.\n" );
+
+               $start = microtime( true );
+               $backend->doOperations( $ops5, array( 'force' => 1 ) );
+               $e = ( microtime( true ) - $start ) * 1000;
+               if ( $status->getErrorsArray() ) {
+                       print_r( $status->getErrorsArray() );
+                       exit(0);
+               }
+               $this->output( $backend->getName() . ": Deleted " . count( $ops5 ) . " files in $e ms.\n" );
+       }
+}
+
+$maintClass = "TestFileOpPerformance";
+require_once( RUN_MAINTENANCE_IF_MAIN );
index b3bb50c..fa98813 100644 (file)
@@ -1,5 +1,21 @@
 <?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 Maintenance
  */
 
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 0dc200e..0ce9388 100644 (file)
@@ -2,6 +2,22 @@
 /**
  * Maintenance script to import all scripts in the MediaWiki namespace from a
  * local site.
+ *
+ * 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 Maintenance
  */
index 9a408aa..8e0b2e1 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 );
 }
@@ -39,7 +39,7 @@ class CommandLineInstaller extends Maintenance {
                $this->addArg( 'name', 'The name of the wiki', true);
 
                $this->addArg( 'admin', 'The username of the wiki administrator (WikiSysop)', true );
-               $this->addOption( 'pass', 'The password for the wiki administrator. You will be prompted for this if it isn\'t provided', false, true );
+               $this->addOption( 'pass', 'The password for the wiki administrator.', true, true );
                /* $this->addOption( 'email', 'The email for the wiki administrator', false, true ); */
                $this->addOption( 'scriptpath', 'The relative path of the wiki in the web server (/wiki)', false, true );
 
@@ -81,7 +81,7 @@ class CommandLineInstaller extends Maintenance {
                }
 
                $installer =
-                       new CliInstaller( $siteName, $adminName, $this->mOptions );
+                       InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
                $status = $installer->doEnvironmentChecks();
                if( $status->isGood() ) {
index 2e4f40f..4cb90ff 100644 (file)
@@ -1,5 +1,22 @@
 <?php
 /**
+ * Maintenance script to generate first letter data files for Collation.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
+ *
  * @ingroup Maintenance
  * @file
  */
index c61ae39..9cdbf34 100644 (file)
@@ -123,6 +123,7 @@ $wgIgnoredMessages = array(
        'pubmedurl',
        'randompage-url',
        'recentchanges-url',
+       'recentchangestext',
        'revision-info-current',
        'revision-nav',
        'rfcurl',
@@ -237,6 +238,9 @@ $wgIgnoredMessages = array(
        'version-summary',
        'tags-summary',
        'comparepages-summary',
+       'version-entrypoints-index-php',
+       'version-entrypoints-api-php',
+       'version-entrypoints-load-php',
 );
 
 /** Optional messages, which may be translated only if changed in the target language. */
@@ -448,6 +452,7 @@ $wgOptionalMessages = array(
        'ellipsis',
        'percent',
        'parentheses',
+       'brackets',
        'autocomment-prefix',
        'listgrouprights-right-display',
        'listgrouprights-right-revoked',
@@ -464,6 +469,11 @@ $wgOptionalMessages = array(
        'metadata-langitem',
        'metadata-langitem-default',
        'nocookiesforlogin',
+       'version-entrypoints-articlepath',
+       'version-entrypoints-scriptpath',
+       'mergehistory-revisionrow',
+       'categoryviewer-pagedlinks',
+       'undelete-revisionrow',
 );
 
 /** EXIF messages, which may be set as optional in several checks, but are generally mandatory */
index 4984495..befff60 100644 (file)
@@ -157,6 +157,7 @@ $wgMessageStructure = array(
                'index-category',
                'noindex-category',
                'broken-file-category',
+               'categoryviewer-pagedlinks',
        ),
        'mainpage' => array(
                'linkprefix',
@@ -408,7 +409,11 @@ $wgMessageStructure = array(
                'customjsprotected',
                'ns-specialprotected',
                'titleprotected',
-               'filereadonlyerror'
+               'filereadonlyerror',
+               'invalidtitle-knownnamespace',
+               'invalidtitle-unknownnamespace',
+               'exception-nologin',
+               'exception-nologin-text',
        ),
        'virus' => array(
                'virus-badscanner',
@@ -623,6 +628,7 @@ $wgMessageStructure = array(
                'updated',
                'note',
                'previewnote',
+               'continue-editing',
                'previewconflict',
                'session_fail_preview',
                'session_fail_preview_html',
@@ -687,6 +693,12 @@ $wgMessageStructure = array(
                'parser-template-loop-warning',
                'parser-template-recursion-depth-warning',
                'language-converter-depth-warning',
+               'node-count-exceeded-category',
+               'node-count-exceeded-warning',
+               'expansion-depth-exceeded-category',
+               'expansion-depth-exceeded-warning',
+               'parser-unstrip-loop-warning',
+               'parser-unstrip-recursion-limit',
        ),
        'undo' => array(
                'undo-success',
@@ -823,7 +835,8 @@ $wgMessageStructure = array(
                'mergehistory-autocomment',
                'mergehistory-comment',
                'mergehistory-same-destination',
-               'mergehistory-reason'
+               'mergehistory-reason',
+               'mergehistory-revisionrow'
        ),
        'mergelog' => array(
                'mergelog',
@@ -833,7 +846,8 @@ $wgMessageStructure = array(
        ),
        'diffs' => array(
                'history-title',
-               'difference',
+               'difference-title',
+               'difference-title-multipage',
                'difference-multipage',
                'lineno',
                'compareselectedversions',
@@ -938,6 +952,7 @@ $wgMessageStructure = array(
                'prefs-beta',
                'prefs-datetime',
                'prefs-labs',
+               'prefs-user-pages',
                'prefs-personal',
                'prefs-rc',
                'prefs-watchlist',
@@ -1203,6 +1218,7 @@ $wgMessageStructure = array(
                'recentchanges',
                'recentchanges-url',
                'recentchanges-legend',
+               'recentchanges-summary',
                'recentchangestext',
                'recentchanges-feed-description',
                'recentchanges-label-newpage',
@@ -1378,7 +1394,8 @@ $wgMessageStructure = array(
                'backend-fail-connect',
                'backend-fail-internal',
                'backend-fail-contenttype',
-               'backend-fail-batchsize'
+               'backend-fail-batchsize',
+               'backend-fail-usable'
        ),
 
        'filejournal-errors' => array(
@@ -1392,6 +1409,7 @@ $wgMessageStructure = array(
                'lockmanager-fail-deletelock',
                'lockmanager-fail-acquirelock',
                'lockmanager-fail-openlock',
+               'lockmanager-fail-acquirelock',
                'lockmanager-fail-releaselock',
                'lockmanager-fail-db-bucket',
                'lockmanager-fail-db-release',
@@ -1735,6 +1753,7 @@ $wgMessageStructure = array(
                'alllogstext',
                'logempty',
                'log-title-wildcard',
+               'showhideselectedlogentries',
        ),
        'allpages' => array(
                'allpages',
@@ -1755,6 +1774,11 @@ $wgMessageStructure = array(
                'allpages-bad-ns',
                'allpages-hide-redirects',
        ),
+       'cachedspecial' => array(
+               'cachedspecial-viewing-cached-ttl',
+               'cachedspecial-viewing-cached-ts',
+               'cachedspecial-refresh-now',
+       ),
        'categories' => array(
                'categories',
                'categories-summary',
@@ -2047,6 +2071,7 @@ $wgMessageStructure = array(
                'undelete-error-long',
                'undelete-show-file-confirm',
                'undelete-show-file-submit',
+               'undelete-revisionrow',
        ),
        'nsform' => array(
                'namespace',
@@ -2612,6 +2637,7 @@ $wgMessageStructure = array(
                'spambot_username',
                'spam_reverting',
                'spam_blanking',
+               'spam_deleting',
        ),
        'info' => array(
                'pageinfo-title',
@@ -3303,6 +3329,7 @@ $wgMessageStructure = array(
                'ellipsis',
                'percent',
                'parentheses',
+               'brackets',
        ),
        'imgmulti' => array(
                'imgmultipageprev',
@@ -3483,6 +3510,14 @@ $wgMessageStructure = array(
                'version-software',
                'version-software-product',
                'version-software-version',
+               'version-entrypoints',
+               'version-entrypoints-header-entrypoint',
+               'version-entrypoints-header-url',
+               'version-entrypoints-articlepath',
+               'version-entrypoints-scriptpath',
+               'version-entrypoints-index-php',
+               'version-entrypoints-api-php',
+               'version-entrypoints-load-php',
        ),
        'filepath' => array(
                'filepath',
@@ -3693,6 +3728,17 @@ $wgMessageStructure = array(
                'api-error-uploaddisabled',
                'api-error-verification-error',
        ),
+       'duration' => array(
+               'duration-seconds',
+               'duration-minutes',
+               'duration-hours',
+               'duration-days',
+               'duration-weeks',
+               'duration-years',
+               'duration-decades',
+               'duration-centuries',
+               'duration-millennia'
+       ),
 );
 
 /** Comments for each block */
@@ -3931,4 +3977,6 @@ Variants for Chinese language",
        'logging-irc'           => 'For IRC, see bug 34508. Do not change',
        'feedback'              => 'Feedback',
        'apierrors'             => 'API errors',
+       'duration'              => 'Durations',
+       'cachedspecial'         => 'SpecialCachedPage',
 );
index 643fc5f..ed2dae7 100644 (file)
@@ -36,14 +36,15 @@ require_once( 'writeMessagesArray.inc' );
  * @param bool $removeUnknown Remove the unknown messages?
  * @param bool $removeDupes Remove the duplicated messages?
  * @param $dupeMsgSource string The source file intended to remove from the array.
+ * @param $messagesFolder String: path to a folder to store the MediaWiki messages.
  */
-function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource ) {
+function rebuildLanguage( $languages, $code, $write, $listUnknown, $removeUnknown, $removeDupes, $dupeMsgSource, $messagesFolder ) {
        $messages = $languages->getMessages( $code );
        $messages = $messages['all'];
        if ( $removeDupes ) {
                $messages = removeDupes( $messages, $dupeMsgSource );
        }
-       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown );
+       MessageWriter::writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder );
 }
 
 /**
@@ -85,6 +86,7 @@ Options:
        * no-unknown: Do not list the unknown messages.
        * remove-unknown: Remove unknown messages.
        * remove-duplicates: Remove duplicated messages based on a PHP source file.
+       * messages-folder: An alternative folder with MediaWiki messages.
 
 TEXT;
        exit( 1 );
@@ -109,6 +111,7 @@ $wgWriteToFile = !isset( $options['dry-run'] );
 $wgListUnknownMessages = !isset( $options['no-unknown'] );
 $wgRemoveUnknownMessages = isset( $options['remove-unknown'] );
 $wgRemoveDuplicateMessages = isset( $options['remove-duplicates'] );
+$messagesFolder = isset( $options['messages-folder'] ) ? $options['messages-folder'] : false;
 
 # Get language objects
 $languages = new languages();
@@ -116,8 +119,8 @@ $languages = new languages();
 # Write all the language
 if ( $wgCode == 'all' ) {
        foreach ( $languages->getLanguages() as $languageCode ) {
-               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+               rebuildLanguage( $languages, $languageCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
        }
 } else {
-       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource );
+       rebuildLanguage( $languages, $wgCode, $wgWriteToFile, $wgListUnknownMessages, $wgRemoveUnknownMessages, $wgRemoveDuplicateMessages, $wgDupeMessageSource, $messagesFolder );
 }
index c5d13c9..cd36847 100644 (file)
@@ -41,16 +41,28 @@ class MessageWriter {
         * @param $write Boolean: write to the messages file?
         * @param $listUnknown Boolean: list the unknown messages?
         * @param $removeUnknown Boolean: whether to remove unkown messages
+        * @param $messagesFolder String: path to a folder to store the MediaWiki messages. Defaults to the current install.
         */
-       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown ) {
+       public static function writeMessagesToFile( $messages, $code, $write, $listUnknown, $removeUnknown, $messagesFolder = false ) {
                # Rewrite the messages array
                $messages = self::writeMessagesArray( $messages, $code == 'en', false, $removeUnknown );
                $messagesText = $messages[0];
                $sortedMessages = $messages[1];
 
                # Write to the file
-               $filename = Language::getMessagesFileName( $code );
-               $contents = file_get_contents( $filename );
+               if ( $messagesFolder )
+                       $filename = Language::getFileName( "$messagesFolder/Messages", $code );
+               else
+                       $filename = Language::getMessagesFileName( $code );
+
+               if ( file_exists( $filename ) )
+                       $contents = file_get_contents( $filename );
+               else
+                       $contents = '<?php
+$messages = array(
+);
+';
+
                if( strpos( $contents, '$messages' ) !== false ) {
                        $contents = explode( '$messages', $contents );
                        if( $messagesText == '$messages' . $contents[1] ) {
index 50b939c..ba778f4 100644 (file)
@@ -1,12 +1,28 @@
 <?php
 /**
+ * Simple lock server daemon that accepts lock/unlock requests.
+ *
+ * This code should not require MediaWiki setup or PHP 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 Maintenance
  */
 
-/**
- * This code should not require MediaWiki setup or PHP files.
- */
 if ( php_sapi_name() !== 'cli' ) {
        die( "This is not a valid entry point.\n" );
 }
index 359cd24..088eaa3 100644 (file)
@@ -33,7 +33,7 @@ class mcTest extends Maintenance {
        }
 
        public function execute() {
-               global $wgMemCachedServers;
+               global $wgMemCachedServers, $wgMemCachedTimeout;
 
                $iterations = $this->getOption( 'i', 100 );
                if ( $this->hasArg() ) {
@@ -42,7 +42,10 @@ class mcTest extends Maintenance {
 
                foreach ( $wgMemCachedServers as $server ) {
                        $this->output( $server . " ", $server );
-                       $mcc = new MemCachedClientforWiki( array( 'persistant' => true ) );
+                       $mcc = new MemCachedClientforWiki( array(
+                               'persistant' => true,
+                               'timeout' => $wgMemCachedTimeout
+                       ) );
                        $mcc->set_servers( array( $server ) );
                        $set = 0;
                        $incr = 0;
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 a353504..2edeaba 100644 (file)
@@ -77,9 +77,9 @@ $mwExcludePaths = array(
 
 /** Variable to get user input */
 $input = '';
-$exclude_patterns = '';
+$excludePatterns = '';
 /** Whether to generates man pages: */
-$wgDoxyGenerateMan = false;
+$doxyGenerateMan = false;
 
 #
 # Functions
@@ -128,13 +128,12 @@ function getSvnRevision( $dir ) {
  * @param $svnstat String: path to the svnstat file
  * @param $input String: Path to analyze.
  * @param $exclude String: Additionals path regex to exclude
- * @param $exclude_patterns String: Additionals path regex to exclude
+ * @param $excludePatterns String: Additionals path regex to exclude
  *                 (LocalSettings.php, AdminSettings.php, .svn and .git directories are always excluded)
+ * @param $doxyGenerateMan Boolean
  * @return string
  */
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $exclude_patterns ) {
-
-       global $wgDoxyGenerateMan;
+function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $excludePatterns, $doxyGenerateMan ) {
 
        $template = file_get_contents( $doxygenTemplate );
 
@@ -146,9 +145,9 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
                '{{SVNSTAT}}'          => $svnstat,
                '{{INPUT}}'            => $input,
                '{{EXCLUDE}}'          => $exclude,
-               '{{EXCLUDE_PATTERNS}}' => $exclude_patterns,
+               '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
                '{{HAVE_DOT}}'         => `which dot` ? 'YES' : 'NO',
-               '{{GENERATE_MAN}}'     => $wgDoxyGenerateMan ? 'YES' : 'NO',
+               '{{GENERATE_MAN}}'     => $doxyGenerateMan ? 'YES' : 'NO',
        );
        $tmpCfg = str_replace( array_keys( $replacements ), array_values( $replacements ), $template );
        $tmpFileName = tempnam( wfTempDir(), 'mwdocgen-' );
@@ -186,7 +185,7 @@ if ( is_array( $argv ) ) {
                        }
                        break;
                case '--generate-man':
-                       $wgDoxyGenerateMan = true;
+                       $doxyGenerateMan = true;
                        break;
                case '--help':
                        print <<<END
@@ -252,7 +251,7 @@ case 5:
        break;
 case 6:
        $input = $mwPath;
-       $exclude_patterns = 'extensions';
+       $excludePatterns = 'extensions';
 }
 
 $versionNumber = getSvnRevision( $input );
@@ -268,7 +267,7 @@ if ( $versionNumber === false ) { # Not using subversion ?
 $excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
 print "EXCLUDE: $excludedPaths\n\n";
 
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $version, $svnstat, $input, $excludedPaths, $exclude_patterns );
+$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $version, $svnstat, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan );
 $command = $doxygenBin . ' ' . $generatedConf;
 
 echo <<<TEXT
index 67aa308..ac4e723 100644 (file)
@@ -94,11 +94,12 @@ class nextJobDB extends Maintenance {
                $lb = wfGetLB( $dbName );
                $db = $lb->getConnection( DB_MASTER, array(), $dbName );
                if ( $type === false ) {
-                       $conds = array();
+                       $conds = Job::defaultQueueConditions( );
                } else {
                        $conds = array( 'job_cmd' => $type );
                }
 
+
                $exists = (bool) $db->selectField( 'job', '1', $conds, __METHOD__ );
                $lb->reuseConnection( $db );
                return $exists;
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 54ff247..0847edf 100644 (file)
@@ -50,12 +50,13 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
 
        public function doDBUpdates() {
                $method = $this->getOption( 'method', 'normal' );
-               $file = $this->getOption( 'file' );
+               $file = $this->getOption( 'file', '' );
                $force = $this->getOption( 'force' );
+               $isRegen = ( $force || $file != '' ); // forced recalculation?
 
                $t = -microtime( true );
                $dbw = wfGetDB( DB_MASTER );
-               if ( $file ) {
+               if ( $file != '' ) {
                        $res = $dbw->select(
                                'image',
                                array( 'img_name' ),
@@ -82,10 +83,10 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                $oldImageTable = $dbw->tableName( 'oldimage' );
 
                if ( $method == 'pipe' ) {
-                       // Opening a pipe allows the SHA-1 operation to be done in parallel 
+                       // Opening a pipe allows the SHA-1 operation to be done in parallel
                        // with the database write operation, because the writes are queued
-                       // in the pipe buffer. This can improve performance by up to a 
-                       // factor of 2. 
+                       // in the pipe buffer. This can improve performance by up to a
+                       // factor of 2.
                        global $wgDBuser, $wgDBserver, $wgDBpassword, $wgDBname;
                        $cmd = 'mysql -u' . wfEscapeShellArg( $wgDBuser ) .
                                ' -h' . wfEscapeShellArg( $wgDBserver ) .
@@ -109,25 +110,37 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                        // Upgrade the current file version...
                        $sha1 = $file->getRepo()->getFileSha1( $file->getPath() );
                        if ( strval( $sha1 ) !== '' ) { // file on disk and hashed properly
-                               $sql = "UPDATE $imageTable SET img_sha1=" . $dbw->addQuotes( $sha1 ) .
-                                       " WHERE img_name=" . $dbw->addQuotes( $file->getName() );
-                               if ( $method == 'pipe' ) {
-                                       fwrite( $pipe, "$sql;\n" );
+                               if ( $isRegen && $file->getSha1() !== $sha1 ) {
+                                       // The population was probably done already. If the old SHA1
+                                       // does not match, then both fix the SHA1 and the metadata.
+                                       $file->upgradeRow();
                                } else {
-                                       $dbw->query( $sql, __METHOD__ );
+                                       $sql = "UPDATE $imageTable SET img_sha1=" . $dbw->addQuotes( $sha1 ) .
+                                               " WHERE img_name=" . $dbw->addQuotes( $file->getName() );
+                                       if ( $method == 'pipe' ) {
+                                               fwrite( $pipe, "$sql;\n" );
+                                       } else {
+                                               $dbw->query( $sql, __METHOD__ );
+                                       }
                                }
                        }
                        // Upgrade the old file versions...
                        foreach ( $file->getHistory() as $oldFile ) {
                                $sha1 = $oldFile->getRepo()->getFileSha1( $oldFile->getPath() );
                                if ( strval( $sha1 ) !== '' ) { // file on disk and hashed properly
-                                       $sql = "UPDATE $oldImageTable SET oi_sha1=" . $dbw->addQuotes( $sha1 ) .
-                                               " WHERE (oi_name=" . $dbw->addQuotes( $oldFile->getName() ) . " AND" .
-                                               " oi_archive_name=" . $dbw->addQuotes( $oldFile->getArchiveName() ) . ")";
-                                       if ( $method == 'pipe' ) {
-                                               fwrite( $pipe, "$sql;\n" );
+                                       if ( $isRegen && $oldFile->getSha1() !== $sha1 ) {
+                                               // The population was probably done already. If the old SHA1
+                                               // does not match, then both fix the SHA1 and the metadata.
+                                               $oldFile->upgradeRow();
                                        } else {
-                                               $dbw->query( $sql, __METHOD__ );
+                                               $sql = "UPDATE $oldImageTable SET oi_sha1=" . $dbw->addQuotes( $sha1 ) .
+                                                       " WHERE (oi_name=" . $dbw->addQuotes( $oldFile->getName() ) . " AND" .
+                                                       " oi_archive_name=" . $dbw->addQuotes( $oldFile->getArchiveName() ) . ")";
+                                               if ( $method == 'pipe' ) {
+                                                       fwrite( $pipe, "$sql;\n" );
+                                               } else {
+                                                       $dbw->query( $sql, __METHOD__ );
+                                               }
                                        }
                                }
                        }
index 14f158c..b6d2067 100644 (file)
@@ -61,7 +61,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                        $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
                        $res = $db->select( 'revision',
                                array( 'rev_id', 'rev_page', 'rev_timestamp', 'rev_parent_id' ),
-                               $cond, __METHOD__ );
+                               array( $cond, 'rev_parent_id' => null ), __METHOD__ );
                        # Go through and update rev_parent_id from these rows.
                        # Assume that the previous revision of the title was
                        # the original previous revision of the title when the
index 6125fc0..1d8e4c8 100644 (file)
@@ -102,7 +102,8 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
        protected function doSha1LegacyUpdates() {
                $count = 0;
                $db = $this->getDB( DB_MASTER );
-               $res = $db->select( 'archive', '*', array( 'ar_rev_id IS NULL' ), __METHOD__ );
+               $res = $db->select( 'archive', '*',
+                       array( 'ar_rev_id IS NULL', 'ar_sha1' => '' ), __METHOD__ );
 
                $updateSize = 0;
                $db->begin( __METHOD__ );
@@ -131,12 +132,15 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
         */
        protected function upgradeRow( $row, $table, $idCol, $prefix ) {
                $db = $this->getDB( DB_MASTER );
-               if ( $table === 'archive' ) {
-                       $rev = Revision::newFromArchiveRow( $row );
-               } else {
-                       $rev = new Revision( $row );
+               try {
+                       $rev = ( $table === 'archive' )
+                               ? Revision::newFromArchiveRow( $row )
+                               : new Revision( $row );
+                       $text = $rev->getRawText();
+               } catch ( MWException $e ) {
+                       $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+                       return false; // bug 22624?
                }
-               $text = $rev->getRawText();
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
                        $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
@@ -145,7 +149,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $db->update( $table,
                                array( "{$prefix}_sha1" => Revision::base36Sha1( $text ) ),
                                array( $idCol => $row->$idCol ),
-                               __METHOD__ 
+                               __METHOD__
                        );
                        return true;
                }
@@ -157,7 +161,12 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
         */
        protected function upgradeLegacyArchiveRow( $row ) {
                $db = $this->getDB( DB_MASTER );
-               $rev = Revision::newFromArchiveRow( $row );
+               try {
+                       $rev = Revision::newFromArchiveRow( $row );
+               } catch ( MWException $e ) {
+                       $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+                       return false; // bug 22624?
+               }
                $text = $rev->getRawText();
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
@@ -174,7 +183,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                        'ar_timestamp' => $row->ar_timestamp,
                                        'ar_len'       => $row->ar_len // extra sanity
                                ),
-                               __METHOD__ 
+                               __METHOD__
                        );
                        return true;
                }
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 9c5f32b..10892c4 100644 (file)
@@ -1,6 +1,21 @@
 <?php
 /**
- * Command line script to check for an open proxy at a specified location
+ * Command line script to check for an open proxy at a specified location.
+ *
+ * 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 Maintenance
index 4d775f9..84a2b51 100644 (file)
@@ -1,7 +1,25 @@
 <?php
 /**
- * @ingroup Maintenance
+ * Maintenance script to remove old objects from the parser cache.
+ * This only works when the parser cache is in an 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 Maintenance
  */
 
 require( dirname( __FILE__ ) . '/Maintenance.php' );
index fc9a6a8..ec7b081 100644 (file)
@@ -1,7 +1,22 @@
 <?php
 /**
- * @ingroup Maintenance 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 Maintenance Memcached
  */
 
 require_once( dirname( __FILE__ ) . '/commandLine.inc' );
index 7abbc90..b5aa85f 100644 (file)
@@ -174,10 +174,10 @@ class RefreshLinks extends Maintenance {
         * @param $id int The page_id of the redirect
         */
        private function fixRedirect( $id ) {
-               $title = Title::newFromID( $id );
+               $page = WikiPage::newFromID( $id );
                $dbw = wfGetDB( DB_MASTER );
 
-               if ( is_null( $title ) ) {
+               if ( $page === null ) {
                        // This page doesn't exist (any more)
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
@@ -185,11 +185,10 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $page = WikiPage::factory( $title );
                $rt = $page->getRedirectTarget();
 
                if ( $rt === null ) {
-                       // $title is not a redirect
+                       // The page is not a redirect
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
                                __METHOD__ );
@@ -201,28 +200,29 @@ class RefreshLinks extends Maintenance {
         * @param $id int The page_id
         */
        public static function fixLinksFromArticle( $id ) {
-               global $wgParser;
+               global $wgParser, $wgContLang;
 
-               $title = Title::newFromID( $id );
-               $dbw = wfGetDB( DB_MASTER );
+               $page = WikiPage::newFromID( $id );
 
                LinkCache::singleton()->clear();
 
-               if ( is_null( $title ) ) {
+               if ( $page === null ) {
                        return;
                }
 
-               $revision = Revision::newFromTitle( $title );
-               if ( !$revision ) {
+               $text = $page->getRawText();
+               if ( $text === false ) {
                        return;
                }
 
+               $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
 
-               $options = new ParserOptions;
-               $parserOutput = $wgParser->parse( $revision->getText(), $title, $options, true, true, $revision->getId() );
-               $update = new LinksUpdate( $title, $parserOutput, false );
+               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
+               $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
                $update->doUpdate();
+
                $dbw->commit( __METHOD__ );
        }
 
@@ -287,6 +287,7 @@ class RefreshLinks extends Maintenance {
                                $dbw->delete( $table, array( $field => $list ), __METHOD__ );
                        }
                        $this->output( "\n" );
+                       wfWaitForSlaves();
                }
                $lb->closeAll();
        }
index 6068311..9c1ad29 100644 (file)
@@ -61,7 +61,9 @@ class RunJobs extends Maintenance {
                $dbw = wfGetDB( DB_MASTER );
                $n = 0;
                $conds = '';
-               if ( $type !== false ) {
+               if ( $type === false ) {
+                       $conds = Job::defaultQueueConditions( );
+               } else {
                        $conds = "job_cmd = " . $dbw->addQuotes( $type );
                }
 
@@ -77,6 +79,7 @@ class RunJobs extends Maintenance {
                                wfWaitForSlaves();
                                $t = microtime( true );
                                $offset = $job->id;
+                               $this->runJobsLog( $job->toString() . " STARTING" );
                                $status = $job->run();
                                $t = microtime( true ) - $t;
                                $timeMs = intval( $t * 1000 );
index 5887a75..29904db 100644 (file)
@@ -388,7 +388,8 @@ class CheckStorage {
        }
 
        function restoreText( $revIds, $xml ) {
-               global $wgTmpDirectory, $wgDBname;
+               global $wgDBname;
+               $tmpDir = wfTempDir();
 
                if ( !count( $revIds ) ) {
                        return;
@@ -396,8 +397,8 @@ class CheckStorage {
 
                print "Restoring text from XML backup...\n";
 
-               $revFileName = "$wgTmpDirectory/broken-revlist-$wgDBname";
-               $filteredXmlFileName = "$wgTmpDirectory/filtered-$wgDBname.xml";
+               $revFileName = "$tmpDir/broken-revlist-$wgDBname";
+               $filteredXmlFileName = "$tmpDir/filtered-$wgDBname.xml";
 
                // Write revision list
                if ( !file_put_contents( $revFileName, implode( "\n", $revIds ) ) ) {
@@ -481,4 +482,3 @@ class CheckStorage {
                $this->errors['fixed'][$id] = true;
        }
 }
-
diff --git a/maintenance/syncFileBackend.php b/maintenance/syncFileBackend.php
new file mode 100644 (file)
index 0000000..0d5c9de
--- /dev/null
@@ -0,0 +1,236 @@
+<?php
+/**
+ * Sync one file backend to another based on the journal of later.
+ *
+ * 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
+ *
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+class SyncFileBackend extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Sync one file backend with another using the journal";
+               $this->addOption( 'src', 'Name of backend to sync from', true, true );
+               $this->addOption( 'dst', 'Name of destination backend to sync', true, true );
+               $this->addOption( 'start', 'Starting journal ID', false, true );
+               $this->addOption( 'end', 'Ending journal ID', false, true );
+               $this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
+               $this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
+               $this->setBatchSize( 50 );
+       }
+
+       public function execute() {
+               $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
+               $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+
+               $posFile = $this->getOption( 'posdir' )
+                       ? $this->getOption( 'posdir' ) . '/' . wfWikiID()
+                       : false;
+
+               $start = $this->getOption( 'start', 0 );
+               if ( !$start && $posFile ) {
+                       $start = is_file( $posFile )
+                               ? (int)trim( file_get_contents( $posFile ) )
+                               : 0;
+                       ++$start; // we already did this ID, start with the next one
+                       $startFromPosFile = true;
+               } else {
+                       $startFromPosFile = false;
+               }
+               $end = $this->getOption( 'end', INF );
+
+               $this->output( "Synchronizing backend '{$dst->getName()}' to '{$src->getName()}'...\n" );
+               $this->output( "Starting journal position is $start.\n" );
+               if ( is_finite( $end ) ) {
+                       $this->output( "Ending journal position is $end.\n" );
+               }
+
+               // Actually sync the dest backend with the reference backend
+               $lastOKPos = $this->syncBackends( $src, $dst, $start, $end );
+
+               // Update the sync position file
+               if ( $startFromPosFile && $lastOKPos >= $start ) { // successfully advanced
+                       file_put_contents( $posFile, $lastOKPos, LOCK_EX );
+                       $this->output( "Updated journal position file.\n" );
+               }
+
+               if ( $lastOKPos === false ) {
+                       if ( !$start ) {
+                               $this->output( "No journal entries found.\n" );
+                       } else {
+                               $this->output( "No new journal entries found.\n" );
+                       }
+               } else {
+                       $this->output( "Stopped synchronization at journal position $lastOKPos.\n" );
+               }
+
+               if ( $this->isQuiet() ) {
+                       print $lastOKPos; // give a single machine-readable number
+               }
+       }
+
+       /**
+        * Sync $dst backend to $src backend based on the $src logs given after $start.
+        * Returns the journal entry ID this advanced to and handled (inclusive).
+        *
+        * @param $src FileBackend
+        * @param $dst FileBackend
+        * @param $start integer Starting journal position
+        * @param $end integer Starting journal position
+        * @return integer|false Journal entry ID or false if there are none
+        */
+       protected function syncBackends( FileBackend $src, FileBackend $dst, $start, $end ) {
+               $lastOKPos = 0; // failed
+               $first = true; // first batch
+
+               if ( $start > $end ) { // sanity
+                       $this->error( "Error: given starting ID greater than ending ID.", 1 );
+               }
+
+               do {
+                       $limit = min( $this->mBatchSize, $end - $start + 1 ); // don't go pass ending ID
+                       $this->output( "Doing id $start to " . ( $start + $limit - 1 ) . "...\n" );
+
+                       $entries = $src->getJournal()->getChangeEntries( $start, $limit, $next );
+                       $start = $next; // start where we left off next time
+                       if ( $first && !count( $entries ) ) {
+                               return false; // nothing to do
+                       }
+                       $first = false;
+
+                       $lastPosInBatch = 0;
+                       $pathsInBatch = array(); // changed paths
+                       foreach ( $entries as $entry ) {
+                               if ( $entry['op'] !== 'null' ) { // null ops are just for reference
+                                       $pathsInBatch[$entry['path']] = 1; // remove duplicates
+                               }
+                               $lastPosInBatch = $entry['id'];
+                       }
+
+                       $status = $this->syncFileBatch( array_keys( $pathsInBatch ), $src, $dst );
+                       if ( $status->isOK() ) {
+                               $lastOKPos = max( $lastOKPos, $lastPosInBatch );
+                       } else {
+                               $this->output( print_r( $status->getErrorsArray(), true ) );
+                               break; // no gaps; everything up to $lastPos must be OK
+                       }
+
+                       if ( !$start ) {
+                               $this->output( "End of journal entries.\n" );
+                       }
+               } while ( $start && $start <= $end );
+
+               return $lastOKPos;
+       }
+
+       /**
+        * Sync particular files of backend $src to the corresponding $dst backend files
+        *
+        * @param $paths Array
+        * @param $src FileBackend
+        * @param $dst FileBackend
+        * @return Status
+        */
+       protected function syncFileBatch( array $paths, FileBackend $src, FileBackend $dst ) {
+               $status = Status::newGood();
+               if ( !count( $paths ) ) {
+                       return $status; // nothing to do
+               }
+
+               // Source: convert internal backend names (FileBackendMultiWrite) to the public one
+               $sPaths = $this->replaceNamePaths( $paths, $src );
+               // Destination: get corresponding path name
+               $dPaths = $this->replaceNamePaths( $paths, $dst );
+
+               // Lock the live backend paths from modification
+               $sLock = $src->getScopedFileLocks( $sPaths, LockManager::LOCK_UW, $status );
+               $eLock = $dst->getScopedFileLocks( $dPaths, LockManager::LOCK_EX, $status );
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
+               $ops = array();
+               $fsFiles = array();
+               foreach ( $sPaths as $i => $sPath ) {
+                       $dPath = $dPaths[$i]; // destination
+                       $sExists = $src->fileExists( array( 'src' => $sPath, 'latest' => 1 ) );
+                       if ( $sExists === true ) { // exists in source
+                               if ( $this->filesAreSame( $src, $dst, $sPath, $dPath ) ) {
+                                       continue; // avoid local copies for non-FS backends
+                               }
+                               // Note: getLocalReference() is fast for FS backends
+                               $fsFile = $src->getLocalReference( array( 'src' => $sPath, 'latest' => 1 ) );
+                               if ( !$fsFile ) {
+                                       $this->error( "Unable to sync '$dPath': could not get local copy." );
+                                       $status->fatal( 'backend-fail-internal', $src->getName() );
+                                       return $status;
+                               }
+                               $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
+                               // Note: prepare() is usually fast for key/value backends
+                               $status->merge( $dst->prepare( array( 'dir' => dirname( $dPath ) ) ) );
+                               if ( !$status->isOK() ) {
+                                       return $status;
+                               }
+                               $ops[] = array( 'op' => 'store',
+                                       'src' => $fsFile->getPath(), 'dst' => $dPath, 'overwrite' => 1 );
+                       } elseif ( $sExists === false ) { // does not exist in source
+                               $ops[] = array( 'op' => 'delete', 'src' => $dPath, 'ignoreMissingSource' => 1 );
+                       } else { // error
+                               $this->error( "Unable to sync '$dPath': could not stat file." );
+                               $status->fatal( 'backend-fail-internal', $src->getName() );
+                               return $status;
+                       }
+               }
+
+               $status->merge( $dst->doOperations( $ops,
+                       array( 'nonLocking' => 1, 'nonJournaled' => 1 ) ) );
+               if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
+                       $this->output( "Synchronized these file(s):\n" . implode( "\n", $dPaths ) . "\n" );
+               }
+
+               return $status;
+       }
+
+       /**
+        * Substitute the backend name of storage paths with that of a given one
+        *
+        * @param $paths Array|string List of paths or single string path
+        * @return Array|string
+        */
+       protected function replaceNamePaths( $paths, FileBackend $backend ) {
+               return preg_replace(
+                       '!^mwstore://([^/]+)!',
+                       StringUtils::escapeRegexReplacement( "mwstore://" . $backend->getName() ),
+                       $paths // string or array
+               );
+       }
+
+       protected function filesAreSame( FileBackend $src, FileBackend $dst, $sPath, $dPath ) {
+               return (
+                       ( $src->getFileSize( array( 'src' => $sPath ) )
+                               === $dst->getFileSize( array( 'src' => $dPath ) ) // short-circuit
+                       ) && ( $src->getFileSha1Base36( array( 'src' => $sPath ) )
+                               === $dst->getFileSha1Base36( array( 'src' => $dPath ) )
+                       )
+               );
+       }
+}
+
+$maintClass = "SyncFileBackend";
+require_once( RUN_MAINTENANCE_IF_MAIN );
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 36fb8ee..ca0f95d 100644 (file)
@@ -1,14 +1,31 @@
 <?php
-
 /**
- * @ingroup Testing
- *
  * Set of classes to help with test output and such. Right now pretty specific
  * to the parser tests but could be more useful one day :)
  *
+ * 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 Testing
  * @todo Fixme: Make this more generic
  */
 
+/**
+ * Terminal that supports ANSI escape sequences.
+ */
 class AnsiTermColorer {
        function __construct() {
        }
@@ -37,7 +54,9 @@ class AnsiTermColorer {
        }
 }
 
-/* A colour-less terminal */
+/**
+ * A colour-less terminal
+ */
 class DummyTermColorer {
        public function color( $color ) {
                return '';
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 edfae92..3f993f0 100644 (file)
@@ -20,7 +20,7 @@ wfInstallerMain();
 function wfInstallerMain() {
        global $wgRequest, $wgLang, $wgMetaNamespace, $wgCanonicalNamespaceNames;
 
-       $installer = new WebInstaller( $wgRequest );
+       $installer = InstallerOverrides::getWebInstaller( $wgRequest );
 
        if ( !$installer->startSession() ) {
                $installer->finish();
diff --git a/mw-config/overrides.php b/mw-config/overrides.php
new file mode 100644 (file)
index 0000000..ae98295
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+/**
+ * MediaWiki installer overrides.
+ * Modify this file if you are a packager who needs to modify the behavior of the MediaWiki installer.
+ * Altering it is preferred over changing anything in /includes.
+ *
+ * Note: this file doesn't gets included from a global scope, don't use globals directly.
+ */
+
+/*
+
+Example of modifications:
+
+       public static function getLocalSettingsGenerator( Installer $installer ) {
+               return new MyLocalSettingsGenerator( $installer );
+       }
+
+Then add the following to the bottom of this file:
+
+class MyLocalSettingsGenerator extends LocalSettingsGenerator {
+       function getText() {
+               // Modify an existing setting
+               $this->values['wgResourceLoaderMaxQueryLength'] = 512;
+               // add a new setting
+               $ls = parent::getText();
+               return $ls . "\n\$wgUseTex = true;\n";
+       }
+}
+*/
+
+/**
+ * @since 1.20
+ */
+class InstallerOverrides {
+       /**
+        * Instantiates and returns an instance of LocalSettingsGenerator or its descendant classes
+        * @param Installer $installer
+        * @return LocalSettingsGenerator
+        */
+       public static function getLocalSettingsGenerator( Installer $installer ) {
+               return new LocalSettingsGenerator( $installer );
+       }
+
+       /**
+        * Instantiates and returns an instance of WebInstaller or its descendant classes
+        * @param WebRequest $request
+        * @return WebInstaller
+        */
+       public static function getWebInstaller( WebRequest $request ) {
+               return new WebInstaller( $request );
+       }
+
+       /**
+        * Instantiates and returns an instance of CliInstaller or its descendant classes
+        * @param string $siteName
+        * @param string|null $admin
+        * @param array $options
+        * @return CliInstaller
+        */
+       public static function getCliInstaller( $siteName, $admin = null, array $options = array() ) {
+               return new CliInstaller( $siteName, $admin, $options );
+       }
+}
index 85ec580..a5e48fa 100644 (file)
@@ -1,7 +1,21 @@
 <?php
-
 /**
- * Generate an OpenSearch description file
+ * Generate an OpenSearch description 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
  */
index 3f2f287..16d09ea 100644 (file)
@@ -1 +1,24 @@
-<?php require './opensearch_desc.php'; 
\ No newline at end of file
+<?php
+/**
+ * Version of opensearch_desc.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './opensearch_desc.php'; 
index eb15c6b..fde960e 100644 (file)
@@ -1,11 +1,26 @@
 <?php
-
 /**
  * Script that redirects to the article passed in the "wpDropdown" parameter.
  * This is used by the nostalgia skin for the special pages drop-down
  *
+ * 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
  */
+
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require ( 'phase3/includes/WebStart.php' );
 } else {
index 1eaa3d0..ae29c4c 100644 (file)
@@ -1 +1,24 @@
-<?php require './redirect.php';
\ No newline at end of file
+<?php
+/**
+ * Version of redirect.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './redirect.php';
index 2855f9a..0e85050 100644 (file)
@@ -70,11 +70,13 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
        ),
        'skins.vector' => array(
+               // Keep in sync with WebInstallerOutput::getCSS()
                'styles' => array(
                        'common/commonElements.css' => array( 'media' => 'screen' ),
                        'common/commonContent.css' => array( 'media' => 'screen' ),
                        'common/commonInterface.css' => array( 'media' => 'screen' ),
                        'vector/screen.css' => array( 'media' => 'screen' ),
+                       'vector/screen-hd.css' => array( 'media' => 'screen and (min-width: 982px)' ),
                ),
                'scripts' => 'vector/vector.js',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
@@ -362,6 +364,7 @@ return array(
                        'is' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-is.js',
                        'it' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-it.js',
                        'ja' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ja.js',
+                       'ka' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js',
                        'kk' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-kk.js',
                        'km' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-km.js',
                        'ko' => 'resources/jquery.ui/i18n/jquery.ui.datepicker-ko.js',
@@ -523,32 +526,32 @@ return array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
                'dependencies' => 'mediawiki.util',
        ),
-       'mediawiki.api.category' => array( 
+       'mediawiki.api.category' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.category.js',
-               'dependencies' => array( 
+               'dependencies' => array(
                        'mediawiki.api',
-                       'mediawiki.Title' 
+                       'mediawiki.Title',
                ),
        ),
-       'mediawiki.api.edit' => array( 
+       'mediawiki.api.edit' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.edit.js',
-               'dependencies' => array( 
+               'dependencies' => array(
                        'mediawiki.api',
-                       'mediawiki.Title' 
+                       'mediawiki.Title',
                ),
        ),
-       'mediawiki.api.parse' => array( 
+       'mediawiki.api.parse' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.parse.js',
                'dependencies' => 'mediawiki.api',
        ),
-       'mediawiki.api.titleblacklist' => array( 
+       'mediawiki.api.titleblacklist' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.titleblacklist.js',
-               'dependencies' => array( 
+               'dependencies' => array(
                        'mediawiki.api',
-                       'mediawiki.Title' 
+                       'mediawiki.Title',
                ),
        ),
-       'mediawiki.api.watch' => array( 
+       'mediawiki.api.watch' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.watch.js',
                'dependencies' => array(
                        'mediawiki.api',
@@ -571,13 +574,13 @@ return array(
        'mediawiki.feedback' => array(
                'scripts' => 'resources/mediawiki/mediawiki.feedback.js',
                'styles' => 'resources/mediawiki/mediawiki.feedback.css',
-               'dependencies' => array( 
-                       'mediawiki.api.edit', 
+               'dependencies' => array(
+                       'mediawiki.api.edit',
                        'mediawiki.Title',
                        'mediawiki.jqueryMsg',
                        'jquery.ui.dialog',
                ),
-               'messages' => array( 
+               'messages' => array(
                        'feedback-bugornote',
                        'feedback-subject',
                        'feedback-message',
@@ -632,7 +635,6 @@ return array(
        ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
-               'dependencies' => 'jquery.ui.button',
                'group' => 'mediawiki.action.history',
        ),
        'mediawiki.action.history.diff' => array(
@@ -653,21 +655,9 @@ return array(
        'mediawiki.action.view.rightClickEdit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js',
        ),
+       // Alias for backwards compatibility
        'mediawiki.action.watch.ajax' => array(
-               'scripts' => 'resources/mediawiki.action/mediawiki.action.watch.ajax.js',
-               'dependencies' => array(
-                       'mediawiki.api.watch',
-                       'mediawiki.util',
-               ),
-               'messages' => array(
-                       'watch',
-                       'unwatch',
-                       'watching',
-                       'unwatching',
-                       'tooltip-ca-watch',
-                       'tooltip-ca-unwatch',
-                       'watcherrortext',
-               ),
+               'dependencies' => 'mediawiki.page.watch.ajax'
        ),
 
        /* MediaWiki Language */
@@ -686,6 +676,7 @@ return array(
                        'cu' => 'resources/mediawiki.language/languages/cu.js',
                        'cy' => 'resources/mediawiki.language/languages/cy.js',
                        'dsb' => 'resources/mediawiki.language/languages/dsb.js',
+                       'fi' => 'resources/mediawiki.language/languages/fi.js',
                        'fr' => 'resources/mediawiki.language/languages/fr.js',
                        'ga' => 'resources/mediawiki.language/languages/ga.js',
                        'gd' => 'resources/mediawiki.language/languages/gd.js',
@@ -694,8 +685,10 @@ return array(
                        'hi' => 'resources/mediawiki.language/languages/hi.js',
                        'hr' => 'resources/mediawiki.language/languages/hr.js',
                        'hsb' => 'resources/mediawiki.language/languages/hsb.js',
+                       'hu' => 'resources/mediawiki.language/languages/hu.js',
                        'hy' => 'resources/mediawiki.language/languages/hy.js',
                        'ksh' => 'resources/mediawiki.language/languages/ksh.js',
+                       'la' => 'resources/mediawiki.language/languages/la.js',
                        'ln' => 'resources/mediawiki.language/languages/ln.js',
                        'lt' => 'resources/mediawiki.language/languages/lt.js',
                        'lv' => 'resources/mediawiki.language/languages/lv.js',
@@ -703,11 +696,9 @@ return array(
                        'mk' => 'resources/mediawiki.language/languages/mk.js',
                        'mo' => 'resources/mediawiki.language/languages/mo.js',
                        'mt' => 'resources/mediawiki.language/languages/mt.js',
-                       'nl' => 'resources/mediawiki.language/languages/nl.js',
                        'nso' => 'resources/mediawiki.language/languages/nso.js',
+                       'os' => 'resources/mediawiki.language/languages/os.js',
                        'pl' => 'resources/mediawiki.language/languages/pl.js',
-                       'pt' => 'resources/mediawiki.language/languages/pt.js',
-                       'pt-br' => 'resources/mediawiki.language/languages/pt-br.js',
                        'ro' => 'resources/mediawiki.language/languages/ro.js',
                        'ru' => 'resources/mediawiki.language/languages/ru.js',
                        'se' => 'resources/mediawiki.language/languages/se.js',
@@ -723,11 +714,19 @@ return array(
                        'uk' => 'resources/mediawiki.language/languages/uk.js',
                        'wa' => 'resources/mediawiki.language/languages/wa.js',
                ),
+               'dependencies' => array( 'mediawiki.language.data' ),
+       ),
+
+       'mediawiki.language.init' => array(
+               'scripts' => 'resources/mediawiki.language/mediawiki.language.init.js',
        ),
 
        'mediawiki.jqueryMsg' => array(
-               'dependencies' => array( 'mediawiki.language', 'mediawiki.util' ),
-               'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js'
+               'scripts' => 'resources/mediawiki/mediawiki.jqueryMsg.js',
+               'dependencies' => array(
+                       'mediawiki.util',
+                       'mediawiki.language',
+               ),
        ),
 
        /* MediaWiki Libs */
@@ -756,7 +755,23 @@ return array(
                ),
                'position' => 'top',
        ),
-
+       'mediawiki.page.watch.ajax' => array(
+               'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
+               'dependencies' => array(
+                       'mediawiki.page.startup',
+                       'mediawiki.api.watch',
+                       'mediawiki.util'
+               ),
+               'messages' => array(
+                       'watch',
+                       'unwatch',
+                       'watching',
+                       'unwatching',
+                       'tooltip-ca-watch',
+                       'tooltip-ca-unwatch',
+                       'watcherrortext',
+               ),
+       ),
 
        /* MediaWiki Special pages */
 
@@ -801,6 +816,11 @@ return array(
        'mediawiki.special.search' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.search.js',
                'styles' => 'resources/mediawiki.special/mediawiki.special.search.css',
+               'messages' => array(
+                       'powersearch-togglelabel',
+                       'powersearch-toggleall',
+                       'powersearch-togglenone',
+               ),
        ),
        'mediawiki.special.undelete' => array(
                'scripts' => 'resources/mediawiki.special/mediawiki.special.undelete.js',
index 861bbfa..686cdb7 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Blind 1.8.18
+/*!
+ * jQuery UI Effects Blind 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index dc21f31..e3fc3d8 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Bounce 1.8.18
+/*!
+ * jQuery UI Effects Bounce 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 1ac61bb..2b43554 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Clip 1.8.18
+/*!
+ * jQuery UI Effects Clip 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 19e2f70..cc31827 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects 1.8.18
+/*!
+ * jQuery UI Effects 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -236,7 +236,7 @@ $.effects.animateClass = function(value, duration, easing, callback) {
                        originalStyleAttr = that.attr('style') || ' ',
                        originalStyle = filterStyles(getElementStyles.call(this)),
                        newStyle,
-                       className = that.attr('class');
+                       className = that.attr('class') || "";
 
                $.each(classAnimationActions, function(i, action) {
                        if (value[action]) {
@@ -306,7 +306,7 @@ $.fn.extend({
 /******************************************************************************/
 
 $.extend($.effects, {
-       version: "1.8.18",
+       version: "1.8.21",
 
        // Saves a set of properties in a data storage
        save: function(element, set) {
@@ -370,7 +370,16 @@ $.extend($.effects, {
                                }),
                        active = document.activeElement;
 
-               element.wrap(wrapper);
+               // support: Firefox
+               // Firefox incorrectly exposes anonymous content
+               // https://bugzilla.mozilla.org/show_bug.cgi?id=561664
+               try {
+                       active.id;
+               } catch( e ) {
+                       active = document.body;
+               }
+
+               element.wrap( wrapper );
 
                // Fixes #7595 - Elements lose focus when wrapped.
                if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
@@ -419,7 +428,7 @@ $.extend($.effects, {
        setTransition: function(element, list, factor, value) {
                value = value || {};
                $.each(list, function(i, x){
-                       unit = element.cssUnit(x);
+                       var unit = element.cssUnit(x);
                        if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
                });
                return value;
index c674cca..1fa5660 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Drop 1.8.18
+/*!
+ * jQuery UI Effects Drop 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index b2af6da..f50e257 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Explode 1.8.18
+/*!
+ * jQuery UI Effects Explode 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index beb5cb4..c62037f 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Fade 1.8.18
+/*!
+ * jQuery UI Effects Fade 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 762ec6c..a660eed 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Fold 1.8.18
+/*!
+ * jQuery UI Effects Fold 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index f2d2333..e65bda3 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Highlight 1.8.18
+/*!
+ * jQuery UI Effects Highlight 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 418df4e..a512184 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Pulsate 1.8.18
+/*!
+ * jQuery UI Effects Pulsate 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -15,8 +15,8 @@
 $.effects.pulsate = function(o) {
        return this.queue(function() {
                var elem = $(this),
-                       mode = $.effects.setMode(elem, o.options.mode || 'show');
-                       times = ((o.options.times || 5) * 2) - 1;
+                       mode = $.effects.setMode(elem, o.options.mode || 'show'),
+                       times = ((o.options.times || 5) * 2) - 1,
                        duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
                        isVisible = elem.is(':visible'),
                        animateTo = 0;
index e2d6482..c312195 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Scale 1.8.18
+/*!
+ * jQuery UI Effects Scale 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -140,7 +140,7 @@ $.effects.size = function(o) {
                        hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
                        props2 = props.concat(vProps).concat(hProps); // Concat
                        el.find("*[width]").each(function(){
-                               child = $(this);
+                               var child = $(this);
                                if (restore) $.effects.save(child, props2);
                                var c_original = {height: child.height(), width: child.width()}; // Save original
                                child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
index 91388ab..08ce5a8 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Shake 1.8.18
+/*!
+ * jQuery UI Effects Shake 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index d481a2a..3258a9a 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Slide 1.8.18
+/*!
+ * jQuery UI Effects Slide 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 776fe46..97514f1 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Effects Transfer 1.8.18
+/*!
+ * jQuery UI Effects Transfer 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 9a80e94..fef8c4b 100644 (file)
Binary files a/resources/jquery.tipsy/images/tipsy.png and b/resources/jquery.tipsy/images/tipsy.png differ
index 743a15d..8a9218d 100644 (file)
@@ -12,7 +12,7 @@ jQuery(function($){
                monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
                dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
                dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
-               dayNamesMin: ['اÙ\84أحد', 'اÙ\84اثÙ\86Ù\8aÙ\86', 'اÙ\84Ø«Ù\84اثاء', 'اÙ\84أربعاء', 'اÙ\84Ø®Ù\85Ù\8aس', 'اÙ\84جÙ\85عة', 'اÙ\84سبت'],
+               dayNamesMin: ['Ø­', 'Ù\86', 'Ø«', 'ر', 'Ø®', 'ج', 'س'],
                weekHeader: 'أسبوع',
                dateFormat: 'dd/mm/yy',
                firstDay: 6,
index 166f537..f3ef9e8 100644 (file)
@@ -13,7 +13,7 @@ jQuery(function($){
                dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
                dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
                dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
-               weekHeader: 'Wo',
+               weekHeader: 'KW',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
index 92f81f6..32702b2 100644 (file)
@@ -13,7 +13,7 @@ jQuery(function($){
                dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
                dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
                dayNamesMin: ['P','E','T','K','N','R','L'],
-               weekHeader: 'Sm',
+               weekHeader: 'näd',
                dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
index bee4bfb..ff66e49 100644 (file)
@@ -6,15 +6,15 @@ jQuery(function($){
                prevText: '&#x3c;Aur',
                nextText: 'Hur&#x3e;',
                currentText: 'Gaur',
-               monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
-               'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
-               monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
-               'Uzt','Abu','Ira','Urr','Aza','Abe'],
-               dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
-               dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
-               dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
-               weekHeader: 'Wk',
-               dateFormat: 'yy/mm/dd',
+               monthNames: ['urtarrila','otsaila','martxoa','apirila','maiatza','ekaina',
+                       'uztaila','abuztua','iraila','urria','azaroa','abendua'],
+               monthNamesShort: ['urt.','ots.','mar.','api.','mai.','eka.',
+                       'uzt.','abu.','ira.','urr.','aza.','abe.'],
+               dayNames: ['igandea','astelehena','asteartea','asteazkena','osteguna','ostirala','larunbata'],
+               dayNamesShort: ['ig.','al.','ar.','az.','og.','ol.','lr.'],
+               dayNamesMin: ['ig','al','ar','az','og','ol','lr'],
+               weekHeader: 'As',
+               dateFormat: 'yy-mm-dd',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
index 81de4da..be8acd2 100644 (file)
@@ -4,15 +4,51 @@
 jQuery(function($) {
        $.datepicker.regional['fa'] = {
                closeText: 'بستن',
-               prevText: '&#x3c;قبلي',
-               nextText: 'بعدي&#x3e;',
+               prevText: '&#x3C;قبلی',
+               nextText: 'بعدی&#x3E;',
                currentText: 'امروز',
-               monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
-               'مهر','آبان','آذر','دي','بهمن','اسفند'],
+               monthNames: [
+                       'فروردين',
+                       'ارديبهشت',
+                       'خرداد',
+                       'تير',
+                       'مرداد',
+                       'شهريور',
+                       'مهر',
+                       'آبان',
+                       'آذر',
+                       'دی',
+                       'بهمن',
+                       'اسفند'
+               ],
                monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
-               dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
-               dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
-               dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+               dayNames: [
+                       'يکشنبه',
+                       'دوشنبه',
+                       'سه‌شنبه',
+                       'چهارشنبه',
+                       'پنجشنبه',
+                       'جمعه',
+                       'شنبه'
+               ],
+               dayNamesShort: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
+               dayNamesMin: [
+                       'ی',
+                       'د',
+                       'س',
+                       'چ',
+                       'پ',
+                       'ج', 
+                       'ش'
+               ],
                weekHeader: 'هف',
                dateFormat: 'yy/mm/dd',
                firstDay: 6,
index e1f25fd..4c5adda 100644 (file)
@@ -1,23 +1,23 @@
 /* Finnish initialisation for the jQuery UI date picker plugin. */
-/* Written by Harri Kilpi (harrikilpio@gmail.com). */
+/* Written by Harri Kilpiö (harrikilpio@gmail.com). */
 jQuery(function($){
-    $.datepicker.regional['fi'] = {
+       $.datepicker.regional['fi'] = {
                closeText: 'Sulje',
-               prevText: '&laquo;Edellinen',
-               nextText: 'Seuraava&raquo;',
-               currentText: 'T&auml;n&auml;&auml;n',
-        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
-        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
-        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
-        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
-               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+               prevText: '&#xAB;Edellinen',
+               nextText: 'Seuraava&#xBB;',
+               currentText: 'T&#xE4;n&#xE4;&#xE4;n',
+               monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&#xE4;kuu',
+               'Hein&#xE4;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+               monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&#xE4;',
+               'Hein&#xE4;','Elo','Syys','Loka','Marras','Joulu'],
+               dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','La'],
                dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
                dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
                weekHeader: 'Vk',
-        dateFormat: 'dd.mm.yy',
+               dateFormat: 'dd.mm.yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
                yearSuffix: ''};
-    $.datepicker.setDefaults($.datepicker.regional['fi']);
+       $.datepicker.setDefaults($.datepicker.regional['fi']);
 });
index d75e98e..6c563b9 100644 (file)
@@ -2,19 +2,19 @@
 /* Written by Michael Dawart. */
 jQuery(function($){
        $.datepicker.regional['hi'] = {
-               closeText: 'हà¥\8bà¤\95र',
-               prevText: 'à¤\85à¤\97ला',
-               nextText: 'नà¥\87à¤\95à¥\8dसà¥\8dà¤\9f',
+               closeText: 'बà¤\82द',
+               prevText: 'पिà¤\9bला',
+               nextText: 'à¤\85à¤\97ला',
                currentText: 'आज',
-               monthNames: ['à¤\9cनवरà¥\80 ','फरवरà¥\80','मारà¥\8dà¤\9a','à¤\85पà¥\8dरà¥\87ल','मà¥\88','à¤\9cà¥\82न',
-               'à¤\9cà¥\82लाà¤\88','à¤\85à¤\97सà¥\8dत ','सितमà¥\8dबर','à¤\86à¤\95à¥\8dà¤\9fà¥\8bबर','नवम्बर','दिसम्बर'],
-               monthNamesShort: ['à¤\9cन', 'फर', 'मारà¥\8dà¤\9a', 'à¤\85पà¥\8dरà¥\87ल', 'मà¥\88', 'à¤\9cà¥\82न',
-               'à¤\9cà¥\82लाà¤\88', 'à¤\85à¤\97', 'सित', 'à¤\86à¤\95à¥\8dà¤\9f', 'नव', 'िद'],
-               dayNames: ['रविवासर', 'सà¥\8bमवासर', 'मà¤\82à¤\97लवासर', 'बà¥\81धवासर', 'à¤\97à¥\81रà¥\81वासर', 'शà¥\81à¤\95à¥\8dरवासर', 'शनिवासर'],
+               monthNames: ['à¤\9cनवरà¥\80 ','फरवरà¥\80','मारà¥\8dà¤\9a','à¤\85पà¥\8dरà¥\87ल','मà¤\88','à¤\9cà¥\82न',
+               'à¤\9cà¥\82लाà¤\88','à¤\85à¤\97सà¥\8dत ','सितमà¥\8dबर','à¤\85à¤\95à¥\8dà¤\9fà¥\82बर','नवम्बर','दिसम्बर'],
+               monthNamesShort: ['à¤\9cन', 'फर', 'मारà¥\8dà¤\9a', 'à¤\85पà¥\8dरà¥\87ल', 'मà¤\88', 'à¤\9cà¥\82न',
+               'à¤\9cà¥\82लाà¤\88', 'à¤\85à¤\97', 'सित', 'à¤\85à¤\95à¥\8dà¤\9f', 'नव', 'दि'],
+               dayNames: ['रविवार', 'सà¥\8bमवार', 'मà¤\82à¤\97लवार', 'बà¥\81धवार', 'à¤\97à¥\81रà¥\81वार', 'शà¥\81à¤\95à¥\8dरवार', 'शनिवार'],
                dayNamesShort: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
                dayNamesMin: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
                weekHeader: 'हफ्ता',
-               dateFormat: 'mm/dd/yy',
+               dateFormat: 'dd/mm/yy',
                firstDay: 1,
                isRTL: false,
                showMonthAfterYear: false,
diff --git a/resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js b/resources/jquery.ui/i18n/jquery.ui.datepicker-ka.js
new file mode 100644 (file)
index 0000000..c10658d
--- /dev/null
@@ -0,0 +1,21 @@
+/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Lado Lomidze (lado.lomidze@gmail.com). */
+jQuery(function($){
+       $.datepicker.regional['ka'] = {
+               closeText: 'დახურვა',
+               prevText: '&#x3c; წინა',
+               nextText: 'შემდეგი &#x3e;',
+               currentText: 'დღეს',
+               monthNames: ['იანვარი','თებერვალი','მარტი','აპრილი','მაისი','ივნისი', 'ივლისი','აგვისტო','სექტემბერი','ოქტომბერი','ნოემბერი','დეკემბერი'],
+               monthNamesShort: ['იან','თებ','მარ','აპრ','მაი','ივნ', 'ივლ','აგვ','სექ','ოქტ','ნოე','დეკ'],
+               dayNames: ['კვირა','ორშაბათი','სამშაბათი','ოთხშაბათი','ხუთშაბათი','პარასკევი','შაბათი'],
+               dayNamesShort: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
+               dayNamesMin: ['კვ','ორშ','სამ','ოთხ','ხუთ','პარ','შაბ'],
+               weekHeader: 'კვირა',
+               dateFormat: 'dd-mm-yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['ka']);
+});
index 1e60242..0285325 100644 (file)
@@ -6,9 +6,9 @@ jQuery(function($){
                prevText: '&#x3C;',
                nextText: '&#x3E;',
                currentText: 'Денес',
-               monthNames: ['Ð\88анÑ\83аÑ\80и','Фебруари','Март','Април','Мај','Јуни',
+               monthNames: ['Ð\88анÑ\83аÑ\80и','Февруари','Март','Април','Мај','Јуни',
                'Јули','Август','Септември','Октомври','Ноември','Декември'],
-               monthNamesShort: ['Ð\88ан','Феб','Мар','Апр','Мај','Јун',
+               monthNamesShort: ['Ð\88ан','Фев','Мар','Апр','Мај','Јун',
                'Јул','Авг','Сеп','Окт','Ное','Дек'],
                dayNames: ['Недела','Понеделник','Вторник','Среда','Четврток','Петок','Сабота'],
                dayNamesShort: ['Нед','Пон','Вто','Сре','Чет','Пет','Саб'],
index 77afe55..fe0a729 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -518,7 +518,7 @@ $.widget( "ui.accordion", {
 });
 
 $.extend( $.ui.accordion, {
-       version: "1.8.18",
+       version: "1.8.21",
        animations: {
                slide: function( options, additions ) {
                        options = $.extend({
index 8889ca9..f8009c6 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -37,6 +37,7 @@ $.widget( "ui.autocomplete", {
                var self = this,
                        doc = this.element[ 0 ].ownerDocument,
                        suppressKeyPress;
+               this.isMultiLine = this.element.is( "textarea" );
 
                this.element
                        .addClass( "ui-autocomplete-input" )
@@ -62,14 +63,10 @@ $.widget( "ui.autocomplete", {
                                        self._move( "nextPage", event );
                                        break;
                                case keyCode.UP:
-                                       self._move( "previous", event );
-                                       // prevent moving cursor to beginning of text field in some browsers
-                                       event.preventDefault();
+                                       self._keyEvent( "previous", event );
                                        break;
                                case keyCode.DOWN:
-                                       self._move( "next", event );
-                                       // prevent moving cursor to end of text field in some browsers
-                                       event.preventDefault();
+                                       self._keyEvent( "next", event );
                                        break;
                                case keyCode.ENTER:
                                case keyCode.NUMPAD_ENTER:
@@ -131,9 +128,6 @@ $.widget( "ui.autocomplete", {
                                }, 150 );
                        });
                this._initSource();
-               this.response = function() {
-                       return self._response.apply( self, arguments );
-               };
                this.menu = $( "<ul></ul>" )
                        .addClass( "ui-autocomplete" )
                        .appendTo( $( this.options.appendTo || "body", doc )[0] )
@@ -268,18 +262,11 @@ $.widget( "ui.autocomplete", {
                                        url: url,
                                        data: request,
                                        dataType: "json",
-                                       context: {
-                                               autocompleteRequest: ++requestIndex
-                                       },
                                        success: function( data, status ) {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( data );
-                                               }
+                                               response( data );
                                        },
                                        error: function() {
-                                               if ( this.autocompleteRequest === requestIndex ) {
-                                                       response( [] );
-                                               }
+                                               response( [] );
                                        }
                                });
                        };
@@ -310,10 +297,26 @@ $.widget( "ui.autocomplete", {
                this.pending++;
                this.element.addClass( "ui-autocomplete-loading" );
 
-               this.source( { term: value }, this.response );
+               this.source( { term: value }, this._response() );
        },
 
-       _response: function( content ) {
+       _response: function() {
+               var that = this,
+                       index = ++requestIndex;
+
+               return function( content ) {
+                       if ( index === requestIndex ) {
+                               that.__response( content );
+                       }
+
+                       that.pending--;
+                       if ( !that.pending ) {
+                               that.element.removeClass( "ui-autocomplete-loading" );
+                       }
+               };
+       },
+
+       __response: function( content ) {
                if ( !this.options.disabled && content && content.length ) {
                        content = this._normalize( content );
                        this._suggest( content );
@@ -321,10 +324,6 @@ $.widget( "ui.autocomplete", {
                } else {
                        this.close();
                }
-               this.pending--;
-               if ( !this.pending ) {
-                       this.element.removeClass( "ui-autocomplete-loading" );
-               }
        },
 
        close: function( event ) {
@@ -422,6 +421,14 @@ $.widget( "ui.autocomplete", {
 
        widget: function() {
                return this.menu.element;
+       },
+       _keyEvent: function( keyEvent, event ) {
+               if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
+                       this._move( keyEvent, event );
+
+                       // prevents moving cursor to beginning/end of the text field in some browsers
+                       event.preventDefault();
+               }
        }
 });
 
@@ -594,7 +601,7 @@ $.widget("ui.menu", {
                        }
 
                        var base = this.active.offset().top,
-                               height = this.element.height();
+                               height = this.element.height(),
                                result = this.element.children(".ui-menu-item").filter(function() {
                                        var close = $(this).offset().top - base + height - $(this).height();
                                        // TODO improve approximation
index 1ff2f7f..47bd6aa 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 98b4f9b..2a8a2c1 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI 1.8.18
+ * jQuery UI 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -18,7 +18,7 @@ if ( $.ui.version ) {
 }
 
 $.extend( $.ui, {
-       version: "1.8.18",
+       version: "1.8.21",
 
        keyCode: {
                ALT: 18,
index c3b08be..8ca1b15 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -12,7 +12,7 @@
  */
 (function( $, undefined ) {
 
-$.extend($.ui, { datepicker: { version: "1.8.18" } });
+$.extend($.ui, { datepicker: { version: "1.8.21" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -620,8 +620,8 @@ $.extend(Datepicker.prototype, {
                                        $.datepicker._updateDatepicker(inst);
                                }
                        }
-                       catch (event) {
-                               $.datepicker.log(event);
+                       catch (err) {
+                               $.datepicker.log(err);
                        }
                }
                return true;
@@ -800,10 +800,8 @@ $.extend(Datepicker.prototype, {
                if (this._datepickerShowing) {
                        var showAnim = this._get(inst, 'showAnim');
                        var duration = this._get(inst, 'duration');
-                       var self = this;
                        var postProcess = function() {
                                $.datepicker._tidyDialog(inst);
-                               self._curInst = null;
                        };
                        if ($.effects && $.effects[showAnim])
                                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
@@ -1817,7 +1815,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.18";
+$.datepicker.version = "1.8.21";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index 4340b45..e7e05b1 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -702,7 +702,7 @@ $.widget("ui.dialog", {
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.18",
+       version: "1.8.21",
 
        uuid: 0,
        maxZ: 0,
index 4141ff7..40a0c52 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Draggable 1.8.18
+/*!
+ * jQuery UI Draggable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -103,6 +103,8 @@ $.widget("ui.draggable", $.ui.mouse, {
                //Create and append the visible helper
                this.helper = this._createHelper(event);
 
+               this.helper.addClass("ui-draggable-dragging");
+
                //Cache the helper size
                this._cacheHelperProportions();
 
@@ -163,7 +165,7 @@ $.widget("ui.draggable", $.ui.mouse, {
                if ($.ui.ddmanager && !o.dropBehaviour)
                        $.ui.ddmanager.prepareOffsets(this, event);
 
-               this.helper.addClass("ui-draggable-dragging");
+               
                this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
                
                //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
@@ -208,8 +210,14 @@ $.widget("ui.draggable", $.ui.mouse, {
                        this.dropped = false;
                }
                
-               //if the original element is removed, don't bother to continue if helper is set to "original"
-               if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+               //if the original element is no longer in the DOM don't bother to continue (see #8269)
+               var element = this.element[0], elementInDom = false;
+               while ( element && (element = element.parentNode) ) {
+                       if (element == document ) {
+                               elementInDom = true;
+                       }
+               }
+               if ( !elementInDom && this.options.helper === "original" )
                        return false;
 
                if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
@@ -505,7 +513,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 });
 
 $.extend($.ui.draggable, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 $.ui.plugin.add("draggable", "connectToSortable", {
index afd421f..a749161 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Droppable 1.8.18
+/*!
+ * jQuery UI Droppable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -147,7 +147,7 @@ $.widget("ui.droppable", {
 });
 
 $.extend($.ui.droppable, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
index 669d563..a4392de 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI Mouse 1.8.18
+ * jQuery UI Mouse 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -45,6 +45,9 @@ $.widget("ui.mouse", {
        // other instances of mouse
        _mouseDestroy: function() {
                this.element.unbind('.'+this.widgetName);
+               $(document)
+                       .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+                       .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
        },
 
        _mouseDown: function(event) {
index 1b90ea1..164804b 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Position 1.8.18
+/*!
+ * jQuery UI Position 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -243,7 +243,12 @@ if ( !$.offset.setOffset ) {
        $.fn.offset = function( options ) {
                var elem = this[ 0 ];
                if ( !elem || !elem.ownerDocument ) { return null; }
-               if ( options ) { 
+               if ( options ) {
+                       if ( $.isFunction( options ) ) {
+                               return this.each(function( i ) {
+                                       $( this ).offset( options.call( this, i, $( this ).offset() ) );
+                               });
+                       }
                        return this.each(function() {
                                $.offset.setOffset( this, options );
                        });
index c042b40..4139be6 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -103,7 +103,7 @@ $.widget( "ui.progressbar", {
 });
 
 $.extend( $.ui.progressbar, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 })( jQuery );
index b441435..904be47 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -98,9 +98,8 @@ $.widget("ui.resizable", $.ui.mouse, {
                                var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
                                var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
 
-                               // increase zIndex of sw, se, ne, nw axis
-                               //TODO : this modifies original option
-                               if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+                               // Apply zIndex to all handles - see #7960
+                               axis.css({ zIndex: o.zIndex });
 
                                //TODO : What's going on here?
                                if ('se' == handle) {
@@ -541,7 +540,7 @@ $.widget("ui.resizable", $.ui.mouse, {
 });
 
 $.extend($.ui.resizable, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 /*
@@ -691,13 +690,13 @@ $.ui.plugin.add("resizable", "containment", {
 
                if (cp.left < (self._helper ? co.left : 0)) {
                        self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
-                       if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+                       if (pRatio) self.size.height = self.size.width / self.aspectRatio;
                        self.position.left = o.helper ? co.left : 0;
                }
 
                if (cp.top < (self._helper ? co.top : 0)) {
                        self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
-                       if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+                       if (pRatio) self.size.width = self.size.height * self.aspectRatio;
                        self.position.top = self._helper ? co.top : 0;
                }
 
index 275021d..403e62d 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -261,7 +261,7 @@ $.widget("ui.selectable", $.ui.mouse, {
 });
 
 $.extend($.ui.selectable, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 })(jQuery);
index 23a56cc..8629dc6 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -656,7 +656,7 @@ $.widget( "ui.slider", $.ui.mouse, {
 });
 
 $.extend( $.ui.slider, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 }(jQuery));
index c3fb719..45fbb1c 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Sortable 1.8.18
+/*!
+ * jQuery UI Sortable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -155,11 +155,6 @@ $.widget("ui.sortable", $.ui.mouse, {
                        left: this.offset.left - this.margins.left
                };
 
-               // Only after we got the offset, we can change the helper's position to absolute
-               // TODO: Still need to figure out a way to make relative sorting possible
-               this.helper.css("position", "absolute");
-               this.cssPosition = this.helper.css("position");
-
                $.extend(this.offset, {
                        click: { //Where the click happened, relative to the element
                                left: event.pageX - this.offset.left,
@@ -169,6 +164,11 @@ $.widget("ui.sortable", $.ui.mouse, {
                        relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
                });
 
+               // Only after we got the offset, we can change the helper's position to absolute
+               // TODO: Still need to figure out a way to make relative sorting possible
+               this.helper.css("position", "absolute");
+               this.cssPosition = this.helper.css("position");
+               
                //Generate the original position
                this.originalPosition = this._generatePosition(event);
                this.originalPageX = event.pageX;
@@ -468,8 +468,8 @@ $.widget("ui.sortable", $.ui.mouse, {
 
        _intersectsWithPointer: function(item) {
 
-               var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-                       isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+               var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+                       isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
                        isOverElement = isOverElementHeight && isOverElementWidth,
                        verticalDirection = this._getDragVerticalDirection(),
                        horizontalDirection = this._getDragHorizontalDirection();
@@ -730,30 +730,31 @@ $.widget("ui.sortable", $.ui.mouse, {
                if(this.containers.length === 1) {
                        this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
-               } else if(this.currentContainer != this.containers[innermostIndex]) { 
-
-                       //When entering a new container, we will find the item with the least distance and append our item near it 
-                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
-                       for (var j = this.items.length - 1; j >= 0; j--) { 
-                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
-                               var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
-                               if(Math.abs(cur - base) < dist) { 
-                                       dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
-                               } 
-                       } 
-
-                       if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
-                               return; 
-
-                       this.currentContainer = this.containers[innermostIndex]; 
-                       itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
-                       this._trigger("change", event, this._uiHash()); 
-                       this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
-
-                       //Update the placeholder 
-                       this.options.placeholder.update(this.currentContainer, this.placeholder); 
-               
-                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
+               } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+                       //When entering a new container, we will find the item with the least distance and append our item near it
+                       var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+                       for (var j = this.items.length - 1; j >= 0; j--) {
+                               if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+                               var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
+                               if(Math.abs(cur - base) < dist) {
+                                       dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+                                       this.direction = (cur - base > 0) ? 'down' : 'up';
+                               }
+                       }
+
+                       if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+                               return;
+
+                       this.currentContainer = this.containers[innermostIndex];
+                       itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+                       this._trigger("change", event, this._uiHash());
+                       this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+                       //Update the placeholder
+                       this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+                       this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
                        this.containers[innermostIndex].containerCache.over = 1;
                } 
        
@@ -1075,7 +1076,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 });
 
 $.extend($.ui.sortable, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 })(jQuery);
index bd30ad5..d9e2fdf 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -427,7 +427,7 @@ $.widget( "ui.tabs", {
                // meta-function to give users option to provide a href string instead of a numerical index.
                // also sanitizes numerical indexes to valid values.
                if ( typeof index == "string" ) {
-                       index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+                       index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
                }
 
                return index;
@@ -698,7 +698,7 @@ $.widget( "ui.tabs", {
 });
 
 $.extend( $.ui.tabs, {
-       version: "1.8.18"
+       version: "1.8.21"
 });
 
 /*
@@ -733,7 +733,6 @@ $.extend( $.ui.tabs.prototype, {
                                }
                        }
                        : function( e ) {
-                               t = o.selected;
                                rotate();
                        });
 
index 0c6f53f..4f7aea7 100644 (file)
@@ -1,7 +1,7 @@
 /*!
- * jQuery UI Widget 1.8.18
+ * jQuery UI Widget 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 3e5df6c..4ad0cec 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Accordion 1.8.18
+/*!
+ * jQuery UI Accordion 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 955f121..428e66a 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Autocomplete 1.8.18
+/*!
+ * jQuery UI Autocomplete 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
@@ -13,7 +13,7 @@
 * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
 
 /*
- * jQuery UI Menu 1.8.18
+ * jQuery UI Menu 1.8.21
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 0074880..f5fe74e 100644 (file)
@@ -1,13 +1,13 @@
-/*
- * jQuery UI Button 1.8.18
+/*!
+ * jQuery UI Button 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Button#theming
  */
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: hidden; *overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
 .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
 button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
 .ui-button-icons-only { width: 3.4em; } 
index 42fc9e7..f19df47 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index bf61459..4c0ca36 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Datepicker 1.8.18
+/*!
+ * jQuery UI Datepicker 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index ba14475..77329fb 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Dialog 1.8.18
+/*!
+ * jQuery UI Dialog 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 3850631..4c2a52d 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Progressbar 1.8.18
+/*!
+ * jQuery UI Progressbar 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index ecfa0d1..0105c8a 100644 (file)
@@ -1,14 +1,14 @@
-/*
- * jQuery UI Resizable 1.8.18
+/*!
+ * jQuery UI Resizable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
  * http://docs.jquery.com/UI/Resizable#theming
  */
 .ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
 .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
 .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
 .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
index f06d70c..1d89569 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Selectable 1.8.18
+/*!
+ * jQuery UI Selectable 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index df19d6f..9bd0fd9 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Slider 1.8.18
+/*!
+ * jQuery UI Slider 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 2e98e2e..d4645f8 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI Tabs 1.8.18
+/*!
+ * jQuery UI Tabs 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index 0e2a746..aad5943 100644 (file)
@@ -1,7 +1,7 @@
-/*
- * jQuery UI CSS Framework 1.8.18
+/*!
+ * jQuery UI CSS Framework 1.8.21
  *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
  * http://jquery.org/license
  *
index e46467b..28eb1fc 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-blue.png and b/resources/jquery.ui/themes/vector/images/button-disabled-blue.png differ
index 7125691..0e29d85 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-green.png and b/resources/jquery.ui/themes/vector/images/button-disabled-green.png differ
index 9d01bbc..ede6998 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled-red.png and b/resources/jquery.ui/themes/vector/images/button-disabled-red.png differ
index bfaf84e..e4e4ec1 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-disabled.png and b/resources/jquery.ui/themes/vector/images/button-disabled.png differ
index 781a281..766e574 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-blue.png and b/resources/jquery.ui/themes/vector/images/button-down-blue.png differ
index 60bba29..90969c3 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-green.png and b/resources/jquery.ui/themes/vector/images/button-down-green.png differ
index 54c847d..f625729 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down-red.png and b/resources/jquery.ui/themes/vector/images/button-down-red.png differ
index 29508a0..c646757 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-down.png and b/resources/jquery.ui/themes/vector/images/button-down.png differ
index a5fdd7d..109907f 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-off-green.png and b/resources/jquery.ui/themes/vector/images/button-off-green.png differ
index 89a0e9a..cc5eb11 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-off.png and b/resources/jquery.ui/themes/vector/images/button-off.png differ
index fbde737..47a0b1b 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over-green.png and b/resources/jquery.ui/themes/vector/images/button-over-green.png differ
index b2d4c0b..a244536 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over-red.png and b/resources/jquery.ui/themes/vector/images/button-over-red.png differ
index 2400f62..558f1f8 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/button-over.png and b/resources/jquery.ui/themes/vector/images/button-over.png differ
index b36dafb..ef0dd9e 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/close.png and b/resources/jquery.ui/themes/vector/images/close.png differ
index 2146cb0..09de537 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_flat_15_cd0a0a_40x100.png differ
index 6ff03d5..c06dd56 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_flat_70_000000_40x100.png differ
index 28b566c..5308b46 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png differ
index dac8462..0c8997f 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-hard_80_d7ebf9_1x100.png differ
index ad7f982..3149255 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_e4f1fb_1x100.png differ
index 8169ec3..09b2376 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_100_ffffff_1x100.png differ
index 54aff0c..66627c1 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_highlight-soft_25_ffef8f_1x100.png differ
index 3d87ac7..ccb6dc0 100644 (file)
Binary files a/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png and b/resources/jquery.ui/themes/vector/images/ui-bg_inset-hard_100_f0f0f0_1x100.png differ
index 2b19fcd..cd85f14 100644 (file)
@@ -8,7 +8,7 @@
 .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
 .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
 .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane button { float: right; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
 .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
 .ui-draggable .ui-dialog-titlebar { cursor: move; }
 /* Customizations */
index 366643b..f1bd7c5 100644 (file)
@@ -5,9 +5,15 @@
 .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
 .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
 .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+/* @noflip */
 .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+/* @noflip */
 .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+/* @noflip */
 .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+/* @noflip */
 .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+/* @noflip */
 .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
\ No newline at end of file
index 2af4c94..83d6ff8 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-ltr.png and b/resources/jquery/images/jquery.arrowSteps.divider-ltr.png differ
index 6aba7f2..529d7b8 100644 (file)
Binary files a/resources/jquery/images/jquery.arrowSteps.divider-rtl.png and b/resources/jquery/images/jquery.arrowSteps.divider-rtl.png differ
index 3c0d7e5..45df39a 100644 (file)
@@ -8,7 +8,7 @@
 
        /**
         * Enforces a byte limit to a textbox, so that UTF-8 entries are counted as well, when, for example,
-        * a databae field has a byte limit rather than a character limit.
+        * a database field has a byte limit rather than a character limit.
         * Plugin rationale: Browser has native maxlength for number of characters, this plugin exists to
         * limit number of bytes instead.
         *
index 5abb869..2db0629 100644 (file)
@@ -1,19 +1,85 @@
 /**
- * jQuery QUnit CompletenessTest 0.3
+ * jQuery QUnit CompletenessTest 0.4
  *
  * Tests the completeness of test suites for object oriented javascript
  * libraries. Written to be used in environments with jQuery and QUnit.
- * Requires jQuery 1.5.2 or higher.
- *
- * Globals: jQuery, QUnit, console.log
+ * Requires jQuery 1.7.2 or higher.
  *
  * Built for and tested with:
- * - Safari 5
+ * - Chrome 19
  * - Firefox 4
+ * - Safari 5
  *
- * @author Timo Tijhof, 2011
+ * @author Timo Tijhof, 2011-2012
  */
-( function( $ ) {
+/*global jQuery, QUnit */
+/*jshint eqeqeq:false, eqnull:false, forin:false */
+( function ( $ ) {
+       "use strict";
+
+       var util,
+               hasOwn = Object.prototype.hasOwnProperty,
+               log = (window.console && window.console.log)
+                       ? function () { return window.console.log.apply(window.console, arguments); }
+                       : function () {};
+
+       // Simplified version of a few jQuery methods, except that they don't
+       // call other jQuery methods. Required to be able to run the CompletenessTest
+       // on jQuery itself as well.
+       util = {
+               keys: Object.keys || function ( object ) {
+                       var key, keys = [];
+                       for ( key in object ) {
+                               if ( hasOwn.call( object, key ) ) {
+                                       keys.push( key );
+                               }
+                       }
+                       return keys;
+               },
+               extend: function () {
+                       var options, name, src, copy,
+                               target = arguments[0] || {},
+                               i = 1,
+                               length = arguments.length;
+
+                       for ( ; i < length; i++ ) {
+                               // Only deal with non-null/undefined values
+                               if ( (options = arguments[ i ]) != null ) {
+                                       // Extend the base object
+                                       for ( name in options ) {
+                                               src = target[ name ];
+                                               copy = options[ name ];
+
+                                               // Prevent never-ending loop
+                                               if ( target === copy ) {
+                                                       continue;
+                                               }
+
+                                               if ( copy !== undefined ) {
+                                                       target[ name ] = copy;
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Return the modified object
+                       return target;
+               },
+               each: function ( object, callback ) {
+                       var name;
+                       for ( name in object ) {
+                               if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+                                       break;
+                               }
+                       }
+               },
+               // $.type and $.isEmptyObject are safe as is, they don't call
+               // other $.* methods. Still need to be derefenced into `util`
+               // since the CompletenessTest will overload them with spies.
+               type: $.type,
+               isEmptyObject: $.isEmptyObject
+       };
+
 
 /**
  * CompletenessTest
@@ -33,67 +99,103 @@ var CompletenessTest = function ( masterVariable, ignoreFn ) {
 
        // Keep track in these objects. Keyed by strings with the
        // method names (ie. 'my.foo', 'my.bar', etc.) values are boolean true.
+       this.injectionTracker = {};
        this.methodCallTracker = {};
        this.missingTests = {};
 
-       this.ignoreFn = undefined === ignoreFn ? function(){ return false; } : ignoreFn;
+       this.ignoreFn = undefined === ignoreFn ? function () { return false; } : ignoreFn;
 
        // Lazy limit in case something weird happends (like recurse (part of) ourself).
-       this.lazyLimit = 1000;
+       this.lazyLimit = 2000;
        this.lazyCounter = 0;
 
        var that = this;
 
        // Bind begin and end to QUnit.
-       QUnit.begin = function(){
-               that.checkTests( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
-       };
+       QUnit.begin( function () {
+               that.walkTheObject( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_INJECT );
+               log( 'CompletenessTest/walkTheObject/ACTION_INJECT', that );
+       });
+
+       QUnit.done( function () {
+               that.populateMissingTests();
+               log( 'CompletenessTest/populateMissingTests', that );
+
+               var toolbar, testResults, cntTotal, cntCalled, cntMissing;
+
+               cntTotal = util.keys( that.injectionTracker ).length;
+               cntCalled = util.keys( that.methodCallTracker ).length;
+               cntMissing = util.keys( that.missingTests ).length;
 
-       QUnit.done = function(){
-               that.checkTests( null, masterVariable, masterVariable, [], CompletenessTest.ACTION_CHECK );
-               console.log( 'CompletenessTest.ACTION_CHECK', that );
+               function makeTestResults( blob, title, style ) {
+                       var elOutputWrapper, elTitle, elContainer, elList, elFoot;
 
-               // Build HTML representing the outcome from CompletenessTest
-               // And insert it into the header.
+                       elTitle = document.createElement( 'strong' );
+                       elTitle.textContent = title || 'Values';
 
-               var makeList = function( blob, title, style ) {
-                       title = title || 'Values';
-                       var html = '<strong>' + mw.html.escape(title) + '</strong>';
-                       $.each( blob, function( key ) {
-                               html += '<br />' + mw.html.escape(key);
+                       elList = document.createElement( 'ul' );
+                       util.each( blob, function ( key ) {
+                               var elItem = document.createElement( 'li' );
+                               elItem.textContent = key;
+                               elList.appendChild( elItem );
                        });
-                       html += '<br /><br /><em>&mdash; CompletenessTest</em>';
-                       var     $oldResult = $( '#qunit-completenesstest' ),
-                               $result = $oldResult.length ? $oldResult : $( '<div id="qunit-completenesstest"></div>' );
-                       return $result.css( style ).html( html );
-               };
 
-               if ( $.isEmptyObject( that.missingTests ) ) {
+                       elFoot = document.createElement( 'p' );
+                       elFoot.innerHTML = '<em>&mdash; CompletenessTest</em>';
+
+                       elContainer = document.createElement( 'div' );
+                       elContainer.appendChild( elTitle );
+                       elContainer.appendChild( elList );
+                       elContainer.appendChild( elFoot );
+
+                       elOutputWrapper = document.getElementById( 'qunit-completenesstest' );
+                       if ( !elOutputWrapper ) {
+                               elOutputWrapper = document.createElement( 'div' );
+                               elOutputWrapper.id = 'qunit-completenesstest';
+                       }
+                       elOutputWrapper.appendChild( elContainer );
+
+                       util.each( style, function ( key, value ) {
+                               elOutputWrapper.style[key] = value;
+                       });
+                       return elOutputWrapper;
+               }
+
+               if ( cntMissing === 0 ) {
                        // Good
-                       var $testResults = makeList(
-                               { 'No missing tests!': true },
-                               'missingTests',
+                       testResults = makeTestResults(
+                               {},
+                               'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. No missing tests!',
                                {
-                                       background: '#D2E0E6',
+                                       backgroundColor: '#D2E0E6',
                                        color: '#366097',
-                                       padding: '1em'
+                                       paddingTop: '1em',
+                                       paddingRight: '1em',
+                                       paddingBottom: '1em',
+                                       paddingLeft: '1em'
                                }
                        );
                } else {
                        // Bad
-                       var $testResults = makeList(
+                       testResults = makeTestResults(
                                that.missingTests,
-                               'missingTests',
+                               'Detected calls to ' + cntCalled + '/' + cntTotal + ' methods. ' + cntMissing + ' methods not covered:',
                                {
-                                       background: '#EE5757',
+                                       backgroundColor: '#EE5757',
                                        color: 'black',
-                                       padding: '1em'
+                                       paddingTop: '1em',
+                                       paddingRight: '1em',
+                                       paddingBottom: '1em',
+                                       paddingLeft: '1em'
                                }
                        );
                }
 
-               $( '#qunit-testrunner-toolbar' ).prepend( $testResults );
-       };
+               toolbar = document.getElementById( 'qunit-testrunner-toolbar' );
+               if ( toolbar ) {
+                       toolbar.insertBefore( testResults, toolbar.firstChild );
+               }
+       });
 
        return this;
 };
@@ -106,7 +208,7 @@ CompletenessTest.ACTION_CHECK = 501;
 CompletenessTest.fn = CompletenessTest.prototype = {
 
        /**
-        * CompletenessTest.fn.checkTests
+        * CompletenessTest.fn.walkTheObject
         *
         * This function recursively walks through the given object, calling itself as it goes.
         * Depending on the action it either injects our listener into the methods, or
@@ -121,92 +223,86 @@ CompletenessTest.fn = CompletenessTest.prototype = {
         *  masterVariable. Not including currName.
         * @param action {Number} What is this function supposed to do (ACTION_INJECT or ACTION_CHECK)
         */
-       checkTests: function( currName, currVar, masterVariable, parentPathArray, action ) {
-
-               // Handle the lazy limit
-               this.lazyCounter++;
-               if ( this.lazyCounter > this.lazyLimit ) {
-                       console.log( 'CompletenessTest.fn.checkTests> Limit reached: ' + this.lazyCounter );
-                       return null;
-               }
+       walkTheObject: function ( currName, currVar, masterVariable, parentPathArray, action ) {
 
-               var     type = $.type( currVar ),
+               var key, value, tmpPathArray,
+                       type = util.type( currVar ),
                        that = this;
 
                // Hard ignores
                if ( this.ignoreFn( currVar, that, parentPathArray ) ) {
                        return null;
+               }
 
-               // Functions
-               } else  if ( type === 'function' ) {
-
-                       /* CHECK MODE */
-
-                       if ( action === CompletenessTest.ACTION_CHECK ) {
-
-                               if ( !currVar.prototype || $.isEmptyObject( currVar.prototype ) ) {
-
-                                       that.hasTest( parentPathArray.join( '.' ) );
+               // Handle the lazy limit
+               this.lazyCounter++;
+               if ( this.lazyCounter > this.lazyLimit ) {
+                       log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, parentPathArray );
+                       return null;
+               }
 
-                               // We don't support checking object constructors yet...
-                               } else {
+               // Functions
+               if ( type === 'function' ) {
 
-                                       // ...the prototypes are fine tho
-                                       $.each( currVar.prototype, function( key, value ) {
-                                               if ( key === 'constructor' ) return;
+                       if ( !currVar.prototype || util.isEmptyObject( currVar.prototype ) ) {
 
-                                               // Clone and break reference to parentPathArray
-                                               var tmpPathArray = $.extend( [], parentPathArray );
-                                               tmpPathArray.push( 'prototype' ); tmpPathArray.push( key );
+                               if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                                               that.hasTest( tmpPathArray.join( '.' ) );
+                                       that.injectionTracker[ parentPathArray.join( '.' ) ] = true;
+                                       that.injectCheck( masterVariable, parentPathArray, function () {
+                                               that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
                                        } );
                                }
 
-                       /* INJECT MODE */
-
-                       } else if ( action === CompletenessTest.ACTION_INJECT ) {
+                       // We don't support checking object constructors yet...
+                       // ...we can check the prototypes fine, though.
+                       } else {
+                               if ( action === CompletenessTest.ACTION_INJECT ) {
 
-                               if ( !currVar.prototype || $.isEmptyObject( currVar.prototype ) ) {
+                                       for ( key in currVar.prototype ) {
+                                               if ( hasOwn.call( currVar.prototype, key ) ) {
+                                                       value = currVar.prototype[key];
+                                                       if ( key === 'constructor' ) {
+                                                               continue;
+                                                       }
 
-                                       // Inject check
-                                       that.injectCheck( masterVariable, parentPathArray, function() {
-                                               that.methodCallTracker[ parentPathArray.join( '.' ) ] = true;
-                                       } );
+                                                       // Clone and break reference to parentPathArray
+                                                       tmpPathArray = util.extend( [], parentPathArray );
+                                                       tmpPathArray.push( 'prototype' );
+                                                       tmpPathArray.push( key );
 
-                               // We don't support checking object constructors yet...
-                               } else {
+                                                       that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                                               }
+                                       }
 
-                                       // ... the prototypes are fine tho
-                                       $.each( currVar.prototype, function( key, value ) {
-                                               if ( key === 'constructor' ) return;
-
-                                               // Clone and break reference to parentPathArray
-                                               var tmpPathArray = $.extend( [], parentPathArray );
-                                               tmpPathArray.push( 'prototype' ); tmpPathArray.push( key );
-
-                                               that.checkTests( key, value, masterVariable, tmpPathArray, action );
-                                       } );
                                }
-
                        }
 
-               // Recursively. After all, this *is* the completeness test
-               } else if ( type === 'object' ) {
-
-                       $.each( currVar, function( key, value ) {
-
-                               // Clone and break reference to parentPathArray
-                               var tmpPathArray = $.extend( [], parentPathArray );
-                               tmpPathArray.push( key );
+               }
 
-                               that.checkTests( key, value, masterVariable, tmpPathArray, action );
+               // Recursively. After all, this is the *completeness* test
+               if ( type === 'function' || type === 'object' ) {
+                       for ( key in currVar ) {
+                               if ( hasOwn.call( currVar, key ) ) {
+                                       value = currVar[key];
 
-                       } );
+                                       // Clone and break reference to parentPathArray
+                                       tmpPathArray = util.extend( [], parentPathArray );
+                                       tmpPathArray.push( key );
 
+                                       that.walkTheObject( key, value, masterVariable, tmpPathArray, action );
+                               }
+                       }
                }
        },
 
+       populateMissingTests: function () {
+               var ct = this;
+               util.each( ct.injectionTracker, function ( key ) {
+                       ct.hasTest( key );
+               });
+       },
+
        /**
         * CompletenessTest.fn.hasTest
         *
@@ -217,7 +313,7 @@ CompletenessTest.fn = CompletenessTest.prototype = {
         * @param fnName {String}
         * @return {Boolean}
         */
-       hasTest: function( fnName ) {
+       hasTest: function ( fnName ) {
                if ( !( fnName in this.methodCallTracker ) ) {
                        this.missingTests[fnName] = true;
                        return false;
@@ -235,19 +331,24 @@ CompletenessTest.fn = CompletenessTest.prototype = {
         * @param objectPathArray {Array}
         * @param injectFn {Function}
         */
-       injectCheck: function( masterVariable, objectPathArray, injectFn ) {
-               var     prev,
-                       curr = masterVariable,
-                       lastMember;
+       injectCheck: function ( masterVariable, objectPathArray, injectFn ) {
+               var i, len, prev, memberName, lastMember,
+                       curr = masterVariable;
+
+               // Get the object in question through the path from the master variable,
+               // We can't pass the value directly because we need to re-define the object
+               // member and keep references to the parent object, member name and member
+               // value at all times.
+               for ( i = 0, len = objectPathArray.length; i < len; i++ ) {
+                       memberName = objectPathArray[i];
 
-               $.each( objectPathArray, function( i, memberName ) {
                        prev = curr;
                        curr = prev[memberName];
                        lastMember = memberName;
-               });
+               }
 
                // Objects are by reference, members (unless objects) are not.
-               prev[lastMember] = function() {
+               prev[lastMember] = function () {
                        injectFn();
                        return curr.apply( this, arguments );
                };
index b948bae..5684a44 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.5.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.8.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
@@ -56,6 +56,7 @@
 
 #qunit-header label {
        display: inline-block;
+       padding-left: 0.5em;
 }
 
 #qunit-banner {
index 66dd721..c1570c2 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * QUnit v1.5.0 - A JavaScript Unit Testing Framework
+ * QUnit v1.8.0 - A JavaScript Unit Testing Framework
  *
  * http://docs.jquery.com/QUnit
  *
@@ -8,75 +8,89 @@
  * or GPL (GPL-LICENSE.txt) licenses.
  */
 
-(function(window) {
+(function( window ) {
 
-var defined = {
+var QUnit,
+       config,
+       onErrorFnPrev,
+       testId = 0,
+       fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""),
+       toString = Object.prototype.toString,
+       hasOwn = Object.prototype.hasOwnProperty,
+       defined = {
        setTimeout: typeof window.setTimeout !== "undefined",
        sessionStorage: (function() {
                var x = "qunit-test-string";
                try {
-                       sessionStorage.setItem(x, x);
-                       sessionStorage.removeItem(x);
+                       sessionStorage.setItem( x, x );
+                       sessionStorage.removeItem( x );
                        return true;
-               } catch(e) {
+               } catch( e ) {
                        return false;
                }
        }())
 };
 
-var    testId = 0,
-       toString = Object.prototype.toString,
-       hasOwn = Object.prototype.hasOwnProperty;
-
-var Test = function(name, testName, expected, async, callback) {
-       this.name = name;
-       this.testName = testName;
-       this.expected = expected;
-       this.async = async;
-       this.callback = callback;
+function Test( settings ) {
+       extend( this, settings );
        this.assertions = [];
-};
+       this.testNumber = ++Test.count;
+}
+
+Test.count = 0;
+
 Test.prototype = {
        init: function() {
-               var tests = id("qunit-tests");
-               if (tests) {
-                       var b = document.createElement("strong");
-                               b.innerHTML = "Running " + this.name;
-                       var li = document.createElement("li");
-                               li.appendChild( b );
-                               li.className = "running";
-                               li.id = this.id = "test-output" + testId++;
+               var a, b, li,
+        tests = id( "qunit-tests" );
+
+               if ( tests ) {
+                       b = document.createElement( "strong" );
+                       b.innerHTML = this.name;
+
+                       // `a` initialized at top of scope
+                       a = document.createElement( "a" );
+                       a.innerHTML = "Rerun";
+                       a.href = QUnit.url({ testNumber: this.testNumber });
+
+                       li = document.createElement( "li" );
+                       li.appendChild( b );
+                       li.appendChild( a );
+                       li.className = "running";
+                       li.id = this.id = "qunit-test-output" + testId++;
+
                        tests.appendChild( li );
                }
        },
        setup: function() {
-               if (this.module != config.previousModule) {
+               if ( this.module !== config.previousModule ) {
                        if ( config.previousModule ) {
-                               runLoggingCallbacks('moduleDone', QUnit, {
+                               runLoggingCallbacks( "moduleDone", QUnit, {
                                        name: config.previousModule,
                                        failed: config.moduleStats.bad,
                                        passed: config.moduleStats.all - config.moduleStats.bad,
                                        total: config.moduleStats.all
-                               } );
+                               });
                        }
                        config.previousModule = this.module;
                        config.moduleStats = { all: 0, bad: 0 };
-                       runLoggingCallbacks( 'moduleStart', QUnit, {
+                       runLoggingCallbacks( "moduleStart", QUnit, {
                                name: this.module
-                       } );
-               } else if (config.autorun) {
-                       runLoggingCallbacks( 'moduleStart', QUnit, {
+                       });
+               } else if ( config.autorun ) {
+                       runLoggingCallbacks( "moduleStart", QUnit, {
                                name: this.module
-                       } );
+                       });
                }
 
                config.current = this;
+
                this.testEnvironment = extend({
                        setup: function() {},
                        teardown: function() {}
-               }, this.moduleTestEnvironment);
+               }, this.moduleTestEnvironment );
 
-               runLoggingCallbacks( 'testStart', QUnit, {
+               runLoggingCallbacks( "testStart", QUnit, {
                        name: this.testName,
                        module: this.module
                });
@@ -89,19 +103,19 @@ Test.prototype = {
                        saveGlobal();
                }
                if ( config.notrycatch ) {
-                       this.testEnvironment.setup.call(this.testEnvironment);
+                       this.testEnvironment.setup.call( this.testEnvironment );
                        return;
                }
                try {
-                       this.testEnvironment.setup.call(this.testEnvironment);
-               } catch(e) {
+                       this.testEnvironment.setup.call( this.testEnvironment );
+               } catch( e ) {
                        QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
                }
        },
        run: function() {
                config.current = this;
 
-               var running = id("qunit-testresult");
+               var running = id( "qunit-testresult" );
 
                if ( running ) {
                        running.innerHTML = "Running: <br/>" + this.name;
@@ -112,13 +126,14 @@ Test.prototype = {
                }
 
                if ( config.notrycatch ) {
-                       this.callback.call(this.testEnvironment);
+                       this.callback.call( this.testEnvironment, QUnit.assert );
                        return;
                }
+
                try {
-                       this.callback.call(this.testEnvironment);
-               } catch(e) {
-                       QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + ": " + e.message, extractStacktrace( e, 1 ) );
+                       this.callback.call( this.testEnvironment, QUnit.assert );
+               } catch( e ) {
+                       QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + e.message, extractStacktrace( e, 0 ) );
                        // else next test will carry the responsibility
                        saveGlobal();
 
@@ -131,12 +146,12 @@ Test.prototype = {
        teardown: function() {
                config.current = this;
                if ( config.notrycatch ) {
-                       this.testEnvironment.teardown.call(this.testEnvironment);
+                       this.testEnvironment.teardown.call( this.testEnvironment );
                        return;
                } else {
                        try {
-                               this.testEnvironment.teardown.call(this.testEnvironment);
-                       } catch(e) {
+                               this.testEnvironment.teardown.call( this.testEnvironment );
+                       } catch( e ) {
                                QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) );
                        }
                }
@@ -144,28 +159,32 @@ Test.prototype = {
        },
        finish: function() {
                config.current = this;
-               if ( this.expected != null && this.expected != this.assertions.length ) {
-                       QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" );
+               if ( config.requireExpects && this.expected == null ) {
+                       QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );
+               } else if ( this.expected != null && this.expected != this.assertions.length ) {
+                       QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );
                } else if ( this.expected == null && !this.assertions.length ) {
-                       QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions." );
+                       QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );
                }
 
-               var good = 0, bad = 0,
-                       li, i,
-                       tests = id("qunit-tests");
+               var assertion, a, b, i, li, ol,
+                       test = this,
+                       good = 0,
+                       bad = 0,
+                       tests = id( "qunit-tests" );
 
                config.stats.all += this.assertions.length;
                config.moduleStats.all += this.assertions.length;
 
                if ( tests ) {
-                       var ol = document.createElement("ol");
+                       ol = document.createElement( "ol" );
 
                        for ( i = 0; i < this.assertions.length; i++ ) {
-                               var assertion = this.assertions[i];
+                               assertion = this.assertions[i];
 
-                               li = document.createElement("li");
+                               li = document.createElement( "li" );
                                li.className = assertion.result ? "pass" : "fail";
-                               li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed");
+                               li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );
                                ol.appendChild( li );
 
                                if ( assertion.result ) {
@@ -179,45 +198,44 @@ Test.prototype = {
 
                        // store result when possible
                        if ( QUnit.config.reorder && defined.sessionStorage ) {
-                               if (bad) {
-                                       sessionStorage.setItem("qunit-test-" + this.module + "-" + this.testName, bad);
+                               if ( bad ) {
+                                       sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );
                                } else {
-                                       sessionStorage.removeItem("qunit-test-" + this.module + "-" + this.testName);
+                                       sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );
                                }
                        }
 
-                       if (bad === 0) {
+                       if ( bad === 0 ) {
                                ol.style.display = "none";
                        }
 
-                       var b = document.createElement("strong");
+                       // `b` initialized at top of scope
+                       b = document.createElement( "strong" );
                        b.innerHTML = this.name + " <b class='counts'>(<b class='failed'>" + bad + "</b>, <b class='passed'>" + good + "</b>, " + this.assertions.length + ")</b>";
 
-                       var a = document.createElement("a");
-                       a.innerHTML = "Rerun";
-                       a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
-
                        addEvent(b, "click", function() {
                                var next = b.nextSibling.nextSibling,
                                        display = next.style.display;
                                next.style.display = display === "none" ? "block" : "none";
                        });
 
-                       addEvent(b, "dblclick", function(e) {
+                       addEvent(b, "dblclick", function( e ) {
                                var target = e && e.target ? e.target : window.event.srcElement;
                                if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) {
                                        target = target.parentNode;
                                }
                                if ( window.location && target.nodeName.toLowerCase() === "strong" ) {
-                                       window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") });
+                                       window.location = QUnit.url({ testNumber: test.testNumber });
                                }
                        });
 
-                       li = id(this.id);
+                       // `li` initialized at top of scope
+                       li = id( this.id );
                        li.className = bad ? "fail" : "pass";
                        li.removeChild( li.firstChild );
+                       a = li.firstChild;
                        li.appendChild( b );
-                       li.appendChild( a );
+                       li.appendChild ( a );
                        li.appendChild( ol );
 
                } else {
@@ -230,19 +248,23 @@ Test.prototype = {
                        }
                }
 
-               QUnit.reset();
-
-               runLoggingCallbacks( 'testDone', QUnit, {
+               runLoggingCallbacks( "testDone", QUnit, {
                        name: this.testName,
                        module: this.module,
                        failed: bad,
                        passed: this.assertions.length - bad,
                        total: this.assertions.length
-               } );
+               });
+
+               QUnit.reset();
+
+               config.current = undefined;
        },
 
        queue: function() {
-               var test = this;
+               var bad,
+                       test = this;
+
                synchronize(function() {
                        test.init();
                });
@@ -261,36 +283,42 @@ Test.prototype = {
                                test.finish();
                        });
                }
+
+               // `bad` initialized at top of scope
                // defer when previous test run passed, if storage is available
-               var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-test-" + this.module + "-" + this.testName);
-               if (bad) {
+               bad = QUnit.config.reorder && defined.sessionStorage &&
+                                               +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );
+
+               if ( bad ) {
                        run();
                } else {
-                       synchronize(run, true);
+                       synchronize( run, true );
                }
        }
-
 };
 
-var QUnit = {
+// Root QUnit object.
+// `QUnit` initialized at top of scope
+QUnit = {
 
        // call on start of module test to prepend name to all tests
-       module: function(name, testEnvironment) {
+       module: function( name, testEnvironment ) {
                config.currentModule = name;
                config.currentModuleTestEnviroment = testEnvironment;
        },
 
-       asyncTest: function(testName, expected, callback) {
+       asyncTest: function( testName, expected, callback ) {
                if ( arguments.length === 2 ) {
                        callback = expected;
                        expected = null;
                }
 
-               QUnit.test(testName, expected, callback, true);
+               QUnit.test( testName, expected, callback, true );
        },
 
-       test: function(testName, expected, callback, async) {
-               var name = '<span class="test-name">' + escapeInnerText(testName) + '</span>';
+       test: function( testName, expected, callback, async ) {
+               var test,
+                       name = "<span class='test-name'>" + escapeInnerText( testName ) + "</span>";
 
                if ( arguments.length === 2 ) {
                        callback = expected;
@@ -298,173 +326,209 @@ var QUnit = {
                }
 
                if ( config.currentModule ) {
-                       name = '<span class="module-name">' + config.currentModule + "</span>: " + name;
-               }
+                       name = "<span class='module-name'>" + config.currentModule + "</span>: " + name;
+               }
+
+               test = new Test({
+                       name: name,
+                       testName: testName,
+                       expected: expected,
+                       async: async,
+                       callback: callback,
+                       module: config.currentModule,
+                       moduleTestEnvironment: config.currentModuleTestEnviroment,
+                       stack: sourceFromStacktrace( 2 )
+               });
 
-               if ( !validTest(config.currentModule + ": " + testName) ) {
+               if ( !validTest( test ) ) {
                        return;
                }
 
-               var test = new Test(name, testName, expected, async, callback);
-               test.module = config.currentModule;
-               test.moduleTestEnvironment = config.currentModuleTestEnviroment;
                test.queue();
        },
 
        // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
-       expect: function(asserts) {
+       expect: function( asserts ) {
                config.current.expected = asserts;
        },
 
-       // Asserts true.
-       // @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
-       ok: function(result, msg) {
-               if (!config.current) {
-                       throw new Error("ok() assertion outside test context, was " + sourceFromStacktrace(2));
+       start: function( count ) {
+               config.semaphore -= count || 1;
+               // don't start until equal number of stop-calls
+               if ( config.semaphore > 0 ) {
+                       return;
+               }
+               // ignore if start is called more often then stop
+               if ( config.semaphore < 0 ) {
+                       config.semaphore = 0;
+               }
+               // A slight delay, to avoid any current callbacks
+               if ( defined.setTimeout ) {
+                       window.setTimeout(function() {
+                               if ( config.semaphore > 0 ) {
+                                       return;
+                               }
+                               if ( config.timeout ) {
+                                       clearTimeout( config.timeout );
+                               }
+
+                               config.blocking = false;
+                               process( true );
+                       }, 13);
+               } else {
+                       config.blocking = false;
+                       process( true );
+               }
+       },
+
+       stop: function( count ) {
+               config.semaphore += count || 1;
+               config.blocking = true;
+
+               if ( config.testTimeout && defined.setTimeout ) {
+                       clearTimeout( config.timeout );
+                       config.timeout = window.setTimeout(function() {
+                               QUnit.ok( false, "Test timed out" );
+                               config.semaphore = 1;
+                               QUnit.start();
+                       }, config.testTimeout );
+               }
+       }
+};
+
+// Asssert helpers
+// All of these must call either QUnit.push() or manually do:
+// - runLoggingCallbacks( "log", .. );
+// - config.current.assertions.push({ .. });
+QUnit.assert = {
+       /**
+        * Asserts rough true-ish result.
+        * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );
+        */
+       ok: function( result, msg ) {
+               if ( !config.current ) {
+                       throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );
                }
                result = !!result;
-               var details = {
-                       result: result,
-                       message: msg
-               };
-               msg = escapeInnerText(msg || (result ? "okay" : "failed"));
+
+               var source,
+                       details = {
+                               result: result,
+                               message: msg
+                       };
+
+               msg = escapeInnerText( msg || (result ? "okay" : "failed" ) );
+               msg = "<span class='test-message'>" + msg + "</span>";
+
                if ( !result ) {
-                       var source = sourceFromStacktrace(2);
-                       if (source) {
+                       source = sourceFromStacktrace( 2 );
+                       if ( source ) {
                                details.source = source;
-                               msg += '<table><tr class="test-source"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr></table>';
+                               msg += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
                        }
                }
-               runLoggingCallbacks( 'log', QUnit, details );
+               runLoggingCallbacks( "log", QUnit, details );
                config.current.assertions.push({
                        result: result,
                        message: msg
                });
        },
 
-       // Checks that the first two arguments are equal, with an optional message. Prints out both actual and expected values.
-       // @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." );
-       equal: function(actual, expected, message) {
-               QUnit.push(expected == actual, actual, expected, message);
+       /**
+        * Assert that the first two arguments are equal, with an optional message.
+        * Prints out both actual and expected values.
+        * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );
+        */
+       equal: function( actual, expected, message ) {
+               QUnit.push( expected == actual, actual, expected, message );
        },
 
-       notEqual: function(actual, expected, message) {
-               QUnit.push(expected != actual, actual, expected, message);
+       notEqual: function( actual, expected, message ) {
+               QUnit.push( expected != actual, actual, expected, message );
        },
 
-       deepEqual: function(actual, expected, message) {
-               QUnit.push(QUnit.equiv(actual, expected), actual, expected, message);
+       deepEqual: function( actual, expected, message ) {
+               QUnit.push( QUnit.equiv(actual, expected), actual, expected, message );
        },
 
-       notDeepEqual: function(actual, expected, message) {
-               QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);
+       notDeepEqual: function( actual, expected, message ) {
+               QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );
        },
 
-       strictEqual: function(actual, expected, message) {
-               QUnit.push(expected === actual, actual, expected, message);
+       strictEqual: function( actual, expected, message ) {
+               QUnit.push( expected === actual, actual, expected, message );
        },
 
-       notStrictEqual: function(actual, expected, message) {
-               QUnit.push(expected !== actual, actual, expected, message);
+       notStrictEqual: function( actual, expected, message ) {
+               QUnit.push( expected !== actual, actual, expected, message );
        },
 
-       raises: function(block, expected, message) {
-               var actual, ok = false;
+       raises: function( block, expected, message ) {
+               var actual,
+                       ok = false;
 
-               if (typeof expected === 'string') {
+               if ( typeof expected === "string" ) {
                        message = expected;
                        expected = null;
                }
 
+               config.current.ignoreGlobalErrors = true;
                try {
-                       block.call(config.current.testEnvironment);
+                       block.call( config.current.testEnvironment );
                } catch (e) {
                        actual = e;
                }
+               config.current.ignoreGlobalErrors = false;
 
-               if (actual) {
+               if ( actual ) {
                        // we don't want to validate thrown error
-                       if (!expected) {
+                       if ( !expected ) {
                                ok = true;
                        // expected is a regexp
-                       } else if (QUnit.objectType(expected) === "regexp") {
-                               ok = expected.test(actual);
+                       } else if ( QUnit.objectType( expected ) === "regexp" ) {
+                               ok = expected.test( actual );
                        // expected is a constructor
-                       } else if (actual instanceof expected) {
+                       } else if ( actual instanceof expected ) {
                                ok = true;
                        // expected is a validation function which returns true is validation passed
-                       } else if (expected.call({}, actual) === true) {
+                       } else if ( expected.call( {}, actual ) === true ) {
                                ok = true;
                        }
                }
 
-               QUnit.ok(ok, message);
-       },
-
-       start: function(count) {
-               config.semaphore -= count || 1;
-               if (config.semaphore > 0) {
-                       // don't start until equal number of stop-calls
-                       return;
-               }
-               if (config.semaphore < 0) {
-                       // ignore if start is called more often then stop
-                       config.semaphore = 0;
-               }
-               // A slight delay, to avoid any current callbacks
-               if ( defined.setTimeout ) {
-                       window.setTimeout(function() {
-                               if (config.semaphore > 0) {
-                                       return;
-                               }
-                               if ( config.timeout ) {
-                                       clearTimeout(config.timeout);
-                               }
-
-                               config.blocking = false;
-                               process(true);
-                       }, 13);
-               } else {
-                       config.blocking = false;
-                       process(true);
-               }
-       },
+               QUnit.push( ok, actual, null, message );
+       }
+};
 
-       stop: function(count) {
-               config.semaphore += count || 1;
-               config.blocking = true;
+// @deprecated: Kept assertion helpers in root for backwards compatibility
+extend( QUnit, QUnit.assert );
 
-               if ( config.testTimeout && defined.setTimeout ) {
-                       clearTimeout(config.timeout);
-                       config.timeout = window.setTimeout(function() {
-                               QUnit.ok( false, "Test timed out" );
-                               config.semaphore = 1;
-                               QUnit.start();
-                       }, config.testTimeout);
-               }
-       }
+/**
+ * @deprecated: Kept for backwards compatibility
+ * next step: remove entirely
+ */
+QUnit.equals = function() {
+       QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );
+};
+QUnit.same = function() {
+       QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );
 };
 
-//We want access to the constructor's prototype
+// We want access to the constructor's prototype
 (function() {
-       function F(){}
+       function F() {}
        F.prototype = QUnit;
        QUnit = new F();
-       //Make F QUnit's constructor so that we can add to the prototype later
+       // Make F QUnit's constructor so that we can add to the prototype later
        QUnit.constructor = F;
 }());
 
-// deprecated; still export them to window to provide clear error messages
-// next step: remove entirely
-QUnit.equals = function() {
-       QUnit.push(false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead");
-};
-QUnit.same = function() {
-       QUnit.push(false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead");
-};
-
-// Maintain internal state
-var config = {
+/**
+ * Config object: Maintain internal state
+ * Later exposed as QUnit.config
+ * `config` initialized at top of scope
+ */
+config = {
        // The queue of tests to run
        queue: [],
 
@@ -482,9 +546,12 @@ var config = {
        // by default, modify document.title when suite is done
        altertitle: true,
 
-       urlConfig: ['noglobals', 'notrycatch'],
+       // when enabled, all tests must call expect()
+       requireExpects: false,
 
-       //logging callback queues
+       urlConfig: [ "noglobals", "notrycatch" ],
+
+       // logging callback queues
        begin: [],
        done: [],
        log: [],
@@ -494,16 +561,17 @@ var config = {
        moduleDone: []
 };
 
-// Load paramaters
+// Initialize more QUnit.config and QUnit.urlParams
 (function() {
-       var location = window.location || { search: "", protocol: "file:" },
+       var i,
+               location = window.location || { search: "", protocol: "file:" },
                params = location.search.slice( 1 ).split( "&" ),
                length = params.length,
                urlParams = {},
                current;
 
        if ( params[ 0 ] ) {
-               for ( var i = 0; i < length; i++ ) {
+               for ( i = 0; i < length; i++ ) {
                        current = params[ i ].split( "=" );
                        current[ 0 ] = decodeURIComponent( current[ 0 ] );
                        // allow just a key to turn on a flag, e.g., test.html?noglobals
@@ -513,26 +581,36 @@ var config = {
        }
 
        QUnit.urlParams = urlParams;
+
+       // String search anywhere in moduleName+testName
        config.filter = urlParams.filter;
 
+       // Exact match of the module name
+       config.module = urlParams.module;
+
+       config.testNumber = parseInt( urlParams.testNumber, 10 ) || null;
+
        // Figure out if we're running the tests from a server or not
-       QUnit.isLocal = location.protocol === 'file:';
+       QUnit.isLocal = location.protocol === "file:";
 }());
 
-// Expose the API as global variables, unless an 'exports'
-// object exists, in that case we assume we're in CommonJS - export everything at the end
-if ( typeof exports === "undefined" || typeof require === "undefined" ) {
-       extend(window, QUnit);
+// Export global variables, unless an 'exports' object exists,
+// in that case we assume we're in CommonJS (dealt with on the bottom of the script)
+if ( typeof exports === "undefined" ) {
+       extend( window, QUnit );
+
+       // Expose QUnit object
        window.QUnit = QUnit;
 }
 
-// define these after exposing globals to keep them in these QUnit namespace only
-extend(QUnit, {
+// Extend QUnit object,
+// these after set here because they should not be exposed as global functions
+extend( QUnit, {
        config: config,
 
        // Initialize the configuration options
        init: function() {
-               extend(config, {
+               extend( config, {
                        stats: { all: 0, bad: 0 },
                        moduleStats: { all: 0, bad: 0 },
                        started: +new Date(),
@@ -545,19 +623,21 @@ extend(QUnit, {
                        semaphore: 0
                });
 
-               var qunit = id( "qunit" );
+               var tests, banner, result,
+                       qunit = id( "qunit" );
+
                if ( qunit ) {
                        qunit.innerHTML =
-                               '<h1 id="qunit-header">' + escapeInnerText( document.title ) + '</h1>' +
-                               '<h2 id="qunit-banner"></h2>' +
-                               '<div id="qunit-testrunner-toolbar"></div>' +
-                               '<h2 id="qunit-userAgent"></h2>' +
-                               '<ol id="qunit-tests"></ol>';
+                               "<h1 id='qunit-header'>" + escapeInnerText( document.title ) + "</h1>" +
+                               "<h2 id='qunit-banner'></h2>" +
+                               "<div id='qunit-testrunner-toolbar'></div>" +
+                               "<h2 id='qunit-userAgent'></h2>" +
+                               "<ol id='qunit-tests'></ol>";
                }
 
-               var tests = id( "qunit-tests" ),
-                       banner = id( "qunit-banner" ),
-                       result = id( "qunit-testresult" );
+               tests = id( "qunit-tests" );
+               banner = id( "qunit-banner" );
+               result = id( "qunit-testresult" );
 
                if ( tests ) {
                        tests.innerHTML = "";
@@ -576,19 +656,21 @@ extend(QUnit, {
                        result.id = "qunit-testresult";
                        result.className = "result";
                        tests.parentNode.insertBefore( result, tests );
-                       result.innerHTML = 'Running...<br/>&nbsp;';
+                       result.innerHTML = "Running...<br/>&nbsp;";
                }
        },
 
        // Resets the test setup. Useful for tests that modify the DOM.
        // If jQuery is available, uses jQuery's html(), otherwise just innerHTML.
        reset: function() {
+               var fixture;
+
                if ( window.jQuery ) {
                        jQuery( "#qunit-fixture" ).html( config.fixture );
                } else {
-                       var main = id( 'qunit-fixture' );
-                       if ( main ) {
-                               main.innerHTML = config.fixture;
+                       fixture = id( "qunit-fixture" );
+                       if ( fixture ) {
+                               fixture.innerHTML = config.fixture;
                        }
                }
        },
@@ -597,13 +679,13 @@ extend(QUnit, {
        // @example triggerEvent( document.body, "click" );
        triggerEvent: function( elem, type, event ) {
                if ( document.createEvent ) {
-                       event = document.createEvent("MouseEvents");
+                       event = document.createEvent( "MouseEvents" );
                        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
                                0, 0, 0, 0, 0, false, false, false, false, 0, null);
-                       elem.dispatchEvent( event );
 
+                       elem.dispatchEvent( event );
                } else if ( elem.fireEvent ) {
-                       elem.fireEvent("on"+type);
+                       elem.fireEvent( "on" + type );
                }
        },
 
@@ -613,68 +695,74 @@ extend(QUnit, {
        },
 
        objectType: function( obj ) {
-               if (typeof obj === "undefined") {
+               if ( typeof obj === "undefined" ) {
                                return "undefined";
-
                // consider: typeof null === object
                }
-               if (obj === null) {
+               if ( obj === null ) {
                                return "null";
                }
 
-               var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || '';
+               var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || "";
 
-               switch (type) {
-                       case 'Number':
-                               if (isNaN(obj)) {
+               switch ( type ) {
+                       case "Number":
+                               if ( isNaN(obj) ) {
                                        return "nan";
                                }
                                return "number";
-                       case 'String':
-                       case 'Boolean':
-                       case 'Array':
-                       case 'Date':
-                       case 'RegExp':
-                       case 'Function':
-                                       return type.toLowerCase();
+                       case "String":
+                       case "Boolean":
+                       case "Array":
+                       case "Date":
+                       case "RegExp":
+                       case "Function":
+                               return type.toLowerCase();
                }
-               if (typeof obj === "object") {
-                               return "object";
+               if ( typeof obj === "object" ) {
+                       return "object";
                }
                return undefined;
        },
 
-       push: function(result, actual, expected, message) {
-               if (!config.current) {
-                       throw new Error("assertion outside test context, was " + sourceFromStacktrace());
+       push: function( result, actual, expected, message ) {
+               if ( !config.current ) {
+                       throw new Error( "assertion outside test context, was " + sourceFromStacktrace() );
                }
-               var details = {
-                       result: result,
-                       message: message,
-                       actual: actual,
-                       expected: expected
-               };
 
-               message = escapeInnerText(message) || (result ? "okay" : "failed");
-               message = '<span class="test-message">' + message + "</span>";
-               var output = message;
-               if (!result) {
-                       expected = escapeInnerText(QUnit.jsDump.parse(expected));
-                       actual = escapeInnerText(QUnit.jsDump.parse(actual));
-                       output += '<table><tr class="test-expected"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';
-                       if (actual != expected) {
-                               output += '<tr class="test-actual"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';
-                               output += '<tr class="test-diff"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';
+               var output, source,
+                       details = {
+                               result: result,
+                               message: message,
+                               actual: actual,
+                               expected: expected
+                       };
+
+               message = escapeInnerText( message ) || ( result ? "okay" : "failed" );
+               message = "<span class='test-message'>" + message + "</span>";
+               output = message;
+
+               if ( !result ) {
+                       expected = escapeInnerText( QUnit.jsDump.parse(expected) );
+                       actual = escapeInnerText( QUnit.jsDump.parse(actual) );
+                       output += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";
+
+                       if ( actual != expected ) {
+                               output += "<tr class='test-actual'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";
+                               output += "<tr class='test-diff'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";
                        }
-                       var source = sourceFromStacktrace();
-                       if (source) {
+
+                       source = sourceFromStacktrace();
+
+                       if ( source ) {
                                details.source = source;
-                               output += '<tr class="test-source"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr>';
+                               output += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr>";
                        }
+
                        output += "</table>";
                }
 
-               runLoggingCallbacks( 'log', QUnit, details );
+               runLoggingCallbacks( "log", QUnit, details );
 
                config.current.assertions.push({
                        result: !!result,
@@ -682,17 +770,28 @@ extend(QUnit, {
                });
        },
 
-       pushFailure: function(message, source) {
-               var details = {
-                       result: false,
-                       message: message
-               };
-               var output = escapeInnerText(message);
-               if (source) {
+       pushFailure: function( message, source ) {
+               if ( !config.current ) {
+                       throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );
+               }
+
+               var output,
+                       details = {
+                               result: false,
+                               message: message
+                       };
+
+               message = escapeInnerText(message ) || "error";
+               message = "<span class='test-message'>" + message + "</span>";
+               output = message;
+
+               if ( source ) {
                        details.source = source;
-                       output += '<table><tr class="test-source"><th>Source: </th><td><pre>' + escapeInnerText(source) + '</pre></td></tr></table>';
+                       output += "<table><tr class='test-source'><th>Source: </th><td><pre>" + escapeInnerText( source ) + "</pre></td></tr></table>";
                }
-               runLoggingCallbacks( 'log', QUnit, details );
+
+               runLoggingCallbacks( "log", QUnit, details );
+
                config.current.assertions.push({
                        result: false,
                        message: output
@@ -701,8 +800,9 @@ extend(QUnit, {
 
        url: function( params ) {
                params = extend( extend( {}, QUnit.urlParams ), params );
-               var querystring = "?",
-                       key;
+               var key,
+                       querystring = "?";
+
                for ( key in params ) {
                        if ( !hasOwn.call( params, key ) ) {
                                continue;
@@ -716,27 +816,39 @@ extend(QUnit, {
        extend: extend,
        id: id,
        addEvent: addEvent
+       // load, equiv, jsDump, diff: Attached later
 });
 
-//QUnit.constructor is set to the empty F() above so that we can add to it's prototype later
-//Doing this allows us to tell if the following methods have been overwritten on the actual
-//QUnit object, which is a deprecated way of using the callbacks.
-extend(QUnit.constructor.prototype, {
+/**
+ * @deprecated: Created for backwards compatibility with test runner that set the hook function
+ * into QUnit.{hook}, instead of invoking it and passing the hook function.
+ * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.
+ * Doing this allows us to tell if the following methods have been overwritten on the actual
+ * QUnit object.
+ */
+extend( QUnit.constructor.prototype, {
+
        // Logging callbacks; all receive a single argument with the listed properties
        // run test/logs.html for any related changes
-       begin: registerLoggingCallback('begin'),
+       begin: registerLoggingCallback( "begin" ),
+
        // done: { failed, passed, total, runtime }
-       done: registerLoggingCallback('done'),
+       done: registerLoggingCallback( "done" ),
+
        // log: { result, actual, expected, message }
-       log: registerLoggingCallback('log'),
+       log: registerLoggingCallback( "log" ),
+
        // testStart: { name }
-       testStart: registerLoggingCallback('testStart'),
+       testStart: registerLoggingCallback( "testStart" ),
+
        // testDone: { name, failed, passed, total }
-       testDone: registerLoggingCallback('testDone'),
+       testDone: registerLoggingCallback( "testDone" ),
+
        // moduleStart: { name }
-       moduleStart: registerLoggingCallback('moduleStart'),
+       moduleStart: registerLoggingCallback( "moduleStart" ),
+
        // moduleDone: { name, failed, passed, total }
-       moduleDone: registerLoggingCallback('moduleDone')
+       moduleDone: registerLoggingCallback( "moduleDone" )
 });
 
 if ( typeof document === "undefined" || document.readyState === "complete" ) {
@@ -744,29 +856,36 @@ if ( typeof document === "undefined" || document.readyState === "complete" ) {
 }
 
 QUnit.load = function() {
-       runLoggingCallbacks( 'begin', QUnit, {} );
+       runLoggingCallbacks( "begin", QUnit, {} );
 
        // Initialize the config, saving the execution queue
-       var oldconfig = extend({}, config);
+       var banner, filter, i, label, len, main, ol, toolbar, userAgent, val,
+               urlConfigHtml = "",
+               oldconfig = extend( {}, config );
+
        QUnit.init();
        extend(config, oldconfig);
 
        config.blocking = false;
 
-       var urlConfigHtml = '', len = config.urlConfig.length;
-       for ( var i = 0, val; i < len; i++ ) {
+       len = config.urlConfig.length;
+
+       for ( i = 0; i < len; i++ ) {
                val = config.urlConfig[i];
                config[val] = QUnit.urlParams[val];
-               urlConfigHtml += '<label><input name="' + val + '" type="checkbox"' + ( config[val] ? ' checked="checked"' : '' ) + '>' + val + '</label>';
+               urlConfigHtml += "<label><input name='" + val + "' type='checkbox'" + ( config[val] ? " checked='checked'" : "" ) + ">" + val + "</label>";
        }
 
-       var userAgent = id("qunit-userAgent");
+       // `userAgent` initialized at top of scope
+       userAgent = id( "qunit-userAgent" );
        if ( userAgent ) {
                userAgent.innerHTML = navigator.userAgent;
        }
-       var banner = id("qunit-header");
+
+       // `banner` initialized at top of scope
+       banner = id( "qunit-header" );
        if ( banner ) {
-               banner.innerHTML = '<a href="' + QUnit.url({ filter: undefined }) + '"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;
+               banner.innerHTML = "<a href='" + QUnit.url({ filter: undefined }) + "'>" + banner.innerHTML + "</a> " + urlConfigHtml;
                addEvent( banner, "change", function( event ) {
                        var params = {};
                        params[ event.target.name ] = event.target.checked ? true : undefined;
@@ -774,61 +893,91 @@ QUnit.load = function() {
                });
        }
 
-       var toolbar = id("qunit-testrunner-toolbar");
+       // `toolbar` initialized at top of scope
+       toolbar = id( "qunit-testrunner-toolbar" );
        if ( toolbar ) {
-               var filter = document.createElement("input");
+               // `filter` initialized at top of scope
+               filter = document.createElement( "input" );
                filter.type = "checkbox";
                filter.id = "qunit-filter-pass";
+
                addEvent( filter, "click", function() {
-                       var ol = document.getElementById("qunit-tests");
+                       var tmp,
+                               ol = document.getElementById( "qunit-tests" );
+
                        if ( filter.checked ) {
                                ol.className = ol.className + " hidepass";
                        } else {
-                               var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
-                               ol.className = tmp.replace(/ hidepass /, " ");
+                               tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " ";
+                               ol.className = tmp.replace( / hidepass /, " " );
                        }
                        if ( defined.sessionStorage ) {
                                if (filter.checked) {
-                                       sessionStorage.setItem("qunit-filter-passed-tests", "true");
+                                       sessionStorage.setItem( "qunit-filter-passed-tests", "true" );
                                } else {
-                                       sessionStorage.removeItem("qunit-filter-passed-tests");
+                                       sessionStorage.removeItem( "qunit-filter-passed-tests" );
                                }
                        }
                });
-               if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) {
+
+               if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {
                        filter.checked = true;
-                       var ol = document.getElementById("qunit-tests");
+                       // `ol` initialized at top of scope
+                       ol = document.getElementById( "qunit-tests" );
                        ol.className = ol.className + " hidepass";
                }
                toolbar.appendChild( filter );
 
-               var label = document.createElement("label");
-               label.setAttribute("for", "qunit-filter-pass");
+               // `label` initialized at top of scope
+               label = document.createElement( "label" );
+               label.setAttribute( "for", "qunit-filter-pass" );
                label.innerHTML = "Hide passed tests";
                toolbar.appendChild( label );
        }
 
-       var main = id('qunit-fixture');
+       // `main` initialized at top of scope
+       main = id( "qunit-fixture" );
        if ( main ) {
                config.fixture = main.innerHTML;
        }
 
-       if (config.autostart) {
+       if ( config.autostart ) {
                QUnit.start();
        }
 };
 
-addEvent(window, "load", QUnit.load);
+addEvent( window, "load", QUnit.load );
 
-// addEvent(window, "error") gives us a useless event object
-window.onerror = function( message, file, line ) {
-       if ( QUnit.config.current ) {
-               QUnit.pushFailure( message, file + ":" + line );
-       } else {
-               QUnit.test( "global failure", function() {
-                       QUnit.pushFailure( message, file + ":" + line );
-               });
+// `onErrorFnPrev` initialized at top of scope
+// Preserve other handlers
+onErrorFnPrev = window.onerror;
+
+// Cover uncaught exceptions
+// Returning true will surpress the default browser handler,
+// returning false will let it run.
+window.onerror = function ( error, filePath, linerNr ) {
+       var ret = false;
+       if ( onErrorFnPrev ) {
+               ret = onErrorFnPrev( error, filePath, linerNr );
        }
+
+       // Treat return value as window.onerror itself does,
+       // Only do our handling if not surpressed.
+       if ( ret !== true ) {
+               if ( QUnit.config.current ) {
+                       if ( QUnit.config.current.ignoreGlobalErrors ) {
+                               return true;
+                       }
+                       QUnit.pushFailure( error, filePath + ":" + linerNr );
+               } else {
+                       QUnit.test( "global failure", function() {
+                               QUnit.pushFailure( error, filePath + ":" + linerNr );
+                       });
+               }
+               return false;
+       }
+
+       return ret;
 };
 
 function done() {
@@ -836,33 +985,34 @@ function done() {
 
        // Log the last module results
        if ( config.currentModule ) {
-               runLoggingCallbacks( 'moduleDone', QUnit, {
+               runLoggingCallbacks( "moduleDone", QUnit, {
                        name: config.currentModule,
                        failed: config.moduleStats.bad,
                        passed: config.moduleStats.all - config.moduleStats.bad,
                        total: config.moduleStats.all
-               } );
+               });
        }
 
-       var banner = id("qunit-banner"),
-               tests = id("qunit-tests"),
+       var i, key,
+               banner = id( "qunit-banner" ),
+               tests = id( "qunit-tests" ),
                runtime = +new Date() - config.started,
                passed = config.stats.all - config.stats.bad,
                html = [
-                       'Tests completed in ',
+                       "Tests completed in ",
                        runtime,
-                       ' milliseconds.<br/>',
-                       '<span class="passed">',
+                       " milliseconds.<br/>",
+                       "<span class='passed'>",
                        passed,
-                       '</span> tests of <span class="total">',
+                       "</span> tests of <span class='total'>",
                        config.stats.all,
-                       '</span> passed, <span class="failed">',
+                       "</span> passed, <span class='failed'>",
                        config.stats.bad,
-                       '</span> failed.'
-               ].join('');
+                       "</span> failed."
+               ].join( "" );
 
        if ( banner ) {
-               banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass");
+               banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );
        }
 
        if ( tests ) {
@@ -873,70 +1023,94 @@ function done() {
                // show ✖ for good, ✔ for bad suite result in title
                // use escape sequences in case file gets loaded with non-utf-8-charset
                document.title = [
-                       (config.stats.bad ? "\u2716" : "\u2714"),
-                       document.title.replace(/^[\u2714\u2716] /i, "")
-               ].join(" ");
+                       ( config.stats.bad ? "\u2716" : "\u2714" ),
+                       document.title.replace( /^[\u2714\u2716] /i, "" )
+               ].join( " " );
        }
 
        // clear own sessionStorage items if all tests passed
        if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {
-               var key;
-               for ( var i = 0; i < sessionStorage.length; i++ ) {
+               // `key` & `i` initialized at top of scope
+               for ( i = 0; i < sessionStorage.length; i++ ) {
                        key = sessionStorage.key( i++ );
-                       if ( key.indexOf("qunit-test-") === 0 ) {
+                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
                                sessionStorage.removeItem( key );
                        }
                }
        }
 
-       runLoggingCallbacks( 'done', QUnit, {
+       runLoggingCallbacks( "done", QUnit, {
                failed: config.stats.bad,
                passed: passed,
                total: config.stats.all,
                runtime: runtime
-       } );
+       });
 }
 
-function validTest( name ) {
-       var filter = config.filter,
-               run = false;
+/** @return Boolean: true if this test should be ran */
+function validTest( test ) {
+       var include,
+               filter = config.filter && config.filter.toLowerCase(),
+               module = config.module,
+               fullName = (test.module + ": " + test.testName).toLowerCase();
+
+       if ( config.testNumber ) {
+               return test.testNumber === config.testNumber;
+       }
+
+       if ( module && test.module !== module ) {
+               return false;
+       }
 
        if ( !filter ) {
                return true;
        }
 
-       var not = filter.charAt( 0 ) === "!";
-       if ( not ) {
+       include = filter.charAt( 0 ) !== "!";
+       if ( !include ) {
                filter = filter.slice( 1 );
        }
 
-       if ( name.indexOf( filter ) !== -1 ) {
-               return !not;
-       }
-
-       if ( not ) {
-               run = true;
+       // If the filter matches, we need to honour include
+       if ( fullName.indexOf( filter ) !== -1 ) {
+               return include;
        }
 
-       return run;
+       // Otherwise, do the opposite
+       return !include;
 }
 
 // so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)
 // Later Safari and IE10 are supposed to support error.stack as well
 // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
 function extractStacktrace( e, offset ) {
-       offset = offset || 3;
-       if (e.stacktrace) {
+       offset = offset === undefined ? 3 : offset;
+
+       var stack, include, i, regex;
+
+       if ( e.stacktrace ) {
                // Opera
-               return e.stacktrace.split("\n")[offset + 3];
-       } else if (e.stack) {
+               return e.stacktrace.split( "\n" )[ offset + 3 ];
+       } else if ( e.stack ) {
                // Firefox, Chrome
-               var stack = e.stack.split("\n");
-               if (/^error$/i.test(stack[0])) {
+               stack = e.stack.split( "\n" );
+               if (/^error$/i.test( stack[0] ) ) {
                        stack.shift();
                }
-               return stack[offset];
-       } else if (e.sourceURL) {
+               if ( fileName ) {
+                       include = [];
+                       for ( i = offset; i < stack.length; i++ ) {
+                               if ( stack[ i ].indexOf( fileName ) != -1 ) {
+                                       break;
+                               }
+                               include.push( stack[ i ] );
+                       }
+                       if ( include.length ) {
+                               return include.join( "\n" );
+                       }
+               }
+               return stack[ offset ];
+       } else if ( e.sourceURL ) {
                // Safari, PhantomJS
                // hopefully one day Safari provides actual stacktraces
                // exclude useless self-reference for generated Error objects
@@ -947,7 +1121,7 @@ function extractStacktrace( e, offset ) {
                return e.sourceURL + ":" + e.line;
        }
 }
-function sourceFromStacktrace(offset) {
+function sourceFromStacktrace( offset ) {
        try {
                throw new Error();
        } catch ( e ) {
@@ -955,13 +1129,13 @@ function sourceFromStacktrace(offset) {
        }
 }
 
-function escapeInnerText(s) {
-       if (!s) {
+function escapeInnerText( s ) {
+       if ( !s ) {
                return "";
        }
        s = s + "";
-       return s.replace(/[\&<>]/g, function(s) {
-               switch(s) {
+       return s.replace( /[\&<>]/g, function( s ) {
+               switch( s ) {
                        case "&": return "&amp;";
                        case "<": return "&lt;";
                        case ">": return "&gt;";
@@ -974,7 +1148,7 @@ function synchronize( callback, last ) {
        config.queue.push( callback );
 
        if ( config.autorun && !config.blocking ) {
-               process(last);
+               process( last );
        }
 }
 
@@ -1004,7 +1178,8 @@ function saveGlobal() {
 
        if ( config.noglobals ) {
                for ( var key in window ) {
-                       if ( !hasOwn.call( window, key ) ) {
+                       // in Opera sometimes DOM element ids show up here, ignore them
+                       if ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {
                                continue;
                        }
                        config.pollution.push( key );
@@ -1013,15 +1188,18 @@ function saveGlobal() {
 }
 
 function checkPollution( name ) {
-       var old = config.pollution;
+       var newGlobals,
+               deletedGlobals,
+               old = config.pollution;
+
        saveGlobal();
 
-       var newGlobals = diff( config.pollution, old );
+       newGlobals = diff( config.pollution, old );
        if ( newGlobals.length > 0 ) {
                QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );
        }
 
-       var deletedGlobals = diff( old, config.pollution );
+       deletedGlobals = diff( old, config.pollution );
        if ( deletedGlobals.length > 0 ) {
                QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );
        }
@@ -1029,11 +1207,13 @@ function checkPollution( name ) {
 
 // returns a new Array with the elements that are in a but not in b
 function diff( a, b ) {
-       var result = a.slice();
-       for ( var i = 0; i < result.length; i++ ) {
-               for ( var j = 0; j < b.length; j++ ) {
+       var i, j,
+               result = a.slice();
+
+       for ( i = 0; i < result.length; i++ ) {
+               for ( j = 0; j < b.length; j++ ) {
                        if ( result[i] === b[j] ) {
-                               result.splice(i, 1);
+                               result.splice( i, 1 );
                                i--;
                                break;
                        }
@@ -1042,21 +1222,21 @@ function diff( a, b ) {
        return result;
 }
 
-function extend(a, b) {
+function extend( a, b ) {
        for ( var prop in b ) {
-               if ( b[prop] === undefined ) {
-                       delete a[prop];
+               if ( b[ prop ] === undefined ) {
+                       delete a[ prop ];
 
                // Avoid "Member not found" error in IE8 caused by setting window.constructor
                } else if ( prop !== "constructor" || a !== window ) {
-                       a[prop] = b[prop];
+                       a[ prop ] = b[ prop ];
                }
        }
 
        return a;
 }
 
-function addEvent(elem, type, fn) {
+function addEvent( elem, type, fn ) {
        if ( elem.addEventListener ) {
                elem.addEventListener( type, fn, false );
        } else if ( elem.attachEvent ) {
@@ -1066,27 +1246,27 @@ function addEvent(elem, type, fn) {
        }
 }
 
-function id(name) {
-       return !!(typeof document !== "undefined" && document && document.getElementById) &&
+function id( name ) {
+       return !!( typeof document !== "undefined" && document && document.getElementById ) &&
                document.getElementById( name );
 }
 
-function registerLoggingCallback(key){
-       return function(callback){
+function registerLoggingCallback( key ) {
+       return function( callback ) {
                config[key].push( callback );
        };
 }
 
 // Supports deprecated method of completely overwriting logging callbacks
-function runLoggingCallbacks(key, scope, args) {
+function runLoggingCallbacks( key, scope, args ) {
        //debugger;
-       var callbacks;
-       if ( QUnit.hasOwnProperty(key) ) {
-               QUnit[key].call(scope, args);
+       var i, callbacks;
+       if ( QUnit.hasOwnProperty( key ) ) {
+               QUnit[ key ].call(scope, args );
        } else {
-               callbacks = config[key];
-               for( var i = 0; i < callbacks.length; i++ ) {
-                       callbacks[i].call( scope, args );
+               callbacks = config[ key ];
+               for ( i = 0; i < callbacks.length; i++ ) {
+                       callbacks[ i ].call( scope, args );
                }
        }
 }
@@ -1095,183 +1275,184 @@ function runLoggingCallbacks(key, scope, args) {
 // Author: Philippe Rathé <prathe@gmail.com>
 QUnit.equiv = (function() {
 
-       var innerEquiv; // the real equiv function
-       var callers = []; // stack to decide between skip/abort functions
-       var parents = []; // stack to avoiding loops from circular referencing
-
        // Call the o related callback with the given arguments.
-       function bindCallbacks(o, callbacks, args) {
-               var prop = QUnit.objectType(o);
-               if (prop) {
-                       if (QUnit.objectType(callbacks[prop]) === "function") {
-                               return callbacks[prop].apply(callbacks, args);
+       function bindCallbacks( o, callbacks, args ) {
+               var prop = QUnit.objectType( o );
+               if ( prop ) {
+                       if ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {
+                               return callbacks[ prop ].apply( callbacks, args );
                        } else {
-                               return callbacks[prop]; // or undefined
+                               return callbacks[ prop ]; // or undefined
                        }
                }
        }
 
-       var getProto = Object.getPrototypeOf || function (obj) {
-               return obj.__proto__;
-       };
-
-       var callbacks = (function () {
-
-               // for string, boolean, number and null
-               function useStrictEquality(b, a) {
-                       if (b instanceof a.constructor || a instanceof b.constructor) {
-                               // to catch short annotaion VS 'new' annotation of a
-                               // declaration
-                               // e.g. var i = 1;
-                               // var j = new Number(1);
-                               return a == b;
-                       } else {
-                               return a === b;
-                       }
-               }
-
-               return {
-                       "string" : useStrictEquality,
-                       "boolean" : useStrictEquality,
-                       "number" : useStrictEquality,
-                       "null" : useStrictEquality,
-                       "undefined" : useStrictEquality,
-
-                       "nan" : function(b) {
-                               return isNaN(b);
-                       },
-
-                       "date" : function(b, a) {
-                               return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf();
-                       },
-
-                       "regexp" : function(b, a) {
-                               return QUnit.objectType(b) === "regexp" &&
-                                       // the regex itself
-                                       a.source === b.source &&
-                                       // and its modifers
-                                       a.global === b.global &&
-                                       // (gmi) ...
-                                       a.ignoreCase === b.ignoreCase &&
-                                       a.multiline === b.multiline;
-                       },
-
-                       // - skip when the property is a method of an instance (OOP)
-                       // - abort otherwise,
-                       // initial === would have catch identical references anyway
-                       "function" : function() {
-                               var caller = callers[callers.length - 1];
-                               return caller !== Object && typeof caller !== "undefined";
-                       },
-
-                       "array" : function(b, a) {
-                               var i, j, loop;
-                               var len;
+       // the real equiv function
+       var innerEquiv,
+               // stack to decide between skip/abort functions
+               callers = [],
+               // stack to avoiding loops from circular referencing
+               parents = [],
 
-                               // b could be an object literal here
-                               if (QUnit.objectType(b) !== "array") {
-                                       return false;
-                               }
-
-                               len = a.length;
-                               if (len !== b.length) { // safe and faster
-                                       return false;
+               getProto = Object.getPrototypeOf || function ( obj ) {
+                       return obj.__proto__;
+               },
+               callbacks = (function () {
+
+                       // for string, boolean, number and null
+                       function useStrictEquality( b, a ) {
+                               if ( b instanceof a.constructor || a instanceof b.constructor ) {
+                                       // to catch short annotaion VS 'new' annotation of a
+                                       // declaration
+                                       // e.g. var i = 1;
+                                       // var j = new Number(1);
+                                       return a == b;
+                               } else {
+                                       return a === b;
                                }
+                       }
 
-                               // track reference to avoid circular references
-                               parents.push(a);
-                               for (i = 0; i < len; i++) {
-                                       loop = false;
-                                       for (j = 0; j < parents.length; j++) {
-                                               if (parents[j] === a[i]) {
-                                                       loop = true;// dont rewalk array
-                                               }
-                                       }
-                                       if (!loop && !innerEquiv(a[i], b[i])) {
-                                               parents.pop();
+                       return {
+                               "string": useStrictEquality,
+                               "boolean": useStrictEquality,
+                               "number": useStrictEquality,
+                               "null": useStrictEquality,
+                               "undefined": useStrictEquality,
+
+                               "nan": function( b ) {
+                                       return isNaN( b );
+                               },
+
+                               "date": function( b, a ) {
+                                       return QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();
+                               },
+
+                               "regexp": function( b, a ) {
+                                       return QUnit.objectType( b ) === "regexp" &&
+                                               // the regex itself
+                                               a.source === b.source &&
+                                               // and its modifers
+                                               a.global === b.global &&
+                                               // (gmi) ...
+                                               a.ignoreCase === b.ignoreCase &&
+                                               a.multiline === b.multiline;
+                               },
+
+                               // - skip when the property is a method of an instance (OOP)
+                               // - abort otherwise,
+                               // initial === would have catch identical references anyway
+                               "function": function() {
+                                       var caller = callers[callers.length - 1];
+                                       return caller !== Object && typeof caller !== "undefined";
+                               },
+
+                               "array": function( b, a ) {
+                                       var i, j, len, loop;
+
+                                       // b could be an object literal here
+                                       if ( QUnit.objectType( b ) !== "array" ) {
                                                return false;
                                        }
-                               }
-                               parents.pop();
-                               return true;
-                       },
 
-                       "object" : function(b, a) {
-                               var i, j, loop;
-                               var eq = true; // unless we can proove it
-                               var aProperties = [], bProperties = []; // collection of
-                                                                                                               // strings
-
-                               // comparing constructors is more strict than using
-                               // instanceof
-                               if (a.constructor !== b.constructor) {
-                                       // Allow objects with no prototype to be equivalent to
-                                       // objects with Object as their constructor.
-                                       if (!((getProto(a) === null && getProto(b) === Object.prototype) ||
-                                               (getProto(b) === null && getProto(a) === Object.prototype)))
-                                       {
+                                       len = a.length;
+                                       if ( len !== b.length ) {
+                                               // safe and faster
                                                return false;
                                        }
-                               }
 
-                               // stack constructor before traversing properties
-                               callers.push(a.constructor);
-                               // track reference to avoid circular references
-                               parents.push(a);
-
-                               for (i in a) { // be strict: don't ensures hasOwnProperty
-                                                               // and go deep
-                                       loop = false;
-                                       for (j = 0; j < parents.length; j++) {
-                                               if (parents[j] === a[i]) {
-                                                       // don't go down the same path twice
-                                                       loop = true;
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+                                       for ( i = 0; i < len; i++ ) {
+                                               loop = false;
+                                               for ( j = 0; j < parents.length; j++ ) {
+                                                       if ( parents[j] === a[i] ) {
+                                                               loop = true;// dont rewalk array
+                                                       }
+                                               }
+                                               if ( !loop && !innerEquiv(a[i], b[i]) ) {
+                                                       parents.pop();
+                                                       return false;
+                                               }
+                                       }
+                                       parents.pop();
+                                       return true;
+                               },
+
+                               "object": function( b, a ) {
+                                       var i, j, loop,
+                                               // Default to true
+                                               eq = true,
+                                               aProperties = [],
+                                               bProperties = [];
+
+                                       // comparing constructors is more strict than using
+                                       // instanceof
+                                       if ( a.constructor !== b.constructor ) {
+                                               // Allow objects with no prototype to be equivalent to
+                                               // objects with Object as their constructor.
+                                               if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||
+                                                       ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {
+                                                               return false;
                                                }
                                        }
-                                       aProperties.push(i); // collect a's properties
 
-                                       if (!loop && !innerEquiv(a[i], b[i])) {
-                                               eq = false;
-                                               break;
+                                       // stack constructor before traversing properties
+                                       callers.push( a.constructor );
+                                       // track reference to avoid circular references
+                                       parents.push( a );
+
+                                       for ( i in a ) { // be strict: don't ensures hasOwnProperty
+                                                                       // and go deep
+                                               loop = false;
+                                               for ( j = 0; j < parents.length; j++ ) {
+                                                       if ( parents[j] === a[i] ) {
+                                                               // don't go down the same path twice
+                                                               loop = true;
+                                                       }
+                                               }
+                                               aProperties.push(i); // collect a's properties
+
+                                               if (!loop && !innerEquiv( a[i], b[i] ) ) {
+                                                       eq = false;
+                                                       break;
+                                               }
                                        }
-                               }
 
-                               callers.pop(); // unstack, we are done
-                               parents.pop();
+                                       callers.pop(); // unstack, we are done
+                                       parents.pop();
 
-                               for (i in b) {
-                                       bProperties.push(i); // collect b's properties
-                               }
+                                       for ( i in b ) {
+                                               bProperties.push( i ); // collect b's properties
+                                       }
 
-                               // Ensures identical properties name
-                               return eq && innerEquiv(aProperties.sort(), bProperties.sort());
-                       }
-               };
-       }());
+                                       // Ensures identical properties name
+                                       return eq && innerEquiv( aProperties.sort(), bProperties.sort() );
+                               }
+                       };
+               }());
 
        innerEquiv = function() { // can take multiple arguments
-               var args = Array.prototype.slice.apply(arguments);
-               if (args.length < 2) {
+               var args = [].slice.apply( arguments );
+               if ( args.length < 2 ) {
                        return true; // end transition
                }
 
-               return (function(a, b) {
-                       if (a === b) {
+               return (function( a, b ) {
+                       if ( a === b ) {
                                return true; // catch the most you can
-                       } else if (a === null || b === null || typeof a === "undefined" ||
+                       } else if ( a === null || b === null || typeof a === "undefined" ||
                                        typeof b === "undefined" ||
-                                       QUnit.objectType(a) !== QUnit.objectType(b)) {
+                                       QUnit.objectType(a) !== QUnit.objectType(b) ) {
                                return false; // don't lose time with error prone cases
                        } else {
                                return bindCallbacks(a, callbacks, [ b, a ]);
                        }
 
                        // apply transition with (1..n) arguments
-               }(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length - 1)));
+               }( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );
        };
 
        return innerEquiv;
-
 }());
 
 /**
@@ -1286,17 +1467,17 @@ QUnit.equiv = (function() {
  */
 QUnit.jsDump = (function() {
        function quote( str ) {
-               return '"' + str.toString().replace(/"/g, '\\"') + '"';
+               return '"' + str.toString().replace( /"/g, '\\"' ) + '"';
        }
        function literal( o ) {
-               return o + '';
+               return o + "";
        }
        function join( pre, arr, post ) {
                var s = jsDump.separator(),
                        base = jsDump.indent(),
                        inner = jsDump.indent(1);
                if ( arr.join ) {
-                       arr = arr.join( ',' + s + inner );
+                       arr = arr.join( "," + s + inner );
                }
                if ( !arr ) {
                        return pre + post;
@@ -1310,182 +1491,191 @@ QUnit.jsDump = (function() {
                        ret[i] = this.parse( arr[i] , undefined , stack);
                }
                this.down();
-               return join( '[', ret, ']' );
+               return join( "[", ret, "]" );
        }
 
-       var reName = /^function (\w+)/;
+       var reName = /^function (\w+)/,
+               jsDump = {
+                       parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
+                               stack = stack || [ ];
+                               var inStack, res,
+                                       parser = this.parsers[ type || this.typeOf(obj) ];
 
-       var jsDump = {
-               parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance
-                       stack = stack || [ ];
-                       var parser = this.parsers[ type || this.typeOf(obj) ];
-                       type = typeof parser;
-                       var inStack = inArray(obj, stack);
-                       if (inStack != -1) {
-                               return 'recursion('+(inStack - stack.length)+')';
-                       }
-                       //else
-                       if (type == 'function')  {
-                                       stack.push(obj);
-                                       var res = parser.call( this, obj, stack );
+                               type = typeof parser;
+                               inStack = inArray( obj, stack );
+
+                               if ( inStack != -1 ) {
+                                       return "recursion(" + (inStack - stack.length) + ")";
+                               }
+                               //else
+                               if ( type == "function" )  {
+                                       stack.push( obj );
+                                       res = parser.call( this, obj, stack );
                                        stack.pop();
                                        return res;
-                       }
-                       // else
-                       return (type == 'string') ? parser : this.parsers.error;
-               },
-               typeOf: function( obj ) {
-                       var type;
-                       if ( obj === null ) {
-                               type = "null";
-                       } else if (typeof obj === "undefined") {
-                               type = "undefined";
-                       } else if (QUnit.is("RegExp", obj)) {
-                               type = "regexp";
-                       } else if (QUnit.is("Date", obj)) {
-                               type = "date";
-                       } else if (QUnit.is("Function", obj)) {
-                               type = "function";
-                       } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") {
-                               type = "window";
-                       } else if (obj.nodeType === 9) {
-                               type = "document";
-                       } else if (obj.nodeType) {
-                               type = "node";
-                       } else if (
-                               // native arrays
-                               toString.call( obj ) === "[object Array]" ||
-                               // NodeList objects
-                               ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
-                       ) {
-                               type = "array";
-                       } else {
-                               type = typeof obj;
-                       }
-                       return type;
-               },
-               separator: function() {
-                       return this.multiline ? this.HTML ? '<br />' : '\n' : this.HTML ? '&nbsp;' : ' ';
-               },
-               indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
-                       if ( !this.multiline ) {
-                               return '';
-                       }
-                       var chr = this.indentChar;
-                       if ( this.HTML ) {
-                               chr = chr.replace(/\t/g,'   ').replace(/ /g,'&nbsp;');
-                       }
-                       return new Array( this._depth_ + (extra||0) ).join(chr);
-               },
-               up: function( a ) {
-                       this._depth_ += a || 1;
-               },
-               down: function( a ) {
-                       this._depth_ -= a || 1;
-               },
-               setParser: function( name, parser ) {
-                       this.parsers[name] = parser;
-               },
-               // The next 3 are exposed so you can use them
-               quote: quote,
-               literal: literal,
-               join: join,
-               //
-               _depth_: 1,
-               // This is the list of parsers, to modify them, use jsDump.setParser
-               parsers: {
-                       window: '[Window]',
-                       document: '[Document]',
-                       error: '[ERROR]', //when no parser is found, shouldn't happen
-                       unknown: '[Unknown]',
-                       'null': 'null',
-                       'undefined': 'undefined',
-                       'function': function( fn ) {
-                               var ret = 'function',
-                                       name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE
-                               if ( name ) {
-                                       ret += ' ' + name;
                                }
-                               ret += '(';
-
-                               ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');
-                               return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );
+                               // else
+                               return ( type == "string" ) ? parser : this.parsers.error;
                        },
-                       array: array,
-                       nodelist: array,
-                       'arguments': array,
-                       object: function( map, stack ) {
-                               var ret = [ ], keys, key, val, i;
-                               QUnit.jsDump.up();
-                               if (Object.keys) {
-                                       keys = Object.keys( map );
+                       typeOf: function( obj ) {
+                               var type;
+                               if ( obj === null ) {
+                                       type = "null";
+                               } else if ( typeof obj === "undefined" ) {
+                                       type = "undefined";
+                               } else if ( QUnit.is( "regexp", obj) ) {
+                                       type = "regexp";
+                               } else if ( QUnit.is( "date", obj) ) {
+                                       type = "date";
+                               } else if ( QUnit.is( "function", obj) ) {
+                                       type = "function";
+                               } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {
+                                       type = "window";
+                               } else if ( obj.nodeType === 9 ) {
+                                       type = "document";
+                               } else if ( obj.nodeType ) {
+                                       type = "node";
+                               } else if (
+                                       // native arrays
+                                       toString.call( obj ) === "[object Array]" ||
+                                       // NodeList objects
+                                       ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )
+                               ) {
+                                       type = "array";
                                } else {
-                                       keys = [];
-                                       for (key in map) { keys.push( key ); }
+                                       type = typeof obj;
                                }
-                               keys.sort();
-                               for (i = 0; i < keys.length; i++) {
-                                       key = keys[ i ];
-                                       val = map[ key ];
-                                       ret.push( QUnit.jsDump.parse( key, 'key' ) + ': ' + QUnit.jsDump.parse( val, undefined, stack ) );
+                               return type;
+                       },
+                       separator: function() {
+                               return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&nbsp;" : " ";
+                       },
+                       indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing
+                               if ( !this.multiline ) {
+                                       return "";
+                               }
+                               var chr = this.indentChar;
+                               if ( this.HTML ) {
+                                       chr = chr.replace( /\t/g, "   " ).replace( / /g, "&nbsp;" );
                                }
-                               QUnit.jsDump.down();
-                               return join( '{', ret, '}' );
+                               return new Array( this._depth_ + (extra||0) ).join(chr);
                        },
-                       node: function( node ) {
-                               var open = QUnit.jsDump.HTML ? '&lt;' : '<',
-                                       close = QUnit.jsDump.HTML ? '&gt;' : '>';
-
-                               var tag = node.nodeName.toLowerCase(),
-                                       ret = open + tag;
+                       up: function( a ) {
+                               this._depth_ += a || 1;
+                       },
+                       down: function( a ) {
+                               this._depth_ -= a || 1;
+                       },
+                       setParser: function( name, parser ) {
+                               this.parsers[name] = parser;
+                       },
+                       // The next 3 are exposed so you can use them
+                       quote: quote,
+                       literal: literal,
+                       join: join,
+                       //
+                       _depth_: 1,
+                       // This is the list of parsers, to modify them, use jsDump.setParser
+                       parsers: {
+                               window: "[Window]",
+                               document: "[Document]",
+                               error: "[ERROR]", //when no parser is found, shouldn"t happen
+                               unknown: "[Unknown]",
+                               "null": "null",
+                               "undefined": "undefined",
+                               "function": function( fn ) {
+                                       var ret = "function",
+                                               name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE
+
+                                       if ( name ) {
+                                               ret += " " + name;
+                                       }
+                                       ret += "( ";
+
+                                       ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );
+                                       return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );
+                               },
+                               array: array,
+                               nodelist: array,
+                               "arguments": array,
+                               object: function( map, stack ) {
+                                       var ret = [ ], keys, key, val, i;
+                                       QUnit.jsDump.up();
+                                       if ( Object.keys ) {
+                                               keys = Object.keys( map );
+                                       } else {
+                                               keys = [];
+                                               for ( key in map ) {
+                                                       keys.push( key );
+                                               }
+                                       }
+                                       keys.sort();
+                                       for ( i = 0; i < keys.length; i++ ) {
+                                               key = keys[ i ];
+                                               val = map[ key ];
+                                               ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );
+                                       }
+                                       QUnit.jsDump.down();
+                                       return join( "{", ret, "}" );
+                               },
+                               node: function( node ) {
+                                       var a, val,
+                                               open = QUnit.jsDump.HTML ? "&lt;" : "<",
+                                               close = QUnit.jsDump.HTML ? "&gt;" : ">",
+                                               tag = node.nodeName.toLowerCase(),
+                                               ret = open + tag;
+
+                                       for ( a in QUnit.jsDump.DOMAttrs ) {
+                                               val = node[ QUnit.jsDump.DOMAttrs[a] ];
+                                               if ( val ) {
+                                                       ret += " " + a + "=" + QUnit.jsDump.parse( val, "attribute" );
+                                               }
+                                       }
+                                       return ret + close + open + "/" + tag + close;
+                               },
+                               functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
+                                       var args,
+                                               l = fn.length;
+
+                                       if ( !l ) {
+                                               return "";
+                                       }
 
-                               for ( var a in QUnit.jsDump.DOMAttrs ) {
-                                       var val = node[QUnit.jsDump.DOMAttrs[a]];
-                                       if ( val ) {
-                                               ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );
+                                       args = new Array(l);
+                                       while ( l-- ) {
+                                               args[l] = String.fromCharCode(97+l);//97 is 'a'
                                        }
-                               }
-                               return ret + close + open + '/' + tag + close;
+                                       return " " + args.join( ", " ) + " ";
+                               },
+                               key: quote, //object calls it internally, the key part of an item in a map
+                               functionCode: "[code]", //function calls it internally, it's the content of the function
+                               attribute: quote, //node calls it internally, it's an html attribute value
+                               string: quote,
+                               date: quote,
+                               regexp: literal, //regex
+                               number: literal,
+                               "boolean": literal
                        },
-                       functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function
-                               var l = fn.length;
-                               if ( !l ) {
-                                       return '';
-                               }
-
-                               var args = new Array(l);
-                               while ( l-- ) {
-                                       args[l] = String.fromCharCode(97+l);//97 is 'a'
-                               }
-                               return ' ' + args.join(', ') + ' ';
+                       DOMAttrs: {
+                               //attributes to dump from nodes, name=>realName
+                               id: "id",
+                               name: "name",
+                               "class": "className"
                        },
-                       key: quote, //object calls it internally, the key part of an item in a map
-                       functionCode: '[code]', //function calls it internally, it's the content of the function
-                       attribute: quote, //node calls it internally, it's an html attribute value
-                       string: quote,
-                       date: quote,
-                       regexp: literal, //regex
-                       number: literal,
-                       'boolean': literal
-               },
-               DOMAttrs:{//attributes to dump from nodes, name=>realName
-                       id:'id',
-                       name:'name',
-                       'class':'className'
-               },
-               HTML:false,//if true, entities are escaped ( <, >, \t, space and \n )
-               indentChar:'  ',//indentation unit
-               multiline:true //if true, items in a collection, are separated by a \n, else just a space.
-       };
+                       HTML: false,//if true, entities are escaped ( <, >, \t, space and \n )
+                       indentChar: "  ",//indentation unit
+                       multiline: true //if true, items in a collection, are separated by a \n, else just a space.
+               };
 
        return jsDump;
 }());
 
 // from Sizzle.js
 function getText( elems ) {
-       var ret = "", elem;
+       var i, elem,
+               ret = "";
 
-       for ( var i = 0; elems[i]; i++ ) {
+       for ( i = 0; elems[i]; i++ ) {
                elem = elems[i];
 
                // Get the text from text nodes and CDATA nodes
@@ -1501,7 +1691,7 @@ function getText( elems ) {
        return ret;
 }
 
-//from jquery.js
+// from jquery.js
 function inArray( elem, array ) {
        if ( array.indexOf ) {
                return array.indexOf( elem );
@@ -1528,73 +1718,75 @@ function inArray( elem, array ) {
  *
  * Usage: QUnit.diff(expected, actual)
  *
- * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
+ * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"
  */
 QUnit.diff = (function() {
-       function diff(o, n) {
-               var ns = {};
-               var os = {};
-               var i;
-
-               for (i = 0; i < n.length; i++) {
-                       if (ns[n[i]] == null) {
-                               ns[n[i]] = {
+       function diff( o, n ) {
+               var i,
+                       ns = {},
+                       os = {};
+
+               for ( i = 0; i < n.length; i++ ) {
+                       if ( ns[ n[i] ] == null ) {
+                               ns[ n[i] ] = {
                                        rows: [],
                                        o: null
                                };
                        }
-                       ns[n[i]].rows.push(i);
+                       ns[ n[i] ].rows.push( i );
                }
 
-               for (i = 0; i < o.length; i++) {
-                       if (os[o[i]] == null) {
-                               os[o[i]] = {
+               for ( i = 0; i < o.length; i++ ) {
+                       if ( os[ o[i] ] == null ) {
+                               os[ o[i] ] = {
                                        rows: [],
                                        n: null
                                };
                        }
-                       os[o[i]].rows.push(i);
+                       os[ o[i] ].rows.push( i );
                }
 
-               for (i in ns) {
+               for ( i in ns ) {
                        if ( !hasOwn.call( ns, i ) ) {
                                continue;
                        }
-                       if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
-                               n[ns[i].rows[0]] = {
-                                       text: n[ns[i].rows[0]],
+                       if ( ns[i].rows.length == 1 && typeof os[i] != "undefined" && os[i].rows.length == 1 ) {
+                               n[ ns[i].rows[0] ] = {
+                                       text: n[ ns[i].rows[0] ],
                                        row: os[i].rows[0]
                                };
-                               o[os[i].rows[0]] = {
-                                       text: o[os[i].rows[0]],
+                               o[ os[i].rows[0] ] = {
+                                       text: o[ os[i].rows[0] ],
                                        row: ns[i].rows[0]
                                };
                        }
                }
 
-               for (i = 0; i < n.length - 1; i++) {
-                       if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&
-                       n[i + 1] == o[n[i].row + 1]) {
-                               n[i + 1] = {
-                                       text: n[i + 1],
+               for ( i = 0; i < n.length - 1; i++ ) {
+                       if ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&
+                                               n[ i + 1 ] == o[ n[i].row + 1 ] ) {
+
+                               n[ i + 1 ] = {
+                                       text: n[ i + 1 ],
                                        row: n[i].row + 1
                                };
-                               o[n[i].row + 1] = {
-                                       text: o[n[i].row + 1],
+                               o[ n[i].row + 1 ] = {
+                                       text: o[ n[i].row + 1 ],
                                        row: i + 1
                                };
                        }
                }
 
-               for (i = n.length - 1; i > 0; i--) {
-                       if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
-                       n[i - 1] == o[n[i].row - 1]) {
-                               n[i - 1] = {
-                                       text: n[i - 1],
+               for ( i = n.length - 1; i > 0; i-- ) {
+                       if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&
+                                               n[ i - 1 ] == o[ n[i].row - 1 ]) {
+
+                               n[ i - 1 ] = {
+                                       text: n[ i - 1 ],
                                        row: n[i].row - 1
                                };
-                               o[n[i].row - 1] = {
-                                       text: o[n[i].row - 1],
+                               o[ n[i].row - 1 ] = {
+                                       text: o[ n[i].row - 1 ],
                                        row: i - 1
                                };
                        }
@@ -1606,50 +1798,52 @@ QUnit.diff = (function() {
                };
        }
 
-       return function(o, n) {
-               o = o.replace(/\s+$/, '');
-               n = n.replace(/\s+$/, '');
-               var out = diff(o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/));
+       return function( o, n ) {
+               o = o.replace( /\s+$/, "" );
+               n = n.replace( /\s+$/, "" );
 
-               var str = "";
-               var i;
+               var i, pre,
+                       str = "",
+                       out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ),
+                       oSpace = o.match(/\s+/g),
+                       nSpace = n.match(/\s+/g);
 
-               var oSpace = o.match(/\s+/g);
-               if (oSpace == null) {
-                       oSpace = [" "];
+               if ( oSpace == null ) {
+                       oSpace = [ " " ];
                }
                else {
-                       oSpace.push(" ");
+                       oSpace.push( " " );
                }
-               var nSpace = n.match(/\s+/g);
-               if (nSpace == null) {
-                       nSpace = [" "];
+
+               if ( nSpace == null ) {
+                       nSpace = [ " " ];
                }
                else {
-                       nSpace.push(" ");
+                       nSpace.push( " " );
                }
 
-               if (out.n.length === 0) {
-                       for (i = 0; i < out.o.length; i++) {
-                               str += '<del>' + out.o[i] + oSpace[i] + "</del>";
+               if ( out.n.length === 0 ) {
+                       for ( i = 0; i < out.o.length; i++ ) {
+                               str += "<del>" + out.o[i] + oSpace[i] + "</del>";
                        }
                }
                else {
-                       if (out.n[0].text == null) {
-                               for (n = 0; n < out.o.length && out.o[n].text == null; n++) {
-                                       str += '<del>' + out.o[n] + oSpace[n] + "</del>";
+                       if ( out.n[0].text == null ) {
+                               for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {
+                                       str += "<del>" + out.o[n] + oSpace[n] + "</del>";
                                }
                        }
 
-                       for (i = 0; i < out.n.length; i++) {
+                       for ( i = 0; i < out.n.length; i++ ) {
                                if (out.n[i].text == null) {
-                                       str += '<ins>' + out.n[i] + nSpace[i] + "</ins>";
+                                       str += "<ins>" + out.n[i] + nSpace[i] + "</ins>";
                                }
                                else {
-                                       var pre = "";
+                                       // `pre` initialized at top of scope
+                                       pre = "";
 
-                                       for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {
-                                               pre += '<del>' + out.o[n] + oSpace[n] + "</del>";
+                                       for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {
+                                               pre += "<del>" + out.o[n] + oSpace[n] + "</del>";
                                        }
                                        str += " " + out.n[i].text + nSpace[i] + pre;
                                }
@@ -1661,7 +1855,7 @@ QUnit.diff = (function() {
 }());
 
 // for CommonJS enviroments, export everything
-if ( typeof exports !== "undefined" || typeof require !== "undefined" ) {
+if ( typeof exports !== "undefined" ) {
        extend(exports, QUnit);
 }
 
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
diff --git a/resources/mediawiki.action/mediawiki.action.watch.ajax.js b/resources/mediawiki.action/mediawiki.action.watch.ajax.js
deleted file mode 100644 (file)
index 090e4c3..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * Animate watch/unwatch links to use asynchronous API requests to
- * watch pages, rather than navigating to a different URI.
- */
-( function ( $, mw, undefined ) {
-
-       /**
-        * The name of the page to watch or unwatch.
-        */
-       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
-
-       /**
-        * Update the link text, link href attribute and (if applicable)
-        * "loading" class.
-        *
-        * @param $link {jQuery} Anchor tag of (un)watch link.
-        * @param action {String} One of 'watch', 'unwatch'.
-        * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
-        */
-       function updateWatchLink( $link, action, state ) {
-               var accesskeyTip, msgKey, $li;
-
-               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
-               msgKey = state === 'loading' ? action + 'ing' : action;
-               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
-               $li = $link.closest( 'li' );
-
-               $link
-                       .text( mw.msg( msgKey ) )
-                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
-                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
-                       )
-                       .attr( 'href', mw.util.wikiScript() + '?' + $.param({
-                                       title: title,
-                                       action: action
-                               })
-                       );
-
-               // Special case for vector icon
-               if ( $li.hasClass( 'icon' ) ) {
-                       if ( state === 'loading' ) {
-                               $link.addClass( 'loading' );
-                       } else {
-                               $link.removeClass( 'loading' );
-                       }
-               }
-       }
-
-       /**
-        * @todo This should be moved somewhere more accessible.
-        * @param url {String}
-        * @return {String} The extracted action, defaults to 'view'.
-        */
-       function mwUriGetAction( url ) {
-               var action, actionPaths, key, i, m, parts;
-
-               actionPaths = mw.config.get( 'wgActionPaths' );
-
-               // @todo: Does MediaWiki give action path or query param
-               // precedence ? If the former, move this to the bottom
-               action = mw.util.getParamValue( 'action', url );
-               if ( action !== null ) {
-                       return action;
-               }
-
-               for ( key in actionPaths ) {
-                       if ( actionPaths.hasOwnProperty( key ) ) {
-                               parts = actionPaths[key].split( '$1' );
-                               for ( i = 0; i < parts.length; i += 1 ) {
-                                       parts[i] = $.escapeRE( parts[i] );
-                               }
-                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
-                               if ( m && m[1] ) {
-                                       return key;
-                               }
-
-                       }
-               }
-
-               return 'view';
-       }
-
-       $( document ).ready( function () {
-               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
-                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
-                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
-
-               // Allowing people to add inline animated links is a little scary
-               $links = $links.filter( ':not( #bodyContent *, #content * )' );
-
-               $links.click( function ( e ) {
-                       var action, api, $link;
-
-                       action = mwUriGetAction( this.href );
-
-                       if ( action !== 'watch' && action !== 'unwatch' ) {
-                               // Could not extract target action from link url,
-                               // let native browsing handle it further
-                               return true;
-                       }
-                       e.preventDefault();
-                       e.stopPropagation();
-
-                       $link = $( this );
-
-                       updateWatchLink( $link, action, 'loading' );
-
-                       api = new mw.Api();
-                       api[action](
-                               title,
-                               // Success
-                               function ( watchResponse ) {
-                                       var $li, otherAction;
-
-                                       otherAction = action === 'watch' ? 'unwatch' : 'watch';
-                                       $li = $link.closest( 'li' );
-
-                                       mw.util.jsMessage( watchResponse.message, 'ajaxwatch' );
-
-                                       // Set link to opposite
-                                       updateWatchLink( $link, otherAction );
-
-                                       // Most common ID style
-                                       if ( $li.prop( 'id' ) === 'ca-' + otherAction || $li.prop( 'id' ) === 'ca-' + action ) {
-                                               $li.prop( 'id', 'ca-' + otherAction );
-                                       }
-
-                                       // Bug 12395 - update the watch checkbox on edit pages when the
-                                       // page is watched or unwatched via the tab.
-                                       if ( watchResponse.watched !== undefined ) {
-                                               $( '#wpWatchthis' ).prop( 'checked', true );
-                                       } else {
-                                               $( '#wpWatchthis' ).removeProp( 'checked' );
-                                       }
-                               },
-                               // Error
-                               function () {
-                                       var cleanTitle, html, link;
-
-                                       // Reset link to non-loading mode
-                                       updateWatchLink( $link, action );
-
-                                       // Format error message
-                                       cleanTitle = title.replace( /_/g, ' ' );
-                                       link = mw.html.element(
-                                               'a', {
-                                                       href: mw.util.wikiGetlink( title ),
-                                                       title: cleanTitle
-                                               }, cleanTitle
-                                       );
-                                       html = mw.msg( 'watcherrortext', link );
-
-                                       // Report to user about the error
-                                       mw.util.jsMessage( html, 'ajaxwatch' );
-
-                               }
-                       );
-               });
-       });
-
-}( jQuery, mediaWiki ) );
index 225093b..74306d5 100644 (file)
                 * @return {jqXHR}
                 */
                ajax: function( parameters, ajaxOptions ) {
+                       var token;
                        parameters = $.extend( {}, this.defaults.parameters, parameters );
                        ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
 
+                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
+                       if ( parameters.token ) {
+                               token = parameters.token;
+                               delete parameters.token;
+                       }
                        // Some deployed MediaWiki >= 1.17 forbid periods in URLs, due to an IE XSS bug
                        // So let's escape them here. See bug #28235
                        // This works because jQuery accepts data as a query string or as an Object
                        ajaxOptions.data = $.param( parameters ).replace( /\./g, '%2E' );
-
+                       // If we extracted a token parameter, add it back in.
+                       if ( token ) {
+                               ajaxOptions.data += '&token=' + encodeURIComponent( token );
+                       }
                        ajaxOptions.error = function( xhr, textStatus, exception ) {
                                ajaxOptions.err( 'http', {
                                        xhr: xhr,
index 7d9e114..d21df7e 100644 (file)
@@ -22,17 +22,3 @@ mediaWiki.language.convertPlural = function( count, forms ) {
        return forms[5];
 };
 
-mediaWiki.language.digitTransformTable = {
-    '0': '٠', // &#x0660;
-    '1': '١', // &#x0661;
-    '2': '٢', // &#x0662;
-    '3': '٣', // &#x0663;
-    '4': '٤', // &#x0664;
-    '5': '٥', // &#x0665;
-    '6': '٦', // &#x0666;
-    '7': '٧', // &#x0667;
-    '8': '٨', // &#x0668;
-    '9': '٩', // &#x0669;
-    '.': '٫', // &#x066b; wrong table ?
-    ',': '٬' // &#x066c;
-};
index 9f22426..9affcf0 100644 (file)
@@ -18,3 +18,19 @@ mediaWiki.language.convertPlural = function( count, forms ) {
                        return forms[2];
        }
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'bs', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 's ' + word;
+                       break;
+               case 'lokativ': // locative
+                       word = 'o ' + word;
+                       break;
+       }
+       return word;
+};
index c3eaa1f..e3c5808 100644 (file)
@@ -16,3 +16,19 @@ mediaWiki.language.convertPlural = function( count, forms ) {
                        return forms[3];
        }
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'dsb', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 'z ' + word;
+                       break;
+               case 'lokatiw': // lokatiw
+                       word = 'wo ' + word;
+                       break;
+       }
+       return word;
+};
diff --git a/resources/mediawiki.language/languages/fi.js b/resources/mediawiki.language/languages/fi.js
new file mode 100644 (file)
index 0000000..374698d
--- /dev/null
@@ -0,0 +1,44 @@
+/**
+ *  Finnish (Suomi) language functions
+ *  @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'fi', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+
+       // vowel harmony flag
+       var aou = word.match( /[aou][^äöy]*$/i );
+       var origWord = word;
+       if ( word.match( /wiki$/i ) ) {
+               aou = false;
+       }
+       //append i after final consonant
+       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) )
+               word += 'i';
+
+       switch ( form ) {
+               case 'genitive':
+                       word += 'n';
+                       break;
+               case 'elative':
+                       word += ( aou ? 'sta' : 'stä' );
+                       break;
+               case 'partitive':
+                       word += ( aou ? 'a' : 'ä' );
+                       break;
+               case 'illative':
+                       // Double the last letter and add 'n'
+                       word += word.substr(  word.length-1 ) + 'n';
+                       break;
+               case 'inessive':
+                       word += ( aou ? 'ssa' : 'ssä' );
+                       break;
+               default:
+                       word = origWord;
+                       break;
+       }
+       return word;
+};
index 3928013..51fce35 100644 (file)
@@ -12,3 +12,38 @@ mediaWiki.language.convertPlural = function( count, forms ) {
        }
        return forms[2];
 };
+
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'ga', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'ainmlae':
+                       switch ( word ) {
+                               case 'an Domhnach':
+                                       word = 'Dé Domhnaigh';
+                                       break;
+                               case 'an Luan':
+                                       word = 'Dé Luain';
+                                       break;
+                               case 'an Mháirt':
+                                       word = 'Dé Mháirt';
+                                       break;
+                               case 'an Chéadaoin':
+                                       word = 'Dé Chéadaoin';
+                                       break;
+                               case 'an Déardaoin':
+                                       word = 'Déardaoin';
+                                       break;
+                               case 'an Aoine':
+                                       word = 'Dé hAoine';
+                                       break;
+                               case 'an Satharn':
+                                       word = 'Dé Sathairn';
+                                       break;
+                       }
+       }
+       return word;
+};
index b74440e..e737a7c 100644 (file)
@@ -12,3 +12,29 @@ mediaWiki.language.convertPlural = function( count, forms ) {
        }
        return forms[1];
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'he', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'prefixed':
+               case 'תחילית': // the same word in Hebrew
+                       // Duplicate prefixed "Waw", but only if it's not already double
+                       if ( word.substr( 0, 1 ) === "ו" && word.substr( 0, 2 ) !== "וו" ) {
+                               word = "ו" + word;
+                       }
+
+                       // Remove the "He" if prefixed
+                       if ( word.substr( 0, 1 ) === "ה" ) {
+                               word = word.substr( 1, word.length );
+                       }
+
+                       // Add a hyphen (maqaf) before numbers and non-Hebrew letters
+                       if (  word.substr( 0, 1 ) < "א" ||  word.substr( 0, 1 ) > "ת" ) {
+                               word = "־" + word;
+                       }
+       }
+       return word;
+};
index 8651fe4..6aa993c 100644 (file)
@@ -16,3 +16,20 @@ mediaWiki.language.convertPlural = function( count, forms ) {
                        return forms[3];
        }
 };
+
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms =mw.language.getData( 'hsb', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'instrumental': // instrumental
+                       word = 'z ' + word;
+                       break;
+               case 'lokatiw': // lokatiw
+                       word = 'wo ' + word;
+                       break;
+               }
+       return word;
+};
diff --git a/resources/mediawiki.language/languages/hu.js b/resources/mediawiki.language/languages/hu.js
new file mode 100644 (file)
index 0000000..eb3f1f3
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ *  Hungarian language functions
+ *  @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'hu', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'rol':
+                       word += 'ról';
+                       break;
+               case 'ba':
+                       word += 'ba';
+                       break;
+               case 'k':
+                       word += 'k';
+                       break;
+       }
+       return word;
+};
index 734c26d..b51b2b6 100644 (file)
@@ -6,3 +6,27 @@ mediaWiki.language.convertPlural = function( count, forms ) {
        forms = mediaWiki.language.preConvertPlural( forms, 2 );
        return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1];
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'hy', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+
+       // These rules are not perfect, but they are currently only used for site names so it doesn't
+       // matter if they are wrong sometimes. Just add a special case for your site name if necessary.
+
+       switch ( form ) {
+               case 'genitive': // սեռական հոլով
+                       if ( word.substr( -1 ) === 'ա' )
+                               word = word.substr( 0, word.length -1 )  + 'այի';
+                       else if ( word.substr( -1 ) === 'ո' )
+                               word = word.substr( 0, word.length - 1 ) + 'ոյի';
+                       else if ( word.substr( -4 ) === 'գիրք' )
+                               word = word.substr( 0, word.length - 4 ) + 'գրքի';
+                       else
+                               word = word + 'ի';
+                       break;
+               }
+       return word;
+};
diff --git a/resources/mediawiki.language/languages/la.js b/resources/mediawiki.language/languages/la.js
new file mode 100644 (file)
index 0000000..313bb1c
--- /dev/null
@@ -0,0 +1,50 @@
+/**
+ * Latin (lingua Latina) language functions
+ * @author Santhosh Thottingal
+ */
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'la', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'genitive':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'i' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'ommunium' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'ae' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'librorum' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntiorum' ); // 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tionis' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'ntis' );
+                       word = word.replace( /as$/i, 'atis' );
+                       word = word.replace( /es$/i ,'ei' ); // 5th declension singular
+                       break;
+               case 'accusative':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'um' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'am' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'ommunia' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'libros' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntios' );// 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tionem' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'ntem' );
+                       word = word.replace( /as$/i, 'atem');
+                       word = word.replace( /es$/i ,'em' ); // 5th declension singular
+                       break;
+               case 'ablative':
+                       // only a few declensions, and even for those mostly the singular only
+                       word = word.replace( /u[ms]$/i, 'o' ); // 2nd declension singular
+                       word = word.replace( /ommunia$/i, 'ommunibus' ); // 3rd declension neuter plural (partly)
+                       word = word.replace( /a$/i, 'a' ); // 1st declension singular
+                       word = word.replace( /libri$/i,'libris' ); // 2nd declension plural (partly)
+                       word = word.replace( /nuntii$/i, 'nuntiis' ); // 2nd declension plural (partly)
+                       word = word.replace( /tio$/i,'tione' ); // 3rd declension singular (partly)
+                       word = word.replace( /ns$/i, 'nte' );
+                       word = word.replace( /as$/i, 'ate');
+                       word = word.replace( /es$/i ,'e' ); // 5th declension singular
+                       break;
+       }
+       return word;
+};
diff --git a/resources/mediawiki.language/languages/nl.js b/resources/mediawiki.language/languages/nl.js
deleted file mode 100644 (file)
index a2b22f4..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Dutch (Nederlands) language functions
- */
-
-mediaWiki.language.digitTransformTable = {
-    '.' : ',',
-    ',' : '.'
-};
diff --git a/resources/mediawiki.language/languages/os.js b/resources/mediawiki.language/languages/os.js
new file mode 100644 (file)
index 0000000..431e38c
--- /dev/null
@@ -0,0 +1,69 @@
+/**
+ * Ossetian (Ирон) language functions
+ * @author Santhosh Thottingal
+ */
+
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'os', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       // Ending for allative case
+       var end_allative = 'мæ';
+       // Variable for 'j' beetwen vowels
+       var jot = '';
+       // Variable for "-" for not Ossetic words
+       var hyphen = '';
+       // Variable for ending
+       var ending = '';
+       // Checking if the $word is in plural form
+       if ( word.match( /тæ$/i ) ) {
+               word = word.substring( 0, word.length - 1 );
+               end_allative = 'æм';
+       }
+       // Works if word is in singular form.
+       // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
+       else if ( word.match( /[аæеёиоыэюя]$/i ) ) {
+               jot = 'й';
+       }
+       // Checking if word ends on 'у'. 'У' can be either consonant 'W' or vowel 'U' in cyrillic Ossetic.
+       // Examples: {{grammar:genitive|аунеу}} = аунеуы, {{grammar:genitive|лæппу}} = лæппуйы.
+       else if ( word.match( /у$/i ) ) {
+               if ( ! word.substring( word.length-2, word.length-1 ).match( /[аæеёиоыэюя]$/i ) ) {
+                       jot = 'й';
+               }
+       } else if ( !word.match( /[бвгджзйклмнопрстфхцчшщьъ]$/i ) ) {
+               hyphen = '-';
+       }
+
+       switch ( form ) {
+               case 'genitive':
+                       ending = hyphen + jot + 'ы';
+                       break;
+               case 'dative':
+                       ending = hyphen + jot + 'æн';
+                       break;
+               case 'allative':
+                       ending = hyphen + end_allative;
+                       break;
+               case 'ablative':
+                       if ( jot == 'й' ) {
+                               ending = hyphen + jot + 'æ';
+                       }
+                       else {
+                               ending = hyphen + jot + 'æй';
+                       }
+                       break;
+               case 'superessive':
+                       ending = hyphen + jot + 'ыл';
+                       break;
+               case 'equative':
+                       ending = hyphen + jot + 'ау';
+                       break;
+               case 'comitative':
+                       ending = hyphen + 'имæ';
+                       break;
+       }
+       return word + ending;
+};
diff --git a/resources/mediawiki.language/languages/pt-br.js b/resources/mediawiki.language/languages/pt-br.js
deleted file mode 100644 (file)
index 2457e24..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Brazilian Portugese (Portuguêsi do Brasil) language functions
- */
-
-mediaWiki.language.digitTransformTable = {
-    '.' : ',',
-    ',' : ' '
-};
diff --git a/resources/mediawiki.language/languages/pt.js b/resources/mediawiki.language/languages/pt.js
deleted file mode 100644 (file)
index 1b8fc72..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * Portugese language functions
- */
-
-mediaWiki.language.digitTransformTable = {
-    '.' : ',',
-    ',' : ' '
-};
index 17c9293..42be4f9 100644 (file)
@@ -21,3 +21,29 @@ mediaWiki.language.convertPlural = function( count, forms ) {
                        return forms[2];
        }
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'ru', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'genitive': // родительный падеж
+                       if ( (  word.substr( word.length - 4 )  == 'вики' ) || (  word.substr( word.length - 4 ) == 'Вики' ) ) {
+                       }
+                       else if ( word.substr( word.length - 1 ) == 'ь' )
+                               word = word.substr(0, word.length - 1 ) + 'я';
+                       else if ( word.substr( word.length - 2 ) == 'ия' )
+                               word = word.substr(0, word.length - 2 ) + 'ии';
+                       else if ( word.substr( word.length - 2 ) == 'ка' )
+                               word = word.substr(0, word.length - 2 ) + 'ки';
+                       else if ( word.substr( word.length - 2 )  == 'ти' )
+                               word = word.substr(0, word.length - 2 ) + 'тей';
+                       else if ( word.substr( word.length - 2 ) == 'ды' )
+                               word = word.substr(0, word.length - 2 ) + 'дов';
+                       else if ( word.substr( word.length - 3 ) == 'ник' )
+                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       break;
+       }
+       return word;
+};
index a887e0e..cfb5781 100644 (file)
@@ -18,3 +18,19 @@ mediaWiki.language.convertPlural = function( count, forms ) {
        }
        return forms[4];
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'sl', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'mestnik': // locative
+                       word = 'o ' + word;
+                       break;
+               case 'orodnik': // instrumental
+                       word = 'z ' + word;
+                       break;
+       }
+       return word;
+};
index 5c1294e..372d441 100644 (file)
@@ -21,3 +21,35 @@ mediaWiki.language.convertPlural = function( count, forms ) {
                        return forms[2];
        }
 };
+
+mediaWiki.language.convertGrammar = function( word, form ) {
+       var grammarForms = mw.language.getData( 'uk', 'grammarForms' );
+       if ( grammarForms && grammarForms[form] ) {
+               return grammarForms[form][word] ;
+       }
+       switch ( form ) {
+               case 'genitive': // родовий відмінок
+                       if ( (  word.substr( word.length - 4 ) == 'вікі' ) || (  word.substr( word.length - 4 ) == 'Вікі' ) ) {
+                       }
+                       else if ( word.substr( word.length - 1 ) == 'ь' )
+                               word = word.substr(0, word.length - 1 ) + 'я';
+                       else if ( word.substr( word.length - 2 ) == 'ія' )
+                               word = word.substr(0, word.length - 2 ) + 'ії';
+                       else if ( word.substr( word.length - 2 ) == 'ка' )
+                               word = word.substr(0, word.length - 2 ) + 'ки';
+                       else if ( word.substr( word.length - 2 )  == 'ти' )
+                               word = word.substr(0, word.length - 2 ) + 'тей';
+                       else if ( word.substr( word.length - 2 ) == 'ды' )
+                               word = word.substr(0, word.length - 2 ) + 'дов';
+                       else if ( word.substr( word.length - 3 ) == 'ник' )
+                               word = word.substr(0, word.length - 3 ) + 'ника';
+                       break;
+               case 'accusative': // знахідний відмінок
+                       if ( (  word.substr( word.length - 4 ) == 'вікі' ) || (  word.substr( word.length - 4 ) == 'Вікі' ) ) {
+                       }
+                       else if ( word.substr( word.length - 2 ) == 'ія' )
+                               word = word.substr(0, word.length - 2 ) + 'ію';
+                       break;
+       }
+       return word;
+};
diff --git a/resources/mediawiki.language/mediawiki.language.init.js b/resources/mediawiki.language/mediawiki.language.init.js
new file mode 100644 (file)
index 0000000..b49823c
--- /dev/null
@@ -0,0 +1,61 @@
+/**
+ * Base language object with methods for storing and getting
+ * language data.
+ */
+( function( $, mw ) {
+
+       var language = {
+               /**
+                * @var data {Object} Language related data (keyed by language,
+                * contains instances of mw.Map).
+                * @example Set data
+                * <code>
+                *     // Override, extend or create the language data object of 'nl'
+                *     mw.language.setData( 'nl', 'myKey', 'My value' );
+                *
+                *     // Set multiple values at once
+                *     mw.language.setData( 'nl', { 'foo': 'X', 'bar': 'Y' } );
+                * </code>
+                * @example Get GrammarForms data for language 'nl':
+                * <code>
+                *     var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
+                * </code>
+                */
+               data: {},
+
+               /**
+                * Convenience method for retreiving language data by language code and data key,
+                * covering for the potential inexistance of a data object for this langiage.
+                * @param langCode {String}
+                * @param dataKey {String}
+                * @return {mixed} Value stored in the mw.Map (or undefined if there is no map for
+                  the specified langCode).
+                */
+               getData: function ( langCode, dataKey ) {
+                       var langData = language.data;
+                       if ( langData[langCode] instanceof mw.Map ) {
+                               return langData[langCode].get( dataKey );
+                       }
+                       return undefined;
+               },
+
+               /**
+                * Convenience method for setting language data by language code and data key.
+                * Creates the data mw.Map if there isn't one for the specified language already.
+                *
+                * @param langCode {String}
+                * @param dataKey {String|Object} Key or object of key/values.
+                * @param value {mixed} Value for dataKey, ignored if dataKey is an object.
+                */
+               setData: function ( langCode, dataKey, value ) {
+                       var langData = language.data;
+                       if ( !( langData[langCode] instanceof mw.Map ) ) {
+                               langData[langCode] = new mw.Map();
+                       }
+                       langData[langCode].set( dataKey, value );
+               }
+       };
+
+       mw.language = language;
+
+} )( jQuery, mediaWiki );
index 67b605c..78a6309 100644 (file)
@@ -1,58 +1,12 @@
 /**
- * Base language object
- *
  * Localized Language support attempts to mirror some of the functionality of
- * Language.php in MediaWiki. This object contains methods for loading and
- * transforming message text.
+ * Language.php in MediaWiki.
+ * This adds methods for transforming message text.
  */
 ( function( $, mw ) {
 
 var language = {
-       /**
-        * @var data {Object} Language related data (keyed by language,
-        * contains instances of mw.Map).
-        * @example Set data
-        * <code>
-        *     // Override, extend or create the language data object of 'nl'
-        *     mw.language.setData( 'nl', 'myKey', 'My value' );
-        * </code>
-        * @example Get GrammarForms data for language 'nl':
-        * <code>
-        *     var grammarForms = mw.language.getData( 'nl', 'grammarForms' );
-        * </code>
-        */
-       data: {},
-
-       /**
-        * Convenience method for retreiving language data by language code and data key,
-        * covering for the potential inexistance of a data object for this langiage.
-        * @param langCode {String}
-        * @param dataKey {String}
-        * @return {mixed} Value stored in the mw.Map (or undefined if there is no map for
-          the specified langCode).
-        */
-       getData: function ( langCode, dataKey ) {
-               var langData = language.data;
-               if ( langData[langCode] instanceof mw.Map ) {
-                       return langData[langCode].get( dataKey );
-               }
-               return undefined;
-       },
 
-       /**
-        * Convenience method for setting language data by language code and data key.
-        * Creates a data object if there isn't one for the specified language already.
-        * @param langCode {String}
-        * @param dataKey {String}
-        * @param value {mixed}
-        */
-       setData: function ( langCode, dataKey, value ) {
-               var langData = language.data;
-               if ( !( langData[langCode] instanceof mw.Map ) ) {
-                       langData[langCode] = new mw.Map();
-               }
-               langData[langCode].set( dataKey, value );
-       },
        /**
         * Process the PLURAL template substitution
         *
@@ -72,7 +26,7 @@ var language = {
                        }
                        // Restore the count into a Number ( if it got converted earlier )
                        var count = mw.language.convertNumber( template.title, true );
-                       // Do convertPlural call 
+                       // Do convertPlural call
                        return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
                }
                // Could not process plural return first form or nothing
@@ -145,7 +99,7 @@ var language = {
         * Provides an alternative text depending on specified gender.
         * Usage {{gender:[gender|user object]|masculine|feminine|neutral}}.
         * If second or third parameter are not specified, masculine is used.
-        * 
+        *
         * These details may be overriden per language.
         *
         * @param gender string male, female, or anything else for neutral.
@@ -178,7 +132,7 @@ var language = {
         * @return {String}
         */
        convertGrammar: function ( word, form ) {
-               var grammarForms = language.getData( mw.config.get( 'wgContentLanguage' ), 'grammarForms' );
+               var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
                if ( grammarForms && grammarForms[form] ) {
                        return grammarForms[form][word] || word;
                }
@@ -186,9 +140,9 @@ var language = {
        },
 
        // Digit Transform Table, populated by language classes where applicable
-       'digitTransformTable': null
+       'digitTransformTable': mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'digitTransformTable' )
 };
 
-mw.language = language;
+$.extend( mw.language, language );
 
 } )( jQuery, mediaWiki );
diff --git a/resources/mediawiki.page/mediawiki.page.watch.ajax.js b/resources/mediawiki.page/mediawiki.page.watch.ajax.js
new file mode 100644 (file)
index 0000000..d3f8433
--- /dev/null
@@ -0,0 +1,174 @@
+/**
+ * Animate watch/unwatch links to use asynchronous API requests to
+ * watch pages, rather than navigating to a different URI.
+ */
+( function ( $, mw, undefined ) {
+       /**
+        * The name of the page to watch or unwatch.
+        */
+       var title = mw.config.get( 'wgRelevantPageName', mw.config.get( 'wgPageName' ) );
+
+       // Expose local methods
+       mw.page.watch = {
+               'updateWatchLink': updateWatchLink
+       };
+       /**
+        * Update the link text, link href attribute and (if applicable)
+        * "loading" class.
+        *
+        * @param $link {jQuery} Anchor tag of (un)watch link.
+        * @param action {String} One of 'watch', 'unwatch'.
+        * @param state {String} [optional] 'idle' or 'loading'. Default is 'idle'.
+        */
+       function updateWatchLink( $link, action, state ) {
+               var accesskeyTip, msgKey, $li, otherAction;
+
+               // message keys 'watch', 'watching', 'unwatch' or 'unwatching'.
+               msgKey = state === 'loading' ? action + 'ing' : action;
+               otherAction = action === 'watch' ? 'unwatch' : 'watch';
+               accesskeyTip = $link.attr( 'title' ).match( mw.util.tooltipAccessKeyRegexp );
+               $li = $link.closest( 'li' );
+               /**
+                * Trigger a 'watchpage' event for this List item.
+                * Announce the otherAction value as the first param.
+                * Used to monitor the state of watch link.
+                * TODO: Revise when system wide hooks are implemented
+                */
+               if( state === undefined ) {
+                       $li.trigger( 'watchpage.mw', otherAction );
+               }
+
+               $link
+                       .text( mw.msg( msgKey ) )
+                       .attr( 'title', mw.msg( 'tooltip-ca-' + action ) +
+                               ( accesskeyTip ? ' ' + accesskeyTip[0] : '' )
+                       )
+                       .attr( 'href', mw.util.wikiScript() + '?' + $.param({
+                                       title: title,
+                                       action: action
+                               })
+                       );
+
+               // Most common ID style
+               if ( $li.prop( 'id' ) === 'ca-' + otherAction ) {
+                       $li.prop( 'id', 'ca-' + action );
+               }
+
+               // Special case for vector icon
+               if ( $li.hasClass( 'icon' ) ) {
+                       if ( state === 'loading' ) {
+                               $link.addClass( 'loading' );
+                       } else {
+                               $link.removeClass( 'loading' );
+                       }
+               }
+       }
+
+       /**
+        * @todo This should be moved somewhere more accessible.
+        * @param url {String}
+        * @return {String} The extracted action, defaults to 'view'.
+        */
+       function mwUriGetAction( url ) {
+               var action, actionPaths, key, i, m, parts;
+
+               actionPaths = mw.config.get( 'wgActionPaths' );
+
+               // @todo: Does MediaWiki give action path or query param
+               // precedence ? If the former, move this to the bottom
+               action = mw.util.getParamValue( 'action', url );
+               if ( action !== null ) {
+                       return action;
+               }
+
+               for ( key in actionPaths ) {
+                       if ( actionPaths.hasOwnProperty( key ) ) {
+                               parts = actionPaths[key].split( '$1' );
+                               for ( i = 0; i < parts.length; i += 1 ) {
+                                       parts[i] = $.escapeRE( parts[i] );
+                               }
+                               m = new RegExp( parts.join( '(.+)' ) ).exec( url );
+                               if ( m && m[1] ) {
+                                       return key;
+                               }
+
+                       }
+               }
+
+               return 'view';
+       }
+
+       $( document ).ready( function () {
+               var $links = $( '.mw-watchlink a, a.mw-watchlink, ' +
+                       '#ca-watch a, #ca-unwatch a, #mw-unwatch-link1, ' +
+                       '#mw-unwatch-link2, #mw-watch-link2, #mw-watch-link1' );
+
+               // Allowing people to add inline animated links is a little scary
+               $links = $links.filter( ':not( #bodyContent *, #content * )' );
+
+               $links.click( function ( e ) {
+                       var action, api, $link;
+
+                       action = mwUriGetAction( this.href );
+
+                       if ( action !== 'watch' && action !== 'unwatch' ) {
+                               // Could not extract target action from link url,
+                               // let native browsing handle it further
+                               return true;
+                       }
+                       e.preventDefault();
+                       e.stopPropagation();
+
+                       $link = $( this );
+
+                       updateWatchLink( $link, action, 'loading' );
+
+                       api = new mw.Api();
+                       api[action](
+                               title,
+                               // Success
+                               function ( watchResponse ) {
+                                       var $li, otherAction;
+
+                                       otherAction = action === 'watch' ? 'unwatch' : 'watch';
+                                       $li = $link.closest( 'li' );
+
+                                       mw.util.jsMessage( watchResponse.message, 'ajaxwatch' );
+
+                                       // Set link to opposite
+                                       updateWatchLink( $link, otherAction );
+
+                                       // Bug 12395 - update the watch checkbox on edit pages when the
+                                       // page is watched or unwatched via the tab.
+                                       if ( watchResponse.watched !== undefined ) {
+                                               $( '#wpWatchthis' ).prop( 'checked', true );
+                                       } else {
+                                               $( '#wpWatchthis' ).removeProp( 'checked' );
+                                       }
+                               },
+                               // Error
+                               function () {
+                                       var cleanTitle, html, link;
+
+                                       // Reset link to non-loading mode
+                                       updateWatchLink( $link, action );
+
+                                       // Format error message
+                                       cleanTitle = title.replace( /_/g, ' ' );
+                                       link = mw.html.element(
+                                               'a', {
+                                                       href: mw.util.wikiGetlink( title ),
+                                                       title: cleanTitle
+                                               }, cleanTitle
+                                       );
+                                       html = mw.msg( 'watcherrortext', link );
+
+                                       // Report to user about the error
+                                       mw.util.jsMessage( html, 'ajaxwatch' );
+
+                               }
+                       );
+               });
+       });
+
+}( jQuery, mediaWiki ) );
index 8865d04..04954e8 100644 (file)
@@ -1,21 +1,33 @@
 /*
  * JavaScript for Special:Search
  */
-jQuery( function( $ ) {
+( function( $, mw ) { $( function() {
 
 // Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
 if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
        $( 'input[autofocus]:first' ).focus();
 }
 
-// Bind check all/none button
+// Create check all/none button
 var $checkboxes = $('#powersearch input[id^=mw-search-ns]');
-$('#mw-search-toggleall').click( function() {
-       $checkboxes.prop("checked", true);
-} );
-$('#mw-search-togglenone').click( function() {
-       $checkboxes.prop("checked", false);
-} );
+$('#mw-search-togglebox').append(
+       $('<label />')
+               .text(mw.msg('powersearch-togglelabel'))
+).append(
+       $('<input type="button" />')
+               .attr('id', 'mw-search-toggleall')
+               .attr('value', mw.msg('powersearch-toggleall'))
+               .click( function() {
+                       $checkboxes.prop('checked', true);
+               } )
+).append(
+       $('<input type="button" />')
+               .attr('id', 'mw-search-togglenone')
+               .attr('value', mw.msg('powersearch-togglenone'))
+               .click( function() {
+                       $checkboxes.prop('checked', false);
+               } )
+);
 
 // Change the header search links to what user entered
 var headerLinks = $('.search-types a');
@@ -34,4 +46,4 @@ $('#searchText, #powerSearchText').change(function() {
        });
 }).trigger('change');
 
-} );
+} ); } )( jQuery, mediaWiki );
index 85b3f3f..f7a4b1f 100644 (file)
@@ -156,17 +156,33 @@ jQuery( function( $ ) {
         */
        function fetchPreview( file, callback, callbackBinary ) {
                var reader = new FileReader();
-               if ( callbackBinary ) {
+               if ( callbackBinary && 'readAsBinaryString' in reader ) {
                        // To fetch JPEG metadata we need a binary string; start there.
                        // todo: 
                        reader.onload = function() {
                                callbackBinary( reader.result );
 
                                // Now run back through the regular code path.
-                               fetchPreview(file, callback );
+                               fetchPreview( file, callback );
                        };
                        reader.readAsBinaryString( file );
-               } else if ('URL' in window && 'createObjectURL' in window.URL) {
+               } else if ( callbackBinary && 'readAsArrayBuffer' in reader ) {
+                       // readAsArrayBuffer replaces readAsBinaryString
+                       // However, our JPEG metadata library wants a string.
+                       // So, this is going to be an ugly conversion.
+                       reader.onload = function() {
+                               var buffer = new Uint8Array( reader.result ),
+                                       string = '';
+                               for ( var i = 0; i < buffer.byteLength; i++ ) {
+                                       string += String.fromCharCode( buffer[i] );
+                               }
+                               callbackBinary( string );
+
+                               // Now run back through the regular code path.
+                               fetchPreview( file, callback );
+                       };
+                       reader.readAsArrayBuffer( file );
+               } else if ( 'URL' in window && 'createObjectURL' in window.URL ) {
                        // Supported in Firefox 4.0 and above <https://developer.mozilla.org/en/DOM/window.URL.createObjectURL>
                        // WebKit has it in a namespace for now but that's ok. ;)
                        //
@@ -176,7 +192,7 @@ jQuery( function( $ ) {
                        //
                        // Prefer this over readAsDataURL for Firefox 7 due to bug reading
                        // some SVG files from data URIs <https://bugzilla.mozilla.org/show_bug.cgi?id=694165>
-                       callback(window.URL.createObjectURL(file));
+                       callback( window.URL.createObjectURL( file ) );
                } else {
                        // This ends up decoding the file to base-64 and back again, which
                        // feels horribly inefficient.
index 2957674..b871ac7 100644 (file)
@@ -56,7 +56,7 @@
  *
  */
 
-( function( $, mw ) {
+( function ( mw, $ ) {
 
        /**
         * Function that's useful when constructing the URI string -- we frequently encounter the pattern of
@@ -70,9 +70,8 @@
        function cat( pre, val, post, raw ) {
                if ( val === undefined || val === null || val === '' ) {
                        return '';
-               } else {
-                       return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
                }
+               return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
        }
 
        // Regular expressions to parse many common URIs.
@@ -98,7 +97,8 @@
         * We use a factory to inject a document location, for relative URLs, including protocol-relative URLs.
         * so the library is still testable & purely functional.
         */
-       mw.UriRelative = function( documentLocation ) {
+       mw.UriRelative = function ( documentLocation ) {
+               var defaultUri;
 
                /**
                 * Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
 
                        if ( uri !== undefined && uri !== null || uri !== '' ) {
                                if ( typeof uri === 'string' ) {
-                                       this._parse( uri, options );
+                                       this.parse( uri, options );
                                } else if ( typeof uri === 'object' ) {
-                                       var _this = this;
-                                       $.each( properties, function( i, property ) {
-                                               _this[property] = uri[property];
-                                       } );
-                                       if ( this.query === undefined ) {
+                                       // Copy data over from existing URI object
+                                       for ( var prop in uri ) {
+                                               // Only copy direct properties, not inherited ones
+                                               if ( uri.hasOwnProperty( prop ) ) {
+                                                       // Deep copy object properties
+                                                       if ( $.isArray( uri[prop] ) || $.isPlainObject( uri[prop] ) ) {
+                                                               this[prop] = $.extend( true, {}, uri[prop] );
+                                                       } else {
+                                                               this[prop] = uri[prop];
+                                                       }
+                                               }
+                                       }
+                                       if ( !this.query ) {
                                                this.query = {};
                                        }
                                }
                 * @param {String} string
                 * @return {String} encoded for URI
                 */
-               Uri.encode = function( s ) {
+               Uri.encode = function ( s ) {
                        return encodeURIComponent( s )
                                .replace( /!/g, '%21').replace( /'/g, '%27').replace( /\(/g, '%28')
                                .replace( /\)/g, '%29').replace( /\*/g, '%2A')
                 * @param {String} string encoded for URI
                 * @return {String} decoded string
                 */
-               Uri.decode = function( s ) {
+               Uri.decode = function ( s ) {
                        return decodeURIComponent( s.replace( /\+/g, '%20' ) );
                };
 
                         * @param {Object} options
                         * @return {Boolean} success
                         */
-                       _parse: function( str, options ) {
-                               var matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
-                               var uri = this;
-                               $.each( properties, function( i, property ) {
+                       parse: function ( str, options ) {
+                               var q,
+                                       uri = this,
+                                       matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
+                               $.each( properties, function ( i, property ) {
                                        uri[ property ] = matches[ i+1 ];
                                } );
 
                                // uri.query starts out as the query string; we will parse it into key-val pairs then make
                                // that object the "query" property.
                                // we overwrite query in uri way to make cloning easier, it can use the same list of properties.
-                               var q = {};
+                               q = {};
                                // using replace to iterate over a string
                                if ( uri.query ) {
                                        uri.query.replace( /(?:^|&)([^&=]*)(?:(=)([^&]*))?/g, function ($0, $1, $2, $3) {
+                                               var k, v;
                                                if ( $1 ) {
-                                                       var k = Uri.decode( $1 );
-                                                       var v = ( $2 === '' || $2 === undefined ) ? null : Uri.decode( $3 );
+                                                       k = Uri.decode( $1 );
+                                                       v = ( $2 === '' || $2 === undefined ) ? null : Uri.decode( $3 );
 
                                                        // If overrideKeys, always (re)set top level value.
                                                        // If not overrideKeys but this key wasn't set before, then we set it as well.
                         * Returns user and password portion of a URI.
                         * @return {String}
                         */
-                       getUserInfo: function() {
+                       getUserInfo: function () {
                                return cat( '', this.user, cat( ':', this.password, '' ) );
                        },
 
                         * Gets host and port portion of a URI.
                         * @return {String}
                         */
-                       getHostPort: function() {
+                       getHostPort: function () {
                                return this.host + cat( ':', this.port, '' );
                        },
 
                         * In most real-world URLs, this is simply the hostname, but it is more general.
                         * @return {String}
                         */
-                       getAuthority: function() {
+                       getAuthority: function () {
                                return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
                        },
 
                         * Does not preserve the order of arguments passed into the URI. Does handle escaping.
                         * @return {String}
                         */
-                       getQueryString: function() {
+                       getQueryString: function () {
                                var args = [];
-                               $.each( this.query, function( key, val ) {
-                                       var k = Uri.encode( key );
-                                       var vals = val === null ? [ null ] : $.makeArray( val );
-                                       $.each( vals, function( i, v ) {
+                               $.each( this.query, function ( key, val ) {
+                                       var k = Uri.encode( key ),
+                                               vals = val === null ? [ null ] : $.makeArray( val );
+                                       $.each( vals, function ( i, v ) {
                                                args.push( k + ( v === null ? '' : '=' + Uri.encode( v ) ) );
                                        } );
                                } );
                         * Returns everything after the authority section of the URI
                         * @return {String}
                         */
-                       getRelativePath: function() {
+                       getRelativePath: function () {
                                return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
                        },
 
                         * Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
                         * @return {String} the URI string
                         */
-                       toString: function() {
+                       toString: function () {
                                return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
                        },
 
                         * Clone this URI
                         * @return {Object} new URI object with same properties
                         */
-                       clone: function() {
+                       clone: function () {
                                return new Uri( this );
                        },
 
                         * @param {Object} query parameters in key-val form to override or add
                         * @return {Object} this URI object
                         */
-                       extend: function( parameters ) {
+                       extend: function ( parameters ) {
                                $.extend( this.query, parameters );
                                return this;
                        }
                };
 
-               var defaultUri = new Uri( documentLocation );
+               defaultUri = new Uri( documentLocation );
 
                return Uri;     
        };
                mw.Uri = mw.UriRelative( document.location.href );
        }
 
-} )( jQuery, mediaWiki );
+}( mediaWiki, jQuery ) );
index 043ebce..f690a1d 100644 (file)
                return function( args ) {
                        var key = args[0];
                        var argsArray = $.isArray( args[1] ) ? args[1] : $.makeArray( args ).slice( 1 ); 
-                       var escapedArgsArray = $.map( argsArray, function( arg ) { 
-                               return typeof arg === 'string' ? mw.html.escape( arg ) : arg;
-                       } );
                        try {
-                               return parser.parse( key, escapedArgsArray );
+                               return parser.parse( key, argsArray );
                        } catch ( e ) {
-                               return $( '<span></span>' ).append( key + ': ' + e.message );
+                               return $( '<span>' ).append( key + ': ' + e.message );
                        }
                };
        }
                },
 
                /**
-                * Fetch the message string associated with a key, return parsed structure. Memoized.
+                * Fetch the message string associated with a key, return parsed structure. Memoized.
                 * Note that we pass '[' + key + ']' back for a missing message here. 
-                * @param {String} key
+                * @param {String} key
                 * @return {String|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function( key ) {
 
 
                        var regularLiteral = makeRegexParser( /^[^{}[\]$\\]/ );
-                       var regularLiteralWithoutBar = makeRegexParser(/^[^{}[\]$\\|]/);
-                       var regularLiteralWithoutSpace = makeRegexParser(/^[^{}[\]$\s]/);
+                       var regularLiteralWithoutBar = makeRegexParser(/^[^{}[\]$\\|]/);
+                       var regularLiteralWithoutSpace = makeRegexParser(/^[^{}[\]$\s]/);
 
                        var backslash = makeStringParser( "\\" );
                        var anyCharacter = makeRegexParser( /^./ );
                                return result;
                        }
 
+                       // this is the same as the above extlink, except that the url is being passed on as a parameter
+                       function extLinkParam() {
+                               var result = sequence( [
+                                       openExtlink,
+                                       dollar,
+                                       digits,
+                                       whitespace,
+                                       expression,
+                                       closeExtlink
+                               ] );
+                               if ( result === null ) {
+                                       return null;
+                               }
+                               return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
+                       }
+
                        var openLink = makeStringParser( '[[' );
                        var closeLink = makeStringParser( ']]' );
 
                        }
 
                        var nonWhitespaceExpression = choice( [
-                               template,        
+                               template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutSpace
                        ] );
 
                        var paramExpression = choice( [
-                               template,        
+                               template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
                                literalWithoutBar
                        var expression = choice( [ 
                                template,
                                link,
+                               extLinkParam,
                                extlink,
                                replacement,
                                literal 
                },
 
                /**
-                * Return replacement of correct index, or string if unavailable.
+                * Return escaped replacement of correct index, or string if unavailable.
                 * Note that we expect the parsed parameter to be zero-based. i.e. $1 should have become [ 0 ].
                 * if the specified parameter is not found return the same string
                 * (e.g. "$99" -> parameter 98 -> not found -> return "$99" )
                 */
                replace: function( nodes, replacements ) {
                        var index = parseInt( nodes[0], 10 );
-                       return index < replacements.length ? replacements[index] : '$' + ( index + 1 ); 
+                       
+                       if ( index < replacements.length ) {
+                               if ( typeof arg === 'string' ) {
+                                       // replacement is a string, escape it
+                                       return mw.html.escape( replacements[index] );
+                               } else {
+                                       // replacement is no string, don't touch!
+                                       return replacements[index];
+                               }
+                       } else {
+                               // index not found, fallback to displaying variable
+                               return '$' + ( index + 1 );
+                       }
                },
 
                /** 
                        return $el;
                },
 
+               /**
+                * This is basically use a combination of replace + link (link with parameter
+                * as url), but we don't want to run the regular replace here-on: inserting a
+                * url as href-attribute of a link will automatically escape it already, so
+                * we don't want replace to (manually) escape it as well.
+                * TODO throw error if nodes.length > 1 ?
+                * @param {Array} of one element, integer, n >= 0
+                * @return {String} replacement
+                */
+               linkparam: function( nodes, replacements ) {
+                       var replacement,
+                               index = parseInt( nodes[0], 10 );
+                       if ( index < replacements.length) {
+                               replacement = replacements[index];
+                       } else {
+                               replacement = '$' + ( index + 1 );
+                       }
+                       return this.link( [ replacement, nodes[1] ] );
+               },
+
                /**
                 * Transform parsed structure into pluralization
                 * n.b. The first node may be a non-integer (for instance, a string representing an Arabic number).
index eebbab2..f29a9bd 100644 (file)
@@ -138,7 +138,7 @@ var mw = ( function ( $, undefined ) {
                /**
                 * Simple message parser, does $N replacement and nothing else.
                 * This may be overridden to provide a more complex message parser.
-                * 
+                *
                 * This function will not be called for nonexistent messages.
                 */
                parser: function() {
@@ -148,7 +148,7 @@ var mw = ( function ( $, undefined ) {
                                return parameters[index] !== undefined ? parameters[index] : '$' + match;
                        } );
                },
-               
+
                /**
                 * Appends (does not replace) parameters for replacement to the .parameters property.
                 *
@@ -192,7 +192,7 @@ var mw = ( function ( $, undefined ) {
                                text = this.parser();
                                text = mw.html.escape( text );
                        }
-                       
+
                        if ( this.format === 'parse' ) {
                                text = this.parser();
                        }
@@ -248,7 +248,7 @@ var mw = ( function ( $, undefined ) {
                 * emulates console.log in console-less environments.
                 */
                log: function() { },
-       
+
                /**
                 * @var constructor Make the Map constructor publicly available.
                 */
@@ -258,7 +258,7 @@ var mw = ( function ( $, undefined ) {
                 * @var constructor Make the Message constructor publicly available.
                 */
                Message: Message,
-       
+
                /**
                 * List of configuration values
                 *
@@ -267,25 +267,25 @@ var mw = ( function ( $, undefined ) {
                 * in the global window object.
                 */
                config: null,
-       
+
                /**
                 * @var object
                 *
                 * Empty object that plugins can be installed in.
                 */
                libs: {},
-       
+
                /* Extension points */
-       
+
                legacy: {},
-       
+
                /**
                 * Localization system
                 */
                messages: new Map(),
-       
+
                /* Public Methods */
-       
+
                /**
                 * Gets a message object, similar to wfMessage()
                 *
@@ -305,7 +305,7 @@ var mw = ( function ( $, undefined ) {
                        }
                        return new Message( mw.messages, key, parameters );
                },
-       
+
                /**
                 * Gets a message string, similar to wfMsg()
                 *
@@ -317,14 +317,14 @@ var mw = ( function ( $, undefined ) {
                msg: function ( /* key, parameter_1, parameter_2, .. */ ) {
                        return mw.message.apply( mw.message, arguments ).toString();
                },
-       
+
                /**
                 * Client-side module loader which integrates with the MediaWiki ResourceLoader
                 */
                loader: ( function () {
-       
+
                        /* Private Members */
-       
+
                        /**
                         * Mapping of registered modules
                         *
@@ -372,15 +372,15 @@ var mw = ( function ( $, undefined ) {
                                ready = false,
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null;
-       
+
                        /* Cache document ready status */
-       
+
                        $(document).ready( function () {
                                ready = true;
                        } );
-       
+
                        /* Private methods */
-       
+
                        function getMarker() {
                                // Cached ?
                                if ( $marker ) {
@@ -431,7 +431,8 @@ var mw = ( function ( $, undefined ) {
                        function addInlineCSS( css ) {
                                var $style, style, $newStyle;
                                $style = getMarker().prev();
-                               if ( $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
+                               // Disable <style> tag recycling/concatenation because of bug 34669
+                               if ( false && $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
                                        // There's already a dynamic <style> tag present, append to it. This recycling of
                                        // <style> tags is for bug 31676 (can't have more than 32 <style> tags in IE)
                                        style = $style.get( 0 );
@@ -463,7 +464,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return true;
                        }
-       
+
                        /**
                         * Generates an ISO8601 "basic" string from a UNIX timestamp
                         */
@@ -478,13 +479,23 @@ var mw = ( function ( $, undefined ) {
                                        pad( d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds() ), 'Z'
                                ].join( '' );
                        }
-       
+
                        /**
-                        * Recursively resolves dependencies and detects circular references
+                        * Resolves dependencies and detects circular references.
+                        *
+                        * @param module String Name of the top-level module whose dependencies shall be
+                        *   resolved and sorted.
+                        * @param resolved Array Returns a topological sort of the given module and its
+                        *   dependencies, such that later modules depend on earlier modules. The array
+                        *   contains the module names. If the array contains already some module names,
+                        *   this function appends its result to the pre-existing array.
+                        * @param unresolved Object [optional] Hash used to track the current dependency
+                        *   chain; used to report loops in the dependency graph.
+                        * @throws Error if any unregistered module or a dependency loop is encountered
                         */
-                       function recurse( module, resolved, unresolved ) {
+                       function sortDependencies( module, resolved, unresolved ) {
                                var n, deps, len;
-       
+
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
@@ -496,12 +507,20 @@ var mw = ( function ( $, undefined ) {
                                                registry[module].dependencies = [registry[module].dependencies];
                                        }
                                }
+                               if ( $.inArray( module, resolved ) !== -1 ) {
+                                       // Module already resolved; nothing to do.
+                                       return;
+                               }
+                               // unresolved is optional, supply it if not passed in
+                               if ( !unresolved ) {
+                                       unresolved = {};
+                               }
                                // Tracks down dependencies
                                deps = registry[module].dependencies;
                                len = deps.length;
                                for ( n = 0; n < len; n += 1 ) {
                                        if ( $.inArray( deps[n], resolved ) === -1 ) {
-                                               if ( $.inArray( deps[n], unresolved ) !== -1 ) {
+                                               if ( unresolved[deps[n]] ) {
                                                        throw new Error(
                                                                'Circular reference detected: ' + module +
                                                                ' -> ' + deps[n]
@@ -509,46 +528,43 @@ var mw = ( function ( $, undefined ) {
                                                }
 
                                                // Add to unresolved
-                                               unresolved[unresolved.length] = module;
-                                               recurse( deps[n], resolved, unresolved );
-                                               // module is at the end of unresolved
-                                               unresolved.pop();
+                                               unresolved[module] = true;
+                                               sortDependencies( deps[n], resolved, unresolved );
+                                               delete unresolved[module];
                                        }
                                }
                                resolved[resolved.length] = module;
                        }
-       
+
                        /**
-                        * Gets a list of module names that a module depends on in their proper dependency order
+                        * Gets a list of module names that a module depends on in their proper dependency
+                        * order.
                         *
                         * @param module string module name or array of string module names
                         * @return list of dependencies, including 'module'.
                         * @throws Error if circular reference is detected
                         */
                        function resolve( module ) {
-                               var modules, m, deps, n, resolved;
-       
+                               var m, resolved;
+
                                // Allow calling with an array of module names
                                if ( $.isArray( module ) ) {
-                                       modules = [];
+                                       resolved = [];
                                        for ( m = 0; m < module.length; m += 1 ) {
-                                               deps = resolve( module[m] );
-                                               for ( n = 0; n < deps.length; n += 1 ) {
-                                                       modules[modules.length] = deps[n];
-                                               }
+                                               sortDependencies( module[m], resolved );
                                        }
-                                       return modules;
+                                       return resolved;
                                }
 
                                if ( typeof module === 'string' ) {
                                        resolved = [];
-                                       recurse( module, resolved, [] );
+                                       sortDependencies( module, resolved );
                                        return resolved;
                                }
 
                                throw new Error( 'Invalid module argument: ' + module );
                        }
-       
+
                        /**
                         * Narrows a list of module names down to those matching a specific
                         * state (see comment on top of this scope for a list of valid states).
@@ -562,7 +578,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function filter( states, modules ) {
                                var list, module, s, m;
-       
+
                                // Allow states to be given as a string
                                if ( typeof states === 'string' ) {
                                        states = [states];
@@ -595,59 +611,115 @@ var mw = ( function ( $, undefined ) {
                                }
                                return list;
                        }
-       
+
                        /**
-                        * Automatically executes jobs and modules which are pending with satistifed dependencies.
+                        * Determine whether all dependencies are in state 'ready', which means we may
+                        * execute the module or job now.
+                        *
+                        * @param dependencies Array dependencies (module names) to be checked.
                         *
-                        * This is used when dependencies are satisfied, such as when a module is executed.
+                        * @return Boolean true if all dependencies are in state 'ready', false otherwise
+                        */
+                       function allReady( dependencies ) {
+                               return filter( 'ready', dependencies ).length === dependencies.length;
+                       }
+
+                       /**
+                        * Log a message to window.console, if possible. Useful to force logging of some
+                        * errors that are otherwise hard to detect (I.e., this logs also in production mode).
+                        * Gets console references in each invocation, so that delayed debugging tools work
+                        * fine. No need for optimization here, which would only result in losing logs.
+                        *
+                        * @param msg String text for the log entry.
+                        * @param e Error [optional] to also log.
+                        */
+                       function log( msg, e ) {
+                               var console = window.console;
+                               if ( console && console.log ) {
+                                       console.log( msg );
+                                       // If we have an exception object, log it through .error() to trigger
+                                       // proper stacktraces in browsers that support it. There are no (known)
+                                       // browsers that don't support .error(), that do support .log() and
+                                       // have useful exception handling through .log().
+                                       if ( e && console.error ) {
+                                               console.error( e );
+                                       }
+                               }
+                       }
+
+                       /**
+                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update pending jobs
+                        * and modules that depend upon this module. if the given module failed, propagate the 'error'
+                        * state up the dependency tree; otherwise, execute all jobs/modules that now have all their
+                        * dependencies satisfied. On jobs depending on a failed module, run the error callback, if any.
+                        *
+                        * @param module String name of module that entered one of the states 'ready', 'error', or 'missing'.
                         */
                        function handlePending( module ) {
-                               var j, r;
-       
-                               try {
-                                       // Run jobs whose dependencies have just been met
-                                       for ( j = 0; j < jobs.length; j += 1 ) {
-                                               if ( compare(
-                                                       filter( 'ready', jobs[j].dependencies ),
-                                                       jobs[j].dependencies ) )
-                                               {
-                                                       var callback = jobs[j].ready;
-                                                       jobs.splice( j, 1 );
-                                                       j -= 1;
-                                                       if ( $.isFunction( callback ) ) {
-                                                               callback();
+                               var j, job, hasErrors, m, stateChange;
+
+                               // Modules.
+                               if ( $.inArray( registry[module].state, ['error', 'missing'] ) !== -1 ) {
+                                       // If the current module failed, mark all dependent modules also as failed.
+                                       // Iterate until steady-state to propagate the error state upwards in the
+                                       // dependency tree.
+                                       do {
+                                               stateChange = false;
+                                               for ( m in registry ) {
+                                                       if ( $.inArray( registry[m].state, ['error', 'missing'] ) === -1 ) {
+                                                               if ( filter( ['error', 'missing'], registry[m].dependencies ).length > 0 ) {
+                                                                       registry[m].state = 'error';
+                                                                       stateChange = true;
+                                                               }
                                                        }
                                                }
-                                       }
-                                       // Execute modules whose dependencies have just been met
-                                       for ( r in registry ) {
-                                               if ( registry[r].state === 'loaded' ) {
-                                                       if ( compare(
-                                                               filter( ['ready'], registry[r].dependencies ),
-                                                               registry[r].dependencies ) )
-                                                       {
-                                                               execute( r );
+                                       } while ( stateChange );
+                               }
+
+                               // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
+                               for ( j = 0; j < jobs.length; j += 1 ) {
+                                       hasErrors = filter( ['error', 'missing'], jobs[j].dependencies ).length > 0;
+                                       if ( hasErrors || allReady( jobs[j].dependencies ) ) {
+                                               // All dependencies satisfied, or some have errors
+                                               job = jobs[j];
+                                               jobs.splice( j, 1 );
+                                               j -= 1;
+                                               try {
+                                                       if ( hasErrors ) {
+                                                               throw new Error ("Module " + module + " failed.");
+                                                       } else {
+                                                               if ( $.isFunction( job.ready ) ) {
+                                                                       job.ready();
+                                                               }
+                                                       }
+                                               } catch ( e ) {
+                                                       if ( $.isFunction( job.error ) ) {
+                                                               try {
+                                                                       job.error( e, [module] );
+                                                               } catch ( ex ) {
+                                                                       // A user-defined operation raised an exception. Swallow to protect
+                                                                       // our state machine!
+                                                                       log( 'Exception thrown by job.error()', ex );
+                                                               }
                                                        }
                                                }
                                        }
-                               } catch ( e ) {
-                                       // Run error callbacks of jobs affected by this condition
-                                       for ( j = 0; j < jobs.length; j += 1 ) {
-                                               if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
-                                                       if ( $.isFunction( jobs[j].error ) ) {
-                                                               jobs[j].error( e, module );
-                                                       }
-                                                       jobs.splice( j, 1 );
-                                                       j -= 1;
+                               }
+
+                               if ( registry[module].state === 'ready' ) {
+                                       // The current module became 'ready'. Recursively execute all dependent modules that are loaded
+                                       // and now have all dependencies satisfied.
+                                       for ( m in registry ) {
+                                               if ( registry[m].state === 'loaded' && allReady( registry[m].dependencies ) ) {
+                                                       execute( m );
                                                }
                                        }
-                                       throw e;
                                }
                        }
-       
+
                        /**
                         * Adds a script tag to the DOM, either using document.write or low-level DOM manipulation,
-                        * depending on whether document-ready has occured yet and whether we are in async mode.
+                        * depending on whether document-ready has occurred yet and whether we are in async mode.
                         *
                         * @param src String: URL to script, will be used as the src attribute in the script tag
                         * @param callback Function: Optional callback which will be run when the script is done
@@ -664,7 +736,7 @@ var mw = ( function ( $, undefined ) {
                                        if ( $.isFunction( callback ) ) {
                                                // Attach handlers for all browsers (based on jQuery.ajax)
                                                script.onload = script.onreadystatechange = function() {
-       
+
                                                        if (
                                                                !done
                                                                && (
@@ -672,11 +744,11 @@ var mw = ( function ( $, undefined ) {
                                                                        || /loaded|complete/.test( script.readyState )
                                                                )
                                                        ) {
-       
+
                                                                done = true;
-       
+
                                                                callback();
-       
+
                                                                // Handle memory leak in IE. This seems to fail in
                                                                // IE7 sometimes (Permission Denied error when
                                                                // accessing script.parentNode) so wrap it in
@@ -686,14 +758,14 @@ var mw = ( function ( $, undefined ) {
                                                                        if ( script.parentNode ) {
                                                                                script.parentNode.removeChild( script );
                                                                        }
-               
+
                                                                        // Dereference the script
                                                                        script = undefined;
                                                                } catch ( e ) { }
                                                        }
                                                };
                                        }
-                                       
+
                                        if ( window.opera ) {
                                                // Appending to the <head> blocks rendering completely in Opera,
                                                // so append to the <body> after document ready. This means the
@@ -718,15 +790,15 @@ var mw = ( function ( $, undefined ) {
                                        }
                                }
                        }
-       
+
                        /**
                         * Executes a loaded module, making it ready to use
                         *
                         * @param module string module name to execute
                         */
-                       function execute( module, callback ) {
+                       function execute( module ) {
                                var style, media, i, script, markModuleReady, nestedAddScript;
-       
+
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
                                } else if ( registry[module].state === 'registered' ) {
@@ -736,7 +808,7 @@ var mw = ( function ( $, undefined ) {
                                } else if ( registry[module].state === 'ready' ) {
                                        throw new Error( 'Module has already been loaded: ' + module );
                                }
-       
+
                                // Add styles
                                if ( $.isPlainObject( registry[module].style ) ) {
                                        // 'media' type ignored, see documentation of mw.loader.implement
@@ -765,9 +837,6 @@ var mw = ( function ( $, undefined ) {
                                        markModuleReady = function() {
                                                registry[module].state = 'ready';
                                                handlePending( module );
-                                               if ( $.isFunction( callback ) ) {
-                                                       callback();
-                                               }
                                        };
                                        nestedAddScript = function ( arr, callback, async, i ) {
                                                // Recursively call addScript() in its own callback
@@ -777,30 +846,28 @@ var mw = ( function ( $, undefined ) {
                                                        callback();
                                                        return;
                                                }
-       
+
                                                addScript( arr[i], function() {
                                                        nestedAddScript( arr, callback, async, i + 1 );
                                                }, async );
                                        };
-       
+
                                        if ( $.isArray( script ) ) {
                                                registry[module].state = 'loading';
                                                nestedAddScript( script, markModuleReady, registry[module].async, 0 );
                                        } else if ( $.isFunction( script ) ) {
-                                               script();
+                                               script( $ );
                                                markModuleReady();
                                        }
                                } catch ( e ) {
                                        // This needs to NOT use mw.log because these errors are common in production mode
                                        // and not in debug mode, such as when a symbol that should be global isn't exported
-                                       if ( window.console && typeof window.console.log === 'function' ) {
-                                               console.log( 'mw.loader::execute> Exception thrown by ' + module + ': ' + e.message );
-                                               console.log( e );
-                                       }
+                                       log('mw.loader::execute> Exception thrown by ' + module + ': ' + e.message, e);
                                        registry[module].state = 'error';
+                                       handlePending( module );
                                }
                        }
-       
+
                        /**
                         * Adds a dependencies to the queue with optional callbacks to be run
                         * when the dependencies are ready or fail
@@ -813,7 +880,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function request( dependencies, ready, error, async ) {
                                var regItemDeps, regItemDepLen, n;
-       
+
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
                                        dependencies = [dependencies];
@@ -855,7 +922,7 @@ var mw = ( function ( $, undefined ) {
                                // Work the queue
                                mw.loader.work();
                        }
-       
+
                        function sortQuery(o) {
                                var sorted = {}, key, a = [];
                                for ( key in o ) {
@@ -869,7 +936,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return sorted;
                        }
-       
+
                        /**
                         * Converts a module map of the form { foo: [ 'bar', 'baz' ], bar: [ 'baz, 'quux' ] }
                         * to a query string of the form foo.bar,baz|bar.baz,quux
@@ -882,7 +949,7 @@ var mw = ( function ( $, undefined ) {
                                }
                                return arr.join( '|' );
                        }
-       
+
                        /**
                         * Asynchronously append a script tag to the end of the body
                         * that invokes load.php
@@ -901,7 +968,7 @@ var mw = ( function ( $, undefined ) {
                                // Append &* to avoid triggering the IE6 extension check
                                addScript( sourceLoadScript + '?' + $.param( request ) + '&*', null, async );
                        }
-       
+
                        /* Public Methods */
                        return {
                                addStyleTag: addStyleTag,
@@ -914,7 +981,7 @@ var mw = ( function ( $, undefined ) {
                                                source, group, g, i, modules, maxVersion, sourceLoadScript,
                                                currReqBase, currReqBaseLength, moduleMap, l,
                                                lastDotIndex, prefix, suffix, bytesAdded, async;
-               
+
                                        // Build a list of request parameters common to all requests.
                                        reqBase = {
                                                skin: mw.config.get( 'skin' ),
@@ -924,7 +991,7 @@ var mw = ( function ( $, undefined ) {
                                        // Split module batch by source and by group.
                                        splits = {};
                                        maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', -1 );
-               
+
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q += 1 ) {
                                                // Only request modules which are registered
@@ -941,14 +1008,14 @@ var mw = ( function ( $, undefined ) {
                                        if ( !batch.length ) {
                                                return;
                                        }
-               
+
                                        // The queue has been processed into the batch, clear up the queue.
                                        queue = [];
-               
+
                                        // Always order modules alphabetically to help reduce cache
                                        // misses for otherwise identical content.
                                        batch.sort();
-               
+
                                        // Split batch by source and by group.
                                        for ( b = 0; b < batch.length; b += 1 ) {
                                                bSource = registry[batch[b]].source;
@@ -962,24 +1029,24 @@ var mw = ( function ( $, undefined ) {
                                                bSourceGroup = splits[bSource][bGroup];
                                                bSourceGroup[bSourceGroup.length] = batch[b];
                                        }
-               
+
                                        // Clear the batch - this MUST happen before we append any
                                        // script elements to the body or it's possible that a script
                                        // will be locally cached, instantly load, and work the batch
                                        // again, all before we've cleared it causing each request to
                                        // include modules which are already loaded.
                                        batch = [];
-               
+
                                        for ( source in splits ) {
-               
+
                                                sourceLoadScript = sources[source].loadScript;
-               
+
                                                for ( group in splits[source] ) {
-               
+
                                                        // Cache access to currently selected list of
                                                        // modules for this group from this source.
                                                        modules = splits[source][group];
-               
+
                                                        // Calculate the highest timestamp
                                                        maxVersion = 0;
                                                        for ( g = 0; g < modules.length; g += 1 ) {
@@ -987,16 +1054,20 @@ var mw = ( function ( $, undefined ) {
                                                                        maxVersion = registry[modules[g]].version;
                                                                }
                                                        }
-               
+
                                                        currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
+                                                       // For user modules append a user name to the request.
+                                                       if ( group === "user" && mw.config.get( 'wgUserName' ) !== null ) {
+                                                               currReqBase.user = mw.config.get( 'wgUserName' );
+                                                       }
                                                        currReqBaseLength = $.param( currReqBase ).length;
                                                        async = true;
                                                        // We may need to split up the request to honor the query string length limit,
                                                        // so build it piece by piece.
                                                        l = currReqBaseLength + 9; // '&modules='.length == 9
-               
+
                                                        moduleMap = {}; // { prefix: [ suffixes ] }
-               
+
                                                        for ( i = 0; i < modules.length; i += 1 ) {
                                                                // Determine how many bytes this module would add to the query string
                                                                lastDotIndex = modules[i].lastIndexOf( '.' );
@@ -1006,7 +1077,7 @@ var mw = ( function ( $, undefined ) {
                                                                bytesAdded = moduleMap[prefix] !== undefined
                                                                        ? suffix.length + 3 // '%2C'.length == 3
                                                                        : modules[i].length + 3; // '%7C'.length == 3
-               
+
                                                                // If the request would become too long, create a new one,
                                                                // but don't create empty requests
                                                                if ( maxQueryLength > 0 && !$.isEmptyObject( moduleMap ) && l + bytesAdded > maxQueryLength ) {
@@ -1036,7 +1107,7 @@ var mw = ( function ( $, undefined ) {
                                                }
                                        }
                                },
-               
+
                                /**
                                 * Register a source.
                                 *
@@ -1054,16 +1125,16 @@ var mw = ( function ( $, undefined ) {
                                                }
                                                return true;
                                        }
-               
+
                                        if ( sources[id] !== undefined ) {
                                                throw new Error( 'source already registered: ' + id );
                                        }
-               
+
                                        sources[id] = props;
-               
+
                                        return true;
                                },
-               
+
                                /**
                                 * Registers a module, letting the system know about it and its
                                 * properties. Startup modules contain calls to this function.
@@ -1114,7 +1185,7 @@ var mw = ( function ( $, undefined ) {
                                                registry[module].dependencies = dependencies;
                                        }
                                },
-               
+
                                /**
                                 * Implements a module, giving the system a course of action to take
                                 * upon loading. Results of a request for one or more modules contain
@@ -1156,21 +1227,19 @@ var mw = ( function ( $, undefined ) {
                                        if ( registry[module] !== undefined && registry[module].script !== undefined ) {
                                                throw new Error( 'module already implemented: ' + module );
                                        }
-                                       // Mark module as loaded
-                                       registry[module].state = 'loaded';
                                        // Attach components
                                        registry[module].script = script;
                                        registry[module].style = style;
                                        registry[module].messages = msgs;
-                                       // Execute or queue callback
-                                       if ( compare(
-                                               filter( ['ready'], registry[module].dependencies ),
-                                               registry[module].dependencies ) )
-                                       {
-                                               execute( module );
+                                       // The module may already have been marked as erroneous
+                                       if ( $.inArray( registry[module].state, ['error', 'missing'] ) === -1 ) {
+                                               registry[module].state = 'loaded';
+                                               if ( allReady( registry[module].dependencies ) ) {
+                                                       execute( module );
+                                               }
                                        }
                                },
-               
+
                                /**
                                 * Executes a function as soon as one or more required modules are ready
                                 *
@@ -1191,25 +1260,23 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        // Resolve entire dependency map
                                        dependencies = resolve( dependencies );
-                                       // If all dependencies are met, execute ready immediately
-                                       if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
+                                       if ( allReady( dependencies ) ) {
+                                               // Run ready immediately
                                                if ( $.isFunction( ready ) ) {
                                                        ready();
                                                }
-                                       }
-                                       // If any dependencies have errors execute error immediately
-                                       else if ( filter( ['error'], dependencies ).length ) {
+                                       } else if ( filter( ['error', 'missing'], dependencies ).length ) {
+                                               // Execute error immediately if any dependencies have errors
                                                if ( $.isFunction( error ) ) {
-                                                       error( new Error( 'one or more dependencies have state "error"' ),
+                                                       error( new Error( 'one or more dependencies have state "error" or "missing"' ),
                                                                dependencies );
                                                }
-                                       }
-                                       // Since some dependencies are not yet ready, queue up a request
-                                       else {
+                                       } else {
+                                               // Not all dependencies are ready: queue up a request
                                                request( dependencies, ready, error );
                                        }
                                },
-               
+
                                /**
                                 * Loads an external script or one or more modules for future use
                                 *
@@ -1224,7 +1291,7 @@ var mw = ( function ( $, undefined ) {
                                 *  be assumed if loading a URL, and false will be assumed otherwise.
                                 */
                                load: function ( modules, type, async ) {
-                                       var filtered, m;
+                                       var filtered, m, module;
 
                                        // Validate input
                                        if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
@@ -1263,26 +1330,31 @@ var mw = ( function ( $, undefined ) {
                                        // an array of unrelated modules, whereas the modules passed to
                                        // using() are related and must all be loaded.
                                        for ( filtered = [], m = 0; m < modules.length; m += 1 ) {
-                                               if ( registry[modules[m]] !== undefined ) {
-                                                       filtered[filtered.length] = modules[m];
+                                               module = registry[modules[m]];
+                                               if ( module !== undefined ) {
+                                                       if ( $.inArray( module.state, ['error', 'missing'] ) === -1 ) {
+                                                               filtered[filtered.length] = modules[m];
+                                                       }
                                                }
                                        }
 
+                                       if (filtered.length === 0) {
+                                               return;
+                                       }
                                        // Resolve entire dependency map
                                        filtered = resolve( filtered );
-                                       // If all modules are ready, nothing dependency be done
-                                       if ( compare( filter( ['ready'], filtered ), filtered ) ) {
+                                       // If all modules are ready, nothing to be done
+                                       if ( allReady( filtered ) ) {
                                                return;
                                        }
-                                       // If any modules have errors
-                                       if ( filter( ['error'], filtered ).length ) {
+                                       // If any modules have errors: also quit.
+                                       if ( filter( ['error', 'missing'], filtered ).length ) {
                                                return;
                                        }
-                                       // Since some modules are not yet ready, queue up a request
+                                       // Since some modules are not yet ready, queue up a request.
                                        request( filtered, null, null, async );
-                                       return;
                                },
-               
+
                                /**
                                 * Changes the state of a module
                                 *
@@ -1291,6 +1363,7 @@ var mw = ( function ( $, undefined ) {
                                 */
                                state: function ( module, state ) {
                                        var m;
+
                                        if ( typeof module === 'object' ) {
                                                for ( m in module ) {
                                                        mw.loader.state( m, module[m] );
@@ -1300,9 +1373,17 @@ var mw = ( function ( $, undefined ) {
                                        if ( registry[module] === undefined ) {
                                                mw.loader.register( module );
                                        }
-                                       registry[module].state = state;
+                                       if ( $.inArray(state, ['ready', 'error', 'missing']) !== -1
+                                               && registry[module].state !== state ) {
+                                               // Make sure pending modules depending on this one get executed if their
+                                               // dependencies are now fulfilled!
+                                               registry[module].state = state;
+                                               handlePending( module );
+                                       } else {
+                                               registry[module].state = state;
+                                       }
                                },
-               
+
                                /**
                                 * Gets the version of a module
                                 *
@@ -1314,14 +1395,14 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        return null;
                                },
-               
+
                                /**
                                 * @deprecated since 1.18 use mw.loader.getVersion() instead
                                 */
                                version: function () {
                                        return mw.loader.getVersion.apply( mw.loader, arguments );
                                },
-               
+
                                /**
                                 * Gets the state of a module
                                 *
@@ -1333,7 +1414,7 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        return null;
                                },
-               
+
                                /**
                                 * Get names of all registered modules.
                                 *
@@ -1344,7 +1425,7 @@ var mw = ( function ( $, undefined ) {
                                                return key;
                                        } );
                                },
-               
+
                                /**
                                 * For backwards-compatibility with Squid-cached pages. Loads mw.user
                                 */
@@ -1353,7 +1434,7 @@ var mw = ( function ( $, undefined ) {
                                }
                        };
                }() ),
-       
+
                /** HTML construction helper functions */
                html: ( function () {
                        function escapeCallback( s ) {
@@ -1379,7 +1460,7 @@ var mw = ( function ( $, undefined ) {
                                escape: function ( s ) {
                                        return s.replace( /['"<>&]/g, escapeCallback );
                                },
-               
+
                                /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
                                 * @constructor
@@ -1387,7 +1468,7 @@ var mw = ( function ( $, undefined ) {
                                Raw: function ( value ) {
                                        this.value = value;
                                },
-               
+
                                /**
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
                                 * @constructor
@@ -1395,7 +1476,7 @@ var mw = ( function ( $, undefined ) {
                                Cdata: function ( value ) {
                                        this.value = value;
                                },
-               
+
                                /**
                                 * Create an HTML element string, with safe escaping.
                                 *
@@ -1417,7 +1498,7 @@ var mw = ( function ( $, undefined ) {
                                 */
                                element: function ( name, attrs, contents ) {
                                        var v, attrName, s = '<' + name;
-               
+
                                        for ( attrName in attrs ) {
                                                v = attrs[attrName];
                                                // Convert name=true, to name=name
@@ -1472,7 +1553,7 @@ var mw = ( function ( $, undefined ) {
                        tokens: new Map()
                }
        };
-       
+
 }( jQuery ) );
 
 // Alias $j to jQuery for backwards compatibility
index 92610b9..9202d2e 100644 (file)
                 * Get address to a script in the wiki root.
                 * For index.php use mw.config.get( 'wgScript' )
                 *
+                * @since 1.18
                 * @param str string Name of script (eg. 'api'), defaults to 'index'
                 * @return string Address to script (eg. '/w/api.php' )
                 */
                        // Get last match, stop at hash
                        var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
                                m = re.exec( url );
-                       if ( m && m.length > 1 ) {
+                       if ( m ) {
                                // Beware that decodeURIComponent is not required to understand '+'
                                // by spec, as encodeURIComponent does not produce it.
                                return decodeURIComponent( m[1].replace( /\+/g, '%20' ) );
diff --git a/skins/Chick.deps.php b/skins/Chick.deps.php
deleted file mode 100644 (file)
index a7cb084..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// Chick.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
-require_once( dirname(__FILE__) . '/MonoBook.php' );
-
index 2362263..54dada3 100644 (file)
@@ -3,6 +3,21 @@
  * Chick: A lightweight Monobook skin with no sidebar, the sidebar links are
  * given at the bottom of the page instead, as in the unstyled MySkin.
  *
+ * 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 Skins
  */
@@ -10,9 +25,6 @@
 if( !defined( 'MEDIAWIKI' ) )
        die( -1 );
 
-/** */
-require_once( dirname(__FILE__) . '/MonoBook.php' );
-
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
  * @ingroup Skins
index c5b3b11..214d9bc 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Cologne Blue: A nicer-looking alternative to Standard.
  *
+ * 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
+ *
  * @todo document
  * @file
  * @ingroup Skins
diff --git a/skins/Modern.deps.php b/skins/Modern.deps.php
deleted file mode 100644 (file)
index e76ab99..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// Modern.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php' );
-
index ebd574f..1656524 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Modern skin, derived from monobook template.
  *
+ * 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
+ *
  * @todo document
  * @file
  * @ingroup Skins
@@ -10,8 +25,6 @@
 if( !defined( 'MEDIAWIKI' ) )
        die( -1 );
 
-require( dirname(__FILE__) . '/MonoBook.php' );
-
 /**
  * Inherit main code from SkinTemplate, set the CSS and template filter.
  * @todo document
diff --git a/skins/MonoBook.deps.php b/skins/MonoBook.deps.php
deleted file mode 100644 (file)
index dda24e0..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// MonoBook.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
-
index 857db0f..8282fb3 100644 (file)
@@ -1,10 +1,25 @@
 <?php
 /**
- * MonoBook nouveau
+ * MonoBook nouveau.
  *
  * Translated from gwicke's previous TAL template version to remove
  * dependency on PHPTAL.
  *
+ * 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
+ *
  * @todo document
  * @file
  * @ingroup Skins
diff --git a/skins/MySkin.deps.php b/skins/MySkin.deps.php
deleted file mode 100644 (file)
index b589cc5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// MySkin.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
-require_once( dirname(__FILE__) . '/MonoBook.php' );
-
index 8859a71..fb49b88 100644 (file)
@@ -1,7 +1,22 @@
 <?php
 /**
  * MySkin: Monobook without the CSS. The idea is that you
- * customise it using user or site CSS
+ * customise it using user or site 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
  * @ingroup Skins
index 21d3578..98437e2 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * Nostalgia: A skin which looks like Wikipedia did in its first year (2001).
  *
+ * 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 Skins
  */
diff --git a/skins/Simple.deps.php b/skins/Simple.deps.php
deleted file mode 100644 (file)
index 99fadc6..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// Simple.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
-require_once( dirname(__FILE__) . '/MonoBook.php' );
-
index 0e1668b..d06bdfd 100644 (file)
@@ -3,6 +3,21 @@
  * Simple: A lightweight skin with a simple white-background sidebar and no
  * top bar.
  *
+ * 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 Skins
  */
diff --git a/skins/Vector.deps.php b/skins/Vector.deps.php
deleted file mode 100644 (file)
index 7a8c288..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-// This file exists to ensure that base classes are preloaded before
-// MonoBook.php is compiled, working around a bug in the APC opcode
-// cache on PHP 5, where cached code can break if the include order
-// changed on a subsequent page view.
-// see http://lists.wikimedia.org/pipermail/wikitech-l/2006-January/021311.html
-
-if ( ! defined( 'MEDIAWIKI' ) )
-       die( 1 );
-
-require_once( dirname( dirname( __FILE__ ) ) . '/includes/SkinTemplate.php');
index d1b51a6..6ac3f08 100644 (file)
@@ -3,6 +3,21 @@
  * Vector - Modern version of MonoBook with fresh look and many usability
  * improvements.
  *
+ * 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
+ *
  * @todo document
  * @file
  * @ingroup Skins
@@ -18,6 +33,8 @@ if( !defined( 'MEDIAWIKI' ) ) {
  */
 class SkinVector extends SkinTemplate {
 
+       protected static $bodyClasses = array( 'vector-animateLayout' );
+
        var $skinname = 'vector', $stylename = 'vector',
                $template = 'VectorTemplate', $useHeadElement = true;
 
@@ -52,6 +69,20 @@ class SkinVector extends SkinTemplate {
                parent::setupSkinUserCss( $out );
                $out->addModuleStyles( 'skins.vector' );
        }
+
+       /**
+        * Adds classes to the body element.
+        * 
+        * @param $out OutputPage object
+        * @param &$bodyAttrs Array of attributes that will be set on the body element
+        */
+       function addToBodyAttributes( $out, &$bodyAttrs ) {
+               if ( isset( $bodyAttrs['class'] ) && strlen( $bodyAttrs['class'] ) > 0 ) {
+                       $bodyAttrs['class'] .= ' ' . implode( ' ', static::$bodyClasses );
+               } else {
+                       $bodyAttrs['class'] = implode( ' ', static::$bodyClasses );
+               }
+       }
 }
 
 /**
@@ -134,9 +165,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 ba689b0..5e2a2e7 100644 (file)
@@ -151,7 +151,7 @@ q {
        font-style: italic;
 }
 code { background-color: #f9f9f9; }
-pre {
+pre, .mw-code {
        padding: 1em;
        border: 1px dashed #2f6fab;
        color: black;
index cf8ca12..57b5410 100644 (file)
@@ -52,7 +52,7 @@ body {
        margin-bottom: 0;
 }
 
-p, pre, td, th, li, dd, dt {
+p, pre, .mw-code, td, th, li, dd, dt {
        line-height: 12pt;
 }
 
index df50e05..02fd29f 100644 (file)
@@ -79,7 +79,6 @@ h6 {
        padding-top: .5em;
        padding-bottom: .17em;
        border-bottom: 1px solid #aaa;
-       width: auto;
 }
 h1 {
        font-size: 188%;
@@ -184,7 +183,7 @@ blockquote {
        font-family: Times, "Times New Roman", serif;
        font-style: italic;
 }*/
-pre, code, tt, kbd, samp {
+pre, code, tt, kbd, samp, .mw-code {
        /*
         * Some browsers will render the monospace text too small, namely Firefox, Chrome and Safari.
         * Specifying any valid, second value will trigger correct behaviour without forcing a different font.
@@ -194,7 +193,7 @@ pre, code, tt, kbd, samp {
 code {
        background-color: #f9f9f9;
 }
-pre {
+pre, .mw-code {
        padding: 1em;
        border: 1px dashed #2f6fab;
        color: black;
index 3e3b50b..cf602ea 100644 (file)
@@ -158,7 +158,7 @@ p {
        line-height: 1.2em;
 }
 
-pre {
+pre, .mw-code {
        border: 1pt dashed black;
        white-space: pre;
        font-size: 8pt;
index 08296a9..bc67a4b 100644 (file)
Binary files a/skins/common/images/Arr_.png and b/skins/common/images/Arr_.png differ
index 5fc956d..e524f6c 100644 (file)
Binary files a/skins/common/images/ar/button_bold.png and b/skins/common/images/ar/button_bold.png differ
index 4888e73..c9c63f6 100644 (file)
Binary files a/skins/common/images/ar/button_link.png and b/skins/common/images/ar/button_link.png differ
index 5283179..12b986b 100644 (file)
Binary files a/skins/common/images/ar/button_nowiki.png and b/skins/common/images/ar/button_nowiki.png differ
index d02aeee..5c10cfe 100644 (file)
Binary files a/skins/common/images/be-tarask/button_bold.png and b/skins/common/images/be-tarask/button_bold.png differ
index 26e0192..19e4ad4 100644 (file)
Binary files a/skins/common/images/button_hr.png and b/skins/common/images/button_hr.png differ
index 24e0095..ff7348a 100644 (file)
Binary files a/skins/common/images/button_sig.png and b/skins/common/images/button_sig.png differ
index 51951c6..53b6f92 100644 (file)
Binary files a/skins/common/images/button_template.png and b/skins/common/images/button_template.png differ
index cd262c4..990702e 100644 (file)
Binary files a/skins/common/images/closewindow.png and b/skins/common/images/closewindow.png differ
index 348e548..c96d9ff 100644 (file)
Binary files a/skins/common/images/closewindow19x19.png and b/skins/common/images/closewindow19x19.png differ
index 3c2666e..b958d22 100644 (file)
Binary files a/skins/common/images/cyrl/button_italic.png and b/skins/common/images/cyrl/button_italic.png differ
index 4008cb9..33f91ed 100644 (file)
Binary files a/skins/common/images/fa/button_italic.png and b/skins/common/images/fa/button_italic.png differ
index 5283179..12b986b 100644 (file)
Binary files a/skins/common/images/fa/button_nowiki.png and b/skins/common/images/fa/button_nowiki.png differ
index af869d2..cd657c3 100644 (file)
Binary files a/skins/common/images/nextredirectltr.png and b/skins/common/images/nextredirectltr.png differ
index c9bf355..b788f33 100644 (file)
Binary files a/skins/common/images/nextredirectrtl.png and b/skins/common/images/nextredirectrtl.png differ
index 96a2e9a..ba5718a 100644 (file)
Binary files a/skins/common/images/tooltip_icon.png and b/skins/common/images/tooltip_icon.png differ
index 3b3cf81..ee46a50 100644 (file)
Binary files a/skins/modern/document.png and b/skins/modern/document.png differ
index dfc8e62..72b8724 100644 (file)
Binary files a/skins/modern/footer-grad.png and b/skins/modern/footer-grad.png differ
index 5d6eb0b..7149551 100644 (file)
@@ -811,7 +811,7 @@ span.subpages {
        display: block;
 }
 
-pre {
+pre, .mw-code {
        border: solid 1px #3c78b5;
        padding: 0.4em;
        background-color: #f0f0f0;
index b8f5abb..4d3cb47 100644 (file)
Binary files a/skins/modern/news_icon.png and b/skins/modern/news_icon.png differ
index dff165e..e535c0c 100644 (file)
Binary files a/skins/modern/video.png and b/skins/modern/video.png differ
index 3b3cf81..ee46a50 100644 (file)
Binary files a/skins/monobook/document.png and b/skins/monobook/document.png differ
index 868d32e..2fe259e 100644 (file)
@@ -83,7 +83,7 @@ input.historysubmit {
        margin-left: 1.6em;
 }
 
-pre {
+pre, .mw-code {
        line-height: 1.1em;
 }
 
index b8f5abb..4d3cb47 100644 (file)
Binary files a/skins/monobook/news_icon.png and b/skins/monobook/news_icon.png differ
index 3286583..d86dbe0 100644 (file)
Binary files a/skins/monobook/video.png and b/skins/monobook/video.png differ
index dbcf199..7b4f2ae 100644 (file)
@@ -215,7 +215,7 @@ textarea {
        margin-left: 0.5em;
 }
 
-pre {
+pre, .mw-code {
        margin: 2em;
        border: solid 1px black;
 }
index f500c9e..7640bd1 100644 (file)
Binary files a/skins/vector/images/arrow-down-focus-icon.png and b/skins/vector/images/arrow-down-focus-icon.png differ
index 255c7d1..12e3b93 100644 (file)
Binary files a/skins/vector/images/arrow-down-icon.png and b/skins/vector/images/arrow-down-icon.png differ
index b32678f..5a1d2f4 100644 (file)
Binary files a/skins/vector/images/audio-icon.png and b/skins/vector/images/audio-icon.png differ
index 0cf02db..f9ca8cc 100644 (file)
Binary files a/skins/vector/images/border.png and b/skins/vector/images/border.png differ
index bd429c2..7bae98f 100644 (file)
Binary files a/skins/vector/images/bullet-icon.png and b/skins/vector/images/bullet-icon.png differ
index 9148bdb..b70efaa 100644 (file)
Binary files a/skins/vector/images/link-icon.png and b/skins/vector/images/link-icon.png differ
index 5fa9e82..a9ba8a7 100644 (file)
Binary files a/skins/vector/images/lock-icon.png and b/skins/vector/images/lock-icon.png differ
index 16002f7..9823d72 100644 (file)
Binary files a/skins/vector/images/mail-icon.png and b/skins/vector/images/mail-icon.png differ
index 4ca31da..b3ecd30 100644 (file)
Binary files a/skins/vector/images/page-base.png and b/skins/vector/images/page-base.png differ
index b93c027..1436cda 100644 (file)
Binary files a/skins/vector/images/page-fade.png and b/skins/vector/images/page-fade.png differ
index 3ef0b26..90c3918 100644 (file)
Binary files a/skins/vector/images/portal-break.png and b/skins/vector/images/portal-break.png differ
index 696135b..8e0082b 100644 (file)
Binary files a/skins/vector/images/preferences-base.png and b/skins/vector/images/preferences-base.png differ
index 7e25a05..e59f578 100644 (file)
Binary files a/skins/vector/images/preferences-break.png and b/skins/vector/images/preferences-break.png differ
index 7963b76..411a1aa 100644 (file)
Binary files a/skins/vector/images/preferences-edge.png and b/skins/vector/images/preferences-edge.png differ
index 3996fb4..638084d 100644 (file)
Binary files a/skins/vector/images/preferences-fade.png and b/skins/vector/images/preferences-fade.png differ
index 140feae..6cb7d28 100644 (file)
Binary files a/skins/vector/images/search-fade.png and b/skins/vector/images/search-fade.png differ
index d6eabd5..b8f772f 100644 (file)
Binary files a/skins/vector/images/tab-current-fade.png and b/skins/vector/images/tab-current-fade.png differ
index 1bedd33..57f9f8d 100644 (file)
Binary files a/skins/vector/images/user-icon.png and b/skins/vector/images/user-icon.png differ
index 1ec8456..e934a0f 100644 (file)
Binary files a/skins/vector/images/video-icon.png and b/skins/vector/images/video-icon.png differ
diff --git a/skins/vector/screen-hd.css b/skins/vector/screen-hd.css
new file mode 100644 (file)
index 0000000..b90fd63
--- /dev/null
@@ -0,0 +1,28 @@
+/* Vector screen styles for high definition displays */
+
+div#content {
+       margin-left: 11em;
+       padding: 1.25em 1.5em 1.5em 1.5em;
+}
+#p-logo {
+       left: 0.5em;
+}
+div#footer {
+       margin-left: 11em;
+       padding: 1.25em;
+}
+#mw-panel {
+       padding-left: 0.5em;
+}
+#p-search {
+       margin-right: 1em;
+}
+#left-navigation {
+       left: 11em;
+}
+#p-personal {
+       right: 1em;
+}
+#mw-head-base {
+       margin-left: 11em;
+}
index d48b5f8..32a6489 100644 (file)
@@ -72,7 +72,7 @@ div.emptyPortlet {
 /* Personal */
 #p-personal {
        position: absolute;
-       top: 0;
+       top: 0.33em;
        right: 0.75em;
 }
 #p-personal h5 {
@@ -652,7 +652,7 @@ div#footer #footer-places li {
        padding-left: 0.5em;
        padding-right: 0.5em;
 }
-#preferences td.htmlform-tip {
+.htmlform-tip {
        font-size: x-small;
        padding: .2em 2em;
        color: #666666;
@@ -683,7 +683,7 @@ ul {
        list-style-image: url(images/bullet-icon.png);
 }
 
-pre {
+pre, .mw-code {
        line-height: 1.3em;
 }
 
@@ -844,3 +844,44 @@ div.vectorTabs ul {
 .tipsy {
        font-size: 0.8em;
 }
+
+/* Animate between standard and high definition layouts */
+
+body.vector-animateLayout div#content,
+body.vector-animateLayout div#footer {
+       transition: margin-left 250ms, padding 250ms;
+       -moz-transition: margin-left 250ms, padding 250ms;
+       -webkit-transition: margin-left 250ms, padding 250ms;
+       -o-transition: margin-left 250ms, padding 250ms;
+}
+body.vector-animateLayout #p-logo,
+body.vector-animateLayout #left-navigation {
+       transition: left 250ms;
+       -moz-transition: left 250ms;
+       -webkit-transition: left 250ms;
+       -o-transition: left 250ms;
+}
+body.vector-animateLayout #mw-panel {
+       transition: padding-left 250ms;
+       -moz-transition: padding-left 250ms;
+       -webkit-transition: padding-left 250ms;
+       -o-transition: padding-left 250ms;
+}
+body.vector-animateLayout #p-search {
+       transition: margin-right 250ms;
+       -moz-transition: margin-right 250ms;
+       -webkit-transition: margin-right 250ms;
+       -o-transition: margin-right 250ms;
+}
+body.vector-animateLayout #p-personal {
+       transition: right 250ms;
+       -moz-transition: right 250ms;
+       -webkit-transition: right 250ms;
+       -o-transition: right 250ms;
+}
+body.vector-animateLayout #mw-head-base {
+       transition: margin-left 250ms;
+       -moz-transition: margin-left 250ms;
+       -webkit-transition: margin-left 250ms;
+       -o-transition: margin-left 250ms;
+}
index 2ea4924..3125284 100644 (file)
@@ -28,6 +28,7 @@ $wgAutoloadClasses += array(
 
        //maintenance
        'DumpTestCase' => "$testFolder/phpunit/maintenance/DumpTestCase.php",
+       'BackupDumper' => "$testFolder/../maintenance/backup.inc",
 
        //Generic providers
        'MediaWikiProvide' => "$testFolder/phpunit/includes/Providers.php",
index 6af9b0c..63d0fdf 100644 (file)
@@ -1,42 +1,28 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-  "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-  <title>Jasmine Test Runner</title>
-  <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
-  <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine.js"></script>
-  <script type="text/javascript" src="lib/jasmine-1.0.1/jasmine-html.js"></script>
+<!DOCTYPE html>
+<html lang="en" dir="ltr">
+       <head>
+               <title>Jasmine Test Runner</title>
+               <meta charset="UTF-8" />
+               <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
+               <script src="lib/jasmine-1.0.1/jasmine.js"></script>
+               <script src="lib/jasmine-1.0.1/jasmine-html.js"></script>
 
-  <!-- include source files here... -->
-  <script type="text/javascript" src="../../load.php?debug=true&lang=en&modules=jquery%7Cmediawiki&only=scripts&skin=vector"></script>
-  
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.js"></script>
+               <!-- include source files here... -->
+               <script src="../../load.php?debug=true&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*"></script>
+               <script>
+               mw.loader.load( ['mediawiki.jqueryMsg'] );
+               </script>
 
-  <script type="text/javascript" src="../../resources/mediawiki.language/mediawiki.language.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.jqueryMsg.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.Uri.js"></script>
-<!--
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.js"></script>
-  <script type="text/javascript" src="../../resources/mediawiki/mediawiki.api.edit.js"></script>
--->
+               <!-- insert test data files here -->
+               <script src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
 
-  <!-- insert test data files here -->
-  <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
-
-  <!-- include spec files here... -->
-  <script type="text/javascript" src="spec/mediawiki.Uri.spec.js"></script>
-  <!-- 
-       <script type="text/javascript" src="spec/mw.Api.spec.js"></script>
-    <script type="text/javascript" src="spec/mw.Api.edit.spec.js"></script>
-  -->
-  <script type="text/javascript" src="spec/mediawiki.jqueryMsg.spec.js"></script>
-</head>
+               <!-- include spec files here... -->
+               <script src="spec/mediawiki.jqueryMsg.spec.js"></script>
+       </head>
 <body>
-<script type="text/javascript">
-  jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
-  jasmine.getEnv().execute();
-</script>
-
+       <script>
+               jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
+               jasmine.getEnv().execute();
+       </script>
 </body>
 </html>
diff --git a/tests/jasmine/spec/mediawiki.Uri.spec.js b/tests/jasmine/spec/mediawiki.Uri.spec.js
deleted file mode 100644 (file)
index e396ab3..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-( function() {
-
-       // ensure we have a generic URI parser if not running in a browser
-       if ( !mw.Uri ) {
-               mw.Uri = mw.UriRelative( 'http://example.com/' );
-       }
-
-       describe( "mw.Uri", function() {
-
-               describe( "should work well in loose and strict mode", function() {
-
-                       function basicTests( strict ) {
-                       
-                               describe( "should parse a simple HTTP URI correctly", function() { 
-
-                                       var uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
-                                       var uri;
-                                       if ( strict ) {
-                                               uri = new mw.Uri( uriString, strict );
-                                       } else {
-                                               uri = new mw.Uri( uriString );
-                                       }
-
-                                       it( "should have basic object properties", function() {
-                                               expect( uri.protocol ).toEqual( 'http' );
-                                               expect( uri.host ).toEqual( 'www.ietf.org' );
-                                               expect( uri.port ).not.toBeDefined();
-                                               expect( uri.path ).toEqual( '/rfc/rfc2396.txt' );
-                                               expect( uri.query ).toEqual( {} );
-                                               expect( uri.fragment ).not.toBeDefined();
-                                       } );
-
-                                       describe( "should construct composite components of URI on request", function() { 
-                                               it( "should have empty userinfo", function() { 
-                                                       expect( uri.getUserInfo() ).toEqual( '' );
-                                               } );
-
-                                               it( "should have authority equal to host", function() { 
-                                                       expect( uri.getAuthority() ).toEqual( 'www.ietf.org' );
-                                               } );
-
-                                               it( "should have hostport equal to host", function() { 
-                                                       expect( uri.getHostPort() ).toEqual( 'www.ietf.org' );
-                                               } );
-
-                                               it( "should have empty string as query string", function() { 
-                                                       expect( uri.getQueryString() ).toEqual( '' );
-                                               } );
-
-                                               it( "should have path as relative path", function() { 
-                                                       expect( uri.getRelativePath() ).toEqual( '/rfc/rfc2396.txt' );
-                                               } );
-
-                                               it( "should return a uri string equivalent to original", function() { 
-                                                       expect( uri.toString() ).toEqual( uriString );
-                                               } );
-                                       } );
-                               } );
-                       }
-
-                       describe( "should work in loose mode", function() { 
-                               basicTests( false );
-                       } );
-
-                       describe( "should work in strict mode", function() {
-                               basicTests( true );
-                       } );
-
-               } );
-
-               it( "should parse a simple ftp URI correctly with user and password", function() {
-                       var uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
-                       expect( uri.protocol ).toEqual( 'ftp' );
-                       expect( uri.user ).toEqual( 'usr' );
-                       expect( uri.password ).toEqual( 'pwd' );
-                       expect( uri.host ).toEqual( '192.0.2.16' );
-                       expect( uri.port ).not.toBeDefined();
-                       expect( uri.path ).toEqual( '/' );
-                       expect( uri.query ).toEqual( {} );
-                       expect( uri.fragment ).not.toBeDefined();
-               } );
-
-               it( "should parse a simple querystring", function() {
-                       var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
-                       expect( uri.protocol ).toEqual( 'http' );
-                       expect( uri.host ).toEqual( 'www.google.com' );
-                       expect( uri.port ).not.toBeDefined();
-                       expect( uri.path ).toEqual( '/' );
-                       expect( uri.query ).toBeDefined();
-                       expect( uri.query ).toEqual( { q: 'uri' } );
-                       expect( uri.fragment ).not.toBeDefined();
-                       expect( uri.getQueryString() ).toEqual( 'q=uri' );
-               } );
-
-               describe( "should handle multiple value query args (overrideKeys on)", function() {
-                       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: true } );
-                       it ( "should parse with multiple values", function() {
-                               expect( uri.query.m ).toEqual( 'bar' );
-                               expect( uri.query.n ).toEqual( '1' );
-                       } );
-                       it ( "should accept multiple values", function() {
-                               uri.query.n = [ "x", "y", "z" ];
-                               expect( uri.toString() ).toContain( 'm=bar' );
-                               expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
-                               expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length );
-                       } );
-               } );
-
-               describe( "should handle multiple value query args (overrideKeys off)", function() {
-                       var uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', { overrideKeys: false } );
-                       it ( "should parse with multiple values", function() {
-                               expect( uri.query.m.length ).toEqual( 2 );
-                               expect( uri.query.m[0] ).toEqual( 'foo' );
-                               expect( uri.query.m[1] ).toEqual( 'bar' );
-                               expect( uri.query.n ).toEqual( '1' );
-                       } );
-                       it ( "should accept multiple values", function() {
-                               uri.query.n = [ "x", "y", "z" ];
-                               expect( uri.toString() ).toContain( 'm=foo&m=bar' );
-                               expect( uri.toString() ).toContain( 'n=x&n=y&n=z' );
-                               expect( uri.toString().length ).toEqual( 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length );
-                       } );
-                       it ( "should be okay with removing values", function() {
-                               uri.query.m.splice( 0, 1 );
-                               delete uri.query.n;
-                               expect( uri.toString() ).toEqual( 'http://www.example.com/dir/?m=bar' );
-                               uri.query.m.splice( 0, 1 );
-                               expect( uri.toString() ).toEqual( 'http://www.example.com/dir/' );
-                       } );
-               } );
-
-               describe( "should deal with an all-dressed URI with everything", function() {
-                       var uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
-
-                       it( "should have basic object properties", function() {
-                               expect( uri.protocol ).toEqual( 'http' );
-                               expect( uri.user ).toEqual( 'auth' );
-                               expect( uri.password ).not.toBeDefined();
-                               expect( uri.host ).toEqual( 'www.example.com' );
-                               expect( uri.port ).toEqual( '81' );
-                               expect( uri.path ).toEqual( '/dir/dir.2/index.htm' );
-                               expect( uri.query ).toEqual( { q1: '0', test1: null, test2: 'value (escaped)' } );
-                               expect( uri.fragment ).toEqual( 'top' );
-                       } );
-
-                       describe( "should construct composite components of URI on request", function() { 
-                               it( "should have userinfo", function() { 
-                                       expect( uri.getUserInfo() ).toEqual( 'auth' );
-                               } );
-
-                               it( "should have authority equal to auth@hostport", function() { 
-                                       expect( uri.getAuthority() ).toEqual( 'auth@www.example.com:81' );
-                               } );
-
-                               it( "should have hostport equal to host:port", function() { 
-                                       expect( uri.getHostPort() ).toEqual( 'www.example.com:81' );
-                               } );
-
-                               it( "should have query string which contains all components", function() { 
-                                       var queryString = uri.getQueryString();
-                                       expect( queryString ).toContain( 'q1=0' );
-                                       expect( queryString ).toContain( 'test1' );
-                                       expect( queryString ).not.toContain( 'test1=' );
-                                       expect( queryString ).toContain( 'test2=value+%28escaped%29' );
-                               } );
-
-                               it( "should have path as relative path", function() { 
-                                       expect( uri.getRelativePath() ).toContain( uri.path );
-                                       expect( uri.getRelativePath() ).toContain( uri.getQueryString() );
-                                       expect( uri.getRelativePath() ).toContain( uri.fragment );
-                               } );
-
-                       } );
-               } );
-
-               describe( "should be able to clone itself", function() {
-                       var original = new mw.Uri( 'http://en.wiki.local/w/api.php?action=query&foo=bar' );                     
-                       var clone = original.clone();
-
-                       it( "should make clones equivalent", function() { 
-                               expect( original ).toEqual( clone );
-                               expect( original.toString() ).toEqual( clone.toString() );
-                       } );
-
-                       it( "should be able to manipulate clones independently", function() { 
-                               // but they are still different objects
-                               expect( original ).not.toBe( clone );
-                               // and can diverge
-                               clone.host = 'fr.wiki.local';
-                               expect( original.host ).not.toEqual( clone.host );
-                               expect( original.toString() ).not.toEqual( clone.toString() );
-                       } );
-               } );
-
-               describe( "should be able to construct URL from object", function() {
-                       it ( "should construct given basic arguments", function() {  
-                               var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local',  path: '/this' } );
-                               expect( uri.toString() ).toEqual( 'http://www.foo.local/this' );
-                       } );
-               
-                       it ( "should construct given more complex arguments", function() {  
-                               var uri = new mw.Uri( { 
-                                       protocol: 'http', 
-                                       host: 'www.foo.local',  
-                                       path: '/this', 
-                                       query: { hi: 'there' },
-                                       fragment: 'blah'  
-                               } );
-                               expect( uri.toString() ).toEqual( 'http://www.foo.local/this?hi=there#blah' );
-                       } );    
-
-                       it ( "should fail to construct without required properties", function() {  
-                               expect( function() { 
-                                       var uri = new mw.Uri( { protocol: 'http', host: 'www.foo.local' } );
-                               } ).toThrow( "Bad constructor arguments" );
-                       } );
-               } );
-
-               describe( "should be able to manipulate properties", function() { 
-                       var uri;
-
-                       beforeEach( function() { 
-                               uri = new mw.Uri( 'http://en.wiki.local/w/api.php' );                   
-                       } );
-
-                       it( "can add a fragment", function() {
-                               uri.fragment = 'frag';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php#frag' );
-                       } );
-
-                       it( "can change host and port", function() {
-                               uri.host = 'fr.wiki.local';
-                               uri.port = '8080';
-                               expect( uri.toString() ).toEqual( 'http://fr.wiki.local:8080/w/api.php' );
-                       } );
-
-                       it ( "can add query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
-                       } );
-
-                       it ( "can extend query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );
-                               uri.extend( { foo: 'quux', pif: 'paf' } );
-                               expect( uri.toString() ).toContain( 'foo=quux' );
-                               expect( uri.toString() ).not.toContain( 'foo=bar' );
-                               expect( uri.toString() ).toContain( 'pif=paf' );
-                       } );
-
-                       it ( "can remove query arguments", function() {
-                               uri.query.foo = 'bar';
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php?foo=bar' );   
-                               delete( uri.query.foo );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/w/api.php' );   
-                       } );
-
-               } );
-
-               describe( "should handle protocol-relative URLs", function() { 
-                       var uriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
-
-                       it ( "should create protocol-relative URLs with same protocol as document", function() {
-                               var uri = new uriRel( '//en.wiki.local/w/api.php' );
-                               expect( uri.protocol ).toEqual( 'glork' );
-                       } );
-
-                       it( "should handle absolute paths by supplying protocol and host from document in loose mode", function() {
-                               var uri = new uriRel( '/foo.com' );
-                               expect( uri.toString() ).toEqual( 'glork://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying host from document in loose mode", function() {
-                               var uri = new uriRel( 'http:/foo.com' );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying protocol and host from document in strict mode", function() {
-                               var uri = new uriRel( '/foo.com', true );
-                               expect( uri.toString() ).toEqual( 'glork://en.wiki.local/foo.com' );
-                       } );
-
-                       it( "should handle absolute paths by supplying host from document in strict mode", function() {
-                               var uri = new uriRel( 'http:/foo.com', true );
-                               expect( uri.toString() ).toEqual( 'http://en.wiki.local/foo.com' );
-                       } );
-               } );
-
-               it( "should throw error on no arguments to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri();
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on empty string as argument to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( '' );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on non-URI as argument to constructor", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( 'glaswegian penguins' );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should throw error on URI without protocol or // or leading / in strict mode", function() {
-                       expect( function() { 
-                               var uri = new mw.Uri( 'foo.com/bar/baz', true );
-                       } ).toThrow( "Bad constructor arguments" );
-               } );
-
-               it( "should normalize URI without protocol or // in loose mode", function() {
-                       var uri = new mw.Uri( 'foo.com/bar/baz', false );
-                       expect( uri.toString() ).toEqual( 'http://foo.com/bar/baz' );
-               } );
-
-       } );
-
-} )();
index 1f0cf87..f0ec2e5 100644 (file)
@@ -134,6 +134,285 @@ Italics and bold
 
 !! end
 
+###
+### 2-quote opening sequence tests
+###
+!! test
+Italics and bold: 2-quote opening sequence: (2,2)
+!! input
+''foo''
+!! result
+<p><i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,3)
+!! input
+''foo'''
+!! result
+<p><i>foo'</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,4)
+!! input
+''foo''''
+!! result
+<p><i>foo''</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 2-quote opening sequence: (2,5)
+!! input
+''foo'''''
+!! result
+<p><i>foo</i>
+</p>
+!!end
+
+
+###
+### 3-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,2)
+!! input
+'''foo''
+!! result
+<p>'<i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,3)
+!! input
+'''foo'''
+!! result
+<p><b>foo</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,4)
+!! input
+'''foo''''
+!! result
+<p><b>foo'</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 3-quote opening sequence: (3,5)
+!! input
+'''foo'''''
+!! result
+<p><b>foo</b>
+</p>
+!!end
+
+
+###
+### 4-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,2)
+!! input
+''''foo''
+!! result
+<p>''<i>foo</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,3)
+!! input
+''''foo'''
+!! result
+<p>'<b>foo</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,4)
+!! input
+''''foo''''
+!! result
+<p>'<b>foo'</b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 4-quote opening sequence: (4,5)
+!! input
+''''foo'''''
+!! result
+<p>'<b>foo</b>
+</p>
+!!end
+
+
+###
+### 5-quote opening sequence tests
+###
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,2)
+!! input
+'''''foo''
+!! result
+<p><b><i>foo</i></b>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,3)
+!! input
+'''''foo'''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,4)
+!! input
+'''''foo''''
+!! result
+<p><i><b>foo'</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: 5-quote opening sequence: (5,5)
+!! input
+'''''foo'''''
+!! result
+<p><i><b>foo</b></i>
+</p>
+!!end
+
+###
+### multiple quote sequences in a line
+###
+!! test
+Italics and bold: multiple quote sequences: (2,4,2)
+!! input
+''foo''''bar''
+!! result
+<p><i>foo'<b>bar</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (2,4,3)
+!! input
+''foo''''bar'''
+!! result
+<p><i>foo'<b>bar</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (2,4,4)
+!! input
+''foo''''bar''''
+!! result
+<p><i>foo'<b>bar'</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (3,4,2)
+!! input
+'''foo''''bar''
+!! result
+<p><b>foo'</b>bar
+</p>
+!!end
+
+
+!! test
+Italics and bold: multiple quote sequences: (3,4,3)
+!! input
+'''foo''''bar'''
+!! result
+<p><b>foo'</b>bar
+</p>
+!!end
+
+###
+### other quote tests
+###
+!! test
+Italics and bold: other quote tests: (2,3,5)
+!! input
+''this is about '''foo's family'''''
+!! result
+<p><i>this is about <b>foo's family</b></i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (2,(3,3),2)
+!! input
+''this is about '''foo's''' family''
+!! result
+<p><i>this is about <b>foo's</b> family</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (3,2,3,2)
+!! input
+'''this is about ''foo'''s family''
+!! result
+<p><b>this is about <i>foo</i></b><i>s family</i>
+</p>
+!!end
+
+
+!! test
+Italics and bold: other quote tests: (3,2,3,3)
+!! input
+'''this is about ''foo'''s family'''
+!! result
+<p>'<i>this is about </i>foo<b>s family</b>
+</p>
+!!end
+
+
+
+!! test
+Italics and bold: other quote tests: (3,(2,2),3)
+!! input
+'''this is about ''foo's'' family'''
+!! result
+<p><b>this is about <i>foo's</i> family</b>
+</p>
+!!end
+
 ###
 ### <nowiki> test cases
 ###
@@ -530,117 +809,499 @@ Definition list with URL link
 !! end
 
 !! test
-Definition list with bracketed URL link
+Definition list with bracketed URL link
+!! input
+;[http://www.example.com/ Example]:Something about it
+!! result
+<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
+</dd></dl>
+
+!! end
+
+!! test
+Definition list with wikilink containing colon
+!! input
+; [[Help:FAQ]]: The least-read page on Wikipedia
+!! result
+<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
+</dd></dl>
+
+!! end
+
+# At Brion's and JeLuF's insistence... :)
+!! test
+Definition list with news link containing colon
+!! input
+;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
+!! result
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
+</dd></dl>
+
+!! end
+
+!! test
+Malformed definition list with colon
+!! input
+;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
+!! result
+<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
+</dt></dl>
+
+!! end
+
+!! test
+Definition lists: colon in external link text
+!! input
+; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
+!! result
+<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
+</dd></dl>
+
+!! end
+
+!! test
+Definition lists: colon in HTML attribute
+!! input
+;<b style="display: inline">bold</b>
+!! result
+<dl><dt><b style="display: inline">bold</b>
+</dt></dl>
+
+!! end
+
+
+!! test
+Definition lists: self-closed tag
+!! input
+;one<br/>two : two-line fun
+!! result
+<dl><dt>one<br />two&#160;</dt><dd> two-line fun
+</dd></dl>
+
+!! end
+
+!! test
+Bug 11748: Literal closing tags
+!! options
+disabled
+!! input
+<dl>
+<dt>test 1</dt>
+<dd>test test test test test</dd>
+<dt>test 2</dt>
+<dd>test test test test test</dd>
+</dl>
+!! result
+<dl>
+<dt>test 1</dt>
+<dd>test test test test test</dd>
+<dt>test 2</dt>
+<dd>test test test test test</dd>
+</dl>
+!! end
+
+!! test
+Definition and unordered list using wiki syntax nested in unordered list using html tags.
+!! input
+<ul><li>
+; term : description 
+* unordered
+</li>
+</ul>
+!! result
+<ul><li>
+<dl><dt> term&#160;</dt><dd> description 
+</dd></dl>
+<ul><li> unordered
+</li></ul>
+</li>
+</ul>
+
+!! end
+
+!! test
+Definition list with empty definition and following paragraph
+!! input
+; term:
+Paragraph text
+!! result
+<dl><dt> term</dt><dd>
+</dd></dl>
+<p>Paragraph text
+</p>
+!! end
+
+!! test
+Definition Lists: No nesting: Multiple dd's
+!! input
+;x
+:a
+:b
+!! result
+<dl><dt>x
+</dt><dd>a
+</dd><dd>b
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Regular
+!! input
+:i1
+::i2
+:::i3
+!! result
+<dl><dd>i1
+<dl><dd>i2
+<dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Missing 1st level
+!! input
+::i2
+:::i3
+!! result
+<dl><dd><dl><dd>i2
+<dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+!! test
+Definition Lists: Indentation: Multi-level indent
+!! input
+:::i3
+!! result
+<dl><dd><dl><dd><dl><dd>i3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+## The PHP parser treats : items (dd) without a corresponding ; item (dt)
+## as an empty dt item.  It also ignores all but the last ";" when followed
+## by ":" later on.  So, ";" are not ignored in ";;;t3" but are ignored  in
+## ";;;t3 :d1".  So, PHP parser behavior is a little inconsistent wrt multiple
+## ";"s.
+##
+## Ex: ";;t2 ::d2" is transformed into:
+##
+## <dl>
+##   <dt>t2 </dt>
+##   <dd>
+##     <dl>
+##       <dt></dt>
+##       <dd>d2</dd>
+##     </dl>
+##   </dd>
+## </dl>
+##
+## But, Parsoid treats "; :" as a tight atomic unit and excess ":" as plain text
+## So, the same wikitext above (;;t2 ::d2) is transformed into:
+##
+## <dl>
+##   <dt>
+##     <dl>
+##       <dt>t2 </dt>
+##       <dd>:d2</dd>
+##     </dl>
+##    </dt>
+## </dl>
+##
+## All Parsoid only definition list tests have this difference.
+##
+## See also: https://bugzilla.wikimedia.org/show_bug.cgi?id=6569 
+## and http://lists.wikimedia.org/pipermail/wikitext-l/2011-November/000483.html
+
+!! test
+Definition Lists: Nesting: Multi-level (Parsoid only)
+!! options
+disabled
+!! input
+;t1 :d1
+;;t2 ::d2
+;;;t3 :::d3
+!! result
+<dl>
+  <dt>t1 </dt>
+  <dd>d1</dd>
+  <dt>
+    <dl>
+      <dt>t2 </dt>
+      <dd>:d2</dd>
+      <dt>
+        <dl>
+          <dt>t3 </dt>
+          <dd>::d3</dd>
+        </dl>
+      </dt>
+    </dl>
+  </dt>
+</dl>
+
+
+!! end
+
+
+!! test
+Definition Lists: Nesting: Test 2 (Parsoid only)
+!! options
+disabled
+!! input
+;t1
+::d2
+!! result
+<dl>
+  <dt>t1</dt>
+  <dd>
+    <dl>
+      <dd>d2</dd>
+    </dl>
+  </dd>
+</dl>
+
+!! end
+
+
+!! test
+Definition Lists: Nesting: Test 3 (Parsoid only)
+!! options
+disabled
+!! input
+:;t1
+::::d2
+!! result
+<dl>
+  <dd>
+    <dl>
+      <dt>t1</dt>
+      <dd>
+        <dl>
+          <dd>
+            <dl>
+              <dd>d2</dd>
+            </dl>
+          </dd>
+        </dl>
+      </dd>
+    </dl>
+  </dd>
+</dl>
+
+!! end
+
+
+!! test
+Definition Lists: Nesting: Test 4
+!! input
+::;t3
+:::d3
+!! result
+<dl><dd><dl><dd><dl><dt>t3
+</dt><dd>d3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 1
+!! input
+:;* foo
+::* bar
+:; baz
+!! result
+<dl><dd><dl><dt><ul><li> foo
+</li><li> bar
+</li></ul>
+</dt></dl>
+<dl><dt> baz
+</dt></dl>
+</dd></dl>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 2
+!! input
+*: d1
+*: d2
+!! result
+<ul><li><dl><dd> d1
+</dd><dd> d2
+</dd></dl>
+</li></ul>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 3
+!! input
+*::: d1
+*::: d2
+!! result
+<ul><li><dl><dd><dl><dd><dl><dd> d1
+</dd><dd> d2
+</dd></dl>
+</dd></dl>
+</dd></dl>
+</li></ul>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 4
 !! input
-;[http://www.example.com/ Example]:Something about it
+*;d1 :d2
+*;d3 :d4
 !! result
-<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
+<ul><li><dl><dt>d1&#160;</dt><dd>d2
+</dd><dt>d3&#160;</dt><dd>d4
 </dd></dl>
+</li></ul>
 
 !! end
 
+
 !! test
-Definition list with wikilink containing colon
+Definition Lists: Mixed Lists: Test 5
 !! input
-; [[Help:FAQ]]: The least-read page on Wikipedia
+*:d1
+*:: d2
 !! result
-<dl><dt> <a href="/index.php?title=Help:FAQ&amp;action=edit&amp;redlink=1" class="new" title="Help:FAQ (page does not exist)">Help:FAQ</a></dt><dd> The least-read page on Wikipedia
+<ul><li><dl><dd>d1
+<dl><dd> d2
 </dd></dl>
+</dd></dl>
+</li></ul>
 
 !! end
 
-# At Brion's and JeLuF's insistence... :)
+
 !! test
-Definition list with news link containing colon
+Definition Lists: Mixed Lists: Test 6
 !! input
-;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
+#*:d1
+#*::: d3
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a></dt><dd> This isn't even a real newsgroup!
+<ol><li><ul><li><dl><dd>d1
+<dl><dd><dl><dd> d3
+</dd></dl>
 </dd></dl>
+</dd></dl>
+</li></ul>
+</li></ol>
 
 !! end
 
+
 !! test
-Malformed definition list with colon
+Definition Lists: Mixed Lists: Test 7
 !! input
-;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
+:* d1
+:* d2
 !! result
-<dl><dt>  <a rel="nofollow" class="external free" href="news:alt.wikipedia.rox">news:alt.wikipedia.rox</a> -- don't crash or enter an infinite loop
-</dt></dl>
+<dl><dd><ul><li> d1
+</li><li> d2
+</li></ul>
+</dd></dl>
 
 !! end
 
+
 !! test
-Definition lists: colon in external link text
+Definition Lists: Mixed Lists: Test 8
 !! input
-; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
+:* d1
+::* d2
 !! result
-<dl><dt> <a rel="nofollow" class="external text" href="http://www.wikipedia2.org/">Wikipedia&#160;: The Next Generation</a></dt><dd> OK, I made that up
+<dl><dd><ul><li> d1
+</li></ul>
+<dl><dd><ul><li> d2
+</li></ul>
+</dd></dl>
 </dd></dl>
 
 !! end
 
+
 !! test
-Definition lists: colon in HTML attribute
+Definition Lists: Mixed Lists: Test 9
 !! input
-;<b style="display: inline">bold</b>
+*;foo :bar
 !! result
-<dl><dt><b style="display: inline">bold</b>
-</dt></dl>
+<ul><li><dl><dt>foo&#160;</dt><dd>bar
+</dd></dl>
+</li></ul>
 
 !! end
 
 
 !! test
-Definition lists: self-closed tag
+Definition Lists: Mixed Lists: Test 10
 !! input
-;one<br/>two : two-line fun
+*#;foo :bar
 !! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
+<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
 </dd></dl>
+</li></ol>
+</li></ul>
 
 !! end
 
+
 !! test
-Bug 11748: Literal closing tags
-!! options
-disabled
+Definition Lists: Mixed Lists: Test 11
 !! input
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
+*#*#;*;;foo :bar
+*#*#;boo :baz
 !! result
-<dl>
-<dt>test 1</dt>
-<dd>test test test test test</dd>
-<dt>test 2</dt>
-<dd>test test test test test</dd>
-</dl>
+<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
+</dt></dl>
+</dd></dl>
+</li></ul>
+</dd></dl>
+<dl><dt>boo&#160;</dt><dd>baz
+</dd></dl>
+</li></ol>
+</li></ul>
+</li></ol>
+</li></ul>
+
 !! end
 
+
 !! test
-Definition and unordered list using wiki syntax nested in unordered list using html tags.
+Definition Lists: Weird Ones: Test 1
 !! input
-<ul><li>
-; term : description 
-* unordered
-</li>
-</ul>
+*#;*::;; foo : bar (who uses this?)
 !! result
-<ul><li>
-<dl><dt> term&#160;</dt><dd> description 
+<ul><li><ol><li><dl><dt> foo&#160;</dt><dd><ul><li><dl><dd><dl><dd><dl><dt><dl><dt> bar (who uses this?)
+</dt></dl>
+</dd></dl>
+</dd></dl>
 </dd></dl>
-<ul><li> unordered
 </li></ul>
-</li>
-</ul>
+</dd></dl>
+</li></ol>
+</li></ul>
 
 !! end
 
-
 ###
 ### External links
 ###
@@ -1258,6 +1919,8 @@ Normal text.
 '''This year''''s election ''should'' beat '''last year''''s.
 
 ''Tom'''s car is bigger than ''Susan'''s.
+
+Plain ''italic'''s plain
 !! result
 <p><i><b>Bold italic text </b>with bold deactivated<b> in between.</b></i>
 </p><p><b><i>Bold italic text </i>with italic deactivated<i> in between.</i></b>
@@ -1268,6 +1931,7 @@ Normal text.
 </p><p>Normal text.
 </p><p><b>This year'</b>s election <i>should</i> beat <b>last year'</b>s.
 </p><p><i>Tom<b>s car is bigger than </b></i><b>Susan</b>s.
+</p><p>Plain <i>italic'</i>s plain
 </p>
 !! end
 
@@ -2113,6 +2777,8 @@ Mixed list
 **#Number on level 3
 *#number level 2
 *Level 1
+*** Level 3
+#** Level 3, but ordered
 !! result
 <ul><li>Mixed list
 <ol><li> with numbers
@@ -2135,10 +2801,126 @@ Mixed list
 <ol><li>number level 2
 </li></ol>
 </li><li>Level 1
+<ul><li><ul><li> Level 3
+</li></ul>
+</li></ul>
+</li></ul>
+<ol><li><ul><li><ul><li> Level 3, but ordered
+</li></ul>
+</li></ul>
+</li></ol>
+
+!! end
+
+!! test
+Nested lists 1
+!! input
+*foo
+**bar
+!! result
+<ul><li>foo
+<ul><li>bar
+</li></ul>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 2
+!! input
+**foo
+*bar
+!! result
+<ul><li><ul><li>foo
+</li></ul>
+</li><li>bar
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 3 (first element empty)
+!! input
+*
+**bar
+!! result
+<ul><li>
+<ul><li>bar
+</li></ul>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 4 (first element empty)
+!! input
+**
+*bar
+!! result
+<ul><li><ul><li>
+</li></ul>
+</li><li>bar
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 5 (both elements empty)
+!! input
+**
+*
+!! result
+<ul><li><ul><li>
+</li></ul>
+</li><li>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 6 (both elements empty)
+!! input
+*
+**
+!! result
+<ul><li>
+<ul><li>
+</li></ul>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 7 (skip initial nesting levels)
+!! input
+*** foo
+!! result
+<ul><li><ul><li><ul><li> foo
+</li></ul>
+</li></ul>
+</li></ul>
+
+!! end
+
+!! test
+Nested lists 8 (multiple nesting transitions)
+!! input
+* foo
+*** bar
+** baz
+* boo
+!! result
+<ul><li> foo
+<ul><li><ul><li> bar
+</li></ul>
+</li><li> baz
+</li></ul>
+</li><li> boo
 </li></ul>
 
 !! end
 
+
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
 !! input
@@ -2183,6 +2965,27 @@ List items from template
 
 !! end
 
+!! test
+List interrupted by empty line or heading
+!! input
+* foo
+
+** bar
+== A heading ==
+* Another list item
+!! result
+<ul><li> foo
+</li></ul>
+<ul><li><ul><li> bar
+</li></ul>
+</li></ul>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: A heading">edit</a>]</span> <span class="mw-headline" id="A_heading"> A heading </span></h2>
+<ul><li> Another list item
+</li></ul>
+
+!!end
+
+
 ###
 ### Magic Words
 ###
@@ -3514,15 +4317,15 @@ pst
 [[Bar:Article(context)|]]
 [[:Bar:Article(context)|]]
 [[|Article(context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
+[[Bar:X(Y)Z|]]
+[[:Bar:X(Y)Z|]]
 !! result
 [[Article(context)|Article]]
 [[Bar:Article(context)|Article]]
 [[:Bar:Article(context)|Article]]
 [[Article(context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
+[[Bar:X(Y)Z|X(Y)Z]]
+[[:Bar:X(Y)Z|X(Y)Z]]
 !! end
 
 !! test
@@ -3565,6 +4368,26 @@ pst
 [[:Bar:X(Y)Z|X(Y)Z]]
 !! end
 
+!! test
+pre-save transform: context links ("pipe trick") with commas (bug 21660)
+!! options
+pst
+!! input
+[[Article (context), context|]]
+[[Article (context),context|]]
+[[Bar:Article (context), context|]]
+[[Bar:Article (context),context|]]
+[[:Bar:Article (context), context|]]
+[[:Bar:Article (context),context|]]
+!! result
+[[Article (context), context|Article]]
+[[Article (context),context|Article]]
+[[Bar:Article (context), context|Article]]
+[[Bar:Article (context),context|Article]]
+[[:Bar:Article (context), context|Article]]
+[[:Bar:Article (context),context|Article]]
+!! end
+
 !! test
 pre-save transform: trim trailing empty lines
 !! options
@@ -6064,8 +6887,6 @@ Special page transclusion
 !! input
 {{Special:Prefixindex/Xyzzyx}}
 !! result
-<p><br />
-</p>
 <table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
@@ -6077,11 +6898,7 @@ Special page transclusion twice (bug 5021)
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
 !! result
-<p><br />
-</p>
 <table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<p><br />
-</p>
 <table border="0" id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
@@ -9290,10 +10107,87 @@ Ignore pipe between table row attributes
 
 !! end
 
+!!test
+Gallery override link with WikiLink (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with absolute external link (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Gallery override link with malicious javascript (bug 34852)
+!! input
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
+!! end
+
+!!test
+Language parser function
+!! input
+{{#language:ar}}
+!! result
+<p>العربية
+</p>
+!! end
+
+!!test
+Padleft and padright as substr
+!! input
+{{padleft:|3|abcde}}
+{{padright:|3|abcde}}
+!! result
+<p>abc
+abc
+</p>
+!! end
+
+
 TODO:
 more images
 more tables
-math
 character entities
 and much more
 Try for 100% code coverage
index f626459..3729796 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;
        }
 
        /**
@@ -331,4 +341,65 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                wfDeprecated( $function );
                wfRestoreWarnings();
        }
+
+       /**
+        * Asserts that the given database query yields the rows given by $expectedRows.
+        * The expected rows should be given as indexed (not associative) arrays, with
+        * the values given in the order of the columns in the $fields parameter.
+        * Note that the rows are sorted by the columns given in $fields.
+        *
+        * @param $table String|Array the table(s) to query
+        * @param $fields String|Array the columns to include in the result (and to sort by)
+        * @param $condition String|Array "where" condition(s)
+        * @param $expectedRows Array - an array of arrays giving the expected rows.
+        *
+        * @throws MWException if this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
+        */
+       protected function assertSelect( $table, $fields, $condition, Array $expectedRows ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing database state, the test cases\'s needDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.');
+               }
+
+               $db = wfGetDB( DB_SLAVE );
+
+               $res = $db->select( $table, $fields, $condition, wfGetCaller(), array( 'ORDER BY' => $fields ) );
+               $this->assertNotEmpty( $res, "query failed: " . $db->lastError() );
+
+               $i = 0;
+
+               foreach ( $expectedRows as $expected ) {
+                       $r = $res->fetchRow();
+                       self::stripStringKeys( $r );
+
+                       $i += 1;
+                       $this->assertNotEmpty( $r, "row #$i missing" );
+
+                       $this->assertEquals( $expected, $r, "row #$i mismatches" );
+               }
+
+               $r = $res->fetchRow();
+               self::stripStringKeys( $r );
+
+               $this->assertFalse( $r, "found extra row (after #$i)" );
+       }
+
+       /**
+        * Utility function for eliminating all string keys from an array.
+        * Useful to turn a database result row as returned by fetchRow() into
+        * a pure indexed array.
+        *
+        * @static
+        * @param $r mixed the array to remove string keys from.
+        */
+       protected static function stripStringKeys( &$r ) {
+               if ( !is_array( $r ) ) return;
+
+               foreach ( $r as $k => $v ) {
+                       if ( is_string( $k ) ) unset( $r[$k] );
+               }
+       }
 }
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' );
                }
        }
 
diff --git a/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php b/tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
new file mode 100644 (file)
index 0000000..4c4c4c0
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+
+class wfGetCaller extends MediaWikiTestCase {
+
+       function testZero() {
+               $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
+       }
+
+       function callerOne() {
+               return wfGetCaller();
+       }
+
+       function testOne() {
+               $this->assertEquals( "wfGetCaller::testOne", self::callerOne() );
+       }
+
+       function intermediateFunction( $level = 2, $n = 0 ) {
+               if ( $n > 0 )
+                       return self::intermediateFunction( $level, $n - 1 );
+               return wfGetCaller( $level );
+       }
+
+       function testTwo() {
+               $this->assertEquals( "wfGetCaller::testTwo", self::intermediateFunction() );
+       }
+
+       function testN() {
+               $this->assertEquals( "wfGetCaller::testN", self::intermediateFunction( 2, 0 ) );
+               $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( 1, 0 ) );
+
+               for ($i=0; $i < 10; $i++)
+                       $this->assertEquals( "wfGetCaller::intermediateFunction", self::intermediateFunction( $i + 1, $i ) );
+       }
+}
+
index e38fa7e..f50b2fe 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 /**
  * Tests for IP validity functions. Ported from /t/inc/IP.t by avar.
+ * @group IP
  */
 
 class IPTest extends MediaWikiTestCase {
@@ -505,4 +506,37 @@ class IPTest extends MediaWikiTestCase {
                        array( '0:c1:A2:3:4:5:c6:7', '0:C1:A2:3:4:5:C6:7', 'IPv6 non range' ),
                );
        }
+
+       /**
+        * Test for IP::prettifyIP()
+        * @dataProvider provideIPsToPrettify
+        */
+       function testPrettifyIP( $ip, $prettified ) {
+               $this->assertEquals( $prettified, IP::prettifyIP( $ip ), "Prettify of $ip" );
+       }
+
+       /**
+        * Provider for IP::testPrettifyIP()
+        */
+       function provideIPsToPrettify() {
+               return array(
+                       array( '0:0:0:0:0:0:0:0', '::' ),
+                       array( '0:0:0::0:0:0', '::' ),
+                       array( '0:0:0:1:0:0:0:0', '0:0:0:1::' ),
+                       array( '0:0::f', '::f' ),
+                       array( '0::0:0:0:33:fef:b', '::33:fef:b' ),
+                       array( '3f:535:0:0:0:0:e:fbb', '3f:535::e:fbb' ),
+                       array( '0:0:fef:0:0:0:e:fbb', '0:0:fef::e:fbb' ),
+                       array( 'abbc:2004::0:0:0:0', 'abbc:2004::' ),
+                       array( 'cebc:2004:f:0:0:0:0:0', 'cebc:2004:f::' ),
+                       array( '0:0:0:0:0:0:0:0/16', '::/16' ),
+                       array( '0:0:0::0:0:0/64', '::/64' ),
+                       array( '0:0::f/52', '::f/52' ),
+                       array( '::0:0:33:fef:b/52', '::33:fef:b/52' ),
+                       array( '3f:535:0:0:0:0:e:fbb/48', '3f:535::e:fbb/48' ),
+                       array( '0:0:fef:0:0:0:e:fbb/96', '0:0:fef::e:fbb/96' ),
+                       array( 'abbc:2004:0:0::0:0/40', 'abbc:2004::/40' ),
+                       array( 'aebc:2004:f:0:0:0:0:0/80', 'aebc:2004:f::/80' ),
+               );
+       }
 }
diff --git a/tests/phpunit/includes/LinksUpdateTest.php b/tests/phpunit/includes/LinksUpdateTest.php
new file mode 100644 (file)
index 0000000..4946200
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+
+/**
+ *
+ * @group Database
+ * ^--- make sure temporary tables are used.
+ */
+class LinksUpdateTest extends MediaWikiTestCase {
+
+       function  __construct( $name = null, array $data = array(), $dataName = '' ) {
+               parent::__construct( $name, $data, $dataName );
+
+               $this->tablesUsed = array_merge ( $this->tablesUsed,
+                                                                                       array( 'interwiki',
+
+                                                                                               'page_props',
+                                                                                               'pagelinks',
+                                                                                               'categorylinks',
+                                                                                               'langlinks',
+                                                                                               'externallinks',
+                                                                                               'imagelinks',
+                                                                                               'templatelinks',
+                                                                                               'iwlinks' ) );
+       }
+
+       function setUp() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->replace( 'interwiki',
+                                               array('iw_prefix'),
+                                               array( 'iw_prefix' => 'linksupdatetest',
+                                                      'iw_url' => 'http://testing.com/wiki/$1',
+                                                      'iw_api' => 'http://testing.com/w/api.php',
+                                                      'iw_local' => 0,
+                                                      'iw_trans' => 0,
+                                                      'iw_wikiid' => 'linksupdatetest',
+                                               ) );
+       }
+
+       protected function makeTitleAndParserOutput( $name, $id ) {
+               $t = Title::newFromText( $name );
+               $t->mArticleID = $id; # XXX: this is fugly
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               return array( $t, $po );
+       }
+
+       public function testUpdate_pagelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLink( Title::newFromText( "Foo" ) );
+               $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
+               $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
+               $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
+
+               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+                       array( NS_MAIN, 'Foo' ),
+               ) );
+
+               $po = new ParserOutput();
+               $po->setTitleText( $t->getPrefixedText() );
+
+               $po->addLink( Title::newFromText( "Bar" ) );
+
+               $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
+                       array( NS_MAIN, 'Bar' ),
+               ) );
+       }
+
+       public function testUpdate_externallinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addExternalLink( "http://testing.com/wiki/Foo" );
+
+               $this->assertLinksUpdate( $t, $po, 'externallinks', 'el_to, el_index', 'el_from = 111', array(
+                       array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
+               ) );
+       }
+
+       public function testUpdate_categorylinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addCategory( "Foo", "FOO" );
+
+               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
+                       array( 'Foo', "FOO\nTESTING" ),
+               ) );
+       }
+
+       public function testUpdate_iwlinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $target = Title::makeTitleSafe( NS_MAIN, "Foo", '', 'linksupdatetest' );
+               $po->addInterwikiLink( $target );
+
+               $this->assertLinksUpdate( $t, $po, 'iwlinks', 'iwl_prefix, iwl_title', 'iwl_from = 111', array(
+                       array( 'linksupdatetest', 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_templatelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
+
+               $this->assertLinksUpdate( $t, $po, 'templatelinks', 'tl_namespace, tl_title', 'tl_from = 111', array(
+                       array( NS_TEMPLATE, 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_imagelinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addImage( "Foo.png" );
+
+
+               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
+                       array( 'Foo.png' ),
+               ) );
+       }
+
+       public function testUpdate_langlinks() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->addLanguageLink( Title::newFromText( "en:Foo" ) );
+
+
+               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
+                       array( 'En', 'Foo' ),
+               ) );
+       }
+
+       public function testUpdate_page_props() {
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+
+               $po->setProperty( "foo", "bar" );
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', 'pp_propname, pp_value', 'pp_page = 111', array(
+                       array( 'foo', 'bar' ),
+               ) );
+       }
+
+       #@todo: test recursive, too!
+
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, Array $expectedRows ) {
+               $update = new LinksUpdate( $title, $parserOutput );
+
+               $update->doUpdate();
+
+               $this->assertSelect( $table, $fields, $condition, $expectedRows );
+       }
+}
+
index d459022..3b05d67 100644 (file)
@@ -437,6 +437,36 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $wgContentNamespaces = $saved;
        }
 
+       /**
+        */
+       public function testGetSubjectNamespaces() {
+               $subjectsNS = MWNamespace::getSubjectNamespaces();
+               $this->assertContains(    NS_MAIN, $subjectsNS,
+                       "Talk namespaces should have NS_MAIN" );
+               $this->assertNotContains( NS_TALK, $subjectsNS,
+                       "Talk namespaces should have NS_TALK" );
+
+               $this->assertNotContains( NS_MEDIA, $subjectsNS,
+                       "Talk namespaces should not have NS_MEDIA" );
+               $this->assertNotContains( NS_SPECIAL, $subjectsNS,
+                       "Talk namespaces should not have NS_SPECIAL" );
+       }
+
+       /**
+        */
+       public function testGetTalkNamespaces() {
+               $talkNS = MWNamespace::getTalkNamespaces();
+               $this->assertContains(    NS_TALK, $talkNS,
+                       "Subject namespaces should have NS_TALK" );
+               $this->assertNotContains( NS_MAIN, $talkNS,
+                       "Subject namespaces should not have NS_MAIN" );
+
+               $this->assertNotContains( NS_MEDIA, $talkNS,
+                       "Subject namespaces should not have NS_MEDIA" );
+               $this->assertNotContains( NS_SPECIAL, $talkNS,
+                       "Subject namespaces should not have NS_SPECIAL" );
+       }
+
        /**
         * Some namespaces are always capitalized per code definition
         * in MWNamespace::$alwaysCapitalizedNamespaces
@@ -546,6 +576,15 @@ class MWNamespaceTest extends MediaWikiTestCase {
 
        }
 
+       public function testIsNonincludable() {
+               global $wgNonincludableNamespaces;
+               $wgNonincludableNamespaces = array( NS_USER );
+
+               $this->assertTrue( MWNamespace::isNonincludable( NS_USER ) );
+
+               $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
+       }
+
        ####### HELPERS ###########################################################
        function __call( $method, $args ) {
                // Call the real method if it exists
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 77a371d..59ba0a0 100644 (file)
@@ -47,7 +47,7 @@ class TestSample extends MediaWikiLangTestCase {
                        array( 'Text', null, 'Text' ),
                        array( 'text', null, 'Text' ),
                        array( 'Text', NS_USER, 'User:Text' ),
-                       array( 'Photo.jpg', NS_IMAGE, 'File:Photo.jpg' )
+                       array( 'Photo.jpg', NS_FILE, 'File:Photo.jpg' )
                );
        }
 
index 2f1103e..aed658b 100644 (file)
@@ -21,8 +21,8 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $titleA = Title::newFromText( $titleA );
                $titleB = Title::newFromText( $titleB );
 
-               $this->assertEquals( $titleA->equals( $titleB ), $expectedBool );
-               $this->assertEquals( $titleB->equals( $titleA ), $expectedBool );
+               $this->assertEquals( $expectedBool, $titleA->equals( $titleB ) );
+               $this->assertEquals( $expectedBool, $titleB->equals( $titleA ) );
        }
 
        public function dataInNamespace() {
@@ -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() {
@@ -72,7 +72,130 @@ class TitleMethodsTest extends MediaWikiTestCase {
         */
        public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
-               $this->assertEquals( $title->hasSubjectNamespace( $ns ), $expectedBool );
+               $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() );
        }
 
 }
index e72408f..1fc0b4b 100644 (file)
@@ -1,14 +1,22 @@
 <?php
 
 class WebRequestTest extends MediaWikiTestCase {
+       static $oldServer;
+
+       function setUp() {
+               self::$oldServer = $_SERVER;
+       }
+
+       function tearDown() {
+               $_SERVER = self::$oldServer;
+       }
+
        /**
         * @dataProvider provideDetectServer
         */
        function testDetectServer( $expected, $input, $description ) {
-               $oldServer = $_SERVER;
                $_SERVER = $input;
                $result = WebRequest::detectServer();
-               $_SERVER = $oldServer;
                $this->assertEquals( $expected, $result, $description );
        }
 
@@ -91,13 +99,11 @@ class WebRequestTest extends MediaWikiTestCase {
         */
        function testGetIP( $expected, $input, $squid, $private, $description ) {
                global $wgSquidServersNoPurge, $wgUsePrivateIPs;
-               $oldServer = $_SERVER;
                $_SERVER = $input;
                $wgSquidServersNoPurge = $squid;
                $wgUsePrivateIPs = $private;
                $request = new WebRequest();
                $result = $request->getIP();
-               $_SERVER = $oldServer;
                $this->assertEquals( $expected, $result, $description );
        }
 
@@ -182,4 +188,29 @@ class WebRequestTest extends MediaWikiTestCase {
                # Next call throw an exception about lacking an IP
                $request->getIP();
        }
+
+       function languageProvider() {
+               return array(
+                       array( '', array(), 'Empty Accept-Language header' ),
+                       array( 'en', array( 'en' => 1 ), 'One language' ),
+                       array( 'en, ar', array( 'en' => 1, 'ar' => 1 ), 'Two languages listed in appearance order.' ),
+                       array( 'zh-cn,zh-tw', array( 'zh-cn' => 1, 'zh-tw' => 1 ), 'Two equally prefered languages, listed in appearance order per rfc3282. Checks c9119' ),
+                       array( 'es, en; q=0.5', array( 'es' => 1, 'en' => '0.5' ), 'Spanish as first language and English and second' ),
+                       array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Less prefered language first' ),
+                       array( 'fr, en; q=0.5, es', array( 'fr' => 1, 'es' => 1, 'en' => '0.5' ), 'Three languages' ),
+                       array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Two languages' ),
+                       array( 'en, zh;q=0', array( 'en' => 1 ), "It's Chinese to me" ),
+                       array( 'es; q=1, pt;q=0.7, it; q=0.6, de; q=0.1, ru;q=0', array( 'es' => '1', 'pt' => '0.7', 'it' => '0.6', 'de' => '0.1' ), 'Preference for romance languages' ),
+                       array( 'en-gb, en-us; q=1', array( 'en-gb' => 1, 'en-us' => '1' ), 'Two equally prefered English variants' ),
+               );
+       }
+
+       /**
+        * @dataProvider languageProvider
+        */
+       function testAcceptLang($acceptLanguageHeader, $expectedLanguages, $description) {
+               $_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
+               $request = new WebRequest();
+               $this->assertSame( $request->getAcceptLang(), $expectedLanguages, $description);
+       }
 }
diff --git a/tests/phpunit/includes/WikiPageTest.php b/tests/phpunit/includes/WikiPageTest.php
new file mode 100644 (file)
index 0000000..b72a5cd
--- /dev/null
@@ -0,0 +1,783 @@
+<?php
+/**
+* @group Database
+* ^--- important, causes temporary tables to be used instead of the real database
+**/
+
+class WikiPageTest extends MediaWikiLangTestCase {
+
+       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() {
+               parent::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
+                       }
+               }
+               parent::tearDown();
+       }
+
+       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 testDoDeleteUpdates() {
+               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+               $id = $page->getId();
+
+               $page->doDeleteUpdates( $id );
+
+               # ------------------------
+               $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 ) {
+               $this->hideDeprecated( 'WikiPage::preSaveTransform' );
+               $user = new User();
+               $user->setName("127.0.0.1");
+
+               $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
+               $text = $page->preSaveTransform( $text, $user );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+}
+
index 1f40b5a..5dfceee 100644 (file)
@@ -56,7 +56,7 @@ class ApiBlockTest extends ApiTestCase {
                        'action' => 'block',
                        'user' => 'UTApiBlockee',
                        'reason' => 'Some reason',
-                       'token' => $pageinfo['blocktoken'] ), $data, false, self::$users['sysop']->user );
+                       'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
 
                $block = Block::newFromTarget('UTApiBlockee');
 
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 8801391..f81bb6d 100644 (file)
@@ -43,15 +43,31 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        }
 
-       protected function doApiRequest( $params, $session = null, $appendModule = false, $user = null ) {
+       protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
+               global $wgRequest, $wgUser;
+
                if ( is_null( $session ) ) {
-                       $session = array();
+                       # re-use existing global session by default
+                       $session = $wgRequest->getSessionArray();
+               }
+
+               # set up global environment
+               if ( $user ) {
+                       $wgUser = $user;
                }
 
-               $context = $this->apiContext->newTestContext( $params, $session, $user );
+               $wgRequest = new FauxRequest( $params, true, $session );
+               RequestContext::getMain()->setRequest( $wgRequest );
+
+               # set up local environment
+               $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
+
                $module = new ApiMain( $context, true );
+
+               # run it!
                $module->execute();
 
+               # construct result
                $results = array(
                        $module->getResultData(),
                        $context->getRequest(),
@@ -68,11 +84,11 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * Add an edit token to the API request
         * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
         * request, without actually requesting a "real" edit token
-        * @param $params: key-value API params
-        * @param $session: session array
-        * @param $user String|null A User object for the context 
+        * @param $params Array: key-value API params
+        * @param $session Array: session array
+        * @param $user User|null A User object for the context
         */
-       protected function doApiRequestWithToken( $params, $session, $user = null ) {
+       protected function doApiRequestWithToken( Array $params, Array $session, User $user = null ) {
                if ( $session['wsToken'] ) {
                        // add edit token to fake session
                        $session['wsEditToken'] = $session['wsToken'];
@@ -97,17 +113,17 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                        'lgtoken' => $token,
                        'lgname' => self::$users['sysop']->username,
                        'lgpassword' => self::$users['sysop']->password
-                       ), $data );
+                       ), $data[2] );
 
                return $data;
        }
 
-       protected function getTokenList( $user ) {
+       protected function getTokenList( $user, $session = null ) {
                $data = $this->doApiRequest( array(
                        'action' => 'query',
                        'titles' => 'Main Page',
                        'intoken' => 'edit|delete|protect|move|block|unblock',
-                       'prop' => 'info' ), false, $user->user );
+                       'prop' => 'info' ), $session, false, $user->user );
                return $data;
        }
 }
@@ -154,14 +170,13 @@ class ApiTestContext extends RequestContext {
        /**
         * Returns a DerivativeContext with the request variables in place
         *
-        * @param $params Array key-value API params
-        * @param $session Array session data
+        * @param $request WebRequest request object including parameters and session
         * @param $user User or null
         * @return DerivativeContext
         */
-       public function newTestContext( $params, $session, $user = null ) {
+       public function newTestContext( WebRequest $request, User $user = null ) {
                $context = new DerivativeContext( $this );
-               $context->setRequest( new FauxRequest( $params, true, $session ) );
+               $context->setRequest( $request );
                if ( $user !== null ) {
                        $context->setUser( $user );
                }
index f3a14e5..b22eccd 100644 (file)
@@ -10,10 +10,14 @@ $IP = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) );
 
 // Start up MediaWiki in command-line mode
 require_once( "$IP/maintenance/Maintenance.php" );
-require("RandomImageGenerator.php");
+require(  dirname( __FILE__ ) . "/RandomImageGenerator.php" );
 
 class GenerateRandomImages extends Maintenance {
 
+       public function getDbType() {
+               return Maintenance::DB_NONE;
+       }
+
        public function execute() {
 
                $getOptSpec = array(
diff --git a/tests/phpunit/includes/cache/GenderCacheTest.php b/tests/phpunit/includes/cache/GenderCacheTest.php
new file mode 100644 (file)
index 0000000..a8b987e
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @group Database
+ * @group Cache
+ */
+class GenderCacheTest extends MediaWikiLangTestCase {
+
+       function setUp() {
+               global $wgDefaultUserOptions;
+               parent::setUp();
+               //ensure the correct default gender
+               $wgDefaultUserOptions['gender'] = 'unknown';
+       }
+
+       function addDBData() {
+               $user = User::newFromName( 'UTMale' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTMalePassword' );
+               }
+               //ensure the right gender
+               $user->setOption( 'gender', 'male' );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UTFemale' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTFemalePassword' );
+               }
+               //ensure the right gender
+               $user->setOption( 'gender', 'female' );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UTDefaultGender' );
+               if( $user->getID() == 0 ) {
+                       $user->addToDatabase();
+                       $user->setPassword( 'UTDefaultGenderPassword' );
+               }
+               //ensure the default gender
+               $user->setOption( 'gender', null );
+               $user->saveSettings();
+       }
+
+       /**
+        * test usernames
+        *
+        * @dataProvider dataUserName
+        */
+       function testUserName( $username, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $gender = $genderCache->getGenderOf( $username );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+       }
+
+       /**
+        * genderCache should work with user objects, too
+        *
+        * @dataProvider dataUserName
+        */
+       function testUserObjects( $username, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $user = User::newFromName( $username );
+               $gender = $genderCache->getGenderOf( $user );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
+       }
+
+       function dataUserName() {
+               return array(
+                       array( 'UTMale', 'male' ),
+                       array( 'UTFemale', 'female' ),
+                       array( 'UTDefaultGender', 'unknown' ),
+                       array( 'UTNotExist', 'unknown' ),
+                       //some not valid user
+                       array( '127.0.0.1', 'unknown' ),
+                       array( 'user@test', 'unknown' ),
+               );
+       }
+
+       /**
+        * test strip of subpages to avoid unnecessary queries
+        * against the never existing username
+        *
+        * @dataProvider dataStripSubpages
+        */
+       function testStripSubpages( $pageWithSubpage, $expectedGender ) {
+               $genderCache = GenderCache::singleton();
+               $gender = $genderCache->getGenderOf( $pageWithSubpage );
+               $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
+       }
+
+       function dataStripSubpages() {
+               return array(
+                       array( 'UTMale/subpage', 'male' ),
+                       array( 'UTFemale/subpage', 'female' ),
+                       array( 'UTDefaultGender/subpage', 'unknown' ),
+                       array( 'UTNotExist/subpage', 'unknown' ),
+                       array( '127.0.0.1/subpage', 'unknown' ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
new file mode 100644 (file)
index 0000000..9dcaf2b
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+
+/**
+ * Abstract class to construct tests for ORMRow deriving classes.
+ *
+ * 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
+ * @since 1.20
+ *
+ * @ingroup Test
+ *
+ * @group ORM
+ *
+ * The database group has as a side effect that temporal database tables are created. This makes
+ * it possible to test without poisoning a production database.
+ * @group Database
+ *
+ * Some of the tests takes more time, and needs therefor longer time before they can be aborted
+ * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
+ * that hold the first tests in a pending state awaiting access to the database.
+ * @group medium
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ORMRowTest extends \MediaWikiTestCase {
+
+       /**
+        * @since 1.20
+        * @return string
+        */
+       protected abstract function getRowClass();
+
+       /**
+        * @since 1.20
+        * @return IORMTable
+        */
+       protected abstract function getTableInstance();
+
+       /**
+        * @since 1.20
+        * @return array
+        */
+       public abstract function constructorTestProvider();
+
+       /**
+        * @since 1.20
+        * @param IORMRow $row
+        * @param array $data
+        */
+       protected function verifyFields( IORMRow $row, array $data ) {
+               foreach ( array_keys( $data ) as $fieldName ) {
+                       $this->assertEquals( $data[$fieldName], $row->getField( $fieldName ) );
+               }
+       }
+
+       /**
+        * @since 1.20
+        * @param array $data
+        * @param boolean $loadDefaults
+        * @return IORMRow
+        */
+       protected function getRowInstance( array $data, $loadDefaults ) {
+               $class = $this->getRowClass();
+               return new $class( $this->getTableInstance(), $data, $loadDefaults );
+       }
+
+       /**
+        * @since 1.20
+        * @return array
+        */
+       protected function getMockValues() {
+               return array(
+                       'id' => 1,
+                       'str' => 'foobar4645645',
+                       'int' => 42,
+                       'float' => 4.2,
+                       'bool' => true,
+                       'array' => array( 42, 'foobar' ),
+                       'blob' => new stdClass()
+               );
+       }
+
+       /**
+        * @since 1.20
+        * @return array
+        */
+       protected function getMockFields() {
+               $mockValues = $this->getMockValues();
+               $mockFields = array();
+
+               foreach ( $this->getTableInstance()->getFields() as $name => $type ) {
+                       if ( $name !== 'id' ) {
+                               $mockFields[$name] = $mockValues[$type];
+                       }
+               }
+
+               return $mockFields;
+       }
+
+       /**
+        * @since 1.20
+        * @return array of IORMRow
+        */
+       public function instanceProvider() {
+               $instances = array();
+
+               foreach ( $this->constructorTestProvider() as $arguments ) {
+                       $instances[] = array( call_user_func_array( array( $this, 'getRowInstance' ), $arguments ) );
+               }
+
+               return $instances;
+       }
+
+       /**
+        * @dataProvider constructorTestProvider
+        */
+       public function testConstructor( array $data, $loadDefaults ) {
+               $this->verifyFields( $this->getRowInstance( $data, $loadDefaults ), $data );
+       }
+
+       /**
+        * @dataProvider constructorTestProvider
+        */
+       public function testSave( array $data, $loadDefaults ) {
+               $item = $this->getRowInstance( $data, $loadDefaults );
+
+               $this->assertTrue( $item->save() );
+
+               $this->assertTrue( $item->hasIdField() );
+               $this->assertTrue( is_integer( $item->getId() ) );
+
+               $id = $item->getId();
+
+               $this->assertTrue( $item->save() );
+
+               $this->assertEquals( $id, $item->getId() );
+
+               $this->verifyFields( $item, $data );
+       }
+
+       /**
+        * @dataProvider constructorTestProvider
+        */
+       public function testRemove( array $data, $loadDefaults ) {
+               $item = $this->getRowInstance( $data, $loadDefaults );
+
+               $this->assertTrue( $item->save() );
+
+               $this->assertTrue( $item->remove() );
+
+               $this->assertFalse( $item->hasIdField() );
+
+               $this->assertTrue( $item->save() );
+
+               $this->verifyFields( $item, $data );
+
+               $this->assertTrue( $item->remove() );
+
+               $this->assertFalse( $item->hasIdField() );
+
+               $this->verifyFields( $item, $data );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        */
+       public function testSetField( IORMRow $item ) {
+               foreach ( $this->getMockFields() as $name => $value ) {
+                       $item->setField( $name, $value );
+                       $this->assertEquals( $value, $item->getField( $name ) );
+               }
+       }
+
+       /**
+        * @since 1.20
+        * @param array $expected
+        * @param IORMRow $item
+        */
+       protected function assertFieldValues( array $expected, IORMRow $item ) {
+               foreach ( $expected as $name => $type ) {
+                       if ( $name !== 'id' ) {
+                               $this->assertEquals( $expected[$name], $item->getField( $name ) );
+                       }
+               }
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        */
+       public function testSetFields( IORMRow $item ) {
+               $originalValues = $item->getFields();
+
+               $item->setFields( array(), false );
+
+               foreach ( $item->getTable()->getFields() as $name => $type ) {
+                       $originalHas = array_key_exists( $name, $originalValues );
+                       $newHas = $item->hasField( $name );
+
+                       $this->assertEquals( $originalHas, $newHas );
+
+                       if ( $originalHas && $newHas ) {
+                               $this->assertEquals( $originalValues[$name], $item->getField( $name ) );
+                       }
+               }
+
+               $mockFields = $this->getMockFields();
+
+               $item->setFields( $mockFields, false );
+
+               $this->assertFieldValues( $originalValues, $item );
+
+               $item->setFields( $mockFields, true );
+
+               $this->assertFieldValues( $mockFields, $item );
+       }
+
+       // TODO: test all of the methods!
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
new file mode 100644 (file)
index 0000000..ca3e9e6
--- /dev/null
@@ -0,0 +1,174 @@
+<?php
+
+/**
+ * Tests for the TestORMRow class.
+ * TestORMRow is a dummy class to be able to test the abstract ORMRow 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
+ * @since 1.20
+ *
+ * @ingroup Test
+ *
+ * @group ORM
+ *
+ * The database group has as a side effect that temporal database tables are created. This makes
+ * it possible to test without poisoning a production database.
+ * @group Database
+ *
+ * Some of the tests takes more time, and needs therefor longer time before they can be aborted
+ * as non-functional. The reason why tests are aborted is assumed to be set up of temporal databases
+ * that hold the first tests in a pending state awaiting access to the database.
+ * @group medium
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+require_once dirname( __FILE__ ) . "/ORMRowTest.php";
+
+class TestORMRowTest extends ORMRowTest {
+
+       /**
+        * @since 1.20
+        * @return string
+        */
+       protected function getRowClass() {
+               return 'TestORMRow';
+       }
+
+       /**
+        * @since 1.20
+        * @return IORMTable
+        */
+       protected function getTableInstance() {
+               return TestORMTable::singleton();
+       }
+
+       public function setUp() {
+               parent::setUp();
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
+
+               $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
+               $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
+
+               $dbw->safeQuery(
+                       'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . '(
+                               test_id                    ' . $idField . '        NOT NULL ' . $primaryKey . ',
+                               test_name                  VARCHAR(255)        NOT NULL,
+                               test_age                   TINYINT unsigned    NOT NULL,
+                               test_height                FLOAT               NOT NULL,
+                               test_awesome               TINYINT unsigned    NOT NULL,
+                               test_stuff                 BLOB                NOT NULL,
+                               test_moarstuff             BLOB                NOT NULL,
+                               test_time                  varbinary(14)       NOT NULL
+                       );'
+               );
+       }
+
+       public function constructorTestProvider() {
+               return array(
+                       array(
+                               array(
+                                       'name' => 'Foobar',
+                                       'age' => 42,
+                                       'height' => 9000.1,
+                                       'awesome' => true,
+                                       'stuff' => array( 13, 11, 7, 5, 3, 2 ),
+                                       'moarstuff' => (object)array( 'foo' => 'bar', 'bar' => array( 4, 2 ), 'baz' => true )
+                               ),
+                               true
+                       ),
+               );
+       }
+
+}
+
+class TestORMRow extends ORMRow {}
+
+class TestORMTable extends ORMTable {
+
+       /**
+        * Returns the name of the database table objects of this type are stored in.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function getName() {
+               return 'orm_test';
+       }
+
+       /**
+        * Returns the name of a IORMRow implementing class that
+        * represents single rows in this table.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       public function getRowClass() {
+               return 'TestORMRow';
+       }
+
+       /**
+        * Returns an array with the fields and their types this object contains.
+        * This corresponds directly to the fields in the database, without prefix.
+        *
+        * field name => type
+        *
+        * Allowed types:
+        * * id
+        * * str
+        * * int
+        * * float
+        * * bool
+        * * array
+        * * blob
+        *
+        * @since 1.20
+        *
+        * @return array
+        */
+       public function getFields() {
+               return array(
+                       'id' => 'id',
+                       'name' => 'str',
+                       'age' => 'int',
+                       'height' => 'float',
+                       'awesome' => 'bool',
+                       'stuff' => 'array',
+                       'moarstuff' => 'blob',
+                       'time' => 'int', // TS_MW
+               );
+       }
+
+       /**
+        * Gets the db field prefix.
+        *
+        * @since 1.20
+        *
+        * @return string
+        */
+       protected function getFieldPrefix() {
+               return 'test_';
+       }
+
+
+}
index 5a4e66d..1627c47 100644 (file)
@@ -30,7 +30,7 @@ class MWDebugTest extends MediaWikiTestCase {
                $this->assertEquals( array( array(
                        'msg' => 'Warning message',
                        'type' => 'warn',
-                       'caller' => 'MWDebug::warning',
+                       'caller' => 'MWDebugTest::testAddWarning',
                        ) ),
                        MWDebug::getLog()
                );
index da44797..710ad83 100644 (file)
@@ -7,7 +7,6 @@
 class FileBackendTest extends MediaWikiTestCase {
        private $backend, $multiBackend;
        private $filesToPrune = array();
-       private $dirsToPrune = array();
        private static $backendToUse;
 
        function setUp() {
@@ -23,10 +22,11 @@ class FileBackendTest extends MediaWikiTestCase {
                                foreach ( $wgFileBackends as $conf ) {
                                        if ( $conf['name'] == $name ) {
                                                $useConfig = $conf;
+                                               break;
                                        }
                                }
                                $useConfig['name'] = 'localtesting'; // swap name
-                               $class = $conf['class'];
+                               $class = $useConfig['class'];
                                self::$backendToUse = new $class( $useConfig );
                                $this->singleBackend = self::$backendToUse;
                        }
@@ -34,6 +34,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->singleBackend = new FSFileBackend( array(
                                'name'        => 'localtesting',
                                'lockManager' => 'fsLockManager',
+                               #'parallelize' => 'implicit',
                                'containerPaths' => array(
                                        'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
                                        'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
@@ -42,6 +43,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->multiBackend = new FileBackendMultiWrite( array(
                        'name'        => 'localtesting',
                        'lockManager' => 'fsLockManager',
+                       'parallelize' => 'implicit',
                        'backends'    => array(
                                array(
                                        'name'          => 'localmutlitesting1',
@@ -204,7 +206,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestStore( $op ) {
+       private function doTestStore( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -219,9 +221,9 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = $this->backend->doOperation( $op );
 
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Store from $source to $dest succeeded without warnings ($backendName)." );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertEquals( true, $status->isOK(),
                        "Store from $source to $dest succeeded ($backendName)." );
                $this->assertEquals( array( 0 => true ), $status->success,
                        "Store from $source to $dest has proper 'success' field in Status ($backendName)." );
@@ -286,7 +288,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->tearDownFiles();
        }
 
-       function doTestCopy( $op ) {
+       private function doTestCopy( $op ) {
                $backendName = $this->backendClass();
 
                $source = $op['src'];
@@ -296,7 +298,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = $this->backend->doOperation(
                        array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Creation of file at $source succeeded ($backendName)." );
 
                if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
@@ -305,7 +307,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = $this->backend->doOperation( $op );
 
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Copy from $source to $dest succeeded without warnings ($backendName)." );
                $this->assertEquals( true, $status->isOK(),
                        "Copy from $source to $dest succeeded ($backendName)." );
@@ -384,7 +386,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = $this->backend->doOperation(
                        array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Creation of file at $source succeeded ($backendName)." );
 
                if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
@@ -392,7 +394,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
 
                $status = $this->backend->doOperation( $op );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Move from $source to $dest succeeded without warnings ($backendName)." );
                $this->assertEquals( true, $status->isOK(),
                        "Move from $source to $dest succeeded ($backendName)." );
@@ -472,13 +474,13 @@ class FileBackendTest extends MediaWikiTestCase {
                if ( $withSource ) {
                        $status = $this->backend->doOperation(
                                array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Creation of file at $source succeeded ($backendName)." );
                }
 
                $status = $this->backend->doOperation( $op );
                if ( $okStatus ) {
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Deletion of file at $source succeeded without warnings ($backendName)." );
                        $this->assertEquals( true, $status->isOK(),
                                "Deletion of file at $source succeeded ($backendName)." );
@@ -554,13 +556,13 @@ class FileBackendTest extends MediaWikiTestCase {
                if ( $alreadyExists ) {
                        $status = $this->backend->doOperation(
                                array( 'op' => 'create', 'content' => $oldText, 'dst' => $dest ) );
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Creation of file at $dest succeeded ($backendName)." );
                }
 
                $status = $this->backend->doOperation( $op );
                if ( $okStatus ) {
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Creation of file at $dest succeeded without warnings ($backendName)." );
                        $this->assertEquals( true, $status->isOK(),
                                "Creation of file at $dest succeeded ($backendName)." );
@@ -649,6 +651,54 @@ class FileBackendTest extends MediaWikiTestCase {
                return $cases;
        }
 
+       public function testDoQuickOperations() {
+               $this->backend = $this->singleBackend;
+               $this->doTestDoQuickOperations();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestDoQuickOperations();
+               $this->tearDownFiles();
+       }
+
+       private function doTestDoQuickOperations() {
+               $backendName = $this->backendClass();
+
+               $base = $this->baseStorePath();
+               $files = array(
+                       "$base/unittest-cont1/fileA.a",
+                       "$base/unittest-cont1/fileB.a",
+                       "$base/unittest-cont1/fileC.a"
+               );
+               $ops = array();
+               $purgeOps = array();
+               foreach ( $files as $path ) {
+                       $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
+                       $this->assertGoodStatus( $status,
+                               "Preparing $path succeeded without warnings ($backendName)." );
+                       $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0,50000) );
+                       $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+               }
+               $purgeOps[] = array( 'op' => 'null' );
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
+                       "Creation of source files succeeded ($backendName)." );
+
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
+                               "File $file exists." );
+               }
+
+               $status = $this->backend->doQuickOperations( $purgeOps );
+               $this->assertGoodStatus( $status,
+                       "Quick deletion of source files succeeded ($backendName)." );
+
+               foreach ( $files as $file ) {
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
+                               "File $file purged." );
+               }
+       }
+
        /**
         * @dataProvider provider_testConcatenate
         */
@@ -667,7 +717,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 = '';
@@ -684,7 +734,7 @@ class FileBackendTest extends MediaWikiTestCase {
                }
                $status = $this->backend->doOperations( $ops );
 
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Creation of source files succeeded ($backendName)." );
 
                $dest = $params['dst'];
@@ -701,7 +751,7 @@ class FileBackendTest extends MediaWikiTestCase {
                // Combine the files into one
                $status = $this->backend->concatenate( $params );
                if ( $okStatus ) {
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Creation of concat file at $dest succeeded without warnings ($backendName)." );
                        $this->assertEquals( true, $status->isOK(),
                                "Creation of concat file at $dest succeeded ($backendName)." );
@@ -800,8 +850,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
                if ( $alreadyExists ) {
                        $this->prepare( array( 'dir' => dirname( $path ) ) );
-                       $status = $this->backend->create( array( 'dst' => $path, 'content' => $content ) );
-                       $this->assertEquals( array(), $status->errors,
+                       $status = $this->create( array( 'dst' => $path, 'content' => $content ) );
+                       $this->assertGoodStatus( $status,
                                "Creation of file at $path succeeded ($backendName)." );
 
                        $size = $this->backend->getFileSize( array( 'src' => $path ) );
@@ -810,20 +860,20 @@ class FileBackendTest extends MediaWikiTestCase {
 
                        $this->assertEquals( strlen( $content ), $size,
                                "Correct file size of '$path'" );
-                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 5,
+                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
                                "Correct file timestamp of '$path'" );
 
                        $size = $stat['size'];
                        $time = $stat['mtime'];
                        $this->assertEquals( strlen( $content ), $size,
                                "Correct file size of '$path'" );
-                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 5,
+                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
                                "Correct file timestamp of '$path'" );
                } else {
                        $size = $this->backend->getFileSize( array( 'src' => $path ) );
                        $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
                        $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-                       
+
                        $this->assertFalse( $size, "Correct file size of '$path'" );
                        $this->assertFalse( $time, "Correct file timestamp of '$path'" );
                        $this->assertFalse( $stat, "Correct file stat of '$path'" );
@@ -856,14 +906,14 @@ 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 ) ) );
 
                $status = $this->backend->doOperation(
                        array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Creation of file at $source succeeded ($backendName)." );
                $this->assertEquals( true, $status->isOK(),
                        "Creation of file at $source succeeded with OK status ($backendName)." );
@@ -901,14 +951,14 @@ 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 ) ) );
 
                $status = $this->backend->doOperation(
                        array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
-               $this->assertEquals( array(), $status->errors,
+               $this->assertGoodStatus( $status,
                        "Creation of file at $source succeeded ($backendName)." );
 
                $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
@@ -949,9 +999,8 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $this->prepare( array( 'dir' => dirname( $source ) ) );
 
-               $status = $this->backend->doOperation(
-                       array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
-               $this->assertEquals( array(), $status->errors,
+               $status = $this->create( array( 'content' => $content, 'dst' => $source ) );
+               $this->assertGoodStatus( $status,
                        "Creation of file at $source succeeded ($backendName)." );
 
                $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
@@ -995,12 +1044,12 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
-       function doTestPrepareAndClean( $path, $isOK ) {
+       private function doTestPrepareAndClean( $path, $isOK ) {
                $backendName = $this->backendClass();
 
                $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
                if ( $isOK ) {
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Preparing dir $path succeeded without warnings ($backendName)." );
                        $this->assertEquals( true, $status->isOK(),
                                "Preparing dir $path succeeded ($backendName)." );
@@ -1011,7 +1060,7 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
                if ( $isOK ) {
-                       $this->assertEquals( array(), $status->errors,
+                       $this->assertGoodStatus( $status,
                                "Cleaning dir $path succeeded without warnings ($backendName)." );
                        $this->assertEquals( true, $status->isOK(),
                                "Cleaning dir $path succeeded ($backendName)." );
@@ -1021,6 +1070,58 @@ class FileBackendTest extends MediaWikiTestCase {
                }
        }
 
+       public function testRecursiveClean() {
+               $this->backend = $this->singleBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+       }
+
+       private function doTestRecursiveClean() {
+               $backendName = $this->backendClass();
+
+               $base = $this->baseStorePath();
+               $dirs = array(
+                       "$base/unittest-cont1/a",
+                       "$base/unittest-cont1/a/b",
+                       "$base/unittest-cont1/a/b/c",
+                       "$base/unittest-cont1/a/b/c/d0",
+                       "$base/unittest-cont1/a/b/c/d1",
+                       "$base/unittest-cont1/a/b/c/d2",
+                       "$base/unittest-cont1/a/b/c/d0/1",
+                       "$base/unittest-cont1/a/b/c/d0/2",
+                       "$base/unittest-cont1/a/b/c/d1/3",
+                       "$base/unittest-cont1/a/b/c/d1/4",
+                       "$base/unittest-cont1/a/b/c/d2/5",
+                       "$base/unittest-cont1/a/b/c/d2/6"
+               );
+               foreach ( $dirs as $dir ) {
+                       $status = $this->prepare( array( 'dir' => $dir ) );
+                       $this->assertGoodStatus( $status,
+                               "Preparing dir $dir succeeded without warnings ($backendName)." );
+               }
+
+               if ( $this->backend instanceof FSFileBackend ) {
+                       foreach ( $dirs as $dir ) {
+                               $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                                       "Dir $dir exists ($backendName)." );
+                       }
+               }
+
+               $status = $this->backend->clean(
+                       array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
+               $this->assertGoodStatus( $status,
+                       "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
+
+               foreach ( $dirs as $dir ) {
+                       $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                               "Dir $dir no longer exists ($backendName)." );
+               }
+       }
+
        // @TODO: testSecure
 
        public function testDoOperations() {
@@ -1036,18 +1137,26 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $this->backend = $this->singleBackend;
                $this->tearDownFiles();
-               $this->doTestDoOperationsFailing();
+               $this->doTestDoOperations2();
                $this->tearDownFiles();
 
                $this->backend = $this->multiBackend;
                $this->tearDownFiles();
+               $this->doTestDoOperations2();
+               $this->tearDownFiles();
+
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
                $this->doTestDoOperationsFailing();
                $this->tearDownFiles();
 
-               // @TODO: test some cases where the ops should fail
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperationsFailing();
+               $this->tearDownFiles();
        }
 
-       function doTestDoOperations() {
+       private function doTestDoOperations() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont1/a/b/fileA.txt";
@@ -1059,11 +1168,12 @@ class FileBackendTest extends MediaWikiTestCase {
                $fileD = "$base/unittest-cont1/a/b/fileD.txt";
 
                $this->prepare( array( 'dir' => dirname( $fileA ) ) );
-               $this->backend->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
                $this->prepare( array( 'dir' => dirname( $fileB ) ) );
-               $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
                $this->prepare( array( 'dir' => dirname( $fileC ) ) );
-               $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+               $this->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 ),
@@ -1094,7 +1204,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        // Does nothing
                ) );
 
-               $this->assertEquals( array(), $status->errors, "Operation batch succeeded" );
+               $this->assertGoodStatus( $status, "Operation batch succeeded" );
                $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
                $this->assertEquals( 13, count( $status->success ),
                        "Operation batch has correct success array" );
@@ -1119,7 +1229,94 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Correct file SHA-1 of $fileC" );
        }
 
-       function doTestDoOperationsFailing() {
+       // concurrency orientated
+       private function doTestDoOperations2() {
+               $base = $this->baseStorePath();
+
+               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+
+               $tmpNameA = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameA, $fileAContents );
+               $tmpNameB = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameB, $fileBContents );
+               $tmpNameC = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameC, $fileCContents );
+
+               $this->filesToPrune[] = $tmpNameA; # avoid file leaking
+               $this->filesToPrune[] = $tmpNameB; # avoid file leaking
+               $this->filesToPrune[] = $tmpNameC; # avoid file leaking
+
+               $fileA = "$base/unittest-cont1/a/b/fileA.txt";
+               $fileB = "$base/unittest-cont1/a/b/fileB.txt";
+               $fileC = "$base/unittest-cont1/a/b/fileC.txt";
+               $fileD = "$base/unittest-cont1/a/b/fileD.txt";
+
+               $this->prepare( array( 'dir' => dirname( $fileA ) ) );
+               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
+
+               $status = $this->backend->doOperations( array(
+                       array( 'op' => 'store', 'src' => $tmpNameA, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       array( 'op' => 'store', 'src' => $tmpNameB, 'dst' => $fileB, 'overwrite' => 1 ),
+                       array( 'op' => 'store', 'src' => $tmpNameC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<empty>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
+                       // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
+                       // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'null' ),
+                       // Does nothing
+               ) );
+
+               $this->assertGoodStatus( $status, "Operation batch succeeded" );
+               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+               $this->assertEquals( 16, count( $status->success ),
+                       "Operation batch has correct success array" );
+
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
+                       "File does not exist at $fileA" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+                       "File does not exist at $fileB" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+                       "File does not exist at $fileD" );
+
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+                       "File exists at $fileC" );
+               $this->assertEquals( $fileBContents,
+                       $this->backend->getFileContents( array( 'src' => $fileC ) ),
+                       "Correct file contents of $fileC" );
+               $this->assertEquals( strlen( $fileBContents ),
+                       $this->backend->getFileSize( array( 'src' => $fileC ) ),
+                       "Correct file size of $fileC" );
+               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+                       $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
+                       "Correct file SHA-1 of $fileC" );
+       }
+
+       private function doTestDoOperationsFailing() {
                $base = $this->baseStorePath();
 
                $fileA = "$base/unittest-cont2/a/b/fileA.txt";
@@ -1131,11 +1328,11 @@ class FileBackendTest extends MediaWikiTestCase {
                $fileD = "$base/unittest-cont2/a/b/fileD.txt";
 
                $this->prepare( array( 'dir' => dirname( $fileA ) ) );
-               $this->backend->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
                $this->prepare( array( 'dir' => dirname( $fileB ) ) );
-               $this->backend->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
                $this->prepare( array( 'dir' => dirname( $fileC ) ) );
-               $this->backend->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+               $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
 
                $status = $this->backend->doOperations( array(
                        array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
@@ -1195,8 +1392,11 @@ class FileBackendTest extends MediaWikiTestCase {
 
        private function doTestGetFileList() {
                $backendName = $this->backendClass();
-
                $base = $this->baseStorePath();
+
+               // Should have no errors
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
+
                $files = array(
                        "$base/unittest-cont1/test1.txt",
                        "$base/unittest-cont1/test2.txt",
@@ -1220,8 +1420,8 @@ class FileBackendTest extends MediaWikiTestCase {
                        $this->prepare( array( 'dir' => dirname( $file ) ) );
                        $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
                }
-               $status = $this->backend->doOperations( $ops );
-               $this->assertEquals( array(), $status->errors,
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
                        "Creation of files succeeded ($backendName)." );
                $this->assertEquals( true, $status->isOK(),
                        "Creation of files succeeded with OK status ($backendName)." );
@@ -1306,6 +1506,26 @@ class FileBackendTest extends MediaWikiTestCase {
 
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
 
+               // Expected listing (top files only)
+               $expected = array(
+                       "test1.txt",
+                       "test2.txt",
+                       "test3.txt",
+                       "test4.txt",
+                       "test5.txt"
+               );
+               sort( $expected );
+
+               // Actual listing (top files only)
+               $list = array();
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
+
                foreach ( $files as $file ) { // clean up
                        $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
                }
@@ -1314,12 +1534,251 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $iter as $iter ) {} // no errors
        }
 
+       public function testGetDirectoryList() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetDirectoryList() {
+               $backendName = $this->backendClass();
+
+               $base = $this->baseStorePath();
+               $files = array(
+                       "$base/unittest-cont1/test1.txt",
+                       "$base/unittest-cont1/test2.txt",
+                       "$base/unittest-cont1/test3.txt",
+                       "$base/unittest-cont1/subdir1/test1.txt",
+                       "$base/unittest-cont1/subdir1/test2.txt",
+                       "$base/unittest-cont1/subdir2/test3.txt",
+                       "$base/unittest-cont1/subdir2/test4.txt",
+                       "$base/unittest-cont1/subdir2/subdir/test1.txt",
+                       "$base/unittest-cont1/subdir3/subdir/test2.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test3.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test4.txt",
+                       "$base/unittest-cont1/subdir4/subdir/test5.txt",
+                       "$base/unittest-cont1/subdir4/subdir/sub/test0.txt",
+                       "$base/unittest-cont1/subdir4/subdir/sub/120-px-file.txt",
+               );
+
+               // Add the files
+               $ops = array();
+               foreach ( $files as $file ) {
+                       $this->prepare( array( 'dir' => dirname( $file ) ) );
+                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+               }
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
+                       "Creation of files succeeded ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Creation of files succeeded with OK status ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "subdir1",
+                       "subdir2",
+                       "subdir3",
+                       "subdir4",
+               );
+               sort( $expected );
+
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir1" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( true,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/subdir" ) ),
+                       "Directory exists in ($backendName)." );
+               $this->assertEquals( false,
+                       $this->backend->directoryExists( array( 'dir' => "$base/unittest-cont1/subdir2/test1.txt" ) ),
+                       "Directory does not exists in ($backendName)." );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "subdir",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir2/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (using iterator second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "subdir1",
+                       "subdir2",
+                       "subdir3",
+                       "subdir4",
+                       "subdir2/subdir",
+                       "subdir3/subdir",
+                       "subdir4/subdir",
+                       "subdir4/subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "subdir",
+                       "subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/subdir4" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Actual listing (recursive, second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               foreach ( $files as $file ) { // clean up
+                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+               }
+
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+               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'];
                return $this->backend->prepare( $params );
        }
 
+       // test helper wrapper for backend prepare() function
+       private function create( array $params ) {
+               $params['op'] = 'create';
+               return $this->backend->doQuickOperations( array( $params ) );
+       }
+
        function tearDownFiles() {
                foreach ( $this->filesToPrune as $file ) {
                        @unlink( $file );
@@ -1328,10 +1787,7 @@ class FileBackendTest extends MediaWikiTestCase {
                foreach ( $containers as $container ) {
                        $this->deleteFiles( $container );
                }
-               foreach ( $this->dirsToPrune as $dir ) {
-                       $this->recursiveClean( $dir );
-               }
-               $this->filesToPrune = $this->dirsToPrune = array();
+               $this->filesToPrune = array();
        }
 
        private function deleteFiles( $container ) {
@@ -1339,17 +1795,15 @@ 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 ) );
                        }
                }
+               $this->backend->clean( array( 'dir' => "$base/$container", 'recursive' => 1 ) );
        }
 
-       private function recursiveClean( $dir ) {
-               do {
-                       if ( !$this->backend->clean( array( 'dir' => $dir ) )->isOK() ) {
-                               break;
-                       }
-               } while ( $dir = FileBackend::parentStoragePath( $dir ) );
+       function assertGoodStatus( $status, $msg ) {
+               $this->assertEquals( print_r( array(), 1 ), print_r( $status->errors, 1 ), $msg );
        }
 
        function tearDown() {
diff --git a/tests/phpunit/includes/libs/CSSMinTest.php b/tests/phpunit/includes/libs/CSSMinTest.php
new file mode 100644 (file)
index 0000000..a382775
--- /dev/null
@@ -0,0 +1,142 @@
+<?php
+/**
+ * This file test the CSSMin library shipped with Mediawiki.
+ *
+ * @author Timo Tijhof
+ */
+
+class CSSMinTest extends MediaWikiTestCase {
+       protected $oldServer = null, $oldCanServer = null;
+
+       function setUp() {
+               parent::setUp();
+
+               // Fake $wgServer and $wgCanonicalServer
+               global $wgServer, $wgCanonicalServer;
+               $this->oldServer = $wgServer;
+               $this->oldCanServer = $wgCanonicalServer;
+               $wgServer = $wgCanonicalServer = 'http://wiki.example.org';
+       }
+
+       function tearDown() {
+               // Restore $wgServer and $wgCanonicalServer
+               global $wgServer, $wgCanonicalServer;
+               $wgServer = $this->oldServer;
+               $wgCanonicalServer = $this->oldCanServer;
+
+               parent::tearDown();
+       }
+
+       /**
+        * @dataProvider provideMinifyCases
+        */
+       function testMinify( $code, $expectedOutput ) {
+               $minified = CSSMin::minify( $code );
+
+               $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
+       }
+
+       function provideMinifyCases() {
+               return array(
+                       // Whitespace
+                       array( "\r\t\f \v\n\r", "" ),
+                       array( "foo, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
+
+                       // Loose comments
+                       array( "/* foo */", "" ),
+                       array( "/*******\n foo\n *******/", "" ),
+                       array( "/*!\n foo\n */", "" ),
+
+                       // Inline comments in various different places
+                       array( "/* comment */foo, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo/* comment */, bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo,/* comment */ bar {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo, bar/* comment */ {\n\tprop: value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo, bar {\n\t/* comment */prop: value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo, bar {\n\tprop: /* comment */value;\n}", "foo,bar{prop:value}" ),
+                       array( "foo, bar {\n\tprop: value /* comment */;\n}", "foo,bar{prop:value }" ),
+                       array( "foo, bar {\n\tprop: value; /* comment */\n}", "foo,bar{prop:value; }" ),
+
+                       // Keep track of things that aren't as minified as much as they
+                       // could be (bug 35493)
+                       array( 'foo { prop: value ;}', 'foo{prop:value }' ),
+                       array( 'foo { prop : value; }', 'foo{prop :value}' ),
+                       array( 'foo { prop: value ; }', 'foo{prop:value }' ),
+                       array( 'foo { font-family: "foo" , "bar"; }', 'foo{font-family:"foo" ,"bar"}' ),
+                       array( "foo { src:\n\turl('foo') ,\n\turl('bar') ; }", "foo{src:url('foo') ,url('bar') }" ),
+
+                       // Interesting cases with string values
+                       // - Double quotes, single quotes
+                       array( 'foo { content: ""; }', 'foo{content:""}' ),
+                       array( "foo { content: ''; }", "foo{content:''}" ),
+                       array( 'foo { content: "\'"; }', 'foo{content:"\'"}' ),
+                       array( "foo { content: '\"'; }", "foo{content:'\"'}" ),
+                       // - Whitespace in string values
+                       array( 'foo { content: " "; }', 'foo{content:" "}' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRemapCases
+        */
+       function testRemap( $message, $params, $expectedOutput ) {
+               $remapped = call_user_func_array( 'CSSMin::remap', $params );
+
+               $messageAdd = " Case: $message";
+               $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
+       }
+
+       function provideRemapCases() {
+               // Parameter signature:
+               // CSSMin::remap( $code, $local, $remote, $embedData = true )
+               return array(
+                       array(
+                               'Simple case',
+                               array( 'foo { prop: url(bar.png); }', false, 'http://example.org', false ),
+                               'foo { prop: url(http://example.org/bar.png); }',
+                       ),
+                       array(
+                               'Without trailing slash',
+                               array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux', false ),
+                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                       ),
+                       array(
+                               'With trailing slash on remote (bug 27052)',
+                               array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ),
+                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                       ),
+                       array(
+                               'Guard against stripping double slashes from query',
+                               array( 'foo { prop: url(bar.png?corge=//grault); }', false, 'http://example.org/quux/', false ),
+                               'foo { prop: url(http://example.org/quux/bar.png?corge=//grault); }',
+                       ),
+                       array(
+                               'Expand absolute paths',
+                               array( 'foo { prop: url(/w/skin/images/bar.png); }', false, 'http://example.org/quux', false ),
+                               'foo { prop: url(http://wiki.example.org/w/skin/images/bar.png); }',
+                       ),
+               );
+       }
+
+       /**
+        * Seperated because they are currently broken (bug 35492)
+        *
+        * @group Broken
+        * @dataProvider provideStringCases
+        */
+       function testMinifyWithCSSStringValues( $code, $expectedOutput ) {
+               $this->testMinifyOutput( $code, $expectedOutput );
+       }
+
+       function provideStringCases() {
+               return array(
+                       // String values should be respected
+                       // - More than one space in a string value
+                       array( 'foo { content: "  "; }', 'foo{content:"  "}' ),
+                       // - Using a tab in a string value (turns into a space)
+                       array( "foo { content: '\t'; }", "foo{content:'\t'}" ),
+                       // - Using css-like syntax in string values
+                       array( 'foo::after { content: "{;}"; position: absolute; }', 'foo::after{content:"{;}";position:absolute}' ),
+               );
+       }
+}
index d2bfeed..f121b01 100644 (file)
@@ -4,9 +4,18 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
        function provideCases() {
                return array(
-                       // Basic tokens
+
+                       // Basic whitespace and comments that should be stripped entirely
                        array( "\r\t\f \v\n\r", "" ),
                        array( "/* Foo *\n*bar\n*/", "" ),
+
+                       /**
+                        * Slashes used inside block comments (bug 26931).
+                        * At some point there was a bug that caused this comment to be ended at '* /',
+                        * causing /M... to be left as the beginning of a regex.
+                        */
+                       array( "/**\n * Foo\n * {\n * 'bar' : {\n * //Multiple rules with configurable operators\n * 'baz' : false\n * }\n */", ""),
+
                        /**
                         * '  Foo \' bar \
                         *  baz \' quox '  .
@@ -15,11 +24,13 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length", "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length" ),
                        array( "// Foo b/ar baz", "" ),
                        array( "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length", "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length" ),
+
                        // HTML comments
                        array( "<!-- Foo bar", "" ),
                        array( "<!-- Foo --> bar", "" ),
                        array( "--> Foo", "" ),
                        array( "x --> y", "x-->y" ),
+
                        // Semicolon insertion
                        array( "(function(){return\nx;})", "(function(){return\nx;})" ),
                        array( "throw\nx;", "throw\nx;" ),
@@ -35,12 +46,19 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "5.\nx;", "5.\nx;" ),
                        array( "0xFF.\nx;", "0xFF.x;" ),
                        array( "5.3.\nx;", "5.3.x;" ),
+
+                       // Semicolon insertion between an expression having an inline
+                       // comment after it, and a statement on the next line (bug 27046).
+                       array( "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}", "var a=this\nfor(b=0;c<d;b++){}" ),
+
                        // Token separation
                        array( "x  in  y", "x in y" ),
                        array( "/x/g  in  y", "/x/g in y" ),
                        array( "x  in  30", "x in 30" ),
                        array( "x  +  ++  y", "x+ ++y" ),
+                       array( "x ++  +  y", "x++ +y" ),
                        array( "x  /  /y/.exec(z)", "x/ /y/.exec(z)" ),
+
                        // State machine
                        array( "/  x/g", "/  x/g" ),
                        array( "(function(){return/  x/g})", "(function(){return/  x/g})" ),
@@ -63,15 +81,18 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "function x(){}/  x/g", "function x(){}/  x/g" ),
                        array( "+function x(){}/  x/g", "+function x(){}/x/g" ),
                        
-                       // Tests for things that broke in the past
                        // Multiline quoted string
                        array( "var foo=\"\\\nblah\\\n\";", "var foo=\"\\\nblah\\\n\";" ),
+
                        // Multiline quoted string followed by string with spaces
                        array( "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n", "var foo=\"\\\nblah\\\n\";var baz=\" foo \";" ),
+
                        // URL in quoted string ( // is not a comment)
                        array( "aNode.setAttribute('href','http://foo.bar.org/baz');", "aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+
                        // URL in quoted string after multiline quoted string
                        array( "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');", "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+
                        // Division vs. regex nastiness
                        array( "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );", "alert((10+10)/'/'.charCodeAt(0)+'//');" ),
                        array( "if(1)/a /g.exec('Pa ss');", "if(1)/a /g.exec('Pa ss');" ),
@@ -81,11 +102,12 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
                        // Unicode letter characters should pass through ok in identifiers (bug 31187)
                        array( "var KaŝSkatolVal = {}", 'var KaŝSkatolVal={}'),
-                       // And also per spec unicode char escape values should work in identifiers,
+
+                       // Per spec unicode char escape values should work in identifiers,
                        // as long as it's a valid char. In future it might get normalized.
                        array( "var Ka\\u015dSkatolVal = {}", 'var Ka\\u015dSkatolVal={}'),
 
-                       /* Some structures that might look invalid at first sight */
+                       // Some structures that might look invalid at first sight
                        array( "var a = 5.;", "var a=5.;" ),
                        array( "5.0.toString();", "5.0.toString();" ),
                        array( "5..toString();", "5..toString();" ),
@@ -110,24 +132,6 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
        }
 
-       /**
-        * @dataProvider provideBug32548
-        */
-       function testBug32548Exponent($num) {
-               // Long line breaking was being incorrectly done between the base and
-               // exponent part of a number, causing a syntax error. The line should
-               // instead break at the start of the number.
-               $prefix = 'var longVarName' . str_repeat('_', 973) . '=';
-               $suffix = ',shortVarName=0;';
-
-               $input = $prefix . $num . $suffix;
-               $expected = $prefix . "\n" . $num . $suffix;
-
-               $minified = JavaScriptMinifier::minify( $input );
-
-               $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
-       }
-
        function provideBug32548() {
                return array(
                        array(
@@ -145,4 +149,22 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+       /**
+        * @dataProvider provideBug32548
+        */
+       function testBug32548Exponent( $num ) {
+               // Long line breaking was being incorrectly done between the base and
+               // exponent part of a number, causing a syntax error. The line should
+               // instead break at the start of the number.
+               $prefix = 'var longVarName' . str_repeat( '_', 973 ) . '=';
+               $suffix = ',shortVarName=0;';
+
+               $input = $prefix . $num . $suffix;
+               $expected = $prefix . "\n" . $num . $suffix;
+
+               $minified = JavaScriptMinifier::minify( $input );
+
+               $this->assertEquals( $expected, $minified, "Line breaks must not occur in middle of exponent");
+       }
 }
diff --git a/tests/phpunit/includes/mobile/DeviceDetectionTest.php b/tests/phpunit/includes/mobile/DeviceDetectionTest.php
new file mode 100644 (file)
index 0000000..0e15653
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * @group Mobile
+ */
+ class DeviceDetectionTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideTestFormatName
+        */
+       public function testFormatName( $format, $userAgent ) {
+               $detector = new DeviceDetection();
+               $this->assertEquals( $format, $detector->detectFormatName( $userAgent ) );
+       }
+
+       public function provideTestFormatName() {
+               return array(
+                       array( 'android',   'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' ),
+                       array( 'iphone2',   'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
+                       array( 'iphone',    'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
+                       array( 'nokia',     'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413' ),
+                       array( 'palm_pre',  'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0' ),
+                       array( 'wii',       'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)' ),
+                       array( 'operamini', 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)' ),
+                       array( 'operamobile',    'Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)' ),
+                       array( 'kindle',    'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' ),
+                       array( 'kindle2',   'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)' ),
+                       array( 'capable',   'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' ),
+                       array( 'netfront',  'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2' ),
+                       array( 'wap2',      'SonyEricssonK608i/R2L/SN356841000828910 Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
+                       array( 'wap2',      'NokiaN73-2/3.0-630.0.2 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
+                       array( 'psp',       'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' ),
+                       array( 'ps3',       'Mozilla/5.0 (PLAYSTATION 3; 1.00)' ),
+                       array( 'ie', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' ),
+                       array( 'ie', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)' ),
+                       array( 'blackberry', 'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133' ),
+                       array( 'blackberry-lt5', 'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
+               );
+       }
+}
index d1221ca..d9b1671 100644 (file)
@@ -510,7 +510,10 @@ class NewParserTest extends MediaWikiTestCase {
                $this->file = $filename;
        }
 
-       /** @dataProvider parserTestProvider */
+       /**
+        * @group medium
+        * @dataProvider parserTestProvider
+        */
        public function testParserTest( $desc, $input, $result, $opts, $config ) {
                if ( $this->regex != '' && !preg_match( '/' . $this->regex . '/', $desc ) ) {
                        $this->assertTrue( true ); // XXX: don't flood output with "test made no assertions"
diff --git a/tests/phpunit/includes/parser/ParserMethodsTest.php b/tests/phpunit/includes/parser/ParserMethodsTest.php
new file mode 100644 (file)
index 0000000..dea406c
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+
+class ParserMethodsTest extends MediaWikiLangTestCase {
+
+       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 ) {
+               global $wgParser;
+
+               $title = Title::newFromText( str_replace( '::', '__', __METHOD__ ) );
+               $user = new User();
+               $user->setName( "127.0.0.1" );
+               $popts = ParserOptions::newFromUser( $user );
+               $text = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+               $this->assertEquals( $expected, $text );
+       }
+
+       // TODO: Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+}
+
index c6498fa..f66c387 100644 (file)
@@ -20,7 +20,7 @@ class UploadFromUrlTest extends ApiTestCase {
                }
        }
 
-       protected function doApiRequest( $params, $unused = null, $appendModule = false, $user = null ) {
+       protected function doApiRequest( Array $params, Array $unused = null, $appendModule = false, User $user = null ) {
                $sessionId = session_id();
                session_write_close();
 
index c089c31..a1a6d59 100644 (file)
@@ -654,4 +654,205 @@ class LanguageTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+
+
+       /**
+        * @dataProvider provideFormatDuration
+        */
+       function testFormatDuration( $duration, $expected, $intervals = array() ) {
+               $this->assertEquals(
+                       $expected,
+                       $this->lang->formatDuration( $duration, $intervals ),
+                       "formatDuration('$duration'): $expected"
+               );
+       }
+
+       function provideFormatDuration() {
+               return array(
+                       array(
+                               0,
+                               '0 seconds',
+                       ),
+                       array(
+                               1,
+                               '1 second',
+                       ),
+                       array(
+                               2,
+                               '2 seconds',
+                       ),
+                       array(
+                               60,
+                               '1 minute',
+                       ),
+                       array(
+                               2 * 60,
+                               '2 minutes',
+                       ),
+                       array(
+                               3600,
+                               '1 hour',
+                       ),
+                       array(
+                               2 * 3600,
+                               '2 hours',
+                       ),
+                       array(
+                               24 * 3600,
+                               '1 day',
+                       ),
+                       array(
+                               2 * 86400,
+                               '2 days',
+                       ),
+                       array(
+                               365.25 * 86400, // 365.25 * 86400 = 31557600
+                               '1 year',
+                       ),
+                       array(
+                               2 * 31557600,
+                               '2 years',
+                       ),
+                       array(
+                               10 * 31557600,
+                               '1 decade',
+                       ),
+                       array(
+                               20 * 31557600,
+                               '2 decades',
+                       ),
+                       array(
+                               100 * 31557600,
+                               '1 century',
+                       ),
+                       array(
+                               200 * 31557600,
+                               '2 centuries',
+                       ),
+                       array(
+                               1000 * 31557600,
+                               '1 millennium',
+                       ),
+                       array(
+                               2000 * 31557600,
+                               '2 millennia',
+                       ),
+                       array(
+                               9001,
+                               '2 hours, 30 minutes and 1 second'
+                       ),
+                       array(
+                               3601,
+                               '1 hour and 1 second'
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days, 2 hours and 30 minutes'
+                       ),
+                       array(
+                               42 * 1000 * 31557600 + 42,
+                               '42 millennia and 42 seconds'
+                       ),
+                       array(
+                               60,
+                               '60 seconds',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               61,
+                               '61 seconds',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               1,
+                               '1 second',
+                               array( 'seconds' ),
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days and 150 minutes',
+                               array( 'years', 'days', 'minutes' ),
+                       ),
+                       array(
+                               42,
+                               '0 days',
+                               array( 'years', 'days' ),
+                       ),
+                       array(
+                               31557600 + 2 * 86400 + 9000,
+                               '1 year, 2 days and 150 minutes',
+                               array( 'minutes', 'days', 'years' ),
+                       ),
+                       array(
+                               42,
+                               '0 days',
+                               array( 'days', 'years' ),
+                       ),
+               );
+       }
+
+       /**\r
+        * @dataProvider provideCheckTitleEncodingData\r
+        */\r
+       function testCheckTitleEncoding( $s ) {\r
+               $this->assertEquals(\r
+                       $s,\r
+                       $this->lang->checkTitleEncoding($s),\r
+                       "checkTitleEncoding('$s')"\r
+               );\r
+       }\r
+
+       function provideCheckTitleEncodingData() {
+               return array (
+                       array( "" ),
+                       array( "United States of America" ), // 7bit ASCII
+                       array( rawurldecode( "S%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e" ) ),
+                       array(
+                               rawurldecode(
+                                       "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn"
+                               )
+                       ),
+                       // The following two data sets come from bug 36839. They fail if checkTitleEncoding uses a regexp to test for
+                       // valid UTF-8 encoding and the pcre.recursion_limit is low (like, say, 1024). They succeed if checkTitleEncoding
+                   // uses mb_check_encoding for its test.
+                       array(
+                               rawurldecode(
+                                       "Acteur%7CAlbert%20Robbins%7CAnglais%7CAnn%20Donahue%7CAnthony%20E.%20Zuiker%7CCarol%20Mendelsohn%7C"
+                                       . "Catherine%20Willows%7CDavid%20Hodges%7CDavid%20Phillips%7CGil%20Grissom%7CGreg%20Sanders%7CHodges%7C"
+                                       . "Internet%20Movie%20Database%7CJim%20Brass%7CLady%20Heather%7C"
+                                       . "Les%20Experts%20(s%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e)%7CLes%20Experts%20:%20Manhattan%7C"
+                                       . "Les%20Experts%20:%20Miami%7CListe%20des%20personnages%20des%20Experts%7C"
+                                       . "Liste%20des%20%C3%A9pisodes%20des%20Experts%7CMod%C3%A8le%20discussion:Palette%20Les%20Experts%7C"
+                                       . "Nick%20Stokes%7CPersonnage%20de%20fiction%7CPersonnage%20fictif%7CPersonnage%20de%20fiction%7C"
+                                       . "Personnages%20r%C3%A9currents%20dans%20Les%20Experts%7CRaymond%20Langston%7CRiley%20Adams%7C"
+                                       . "Saison%201%20des%20Experts%7CSaison%2010%20des%20Experts%7CSaison%2011%20des%20Experts%7C"
+                                       . "Saison%2012%20des%20Experts%7CSaison%202%20des%20Experts%7CSaison%203%20des%20Experts%7C"
+                                       . "Saison%204%20des%20Experts%7CSaison%205%20des%20Experts%7CSaison%206%20des%20Experts%7C"
+                                       . "Saison%207%20des%20Experts%7CSaison%208%20des%20Experts%7CSaison%209%20des%20Experts%7C"
+                                       . "Sara%20Sidle%7CSofia%20Curtis%7CS%C3%A9rie%20t%C3%A9l%C3%A9vis%C3%A9e%7CWallace%20Langham%7C"
+                                       . "Warrick%20Brown%7CWendy%20Simms%7C%C3%89tats-Unis"
+                               ),
+                       ),
+                       array(
+                               rawurldecode(
+                                       "Mod%C3%A8le%3AArrondissements%20homonymes%7CMod%C3%A8le%3ABandeau%20standard%20pour%20page%20d'homonymie%7C"
+                                       . "Mod%C3%A8le%3ABatailles%20homonymes%7CMod%C3%A8le%3ACantons%20homonymes%7C"
+                                       . "Mod%C3%A8le%3ACommunes%20fran%C3%A7aises%20homonymes%7CMod%C3%A8le%3AFilms%20homonymes%7C"
+                                       . "Mod%C3%A8le%3AGouvernements%20homonymes%7CMod%C3%A8le%3AGuerres%20homonymes%7CMod%C3%A8le%3AHomonymie%7C"
+                                       . "Mod%C3%A8le%3AHomonymie%20bateau%7CMod%C3%A8le%3AHomonymie%20d'%C3%A9tablissements%20scolaires%20ou"
+                                       . "%20universitaires%7CMod%C3%A8le%3AHomonymie%20d'%C3%AEles%7CMod%C3%A8le%3AHomonymie%20de%20clubs%20sportifs%7C"
+                                       . "Mod%C3%A8le%3AHomonymie%20de%20comt%C3%A9s%7CMod%C3%A8le%3AHomonymie%20de%20monument%7C"
+                                       . "Mod%C3%A8le%3AHomonymie%20de%20nom%20romain%7CMod%C3%A8le%3AHomonymie%20de%20parti%20politique%7C"
+                                       . "Mod%C3%A8le%3AHomonymie%20de%20route%7CMod%C3%A8le%3AHomonymie%20dynastique%7C"
+                                       . "Mod%C3%A8le%3AHomonymie%20vid%C3%A9oludique%7CMod%C3%A8le%3AHomonymie%20%C3%A9difice%20religieux%7C"
+                                       . "Mod%C3%A8le%3AInternationalisation%7CMod%C3%A8le%3AIsom%C3%A9rie%7CMod%C3%A8le%3AParonymie%7C"
+                                       . "Mod%C3%A8le%3APatronyme%7CMod%C3%A8le%3APatronyme%20basque%7CMod%C3%A8le%3APatronyme%20italien%7C"
+                                       . "Mod%C3%A8le%3APatronymie%7CMod%C3%A8le%3APersonnes%20homonymes%7CMod%C3%A8le%3ASaints%20homonymes%7C"
+                                       . "Mod%C3%A8le%3ATitres%20homonymes%7CMod%C3%A8le%3AToponymie%7CMod%C3%A8le%3AUnit%C3%A9s%20homonymes%7C"
+                                       . "Mod%C3%A8le%3AVilles%20homonymes%7CMod%C3%A8le%3A%C3%89difices%20religieux%20homonymes"
+                               )
+                       )
+               );
+       }
 }
index 2f8c232..b5eb573 100644 (file)
@@ -1,11 +1,9 @@
 <?php
-global $IP;
-require_once( "$IP/maintenance/backup.inc" );
 
 /**
  * Base TestCase for dumps
  */
-abstract class DumpTestCase extends MediaWikiTestCase {
+abstract class DumpTestCase extends MediaWikiLangTestCase {
 
        /**
         * exception to be rethrown once in sound PHPUnit surrounding
@@ -74,7 +72,7 @@ abstract class DumpTestCase extends MediaWikiTestCase {
         *
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
-       function setUp() {
+       public function setUp() {
                global $wgUser;
 
                parent::setUp();
@@ -88,6 +86,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.
         *
@@ -273,13 +295,17 @@ abstract class DumpTestCase extends MediaWikiTestCase {
         * @param $text_sha1 string: the base36 SHA-1 of the revision's text
         * @param $text string|false: (optional) The revision's string, or false to check for a
         *            revision stub
+        * @param $parentid int|false: (optional) id of the parent revision
         */
-       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false ) {
+       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false ) {
 
                $this->assertNodeStart( "revision" );
                $this->skipWhitespace();
 
                $this->assertTextNode( "id", $id );
+               if ( $parentid !== false ) {
+                       $this->assertTextNode( "parentid", $parentid );
+               }
                $this->assertTextNode( "timestamp", false );
 
                $this->assertNodeStart( "contributor" );
@@ -290,13 +316,14 @@ abstract class DumpTestCase extends MediaWikiTestCase {
 
                $this->assertTextNode( "comment", $summary );
 
+               $this->assertTextNode( "sha1", $text_sha1 );
+
                $this->assertNodeStart( "text", false );
                if ( $text_bytes !== false ) {
                        $this->assertEquals( $this->xml->getAttribute( "bytes" ), $text_bytes,
                                "Attribute 'bytes' of revision " . $id );
                }
 
-
                if ( $text === false ) {
                        // Testing for a stub
                        $this->assertEquals( $this->xml->getAttribute( "id" ), $text_id,
@@ -318,8 +345,6 @@ abstract class DumpTestCase extends MediaWikiTestCase {
                        $this->skipWhitespace();
                }
 
-               $this->assertTextNode( "sha1", $text_sha1 );
-
                $this->assertNodeEnd( "revision" );
                $this->skipWhitespace();
        }
diff --git a/tests/phpunit/maintenance/MaintenanceTest.php b/tests/phpunit/maintenance/MaintenanceTest.php
new file mode 100644 (file)
index 0000000..4a6f08f
--- /dev/null
@@ -0,0 +1,812 @@
+<?php
+
+// It would be great if we were able to use PHPUnit's getMockForAbstractClass
+// instead of the MaintenanceFixup hack below. However, we cannot do
+// without changing the visibility and without working around hacks in
+// Maintenance.php
+//
+// For the same reason, we cannot just use FakeMaintenance.
+
+/**
+ * makes parts of the API of Maintenance that is hidden by protected visibily
+ * visible for testing, and makes up for a stream closing hack in Maintenance.php.
+ *
+ * This class is solely used for being able to test Maintenance right now
+ * without having to apply major refactorings to fix some design issues in
+ * Maintenance.php. Before adding more functions here, please consider whether
+ * this approach is correct, or a refactoring Maintenance to separate concers
+ * is more appropriate.
+ *
+ * Upon refactoring, keep in mind that besides the maintenance scrits themselves
+ * and tests right here, also at least Extension:Maintenance make use of
+ * Maintenance.
+ *
+ * Due to a hack in Maintenance.php using register_shutdown_function, be sure to
+ * finally call simulateShutdown on MaintenanceFixup instance before a test
+ * ends.
+ *
+ */
+class MaintenanceFixup extends Maintenance {
+
+       // --- Making up for the register_shutdown_function hack in Maintenance.php
+
+       /**
+        * The test case that generated this instance.
+        *
+        * This member is motivated by allowing the destructor to check whether or not
+        * the test failed, in order to avoid unnecessary nags about omitted shutdown
+        * simulation.
+        * But as it is already available, we also usi it to flagging tests as failed
+        *
+        * @var MediaWikiTestCase
+        */
+       private $testCase;
+
+       /**
+        * shutdownSimulated === true iff simulateShutdown has done it's work
+        *
+        * @var bool
+        */
+       private $shutdownSimulated = false;
+
+       /**
+        * Simulates what Maintenance wants to happen at script's end.
+        */
+       public function simulateShutdown() {
+
+               if ( $this->shutdownSimulated ) {
+                       $this->testCase->fail( __METHOD__ . " called more than once" );
+               }
+
+               // The cleanup action.
+               $this->outputChanneled( false );
+
+               // Bookkeeping that we simulated the clean up.
+               $this->shutdownSimulated = true;
+       }
+
+       // Note that the "public" here does not change visibility
+       public function outputChanneled( $msg, $channel = null ) {
+               if ( $this->shutdownSimulated ) {
+                       if ( $msg !== false ) {
+                               $this->testCase->fail( "Already past simulated shutdown, but msg is "
+                                       . "not false. Did the hack in Maintenance.php change? Please "
+                                       . "adapt the test case or Maintenance.php" );
+                       }
+
+                       // The current call is the one registered via register_shutdown_function.
+                       // We can safely ignore it, as we simulated this one via simulateShutdown
+                       // before (if we did not, the destructor of this instance will warn about
+                       // it)
+                       return;
+               }
+
+               return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+       }
+
+       /**
+        * Safety net around register_shutdown_function of Maintenance.php
+        */
+       public function __destruct() {
+               if ( ( ! $this->shutdownSimulated ) && ( ! $this->testCase->hasFailed() ) ) {
+                       // Someone generated a MaintenanceFixup instance without calling
+                       // simulateShutdown. We'd have to raise a PHPUnit exception to correctly
+                       // flag this illegal usage. However, we are already in a destruktor, which
+                       // would trigger undefined behaviour. Hence, we can only report to the
+                       // error output :( Hopefully people read the PHPUnit output.
+                       fwrite( STDERR, "ERROR! Instance of " . __CLASS__ . " destructed without "
+                               . "calling simulateShutdown method. Call simulateShutdown on the "
+                               . "instance before it gets destructed." );
+               }
+
+               // The following guard is required, as PHP does not offer default destructors :(
+               if ( is_callable( "parent::__destruct" ) ) {
+                       parent::__destruct();
+               }
+       }
+
+       public function __construct( MediaWikiTestCase $testCase ) {
+               parent::__construct();
+               $this->testCase = $testCase;
+       }
+
+
+
+       // --- Making protected functions visible for test
+
+       public function output( $out, $channel = null ) {
+               // Just to make PHP not nag about signature mismatches, we copied
+               // Maintenance::output signature. However, we do not use (or rely on)
+               // those variables. Instead we pass to Maintenance::output whatever we
+               // receive at runtime.
+               return call_user_func_array ( array( "parent", __FUNCTION__ ), func_get_args() );
+       }
+
+
+
+       // --- Requirements for getting instance of abstract class
+
+       public function execute() {
+               $this->testCase->fail( __METHOD__ . " called unexpectedly" );
+       }
+
+}
+
+class MaintenanceTest extends MediaWikiTestCase {
+
+
+       /**
+        * The main Maintenance instance that is used for testing.
+        *
+        * @var MaintenanceFixup
+        */
+       private $m;
+
+
+       protected function setUp() {
+               parent::setUp();
+               $this->m = new MaintenanceFixup( $this );
+       }
+
+
+       /**
+        * asserts the output before and after simulating shutdown
+        *
+        * This function simulates shutdown of self::m.
+        *
+        * @param $preShutdownOutput string: expected output before simulating shutdown
+        * @param $expectNLAppending bool: Whether or not shutdown simulation is expected
+        *            to add a newline to the output. If false, $preShutdownOutput is the
+        *            expected output after shutdown simulation. Otherwise,
+        *            $preShutdownOutput with an appended newline is the expected output
+        *            after shutdown simulation.
+        */
+       private function assertOutputPrePostShutdown( $preShutdownOutput, $expectNLAppending ) {
+
+               $this->assertEquals( $preShutdownOutput, $this->getActualOutput(),
+                               "Output before shutdown simulation" );
+
+               $this->m->simulateShutdown();
+
+               $postShutdownOutput = $preShutdownOutput . ( $expectNLAppending ? "\n" : "" );
+               $this->expectOutputString( $postShutdownOutput );
+       }
+
+
+       // Although the following tests do not seem to be too consistent (compare for
+       // example the newlines within the test.*StringString tests, or the
+       // test.*Intermittent.* tests), the objective of these tests is not to describe
+       // consistent behaviour, but rather currently existing behaviour.
+
+
+       function testOutputEmpty() {
+               $this->m->output( "" );
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testOutputString() {
+               $this->m->output( "foo" );
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testOutputStringString() {
+               $this->m->output( "foo" );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputStringNL() {
+               $this->m->output( "foo\n" );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputStringNLNL() {
+               $this->m->output( "foo\n\n" );
+               $this->assertOutputPrePostShutdown( "foo\n\n", False );
+       }
+
+       function testOutputStringNLString() {
+               $this->m->output( "foo\nbar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", False );
+       }
+
+       function testOutputStringNLStringNL() {
+               $this->m->output( "foo\nbar\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLLinewise() {
+               $this->m->output( "foo\n" );
+               $this->m->output( "bar\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLArbitrary() {
+               $this->m->output( "" );
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "\n" );
+               $this->m->output( "ba" );
+               $this->m->output( "" );
+               $this->m->output( "r\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputStringNLStringNLArbitraryAgain() {
+               $this->m->output( "" );
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "\nb" );
+               $this->m->output( "a" );
+               $this->m->output( "" );
+               $this->m->output( "r\n" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelEmpty() {
+               $this->m->output( "", null );
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testOutputWNullChannelString() {
+               $this->m->output( "foo", null );
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testOutputWNullChannelStringString() {
+               $this->m->output( "foo", null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWNullChannelStringNL() {
+               $this->m->output( "foo\n", null );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputWNullChannelStringNLNL() {
+               $this->m->output( "foo\n\n", null );
+               $this->assertOutputPrePostShutdown( "foo\n\n", False );
+       }
+
+       function testOutputWNullChannelStringNLString() {
+               $this->m->output( "foo\nbar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNL() {
+               $this->m->output( "foo\nbar\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLLinewise() {
+               $this->m->output( "foo\n", null );
+               $this->m->output( "bar\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLArbitrary() {
+               $this->m->output( "", null );
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "\n", null );
+               $this->m->output( "ba", null );
+               $this->m->output( "", null );
+               $this->m->output( "r\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWNullChannelStringNLStringNLArbitraryAgain() {
+               $this->m->output( "", null );
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "\nb", null );
+               $this->m->output( "a", null );
+               $this->m->output( "", null );
+               $this->m->output( "r\n", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputWChannelString() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputWChannelStringNL() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputWChannelStringNLNL() {
+               // If this test fails, note that output takes strings with double line
+               // endings (although output's implementation in this situation calls
+               // outputChanneled with a string ending in a nl ... which is not allowed
+               // according to the documentation of outputChanneled)
+               $this->m->output( "foo\n\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\n", True );
+       }
+
+       function testOutputWChannelStringNLString() {
+               $this->m->output( "foo\nbar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWChannelStringNLStringNL() {
+               $this->m->output( "foo\nbar\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLLinewise() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->m->output( "bar\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLArbitrary() {
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "\n", "bazChannel" );
+               $this->m->output( "ba", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "r\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelStringNLStringNLArbitraryAgain() {
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "\nb", "bazChannel" );
+               $this->m->output( "a", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "r\n", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputWMultipleChannelsChannelChange() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->m->output( "qux", "quuxChannel" );
+               $this->m->output( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputWMultipleChannelsChannelChangeNL() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar\n", "bazChannel" );
+               $this->m->output( "qux\n", "quuxChannel" );
+               $this->m->output( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputWAndWOChannelStringStartWO() {
+               $this->m->output( "foo" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->m->output( "qux" );
+               $this->m->output( "quux", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nquxquux", True );
+       }
+
+       function testOutputWAndWOChannelStringStartW() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "bar" );
+               $this->m->output( "qux", "bazChannel" );
+               $this->m->output( "quux" );
+               $this->assertOutputPrePostShutdown( "foo\nbarqux\nquux", False );
+       }
+
+       function testOutputWChannelTypeSwitch() {
+               $this->m->output( "foo", 1 );
+               $this->m->output( "bar", 1.0 );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputIntermittentEmpty() {
+               $this->m->output( "foo" );
+               $this->m->output( "" );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputIntermittentFalse() {
+               $this->m->output( "foo" );
+               $this->m->output( false );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputIntermittentFalseAfterOtherChannel() {
+               $this->m->output( "qux", "quuxChannel" );
+               $this->m->output( "foo" );
+               $this->m->output( false );
+               $this->m->output( "bar" );
+               $this->assertOutputPrePostShutdown( "qux\nfoobar", False );
+       }
+
+       function testOutputWNullChannelIntermittentEmpty() {
+               $this->m->output( "foo", null );
+               $this->m->output( "", null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWNullChannelIntermittentFalse() {
+               $this->m->output( "foo", null );
+               $this->m->output( false, null );
+               $this->m->output( "bar", null );
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testOutputWChannelIntermittentEmpty() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( "", "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputWChannelIntermittentFalse() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->output( false, "bazChannel" );
+               $this->m->output( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       // Note that (per documentation) outputChanneled does take strings that end
+       // in \n, hence we do not test such strings.
+
+       function testOutputChanneledEmpty() {
+               $this->m->outputChanneled( "" );
+               $this->assertOutputPrePostShutdown( "\n", False );
+       }
+
+       function testOutputChanneledString() {
+               $this->m->outputChanneled( "foo" );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputChanneledStringString() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledStringNLString() {
+               $this->m->outputChanneled( "foo\nbar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "\nb" );
+               $this->m->outputChanneled( "a" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "r" );
+               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+       }
+
+       function testOutputChanneledWNullChannelEmpty() {
+               $this->m->outputChanneled( "", null );
+               $this->assertOutputPrePostShutdown( "\n", False );
+       }
+
+       function testOutputChanneledWNullChannelString() {
+               $this->m->outputChanneled( "foo", null );
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringString() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringNLString() {
+               $this->m->outputChanneled( "foo\nbar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "\nb", null );
+               $this->m->outputChanneled( "a", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "r", null );
+               $this->assertOutputPrePostShutdown( "\nfoo\n\n\nb\na\n\nr\n", False );
+       }
+
+       function testOutputChanneledWChannelString() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo", True );
+       }
+
+       function testOutputChanneledWChannelStringNLString() {
+               $this->m->outputChanneled( "foo\nbar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWChannelStringString() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputChanneledWChannelStringNLStringNLArbitraryAgain() {
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "\nb", "bazChannel" );
+               $this->m->outputChanneled( "a", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "r", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelChange() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->m->outputChanneled( "qux", "quuxChannel" );
+               $this->m->outputChanneled( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelChangeEnclosedNull() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", null );
+               $this->m->outputChanneled( "qux", null );
+               $this->m->outputChanneled( "corge", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWMultipleChannelsChannelAfterNullChange() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar", null );
+               $this->m->outputChanneled( "qux", null );
+               $this->m->outputChanneled( "corge", "quuxChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\ncorge", True );
+       }
+
+       function testOutputChanneledWAndWOChannelStringStartWO() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->m->outputChanneled( "qux" );
+               $this->m->outputChanneled( "quux", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux", True );
+       }
+
+       function testOutputChanneledWAndWOChannelStringStartW() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "bar" );
+               $this->m->outputChanneled( "qux", "bazChannel" );
+               $this->m->outputChanneled( "quux" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\nqux\nquux\n", False );
+       }
+
+       function testOutputChanneledWChannelTypeSwitch() {
+               $this->m->outputChanneled( "foo", 1 );
+               $this->m->outputChanneled( "bar", 1.0 );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testOutputChanneledWOChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( "" );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+       }
+
+       function testOutputChanneledWOChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->outputChanneled( false );
+               $this->m->outputChanneled( "bar" );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( "", null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\n\nbar\n", False );
+       }
+
+       function testOutputChanneledWNullChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->outputChanneled( false, null );
+               $this->m->outputChanneled( "bar", null );
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testOutputChanneledWChannelIntermittentEmpty() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( "", "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foobar", True );
+       }
+
+       function testOutputChanneledWChannelIntermittentFalse() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->outputChanneled( false, "bazChannel" );
+               $this->m->outputChanneled( "bar", "bazChannel" );
+               $this->assertOutputPrePostShutdown( "foo\nbar", True );
+       }
+
+       function testCleanupChanneledClean() {
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "", False );
+       }
+
+       function testCleanupChanneledAfterOutput() {
+               $this->m->output( "foo" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testCleanupChanneledAfterOutputWNullChannel() {
+               $this->m->output( "foo", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo", False );
+       }
+
+       function testCleanupChanneledAfterOutputWChannel() {
+               $this->m->output( "foo", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutput() {
+               $this->m->output( "foo\n" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutputWNullChannel() {
+               $this->m->output( "foo\n", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterNLOutputWChannel() {
+               $this->m->output( "foo\n", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWOChannel() {
+               $this->m->outputChanneled( "foo" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWNullChannel() {
+               $this->m->outputChanneled( "foo", null );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testCleanupChanneledAfterOutputChanneledWChannel() {
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $this->m->cleanupChanneled();
+               $this->assertOutputPrePostShutdown( "foo\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutput() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo" );
+               $m2->output( "bar" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWNullChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo", null );
+               $m2->output( "bar", null );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo", "bazChannel" );
+               $m2->output( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWNullChannelNL() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo\n", null );
+               $m2->output( "bar\n", null );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputWChannelNL() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->output( "foo\n", "bazChannel" );
+               $m2->output( "bar\n", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneled() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo" );
+               $m2->outputChanneled( "bar" );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneledWNullChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", null );
+               $m2->outputChanneled( "bar", null );
+
+               $this->assertEquals( "foo\nbar\n", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foo\nbar\n", False );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionOutputChanneledWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $m2->outputChanneled( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before shutdown simulation (m2)" );
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n", True );
+       }
+
+       function testMultipleMaintenanceObjectsInteractionCleanupChanneledWChannel() {
+               $m2 = new MaintenanceFixup( $this );
+
+               $this->m->outputChanneled( "foo", "bazChannel" );
+               $m2->outputChanneled( "bar", "bazChannel" );
+
+               $this->assertEquals( "foobar", $this->getActualOutput(),
+                               "Output before first cleanup" );
+               $this->m->cleanupChanneled();
+               $this->assertEquals( "foobar\n", $this->getActualOutput(),
+                               "Output after first cleanup" );
+               $m2->cleanupChanneled();
+               $this->assertEquals( "foobar\n\n", $this->getActualOutput(),
+                               "Output after second cleanup" );
+
+               $m2->simulateShutdown();
+               $this->assertOutputPrePostShutdown( "foobar\n\n", False );
+       }
+
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/maintenance/backupPrefetchTest.php b/tests/phpunit/maintenance/backupPrefetchTest.php
new file mode 100644 (file)
index 0000000..965d7be
--- /dev/null
@@ -0,0 +1,270 @@
+<?php
+
+require_once dirname( __FILE__ ) . "/../../../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() {
+               if ( $this->dump !== null ) {
+                       $this->dump->close();
+               }
+
+               // Bug 37458, parent teardown need to be done after closing the
+               // dump or it might cause some permissions errors.
+               parent::tearDown();
+       }
+
+       /**
+        * 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.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" 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>
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+      <text xml:space="preserve">BackupDumperTestP1Text1</text>
+    </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>
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+      <text xml:space="preserve">BackupDumperTestP2Text1</text>
+    </revision>
+    <revision>
+      <id>5</id>
+      <parentid>2</parentid>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+      <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
+    </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>
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+      <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
+    </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..35e7e32
--- /dev/null
@@ -0,0 +1,563 @@
+<?php
+
+require_once dirname( __FILE__ ) . "/../../../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;
+       private static $numOfPages = 4;
+       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;
+       private static $numOfRevs = 8;
+
+       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;
+               }
+
+       }
+
+       public 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->revId2_1 );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3", $this->revId2_2 );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
+               $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", $this->revId2_1 );
+               // 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->revId2_2 );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
+               $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 * self::$numOfPages, NS_MAIN,
+                                       "BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId1_1 + $i * self::$numOfRevs, "BackupDumperTestP1Summary1",
+                                       $this->textId1_1, false, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
+                                       "BackupDumperTestP1Text1" );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 2;
+                               break;
+
+                       case 2:
+                               // Page 2
+                               $this->assertPageStart( $this->pageId2 + $i * self::$numOfPages, NS_MAIN,
+                                       "BackupDumperTestP2" );
+                               $this->assertRevision( $this->revId2_1 + $i * self::$numOfRevs, "BackupDumperTestP2Summary1",
+                                       $this->textId2_1, false, "jprywrymfhysqllua29tj3sc7z39dl2",
+                                       "BackupDumperTestP2Text1" );
+                               $this->assertRevision( $this->revId2_2 + $i * self::$numOfRevs, "BackupDumperTestP2Summary2",
+                                       $this->textId2_2, false, "b7vj5ks32po5m1z1t1br4o7scdwwy95",
+                                       "BackupDumperTestP2Text2", $this->revId2_1 + $i * self::$numOfRevs );
+                               $this->assertRevision( $this->revId2_3 + $i * self::$numOfRevs, "BackupDumperTestP2Summary3",
+                                       $this->textId2_3, false, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                                       "BackupDumperTestP2Text3", $this->revId2_2 + $i * self::$numOfRevs );
+                               $this->assertRevision( $this->revId2_4 + $i * self::$numOfRevs,
+                                       "BackupDumperTestP2Summary4 extra",
+                                       $this->textId2_4, false, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                                       "BackupDumperTestP2Text4 some additional Text",
+                                       $this->revId2_3 + $i * self::$numOfRevs );
+                               $this->assertPageEnd();
+
+                               $lookingForPage = 4;
+                               break;
+
+                       case 4:
+                               // Page 4
+                               $this->assertPageStart( $this->pageId4 + $i * self::$numOfPages, NS_TALK,
+                                       "Talk:BackupDumperTestP1" );
+                               $this->assertRevision( $this->revId4_1 + $i * self::$numOfRevs,
+                                       "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.7/" '
+                       . 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '
+                       . 'xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ '
+                       . 'http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" 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 * self::$numOfPages ) . '</id>
+    <revision>
+      <id>' . ( $this->revId1_1 + $i * self::$numOfRevs ) . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP1Summary1</comment>
+      <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+      <text id="' . $this->textId1_1 . '" bytes="23" />
+    </revision>
+  </page>
+';
+                       $page2 = '  <page>
+    <title>BackupDumperTestP2</title>
+    <ns>0</ns>
+    <id>' . ( $this->pageId2 + $i * self::$numOfPages ) . '</id>
+    <revision>
+      <id>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary1</comment>
+      <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+      <text id="' . $this->textId2_1 . '" bytes="23" />
+    </revision>
+    <revision>
+      <id>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</id>
+      <parentid>' . ( $this->revId2_1 + $i * self::$numOfRevs ) . '</parentid>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary2</comment>
+      <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
+      <text id="' . $this->textId2_2 . '" bytes="23" />
+    </revision>
+    <revision>
+      <id>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</id>
+      <parentid>' . ( $this->revId2_2 + $i * self::$numOfRevs ) . '</parentid>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary3</comment>
+      <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
+      <text id="' . $this->textId2_3 . '" bytes="23" />
+    </revision>
+    <revision>
+      <id>' . ( $this->revId2_4 + $i * self::$numOfRevs ) . '</id>
+      <parentid>' . ( $this->revId2_3 + $i * self::$numOfRevs ) . '</parentid>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>BackupDumperTestP2Summary4 extra</comment>
+      <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+      <text id="' . $this->textId2_4 . '" bytes="44" />
+    </revision>
+  </page>
+';
+                       // page 3 not in stub
+
+                       $page4 = '  <page>
+    <title>Talk:BackupDumperTestP1</title>
+    <ns>1</ns>
+    <id>' . ( $this->pageId4 + $i * self::$numOfPages ) . '</id>
+    <revision>
+      <id>' . ( $this->revId4_1 + $i * self::$numOfRevs ) . '</id>
+      <timestamp>2012-04-01T16:46:05Z</timestamp>
+      <contributor>
+        <ip>127.0.0.1</ip>
+      </contributor>
+      <comment>Talk BackupDumperTestP1 Summary1</comment>
+      <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+      <text id="' . $this->textId4_1 . '" bytes="35" />
+    </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..925e277
--- /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;
+               }
+
+       }
+
+       public 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->revId2_1 );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r",
+                       "BackupDumperTestP2Text3", $this->revId2_2 );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv",
+                       "BackupDumperTestP2Text4 some additional Text", $this->revId2_3 );
+               $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", false, $this->revId2_1 );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
+               $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", false, $this->revId2_3 );
+               $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", false, $this->revId2_3 );
+               $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", false, $this->revId2_1 );
+               $this->assertRevision( $this->revId2_3, "BackupDumperTestP2Summary3",
+                       $this->textId2_3, 23, "jfunqmh1ssfb8rs43r19w98k28gg56r", false, $this->revId2_2 );
+               $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
+                       $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
+               $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", false, $this->revId2_3 );
+               $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", false, $this->revId2_3 );
+               $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..f0689b6
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+
+require_once dirname( __FILE__ ) . "/../../../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..8635614
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+require_once dirname( __FILE__ ) . "/../../../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 d18b33b..61a20f1 100755 (executable)
@@ -18,6 +18,16 @@ define( 'MW_PHPUNIT_TEST', true );
 require_once( "$IP/maintenance/Maintenance.php" );
 
 class PHPUnitMaintClass extends Maintenance {
+
+       function __construct() {
+               parent::__construct();
+               $this->addOption( 'with-phpunitdir'
+                       , 'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.'
+                       , false # not required
+                       , true  # need arg
+               );
+       }
+
        public function finalSetup() {
                parent::finalSetup();
 
@@ -37,7 +47,42 @@ class PHPUnitMaintClass extends Maintenance {
 
                $wgLocalisationCacheConf['storeClass'] =  'LCStore_Null';
        }
-       public function execute() { }
+
+       public function execute() {
+               global $IP;
+
+               # Make sure we have --configuration or PHPUnit might complain
+               if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
+                       //Hack to eliminate the need to use the Makefile (which sucks ATM)
+                       array_splice( $_SERVER['argv'], 1, 0,
+                               array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
+               }
+
+               # --with-phpunitdir let us override the default PHPUnit version
+               if( $phpunitDir = $this->getOption( 'with-phpunitdir' ) ) {
+                       # Sanity checks
+                       if( !is_dir($phpunitDir) ) {
+                               $this->error( "--with-phpunitdir should be set to an existing directory", 1 );
+                       }
+                       if( !is_readable( $phpunitDir."/PHPUnit/Runner/Version.php" ) ) {
+                               $this->error( "No usable PHPUnit installation in $phpunitDir.\nAborting.\n", 1 );
+                       }
+
+                       # Now prepends provided PHPUnit directory
+                       $this->output( "Will attempt loading PHPUnit from `$phpunitDir`\n" );
+                       set_include_path( $phpunitDir
+                               . PATH_SEPARATOR . get_include_path() );
+
+                       # Cleanup $args array so the option and its value do not
+                       # pollute PHPUnit
+                       $key = array_search( '--with-phpunitdir', $_SERVER['argv'] );
+                       unset( $_SERVER['argv'][$key]   ); // the option
+                       unset( $_SERVER['argv'][$key+1] ); // its value
+                       $_SERVER['argv'] = array_values( $_SERVER['argv'] );
+
+               }
+       }
+
        public function getDbType() {
                return Maintenance::DB_ADMIN;
        }
@@ -46,18 +91,13 @@ class PHPUnitMaintClass extends Maintenance {
 $maintClass = 'PHPUnitMaintClass';
 require( RUN_MAINTENANCE_IF_MAIN );
 
-if( !in_array( '--configuration', $_SERVER['argv'] ) ) {
-       //Hack to eliminate the need to use the Makefile (which sucks ATM)
-       array_splice( $_SERVER['argv'], 1, 0,
-               array( '--configuration', $IP . '/tests/phpunit/suite.xml' ) );
-}
-
 require_once( 'PHPUnit/Runner/Version.php' );
-if( version_compare( PHPUnit_Runner_Version::id(), '3.5.0', '<' ) ) {
-       die( 'PHPUnit 3.5 or later required, you have ' . PHPUnit_Runner_Version::id() . ".\n" );
+
+if( PHPUnit_Runner_Version::id() !== '@package_version@'
+   && 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' );
 
 require_once( "$IP/tests/TestsAutoLoader.php" );
 MediaWikiPHPUnitCommand::main();
-
index 9e1e9b2..adfd111 100644 (file)
@@ -27,6 +27,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js',
                ),
                'dependencies' => array(
                        'jquery.autoEllipsis',
@@ -49,6 +50,7 @@ return array(
                        'mediawiki.util',
                        'mediawiki.special.recentchanges',
                        'mediawiki.jqueryMsg',
+                       'mediawiki.language'
                ),
                'position' => 'top',
        )
index a1b47ca..093c71f 100644 (file)
@@ -42,10 +42,14 @@ $params = array_map( 'cssfilter', $_GET );
 $selector = isset( $params['selector'] ) ? $params['selector'] : '.mw-test-example';
 $property = isset( $params['prop'] ) ? $params['prop'] : 'float';
 $value = isset( $params['val'] ) ? $params['val'] : 'right';
+$wait = isset( $params['wait'] ) ? (int)$params['wait'] : 0; // seconds
+
+sleep( $wait );
 
 $css =  "
 /**
- * Generated: " . gmdate( 'r' ) .  "
+ * Generated " . gmdate( 'r' ) .  ".
+ * Waited {$wait}s.
  */
 
 $selector {
diff --git a/tests/qunit/data/testloader.php b/tests/qunit/data/testloader.php
new file mode 100644 (file)
index 0000000..7f4c48d
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * ResourceLoader stub working with pre-defined test 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
+ * (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
+ * @package MediaWiki
+ * @author Lupo
+ * @since 1.20
+ */
+header( 'Content-Type: text/javascript; charset=utf-8' );\r
+
+require_once "../../../includes/Xml.php";
+
+$modules = array (
+       'test.use_missing' => array (
+               'src' => 'mw.loader.implement("test.use_missing", function () {start(); ok(false, "Module test.use_missing should not run.");}, {}, {});',
+               'deps' => array ( 'test.missing' )
+       ),
+       'test.use_missing2' => array (
+               'src' => 'mw.loader.implement("test.use_missing2", function () {start(); ok(false, "Module test.use_missing2 should not run.");}, {}, {});',
+               'deps' => array ( 'test.missing2' )
+       )
+);
+
+// Copied from ResourceLoaderContext
+function expandModuleNames( $modules ) {\r
+       $retval = array();\r
+       // For backwards compatibility with an earlier hack, replace ! with .\r
+       $modules = str_replace( '!', '.', $modules );\r
+       $exploded = explode( '|', $modules );\r
+       foreach ( $exploded as $group ) {\r
+               if ( strpos( $group, ',' ) === false ) {\r
+                       // This is not a set of modules in foo.bar,baz notation\r
+                       // but a single module\r
+                       $retval[] = $group;\r
+               } else {\r
+                       // This is a set of modules in foo.bar,baz notation\r
+                       $pos = strrpos( $group, '.' );\r
+                       if ( $pos === false ) {\r
+                               // Prefixless modules, i.e. without dots\r
+                               $retval = explode( ',', $group );\r
+                       } else {\r
+                               // We have a prefix and a bunch of suffixes\r
+                               $prefix = substr( $group, 0, $pos ); // 'foo'\r
+                               $suffixes = explode( ',', substr( $group, $pos + 1 ) ); // array( 'bar', 'baz' )\r
+                               foreach ( $suffixes as $suffix ) {\r
+                                       $retval[] = "$prefix.$suffix";\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return $retval;\r
+}
+
+function addModule ( $moduleName, &$gotten ) {
+       global $modules;
+
+       $result = "";
+       if ( isset( $gotten[$moduleName] ) ) {
+               return $result;
+       }
+       $gotten[$moduleName] = true;
+       if ( isset( $modules[$moduleName] ) ) {
+               $deps = $modules[$moduleName]['deps'];
+               foreach ( $deps as $depName ) {
+                       $result .= addModule( $depName, $gotten ) . "\n";
+               }
+               $result .= $modules[$moduleName]['src'] . "\n";
+       } else {
+               $result .= 'mw.loader.state( ' . Xml::encodeJsVar( $moduleName ) . ', "missing" );' . "\n";
+       }
+       return $result . "\n";
+}
+
+$result = "";
+
+if ( isset( $_GET['modules'] ) ) {
+       $toGet = expandModuleNames( $_GET['modules'] );
+       $gotten = array();
+       foreach ( $toGet as $moduleName ) {
+               $result .= addModule( $moduleName, $gotten );
+       }
+}
+
+echo $result;
index f4baf95..f3176ab 100644 (file)
@@ -84,38 +84,17 @@ if ( QUnit.urlParams.completenesstest ) {
 QUnit.config.urlConfig.push( 'mwlogenv' );
 
 /**
- * Reset mw.config to a fresh copy of the live config for each test();
- * @param override {Object} [optional]
- * @example:
- * <code>
- * module( .., newMwEnvironment() );
- *
- * test( .., function () {
- *     mw.config.set( 'foo', 'bar' ); // just for this test
- * } );
- *
- * test( .., function () {
- *     mw.config.get( 'foo' ); // doesn't exist
- * } );
- *
- *
- * module( .., newMwEnvironment({ quux: 'corge' }) );
- *
- * test( .., function () {
- *     mw.config.get( 'quux' ); // "corge"
- *     mw.config.set( 'quux', "grault" );
- * } );
- *
- * test( .., function () {
- *     mw.config.get( 'quux' ); // "corge"
- * } );
+ * Reset mw.config and others to a fresh copy of the live config for each test(),
+ * and restore it back to the live one afterwards.
+ * @param localEnv {Object} [optional]
+ * @example (see test suite at the bottom of this file)
  * </code>
  */
 QUnit.newMwEnvironment = ( function () {
-       var log, liveConfig, liveMsgs;
+       var log, liveConfig, liveMessages;
 
        liveConfig = mw.config.values;
-       liveMsgs = mw.messages.values;
+       liveMessages = mw.messages.values;
 
        function freshConfigCopy( custom ) {
                // "deep=true" is important here.
@@ -123,34 +102,46 @@ QUnit.newMwEnvironment = ( function () {
                // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
                // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
                // was passed by reference in $.extend's loop.
-               return $.extend({}, liveConfig, custom, /*deep=*/true );
+               return $.extend( {}, liveConfig, custom, /*deep=*/true );
        }
 
-       function freshMsgsCopy( custom ) {
-               return $.extend({}, liveMsgs, custom, /*deep=*/true );
+       function freshMessagesCopy( custom ) {
+               return $.extend( {}, liveMessages, custom, /*deep=*/true );
        }
 
        log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
 
-       return function ( overrideConfig, overrideMsgs ) {
-               overrideConfig = overrideConfig || {};
-               overrideMsgs = overrideMsgs || {};
+       return function ( localEnv ) {
+               localEnv = $.extend( {
+                       // QUnit
+                       setup: $.noop,
+                       teardown: $.noop,
+                       // MediaWiki
+                       config: {},
+                       messages: {}
+               }, localEnv );
 
                return {
                        setup: function () {
                                log( 'MwEnvironment> SETUP    for "' + QUnit.config.current.module
                                        + ': ' + QUnit.config.current.testName + '"' );
+
                                // Greetings, mock environment!
-                               mw.config.values = freshConfigCopy( overrideConfig );
-                               mw.messages.values = freshMsgsCopy( overrideMsgs );
+                               mw.config.values = freshConfigCopy( localEnv.config );
+                               mw.messages.values = freshMessagesCopy( localEnv.messages );
+
+                               localEnv.setup()
                        },
 
                        teardown: function () {
                                log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
                                        + ': ' + QUnit.config.current.testName + '"' );
+
+                               localEnv.teardown();
+
                                // Farewell, mock environment!
                                mw.config.values = liveConfig;
-                               mw.messages.values = liveMsgs;
+                               mw.messages.values = liveMessages;
                        }
                };
        };
@@ -200,4 +191,59 @@ addons = {
 $.extend( QUnit, addons );
 $.extend( window, addons );
 
+/**
+ * Small test suite to confirm proper functionality of the utilities and
+ * initializations in this file.
+ */
+var envExecCount = 0;
+module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
+       setup: function () {
+               envExecCount += 1;
+               this.mwHtmlLive = mw.html;
+               mw.html = {
+                       escape: function () {
+                               return 'mocked-' + envExecCount;
+                       }
+               };
+       },
+       teardown: function () {
+               mw.html = this.mwHtmlLive;
+       },
+       config: {
+               testVar: 'foo'
+       },
+       messages: {
+               testMsg: 'Foo.'
+       }
+}) );
+
+test( 'Setup', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( 'foo' ), 'mocked-1', 'extra setup() callback was ran.' );
+       equal( mw.config.get( 'testVar' ), 'foo', 'config object applied' );
+       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object applied' );
+
+       mw.config.set( 'testVar', 'bar' );
+       mw.messages.set( 'testMsg', 'Bar.' );
+});
+
+test( 'Teardown', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( 'foo' ), 'mocked-2', 'extra setup() callback was re-ran.' );
+       equal( mw.config.get( 'testVar' ), 'foo', 'config object restored and re-applied after test()' );
+       equal( mw.messages.get( 'testMsg' ), 'Foo.', 'messages object restored and re-applied after test()' );
+});
+
+module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
+
+test( 'Teardown', function () {
+       expect( 3 );
+
+       equal( mw.html.escape( '<' ), '&lt;', 'extra teardown() callback was ran.' );
+       equal( mw.config.get( 'testVar' ), null, 'config object restored to live in next module()' );
+       equal( mw.messages.get( 'testMsg' ), null, 'messages object restored to live in next module()' );
+});
+
 })( jQuery, mediaWiki, QUnit );
index 95284c7..f028dbc 100644 (file)
@@ -7,7 +7,7 @@ var config = {
        wgContentLanguage: 'en'
 };
 
-module( 'jquery.tablesorter', QUnit.newMwEnvironment( config ) );
+module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
 
 test( '-- Initial check', function() {
        expect(1);
index e04111f..7ff0fb8 100644 (file)
@@ -55,7 +55,7 @@ var config = {
        "wgCaseSensitiveNamespaces": []
 };
 
-module( 'mediawiki.Title', QUnit.newMwEnvironment( config ) );
+module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
 
 test( '-- Initial check', function () {
        expect(1);
index fcdcd21..9913fb9 100644 (file)
 module( 'mediawiki.Uri', QUnit.newMwEnvironment() );
 
-test( '-- Initial check', function() {
+test( '-- Initial check', function () {
+       expect( 2 );
+
+       // Ensure we have a generic mw.Uri constructor. By default mediawiki.uri,
+       // will use the currrent window ocation as base. But for testing we need
+       // to have a generic one, so that it doens't return false negatives if
+       // we run the test suite from an https server.
+       mw.Uri = mw.UriRelative( 'http://example.org/w/index.php' );
+
+       ok( mw.UriRelative, 'mw.UriRelative defined' );
+       ok( mw.Uri, 'mw.Uri defined' );
+} );
+
+$.each( [true, false], function ( i, strictMode ) {
+       test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', function () {
+               var uriString, uri;
+               expect( 2 );
+
+               uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
+               uri = new mw.Uri( uriString, {
+                       strictMode: strictMode
+               });
+
+               deepEqual(
+                       {
+                               protocol: uri.protocol,
+                               host: uri.host,
+                               port: uri.port,
+                               path: uri.path,
+                               query: uri.query,
+                               fragment: uri.fragment
+                       }, {
+                               protocol: 'http',
+                               host: 'www.ietf.org',
+                               port: undefined,
+                               path: '/rfc/rfc2396.txt',
+                               query: {},
+                               fragment: undefined
+                       },
+                       'basic object properties'
+               );
+
+               deepEqual(
+                       {
+                               userInfo: uri.getUserInfo(),
+                               authority: uri.getAuthority(),
+                               hostPort: uri.getHostPort(),
+                               queryString: uri.getQueryString(),
+                               relativePath: uri.getRelativePath(),
+                               toString: uri.toString()
+                       },
+                       {
+                               userInfo: '',
+                               authority: 'www.ietf.org',
+                               hostPort: 'www.ietf.org',
+                               queryString: '',
+                               relativePath: '/rfc/rfc2396.txt',
+                               toString: uriString
+                       },
+                       'construct composite components of URI on request'
+               );
+
+       });
+});
+
+test( 'Parse an ftp URI correctly with user and password', function () {
+       var uri;
        expect( 1 );
 
-       ok( mw.UriRelative, 'mw.Uri defined' );
+       uri = new mw.Uri( 'ftp://usr:pwd@192.0.2.16/' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       user: uri.user,
+                       password: uri.password,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment
+               },
+               {
+                       protocol: 'ftp',
+                       user: 'usr',
+                       password: 'pwd',
+                       host: '192.0.2.16',
+                       port: undefined,
+                       path: '/',
+                       query: {},
+                       fragment: undefined
+               },
+               'basic object properties'
+       );
+} );
+
+test( 'Parse a uri with simple querystring', function () {
+       var uri;
+       expect( 1 );
+
+       uri = new mw.Uri( 'http://www.google.com/?q=uri' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment,
+                       queryString: uri.getQueryString()
+               },
+               {
+                       protocol: 'http',
+                       host: 'www.google.com',
+                       port: undefined,
+                       path: '/',
+                       query: { q: 'uri' },
+                       fragment: undefined,
+                       queryString: 'q=uri'
+               },
+               'basic object properties'
+       );
 } );
 
-test( 'mw.Uri bug 35658', function() {
+test( 'Handle multiple query parameter (overrideKeys on)', function () {
+       var uri;
+       expect( 5 );
+
+       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+               overrideKeys: true
+       });
+
+       equal( uri.query.n, '1', 'multiple parameters are parsed' );
+       equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
+
+       uri.query.n = [ 'x', 'y', 'z' ];
+
+       // Verify parts and total length instead of entire string because order
+       // of iteration can vary.
+       ok( uri.toString().indexOf( 'm=bar' ), 'toString preserves other values' );
+       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ), 'toString parameter includes all values of an array query parameter' );
+       equal( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
+} );
+
+test( 'Handle multiple query parameter (overrideKeys off)', function () {
+       var uri;
+       expect( 9 );
+
+       uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
+               overrideKeys: false
+       });
+
+       // Strict comparison so that types are also verified (n should be string '1')
+       strictEqual( uri.query.m.length, 2, 'multi-value query should be an array with 2 items' );
+       strictEqual( uri.query.m[0], 'foo', 'order and value is correct' );
+       strictEqual( uri.query.m[1], 'bar', 'order and value is correct' );
+       strictEqual( uri.query.n, '1', 'n=1 is parsed with the correct value of the expected type' );
+
+       // Change query values
+       uri.query.n = [ 'x', 'y', 'z' ];
+
+       // Verify parts and total length instead of entire string because order
+       // of iteration can vary.
+       ok( uri.toString().indexOf( 'm=foo&m=bar' ) >= 0, 'toString preserves other values' );
+       ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) >= 0, 'toString parameter includes all values of an array query parameter' );
+       equal( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
+
+       // Remove query values
+       uri.query.m.splice( 0, 1 );
+       delete uri.query.n;
+
+       equal( uri.toString(), 'http://www.example.com/dir/?m=bar', 'deletion properties' );
+
+       // Remove more query values, leaving an empty array
+       uri.query.m.splice( 0, 1 );
+       equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
+} );
+
+test( 'All-dressed URI with everything', function () {
+       var uri, queryString, relativePath;
+       expect( 11 );
+
+       uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
+
+       deepEqual(
+               {
+                       protocol: uri.protocol,
+                       user: uri.user,
+                       password: uri.password,
+                       host: uri.host,
+                       port: uri.port,
+                       path: uri.path,
+                       query: uri.query,
+                       fragment: uri.fragment
+               },
+               {
+                       protocol: 'http',
+                       user: 'auth',
+                       password: undefined,
+                       host: 'www.example.com',
+                       port: '81',
+                       path: '/dir/dir.2/index.htm',
+                       query: { q1: '0', test1: null, test2: 'value (escaped)' },
+                       fragment: 'top'
+               },
+               'basic object properties'
+       );
+
+       equal( uri.getUserInfo(), 'auth', 'user info' );
+
+       equal( uri.getAuthority(), 'auth@www.example.com:81', 'authority equal to auth@hostport' );
+
+       equal( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
+
+       queryString = uri.getQueryString();
+       ok( queryString.indexOf( 'q1=0' ) >= 0, 'query param with numbers' );
+       ok( queryString.indexOf( 'test1' ) >= 0, 'query param with null value is included' );
+       ok( queryString.indexOf( 'test1=' ) === -1, 'query param with null value does not generate equals sign' );
+       ok( queryString.indexOf( 'test2=value+%28escaped%29' ) >= 0, 'query param is url escaped' );
+
+       relativePath = uri.getRelativePath();
+       ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
+       ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
+       ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+} );
+
+test( 'Cloning', function () {
+       var original, clone;
+       expect( 6 );
+
+       original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
+       clone = original.clone();
+
+       deepEqual( clone, original, 'clone has equivalent properties' );
+       equal( original.toString(), clone.toString(), 'toString matches original' );
+
+       notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
+
+       clone.host = 'bar.example.org';
+       notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
+       notEqual( original.toString(), clone.toString(), 'Stringified url no longer matches original' );
+
+       clone.query.three = 3;
+
+       deepEqual(
+               original.query,
+               { 'one': '1', 'two': '2' },
+               'Properties is deep cloned (bug 37708)'
+       );
+} );
+
+test( 'Constructing mw.Uri from plain object', function () {
+       var uri;
+       expect( 3 );
+
+       uri = new mw.Uri({
+               protocol: 'http',
+               host: 'www.foo.local',
+               path: '/this'
+       });
+       equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
+
+       uri = new mw.Uri({
+               protocol: 'http',
+               host: 'www.foo.local',
+               path: '/this',
+               query: { hi: 'there' },
+               fragment: 'blah'
+       });
+       equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
+
+       raises(
+               function () {
+                       var uri = new mw.Uri({
+                               protocol: 'http',
+                               host: 'www.foo.local'
+                       });
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'Construction failed when missing required properties'
+       );
+} );
+
+test( 'Manipulate properties', function () {
+       var uriBase, uri;
+       expect( 8 );
+
+       uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
+
+       uri = uriBase.clone();
+       uri.fragment = 'frag';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
+
+       uri = uriBase.clone();
+       uri.host = 'fr.wiki.local';
+       uri.port = '8080';
+       equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
+
+       uri = uriBase.clone();
+       uri.query.foo = 'bar';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
+
+       delete uri.query.foo;
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
+
+       uri = uriBase.clone();
+       uri.query.foo = 'bar';
+       equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
+       uri.extend({
+               foo: 'quux',
+               pif: 'paf'
+       });
+       ok( uri.toString().indexOf( 'foo=quux' ) >= 0, 'extend query arguments' );
+       ok( uri.toString().indexOf( 'foo=bar' ) === -1, 'extend query arguments' );
+       ok( uri.toString().indexOf( 'pif=paf' ) >= 0 , 'extend query arguments' );
+} );
+
+test( 'Handle protocol-relative URLs', function () {
+       var UriRel, uri;
+       expect( 5 );
+
+       UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
+
+       uri = new UriRel( '//en.wiki.local/w/api.php' );
+       equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
+
+       uri = new UriRel( '/foo.com' );
+       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in loose mode' );
+
+       uri = new UriRel( 'http:/foo.com' );
+       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
+
+       uri = new UriRel( '/foo.com', true );
+       equal( uri.toString(), 'glork://en.wiki.local/foo.com', 'handle absolute paths by supplying protocol and host from document in strict mode' );
+
+       uri = new UriRel( 'http:/foo.com', true );
+       equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
+} );
+
+test( 'Bad calls', function () {
+       var uri;
+       expect( 5 );
+
+       raises(
+               function () {
+                       new mw.Uri();
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on no arguments to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( '' );
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on empty string as argument to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( 'glaswegian penguins' );
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on non-URI as argument to constructor'
+       );
+
+       raises(
+               function () {
+                       new mw.Uri( 'foo.com/bar/baz', {
+                               strictMode: true
+                       });
+               },
+               function ( e ) {
+                       return e.message === 'Bad constructor arguments';
+               },
+               'throw error on URI without protocol or // or leading / in strict mode'
+       );
+
+       uri = new mw.Uri( 'foo.com/bar/baz', {
+               strictMode: false
+       });
+       equal( uri.toString(), 'http://foo.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
+});
+
+test( 'bug 35658', function () {
        expect( 2 );
 
-       var testProtocol = 'https://';
-       var testServer = 'foo.example.org';
-       var testPort = '3004';
-       var testPath = '/!1qy';
+       var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
-       var uriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
-       var uri = new uriClass( testPath );
-       var href = uri.toString();
+       testProtocol = 'https://';
+       testServer = 'foo.example.org';
+       testPort = '3004';
+       testPath = '/!1qy';
+
+       UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
+       uri = new UriClass( testPath );
+       href = uri.toString();
        equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
 
-       uriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
-       uri = new uriClass( testPath );
+       UriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
+       uri = new UriClass( testPath );
        href = uri.toString();
        equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
 
index 2abe016..481a5bb 100644 (file)
 module( 'mediawiki.jqueryMsg' );
 
-test( '-- Initial check', function() {
+test( '-- Initial check', function () {
        expect( 1 );
        ok( mw.jqueryMsg, 'mw.jqueryMsg defined' );
 } );
 
-test( 'mw.jqueryMsg Plural', function() {
-       expect( 5 );
+test( 'mw.jqueryMsg Plural', function () {
+       expect( 3 );
        var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       ok( mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'plural-msg', 0 ) , 'Found 0 items', 'Plural test for english with zero as count' );
-       equal( parser( 'plural-msg', 1 ) , 'Found 1 item', 'Singular test for english' );
-       equal( parser( 'plural-msg', 2 ) , 'Found 2 items', 'Plural test for english' );
+
+       mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' );
+       equal( parser( 'plural-msg', 0 ), 'Found 0 items', 'Plural test for english with zero as count' );
+       equal( parser( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
+       equal( parser( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
 } );
 
 
-test( 'mw.jqueryMsg Gender', function() {
-       expect( 16 );
-       //TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
-       var user = mw.user;
+test( 'mw.jqueryMsg Gender', function () {
+       expect( 11 );
+       // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
+       // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
+       var user = mw.user,
+               parser = mw.jqueryMsg.getMessageFunction();
+
+       // The values here are not significant,
+       // what matters is which of the values is choosen by the parser
+       mw.messages.set( 'gender-msg', '$1: {{GENDER:$2|blue|pink|green}}' );
+
        user.options.set( 'gender', 'male' );
-       var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       //TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
-       ok( mw.messages.set( 'gender-msg', '$1 reverted {{GENDER:$2|his|her|their}} last edit' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg', 'Bob', 'male' ) , 'Bob reverted his last edit', 'Gender masculine' );
-       equal( parser( 'gender-msg', 'Bob', user ) , 'Bob reverted his last edit', 'Gender masculine' );
+       equal(
+               parser( 'gender-msg', 'Bob', 'male' ),
+               'Bob: blue',
+               'Masculine from string "male"'
+       );
+       equal(
+               parser( 'gender-msg', 'Bob', user ),
+               'Bob: blue',
+               'Masculine from mw.user object'
+       );
+
        user.options.set( 'gender', 'unknown' );
-       equal( parser( 'gender-msg', 'They', user ) , 'They reverted their last edit', 'Gender neutral or unknown' );
-       equal( parser( 'gender-msg', 'Alice', 'female' ) , 'Alice reverted her last edit', 'Gender feminine' );
-       equal( parser( 'gender-msg', 'User' ) , 'User reverted their last edit', 'Gender neutral' );
-       equal( parser( 'gender-msg', 'User', 'unknown' ) , 'User reverted their last edit', 'Gender neutral' );
-       ok( mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}} reverted last $2 {{PLURAL:$2|edit|edits}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-one-form', 'male', 10 ) , 'User reverted last 10 edits', 'Gender neutral and plural form' );
-       equal( parser( 'gender-msg-one-form', 'female', 1 ) , 'User reverted last 1 edit', 'Gender neutral and singular form' );
-       ok( mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-lowercase', 'male' ) , 'he is awesome', 'Gender masculine' );
-       equal( parser( 'gender-msg-lowercase', 'female' ) , 'she is awesome', 'Gender feminine' );
-       ok( mw.messages.set( 'gender-msg-wrong', '{{gender}} is awesome' ), 'mw.messages.set: Register' );
-       equal( parser( 'gender-msg-wrong', 'female' ) , ' is awesome', 'Wrong syntax used, but ignore the {{gender}}' );
+       equal(
+               parser( 'gender-msg', 'Foo', user ),
+               'Foo: green',
+               'Neutral from mw.user object' );
+       equal(
+               parser( 'gender-msg', 'Alice', 'female' ),
+               'Alice: pink',
+               'Feminine from string "female"' );
+       equal(
+               parser( 'gender-msg', 'User' ),
+               'User: green',
+               'Neutral when no parameter given' );
+       equal(
+               parser( 'gender-msg', 'User', 'unknown' ),
+               'User: green',
+               'Neutral from string "unknown"'
+       );
+
+       mw.messages.set( 'gender-msg-one-form', '{{GENDER:$1|User}}: $2 {{PLURAL:$2|edit|edits}}' );
+
+       equal(
+               parser( 'gender-msg-one-form', 'male', 10 ),
+               'User: 10 edits',
+               'Gender neutral and plural form'
+       );
+       equal(
+               parser( 'gender-msg-one-form', 'female', 1 ),
+               'User: 1 edit',
+               'Gender neutral and singular form'
+       );
+
+       mw.messages.set( 'gender-msg-lowercase', '{{gender:$1|he|she}} is awesome' );
+       equal(
+               parser( 'gender-msg-lowercase', 'male' ),
+               'he is awesome',
+               'Gender masculine'
+       );
+       equal(
+               parser( 'gender-msg-lowercase', 'female' ),
+               'she is awesome',
+               'Gender feminine'
+       );
+
+       mw.messages.set( 'gender-msg-wrong', '{{gender}} test' );
+       equal(
+               parser( 'gender-msg-wrong', 'female' ),
+               ' test',
+               'Invalid syntax should result in {{gender}} simply being stripped away'
+       );
 } );
 
 
-test( 'mw.jqueryMsg Grammar', function() {
-       expect( 5 );
+test( 'mw.jqueryMsg Grammar', function () {
+       expect( 2 );
        var parser = mw.jqueryMsg.getMessageFunction();
-       ok( parser, 'Parser Function initialized' );
-       // Hope the grammar form grammar_case_foo is not valid in any language
-       ok( mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'grammar-msg' ) , 'Przeszukaj ' + mw.config.get( 'wgSiteName' ) , 'Grammar Test with sitename' );
-       ok( mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' ), 'mw.messages.set: Register' );
-       equal( parser( 'grammar-msg-wrong-syntax' ) , 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
+
+       // Assume the grammar form grammar_case_foo is not valid in any language
+       mw.messages.set( 'grammar-msg', 'Przeszukaj {{GRAMMAR:grammar_case_foo|{{SITENAME}}}}' );
+       equal( parser( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+
+       mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
+       equal( parser( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ' , 'Grammar Test with wrong grammar template syntax' );
 } );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
new file mode 100644 (file)
index 0000000..5d67a6e
--- /dev/null
@@ -0,0 +1,395 @@
+var liveLangData = mw.language.data.values;
+QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
+       setup: function () {
+               // New independent copy for this test
+               mw.language.data = $.extend( {}, liveLangData, true );
+       },
+       teardown: function () {
+               // Restore original
+               mw.language.data = liveLangData;
+       }
+}) );
+
+QUnit.test( 'mw.language getData and setData', function ( assert ) {
+       QUnit.expect( 2 );
+
+       mw.language.setData( 'en', 'testkey', 'testvalue' );
+       assert.equal(  mw.language.getData( 'en', 'testkey' ), 'testvalue', 'Getter setter test for mw.language' );
+       assert.equal(  mw.language.getData( 'en', 'invalidkey' ), undefined, 'Getter setter test for mw.language with invalid key' );
+} );
+
+function grammarTest( langCode, test ) {
+       // The test works only if the content language is opt.language
+       // because it requires [lang].js to be loaded.
+       QUnit.test( 'Grammar test for lang=' + langCode, function ( assert ) {
+               QUnit.expect( test.length );
+
+               for ( var i = 0 ; i < test.length; i++ ) {
+                       assert.equal(
+                               mw.language.convertGrammar( test[i].word, test[i].grammarForm ),
+                               test[i].expected,
+                               test[i].description
+                       );
+               }
+       });
+}
+
+var grammarTests = {
+       bs: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 's word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokativ',
+                       expected: 'o word',
+                       description: 'Grammar test for lokativ case'
+               }
+       ],
+
+       he: [
+               {
+                       word: "ויקיפדיה",
+                       grammarForm: 'prefixed',
+                       expected: "וויקיפדיה",
+                       description: 'Duplicate the "Waw" if prefixed'
+               },
+               {
+                       word: "וולפגנג",
+                       grammarForm: 'prefixed',
+                       expected: "וולפגנג",
+                       description: 'Duplicate the "Waw" if prefixed, but not if it is already duplicated.'
+               },
+               {
+                       word: "הקובץ",
+                       grammarForm: 'prefixed',
+                       expected: "קובץ",
+                       description: 'Remove the "He" if prefixed'
+               },
+               {
+                       word: 'Wikipedia',
+                       grammarForm: 'תחילית',
+                       expected: '־Wikipedia',
+                       description: 'GAdd a hyphen (maqaf) before non-Hebrew letters'
+               },
+               {
+                       word: '1995',
+                       grammarForm: 'תחילית',
+                       expected: '־1995',
+                       description: 'Add a hyphen (maqaf) before numbers'
+               }
+       ],
+
+       hsb: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 'z word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokatiw',
+                       expected: 'wo word',
+                       description: 'Grammar test for lokatiw case'
+               }
+       ],
+
+       dsb: [
+               {
+                       word: 'word',
+                       grammarForm: 'instrumental',
+                       expected: 'z word',
+                       description: 'Grammar test for instrumental case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'lokatiw',
+                       expected: 'wo word',
+                       description: 'Grammar test for lokatiw case'
+               }
+       ],
+
+       hy: [
+               {
+                       word: 'Մաունա',
+                       grammarForm: 'genitive',
+                       expected: 'Մաունայի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'հետո',
+                       grammarForm: 'genitive',
+                       expected: 'հետոյի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'գիրք',
+                       grammarForm: 'genitive',
+                       expected: 'գրքի',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'ժամանակի',
+                       grammarForm: 'genitive',
+                       expected: 'ժամանակիի',
+                       description: 'Grammar test for genitive case'
+               }
+       ],
+
+       fi: [
+               {
+                       word: 'talo',
+                       grammarForm: 'genitive',
+                       expected: 'talon',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'linux',
+                       grammarForm: 'genitive',
+                       expected: 'linuxin',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'elative',
+                       expected: 'talosta',
+                       description: 'Grammar test for elative case'
+               },
+               {
+                       word: 'pastöroitu',
+                       grammarForm: 'partitive',
+                       expected: 'pastöroitua',
+                       description: 'Grammar test for partitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'partitive',
+                       expected: 'taloa',
+                       description: 'Grammar test for partitive case'
+               },
+               {
+                       word: 'talo',
+                       grammarForm: 'illative',
+                       expected: 'taloon',
+                       description: 'Grammar test for illative case'
+               },
+               {
+                       word: 'linux',
+                       grammarForm: 'inessive',
+                       expected: 'linuxissa',
+                       description: 'Grammar test for inessive case'
+               }
+       ],
+
+       ru: [
+               {
+                       word: 'тесть',
+                       grammarForm: 'genitive',
+                       expected: 'тестя',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'привилегия',
+                       grammarForm: 'genitive',
+                       expected: 'привилегии',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'установка',
+                       grammarForm: 'genitive',
+                       expected: 'установки',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'похоти',
+                       grammarForm: 'genitive',
+                       expected: 'похотей',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'доводы',
+                       grammarForm: 'genitive',
+                       expected: 'доводов',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'песчаник',
+                       grammarForm: 'genitive',
+                       expected: 'песчаника',
+                       description: 'Grammar test for genitive case'
+               }
+       ],
+
+
+       hu: [
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'rol',
+                       expected: 'Wikipédiáról',
+                       description: 'Grammar test for rol case'
+               },
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'ba',
+                       expected: 'Wikipédiába',
+                       description: 'Grammar test for ba case'
+               },
+               {
+                       word: 'Wikipédiá',
+                       grammarForm: 'k',
+                       expected: 'Wikipédiák',
+                       description: 'Grammar test for k case'
+               }
+       ],
+
+       ga: [
+               {
+                       word: 'an Domhnach',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Domhnaigh',
+                       description: 'Grammar test for ainmlae case'
+               },
+               {
+                       word: 'an Luan',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Luain',
+                       description: 'Grammar test for ainmlae case'
+               },
+               {
+                       word: 'an Satharn',
+                       grammarForm: 'ainmlae',
+                       expected: 'Dé Sathairn',
+                       description: 'Grammar test for ainmlae case'
+               }
+       ],
+
+       uk: [
+               {
+                       word: 'тесть',
+                       grammarForm: 'genitive',
+                       expected: 'тестя',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Вікіпедія',
+                       grammarForm: 'genitive',
+                       expected: 'Вікіпедії',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'установка',
+                       grammarForm: 'genitive',
+                       expected: 'установки',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'похоти',
+                       grammarForm: 'genitive',
+                       expected: 'похотей',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'доводы',
+                       grammarForm: 'genitive',
+                       expected: 'доводов',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'песчаник',
+                       grammarForm: 'genitive',
+                       expected: 'песчаника',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Вікіпедія',
+                       grammarForm: 'accusative',
+                       expected: 'Вікіпедію',
+                       description: 'Grammar test for accusative case'
+               }
+       ],
+
+       sl: [
+               {
+                       word: 'word',
+                       grammarForm: 'orodnik',
+                       expected: 'z word',
+                       description: 'Grammar test for orodnik case'
+               },
+               {
+                       word: 'word',
+                       grammarForm: 'mestnik',
+                       expected: 'o word',
+                       description: 'Grammar test for mestnik case'
+               }
+       ],
+
+       os: [
+               {
+                       word: 'бæстæ',
+                       grammarForm: 'genitive',
+                       expected: 'бæсты',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'бæстæ',
+                       grammarForm: 'allative',
+                       expected: 'бæстæм',
+                       description: 'Grammar test for allative case'
+               },
+               {
+                       word: 'Тигр',
+                       grammarForm: 'dative',
+                       expected: 'Тигрæн',
+                       description: 'Grammar test for dative case'
+               },
+               {
+                       word: 'цъити',
+                       grammarForm: 'dative',
+                       expected: 'цъитийæн',
+                       description: 'Grammar test for dative case'
+               },
+               {
+                       word: 'лæппу',
+                       grammarForm: 'genitive',
+                       expected: 'лæппуйы',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: '2011',
+                       grammarForm: 'equative',
+                       expected: '2011-ау',
+                       description: 'Grammar test for equative case'
+               }
+       ],
+
+       la: [
+               {
+                       word: 'Translatio',
+                       grammarForm: 'genitive',
+                       expected: 'Translationis',
+                       description: 'Grammar test for genitive case'
+               },
+               {
+                       word: 'Translatio',
+                       grammarForm: 'accusative',
+                       expected: 'Translationem',
+                       description: 'Grammar test for accusative case'
+               },
+               {
+                       word: 'Translatio',
+                       grammarForm: 'ablative',
+                       expected: 'Translatione',
+                       description: 'Grammar test for ablative case'
+               }
+       ]
+};
+
+$.each( grammarTests, function ( langCode, test ) {
+       if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
+               grammarTest( langCode, test );
+       }
+});
index e66cac2..2f11521 100644 (file)
@@ -15,15 +15,16 @@ test( '-- Initial check', function() {
 });
 
 test( 'mw.Map', function() {
+       var arry, conf, funky, globalConf, nummy, someValues;
        expect(17);
 
        ok( mw.Map, 'mw.Map defined' );
 
-       var     conf = new mw.Map(),
-               // Dummy variables
-               funky = function() {},
-               arry = [],
-               nummy = 7;
+       conf = new mw.Map();
+       // Dummy variables
+       funky = function () {};
+       arry = [];
+       nummy = 7;
 
        // Tests for input validation
        strictEqual( conf.get( 'inexistantKey' ), null, 'Map.get returns null if selection was a string and the key was not found' );
@@ -36,7 +37,7 @@ test( 'mw.Map', function() {
        strictEqual( conf.get( funky ), null, 'Map.get ruturns null if selection was invalid (Function)' );
 
        // Multiple values at once
-       var someValues = {
+       someValues = {
                'foo': 'bar',
                'lorem': 'ipsum',
                'MediaWiki': true
@@ -62,7 +63,7 @@ test( 'mw.Map', function() {
 
        ok( false === 'globalMapChecker' in window, 'new mw.Map did not store its values in the global window object by default' );
 
-       var globalConf = new mw.Map( true );
+       globalConf = new mw.Map( true );
        globalConf.set( 'anotherGlobalMapChecker', 'Hello' );
 
        ok( 'anotherGlobalMapChecker' in window, 'new mw.Map( true ) did store its values in the global window object' );
@@ -80,13 +81,14 @@ test( 'mw.config', function() {
 });
 
 test( 'mw.message & mw.messages', function() {
+       var goodbye, hello, pluralMessage;
        expect(20);
 
        ok( mw.messages, 'messages defined' );
        ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
        ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
 
-       var hello = mw.message( 'hello' );
+       hello = mw.message( 'hello' );
 
        equal( hello.format, 'plain', 'Message property "format" defaults to "plain"' );
        strictEqual( hello.map, mw.messages, 'Message property "map" defaults to the global instance in mw.messages' );
@@ -110,7 +112,7 @@ test( 'mw.message & mw.messages', function() {
 
        strictEqual( hello.exists(), true, 'Message.exists returns true for existing messages' );
 
-       var goodbye = mw.message( 'goodbye' );
+       goodbye = mw.message( 'goodbye' );
        strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
        equal( goodbye.plain(), '<goodbye>', 'Message.toString returns plain <key> if format is "plain" and key does not exist' );
@@ -118,7 +120,7 @@ test( 'mw.message & mw.messages', function() {
        equal( goodbye.escaped(), '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if format is "escaped" and key does not exist' );
 
        ok( mw.messages.set( 'pluraltestmsg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
-       var pluralMessage = mw.message( 'pluraltestmsg' , 6 );
+       pluralMessage = mw.message( 'pluraltestmsg' , 6 );
        equal( pluralMessage.plain(), 'There are 6 results', 'plural get resolved when format is plain' );
        equal( pluralMessage.parse(), 'There are 6 results', 'plural get resolved when format is parse' );
 
@@ -144,9 +146,8 @@ test( 'mw.msg', function() {
 });
 
 test( 'mw.loader', function() {
-       expect(2);
-
        var isAwesomeDone;
+       expect(2);
 
        // Async ahead
        stop();
@@ -173,46 +174,83 @@ test( 'mw.loader', function() {
 });
 
 test( 'mw.loader.implement', function () {
-       expect(5 - 2);
-
-       var isJsExecuted, $element;
+       var isJsExecuted, $element, styleTestUrl;
+       expect(5);
 
        // Async ahead
        stop();
 
+       styleTestUrl = QUnit.fixurl(
+               mw.config.get( 'wgScriptPath' )
+               + '/tests/qunit/data/styleTest.css.php?'
+               + $.param({
+                       selector: '.mw-test-loaderimplement',
+                       prop: 'float',
+                       val: 'right'
+               })
+       );
+
        mw.loader.implement(
                'test.implement',
                function () {
-                       start();
+                       var styleTestTimeout, styleTestStart, styleTestSince;
 
                        strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
                        isJsExecuted = true;
 
                        equal( mw.loader.getState( 'test.implement' ), 'loaded', 'module state is "loaded" while implement() is executing javascript' );
-                       
+
                        $element = $( '<div class="mw-test-loaderimplement">Foo bar</div>' ).appendTo( '#qunit-fixture' );
 
-                       // @broken: equal( $element.css( 'text-align' ),'center', 'CSS stylesheet was applied in time. ("text-align: center")' );
+                       equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
 
-                       // Marked broken due to a bug in qunit/index.html, via Special:JavaScriptTest/qunit it works fine
+                       // The @import test. This is, in a way, also an open bug for ResourceLoader
+                       // ("execute js after styles are loaded"), but browsers don't offer a way to
+                       // get a callback from when a stylesheet is loaded (that is, including any
+                       // @import rules inside).
+                       // To work around this, we'll have a little time loop to check if the styles
+                       // apply.
+                       // Note: This test originally used new Image() and onerror to get a callback
+                       // when the url is loaded, but that is fragile since it doesn't monitor the
+                       // same request as the css @import, and Safari 4 has issues with
+                       // onerror/onload not being fired at all in weird cases like this.
 
-                       // CSS @import is easily broken when concatenating stylesheets (bug 34669)
-                       // @broken: equal( $element.css( 'float' ), 'right', 'CSS stylesheet was applied in time via @import (bug 34669). ("float: right")' );
+                       styleTestTimeout = QUnit.config.testTimeout || 5000; // milliseconds
 
-                       equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded in time' );
-               
+                       function isCssImportApplied() {
+                               return $element.css( 'float' ) === 'right';
+                       }
+
+                       function styleTestLoop() {
+                               styleTestSince = new Date().getTime() - styleTestStart;
+                               // If it is passing or if we timed out, run the real test and stop the loop
+                               if ( isCssImportApplied() || styleTestSince > styleTestTimeout ) {
+                                       equal( $element.css( 'float' ), 'right',
+                                               'CSS stylesheet via @import was applied (after ' + styleTestSince + 'ms) (bug 34669). ("float: right")'
+                                       );
+
+                                       equal( $element.css( 'text-align' ),'center',
+                                               'CSS styles after the @import are working ("text-align: center")'
+                                       );
+
+                                       // Async done
+                                       start();
+
+                                       return;
+                               }
+                               // Otherwise, keep polling
+                               setTimeout( styleTestLoop, 100 );
+                       }
+
+                       // Start the loop
+                       styleTestStart = new Date().getTime();
+                       styleTestLoop();
                },
                {
                        "all": "@import url('"
-                               + QUnit.fixurl( mw.config.get( 'wgScriptPath' )
-                               + '/tests/qunit/data/styleTest.css.php?'
-                               + $.param({
-                                       selector: '.mw-test-loaderimplement',
-                                       prop: 'float',
-                                       val: 'right'
-                               }) )
+                               + styleTestUrl
                                + "');\n"
-                               + '.mw-test-loaderimplement  { text-align: center; }'
+                               + '.mw-test-loaderimplement { text-align: center; }'
                },
                {
                        "test-foobar": "Hello Foobar, $1!"
@@ -223,6 +261,129 @@ test( 'mw.loader.implement', function () {
 
 });
 
+test( 'mw.loader erroneous indirect dependency', function() {
+       expect( 3 );
+       mw.loader.register( [
+               ['test.module1', '0'],
+               ['test.module2', '0', ['test.module1']],
+               ['test.module3', '0', ['test.module2']]
+       ] );
+       mw.loader.implement( 'test.module1', function() { throw new Error( 'expected' ); }, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module1' ), 'error', 'Expected "error" state for test.module1' );
+       strictEqual( mw.loader.getState( 'test.module2' ), 'error', 'Expected "error" state for test.module2' );
+       strictEqual( mw.loader.getState( 'test.module3' ), 'error', 'Expected "error" state for test.module3' );
+} );
+
+test( 'mw.loader out-of-order implementation', function() {
+       expect( 9 );
+       mw.loader.register( [
+               ['test.module4', '0'],
+               ['test.module5', '0', ['test.module4']],
+               ['test.module6', '0', ['test.module5']]
+       ] );
+       mw.loader.implement( 'test.module4', function() {}, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
+       strictEqual( mw.loader.getState( 'test.module6' ), 'registered', 'Expected "registered" state for test.module6' );
+       mw.loader.implement( 'test.module6', function() {}, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       strictEqual( mw.loader.getState( 'test.module5' ), 'registered', 'Expected "registered" state for test.module5' );
+       strictEqual( mw.loader.getState( 'test.module6' ), 'loaded', 'Expected "loaded" state for test.module6' );
+       mw.loader.implement( 'test.module5', function() {}, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module4' ), 'ready', 'Expected "ready" state for test.module4' );
+       strictEqual( mw.loader.getState( 'test.module5' ), 'ready', 'Expected "ready" state for test.module5' );
+       strictEqual( mw.loader.getState( 'test.module6' ), 'ready', 'Expected "ready" state for test.module6' );
+} );
+
+test( 'mw.loader missing dependency', function() {
+       expect( 13 );
+       mw.loader.register( [
+               ['test.module7', '0'],
+               ['test.module8', '0', ['test.module7']],
+               ['test.module9', '0', ['test.module8']]
+       ] );
+       mw.loader.implement( 'test.module8', function() {}, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module7' ), 'registered', 'Expected "registered" state for test.module7' );
+       strictEqual( mw.loader.getState( 'test.module8' ), 'loaded', 'Expected "loaded" state for test.module8' );
+       strictEqual( mw.loader.getState( 'test.module9' ), 'registered', 'Expected "registered" state for test.module9' );
+       mw.loader.state( 'test.module7', 'missing' );
+       strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
+       strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
+       strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
+       mw.loader.implement( 'test.module9', function() {}, {}, {} );
+       strictEqual( mw.loader.getState( 'test.module7' ), 'missing', 'Expected "missing" state for test.module7' );
+       strictEqual( mw.loader.getState( 'test.module8' ), 'error', 'Expected "error" state for test.module8' );
+       strictEqual( mw.loader.getState( 'test.module9' ), 'error', 'Expected "error" state for test.module9' );
+       mw.loader.using(
+               ['test.module7'],
+               function() {
+                       ok( false, "Success fired despite missing dependency" );
+                       ok( true , "QUnit expected() count dummy" );
+               },
+               function( e, dependencies ) {
+                       strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                       deepEqual( dependencies, ['test.module7'], 'Error callback called with module test.module7' );
+               }
+       );
+       mw.loader.using(
+               ['test.module9'],
+               function() {
+                       ok( false, "Success fired despite missing dependency" );
+                       ok( true , "QUnit expected() count dummy" );
+               },
+               function( e, dependencies ) {
+                       strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
+                       dependencies.sort();
+                       deepEqual(
+                               dependencies,
+                               ['test.module7', 'test.module8', 'test.module9'],
+                               'Error callback called with all three modules as dependencies'
+                       );
+               }
+       );
+} );
+
+test( 'mw.loader real missing dependency', function() {
+       expect( 6 );
+
+       mw.loader.addSource(
+               'test',
+               {'loadScript' : QUnit.fixurl( mw.config.get( 'wgScriptPath' ) + '/tests/qunit/data/testloader.php' )}
+       );
+       mw.loader.register( [
+               ['test.missing', '0', [], null, 'test'], ['test.missing2', '0', [], null, 'test'],
+               ['test.use_missing', '0', ['test.missing'], null, 'test'],
+               ['test.use_missing2', '0', ['test.missing2'], null, 'test']
+       ] );
+
+       stop();
+       // Asynch ahead
+
+       mw.loader.load( ['test.use_missing'] );
+
+       function verifyModuleStates() {
+               strictEqual( mw.loader.getState( 'test.missing' ), 'missing', 'Module "test.missing" must have state "missing"' );
+               strictEqual( mw.loader.getState( 'test.missing2' ), 'missing', 'Module "test.missing2" must have state "missing"' );
+               strictEqual( mw.loader.getState( 'test.use_missing' ), 'error', 'Module "test.use_missing" must have state "error"' );
+               strictEqual( mw.loader.getState( 'test.use_missing2' ), 'error', 'Module "test.use_missing2" must have state "error"' );
+       }
+
+       mw.loader.using( ['test.use_missing2'],
+               function() {
+                       start();
+                       ok( false, "Success called wrongly." );
+                       ok( true , "QUnit expected() count dummy" );
+                       verifyModuleStates();
+               },
+               function( e, dependencies ) {
+                       start();
+                       ok( true, "Error handler called correctly." );
+                       deepEqual( dependencies, ['test.missing2'], "Dependencies correct." );
+                       verifyModuleStates();
+               }
+       );
+} );
+
 test( 'mw.loader bug29107' , function () {
        expect(2);
 
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 );
index 6855581..50d3754 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -1,11 +1,26 @@
 <?php
-
 /**
  * PHP script to stream out an image thumbnail.
  *
+ * 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
  */
+
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 if ( isset( $_SERVER['MW_COMPILED'] ) ) {
        require( 'core/includes/WebStart.php' );
index d96ad70..0c9b702 100644 (file)
@@ -1 +1,25 @@
-<?php require './thumb.php'; 
\ No newline at end of file
+<?php
+/**
+ * Version of thumb.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './thumb.php'; 
index 35a855f..abc71dd 100644 (file)
@@ -1,6 +1,27 @@
 <?php
+/**
+ * PHP script to be used as 404 handler to create and stream out a
+ * not yet existing image thumbnail.
+ *
+ * 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
+ */
 
-# Valid web server entry point
 define( 'THUMB_HANDLER', true );
 
 # Execute thumb.php, having set THUMB_HANDLER so that
index 9090b01..20d681b 100644 (file)
@@ -1 +1,25 @@
-<?php require './thumb_handler.php';
+<?php
+/**
+ * Version of thumb_handler.php to used in web server requiring .php5 extension
+ * to execute scripts with PHP5 egine.
+ *
+ * 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
+ */
+
+require './thumb_handler.php';